@sapui5/sap.fe.core 1.111.0 → 1.112.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime-dbg.js +4 -4
- package/src/sap/fe/core/ActionRuntime.js +1 -1
- package/src/sap/fe/core/ActionRuntime.js.map +1 -1
- package/src/sap/fe/core/ActionRuntime.ts +11 -11
- package/src/sap/fe/core/AppComponent-dbg.js +27 -5
- package/src/sap/fe/core/AppComponent.js +1 -1
- package/src/sap/fe/core/AppComponent.js.map +1 -1
- package/src/sap/fe/core/AppComponent.ts +58 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +5 -2
- package/src/sap/fe/core/AppStateHandler.js +1 -1
- package/src/sap/fe/core/AppStateHandler.js.map +1 -1
- package/src/sap/fe/core/AppStateHandler.ts +10 -1
- package/src/sap/fe/core/BaseController-dbg.js +1 -1
- package/src/sap/fe/core/BaseController.ts +2 -1
- package/src/sap/fe/core/CommonUtils-dbg.js +152 -365
- package/src/sap/fe/core/CommonUtils.js +1 -1
- package/src/sap/fe/core/CommonUtils.js.map +1 -1
- package/src/sap/fe/core/CommonUtils.ts +201 -478
- package/src/sap/fe/core/ExtensionAPI-dbg.js +2 -1
- package/src/sap/fe/core/ExtensionAPI.js +1 -1
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +9 -1
- package/src/sap/fe/core/PageController-dbg.js +26 -31
- package/src/sap/fe/core/PageController.js +1 -1
- package/src/sap/fe/core/PageController.js.map +1 -1
- package/src/sap/fe/core/PageController.ts +17 -3
- package/src/sap/fe/core/ResourceModel-dbg.js +71 -0
- package/src/sap/fe/core/ResourceModel.js +6 -0
- package/src/sap/fe/core/ResourceModel.js.map +1 -0
- package/src/sap/fe/core/ResourceModel.ts +67 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +1 -0
- package/src/sap/fe/core/TemplateModel-dbg.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +6 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +5 -7
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +6 -5
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +163 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +169 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +88 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +147 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +905 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +21 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/{BuildingBlockRuntime.ts → BuildingBlockTemplateProcessor.ts} +279 -335
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +79 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +15 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +68 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +162 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +6 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +181 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +4 -2
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +890 -220
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +974 -239
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +24 -34
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +71 -61
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +14 -17
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +23 -17
- package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -0
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +3 -3
- package/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +2 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +2 -0
- package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.ts +24 -0
- package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
- package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
- package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +2 -3
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +45 -31
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +52 -42
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +44 -49
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +43 -63
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +77 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +114 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1505 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1985 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -11
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -13
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +43 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +44 -47
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +12 -13
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +32 -13
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
- package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
- package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
- package/src/sap/fe/core/controls/FilterBar.ts +5 -0
- package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
- package/src/sap/fe/core/converters/ConverterContext-dbg.js +1 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +2 -1
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
- package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +17 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.ts +16 -0
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +61 -49
- package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +65 -51
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +65 -16
- package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.ts +62 -18
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1010 -957
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +8 -8
- package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.ts +28 -26
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
- package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -3
- package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +6 -6
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +15 -15
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +97 -69
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.ts +161 -137
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +10 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +48 -44
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +130 -86
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +34 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +62 -45
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +34 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +54 -20
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +3 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +8 -0
- package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
- package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
- package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +9 -8
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +8 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +8 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +9 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +25 -33
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +35 -35
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +11 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +7 -1
- package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
- package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
- package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -5
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +6 -4
- package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
- package/src/sap/fe/core/fpm/Component.ts +1 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +6 -6
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.ts +8 -8
- package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
- package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +20 -18
- package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.ts +22 -23
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +4 -5
- package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.ts +4 -4
- package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +354 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +408 -0
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +13 -13
- package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +13 -13
- package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
- package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
- package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +26 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.ts +19 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +93 -18
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +70 -17
- package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
- package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
- package/src/sap/fe/core/helpers/TypeGuards-dbg.js +5 -1
- package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.ts +12 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library-dbg.js +2 -2
- package/src/sap/fe/core/library-preload.js +127 -125
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/library.ts +7 -0
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/messagebundle.properties +33 -0
- package/src/sap/fe/core/messagebundle_ar.properties +12 -10
- package/src/sap/fe/core/messagebundle_bg.properties +11 -9
- package/src/sap/fe/core/messagebundle_ca.properties +11 -9
- package/src/sap/fe/core/messagebundle_cs.properties +11 -9
- package/src/sap/fe/core/messagebundle_cy.properties +11 -9
- package/src/sap/fe/core/messagebundle_da.properties +11 -9
- package/src/sap/fe/core/messagebundle_de.properties +3 -1
- package/src/sap/fe/core/messagebundle_el.properties +11 -9
- package/src/sap/fe/core/messagebundle_en.properties +3 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -3
- package/src/sap/fe/core/messagebundle_es.properties +11 -9
- package/src/sap/fe/core/messagebundle_es_MX.properties +11 -9
- package/src/sap/fe/core/messagebundle_et.properties +11 -9
- package/src/sap/fe/core/messagebundle_fi.properties +11 -9
- package/src/sap/fe/core/messagebundle_fr.properties +11 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -0
- package/src/sap/fe/core/messagebundle_hr.properties +11 -9
- package/src/sap/fe/core/messagebundle_hu.properties +11 -9
- package/src/sap/fe/core/messagebundle_id.properties +3 -1
- package/src/sap/fe/core/messagebundle_it.properties +11 -9
- package/src/sap/fe/core/messagebundle_iw.properties +11 -9
- package/src/sap/fe/core/messagebundle_ja.properties +11 -9
- package/src/sap/fe/core/messagebundle_kk.properties +11 -9
- package/src/sap/fe/core/messagebundle_ko.properties +2 -0
- package/src/sap/fe/core/messagebundle_lt.properties +11 -9
- package/src/sap/fe/core/messagebundle_lv.properties +2 -0
- package/src/sap/fe/core/messagebundle_ms.properties +12 -10
- package/src/sap/fe/core/messagebundle_nl.properties +12 -10
- package/src/sap/fe/core/messagebundle_no.properties +11 -9
- package/src/sap/fe/core/messagebundle_pl.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt.properties +11 -9
- package/src/sap/fe/core/messagebundle_pt_PT.properties +11 -9
- package/src/sap/fe/core/messagebundle_ro.properties +3 -1
- package/src/sap/fe/core/messagebundle_ru.properties +3 -1
- package/src/sap/fe/core/messagebundle_sh.properties +11 -9
- package/src/sap/fe/core/messagebundle_sk.properties +11 -9
- package/src/sap/fe/core/messagebundle_sl.properties +11 -9
- package/src/sap/fe/core/messagebundle_sv.properties +2 -0
- package/src/sap/fe/core/messagebundle_th.properties +11 -9
- package/src/sap/fe/core/messagebundle_tr.properties +11 -9
- package/src/sap/fe/core/messagebundle_uk.properties +11 -9
- package/src/sap/fe/core/messagebundle_vi.properties +12 -10
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
- package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
- package/src/sap/fe/core/operationsHelper.js +1 -1
- package/src/sap/fe/core/operationsHelper.js.map +1 -1
- package/src/sap/fe/core/operationsHelper.ts +88 -63
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +4 -3
- package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +15 -5
- package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +3 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -3
- package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +14 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +502 -333
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +18 -5
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +41 -12
- package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -0
- package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +185 -86
- package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +190 -82
- package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.ts +1 -3
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
- package/src/sap/fe/core/templating/FilterHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
- package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
- package/src/sap/fe/core/type/FiscalDate.ts +2 -1
- package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -1
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
- package/src/sap/fe/core/type/TypeUtil.ts +3 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -932
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
- package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
- package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
- package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
- package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
- package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
- package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
- package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
- package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
- package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
- package/src/sap/fe/core/controls/FileWrapper.js +0 -6
- package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
- package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
- package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
- package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
|
@@ -3,368 +3,292 @@
|
|
|
3
3
|
* (c) Copyright 2009-2023 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
5
|
sap.ui.define([], function() {
|
|
6
|
-
|
|
6
|
+
var AnnotationConverter;
|
|
7
7
|
/******/ (function() { // webpackBootstrap
|
|
8
8
|
/******/ "use strict";
|
|
9
9
|
/******/ var __webpack_modules__ = ({
|
|
10
10
|
|
|
11
|
-
/***/
|
|
11
|
+
/***/ 203:
|
|
12
12
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
16
16
|
exports.convert = void 0;
|
|
17
|
-
const utils_1 = __webpack_require__(
|
|
17
|
+
const utils_1 = __webpack_require__(39);
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* Symbol to extend an annotation with the reference to its target.
|
|
20
20
|
*/
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @param pathExpression
|
|
24
|
-
* @param targetName
|
|
25
|
-
* @param annotationsTerm
|
|
26
|
-
* @param term
|
|
27
|
-
*/
|
|
28
|
-
constructor(pathExpression, targetName, annotationsTerm, term) {
|
|
29
|
-
this.path = pathExpression.Path;
|
|
30
|
-
this.type = 'Path';
|
|
31
|
-
this.$target = targetName;
|
|
32
|
-
this.term = term;
|
|
33
|
-
this.annotationsTerm = annotationsTerm;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
21
|
+
const ANNOTATION_TARGET = Symbol('Annotation Target');
|
|
36
22
|
/**
|
|
37
|
-
*
|
|
23
|
+
* Append an object to the list of visited objects if it is different from the last object in the list.
|
|
38
24
|
*
|
|
39
|
-
* @param
|
|
40
|
-
* @
|
|
25
|
+
* @param objectPath The list of visited objects
|
|
26
|
+
* @param visitedObject The object
|
|
27
|
+
* @returns The list of visited objects
|
|
41
28
|
*/
|
|
42
|
-
function
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if ((_a = rawMetadata.schema.entityContainer) === null || _a === void 0 ? void 0 : _a.fullyQualifiedName) {
|
|
46
|
-
objectMap[rawMetadata.schema.entityContainer.fullyQualifiedName] = rawMetadata.schema.entityContainer;
|
|
47
|
-
}
|
|
48
|
-
for (const entitySet of rawMetadata.schema.entitySets) {
|
|
49
|
-
objectMap[entitySet.fullyQualifiedName] = entitySet;
|
|
50
|
-
}
|
|
51
|
-
for (const singleton of rawMetadata.schema.singletons) {
|
|
52
|
-
objectMap[singleton.fullyQualifiedName] = singleton;
|
|
53
|
-
}
|
|
54
|
-
for (const action of rawMetadata.schema.actions) {
|
|
55
|
-
objectMap[action.fullyQualifiedName] = action;
|
|
56
|
-
if (action.isBound) {
|
|
57
|
-
const unBoundActionName = action.fullyQualifiedName.split('(')[0];
|
|
58
|
-
if (!objectMap[unBoundActionName]) {
|
|
59
|
-
objectMap[unBoundActionName] = {
|
|
60
|
-
_type: 'UnboundGenericAction',
|
|
61
|
-
actions: []
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
objectMap[unBoundActionName].actions.push(action);
|
|
65
|
-
const actionSplit = action.fullyQualifiedName.split('(');
|
|
66
|
-
objectMap[`${actionSplit[1].split(')')[0]}/${actionSplit[0]}`] = action;
|
|
67
|
-
}
|
|
68
|
-
for (const parameter of action.parameters) {
|
|
69
|
-
objectMap[parameter.fullyQualifiedName] = parameter;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
for (const actionImport of rawMetadata.schema.actionImports) {
|
|
73
|
-
objectMap[actionImport.fullyQualifiedName] = actionImport;
|
|
74
|
-
}
|
|
75
|
-
for (const complexType of rawMetadata.schema.complexTypes) {
|
|
76
|
-
objectMap[complexType.fullyQualifiedName] = complexType;
|
|
77
|
-
for (const property of complexType.properties) {
|
|
78
|
-
objectMap[property.fullyQualifiedName] = property;
|
|
79
|
-
}
|
|
29
|
+
function appendObjectPath(objectPath, visitedObject) {
|
|
30
|
+
if (objectPath[objectPath.length - 1] !== visitedObject) {
|
|
31
|
+
objectPath.push(visitedObject);
|
|
80
32
|
}
|
|
81
|
-
|
|
82
|
-
objectMap[typeDefinition.fullyQualifiedName] = typeDefinition;
|
|
83
|
-
}
|
|
84
|
-
for (const entityType of rawMetadata.schema.entityTypes) {
|
|
85
|
-
entityType.annotations = {}; // 'annotations' property is mandatory
|
|
86
|
-
objectMap[entityType.fullyQualifiedName] = entityType;
|
|
87
|
-
objectMap[`Collection(${entityType.fullyQualifiedName})`] = entityType;
|
|
88
|
-
for (const property of entityType.entityProperties) {
|
|
89
|
-
objectMap[property.fullyQualifiedName] = property;
|
|
90
|
-
// Handle complex types
|
|
91
|
-
const complexTypeDefinition = objectMap[property.type];
|
|
92
|
-
if ((0, utils_1.isComplexTypeDefinition)(complexTypeDefinition)) {
|
|
93
|
-
for (const complexTypeProp of complexTypeDefinition.properties) {
|
|
94
|
-
const complexTypePropTarget = Object.assign(complexTypeProp, {
|
|
95
|
-
_type: 'Property',
|
|
96
|
-
fullyQualifiedName: property.fullyQualifiedName + '/' + complexTypeProp.name
|
|
97
|
-
});
|
|
98
|
-
objectMap[complexTypePropTarget.fullyQualifiedName] = complexTypePropTarget;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
for (const navProperty of entityType.navigationProperties) {
|
|
103
|
-
objectMap[navProperty.fullyQualifiedName] = navProperty;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
for (const annotationSource of Object.keys(rawMetadata.schema.annotations)) {
|
|
107
|
-
for (const annotationList of rawMetadata.schema.annotations[annotationSource]) {
|
|
108
|
-
const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
|
|
109
|
-
annotationList.annotations.forEach((annotation) => {
|
|
110
|
-
let annotationFQN = `${currentTargetName}@${(0, utils_1.unalias)(rawMetadata.references, annotation.term)}`;
|
|
111
|
-
if (annotation.qualifier) {
|
|
112
|
-
annotationFQN += `#${annotation.qualifier}`;
|
|
113
|
-
}
|
|
114
|
-
objectMap[annotationFQN] = annotation;
|
|
115
|
-
annotation.fullyQualifiedName = annotationFQN;
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return objectMap;
|
|
33
|
+
return objectPath;
|
|
120
34
|
}
|
|
121
35
|
/**
|
|
122
|
-
*
|
|
36
|
+
* Resolves a (possibly relative) path.
|
|
123
37
|
*
|
|
124
|
-
* @param
|
|
125
|
-
* @param
|
|
126
|
-
* @
|
|
38
|
+
* @param converter Converter
|
|
39
|
+
* @param startElement The starting point in case of relative path resolution
|
|
40
|
+
* @param path The path to resolve
|
|
41
|
+
* @param annotationsTerm Only for error reporting: The annotation term
|
|
42
|
+
* @returns An object containing the resolved target and the elements that were visited while getting to the target.
|
|
127
43
|
*/
|
|
128
|
-
function
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
*/
|
|
142
|
-
function addAnnotationErrorMessage(path, oErrorMsg) {
|
|
143
|
-
if (!ALL_ANNOTATION_ERRORS[path]) {
|
|
144
|
-
ALL_ANNOTATION_ERRORS[path] = [oErrorMsg];
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
ALL_ANNOTATION_ERRORS[path].push(oErrorMsg);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Resolves a specific path based on the objectMap.
|
|
152
|
-
*
|
|
153
|
-
* @param objectMap
|
|
154
|
-
* @param currentTarget
|
|
155
|
-
* @param path
|
|
156
|
-
* @param pathOnly
|
|
157
|
-
* @param includeVisitedObjects
|
|
158
|
-
* @param annotationsTerm
|
|
159
|
-
* @returns the resolved object
|
|
160
|
-
*/
|
|
161
|
-
function _resolveTarget(objectMap, currentTarget, path, pathOnly = false, includeVisitedObjects = false, annotationsTerm) {
|
|
162
|
-
let oErrorMsg;
|
|
163
|
-
if (!path) {
|
|
164
|
-
return undefined;
|
|
165
|
-
}
|
|
166
|
-
const aVisitedObjects = [];
|
|
167
|
-
if (currentTarget && currentTarget._type === 'Property') {
|
|
168
|
-
currentTarget = objectMap[currentTarget.fullyQualifiedName.split('/')[0]];
|
|
169
|
-
}
|
|
170
|
-
path = combinePath(currentTarget.fullyQualifiedName, path);
|
|
171
|
-
const pathSplit = path.split('/');
|
|
172
|
-
const targetPathSplit = [];
|
|
173
|
-
pathSplit.forEach((pathPart) => {
|
|
174
|
-
// Separate out the annotation
|
|
175
|
-
if (pathPart.indexOf('@') !== -1) {
|
|
176
|
-
const [splittedPath, annotationPath] = pathPart.split('@');
|
|
177
|
-
targetPathSplit.push(splittedPath);
|
|
178
|
-
targetPathSplit.push(`@${annotationPath}`);
|
|
44
|
+
function resolveTarget(converter, startElement, path, annotationsTerm) {
|
|
45
|
+
var _a;
|
|
46
|
+
// absolute paths always start at the entity container
|
|
47
|
+
if (path.startsWith('/')) {
|
|
48
|
+
path = path.substring(1);
|
|
49
|
+
startElement = undefined; // will resolve to the entity container (see below)
|
|
50
|
+
}
|
|
51
|
+
const pathSegments = path.split('/').reduce((targetPath, segment) => {
|
|
52
|
+
if (segment.includes('@')) {
|
|
53
|
+
// Separate out the annotation
|
|
54
|
+
const [pathPart, annotationPart] = (0, utils_1.splitAtFirst)(segment, '@');
|
|
55
|
+
targetPath.push(pathPart);
|
|
56
|
+
targetPath.push(`@${annotationPart}`);
|
|
179
57
|
}
|
|
180
58
|
else {
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
currentPath = pathPart;
|
|
219
|
-
}
|
|
220
|
-
else if ((currentValue._type === 'EntitySet' || currentValue._type === 'Singleton') && pathPart === '$Type') {
|
|
221
|
-
currentValue = currentValue.targetType;
|
|
222
|
-
return currentValue;
|
|
223
|
-
}
|
|
224
|
-
else if ((currentValue._type === 'EntitySet' || currentValue._type === 'Singleton') &&
|
|
225
|
-
pathPart === '$NavigationPropertyBinding') {
|
|
226
|
-
currentValue = currentValue.navigationPropertyBinding;
|
|
227
|
-
return currentValue;
|
|
228
|
-
}
|
|
229
|
-
else if ((currentValue._type === 'EntitySet' || currentValue._type === 'Singleton') &&
|
|
230
|
-
currentValue.entityType) {
|
|
231
|
-
currentPath = combinePath(currentValue.entityTypeName, pathPart);
|
|
232
|
-
}
|
|
233
|
-
else if (currentValue._type === 'NavigationProperty') {
|
|
234
|
-
currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
|
|
235
|
-
if (!objectMap[currentPath]) {
|
|
236
|
-
// Fallback log error
|
|
237
|
-
currentPath = combinePath(currentValue.targetTypeName, pathPart);
|
|
59
|
+
targetPath.push(segment);
|
|
60
|
+
}
|
|
61
|
+
return targetPath;
|
|
62
|
+
}, []);
|
|
63
|
+
// determine the starting point for the resolution
|
|
64
|
+
if (startElement === undefined) {
|
|
65
|
+
// no starting point given: start at the entity container
|
|
66
|
+
startElement = converter.getConvertedEntityContainer();
|
|
67
|
+
}
|
|
68
|
+
else if (startElement[ANNOTATION_TARGET] !== undefined) {
|
|
69
|
+
// annotation: start at the annotation target
|
|
70
|
+
startElement = startElement[ANNOTATION_TARGET];
|
|
71
|
+
}
|
|
72
|
+
else if (startElement._type === 'Property') {
|
|
73
|
+
// property: start at the entity type or complex type the property belongs to
|
|
74
|
+
const parentElementFQN = (0, utils_1.substringBeforeFirst)(startElement.fullyQualifiedName, '/');
|
|
75
|
+
startElement =
|
|
76
|
+
(_a = converter.getConvertedEntityType(parentElementFQN)) !== null && _a !== void 0 ? _a : converter.getConvertedComplexType(parentElementFQN);
|
|
77
|
+
}
|
|
78
|
+
const result = pathSegments.reduce((current, segment) => {
|
|
79
|
+
var _a, _b, _c, _d, _e;
|
|
80
|
+
const error = (message) => {
|
|
81
|
+
current.messages.push({ message });
|
|
82
|
+
current.target = undefined;
|
|
83
|
+
return current;
|
|
84
|
+
};
|
|
85
|
+
if (current.target === undefined) {
|
|
86
|
+
return current;
|
|
87
|
+
}
|
|
88
|
+
current.objectPath = appendObjectPath(current.objectPath, current.target);
|
|
89
|
+
// Annotation
|
|
90
|
+
if (segment.startsWith('@') && segment !== '@$ui5.overload') {
|
|
91
|
+
const [vocabularyAlias, term] = converter.splitTerm(segment);
|
|
92
|
+
const annotation = (_a = current.target.annotations[vocabularyAlias.substring(1)]) === null || _a === void 0 ? void 0 : _a[term];
|
|
93
|
+
if (annotation !== undefined) {
|
|
94
|
+
current.target = annotation;
|
|
95
|
+
return current;
|
|
238
96
|
}
|
|
97
|
+
return error(`Annotation '${segment.substring(1)}' not found on ${current.target._type} '${current.target.fullyQualifiedName}'`);
|
|
239
98
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
else {
|
|
246
|
-
currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
|
|
99
|
+
// $Path / $AnnotationPath syntax
|
|
100
|
+
if (current.target.$target) {
|
|
101
|
+
let subPath;
|
|
102
|
+
if (segment === '$AnnotationPath') {
|
|
103
|
+
subPath = current.target.value;
|
|
247
104
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
|
|
251
|
-
if (pathPart === '$Parameter') {
|
|
252
|
-
return currentValue.parameters;
|
|
105
|
+
else if (segment === '$Path') {
|
|
106
|
+
subPath = current.target.path;
|
|
253
107
|
}
|
|
254
|
-
if (
|
|
255
|
-
|
|
108
|
+
if (subPath !== undefined) {
|
|
109
|
+
const subTarget = resolveTarget(converter, current.target[ANNOTATION_TARGET], subPath);
|
|
110
|
+
subTarget.objectPath.forEach((visitedSubObject) => {
|
|
111
|
+
if (!current.objectPath.includes(visitedSubObject)) {
|
|
112
|
+
current.objectPath = appendObjectPath(current.objectPath, visitedSubObject);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
current.target = subTarget.target;
|
|
116
|
+
current.objectPath = appendObjectPath(current.objectPath, current.target);
|
|
117
|
+
return current;
|
|
256
118
|
}
|
|
257
119
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
120
|
+
// traverse based on the element type
|
|
121
|
+
switch ((_b = current.target) === null || _b === void 0 ? void 0 : _b._type) {
|
|
122
|
+
case 'EntityContainer':
|
|
123
|
+
{
|
|
124
|
+
const thisElement = current.target;
|
|
125
|
+
if (segment === '' || segment === thisElement.fullyQualifiedName) {
|
|
126
|
+
return current;
|
|
127
|
+
}
|
|
128
|
+
// next element: EntitySet, Singleton or ActionImport?
|
|
129
|
+
const nextElement = (_d = (_c = thisElement.entitySets.by_name(segment)) !== null && _c !== void 0 ? _c : thisElement.singletons.by_name(segment)) !== null && _d !== void 0 ? _d : thisElement.actionImports.by_name(segment);
|
|
130
|
+
if (nextElement) {
|
|
131
|
+
current.target = nextElement;
|
|
132
|
+
return current;
|
|
133
|
+
}
|
|
264
134
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
135
|
+
break;
|
|
136
|
+
case 'EntitySet':
|
|
137
|
+
case 'Singleton': {
|
|
138
|
+
const thisElement = current.target;
|
|
139
|
+
if (segment === '' || segment === '$Type') {
|
|
140
|
+
// Empty Path after an EntitySet or Singleton means EntityType
|
|
141
|
+
current.target = thisElement.entityType;
|
|
142
|
+
return current;
|
|
143
|
+
}
|
|
144
|
+
if (segment === '$') {
|
|
145
|
+
return current;
|
|
146
|
+
}
|
|
147
|
+
if (segment === '$NavigationPropertyBinding') {
|
|
148
|
+
const navigationPropertyBindings = thisElement.navigationPropertyBinding;
|
|
149
|
+
current.target = navigationPropertyBindings;
|
|
150
|
+
return current;
|
|
151
|
+
}
|
|
152
|
+
// continue resolving at the EntitySet's or Singleton's type
|
|
153
|
+
const result = resolveTarget(converter, thisElement.entityType, segment);
|
|
154
|
+
current.target = result.target;
|
|
155
|
+
current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
|
|
156
|
+
return current;
|
|
272
157
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
158
|
+
case 'EntityType':
|
|
159
|
+
{
|
|
160
|
+
const thisElement = current.target;
|
|
161
|
+
if (segment === '' || segment === '$Type') {
|
|
162
|
+
return current;
|
|
163
|
+
}
|
|
164
|
+
const property = thisElement.entityProperties.by_name(segment);
|
|
165
|
+
if (property) {
|
|
166
|
+
current.target = property;
|
|
167
|
+
return current;
|
|
168
|
+
}
|
|
169
|
+
const navigationProperty = thisElement.navigationProperties.by_name(segment);
|
|
170
|
+
if (navigationProperty) {
|
|
171
|
+
current.target = navigationProperty;
|
|
172
|
+
return current;
|
|
173
|
+
}
|
|
174
|
+
const action = thisElement.actions[segment];
|
|
175
|
+
if (action) {
|
|
176
|
+
current.target = action;
|
|
177
|
+
return current;
|
|
279
178
|
}
|
|
280
|
-
});
|
|
281
|
-
return subTarget.target;
|
|
282
|
-
}
|
|
283
|
-
else if (pathPart === '$Path' && currentValue.$target) {
|
|
284
|
-
currentContext = aVisitedObjects
|
|
285
|
-
.concat()
|
|
286
|
-
.reverse()
|
|
287
|
-
.find((obj) => obj._type === 'EntityType' ||
|
|
288
|
-
obj._type === 'EntitySet' ||
|
|
289
|
-
obj._type === 'Singleton' ||
|
|
290
|
-
obj._type === 'NavigationProperty');
|
|
291
|
-
if (currentContext) {
|
|
292
|
-
const subTarget = _resolveTarget(objectMap, currentContext, currentValue.path, false, true);
|
|
293
|
-
subTarget.visitedObjects.forEach((visitedSubObject) => {
|
|
294
|
-
if (aVisitedObjects.indexOf(visitedSubObject) === -1) {
|
|
295
|
-
aVisitedObjects.push(visitedSubObject);
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
return subTarget.target;
|
|
299
179
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
const
|
|
304
|
-
|
|
180
|
+
break;
|
|
181
|
+
case 'ActionImport': {
|
|
182
|
+
// continue resolving at the Action
|
|
183
|
+
const result = resolveTarget(converter, current.target.action, segment);
|
|
184
|
+
current.target = result.target;
|
|
185
|
+
current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
|
|
186
|
+
return current;
|
|
305
187
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
188
|
+
case 'Action': {
|
|
189
|
+
const thisElement = current.target;
|
|
190
|
+
if (segment === '') {
|
|
191
|
+
return current;
|
|
192
|
+
}
|
|
193
|
+
if (segment === '@$ui5.overload' || segment === '0') {
|
|
194
|
+
return current;
|
|
195
|
+
}
|
|
196
|
+
if (segment === '$Parameter' && thisElement.isBound) {
|
|
197
|
+
current.target = thisElement.parameters;
|
|
198
|
+
return current;
|
|
199
|
+
}
|
|
200
|
+
const nextElement = (_e = thisElement.parameters[segment]) !== null && _e !== void 0 ? _e : thisElement.parameters.find((param) => param.name === segment);
|
|
201
|
+
if (nextElement) {
|
|
202
|
+
current.target = nextElement;
|
|
203
|
+
return current;
|
|
311
204
|
}
|
|
205
|
+
break;
|
|
312
206
|
}
|
|
207
|
+
case 'Property':
|
|
208
|
+
{
|
|
209
|
+
const thisElement = current.target;
|
|
210
|
+
// Property or NavigationProperty of the ComplexType
|
|
211
|
+
const type = thisElement.targetType;
|
|
212
|
+
if (type !== undefined) {
|
|
213
|
+
const property = type.properties.by_name(segment);
|
|
214
|
+
if (property) {
|
|
215
|
+
current.target = property;
|
|
216
|
+
return current;
|
|
217
|
+
}
|
|
218
|
+
const navigationProperty = type.navigationProperties.by_name(segment);
|
|
219
|
+
if (navigationProperty) {
|
|
220
|
+
current.target = navigationProperty;
|
|
221
|
+
return current;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
break;
|
|
226
|
+
case 'ActionParameter':
|
|
227
|
+
const referencedType = current.target.typeReference;
|
|
228
|
+
if (referencedType !== undefined) {
|
|
229
|
+
const result = resolveTarget(converter, referencedType, segment);
|
|
230
|
+
current.target = result.target;
|
|
231
|
+
current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
|
|
232
|
+
return current;
|
|
233
|
+
}
|
|
234
|
+
break;
|
|
235
|
+
case 'NavigationProperty':
|
|
236
|
+
// continue at the NavigationProperty's target type
|
|
237
|
+
const result = resolveTarget(converter, current.target.targetType, segment);
|
|
238
|
+
current.target = result.target;
|
|
239
|
+
current.objectPath = result.objectPath.reduce(appendObjectPath, current.objectPath);
|
|
240
|
+
return current;
|
|
241
|
+
default:
|
|
242
|
+
if (segment === '') {
|
|
243
|
+
return current;
|
|
244
|
+
}
|
|
245
|
+
if (current.target[segment]) {
|
|
246
|
+
current.target = current.target[segment];
|
|
247
|
+
current.objectPath = appendObjectPath(current.objectPath, current.target);
|
|
248
|
+
return current;
|
|
249
|
+
}
|
|
313
250
|
}
|
|
314
|
-
return
|
|
315
|
-
},
|
|
316
|
-
|
|
251
|
+
return error(`Element '${segment}' not found at ${current.target._type} '${current.target.fullyQualifiedName}'`);
|
|
252
|
+
}, { target: startElement, objectPath: [], messages: [] });
|
|
253
|
+
// Diagnostics
|
|
254
|
+
result.messages.forEach((message) => converter.logError(message.message));
|
|
255
|
+
if (!result.target) {
|
|
317
256
|
if (annotationsTerm) {
|
|
318
|
-
const annotationType = inferTypeFromTerm(annotationsTerm,
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
'>'
|
|
337
|
-
};
|
|
338
|
-
addAnnotationErrorMessage(path, oErrorMsg);
|
|
257
|
+
const annotationType = inferTypeFromTerm(converter, annotationsTerm, startElement.fullyQualifiedName);
|
|
258
|
+
converter.logError('Unable to resolve the path expression: ' +
|
|
259
|
+
'\n' +
|
|
260
|
+
path +
|
|
261
|
+
'\n' +
|
|
262
|
+
'\n' +
|
|
263
|
+
'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
|
|
264
|
+
'<Annotation Term = ' +
|
|
265
|
+
annotationsTerm +
|
|
266
|
+
'>' +
|
|
267
|
+
'\n' +
|
|
268
|
+
'<Record Type = ' +
|
|
269
|
+
annotationType +
|
|
270
|
+
'>' +
|
|
271
|
+
'\n' +
|
|
272
|
+
'<AnnotationPath = ' +
|
|
273
|
+
path +
|
|
274
|
+
'>');
|
|
339
275
|
}
|
|
340
276
|
else {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
'>'
|
|
354
|
-
};
|
|
355
|
-
addAnnotationErrorMessage(path, oErrorMsg);
|
|
277
|
+
converter.logError('Unable to resolve the path expression: ' +
|
|
278
|
+
path +
|
|
279
|
+
'\n' +
|
|
280
|
+
'\n' +
|
|
281
|
+
'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
|
|
282
|
+
'<Annotation Term = ' +
|
|
283
|
+
pathSegments[0] +
|
|
284
|
+
'>' +
|
|
285
|
+
'\n' +
|
|
286
|
+
'<PropertyValue Path= ' +
|
|
287
|
+
pathSegments[1] +
|
|
288
|
+
'>');
|
|
356
289
|
}
|
|
357
290
|
}
|
|
358
|
-
|
|
359
|
-
return currentPath;
|
|
360
|
-
}
|
|
361
|
-
if (includeVisitedObjects) {
|
|
362
|
-
return {
|
|
363
|
-
visitedObjects: aVisitedObjects,
|
|
364
|
-
target: target
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
return target;
|
|
291
|
+
return result;
|
|
368
292
|
}
|
|
369
293
|
/**
|
|
370
294
|
* Typeguard to check if the path contains an annotation.
|
|
@@ -373,9 +297,9 @@ function _resolveTarget(objectMap, currentTarget, path, pathOnly = false, includ
|
|
|
373
297
|
* @returns true if there is an annotation in the path.
|
|
374
298
|
*/
|
|
375
299
|
function isAnnotationPath(pathStr) {
|
|
376
|
-
return pathStr.
|
|
300
|
+
return pathStr.includes('@');
|
|
377
301
|
}
|
|
378
|
-
function parseValue(
|
|
302
|
+
function parseValue(converter, currentTarget, currentTerm, currentProperty, currentSource, propertyValue, valueFQN) {
|
|
379
303
|
if (propertyValue === undefined) {
|
|
380
304
|
return undefined;
|
|
381
305
|
}
|
|
@@ -391,46 +315,59 @@ function parseValue(propertyValue, valueFQN, objectMap, context) {
|
|
|
391
315
|
case 'Date':
|
|
392
316
|
return propertyValue.Date;
|
|
393
317
|
case 'EnumMember':
|
|
394
|
-
|
|
318
|
+
const aliasedEnum = converter.alias(propertyValue.EnumMember);
|
|
319
|
+
const splitEnum = aliasedEnum.split(' ');
|
|
320
|
+
if (splitEnum[0] && utils_1.EnumIsFlag[(0, utils_1.substringBeforeFirst)(splitEnum[0], '/')]) {
|
|
321
|
+
return splitEnum;
|
|
322
|
+
}
|
|
323
|
+
return aliasedEnum;
|
|
395
324
|
case 'PropertyPath':
|
|
396
325
|
return {
|
|
397
326
|
type: 'PropertyPath',
|
|
398
327
|
value: propertyValue.PropertyPath,
|
|
399
328
|
fullyQualifiedName: valueFQN,
|
|
400
|
-
$target:
|
|
329
|
+
$target: resolveTarget(converter, currentTarget, propertyValue.PropertyPath, currentTerm).target,
|
|
330
|
+
[ANNOTATION_TARGET]: currentTarget
|
|
401
331
|
};
|
|
402
332
|
case 'NavigationPropertyPath':
|
|
403
333
|
return {
|
|
404
334
|
type: 'NavigationPropertyPath',
|
|
405
335
|
value: propertyValue.NavigationPropertyPath,
|
|
406
336
|
fullyQualifiedName: valueFQN,
|
|
407
|
-
$target:
|
|
337
|
+
$target: resolveTarget(converter, currentTarget, propertyValue.NavigationPropertyPath, currentTerm)
|
|
338
|
+
.target,
|
|
339
|
+
[ANNOTATION_TARGET]: currentTarget
|
|
408
340
|
};
|
|
409
341
|
case 'AnnotationPath':
|
|
410
|
-
|
|
411
|
-
const annotationPath = {
|
|
342
|
+
return {
|
|
412
343
|
type: 'AnnotationPath',
|
|
413
344
|
value: propertyValue.AnnotationPath,
|
|
414
345
|
fullyQualifiedName: valueFQN,
|
|
415
|
-
$target:
|
|
416
|
-
annotationsTerm:
|
|
346
|
+
$target: resolveTarget(converter, currentTarget, converter.unalias(propertyValue.AnnotationPath), currentTerm).target,
|
|
347
|
+
annotationsTerm: currentTerm,
|
|
417
348
|
term: '',
|
|
418
|
-
path: ''
|
|
349
|
+
path: '',
|
|
350
|
+
[ANNOTATION_TARGET]: currentTarget
|
|
419
351
|
};
|
|
420
|
-
context.unresolvedAnnotations.push({ inline: false, toResolve: annotationPath });
|
|
421
|
-
return annotationPath;
|
|
422
352
|
case 'Path':
|
|
423
|
-
const $target =
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
353
|
+
const $target = resolveTarget(converter, currentTarget, propertyValue.Path, currentTerm).target;
|
|
354
|
+
if (isAnnotationPath(propertyValue.Path)) {
|
|
355
|
+
// inline the target
|
|
356
|
+
return $target;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
return {
|
|
360
|
+
type: 'Path',
|
|
361
|
+
path: propertyValue.Path,
|
|
362
|
+
fullyQualifiedName: valueFQN,
|
|
363
|
+
$target: $target,
|
|
364
|
+
[ANNOTATION_TARGET]: currentTarget
|
|
365
|
+
};
|
|
366
|
+
}
|
|
430
367
|
case 'Record':
|
|
431
|
-
return parseRecord(propertyValue.Record, valueFQN
|
|
368
|
+
return parseRecord(converter, currentTerm, currentTarget, currentProperty, currentSource, propertyValue.Record, valueFQN);
|
|
432
369
|
case 'Collection':
|
|
433
|
-
return parseCollection(propertyValue.Collection, valueFQN
|
|
370
|
+
return parseCollection(converter, currentTarget, currentTerm, currentProperty, currentSource, propertyValue.Collection, valueFQN);
|
|
434
371
|
case 'Apply':
|
|
435
372
|
case 'Null':
|
|
436
373
|
case 'Not':
|
|
@@ -450,102 +387,96 @@ function parseValue(propertyValue, valueFQN, objectMap, context) {
|
|
|
450
387
|
/**
|
|
451
388
|
* Infer the type of a term based on its type.
|
|
452
389
|
*
|
|
453
|
-
* @param
|
|
454
|
-
* @param
|
|
455
|
-
* @param
|
|
456
|
-
* @
|
|
390
|
+
* @param converter Converter
|
|
391
|
+
* @param annotationsTerm The annotation term
|
|
392
|
+
* @param annotationTarget The annotation target
|
|
393
|
+
* @param currentProperty The current property of the record
|
|
394
|
+
* @returns The inferred type.
|
|
457
395
|
*/
|
|
458
|
-
function inferTypeFromTerm(annotationsTerm, annotationTarget, currentProperty) {
|
|
396
|
+
function inferTypeFromTerm(converter, annotationsTerm, annotationTarget, currentProperty) {
|
|
459
397
|
let targetType = utils_1.TermToTypes[annotationsTerm];
|
|
460
398
|
if (currentProperty) {
|
|
461
|
-
annotationsTerm =
|
|
399
|
+
annotationsTerm = `${(0, utils_1.substringBeforeLast)(annotationsTerm, '.')}.${currentProperty}`;
|
|
462
400
|
targetType = utils_1.TermToTypes[annotationsTerm];
|
|
463
401
|
}
|
|
464
|
-
|
|
465
|
-
isError: false,
|
|
466
|
-
message: `The type of the record used within the term ${annotationsTerm} was not defined and was inferred as ${targetType}.
|
|
402
|
+
converter.logError(`The type of the record used within the term ${annotationsTerm} was not defined and was inferred as ${targetType}.
|
|
467
403
|
Hint: If possible, try to maintain the Type property for each Record.
|
|
468
404
|
<Annotations Target="${annotationTarget}">
|
|
469
405
|
<Annotation Term="${annotationsTerm}">
|
|
470
406
|
<Record>...</Record>
|
|
471
407
|
</Annotation>
|
|
472
|
-
</Annotations>`
|
|
473
|
-
};
|
|
474
|
-
addAnnotationErrorMessage(annotationTarget + '/' + annotationsTerm, oErrorMsg);
|
|
408
|
+
</Annotations>`);
|
|
475
409
|
return targetType;
|
|
476
410
|
}
|
|
477
|
-
function isDataFieldWithForAction(annotationContent
|
|
411
|
+
function isDataFieldWithForAction(annotationContent) {
|
|
478
412
|
return (annotationContent.hasOwnProperty('Action') &&
|
|
479
|
-
(
|
|
480
|
-
|
|
413
|
+
(annotationContent.$Type === 'com.sap.vocabularies.UI.v1.DataFieldForAction' ||
|
|
414
|
+
annotationContent.$Type === 'com.sap.vocabularies.UI.v1.DataFieldWithAction'));
|
|
481
415
|
}
|
|
482
|
-
function parseRecordType(
|
|
416
|
+
function parseRecordType(converter, currentTerm, currentTarget, currentProperty, recordDefinition) {
|
|
483
417
|
let targetType;
|
|
484
|
-
if (!recordDefinition.type &&
|
|
485
|
-
targetType = inferTypeFromTerm(
|
|
418
|
+
if (!recordDefinition.type && currentTerm) {
|
|
419
|
+
targetType = inferTypeFromTerm(converter, currentTerm, currentTarget.fullyQualifiedName, currentProperty);
|
|
486
420
|
}
|
|
487
421
|
else {
|
|
488
|
-
targetType =
|
|
422
|
+
targetType = converter.unalias(recordDefinition.type);
|
|
489
423
|
}
|
|
490
424
|
return targetType;
|
|
491
425
|
}
|
|
492
|
-
function parseRecord(
|
|
493
|
-
|
|
426
|
+
function parseRecord(converter, currentTerm, currentTarget, currentProperty, currentSource, annotationRecord, currentFQN) {
|
|
427
|
+
var _a;
|
|
494
428
|
const annotationTerm = {
|
|
495
|
-
$Type:
|
|
429
|
+
$Type: parseRecordType(converter, currentTerm, currentTarget, currentProperty, annotationRecord),
|
|
496
430
|
fullyQualifiedName: currentFQN,
|
|
497
|
-
|
|
431
|
+
[ANNOTATION_TARGET]: currentTarget
|
|
498
432
|
};
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
433
|
+
// annotations on the record
|
|
434
|
+
(0, utils_1.lazy)(annotationTerm, 'annotations', () => {
|
|
435
|
+
var _a;
|
|
436
|
+
// be graceful when resolving annotations on annotations: Sometimes they are referenced directly, sometimes they
|
|
437
|
+
// are part of the global annotations list
|
|
438
|
+
let annotations;
|
|
439
|
+
if (annotationRecord.annotations && annotationRecord.annotations.length > 0) {
|
|
440
|
+
annotations = annotationRecord.annotations;
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
annotations = (_a = converter.rawAnnotationsPerTarget[currentFQN]) === null || _a === void 0 ? void 0 : _a.annotations;
|
|
444
|
+
}
|
|
445
|
+
annotations === null || annotations === void 0 ? void 0 : annotations.forEach((annotation) => {
|
|
446
|
+
annotation.target = currentFQN;
|
|
447
|
+
annotation.__source = currentSource;
|
|
448
|
+
annotation[ANNOTATION_TARGET] = currentTarget;
|
|
449
|
+
annotation.fullyQualifiedName = `${currentFQN}@${annotation.term}`;
|
|
450
|
+
});
|
|
451
|
+
return createAnnotationsObject(converter, annotationTerm, annotations !== null && annotations !== void 0 ? annotations : []);
|
|
452
|
+
});
|
|
453
|
+
const annotationContent = (_a = annotationRecord.propertyValues) === null || _a === void 0 ? void 0 : _a.reduce((annotationContent, propertyValue) => {
|
|
454
|
+
(0, utils_1.lazy)(annotationContent, propertyValue.name, () => parseValue(converter, currentTarget, currentTerm, propertyValue.name, currentSource, propertyValue.value, `${currentFQN}/${propertyValue.name}`));
|
|
455
|
+
return annotationContent;
|
|
456
|
+
}, annotationTerm);
|
|
457
|
+
if (isDataFieldWithForAction(annotationContent)) {
|
|
458
|
+
(0, utils_1.lazy)(annotationContent, 'ActionTarget', () => {
|
|
459
|
+
var _a, _b;
|
|
460
|
+
// try to resolve to a bound action of the annotation target
|
|
461
|
+
let actionTarget = (_a = currentTarget.actions) === null || _a === void 0 ? void 0 : _a[annotationContent.Action];
|
|
462
|
+
if (!actionTarget) {
|
|
463
|
+
// try to find a corresponding unbound action
|
|
464
|
+
actionTarget = (_b = converter.getConvertedActionImport(annotationContent.Action)) === null || _b === void 0 ? void 0 : _b.action;
|
|
520
465
|
}
|
|
521
|
-
if (
|
|
522
|
-
// try to
|
|
523
|
-
|
|
524
|
-
if (!
|
|
525
|
-
|
|
526
|
-
if (action === null || action === void 0 ? void 0 : action.isBound) {
|
|
527
|
-
// bound action of a different entity type
|
|
528
|
-
annotationContent.ActionTarget = action;
|
|
529
|
-
}
|
|
530
|
-
else if (action) {
|
|
531
|
-
// unbound action --> resolve via the action import
|
|
532
|
-
annotationContent.ActionTarget = action.action;
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
if (!annotationContent.ActionTarget) {
|
|
536
|
-
// Add to diagnostics debugger;
|
|
537
|
-
ANNOTATION_ERRORS.push({
|
|
538
|
-
message: 'Unable to resolve the action ' +
|
|
539
|
-
annotationContent.Action +
|
|
540
|
-
' defined for ' +
|
|
541
|
-
annotationTerm.fullyQualifiedName
|
|
542
|
-
});
|
|
466
|
+
if (!actionTarget) {
|
|
467
|
+
// try to find a corresponding bound (!) action
|
|
468
|
+
actionTarget = converter.getConvertedAction(annotationContent.Action);
|
|
469
|
+
if (!(actionTarget === null || actionTarget === void 0 ? void 0 : actionTarget.isBound)) {
|
|
470
|
+
actionTarget = undefined;
|
|
543
471
|
}
|
|
544
472
|
}
|
|
473
|
+
if (!actionTarget) {
|
|
474
|
+
converter.logError(`Unable to resolve the action '${annotationContent.Action}' defined for '${annotationTerm.fullyQualifiedName}'`);
|
|
475
|
+
}
|
|
476
|
+
return actionTarget;
|
|
545
477
|
});
|
|
546
|
-
context.currentProperty = undefined;
|
|
547
478
|
}
|
|
548
|
-
return
|
|
479
|
+
return annotationContent;
|
|
549
480
|
}
|
|
550
481
|
/**
|
|
551
482
|
* Retrieve or infer the collection type based on its content.
|
|
@@ -582,58 +513,56 @@ function getOrInferCollectionType(collectionDefinition) {
|
|
|
582
513
|
}
|
|
583
514
|
return type;
|
|
584
515
|
}
|
|
585
|
-
function parseCollection(
|
|
516
|
+
function parseCollection(converter, currentTarget, currentTerm, currentProperty, currentSource, collectionDefinition, parentFQN) {
|
|
586
517
|
const collectionDefinitionType = getOrInferCollectionType(collectionDefinition);
|
|
587
518
|
switch (collectionDefinitionType) {
|
|
588
519
|
case 'PropertyPath':
|
|
589
520
|
return collectionDefinition.map((propertyPath, propertyIdx) => {
|
|
590
|
-
|
|
521
|
+
const result = {
|
|
591
522
|
type: 'PropertyPath',
|
|
592
523
|
value: propertyPath.PropertyPath,
|
|
593
|
-
fullyQualifiedName: `${parentFQN}/${propertyIdx}
|
|
594
|
-
$target: _resolveTarget(objectMap, context.currentTarget, propertyPath.PropertyPath, false, false, context.currentTerm)
|
|
524
|
+
fullyQualifiedName: `${parentFQN}/${propertyIdx}`
|
|
595
525
|
};
|
|
526
|
+
(0, utils_1.lazy)(result, '$target', () => {
|
|
527
|
+
var _a;
|
|
528
|
+
return (_a = resolveTarget(converter, currentTarget, propertyPath.PropertyPath, currentTerm)
|
|
529
|
+
.target) !== null && _a !== void 0 ? _a : {};
|
|
530
|
+
} // TODO: $target is mandatory - throw an error?
|
|
531
|
+
);
|
|
532
|
+
return result;
|
|
596
533
|
});
|
|
597
534
|
case 'Path':
|
|
535
|
+
// TODO: make lazy?
|
|
598
536
|
return collectionDefinition.map((pathValue) => {
|
|
599
|
-
|
|
600
|
-
const path = new Path(pathValue, $target, context.currentTerm, '');
|
|
601
|
-
context.unresolvedAnnotations.push({
|
|
602
|
-
inline: isAnnotationPath(pathValue.Path),
|
|
603
|
-
toResolve: path
|
|
604
|
-
});
|
|
605
|
-
return path;
|
|
537
|
+
return resolveTarget(converter, currentTarget, pathValue.Path, currentTerm).target;
|
|
606
538
|
});
|
|
607
539
|
case 'AnnotationPath':
|
|
608
540
|
return collectionDefinition.map((annotationPath, annotationIdx) => {
|
|
609
|
-
const
|
|
610
|
-
const annotationCollectionElement = {
|
|
541
|
+
const result = {
|
|
611
542
|
type: 'AnnotationPath',
|
|
612
543
|
value: annotationPath.AnnotationPath,
|
|
613
544
|
fullyQualifiedName: `${parentFQN}/${annotationIdx}`,
|
|
614
|
-
|
|
615
|
-
annotationsTerm: context.currentTerm,
|
|
545
|
+
annotationsTerm: currentTerm,
|
|
616
546
|
term: '',
|
|
617
547
|
path: ''
|
|
618
548
|
};
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
toResolve: annotationCollectionElement
|
|
622
|
-
});
|
|
623
|
-
return annotationCollectionElement;
|
|
549
|
+
(0, utils_1.lazy)(result, '$target', () => resolveTarget(converter, currentTarget, annotationPath.AnnotationPath, currentTerm).target);
|
|
550
|
+
return result;
|
|
624
551
|
});
|
|
625
552
|
case 'NavigationPropertyPath':
|
|
626
553
|
return collectionDefinition.map((navPropertyPath, navPropIdx) => {
|
|
627
|
-
|
|
554
|
+
const result = {
|
|
628
555
|
type: 'NavigationPropertyPath',
|
|
629
556
|
value: navPropertyPath.NavigationPropertyPath,
|
|
630
|
-
fullyQualifiedName: `${parentFQN}/${navPropIdx}
|
|
631
|
-
$target: _resolveTarget(objectMap, context.currentTarget, navPropertyPath.NavigationPropertyPath, false, false, context.currentTerm)
|
|
557
|
+
fullyQualifiedName: `${parentFQN}/${navPropIdx}`
|
|
632
558
|
};
|
|
559
|
+
(0, utils_1.lazy)(result, '$target', () => resolveTarget(converter, currentTarget, navPropertyPath.NavigationPropertyPath, currentTerm)
|
|
560
|
+
.target);
|
|
561
|
+
return result;
|
|
633
562
|
});
|
|
634
563
|
case 'Record':
|
|
635
564
|
return collectionDefinition.map((recordDefinition, recordIdx) => {
|
|
636
|
-
return parseRecord(recordDefinition, `${parentFQN}/${recordIdx}
|
|
565
|
+
return parseRecord(converter, currentTerm, currentTarget, currentProperty, currentSource, recordDefinition, `${parentFQN}/${recordIdx}`);
|
|
637
566
|
});
|
|
638
567
|
case 'Apply':
|
|
639
568
|
case 'Null':
|
|
@@ -647,15 +576,10 @@ function parseCollection(collectionDefinition, parentFQN, objectMap, context) {
|
|
|
647
576
|
case 'Not':
|
|
648
577
|
case 'And':
|
|
649
578
|
case 'Or':
|
|
650
|
-
return collectionDefinition.map((ifValue) =>
|
|
651
|
-
return ifValue;
|
|
652
|
-
});
|
|
579
|
+
return collectionDefinition.map((ifValue) => ifValue);
|
|
653
580
|
case 'String':
|
|
654
581
|
return collectionDefinition.map((stringValue) => {
|
|
655
|
-
if (typeof stringValue === 'string') {
|
|
656
|
-
return stringValue;
|
|
657
|
-
}
|
|
658
|
-
else if (stringValue === undefined) {
|
|
582
|
+
if (typeof stringValue === 'string' || stringValue === undefined) {
|
|
659
583
|
return stringValue;
|
|
660
584
|
}
|
|
661
585
|
else {
|
|
@@ -669,471 +593,493 @@ function parseCollection(collectionDefinition, parentFQN, objectMap, context) {
|
|
|
669
593
|
throw new Error('Unsupported case');
|
|
670
594
|
}
|
|
671
595
|
}
|
|
672
|
-
function
|
|
673
|
-
|
|
674
|
-
|
|
596
|
+
function isV4NavigationProperty(navProp) {
|
|
597
|
+
return !!navProp.targetTypeName;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Split the alias from the term value.
|
|
601
|
+
*
|
|
602
|
+
* @param references the current set of references
|
|
603
|
+
* @param termValue the value of the term
|
|
604
|
+
* @returns the term alias and the actual term value
|
|
605
|
+
*/
|
|
606
|
+
function splitTerm(references, termValue) {
|
|
607
|
+
return (0, utils_1.splitAtLast)((0, utils_1.alias)(references, termValue), '.');
|
|
608
|
+
}
|
|
609
|
+
function convertAnnotation(converter, target, rawAnnotation) {
|
|
610
|
+
var _a;
|
|
611
|
+
let annotation;
|
|
612
|
+
if (rawAnnotation.record) {
|
|
613
|
+
annotation = parseRecord(converter, rawAnnotation.term, target, '', rawAnnotation.__source, rawAnnotation.record, rawAnnotation.fullyQualifiedName);
|
|
675
614
|
}
|
|
676
|
-
else if (
|
|
677
|
-
|
|
678
|
-
return parseValue(annotation.value, annotation.fullyQualifiedName, objectMap, context);
|
|
679
|
-
}
|
|
680
|
-
else {
|
|
681
|
-
return true;
|
|
682
|
-
}
|
|
615
|
+
else if (rawAnnotation.collection === undefined) {
|
|
616
|
+
annotation = parseValue(converter, target, rawAnnotation.term, '', rawAnnotation.__source, (_a = rawAnnotation.value) !== null && _a !== void 0 ? _a : { type: 'Bool', Bool: true }, rawAnnotation.fullyQualifiedName);
|
|
683
617
|
}
|
|
684
|
-
else if (
|
|
685
|
-
|
|
686
|
-
collection.fullyQualifiedName = annotation.fullyQualifiedName;
|
|
687
|
-
return collection;
|
|
618
|
+
else if (rawAnnotation.collection) {
|
|
619
|
+
annotation = parseCollection(converter, target, rawAnnotation.term, '', rawAnnotation.__source, rawAnnotation.collection, rawAnnotation.fullyQualifiedName);
|
|
688
620
|
}
|
|
689
621
|
else {
|
|
690
622
|
throw new Error('Unsupported case');
|
|
691
623
|
}
|
|
624
|
+
switch (typeof annotation) {
|
|
625
|
+
case 'string':
|
|
626
|
+
// eslint-disable-next-line no-new-wrappers
|
|
627
|
+
annotation = new String(annotation);
|
|
628
|
+
break;
|
|
629
|
+
case 'boolean':
|
|
630
|
+
// eslint-disable-next-line no-new-wrappers
|
|
631
|
+
annotation = new Boolean(annotation);
|
|
632
|
+
break;
|
|
633
|
+
case 'number':
|
|
634
|
+
annotation = new Number(annotation);
|
|
635
|
+
break;
|
|
636
|
+
default:
|
|
637
|
+
// do nothing
|
|
638
|
+
break;
|
|
639
|
+
}
|
|
640
|
+
annotation.fullyQualifiedName = rawAnnotation.fullyQualifiedName;
|
|
641
|
+
annotation[ANNOTATION_TARGET] = target;
|
|
642
|
+
const [vocAlias, vocTerm] = converter.splitTerm(rawAnnotation.term);
|
|
643
|
+
annotation.term = converter.unalias(`${vocAlias}.${vocTerm}`);
|
|
644
|
+
annotation.qualifier = rawAnnotation.qualifier;
|
|
645
|
+
annotation.__source = rawAnnotation.__source;
|
|
646
|
+
try {
|
|
647
|
+
(0, utils_1.lazy)(annotation, 'annotations', () => {
|
|
648
|
+
var _a;
|
|
649
|
+
const annotationFQN = annotation.fullyQualifiedName;
|
|
650
|
+
// be graceful when resolving annotations on annotations: Sometimes they are referenced directly, sometimes they
|
|
651
|
+
// are part of the global annotations list
|
|
652
|
+
let annotations;
|
|
653
|
+
if (rawAnnotation.annotations && rawAnnotation.annotations.length > 0) {
|
|
654
|
+
annotations = rawAnnotation.annotations;
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
annotations = (_a = converter.rawAnnotationsPerTarget[annotationFQN]) === null || _a === void 0 ? void 0 : _a.annotations;
|
|
658
|
+
}
|
|
659
|
+
annotations === null || annotations === void 0 ? void 0 : annotations.forEach((rawSubAnnotation) => {
|
|
660
|
+
rawSubAnnotation.target = annotationFQN;
|
|
661
|
+
rawSubAnnotation.__source = annotation.__source;
|
|
662
|
+
rawSubAnnotation[ANNOTATION_TARGET] = target;
|
|
663
|
+
rawSubAnnotation.fullyQualifiedName = `${annotationFQN}@${rawSubAnnotation.term}`;
|
|
664
|
+
});
|
|
665
|
+
return createAnnotationsObject(converter, annotation, annotations !== null && annotations !== void 0 ? annotations : []);
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
catch (e) {
|
|
669
|
+
// not an error: parseRecord() already adds annotations, but the other parseXXX functions don't, so this can happen
|
|
670
|
+
}
|
|
671
|
+
return annotation;
|
|
672
|
+
}
|
|
673
|
+
function getAnnotationFQN(currentTargetName, references, annotation) {
|
|
674
|
+
const annotationFQN = `${currentTargetName}@${(0, utils_1.unalias)(references, annotation.term)}`;
|
|
675
|
+
if (annotation.qualifier) {
|
|
676
|
+
return `${annotationFQN}#${annotation.qualifier}`;
|
|
677
|
+
}
|
|
678
|
+
else {
|
|
679
|
+
return annotationFQN;
|
|
680
|
+
}
|
|
692
681
|
}
|
|
693
682
|
/**
|
|
694
|
-
*
|
|
683
|
+
* Merge annotation from different source together by overwriting at the term level.
|
|
695
684
|
*
|
|
696
|
-
* @param
|
|
697
|
-
* @
|
|
698
|
-
* @returns the resolvePath function that starts at the entityType
|
|
685
|
+
* @param rawMetadata
|
|
686
|
+
* @returns the resulting merged annotations
|
|
699
687
|
*/
|
|
700
|
-
function
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
688
|
+
function mergeAnnotations(rawMetadata) {
|
|
689
|
+
const annotationListPerTarget = {};
|
|
690
|
+
Object.keys(rawMetadata.schema.annotations).forEach((annotationSource) => {
|
|
691
|
+
rawMetadata.schema.annotations[annotationSource].forEach((annotationList) => {
|
|
692
|
+
const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
|
|
693
|
+
annotationList.__source = annotationSource;
|
|
694
|
+
if (!annotationListPerTarget[currentTargetName]) {
|
|
695
|
+
annotationListPerTarget[currentTargetName] = {
|
|
696
|
+
annotations: annotationList.annotations.map((annotation) => {
|
|
697
|
+
annotation.fullyQualifiedName = getAnnotationFQN(currentTargetName, rawMetadata.references, annotation);
|
|
698
|
+
annotation.__source = annotationSource;
|
|
699
|
+
return annotation;
|
|
700
|
+
}),
|
|
701
|
+
target: currentTargetName
|
|
702
|
+
};
|
|
703
|
+
annotationListPerTarget[currentTargetName].__source = annotationSource;
|
|
704
|
+
}
|
|
705
|
+
else {
|
|
706
|
+
annotationList.annotations.forEach((annotation) => {
|
|
707
|
+
const findIndex = annotationListPerTarget[currentTargetName].annotations.findIndex((referenceAnnotation) => {
|
|
708
|
+
return (referenceAnnotation.term === annotation.term &&
|
|
709
|
+
referenceAnnotation.qualifier === annotation.qualifier);
|
|
710
|
+
});
|
|
711
|
+
annotation.__source = annotationSource;
|
|
712
|
+
annotation.fullyQualifiedName = getAnnotationFQN(currentTargetName, rawMetadata.references, annotation);
|
|
713
|
+
if (findIndex !== -1) {
|
|
714
|
+
annotationListPerTarget[currentTargetName].annotations.splice(findIndex, 1, annotation);
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
annotationListPerTarget[currentTargetName].annotations.push(annotation);
|
|
718
|
+
}
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
});
|
|
722
|
+
});
|
|
723
|
+
return annotationListPerTarget;
|
|
705
724
|
}
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
725
|
+
class Converter {
|
|
726
|
+
get rawAnnotationsPerTarget() {
|
|
727
|
+
if (this._rawAnnotationsPerTarget === undefined) {
|
|
728
|
+
this._rawAnnotationsPerTarget = mergeAnnotations(this.rawMetadata);
|
|
729
|
+
}
|
|
730
|
+
return this._rawAnnotationsPerTarget;
|
|
731
|
+
}
|
|
732
|
+
getConvertedEntityContainer() {
|
|
733
|
+
return this.getConvertedElement(this.rawMetadata.schema.entityContainer.fullyQualifiedName, this.rawMetadata.schema.entityContainer, convertEntityContainer);
|
|
734
|
+
}
|
|
735
|
+
getConvertedEntitySet(fullyQualifiedName) {
|
|
736
|
+
return this.convertedOutput.entitySets.by_fullyQualifiedName(fullyQualifiedName);
|
|
737
|
+
}
|
|
738
|
+
getConvertedSingleton(fullyQualifiedName) {
|
|
739
|
+
return this.convertedOutput.singletons.by_fullyQualifiedName(fullyQualifiedName);
|
|
740
|
+
}
|
|
741
|
+
getConvertedEntityType(fullyQualifiedName) {
|
|
742
|
+
return this.convertedOutput.entityTypes.by_fullyQualifiedName(fullyQualifiedName);
|
|
743
|
+
}
|
|
744
|
+
getConvertedComplexType(fullyQualifiedName) {
|
|
745
|
+
return this.convertedOutput.complexTypes.by_fullyQualifiedName(fullyQualifiedName);
|
|
746
|
+
}
|
|
747
|
+
getConvertedTypeDefinition(fullyQualifiedName) {
|
|
748
|
+
return this.convertedOutput.typeDefinitions.by_fullyQualifiedName(fullyQualifiedName);
|
|
749
|
+
}
|
|
750
|
+
getConvertedActionImport(fullyQualifiedName) {
|
|
751
|
+
let actionImport = this.convertedOutput.actionImports.by_fullyQualifiedName(fullyQualifiedName);
|
|
752
|
+
if (!actionImport) {
|
|
753
|
+
actionImport = this.convertedOutput.actionImports.by_name(fullyQualifiedName);
|
|
754
|
+
}
|
|
755
|
+
return actionImport;
|
|
756
|
+
}
|
|
757
|
+
getConvertedAction(fullyQualifiedName) {
|
|
758
|
+
return this.convertedOutput.actions.by_fullyQualifiedName(fullyQualifiedName);
|
|
759
|
+
}
|
|
760
|
+
convert(rawValue, map) {
|
|
761
|
+
if (Array.isArray(rawValue)) {
|
|
762
|
+
return () => {
|
|
763
|
+
const converted = rawValue.reduce((convertedElements, rawElement) => {
|
|
764
|
+
const convertedElement = this.getConvertedElement(rawElement.fullyQualifiedName, rawElement, map);
|
|
765
|
+
if (convertedElement) {
|
|
766
|
+
convertedElements.push(convertedElement);
|
|
767
|
+
}
|
|
768
|
+
return convertedElements;
|
|
769
|
+
}, []);
|
|
770
|
+
(0, utils_1.addGetByValue)(converted, 'name');
|
|
771
|
+
(0, utils_1.addGetByValue)(converted, 'fullyQualifiedName');
|
|
772
|
+
return converted;
|
|
773
|
+
};
|
|
713
774
|
}
|
|
775
|
+
else {
|
|
776
|
+
return () => this.getConvertedElement(rawValue.fullyQualifiedName, rawValue, map);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
constructor(rawMetadata, convertedOutput) {
|
|
780
|
+
this.convertedElements = new Map();
|
|
781
|
+
this.rawMetadata = rawMetadata;
|
|
782
|
+
this.rawSchema = rawMetadata.schema;
|
|
783
|
+
this.convertedOutput = convertedOutput;
|
|
784
|
+
}
|
|
785
|
+
getConvertedElement(fullyQualifiedName, rawElement, map) {
|
|
786
|
+
let converted = this.convertedElements.get(fullyQualifiedName);
|
|
787
|
+
if (converted === undefined) {
|
|
788
|
+
const rawMetadata = typeof rawElement === 'function' ? rawElement.apply(undefined, [fullyQualifiedName]) : rawElement;
|
|
789
|
+
if (rawMetadata !== undefined) {
|
|
790
|
+
converted = map.apply(undefined, [this, rawMetadata]);
|
|
791
|
+
this.convertedElements.set(fullyQualifiedName, converted);
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
return converted;
|
|
795
|
+
}
|
|
796
|
+
logError(message) {
|
|
797
|
+
this.convertedOutput.diagnostics.push({ message });
|
|
798
|
+
}
|
|
799
|
+
splitTerm(term) {
|
|
800
|
+
return splitTerm(this.rawMetadata.references, term);
|
|
801
|
+
}
|
|
802
|
+
alias(value) {
|
|
803
|
+
return (0, utils_1.alias)(this.rawMetadata.references, value);
|
|
804
|
+
}
|
|
805
|
+
unalias(value) {
|
|
806
|
+
var _a;
|
|
807
|
+
return (_a = (0, utils_1.unalias)(this.rawMetadata.references, value)) !== null && _a !== void 0 ? _a : '';
|
|
714
808
|
}
|
|
715
|
-
outNavProp.referentialConstraint = navProp.referentialConstraint || [];
|
|
716
809
|
}
|
|
717
|
-
function
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
810
|
+
function resolveEntityType(converter, fullyQualifiedName) {
|
|
811
|
+
return () => {
|
|
812
|
+
let entityType = converter.getConvertedEntityType(fullyQualifiedName);
|
|
813
|
+
if (!entityType) {
|
|
814
|
+
converter.logError(`EntityType '${fullyQualifiedName}' not found`);
|
|
815
|
+
entityType = {};
|
|
816
|
+
}
|
|
817
|
+
return entityType;
|
|
818
|
+
};
|
|
723
819
|
}
|
|
724
|
-
function
|
|
725
|
-
return
|
|
820
|
+
function resolveNavigationPropertyBindings(converter, rawNavigationPropertyBindings, rawElement) {
|
|
821
|
+
return () => Object.keys(rawNavigationPropertyBindings).reduce((navigationPropertyBindings, bindingName) => {
|
|
822
|
+
const rawBindingTarget = rawNavigationPropertyBindings[bindingName];
|
|
823
|
+
(0, utils_1.lazy)(navigationPropertyBindings, bindingName, () => {
|
|
824
|
+
let resolvedBindingTarget;
|
|
825
|
+
if (rawBindingTarget._type === 'Singleton') {
|
|
826
|
+
resolvedBindingTarget = converter.getConvertedSingleton(rawBindingTarget.fullyQualifiedName);
|
|
827
|
+
}
|
|
828
|
+
else {
|
|
829
|
+
resolvedBindingTarget = converter.getConvertedEntitySet(rawBindingTarget.fullyQualifiedName);
|
|
830
|
+
}
|
|
831
|
+
if (!resolvedBindingTarget) {
|
|
832
|
+
converter.logError(`${rawElement._type} '${rawElement.fullyQualifiedName}': Failed to resolve NavigationPropertyBinding ${bindingName}`);
|
|
833
|
+
resolvedBindingTarget = {};
|
|
834
|
+
}
|
|
835
|
+
return resolvedBindingTarget;
|
|
836
|
+
});
|
|
837
|
+
return navigationPropertyBindings;
|
|
838
|
+
}, {});
|
|
726
839
|
}
|
|
727
|
-
function
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
};
|
|
741
|
-
if (isV4NavigationProperty(navProp)) {
|
|
742
|
-
resolveV4NavigationProperty(navProp, objectMap, outNavProp);
|
|
743
|
-
}
|
|
744
|
-
else {
|
|
745
|
-
resolveV2NavigationProperty(navProp, associations, objectMap, outNavProp);
|
|
840
|
+
function resolveAnnotations(converter, rawAnnotationTarget) {
|
|
841
|
+
const nestedAnnotations = rawAnnotationTarget.annotations;
|
|
842
|
+
return () => {
|
|
843
|
+
var _a, _b;
|
|
844
|
+
return createAnnotationsObject(converter, rawAnnotationTarget, (_b = nestedAnnotations !== null && nestedAnnotations !== void 0 ? nestedAnnotations : (_a = converter.rawAnnotationsPerTarget[rawAnnotationTarget.fullyQualifiedName]) === null || _a === void 0 ? void 0 : _a.annotations) !== null && _b !== void 0 ? _b : []);
|
|
845
|
+
};
|
|
846
|
+
}
|
|
847
|
+
function createAnnotationsObject(converter, target, rawAnnotations) {
|
|
848
|
+
return rawAnnotations.reduce((vocabularyAliases, annotation) => {
|
|
849
|
+
const [vocAlias, vocTerm] = converter.splitTerm(annotation.term);
|
|
850
|
+
const vocTermWithQualifier = `${vocTerm}${annotation.qualifier ? '#' + annotation.qualifier : ''}`;
|
|
851
|
+
if (vocabularyAliases[vocAlias] === undefined) {
|
|
852
|
+
vocabularyAliases[vocAlias] = {};
|
|
746
853
|
}
|
|
747
|
-
if (
|
|
748
|
-
|
|
854
|
+
if (!vocabularyAliases[vocAlias].hasOwnProperty(vocTermWithQualifier)) {
|
|
855
|
+
(0, utils_1.lazy)(vocabularyAliases[vocAlias], vocTermWithQualifier, () => converter.getConvertedElement(annotation.fullyQualifiedName, annotation, (converter, rawAnnotation) => convertAnnotation(converter, target, rawAnnotation)));
|
|
749
856
|
}
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
});
|
|
857
|
+
return vocabularyAliases;
|
|
858
|
+
}, {});
|
|
753
859
|
}
|
|
754
860
|
/**
|
|
755
|
-
*
|
|
756
|
-
*
|
|
757
|
-
* @param
|
|
861
|
+
* Converts an EntityContainer.
|
|
862
|
+
*
|
|
863
|
+
* @param converter Converter
|
|
864
|
+
* @param rawEntityContainer Unconverted EntityContainer
|
|
865
|
+
* @returns The converted EntityContainer
|
|
758
866
|
*/
|
|
759
|
-
function
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
867
|
+
function convertEntityContainer(converter, rawEntityContainer) {
|
|
868
|
+
const convertedEntityContainer = rawEntityContainer;
|
|
869
|
+
(0, utils_1.lazy)(convertedEntityContainer, 'annotations', resolveAnnotations(converter, rawEntityContainer));
|
|
870
|
+
(0, utils_1.lazy)(convertedEntityContainer, 'entitySets', converter.convert(converter.rawSchema.entitySets, convertEntitySet));
|
|
871
|
+
(0, utils_1.lazy)(convertedEntityContainer, 'singletons', converter.convert(converter.rawSchema.singletons, convertSingleton));
|
|
872
|
+
(0, utils_1.lazy)(convertedEntityContainer, 'actionImports', converter.convert(converter.rawSchema.actionImports, convertActionImport));
|
|
873
|
+
return convertedEntityContainer;
|
|
764
874
|
}
|
|
765
875
|
/**
|
|
766
|
-
*
|
|
767
|
-
*
|
|
768
|
-
* @param
|
|
876
|
+
* Converts a Singleton.
|
|
877
|
+
*
|
|
878
|
+
* @param converter Converter
|
|
879
|
+
* @param rawSingleton Unconverted Singleton
|
|
880
|
+
* @returns The converted Singleton
|
|
769
881
|
*/
|
|
770
|
-
function
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
if (sourceEntityType) {
|
|
779
|
-
if (!sourceEntityType.actions) {
|
|
780
|
-
sourceEntityType.actions = {};
|
|
781
|
-
}
|
|
782
|
-
sourceEntityType.actions[`${namespace}.${action.name}`] = action;
|
|
783
|
-
}
|
|
784
|
-
action.returnEntityType = objectMap[action.returnType];
|
|
785
|
-
}
|
|
786
|
-
});
|
|
787
|
-
}
|
|
788
|
-
function linkActionImportsToActions(actionImports, objectMap) {
|
|
789
|
-
actionImports.forEach((actionImport) => {
|
|
790
|
-
actionImport.action = objectMap[actionImport.actionName];
|
|
791
|
-
});
|
|
882
|
+
function convertSingleton(converter, rawSingleton) {
|
|
883
|
+
const convertedSingleton = rawSingleton;
|
|
884
|
+
convertedSingleton.entityTypeName = converter.unalias(rawSingleton.entityTypeName);
|
|
885
|
+
(0, utils_1.lazy)(convertedSingleton, 'entityType', resolveEntityType(converter, rawSingleton.entityTypeName));
|
|
886
|
+
(0, utils_1.lazy)(convertedSingleton, 'annotations', resolveAnnotations(converter, rawSingleton));
|
|
887
|
+
const _rawNavigationPropertyBindings = rawSingleton.navigationPropertyBinding;
|
|
888
|
+
(0, utils_1.lazy)(convertedSingleton, 'navigationPropertyBinding', resolveNavigationPropertyBindings(converter, _rawNavigationPropertyBindings, rawSingleton));
|
|
889
|
+
return convertedSingleton;
|
|
792
890
|
}
|
|
793
891
|
/**
|
|
794
|
-
*
|
|
795
|
-
*
|
|
796
|
-
* @param
|
|
892
|
+
* Converts an EntitySet.
|
|
893
|
+
*
|
|
894
|
+
* @param converter Converter
|
|
895
|
+
* @param rawEntitySet Unconverted EntitySet
|
|
896
|
+
* @returns The converted EntitySet
|
|
797
897
|
*/
|
|
798
|
-
function
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
}
|
|
807
|
-
if (!entitySet.entityType.annotations) {
|
|
808
|
-
entitySet.entityType.annotations = {};
|
|
809
|
-
}
|
|
810
|
-
entitySet.entityType.keys.forEach((keyProp) => {
|
|
811
|
-
keyProp.isKey = true;
|
|
812
|
-
});
|
|
813
|
-
});
|
|
898
|
+
function convertEntitySet(converter, rawEntitySet) {
|
|
899
|
+
const convertedEntitySet = rawEntitySet;
|
|
900
|
+
convertedEntitySet.entityTypeName = converter.unalias(rawEntitySet.entityTypeName);
|
|
901
|
+
(0, utils_1.lazy)(convertedEntitySet, 'entityType', resolveEntityType(converter, rawEntitySet.entityTypeName));
|
|
902
|
+
(0, utils_1.lazy)(convertedEntitySet, 'annotations', resolveAnnotations(converter, rawEntitySet));
|
|
903
|
+
const _rawNavigationPropertyBindings = rawEntitySet.navigationPropertyBinding;
|
|
904
|
+
(0, utils_1.lazy)(convertedEntitySet, 'navigationPropertyBinding', resolveNavigationPropertyBindings(converter, _rawNavigationPropertyBindings, rawEntitySet));
|
|
905
|
+
return convertedEntitySet;
|
|
814
906
|
}
|
|
815
907
|
/**
|
|
816
|
-
*
|
|
817
|
-
*
|
|
818
|
-
* @param
|
|
908
|
+
* Converts an EntityType.
|
|
909
|
+
*
|
|
910
|
+
* @param converter Converter
|
|
911
|
+
* @param rawEntityType Unconverted EntityType
|
|
912
|
+
* @returns The converted EntityType
|
|
819
913
|
*/
|
|
820
|
-
function
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
914
|
+
function convertEntityType(converter, rawEntityType) {
|
|
915
|
+
const convertedEntityType = rawEntityType;
|
|
916
|
+
rawEntityType.keys.forEach((keyProp) => {
|
|
917
|
+
keyProp.isKey = true;
|
|
918
|
+
});
|
|
919
|
+
(0, utils_1.lazy)(convertedEntityType, 'annotations', resolveAnnotations(converter, rawEntityType));
|
|
920
|
+
(0, utils_1.lazy)(convertedEntityType, 'keys', converter.convert(rawEntityType.keys, convertProperty));
|
|
921
|
+
(0, utils_1.lazy)(convertedEntityType, 'entityProperties', converter.convert(rawEntityType.entityProperties, convertProperty));
|
|
922
|
+
(0, utils_1.lazy)(convertedEntityType, 'navigationProperties', converter.convert(rawEntityType.navigationProperties, convertNavigationProperty));
|
|
923
|
+
(0, utils_1.lazy)(convertedEntityType, 'actions', () => converter.rawSchema.actions
|
|
924
|
+
.filter((rawAction) => rawAction.isBound &&
|
|
925
|
+
(rawAction.sourceType === rawEntityType.fullyQualifiedName ||
|
|
926
|
+
rawAction.sourceType === `Collection(${rawEntityType.fullyQualifiedName})`))
|
|
927
|
+
.reduce((actions, rawAction) => {
|
|
928
|
+
const name = `${converter.rawSchema.namespace}.${rawAction.name}`;
|
|
929
|
+
actions[name] = converter.getConvertedAction(rawAction.fullyQualifiedName);
|
|
930
|
+
return actions;
|
|
931
|
+
}, {}));
|
|
932
|
+
convertedEntityType.resolvePath = (relativePath, includeVisitedObjects) => {
|
|
933
|
+
const resolved = resolveTarget(converter, rawEntityType, relativePath);
|
|
934
|
+
if (includeVisitedObjects) {
|
|
935
|
+
return { target: resolved.target, visitedObjects: resolved.objectPath, messages: resolved.messages };
|
|
828
936
|
}
|
|
829
|
-
|
|
830
|
-
|
|
937
|
+
else {
|
|
938
|
+
return resolved.target;
|
|
831
939
|
}
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
});
|
|
835
|
-
});
|
|
940
|
+
};
|
|
941
|
+
return convertedEntityType;
|
|
836
942
|
}
|
|
837
943
|
/**
|
|
838
|
-
*
|
|
839
|
-
*
|
|
944
|
+
* Converts a Property.
|
|
945
|
+
*
|
|
946
|
+
* @param converter Converter
|
|
947
|
+
* @param rawProperty Unconverted Property
|
|
948
|
+
* @returns The converted Property
|
|
840
949
|
*/
|
|
841
|
-
function
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
if (property.type.indexOf('Edm') !== 0) {
|
|
851
|
-
let complexType;
|
|
852
|
-
if (property.type.startsWith('Collection')) {
|
|
853
|
-
const complexTypeName = property.type.substring(11, property.type.length - 1);
|
|
854
|
-
complexType = objectMap[complexTypeName];
|
|
855
|
-
}
|
|
856
|
-
else {
|
|
857
|
-
complexType = objectMap[property.type];
|
|
858
|
-
}
|
|
859
|
-
if (complexType) {
|
|
860
|
-
property.targetType = complexType;
|
|
861
|
-
if (complexType.properties) {
|
|
862
|
-
complexType.properties.forEach(link);
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
catch (sError) {
|
|
868
|
-
throw new Error('Property Type is not defined');
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
entityTypes.forEach((entityType) => {
|
|
872
|
-
entityType.entityProperties.forEach(link);
|
|
950
|
+
function convertProperty(converter, rawProperty) {
|
|
951
|
+
const convertedProperty = rawProperty;
|
|
952
|
+
convertedProperty.type = converter.unalias(rawProperty.type);
|
|
953
|
+
(0, utils_1.lazy)(convertedProperty, 'annotations', resolveAnnotations(converter, rawProperty));
|
|
954
|
+
(0, utils_1.lazy)(convertedProperty, 'targetType', () => {
|
|
955
|
+
var _a;
|
|
956
|
+
const type = rawProperty.type;
|
|
957
|
+
const typeName = type.startsWith('Collection') ? type.substring(11, type.length - 1) : type;
|
|
958
|
+
return (_a = converter.getConvertedComplexType(typeName)) !== null && _a !== void 0 ? _a : converter.getConvertedTypeDefinition(typeName);
|
|
873
959
|
});
|
|
960
|
+
return convertedProperty;
|
|
874
961
|
}
|
|
875
962
|
/**
|
|
876
|
-
*
|
|
877
|
-
*
|
|
878
|
-
* @param
|
|
963
|
+
* Converts a NavigationProperty.
|
|
964
|
+
*
|
|
965
|
+
* @param converter Converter
|
|
966
|
+
* @param rawNavigationProperty Unconverted NavigationProperty
|
|
967
|
+
* @returns The converted NavigationProperty
|
|
879
968
|
*/
|
|
880
|
-
function
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
969
|
+
function convertNavigationProperty(converter, rawNavigationProperty) {
|
|
970
|
+
var _a, _b, _c;
|
|
971
|
+
const convertedNavigationProperty = rawNavigationProperty;
|
|
972
|
+
convertedNavigationProperty.referentialConstraint = (_a = convertedNavigationProperty.referentialConstraint) !== null && _a !== void 0 ? _a : [];
|
|
973
|
+
if (isV4NavigationProperty(rawNavigationProperty)) {
|
|
974
|
+
convertedNavigationProperty.targetTypeName = converter.unalias(rawNavigationProperty.targetTypeName);
|
|
975
|
+
}
|
|
976
|
+
else {
|
|
977
|
+
const associationEnd = (_b = converter.rawSchema.associations
|
|
978
|
+
.find((association) => association.fullyQualifiedName === rawNavigationProperty.relationship)) === null || _b === void 0 ? void 0 : _b.associationEnd.find((end) => end.role === rawNavigationProperty.toRole);
|
|
979
|
+
convertedNavigationProperty.isCollection = (associationEnd === null || associationEnd === void 0 ? void 0 : associationEnd.multiplicity) === '*';
|
|
980
|
+
convertedNavigationProperty.targetTypeName = (_c = associationEnd === null || associationEnd === void 0 ? void 0 : associationEnd.type) !== null && _c !== void 0 ? _c : '';
|
|
981
|
+
}
|
|
982
|
+
(0, utils_1.lazy)(convertedNavigationProperty, 'targetType', resolveEntityType(converter, rawNavigationProperty.targetTypeName));
|
|
983
|
+
(0, utils_1.lazy)(convertedNavigationProperty, 'annotations', resolveAnnotations(converter, rawNavigationProperty));
|
|
984
|
+
return convertedNavigationProperty;
|
|
890
985
|
}
|
|
891
986
|
/**
|
|
892
|
-
*
|
|
987
|
+
* Converts an ActionImport.
|
|
893
988
|
*
|
|
894
|
-
* @param
|
|
895
|
-
* @param
|
|
896
|
-
* @returns
|
|
989
|
+
* @param converter Converter
|
|
990
|
+
* @param rawActionImport Unconverted ActionImport
|
|
991
|
+
* @returns The converted ActionImport
|
|
897
992
|
*/
|
|
898
|
-
function
|
|
899
|
-
const
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
return
|
|
993
|
+
function convertActionImport(converter, rawActionImport) {
|
|
994
|
+
const convertedActionImport = rawActionImport;
|
|
995
|
+
convertedActionImport.actionName = converter.unalias(rawActionImport.actionName);
|
|
996
|
+
(0, utils_1.lazy)(convertedActionImport, 'annotations', resolveAnnotations(converter, rawActionImport));
|
|
997
|
+
(0, utils_1.lazy)(convertedActionImport, 'action', () => converter.getConvertedAction(rawActionImport.actionName));
|
|
998
|
+
return convertedActionImport;
|
|
904
999
|
}
|
|
905
1000
|
/**
|
|
906
|
-
*
|
|
1001
|
+
* Converts an Action.
|
|
907
1002
|
*
|
|
908
|
-
* @param
|
|
909
|
-
* @param
|
|
910
|
-
* @returns
|
|
1003
|
+
* @param converter Converter
|
|
1004
|
+
* @param rawAction Unconverted Action
|
|
1005
|
+
* @returns The converted Action
|
|
911
1006
|
*/
|
|
912
|
-
function
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
1007
|
+
function convertAction(converter, rawAction) {
|
|
1008
|
+
const convertedAction = rawAction;
|
|
1009
|
+
convertedAction.sourceType = converter.unalias(rawAction.sourceType);
|
|
1010
|
+
if (convertedAction.sourceType) {
|
|
1011
|
+
(0, utils_1.lazy)(convertedAction, 'sourceEntityType', resolveEntityType(converter, rawAction.sourceType));
|
|
1012
|
+
}
|
|
1013
|
+
convertedAction.returnType = converter.unalias(rawAction.returnType);
|
|
1014
|
+
if (convertedAction.returnType) {
|
|
1015
|
+
(0, utils_1.lazy)(convertedAction, 'returnEntityType', resolveEntityType(converter, rawAction.returnType));
|
|
1016
|
+
}
|
|
1017
|
+
(0, utils_1.lazy)(convertedAction, 'parameters', converter.convert(rawAction.parameters, convertActionParameter));
|
|
1018
|
+
(0, utils_1.lazy)(convertedAction, 'annotations', () => {
|
|
1019
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
1020
|
+
// this.is.the.action(on.this.type) --> action: 'this.is.the.action', overload: 'on.this.type'
|
|
1021
|
+
// this.is.the.action() --> action: 'this.is.the.action', overload: undefined
|
|
1022
|
+
// this.is.the.action --> action: 'this.is.the.action', overload: undefined
|
|
1023
|
+
const actionAndOverload = rawAction.fullyQualifiedName.match(/(?<action>[^()]+)(?:\((?<overload>.*)\))?/);
|
|
1024
|
+
let rawAnnotations = [];
|
|
1025
|
+
if (actionAndOverload) {
|
|
1026
|
+
if ((_a = actionAndOverload.groups) === null || _a === void 0 ? void 0 : _a.overload) {
|
|
1027
|
+
rawAnnotations = (_c = (_b = converter.rawAnnotationsPerTarget[rawAction.fullyQualifiedName]) === null || _b === void 0 ? void 0 : _b.annotations) !== null && _c !== void 0 ? _c : [];
|
|
918
1028
|
}
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
1029
|
+
else {
|
|
1030
|
+
rawAnnotations =
|
|
1031
|
+
(_f = (_e = converter.rawAnnotationsPerTarget[`${(_d = actionAndOverload.groups) === null || _d === void 0 ? void 0 : _d.action}()`]) === null || _e === void 0 ? void 0 : _e.annotations) !== null && _f !== void 0 ? _f : [];
|
|
922
1032
|
}
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
};
|
|
927
|
-
}
|
|
928
|
-
const aPathSplit = sPath.split('/');
|
|
929
|
-
if (aPathSplit.shift() !== '') {
|
|
930
|
-
throw new Error('Cannot deal with relative path');
|
|
931
|
-
}
|
|
932
|
-
const entitySetName = aPathSplit.shift();
|
|
933
|
-
const entitySet = convertedOutput.entitySets.find((et) => et.name === entitySetName);
|
|
934
|
-
const singleton = convertedOutput.singletons.find((et) => et.name === entitySetName);
|
|
935
|
-
if (!entitySet && !singleton) {
|
|
936
|
-
return {
|
|
937
|
-
target: convertedOutput.entityContainer,
|
|
938
|
-
objectPath: [convertedOutput.entityContainer]
|
|
939
|
-
};
|
|
940
|
-
}
|
|
941
|
-
if (aPathSplit.length === 0) {
|
|
942
|
-
return {
|
|
943
|
-
target: entitySet || singleton,
|
|
944
|
-
objectPath: [convertedOutput.entityContainer, entitySet || singleton]
|
|
945
|
-
};
|
|
946
|
-
}
|
|
947
|
-
else {
|
|
948
|
-
const targetResolution = _resolveTarget(objectMap, entitySet || singleton, '/' + aPathSplit.join('/'), false, true);
|
|
949
|
-
if (targetResolution.target) {
|
|
950
|
-
targetResolution.visitedObjects.push(targetResolution.target);
|
|
1033
|
+
if (((_g = actionAndOverload.groups) === null || _g === void 0 ? void 0 : _g.action) && ((_h = actionAndOverload.groups) === null || _h === void 0 ? void 0 : _h.action) !== rawAction.fullyQualifiedName) {
|
|
1034
|
+
const baseAnnotations = (_l = (_k = converter.rawAnnotationsPerTarget[(_j = actionAndOverload.groups) === null || _j === void 0 ? void 0 : _j.action]) === null || _k === void 0 ? void 0 : _k.annotations) !== null && _l !== void 0 ? _l : [];
|
|
1035
|
+
rawAnnotations = rawAnnotations.concat(baseAnnotations);
|
|
951
1036
|
}
|
|
952
|
-
return {
|
|
953
|
-
target: targetResolution.target,
|
|
954
|
-
objectPath: targetResolution.visitedObjects
|
|
955
|
-
};
|
|
956
1037
|
}
|
|
957
|
-
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
if (!currentTarget.annotations) {
|
|
961
|
-
currentTarget.annotations = {};
|
|
962
|
-
}
|
|
963
|
-
if (!currentTarget.annotations[vocAlias]) {
|
|
964
|
-
currentTarget.annotations[vocAlias] = {};
|
|
965
|
-
}
|
|
966
|
-
if (!currentTarget.annotations._annotations) {
|
|
967
|
-
currentTarget.annotations._annotations = {};
|
|
968
|
-
}
|
|
1038
|
+
return createAnnotationsObject(converter, rawAction, rawAnnotations);
|
|
1039
|
+
});
|
|
1040
|
+
return convertedAction;
|
|
969
1041
|
}
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
1042
|
+
/**
|
|
1043
|
+
* Converts an ActionParameter.
|
|
1044
|
+
*
|
|
1045
|
+
* @param converter Converter
|
|
1046
|
+
* @param rawActionParameter Unconverted ActionParameter
|
|
1047
|
+
* @returns The converted ActionParameter
|
|
1048
|
+
*/
|
|
1049
|
+
function convertActionParameter(converter, rawActionParameter) {
|
|
1050
|
+
const convertedActionParameter = rawActionParameter;
|
|
1051
|
+
(0, utils_1.lazy)(convertedActionParameter, 'typeReference', () => {
|
|
974
1052
|
var _a, _b;
|
|
975
|
-
|
|
976
|
-
const [vocAlias, vocTerm] = splitTerm(utils_1.defaultReferences, annotation.term);
|
|
977
|
-
ensureAnnotations(currentTarget, vocAlias);
|
|
978
|
-
const vocTermWithQualifier = `${vocTerm}${annotation.qualifier ? '#' + annotation.qualifier : ''}`;
|
|
979
|
-
if (!bOverrideExisting && ((_b = (_a = currentTarget.annotations) === null || _a === void 0 ? void 0 : _a[vocAlias]) === null || _b === void 0 ? void 0 : _b[vocTermWithQualifier]) !== undefined) {
|
|
980
|
-
return;
|
|
981
|
-
}
|
|
982
|
-
currentContext.currentTerm = annotation.term;
|
|
983
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier] = convertAnnotation(annotation, objectMap, currentContext);
|
|
984
|
-
switch (typeof currentTarget.annotations[vocAlias][vocTermWithQualifier]) {
|
|
985
|
-
case 'string':
|
|
986
|
-
// eslint-disable-next-line no-new-wrappers
|
|
987
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier] = new String(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
|
|
988
|
-
break;
|
|
989
|
-
case 'boolean':
|
|
990
|
-
// eslint-disable-next-line no-new-wrappers
|
|
991
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier] = new Boolean(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
|
|
992
|
-
break;
|
|
993
|
-
default:
|
|
994
|
-
// do nothing
|
|
995
|
-
break;
|
|
996
|
-
}
|
|
997
|
-
if (currentTarget.annotations[vocAlias][vocTermWithQualifier] !== null &&
|
|
998
|
-
typeof currentTarget.annotations[vocAlias][vocTermWithQualifier] === 'object' &&
|
|
999
|
-
!currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations) {
|
|
1000
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations = {};
|
|
1001
|
-
}
|
|
1002
|
-
if (currentTarget.annotations[vocAlias][vocTermWithQualifier] !== null &&
|
|
1003
|
-
typeof currentTarget.annotations[vocAlias][vocTermWithQualifier] === 'object') {
|
|
1004
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier].term = (0, utils_1.unalias)(utils_1.defaultReferences, `${vocAlias}.${vocTerm}`);
|
|
1005
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier].qualifier = annotation.qualifier;
|
|
1006
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier].__source = currentContext.currentSource;
|
|
1007
|
-
}
|
|
1008
|
-
const annotationTarget = `${currentTargetName}@${(0, utils_1.unalias)(utils_1.defaultReferences, vocAlias + '.' + vocTermWithQualifier)}`;
|
|
1009
|
-
if (Array.isArray(annotation.annotations)) {
|
|
1010
|
-
const subAnnotationList = {
|
|
1011
|
-
target: annotationTarget,
|
|
1012
|
-
annotations: annotation.annotations,
|
|
1013
|
-
__source: currentContext.currentSource
|
|
1014
|
-
};
|
|
1015
|
-
currentContext.additionalAnnotations.push(subAnnotationList);
|
|
1016
|
-
}
|
|
1017
|
-
else if (annotation.annotations && !currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations) {
|
|
1018
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations = annotation.annotations;
|
|
1019
|
-
}
|
|
1020
|
-
currentTarget.annotations._annotations[`${vocAlias}.${vocTermWithQualifier}`] =
|
|
1021
|
-
currentTarget.annotations._annotations[(0, utils_1.unalias)(utils_1.defaultReferences, `${vocAlias}.${vocTermWithQualifier}`)] =
|
|
1022
|
-
currentTarget.annotations[vocAlias][vocTermWithQualifier];
|
|
1023
|
-
objectMap[annotationTarget] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
|
|
1053
|
+
return (_b = (_a = converter.getConvertedEntityType(rawActionParameter.type)) !== null && _a !== void 0 ? _a : converter.getConvertedComplexType(rawActionParameter.type)) !== null && _b !== void 0 ? _b : converter.getConvertedTypeDefinition(rawActionParameter.type);
|
|
1024
1054
|
});
|
|
1055
|
+
(0, utils_1.lazy)(convertedActionParameter, 'annotations', resolveAnnotations(converter, rawActionParameter));
|
|
1056
|
+
return convertedActionParameter;
|
|
1025
1057
|
}
|
|
1026
1058
|
/**
|
|
1027
|
-
*
|
|
1059
|
+
* Converts a ComplexType.
|
|
1028
1060
|
*
|
|
1029
|
-
* @param
|
|
1030
|
-
* @param
|
|
1061
|
+
* @param converter Converter
|
|
1062
|
+
* @param rawComplexType Unconverted ComplexType
|
|
1063
|
+
* @returns The converted ComplexType
|
|
1031
1064
|
*/
|
|
1032
|
-
function
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
delete targetToResolve.annotationType;
|
|
1039
|
-
delete targetToResolve.annotationsTerm;
|
|
1040
|
-
if (resolvable.inline && !(resolvedTarget instanceof String)) {
|
|
1041
|
-
// inline the resolved target
|
|
1042
|
-
let keys;
|
|
1043
|
-
for (keys in targetToResolve) {
|
|
1044
|
-
delete targetToResolve[keys];
|
|
1045
|
-
}
|
|
1046
|
-
Object.assign(targetToResolve, resolvedTarget);
|
|
1047
|
-
}
|
|
1048
|
-
else {
|
|
1049
|
-
// assign the resolved target
|
|
1050
|
-
targetToResolve.$target = resolvedTarget;
|
|
1051
|
-
}
|
|
1052
|
-
if (!resolvedTarget) {
|
|
1053
|
-
targetToResolve.targetString = targetStr;
|
|
1054
|
-
if (annotationsTerm && annotationType) {
|
|
1055
|
-
const oErrorMsg = {
|
|
1056
|
-
message: 'Unable to resolve the path expression: ' +
|
|
1057
|
-
targetStr +
|
|
1058
|
-
'\n' +
|
|
1059
|
-
'\n' +
|
|
1060
|
-
'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
|
|
1061
|
-
'<Annotation Term = ' +
|
|
1062
|
-
annotationsTerm +
|
|
1063
|
-
'>' +
|
|
1064
|
-
'\n' +
|
|
1065
|
-
'<Record Type = ' +
|
|
1066
|
-
annotationType +
|
|
1067
|
-
'>' +
|
|
1068
|
-
'\n' +
|
|
1069
|
-
'<AnnotationPath = ' +
|
|
1070
|
-
targetStr +
|
|
1071
|
-
'>'
|
|
1072
|
-
};
|
|
1073
|
-
addAnnotationErrorMessage(targetStr, oErrorMsg);
|
|
1074
|
-
}
|
|
1075
|
-
else {
|
|
1076
|
-
const property = targetToResolve.term;
|
|
1077
|
-
const path = targetToResolve.path;
|
|
1078
|
-
const termInfo = targetStr ? targetStr.split('/')[0] : targetStr;
|
|
1079
|
-
const oErrorMsg = {
|
|
1080
|
-
message: 'Unable to resolve the path expression: ' +
|
|
1081
|
-
targetStr +
|
|
1082
|
-
'\n' +
|
|
1083
|
-
'\n' +
|
|
1084
|
-
'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' +
|
|
1085
|
-
'<Annotation Term = ' +
|
|
1086
|
-
termInfo +
|
|
1087
|
-
'>' +
|
|
1088
|
-
'\n' +
|
|
1089
|
-
'<PropertyValue Property = ' +
|
|
1090
|
-
property +
|
|
1091
|
-
' Path= ' +
|
|
1092
|
-
path +
|
|
1093
|
-
'>'
|
|
1094
|
-
};
|
|
1095
|
-
addAnnotationErrorMessage(targetStr, oErrorMsg);
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
});
|
|
1065
|
+
function convertComplexType(converter, rawComplexType) {
|
|
1066
|
+
const convertedComplexType = rawComplexType;
|
|
1067
|
+
(0, utils_1.lazy)(convertedComplexType, 'properties', converter.convert(rawComplexType.properties, convertProperty));
|
|
1068
|
+
(0, utils_1.lazy)(convertedComplexType, 'navigationProperties', converter.convert(rawComplexType.navigationProperties, convertNavigationProperty));
|
|
1069
|
+
(0, utils_1.lazy)(convertedComplexType, 'annotations', resolveAnnotations(converter, rawComplexType));
|
|
1070
|
+
return convertedComplexType;
|
|
1099
1071
|
}
|
|
1100
1072
|
/**
|
|
1101
|
-
*
|
|
1073
|
+
* Converts a TypeDefinition.
|
|
1102
1074
|
*
|
|
1103
|
-
* @param
|
|
1104
|
-
* @
|
|
1075
|
+
* @param converter Converter
|
|
1076
|
+
* @param rawTypeDefinition Unconverted TypeDefinition
|
|
1077
|
+
* @returns The converted TypeDefinition
|
|
1105
1078
|
*/
|
|
1106
|
-
function
|
|
1107
|
-
const
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
|
|
1111
|
-
annotationList.__source = annotationSource;
|
|
1112
|
-
if (!annotationListPerTarget[currentTargetName]) {
|
|
1113
|
-
annotationListPerTarget[currentTargetName] = {
|
|
1114
|
-
annotations: annotationList.annotations.concat(),
|
|
1115
|
-
target: currentTargetName
|
|
1116
|
-
};
|
|
1117
|
-
annotationListPerTarget[currentTargetName].__source = annotationSource;
|
|
1118
|
-
}
|
|
1119
|
-
else {
|
|
1120
|
-
annotationList.annotations.forEach((annotation) => {
|
|
1121
|
-
const findIndex = annotationListPerTarget[currentTargetName].annotations.findIndex((referenceAnnotation) => {
|
|
1122
|
-
return (referenceAnnotation.term === annotation.term &&
|
|
1123
|
-
referenceAnnotation.qualifier === annotation.qualifier);
|
|
1124
|
-
});
|
|
1125
|
-
annotation.__source = annotationSource;
|
|
1126
|
-
if (findIndex !== -1) {
|
|
1127
|
-
annotationListPerTarget[currentTargetName].annotations.splice(findIndex, 1, annotation);
|
|
1128
|
-
}
|
|
1129
|
-
else {
|
|
1130
|
-
annotationListPerTarget[currentTargetName].annotations.push(annotation);
|
|
1131
|
-
}
|
|
1132
|
-
});
|
|
1133
|
-
}
|
|
1134
|
-
});
|
|
1135
|
-
});
|
|
1136
|
-
return annotationListPerTarget;
|
|
1079
|
+
function convertTypeDefinition(converter, rawTypeDefinition) {
|
|
1080
|
+
const convertedTypeDefinition = rawTypeDefinition;
|
|
1081
|
+
(0, utils_1.lazy)(convertedTypeDefinition, 'annotations', resolveAnnotations(converter, rawTypeDefinition));
|
|
1082
|
+
return convertedTypeDefinition;
|
|
1137
1083
|
}
|
|
1138
1084
|
/**
|
|
1139
1085
|
* Convert a RawMetadata into an object representation to be used to easily navigate a metadata object and its annotation.
|
|
@@ -1142,95 +1088,35 @@ function mergeAnnotations(rawMetadata) {
|
|
|
1142
1088
|
* @returns the converted representation of the metadata.
|
|
1143
1089
|
*/
|
|
1144
1090
|
function convert(rawMetadata) {
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
rawMetadata.schema.entityContainer.annotations = {};
|
|
1149
|
-
linkActionsToEntityType(rawMetadata.schema.namespace, rawMetadata.schema.actions, objectMap);
|
|
1150
|
-
linkActionImportsToActions(rawMetadata.schema.actionImports, objectMap);
|
|
1151
|
-
linkEntityTypeToEntitySet(rawMetadata.schema.entitySets, objectMap, rawMetadata.references);
|
|
1152
|
-
linkEntityTypeToSingleton(rawMetadata.schema.singletons, objectMap, rawMetadata.references);
|
|
1153
|
-
linkPropertiesToComplexTypes(rawMetadata.schema.entityTypes, objectMap);
|
|
1154
|
-
prepareComplexTypes(rawMetadata.schema.complexTypes, rawMetadata.schema.associations, objectMap);
|
|
1155
|
-
const unresolvedTargets = [];
|
|
1156
|
-
const unresolvedAnnotations = [];
|
|
1157
|
-
const annotationListPerTarget = mergeAnnotations(rawMetadata);
|
|
1158
|
-
Object.keys(annotationListPerTarget).forEach((currentTargetName) => {
|
|
1159
|
-
const annotationList = annotationListPerTarget[currentTargetName];
|
|
1160
|
-
const objectMapElement = objectMap[currentTargetName];
|
|
1161
|
-
if (!objectMapElement && (currentTargetName === null || currentTargetName === void 0 ? void 0 : currentTargetName.indexOf('@')) > 0) {
|
|
1162
|
-
unresolvedAnnotations.push(annotationList);
|
|
1163
|
-
}
|
|
1164
|
-
else if (objectMapElement) {
|
|
1165
|
-
let allTargets = [objectMapElement];
|
|
1166
|
-
let bOverrideExisting = true;
|
|
1167
|
-
if (objectMapElement._type === 'UnboundGenericAction') {
|
|
1168
|
-
allTargets = objectMapElement.actions;
|
|
1169
|
-
bOverrideExisting = false;
|
|
1170
|
-
}
|
|
1171
|
-
allTargets.forEach((currentTarget) => {
|
|
1172
|
-
const currentContext = {
|
|
1173
|
-
additionalAnnotations: unresolvedAnnotations,
|
|
1174
|
-
currentSource: annotationList.__source,
|
|
1175
|
-
currentTarget: currentTarget,
|
|
1176
|
-
currentTerm: '',
|
|
1177
|
-
rawMetadata: rawMetadata,
|
|
1178
|
-
unresolvedAnnotations: unresolvedTargets
|
|
1179
|
-
};
|
|
1180
|
-
processAnnotations(currentContext, annotationList, objectMap, bOverrideExisting);
|
|
1181
|
-
});
|
|
1182
|
-
}
|
|
1183
|
-
});
|
|
1184
|
-
const extraUnresolvedAnnotations = [];
|
|
1185
|
-
unresolvedAnnotations.forEach((annotationList) => {
|
|
1186
|
-
const currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
|
|
1187
|
-
let [baseObj, annotationPart] = currentTargetName.split('@');
|
|
1188
|
-
const targetSplit = annotationPart.split('/');
|
|
1189
|
-
baseObj = baseObj + '@' + targetSplit[0];
|
|
1190
|
-
const currentTarget = targetSplit.slice(1).reduce((currentObj, path) => {
|
|
1191
|
-
return currentObj === null || currentObj === void 0 ? void 0 : currentObj[path];
|
|
1192
|
-
}, objectMap[baseObj]);
|
|
1193
|
-
if (!currentTarget || typeof currentTarget !== 'object') {
|
|
1194
|
-
ANNOTATION_ERRORS.push({
|
|
1195
|
-
message: 'The following annotation target was not found on the service ' + currentTargetName
|
|
1196
|
-
});
|
|
1197
|
-
}
|
|
1198
|
-
else {
|
|
1199
|
-
const currentContext = {
|
|
1200
|
-
additionalAnnotations: extraUnresolvedAnnotations,
|
|
1201
|
-
currentSource: annotationList.__source,
|
|
1202
|
-
currentTarget: currentTarget,
|
|
1203
|
-
currentTerm: '',
|
|
1204
|
-
rawMetadata: rawMetadata,
|
|
1205
|
-
unresolvedAnnotations: unresolvedTargets
|
|
1206
|
-
};
|
|
1207
|
-
processAnnotations(currentContext, annotationList, objectMap, false);
|
|
1208
|
-
}
|
|
1209
|
-
});
|
|
1210
|
-
processUnresolvedTargets(unresolvedTargets, objectMap);
|
|
1211
|
-
for (const property in ALL_ANNOTATION_ERRORS) {
|
|
1212
|
-
ANNOTATION_ERRORS.push(ALL_ANNOTATION_ERRORS[property][0]);
|
|
1091
|
+
// fall back on the default references if the caller does not specify any
|
|
1092
|
+
if (rawMetadata.references.length === 0) {
|
|
1093
|
+
rawMetadata.references = utils_1.defaultReferences;
|
|
1213
1094
|
}
|
|
1214
|
-
|
|
1215
|
-
const extraReferences = rawMetadata.references.filter((reference) => {
|
|
1216
|
-
return utils_1.defaultReferences.find((defaultRef) => defaultRef.namespace === reference.namespace) === undefined;
|
|
1217
|
-
});
|
|
1095
|
+
// Converter Output
|
|
1218
1096
|
const convertedOutput = {
|
|
1219
1097
|
version: rawMetadata.version,
|
|
1220
|
-
annotations: rawMetadata.schema.annotations,
|
|
1221
1098
|
namespace: rawMetadata.schema.namespace,
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1099
|
+
annotations: rawMetadata.schema.annotations,
|
|
1100
|
+
references: utils_1.defaultReferences.concat(rawMetadata.references),
|
|
1101
|
+
diagnostics: []
|
|
1102
|
+
};
|
|
1103
|
+
// Converter
|
|
1104
|
+
const converter = new Converter(rawMetadata, convertedOutput);
|
|
1105
|
+
(0, utils_1.lazy)(convertedOutput, 'entityContainer', converter.convert(converter.rawSchema.entityContainer, convertEntityContainer));
|
|
1106
|
+
(0, utils_1.lazy)(convertedOutput, 'entitySets', converter.convert(converter.rawSchema.entitySets, convertEntitySet));
|
|
1107
|
+
(0, utils_1.lazy)(convertedOutput, 'singletons', converter.convert(converter.rawSchema.singletons, convertSingleton));
|
|
1108
|
+
(0, utils_1.lazy)(convertedOutput, 'entityTypes', converter.convert(converter.rawSchema.entityTypes, convertEntityType));
|
|
1109
|
+
(0, utils_1.lazy)(convertedOutput, 'actions', converter.convert(converter.rawSchema.actions, convertAction));
|
|
1110
|
+
(0, utils_1.lazy)(convertedOutput, 'complexTypes', converter.convert(converter.rawSchema.complexTypes, convertComplexType));
|
|
1111
|
+
(0, utils_1.lazy)(convertedOutput, 'actionImports', converter.convert(converter.rawSchema.actionImports, convertActionImport));
|
|
1112
|
+
(0, utils_1.lazy)(convertedOutput, 'typeDefinitions', converter.convert(converter.rawSchema.typeDefinitions, convertTypeDefinition));
|
|
1113
|
+
convertedOutput.resolvePath = function resolvePath(path) {
|
|
1114
|
+
const targetResolution = resolveTarget(converter, undefined, path);
|
|
1115
|
+
if (targetResolution.target) {
|
|
1116
|
+
appendObjectPath(targetResolution.objectPath, targetResolution.target);
|
|
1117
|
+
}
|
|
1118
|
+
return targetResolution;
|
|
1232
1119
|
};
|
|
1233
|
-
convertedOutput.resolvePath = createGlobalResolve(convertedOutput, objectMap);
|
|
1234
1120
|
return convertedOutput;
|
|
1235
1121
|
}
|
|
1236
1122
|
exports.convert = convert;
|
|
@@ -1238,7 +1124,7 @@ exports.convert = convert;
|
|
|
1238
1124
|
|
|
1239
1125
|
/***/ }),
|
|
1240
1126
|
|
|
1241
|
-
/***/
|
|
1127
|
+
/***/ 161:
|
|
1242
1128
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
1243
1129
|
|
|
1244
1130
|
|
|
@@ -1257,19 +1143,19 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
1257
1143
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
1258
1144
|
};
|
|
1259
1145
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1260
|
-
__exportStar(__webpack_require__(
|
|
1261
|
-
__exportStar(__webpack_require__(
|
|
1262
|
-
__exportStar(__webpack_require__(
|
|
1146
|
+
__exportStar(__webpack_require__(203), exports);
|
|
1147
|
+
__exportStar(__webpack_require__(176), exports);
|
|
1148
|
+
__exportStar(__webpack_require__(39), exports);
|
|
1263
1149
|
|
|
1264
1150
|
|
|
1265
1151
|
/***/ }),
|
|
1266
1152
|
|
|
1267
|
-
/***/
|
|
1153
|
+
/***/ 39:
|
|
1268
1154
|
/***/ (function(__unused_webpack_module, exports) {
|
|
1269
1155
|
|
|
1270
1156
|
|
|
1271
1157
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1272
|
-
exports.Decimal = exports.isComplexTypeDefinition = exports.TermToTypes = exports.unalias = exports.alias = exports.defaultReferences = void 0;
|
|
1158
|
+
exports.addGetByValue = exports.createIndexedFind = exports.lazy = exports.Decimal = exports.isComplexTypeDefinition = exports.TermToTypes = exports.EnumIsFlag = exports.unalias = exports.alias = exports.substringBeforeLast = exports.substringBeforeFirst = exports.splitAtLast = exports.splitAtFirst = exports.defaultReferences = void 0;
|
|
1273
1159
|
exports.defaultReferences = [
|
|
1274
1160
|
{ alias: 'Capabilities', namespace: 'Org.OData.Capabilities.V1', uri: '' },
|
|
1275
1161
|
{ alias: 'Aggregation', namespace: 'Org.OData.Aggregation.V1', uri: '' },
|
|
@@ -1285,6 +1171,56 @@ exports.defaultReferences = [
|
|
|
1285
1171
|
{ namespace: 'com.sap.vocabularies.Communication.v1', alias: 'Communication', uri: '' },
|
|
1286
1172
|
{ namespace: 'com.sap.vocabularies.HTML5.v1', alias: 'HTML5', uri: '' }
|
|
1287
1173
|
];
|
|
1174
|
+
function splitAt(string, index) {
|
|
1175
|
+
return index < 0 ? [string, ''] : [string.substring(0, index), string.substring(index + 1)];
|
|
1176
|
+
}
|
|
1177
|
+
function substringAt(string, index) {
|
|
1178
|
+
return index < 0 ? string : string.substring(0, index);
|
|
1179
|
+
}
|
|
1180
|
+
/**
|
|
1181
|
+
* Splits a string at the first occurrence of a separator.
|
|
1182
|
+
*
|
|
1183
|
+
* @param string The string to split
|
|
1184
|
+
* @param separator Separator, e.g. a single character.
|
|
1185
|
+
* @returns An array consisting of two elements: the part before the first occurrence of the separator and the part after it. If the string does not contain the separator, the second element is the empty string.
|
|
1186
|
+
*/
|
|
1187
|
+
function splitAtFirst(string, separator) {
|
|
1188
|
+
return splitAt(string, string.indexOf(separator));
|
|
1189
|
+
}
|
|
1190
|
+
exports.splitAtFirst = splitAtFirst;
|
|
1191
|
+
/**
|
|
1192
|
+
* Splits a string at the last occurrence of a separator.
|
|
1193
|
+
*
|
|
1194
|
+
* @param string The string to split
|
|
1195
|
+
* @param separator Separator, e.g. a single character.
|
|
1196
|
+
* @returns An array consisting of two elements: the part before the last occurrence of the separator and the part after it. If the string does not contain the separator, the second element is the empty string.
|
|
1197
|
+
*/
|
|
1198
|
+
function splitAtLast(string, separator) {
|
|
1199
|
+
return splitAt(string, string.lastIndexOf(separator));
|
|
1200
|
+
}
|
|
1201
|
+
exports.splitAtLast = splitAtLast;
|
|
1202
|
+
/**
|
|
1203
|
+
* Returns the substring before the first occurrence of a separator.
|
|
1204
|
+
*
|
|
1205
|
+
* @param string The string
|
|
1206
|
+
* @param separator Separator, e.g. a single character.
|
|
1207
|
+
* @returns The substring before the first occurrence of the separator, or the input string if it does not contain the separator.
|
|
1208
|
+
*/
|
|
1209
|
+
function substringBeforeFirst(string, separator) {
|
|
1210
|
+
return substringAt(string, string.indexOf(separator));
|
|
1211
|
+
}
|
|
1212
|
+
exports.substringBeforeFirst = substringBeforeFirst;
|
|
1213
|
+
/**
|
|
1214
|
+
* Returns the substring before the last occurrence of a separator.
|
|
1215
|
+
*
|
|
1216
|
+
* @param string The string
|
|
1217
|
+
* @param separator Separator, e.g. a single character.
|
|
1218
|
+
* @returns The substring before the last occurrence of the separator, or the input string if it does not contain the separator.
|
|
1219
|
+
*/
|
|
1220
|
+
function substringBeforeLast(string, separator) {
|
|
1221
|
+
return substringAt(string, string.lastIndexOf(separator));
|
|
1222
|
+
}
|
|
1223
|
+
exports.substringBeforeLast = substringBeforeLast;
|
|
1288
1224
|
/**
|
|
1289
1225
|
* Transform an unaliased string representation annotation to the aliased version.
|
|
1290
1226
|
*
|
|
@@ -1302,17 +1238,15 @@ function alias(references, unaliasedValue) {
|
|
|
1302
1238
|
if (!unaliasedValue) {
|
|
1303
1239
|
return unaliasedValue;
|
|
1304
1240
|
}
|
|
1305
|
-
const
|
|
1306
|
-
const namespace = unaliasedValue.substring(0, lastDotIndex);
|
|
1307
|
-
const value = unaliasedValue.substring(lastDotIndex + 1);
|
|
1241
|
+
const [namespace, value] = splitAtLast(unaliasedValue, '.');
|
|
1308
1242
|
const reference = references.reverseReferenceMap[namespace];
|
|
1309
1243
|
if (reference) {
|
|
1310
1244
|
return `${reference.alias}.${value}`;
|
|
1311
1245
|
}
|
|
1312
|
-
else if (unaliasedValue.
|
|
1246
|
+
else if (unaliasedValue.includes('@')) {
|
|
1313
1247
|
// Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
|
|
1314
|
-
const [preAlias,
|
|
1315
|
-
return `${preAlias}@${alias(references, postAlias
|
|
1248
|
+
const [preAlias, postAlias] = splitAtFirst(unaliasedValue, '@');
|
|
1249
|
+
return `${preAlias}@${alias(references, postAlias)}`;
|
|
1316
1250
|
}
|
|
1317
1251
|
else {
|
|
1318
1252
|
return unaliasedValue;
|
|
@@ -1336,21 +1270,56 @@ function unalias(references, aliasedValue) {
|
|
|
1336
1270
|
if (!aliasedValue) {
|
|
1337
1271
|
return aliasedValue;
|
|
1338
1272
|
}
|
|
1339
|
-
const [vocAlias,
|
|
1273
|
+
const [vocAlias, value] = splitAtFirst(aliasedValue, '.');
|
|
1340
1274
|
const reference = references.referenceMap[vocAlias];
|
|
1341
1275
|
if (reference) {
|
|
1342
|
-
return `${reference.namespace}.${value
|
|
1276
|
+
return `${reference.namespace}.${value}`;
|
|
1343
1277
|
}
|
|
1344
|
-
else if (aliasedValue.
|
|
1278
|
+
else if (aliasedValue.includes('@')) {
|
|
1345
1279
|
// Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
|
|
1346
|
-
const [preAlias,
|
|
1347
|
-
return `${preAlias}@${unalias(references, postAlias
|
|
1280
|
+
const [preAlias, postAlias] = splitAtFirst(aliasedValue, '@');
|
|
1281
|
+
return `${preAlias}@${unalias(references, postAlias)}`;
|
|
1348
1282
|
}
|
|
1349
1283
|
else {
|
|
1350
1284
|
return aliasedValue;
|
|
1351
1285
|
}
|
|
1352
1286
|
}
|
|
1353
1287
|
exports.unalias = unalias;
|
|
1288
|
+
exports.EnumIsFlag = {
|
|
1289
|
+
'Auth.KeyLocation': false,
|
|
1290
|
+
'Core.RevisionKind': false,
|
|
1291
|
+
'Core.DataModificationOperationKind': false,
|
|
1292
|
+
'Core.Permission': true,
|
|
1293
|
+
'Capabilities.ConformanceLevelType': false,
|
|
1294
|
+
'Capabilities.IsolationLevel': true,
|
|
1295
|
+
'Capabilities.NavigationType': false,
|
|
1296
|
+
'Capabilities.SearchExpressions': true,
|
|
1297
|
+
'Capabilities.HttpMethod': true,
|
|
1298
|
+
'Aggregation.RollupType': false,
|
|
1299
|
+
'Common.TextFormatType': false,
|
|
1300
|
+
'Common.FilterExpressionType': false,
|
|
1301
|
+
'Common.FieldControlType': false,
|
|
1302
|
+
'Common.EffectType': true,
|
|
1303
|
+
'Communication.KindType': false,
|
|
1304
|
+
'Communication.ContactInformationType': true,
|
|
1305
|
+
'Communication.PhoneType': true,
|
|
1306
|
+
'Communication.GenderType': false,
|
|
1307
|
+
'UI.VisualizationType': false,
|
|
1308
|
+
'UI.CriticalityType': false,
|
|
1309
|
+
'UI.ImprovementDirectionType': false,
|
|
1310
|
+
'UI.TrendType': false,
|
|
1311
|
+
'UI.ChartType': false,
|
|
1312
|
+
'UI.ChartAxisScaleBehaviorType': false,
|
|
1313
|
+
'UI.ChartAxisAutoScaleDataScopeType': false,
|
|
1314
|
+
'UI.ChartDimensionRoleType': false,
|
|
1315
|
+
'UI.ChartMeasureRoleType': false,
|
|
1316
|
+
'UI.SelectionRangeSignType': false,
|
|
1317
|
+
'UI.SelectionRangeOptionType': false,
|
|
1318
|
+
'UI.TextArrangementType': false,
|
|
1319
|
+
'UI.ImportanceType': false,
|
|
1320
|
+
'UI.CriticalityRepresentationType': false,
|
|
1321
|
+
'UI.OperationGroupingType': false
|
|
1322
|
+
};
|
|
1354
1323
|
var TermToTypes;
|
|
1355
1324
|
(function (TermToTypes) {
|
|
1356
1325
|
TermToTypes["Org.OData.Authorization.V1.SecuritySchemes"] = "Org.OData.Authorization.V1.SecurityScheme";
|
|
@@ -1363,6 +1332,7 @@ var TermToTypes;
|
|
|
1363
1332
|
TermToTypes["Org.OData.Core.V1.ResourceException"] = "Org.OData.Core.V1.ResourceExceptionType";
|
|
1364
1333
|
TermToTypes["Org.OData.Core.V1.DataModificationException"] = "Org.OData.Core.V1.DataModificationExceptionType";
|
|
1365
1334
|
TermToTypes["Org.OData.Core.V1.IsLanguageDependent"] = "Org.OData.Core.V1.Tag";
|
|
1335
|
+
TermToTypes["Org.OData.Core.V1.AppliesViaContainer"] = "Org.OData.Core.V1.Tag";
|
|
1366
1336
|
TermToTypes["Org.OData.Core.V1.DereferenceableIDs"] = "Org.OData.Core.V1.Tag";
|
|
1367
1337
|
TermToTypes["Org.OData.Core.V1.ConventionalIDs"] = "Org.OData.Core.V1.Tag";
|
|
1368
1338
|
TermToTypes["Org.OData.Core.V1.Permissions"] = "Org.OData.Core.V1.Permission";
|
|
@@ -1384,6 +1354,7 @@ var TermToTypes;
|
|
|
1384
1354
|
TermToTypes["Org.OData.Core.V1.OptionalParameter"] = "Org.OData.Core.V1.OptionalParameterType";
|
|
1385
1355
|
TermToTypes["Org.OData.Core.V1.OperationAvailable"] = "Edm.Boolean";
|
|
1386
1356
|
TermToTypes["Org.OData.Core.V1.SymbolicName"] = "Org.OData.Core.V1.SimpleIdentifier";
|
|
1357
|
+
TermToTypes["Org.OData.Core.V1.GeometryFeature"] = "Org.OData.Core.V1.GeometryFeatureType";
|
|
1387
1358
|
TermToTypes["Org.OData.Capabilities.V1.ConformanceLevel"] = "Org.OData.Capabilities.V1.ConformanceLevelType";
|
|
1388
1359
|
TermToTypes["Org.OData.Capabilities.V1.AsynchronousRequestsSupported"] = "Org.OData.Core.V1.Tag";
|
|
1389
1360
|
TermToTypes["Org.OData.Capabilities.V1.BatchContinueOnErrorSupported"] = "Org.OData.Core.V1.Tag";
|
|
@@ -1420,6 +1391,7 @@ var TermToTypes;
|
|
|
1420
1391
|
TermToTypes["Org.OData.Capabilities.V1.CustomQueryOptions"] = "Org.OData.Capabilities.V1.CustomParameter";
|
|
1421
1392
|
TermToTypes["Org.OData.Capabilities.V1.MediaLocationUpdateSupported"] = "Org.OData.Core.V1.Tag";
|
|
1422
1393
|
TermToTypes["Org.OData.Aggregation.V1.ApplySupported"] = "Org.OData.Aggregation.V1.ApplySupportedType";
|
|
1394
|
+
TermToTypes["Org.OData.Aggregation.V1.ApplySupportedDefaults"] = "Org.OData.Aggregation.V1.ApplySupportedBase";
|
|
1423
1395
|
TermToTypes["Org.OData.Aggregation.V1.Groupable"] = "Org.OData.Core.V1.Tag";
|
|
1424
1396
|
TermToTypes["Org.OData.Aggregation.V1.Aggregatable"] = "Org.OData.Core.V1.Tag";
|
|
1425
1397
|
TermToTypes["Org.OData.Aggregation.V1.ContextDefiningProperties"] = "Edm.PropertyPath";
|
|
@@ -1433,8 +1405,8 @@ var TermToTypes;
|
|
|
1433
1405
|
TermToTypes["Org.OData.Validation.V1.MultipleOf"] = "Edm.Decimal";
|
|
1434
1406
|
TermToTypes["Org.OData.Validation.V1.Constraint"] = "Org.OData.Validation.V1.ConstraintType";
|
|
1435
1407
|
TermToTypes["Org.OData.Validation.V1.ItemsOf"] = "Org.OData.Validation.V1.ItemsOfType";
|
|
1436
|
-
TermToTypes["Org.OData.Validation.V1.OpenPropertyTypeConstraint"] = "Org.OData.
|
|
1437
|
-
TermToTypes["Org.OData.Validation.V1.DerivedTypeConstraint"] = "Org.OData.
|
|
1408
|
+
TermToTypes["Org.OData.Validation.V1.OpenPropertyTypeConstraint"] = "Org.OData.Validation.V1.SingleOrCollectionType";
|
|
1409
|
+
TermToTypes["Org.OData.Validation.V1.DerivedTypeConstraint"] = "Org.OData.Validation.V1.SingleOrCollectionType";
|
|
1438
1410
|
TermToTypes["Org.OData.Validation.V1.AllowedTerms"] = "Org.OData.Core.V1.QualifiedTermName";
|
|
1439
1411
|
TermToTypes["Org.OData.Validation.V1.ApplicableTerms"] = "Org.OData.Core.V1.QualifiedTermName";
|
|
1440
1412
|
TermToTypes["Org.OData.Validation.V1.MaxItems"] = "Edm.Int64";
|
|
@@ -1447,6 +1419,8 @@ var TermToTypes;
|
|
|
1447
1419
|
TermToTypes["com.sap.vocabularies.Analytics.v1.RolledUpPropertyCount"] = "Edm.Int16";
|
|
1448
1420
|
TermToTypes["com.sap.vocabularies.Analytics.v1.PlanningAction"] = "Org.OData.Core.V1.Tag";
|
|
1449
1421
|
TermToTypes["com.sap.vocabularies.Analytics.v1.AggregatedProperties"] = "com.sap.vocabularies.Analytics.v1.AggregatedPropertyType";
|
|
1422
|
+
TermToTypes["com.sap.vocabularies.Analytics.v1.AggregatedProperty"] = "com.sap.vocabularies.Analytics.v1.AggregatedPropertyType";
|
|
1423
|
+
TermToTypes["com.sap.vocabularies.Analytics.v1.AnalyticalContext"] = "com.sap.vocabularies.Analytics.v1.AnalyticalContextType";
|
|
1450
1424
|
TermToTypes["com.sap.vocabularies.Common.v1.ServiceVersion"] = "Edm.Int32";
|
|
1451
1425
|
TermToTypes["com.sap.vocabularies.Common.v1.ServiceSchemaVersion"] = "Edm.Int32";
|
|
1452
1426
|
TermToTypes["com.sap.vocabularies.Common.v1.TextFor"] = "Edm.PropertyPath";
|
|
@@ -1464,7 +1438,7 @@ var TermToTypes;
|
|
|
1464
1438
|
TermToTypes["com.sap.vocabularies.Common.v1.AssociationEntity"] = "Edm.NavigationPropertyPath";
|
|
1465
1439
|
TermToTypes["com.sap.vocabularies.Common.v1.DerivedNavigation"] = "Edm.NavigationPropertyPath";
|
|
1466
1440
|
TermToTypes["com.sap.vocabularies.Common.v1.Masked"] = "Org.OData.Core.V1.Tag";
|
|
1467
|
-
TermToTypes["com.sap.vocabularies.Common.v1.
|
|
1441
|
+
TermToTypes["com.sap.vocabularies.Common.v1.RevealOnDemand"] = "Edm.Boolean";
|
|
1468
1442
|
TermToTypes["com.sap.vocabularies.Common.v1.SemanticObjectMapping"] = "com.sap.vocabularies.Common.v1.SemanticObjectMappingType";
|
|
1469
1443
|
TermToTypes["com.sap.vocabularies.Common.v1.IsInstanceAnnotation"] = "Org.OData.Core.V1.Tag";
|
|
1470
1444
|
TermToTypes["com.sap.vocabularies.Common.v1.FilterExpressionRestrictions"] = "com.sap.vocabularies.Common.v1.FilterExpressionRestrictionType";
|
|
@@ -1480,10 +1454,11 @@ var TermToTypes;
|
|
|
1480
1454
|
TermToTypes["com.sap.vocabularies.Common.v1.RelatedRecursiveHierarchy"] = "Edm.AnnotationPath";
|
|
1481
1455
|
TermToTypes["com.sap.vocabularies.Common.v1.Interval"] = "com.sap.vocabularies.Common.v1.IntervalType";
|
|
1482
1456
|
TermToTypes["com.sap.vocabularies.Common.v1.ResultContext"] = "Org.OData.Core.V1.Tag";
|
|
1483
|
-
TermToTypes["com.sap.vocabularies.Common.v1.
|
|
1457
|
+
TermToTypes["com.sap.vocabularies.Common.v1.SAPObjectNodeType"] = "com.sap.vocabularies.Common.v1.SAPObjectNodeTypeType";
|
|
1458
|
+
TermToTypes["com.sap.vocabularies.Common.v1.Composition"] = "Org.OData.Core.V1.Tag";
|
|
1484
1459
|
TermToTypes["com.sap.vocabularies.Common.v1.IsNaturalPerson"] = "Org.OData.Core.V1.Tag";
|
|
1485
1460
|
TermToTypes["com.sap.vocabularies.Common.v1.ValueList"] = "com.sap.vocabularies.Common.v1.ValueListType";
|
|
1486
|
-
TermToTypes["com.sap.vocabularies.Common.v1.ValueListRelevantQualifiers"] = "
|
|
1461
|
+
TermToTypes["com.sap.vocabularies.Common.v1.ValueListRelevantQualifiers"] = "Org.OData.Core.V1.SimpleIdentifier";
|
|
1487
1462
|
TermToTypes["com.sap.vocabularies.Common.v1.ValueListWithFixedValues"] = "Org.OData.Core.V1.Tag";
|
|
1488
1463
|
TermToTypes["com.sap.vocabularies.Common.v1.ValueListMapping"] = "com.sap.vocabularies.Common.v1.ValueListMappingType";
|
|
1489
1464
|
TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYear"] = "Org.OData.Core.V1.Tag";
|
|
@@ -1510,7 +1485,7 @@ var TermToTypes;
|
|
|
1510
1485
|
TermToTypes["com.sap.vocabularies.Common.v1.MutuallyExclusiveTerm"] = "Org.OData.Core.V1.Tag";
|
|
1511
1486
|
TermToTypes["com.sap.vocabularies.Common.v1.DraftRoot"] = "com.sap.vocabularies.Common.v1.DraftRootType";
|
|
1512
1487
|
TermToTypes["com.sap.vocabularies.Common.v1.DraftNode"] = "com.sap.vocabularies.Common.v1.DraftNodeType";
|
|
1513
|
-
TermToTypes["com.sap.vocabularies.Common.v1.DraftActivationVia"] = "
|
|
1488
|
+
TermToTypes["com.sap.vocabularies.Common.v1.DraftActivationVia"] = "Org.OData.Core.V1.SimpleIdentifier";
|
|
1514
1489
|
TermToTypes["com.sap.vocabularies.Common.v1.EditableFieldFor"] = "Edm.PropertyPath";
|
|
1515
1490
|
TermToTypes["com.sap.vocabularies.Common.v1.SemanticKey"] = "Edm.PropertyPath";
|
|
1516
1491
|
TermToTypes["com.sap.vocabularies.Common.v1.SideEffects"] = "com.sap.vocabularies.Common.v1.SideEffectsType";
|
|
@@ -1524,6 +1499,7 @@ var TermToTypes;
|
|
|
1524
1499
|
TermToTypes["com.sap.vocabularies.Common.v1.ChangedAt"] = "Edm.DateTimeOffset";
|
|
1525
1500
|
TermToTypes["com.sap.vocabularies.Common.v1.ChangedBy"] = "com.sap.vocabularies.Common.v1.UserID";
|
|
1526
1501
|
TermToTypes["com.sap.vocabularies.Common.v1.ApplyMultiUnitBehaviorForSortingAndFiltering"] = "Org.OData.Core.V1.Tag";
|
|
1502
|
+
TermToTypes["com.sap.vocabularies.Common.v1.PrimitivePropertyPath"] = "Org.OData.Core.V1.Tag";
|
|
1527
1503
|
TermToTypes["com.sap.vocabularies.CodeList.v1.CurrencyCodes"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
|
|
1528
1504
|
TermToTypes["com.sap.vocabularies.CodeList.v1.UnitsOfMeasure"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
|
|
1529
1505
|
TermToTypes["com.sap.vocabularies.CodeList.v1.StandardCode"] = "Edm.PropertyPath";
|
|
@@ -1578,10 +1554,12 @@ var TermToTypes;
|
|
|
1578
1554
|
TermToTypes["com.sap.vocabularies.UI.v1.TextArrangement"] = "com.sap.vocabularies.UI.v1.TextArrangementType";
|
|
1579
1555
|
TermToTypes["com.sap.vocabularies.UI.v1.Importance"] = "com.sap.vocabularies.UI.v1.ImportanceType";
|
|
1580
1556
|
TermToTypes["com.sap.vocabularies.UI.v1.Hidden"] = "Org.OData.Core.V1.Tag";
|
|
1557
|
+
TermToTypes["com.sap.vocabularies.UI.v1.IsCopyAction"] = "Org.OData.Core.V1.Tag";
|
|
1581
1558
|
TermToTypes["com.sap.vocabularies.UI.v1.CreateHidden"] = "Org.OData.Core.V1.Tag";
|
|
1582
1559
|
TermToTypes["com.sap.vocabularies.UI.v1.UpdateHidden"] = "Org.OData.Core.V1.Tag";
|
|
1583
1560
|
TermToTypes["com.sap.vocabularies.UI.v1.DeleteHidden"] = "Org.OData.Core.V1.Tag";
|
|
1584
1561
|
TermToTypes["com.sap.vocabularies.UI.v1.HiddenFilter"] = "Org.OData.Core.V1.Tag";
|
|
1562
|
+
TermToTypes["com.sap.vocabularies.UI.v1.AdaptationHidden"] = "Org.OData.Core.V1.Tag";
|
|
1585
1563
|
TermToTypes["com.sap.vocabularies.UI.v1.DataFieldDefault"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
|
|
1586
1564
|
TermToTypes["com.sap.vocabularies.UI.v1.Criticality"] = "com.sap.vocabularies.UI.v1.CriticalityType";
|
|
1587
1565
|
TermToTypes["com.sap.vocabularies.UI.v1.CriticalityCalculation"] = "com.sap.vocabularies.UI.v1.CriticalityCalculationType";
|
|
@@ -1591,10 +1569,12 @@ var TermToTypes;
|
|
|
1591
1569
|
TermToTypes["com.sap.vocabularies.UI.v1.RecommendationState"] = "com.sap.vocabularies.UI.v1.RecommendationStateType";
|
|
1592
1570
|
TermToTypes["com.sap.vocabularies.UI.v1.RecommendationList"] = "com.sap.vocabularies.UI.v1.RecommendationListType";
|
|
1593
1571
|
TermToTypes["com.sap.vocabularies.UI.v1.ExcludeFromNavigationContext"] = "Org.OData.Core.V1.Tag";
|
|
1572
|
+
TermToTypes["com.sap.vocabularies.UI.v1.DoNotCheckScaleOfMeasuredQuantity"] = "Edm.Boolean";
|
|
1594
1573
|
TermToTypes["com.sap.vocabularies.HTML5.v1.CssDefaults"] = "com.sap.vocabularies.HTML5.v1.CssDefaultsType";
|
|
1595
1574
|
})(TermToTypes = exports.TermToTypes || (exports.TermToTypes = {}));
|
|
1596
1575
|
/**
|
|
1597
1576
|
* Differentiate between a ComplexType and a TypeDefinition.
|
|
1577
|
+
*
|
|
1598
1578
|
* @param complexTypeDefinition
|
|
1599
1579
|
* @returns true if the value is a complex type
|
|
1600
1580
|
*/
|
|
@@ -1616,17 +1596,89 @@ function Decimal(value) {
|
|
|
1616
1596
|
};
|
|
1617
1597
|
}
|
|
1618
1598
|
exports.Decimal = Decimal;
|
|
1599
|
+
/**
|
|
1600
|
+
* Defines a lazy property.
|
|
1601
|
+
*
|
|
1602
|
+
* The property is initialized by calling the init function on the first read access, or by directly assigning a value.
|
|
1603
|
+
*
|
|
1604
|
+
* @param object The host object
|
|
1605
|
+
* @param property The lazy property to add
|
|
1606
|
+
* @param init The function that initializes the property's value
|
|
1607
|
+
*/
|
|
1608
|
+
function lazy(object, property, init) {
|
|
1609
|
+
const initial = Symbol('initial');
|
|
1610
|
+
let _value = initial;
|
|
1611
|
+
Object.defineProperty(object, property, {
|
|
1612
|
+
enumerable: true,
|
|
1613
|
+
get() {
|
|
1614
|
+
if (_value === initial) {
|
|
1615
|
+
_value = init();
|
|
1616
|
+
}
|
|
1617
|
+
return _value;
|
|
1618
|
+
},
|
|
1619
|
+
set(value) {
|
|
1620
|
+
_value = value;
|
|
1621
|
+
}
|
|
1622
|
+
});
|
|
1623
|
+
}
|
|
1624
|
+
exports.lazy = lazy;
|
|
1625
|
+
/**
|
|
1626
|
+
* Creates a function that allows to find an array element by property value.
|
|
1627
|
+
*
|
|
1628
|
+
* @param array The array
|
|
1629
|
+
* @param property Elements in the array are searched by this property
|
|
1630
|
+
* @returns A function that can be used to find an element of the array by property value.
|
|
1631
|
+
*/
|
|
1632
|
+
function createIndexedFind(array, property) {
|
|
1633
|
+
const index = new Map();
|
|
1634
|
+
return function find(value) {
|
|
1635
|
+
const element = index.get(value);
|
|
1636
|
+
if ((element === null || element === void 0 ? void 0 : element[property]) === value) {
|
|
1637
|
+
return element;
|
|
1638
|
+
}
|
|
1639
|
+
return array.find((element) => {
|
|
1640
|
+
if (!(element === null || element === void 0 ? void 0 : element.hasOwnProperty(property))) {
|
|
1641
|
+
return false;
|
|
1642
|
+
}
|
|
1643
|
+
const propertyValue = element[property];
|
|
1644
|
+
index.set(propertyValue, element);
|
|
1645
|
+
return propertyValue === value;
|
|
1646
|
+
});
|
|
1647
|
+
};
|
|
1648
|
+
}
|
|
1649
|
+
exports.createIndexedFind = createIndexedFind;
|
|
1650
|
+
/**
|
|
1651
|
+
* Adds a 'get by value' function to an array.
|
|
1652
|
+
*
|
|
1653
|
+
* If this function is called with addIndex(myArray, 'name'), a new function 'by_name(value)' will be added that allows to
|
|
1654
|
+
* find a member of the array by the value of its 'name' property.
|
|
1655
|
+
*
|
|
1656
|
+
* @param array The array
|
|
1657
|
+
* @param property The property that will be used by the 'by_{property}()' function
|
|
1658
|
+
* @returns The array with the added function
|
|
1659
|
+
*/
|
|
1660
|
+
function addGetByValue(array, property) {
|
|
1661
|
+
const indexName = `by_${property}`;
|
|
1662
|
+
if (!array.hasOwnProperty(indexName)) {
|
|
1663
|
+
Object.defineProperty(array, indexName, { writable: false, value: createIndexedFind(array, property) });
|
|
1664
|
+
}
|
|
1665
|
+
else {
|
|
1666
|
+
throw new Error(`Property '${indexName}' already exists`);
|
|
1667
|
+
}
|
|
1668
|
+
return array;
|
|
1669
|
+
}
|
|
1670
|
+
exports.addGetByValue = addGetByValue;
|
|
1619
1671
|
|
|
1620
1672
|
|
|
1621
1673
|
/***/ }),
|
|
1622
1674
|
|
|
1623
|
-
/***/
|
|
1675
|
+
/***/ 176:
|
|
1624
1676
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
1625
1677
|
|
|
1626
1678
|
|
|
1627
1679
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1628
1680
|
exports.revertTermToGenericType = void 0;
|
|
1629
|
-
const utils_1 = __webpack_require__(
|
|
1681
|
+
const utils_1 = __webpack_require__(39);
|
|
1630
1682
|
/**
|
|
1631
1683
|
* Revert an object to its raw type equivalent.
|
|
1632
1684
|
*
|
|
@@ -1938,11 +1990,12 @@ exports.revertTermToGenericType = revertTermToGenericType;
|
|
|
1938
1990
|
/******/ // startup
|
|
1939
1991
|
/******/ // Load entry module and return exports
|
|
1940
1992
|
/******/ // This entry module is referenced by other modules so it can't be inlined
|
|
1941
|
-
/******/ var __webpack_exports__ = __webpack_require__(
|
|
1993
|
+
/******/ var __webpack_exports__ = __webpack_require__(161);
|
|
1942
1994
|
/******/ AnnotationConverter = __webpack_exports__;
|
|
1943
1995
|
/******/
|
|
1944
1996
|
/******/ })()
|
|
1945
1997
|
;
|
|
1946
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7VUV0QkE7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ac2FwLXV4K2Fubm90YXRpb24tY29udmVydGVyQDAuNS4yMi9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvY29udmVydGVyLnRzIiwid2VicGFjazovL0Fubm90YXRpb25Db252ZXJ0ZXIvLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BzYXAtdXgrYW5ub3RhdGlvbi1jb252ZXJ0ZXJAMC41LjIyL25vZGVfbW9kdWxlcy9Ac2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ac2FwLXV4K2Fubm90YXRpb24tY29udmVydGVyQDAuNS4yMi9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjUuMjIvbm9kZV9tb2R1bGVzL0BzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXIvc3JjL3dyaXRlYmFjay50cyIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Fubm90YXRpb25Db252ZXJ0ZXIvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gICAgQW5ub3RhdGlvbkxpc3QsXG4gICAgQW5ub3RhdGlvblJlY29yZCxcbiAgICBFeHByZXNzaW9uLFxuICAgIFBhdGhFeHByZXNzaW9uLFxuICAgIFByb3BlcnR5VmFsdWUsXG4gICAgUmF3TWV0YWRhdGEsXG4gICAgUmVmZXJlbmNlLFxuICAgIENvbXBsZXhUeXBlLFxuICAgIFR5cGVEZWZpbml0aW9uLFxuICAgIFJhd1Byb3BlcnR5LFxuICAgIEFubm90YXRpb24sXG4gICAgQWN0aW9uLFxuICAgIEVudGl0eVR5cGUsXG4gICAgUmF3RW50aXR5VHlwZSxcbiAgICBSYXdBc3NvY2lhdGlvbixcbiAgICBOYXZpZ2F0aW9uUHJvcGVydHksXG4gICAgQmFzZU5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSYXdWMk5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBFbnRpdHlTZXQsXG4gICAgUHJvcGVydHksXG4gICAgU2luZ2xldG9uLFxuICAgIFJhd0NvbXBsZXhUeXBlLFxuICAgIENvbnZlcnRlZE1ldGFkYXRhLFxuICAgIFJlc29sdXRpb25UYXJnZXQsXG4gICAgRW50aXR5Q29udGFpbmVyLFxuICAgIFJhd0Fubm90YXRpb24sXG4gICAgQWN0aW9uSW1wb3J0XG59IGZyb20gJ0BzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVmZXJlbmNlc1dpdGhNYXAgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGFsaWFzLCBEZWNpbWFsLCBkZWZhdWx0UmVmZXJlbmNlcywgaXNDb21wbGV4VHlwZURlZmluaXRpb24sIFRlcm1Ub1R5cGVzLCB1bmFsaWFzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICpcbiAqL1xuY2xhc3MgUGF0aCB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgICR0YXJnZXQ6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgYW5ub3RhdGlvbnNUZXJtOiBzdHJpbmc7XG4gICAgYW5ub3RhdGlvblR5cGU6IHN0cmluZztcbiAgICB0ZXJtOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcGF0aEV4cHJlc3Npb25cbiAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZVxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uc1Rlcm1cbiAgICAgKiBAcGFyYW0gdGVybVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhdGhFeHByZXNzaW9uOiBQYXRoRXhwcmVzc2lvbiwgdGFyZ2V0TmFtZTogc3RyaW5nLCBhbm5vdGF0aW9uc1Rlcm06IHN0cmluZywgdGVybTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGhFeHByZXNzaW9uLlBhdGg7XG4gICAgICAgIHRoaXMudHlwZSA9ICdQYXRoJztcbiAgICAgICAgdGhpcy4kdGFyZ2V0ID0gdGFyZ2V0TmFtZTtcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uc1Rlcm0gPSBhbm5vdGF0aW9uc1Rlcm07XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBNYXAgYmFzZWQgb24gdGhlIGZ1bGx5UXVhbGlmaWVkTmFtZSBvZiBlYWNoIG9iamVjdCBwYXJ0IG9mIHRoZSBtZXRhZGF0YS5cbiAqXG4gKiBAcGFyYW0gcmF3TWV0YWRhdGEgdGhlIHJhd01ldGFkYXRhIHdlJ3JlIHdvcmtpbmcgYWdhaW5zdFxuICogQHJldHVybnMgdGhlIG9iamVjdG1hcCBmb3IgZWFzeSBhY2Nlc3MgdG8gdGhlIGRpZmZlcmVudCBvYmplY3Qgb2YgdGhlIG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkT2JqZWN0TWFwKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IG9iamVjdE1hcDogYW55ID0ge307XG4gICAgaWYgKHJhd01ldGFkYXRhLnNjaGVtYS5lbnRpdHlDb250YWluZXI/LmZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICBvYmplY3RNYXBbcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lci5mdWxseVF1YWxpZmllZE5hbWVdID0gcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lcjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRpdHlTZXQgb2YgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHMpIHtcbiAgICAgICAgb2JqZWN0TWFwW2VudGl0eVNldC5mdWxseVF1YWxpZmllZE5hbWVdID0gZW50aXR5U2V0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNpbmdsZXRvbiBvZiByYXdNZXRhZGF0YS5zY2hlbWEuc2luZ2xldG9ucykge1xuICAgICAgICBvYmplY3RNYXBbc2luZ2xldG9uLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBzaW5nbGV0b247XG4gICAgfVxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHJhd01ldGFkYXRhLnNjaGVtYS5hY3Rpb25zKSB7XG4gICAgICAgIG9iamVjdE1hcFthY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lXSA9IGFjdGlvbjtcbiAgICAgICAgaWYgKGFjdGlvbi5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjb25zdCB1bkJvdW5kQWN0aW9uTmFtZSA9IGFjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJygnKVswXTtcbiAgICAgICAgICAgIGlmICghb2JqZWN0TWFwW3VuQm91bmRBY3Rpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgIG9iamVjdE1hcFt1bkJvdW5kQWN0aW9uTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIF90eXBlOiAnVW5ib3VuZEdlbmVyaWNBY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmplY3RNYXBbdW5Cb3VuZEFjdGlvbk5hbWVdLmFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uU3BsaXQgPSBhY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KCcoJyk7XG4gICAgICAgICAgICBvYmplY3RNYXBbYCR7YWN0aW9uU3BsaXRbMV0uc3BsaXQoJyknKVswXX0vJHthY3Rpb25TcGxpdFswXX1gXSA9IGFjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGFjdGlvbi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBvYmplY3RNYXBbcGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBwYXJhbWV0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBhY3Rpb25JbXBvcnQgb2YgcmF3TWV0YWRhdGEuc2NoZW1hLmFjdGlvbkltcG9ydHMpIHtcbiAgICAgICAgb2JqZWN0TWFwW2FjdGlvbkltcG9ydC5mdWxseVF1YWxpZmllZE5hbWVdID0gYWN0aW9uSW1wb3J0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbXBsZXhUeXBlIG9mIHJhd01ldGFkYXRhLnNjaGVtYS5jb21wbGV4VHlwZXMpIHtcbiAgICAgICAgb2JqZWN0TWFwW2NvbXBsZXhUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBjb21wbGV4VHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBjb21wbGV4VHlwZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBvYmplY3RNYXBbcHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHByb3BlcnR5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZURlZmluaXRpb24gb2YgcmF3TWV0YWRhdGEuc2NoZW1hLnR5cGVEZWZpbml0aW9ucykge1xuICAgICAgICBvYmplY3RNYXBbdHlwZURlZmluaXRpb24uZnVsbHlRdWFsaWZpZWROYW1lXSA9IHR5cGVEZWZpbml0aW9uO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudGl0eVR5cGUgb2YgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzKSB7XG4gICAgICAgIChlbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUpLmFubm90YXRpb25zID0ge307IC8vICdhbm5vdGF0aW9ucycgcHJvcGVydHkgaXMgbWFuZGF0b3J5XG4gICAgICAgIG9iamVjdE1hcFtlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBlbnRpdHlUeXBlO1xuICAgICAgICBvYmplY3RNYXBbYENvbGxlY3Rpb24oJHtlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZX0pYF0gPSBlbnRpdHlUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcykge1xuICAgICAgICAgICAgb2JqZWN0TWFwW3Byb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBwcm9wZXJ0eTtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBjb21wbGV4IHR5cGVzXG4gICAgICAgICAgICBjb25zdCBjb21wbGV4VHlwZURlZmluaXRpb24gPSBvYmplY3RNYXBbcHJvcGVydHkudHlwZV0gYXMgQ29tcGxleFR5cGUgfCBUeXBlRGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGlmIChpc0NvbXBsZXhUeXBlRGVmaW5pdGlvbihjb21wbGV4VHlwZURlZmluaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21wbGV4VHlwZVByb3Agb2YgY29tcGxleFR5cGVEZWZpbml0aW9uLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxleFR5cGVQcm9wVGFyZ2V0OiBSYXdQcm9wZXJ0eSA9IE9iamVjdC5hc3NpZ24oY29tcGxleFR5cGVQcm9wLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ1Byb3BlcnR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogcHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lICsgJy8nICsgY29tcGxleFR5cGVQcm9wLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcFtjb21wbGV4VHlwZVByb3BUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSA9IGNvbXBsZXhUeXBlUHJvcFRhcmdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBuYXZQcm9wZXJ0eSBvZiBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBvYmplY3RNYXBbbmF2UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXSA9IG5hdlByb3BlcnR5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhbm5vdGF0aW9uU291cmNlIG9mIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykpIHtcbiAgICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uTGlzdCBvZiByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXROYW1lID0gdW5hbGlhcyhyYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCBhbm5vdGF0aW9uTGlzdC50YXJnZXQpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBhbm5vdGF0aW9uRlFOID0gYCR7Y3VycmVudFRhcmdldE5hbWV9QCR7dW5hbGlhcyhyYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCBhbm5vdGF0aW9uLnRlcm0pfWA7XG4gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhbGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25GUU4gKz0gYCMke2Fubm90YXRpb24ucXVhbGlmaWVyfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdE1hcFthbm5vdGF0aW9uRlFOXSA9IGFubm90YXRpb247XG4gICAgICAgICAgICAgICAgKGFubm90YXRpb24gYXMgQW5ub3RhdGlvbikuZnVsbHlRdWFsaWZpZWROYW1lID0gYW5ub3RhdGlvbkZRTjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RNYXA7XG59XG5cbi8qKlxuICogQ29tYmluZSB0d28gc3RyaW5ncyByZXByZXNlbnRpbmcgcGF0aCBpbiB0aGUgbWV0YW1vZGVsIHdoaWxlIGVuc3VyaW5nIHRoZWlyIHNwZWNpZmljaXRpZXMgKGFubm90YXRpb24uLi4pIGFyZSByZXNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIGN1cnJlbnRUYXJnZXQgdGhlIGN1cnJlbnQgcGF0aFxuICogQHBhcmFtIHBhdGggdGhlIHBhcnQgd2Ugd2FudCB0byBhcHBlbmRcbiAqIEByZXR1cm5zIHRoZSBjb21wbGV0ZSBwYXRoIGluY2x1ZGluZyB0aGUgZXh0ZW5zaW9uLlxuICovXG5mdW5jdGlvbiBjb21iaW5lUGF0aChjdXJyZW50VGFyZ2V0OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50VGFyZ2V0ICsgdW5hbGlhcyhkZWZhdWx0UmVmZXJlbmNlcywgcGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQgKyAnLycgKyBwYXRoO1xuICAgIH1cbn1cblxuY29uc3QgQUxMX0FOTk9UQVRJT05fRVJST1JTOiBhbnkgPSB7fTtcbmxldCBBTk5PVEFUSU9OX0VSUk9SUzogeyBtZXNzYWdlOiBzdHJpbmcgfVtdID0gW107XG5cbi8qKlxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBvRXJyb3JNc2dcbiAqL1xuZnVuY3Rpb24gYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShwYXRoOiBzdHJpbmcsIG9FcnJvck1zZzogYW55KSB7XG4gICAgaWYgKCFBTExfQU5OT1RBVElPTl9FUlJPUlNbcGF0aF0pIHtcbiAgICAgICAgQUxMX0FOTk9UQVRJT05fRVJST1JTW3BhdGhdID0gW29FcnJvck1zZ107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgQUxMX0FOTk9UQVRJT05fRVJST1JTW3BhdGhdLnB1c2gob0Vycm9yTXNnKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzcGVjaWZpYyBwYXRoIGJhc2VkIG9uIHRoZSBvYmplY3RNYXAuXG4gKlxuICogQHBhcmFtIG9iamVjdE1hcFxuICogQHBhcmFtIGN1cnJlbnRUYXJnZXRcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcGFyYW0gcGF0aE9ubHlcbiAqIEBwYXJhbSBpbmNsdWRlVmlzaXRlZE9iamVjdHNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uc1Rlcm1cbiAqIEByZXR1cm5zIHRoZSByZXNvbHZlZCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX3Jlc29sdmVUYXJnZXQoXG4gICAgb2JqZWN0TWFwOiBhbnksXG4gICAgY3VycmVudFRhcmdldDogYW55LFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBwYXRoT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVWaXNpdGVkT2JqZWN0czogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFubm90YXRpb25zVGVybT86IHN0cmluZ1xuKSB7XG4gICAgbGV0IG9FcnJvck1zZztcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgYVZpc2l0ZWRPYmplY3RzOiBhbnlbXSA9IFtdO1xuICAgIGlmIChjdXJyZW50VGFyZ2V0ICYmIGN1cnJlbnRUYXJnZXQuX3R5cGUgPT09ICdQcm9wZXJ0eScpIHtcbiAgICAgICAgY3VycmVudFRhcmdldCA9IG9iamVjdE1hcFtjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdCgnLycpWzBdXTtcbiAgICB9XG4gICAgcGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBwYXRoKTtcblxuICAgIGNvbnN0IHBhdGhTcGxpdCA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICBjb25zdCB0YXJnZXRQYXRoU3BsaXQ6IHN0cmluZ1tdID0gW107XG4gICAgcGF0aFNwbGl0LmZvckVhY2goKHBhdGhQYXJ0KSA9PiB7XG4gICAgICAgIC8vIFNlcGFyYXRlIG91dCB0aGUgYW5ub3RhdGlvblxuICAgICAgICBpZiAocGF0aFBhcnQuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgW3NwbGl0dGVkUGF0aCwgYW5ub3RhdGlvblBhdGhdID0gcGF0aFBhcnQuc3BsaXQoJ0AnKTtcbiAgICAgICAgICAgIHRhcmdldFBhdGhTcGxpdC5wdXNoKHNwbGl0dGVkUGF0aCk7XG4gICAgICAgICAgICB0YXJnZXRQYXRoU3BsaXQucHVzaChgQCR7YW5ub3RhdGlvblBhdGh9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoU3BsaXQucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgY3VycmVudFBhdGggPSBwYXRoO1xuICAgIGxldCBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRUYXJnZXQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0UGF0aFNwbGl0LnJlZHVjZSgoY3VycmVudFZhbHVlOiBhbnksIHBhdGhQYXJ0KSA9PiB7XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gJyRUeXBlJyAmJiBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdFbnRpdHlUeXBlJykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09ICckJyAmJiBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdFbnRpdHlTZXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGF0aFBhcnQgPT09ICdAJHVpNS5vdmVybG9hZCcgfHwgcGF0aFBhcnQgPT09ICcwJykgJiYgY3VycmVudFZhbHVlLl90eXBlID09PSAnQWN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBFbXB0eSBQYXRoIGFmdGVyIGFuIGVudGl0eVNldCBtZWFucyBlbnRpdHlUeXBlXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlICYmXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ0VudGl0eVNldCcgfHwgY3VycmVudFZhbHVlLl90eXBlID09PSAnU2luZ2xldG9uJykgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUuZW50aXR5VHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVWaXNpdGVkT2JqZWN0cykge1xuICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuZW50aXR5VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLl90eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5JyAmJiBjdXJyZW50VmFsdWUudGFyZ2V0VHlwZSkge1xuICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYVZpc2l0ZWRPYmplY3RzLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnRhcmdldFR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMgJiYgY3VycmVudFZhbHVlICE9PSBudWxsICYmIGN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IHBhdGhQYXJ0O1xuICAgICAgICB9IGVsc2UgaWYgKChjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdFbnRpdHlTZXQnIHx8IGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ1NpbmdsZXRvbicpICYmIHBhdGhQYXJ0ID09PSAnJFR5cGUnKSB7XG4gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUudGFyZ2V0VHlwZTtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAoY3VycmVudFZhbHVlLl90eXBlID09PSAnRW50aXR5U2V0JyB8fCBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdTaW5nbGV0b24nKSAmJlxuICAgICAgICAgICAgcGF0aFBhcnQgPT09ICckTmF2aWdhdGlvblByb3BlcnR5QmluZGluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUubmF2aWdhdGlvblByb3BlcnR5QmluZGluZztcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAoY3VycmVudFZhbHVlLl90eXBlID09PSAnRW50aXR5U2V0JyB8fCBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdTaW5nbGV0b24nKSAmJlxuICAgICAgICAgICAgY3VycmVudFZhbHVlLmVudGl0eVR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5lbnRpdHlUeXBlTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ05hdmlnYXRpb25Qcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgaWYgKCFvYmplY3RNYXBbY3VycmVudFBhdGhdKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgbG9nIGVycm9yXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUudGFyZ2V0VHlwZU5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdQcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIC8vIENvbXBsZXhUeXBlIG9yIFByb3BlcnR5XG4gICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlLnRhcmdldFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS50YXJnZXRUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdBY3Rpb24nICYmIGN1cnJlbnRWYWx1ZS5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gJyRQYXJhbWV0ZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZS5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW9iamVjdE1hcFtjdXJyZW50UGF0aF0pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5zb3VyY2VUeXBlLCBwYXRoUGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSAnQWN0aW9uUGFyYW1ldGVyJykge1xuICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy8nKSksXG4gICAgICAgICAgICAgICAgcGF0aFBhcnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIW9iamVjdE1hcFtjdXJyZW50UGF0aF0pIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdElkeCA9IGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RJZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RJZHggPSBjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoXG4gICAgICAgICAgICAgICAgICAgIChvYmplY3RNYXBbY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJZHgpXSBhcyBBY3Rpb24pLnNvdXJjZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhQYXJ0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ICE9PSAnbmFtZScgJiYgY3VycmVudFZhbHVlW3BhdGhQYXJ0XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZVtwYXRoUGFydF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0ID09PSAnJEFubm90YXRpb25QYXRoJyAmJiBjdXJyZW50VmFsdWUuJHRhcmdldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHRUb1Jlc29sdmUgPSBvYmplY3RNYXBbY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdCgnQCcpWzBdXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJUYXJnZXQ6IGFueSA9IF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgY29udGV4dFRvUmVzb2x2ZSwgY3VycmVudFZhbHVlLnZhbHVlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3ViVGFyZ2V0LnZpc2l0ZWRPYmplY3RzLmZvckVhY2goKHZpc2l0ZWRTdWJPYmplY3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYVZpc2l0ZWRPYmplY3RzLmluZGV4T2YodmlzaXRlZFN1Yk9iamVjdCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaCh2aXNpdGVkU3ViT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJUYXJnZXQudGFyZ2V0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoUGFydCA9PT0gJyRQYXRoJyAmJiBjdXJyZW50VmFsdWUuJHRhcmdldCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gYVZpc2l0ZWRPYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQoKVxuICAgICAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKG9iaikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouX3R5cGUgPT09ICdFbnRpdHlUeXBlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5fdHlwZSA9PT0gJ0VudGl0eVNldCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouX3R5cGUgPT09ICdTaW5nbGV0b24nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLl90eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5J1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJUYXJnZXQ6IGFueSA9IF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgY3VycmVudENvbnRleHQsIGN1cnJlbnRWYWx1ZS5wYXRoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHN1YlRhcmdldC52aXNpdGVkT2JqZWN0cy5mb3JFYWNoKCh2aXNpdGVkU3ViT2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVmlzaXRlZE9iamVjdHMuaW5kZXhPZih2aXNpdGVkU3ViT2JqZWN0KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaCh2aXNpdGVkU3ViT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJUYXJnZXQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlLiR0YXJnZXQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0LnN0YXJ0c1dpdGgoJyRQYXRoJykgJiYgY3VycmVudFZhbHVlLiR0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVUYXJnZXQgPSBjdXJyZW50VmFsdWUuJHRhcmdldDtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGludGVybWVkaWF0ZVRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0LnN1YnN0cmluZyg1KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJFR5cGUnKSAmJiAhb2JqZWN0TWFwW2N1cnJlbnRQYXRoXSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm93IGFuIGFubm90YXRpb24gdmFsdWVcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlUeXBlID0gb2JqZWN0TWFwW2N1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJ0AnKVswXV07XG4gICAgICAgICAgICAgICAgaWYgKGVudGl0eVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0TWFwW2N1cnJlbnRQYXRoXTtcbiAgICB9LCBudWxsKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbnNUZXJtKSB7XG4gICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IGluZmVyVHlwZUZyb21UZXJtKGFubm90YXRpb25zVGVybSwgY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICBvRXJyb3JNc2cgPSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byByZXNvbHZlIHRoZSBwYXRoIGV4cHJlc3Npb246ICcgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGggK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0hpbnQ6IENoZWNrIGFuZCBjb3JyZWN0IHRoZSBwYXRoIHZhbHVlcyB1bmRlciB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUgbWV0YWRhdGEgKGFubm90YXRpb24ueG1sIGZpbGUgb3IgQ0RTIGFubm90YXRpb25zIGZvciB0aGUgYXBwbGljYXRpb24pOiBcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uIFRlcm0gPSAnICtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNUZXJtICtcbiAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnPFJlY29yZCBUeXBlID0gJyArXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UeXBlICtcbiAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnPEFubm90YXRpb25QYXRoID0gJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGggK1xuICAgICAgICAgICAgICAgICAgICAnPidcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhZGRBbm5vdGF0aW9uRXJyb3JNZXNzYWdlKHBhdGgsIG9FcnJvck1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvRXJyb3JNc2cgPSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byByZXNvbHZlIHRoZSBwYXRoIGV4cHJlc3Npb246ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdIaW50OiBDaGVjayBhbmQgY29ycmVjdCB0aGUgcGF0aCB2YWx1ZXMgdW5kZXIgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIG1ldGFkYXRhIChhbm5vdGF0aW9uLnhtbCBmaWxlIG9yIENEUyBhbm5vdGF0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uKTogXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvbiBUZXJtID0gJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGhTcGxpdFswXSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxQcm9wZXJ0eVZhbHVlICBQYXRoPSAnICtcbiAgICAgICAgICAgICAgICAgICAgcGF0aFNwbGl0WzFdICtcbiAgICAgICAgICAgICAgICAgICAgJz4nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShwYXRoLCBvRXJyb3JNc2cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXRoT25seSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFBhdGg7XG4gICAgfVxuICAgIGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZpc2l0ZWRPYmplY3RzOiBhVmlzaXRlZE9iamVjdHMsXG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIFR5cGVndWFyZCB0byBjaGVjayBpZiB0aGUgcGF0aCBjb250YWlucyBhbiBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSBwYXRoU3RyIHRoZSBwYXRoIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGFubm90YXRpb24gaW4gdGhlIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGlzQW5ub3RhdGlvblBhdGgocGF0aFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhdGhTdHIuaW5kZXhPZignQCcpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VWYWx1ZShwcm9wZXJ0eVZhbHVlOiBFeHByZXNzaW9uLCB2YWx1ZUZRTjogc3RyaW5nLCBvYmplY3RNYXA6IGFueSwgY29udGV4dDogQ29udmVyc2lvbkNvbnRleHQpIHtcbiAgICBpZiAocHJvcGVydHlWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHN3aXRjaCAocHJvcGVydHlWYWx1ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5TdHJpbmc7XG4gICAgICAgIGNhc2UgJ0ludCc6XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5JbnQ7XG4gICAgICAgIGNhc2UgJ0Jvb2wnOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWUuQm9vbDtcbiAgICAgICAgY2FzZSAnRGVjaW1hbCc6XG4gICAgICAgICAgICByZXR1cm4gRGVjaW1hbChwcm9wZXJ0eVZhbHVlLkRlY2ltYWwpO1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLkRhdGU7XG4gICAgICAgIGNhc2UgJ0VudW1NZW1iZXInOlxuICAgICAgICAgICAgcmV0dXJuIGFsaWFzKGNvbnRleHQucmF3TWV0YWRhdGEucmVmZXJlbmNlcywgcHJvcGVydHlWYWx1ZS5FbnVtTWVtYmVyKTtcbiAgICAgICAgY2FzZSAnUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5VmFsdWUuUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogX3Jlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLlByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogX3Jlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgJ0Fubm90YXRpb25QYXRoJzpcbiAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25UYXJnZXQgPSBfcmVzb2x2ZVRhcmdldChcbiAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgIHVuYWxpYXMoY29udGV4dC5yYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCBwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblBhdGggPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0Fubm90YXRpb25QYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5Bbm5vdGF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZE5hbWU6IHZhbHVlRlFOLFxuICAgICAgICAgICAgICAgICR0YXJnZXQ6IGFubm90YXRpb25UYXJnZXQsXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNUZXJtOiBjb250ZXh0LmN1cnJlbnRUZXJtLFxuICAgICAgICAgICAgICAgIHRlcm06ICcnLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29udGV4dC51bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaCh7IGlubGluZTogZmFsc2UsIHRvUmVzb2x2ZTogYW5ub3RhdGlvblBhdGggfSk7XG4gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvblBhdGg7XG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS5QYXRoLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBuZXcgUGF0aChwcm9wZXJ0eVZhbHVlLCAkdGFyZ2V0LCBjb250ZXh0LmN1cnJlbnRUZXJtLCAnJyk7XG4gICAgICAgICAgICBjb250ZXh0LnVucmVzb2x2ZWRBbm5vdGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbmxpbmU6IGlzQW5ub3RhdGlvblBhdGgocHJvcGVydHlWYWx1ZS5QYXRoKSxcbiAgICAgICAgICAgICAgICB0b1Jlc29sdmU6IHBhdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG5cbiAgICAgICAgY2FzZSAnUmVjb3JkJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJlY29yZChwcm9wZXJ0eVZhbHVlLlJlY29yZCwgdmFsdWVGUU4sIG9iamVjdE1hcCwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29sbGVjdGlvbihwcm9wZXJ0eVZhbHVlLkNvbGxlY3Rpb24sIHZhbHVlRlFOLCBvYmplY3RNYXAsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdBcHBseSc6XG4gICAgICAgIGNhc2UgJ051bGwnOlxuICAgICAgICBjYXNlICdOb3QnOlxuICAgICAgICBjYXNlICdFcSc6XG4gICAgICAgIGNhc2UgJ05lJzpcbiAgICAgICAgY2FzZSAnR3QnOlxuICAgICAgICBjYXNlICdHZSc6XG4gICAgICAgIGNhc2UgJ0x0JzpcbiAgICAgICAgY2FzZSAnTGUnOlxuICAgICAgICBjYXNlICdJZic6XG4gICAgICAgIGNhc2UgJ0FuZCc6XG4gICAgICAgIGNhc2UgJ09yJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbmZlciB0aGUgdHlwZSBvZiBhIHRlcm0gYmFzZWQgb24gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIGFubm90YXRpb25zVGVybSBUaGUgYW5ub3RhdGlvbiB0ZXJtXG4gKiBAcGFyYW0gYW5ub3RhdGlvblRhcmdldCB0aGUgYW5ub3RhdGlvbiB0YXJnZXRcbiAqIEBwYXJhbSBjdXJyZW50UHJvcGVydHkgdGhlIGN1cnJlbnQgcHJvcGVydHkgb2YgdGhlIHJlY29yZFxuICogQHJldHVybnMgdGhlIGluZmVycmVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGluZmVyVHlwZUZyb21UZXJtKGFubm90YXRpb25zVGVybTogc3RyaW5nLCBhbm5vdGF0aW9uVGFyZ2V0OiBzdHJpbmcsIGN1cnJlbnRQcm9wZXJ0eT86IHN0cmluZykge1xuICAgIGxldCB0YXJnZXRUeXBlID0gKFRlcm1Ub1R5cGVzIGFzIGFueSlbYW5ub3RhdGlvbnNUZXJtXTtcbiAgICBpZiAoY3VycmVudFByb3BlcnR5KSB7XG4gICAgICAgIGFubm90YXRpb25zVGVybSA9IGFubm90YXRpb25zVGVybS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKS5qb2luKCcuJykgKyAnLicgKyBjdXJyZW50UHJvcGVydHk7XG4gICAgICAgIHRhcmdldFR5cGUgPSAoVGVybVRvVHlwZXMgYXMgYW55KVthbm5vdGF0aW9uc1Rlcm1dO1xuICAgIH1cbiAgICBjb25zdCBvRXJyb3JNc2cgPSB7XG4gICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgVGhlIHR5cGUgb2YgdGhlIHJlY29yZCB1c2VkIHdpdGhpbiB0aGUgdGVybSAke2Fubm90YXRpb25zVGVybX0gd2FzIG5vdCBkZWZpbmVkIGFuZCB3YXMgaW5mZXJyZWQgYXMgJHt0YXJnZXRUeXBlfS5cbkhpbnQ6IElmIHBvc3NpYmxlLCB0cnkgdG8gbWFpbnRhaW4gdGhlIFR5cGUgcHJvcGVydHkgZm9yIGVhY2ggUmVjb3JkLlxuPEFubm90YXRpb25zIFRhcmdldD1cIiR7YW5ub3RhdGlvblRhcmdldH1cIj5cblx0PEFubm90YXRpb24gVGVybT1cIiR7YW5ub3RhdGlvbnNUZXJtfVwiPlxuXHRcdDxSZWNvcmQ+Li4uPC9SZWNvcmQ+XG5cdDwvQW5ub3RhdGlvbj5cbjwvQW5ub3RhdGlvbnM+YFxuICAgIH07XG4gICAgYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShhbm5vdGF0aW9uVGFyZ2V0ICsgJy8nICsgYW5ub3RhdGlvbnNUZXJtLCBvRXJyb3JNc2cpO1xuICAgIHJldHVybiB0YXJnZXRUeXBlO1xufVxuXG5mdW5jdGlvbiBpc0RhdGFGaWVsZFdpdGhGb3JBY3Rpb24oYW5ub3RhdGlvbkNvbnRlbnQ6IGFueSwgYW5ub3RhdGlvblRlcm06IGFueSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIGFubm90YXRpb25Db250ZW50Lmhhc093blByb3BlcnR5KCdBY3Rpb24nKSAmJlxuICAgICAgICAoYW5ub3RhdGlvblRlcm0uJFR5cGUgPT09ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBY3Rpb24nIHx8XG4gICAgICAgICAgICBhbm5vdGF0aW9uVGVybS4kVHlwZSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhBY3Rpb24nKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkVHlwZShyZWNvcmREZWZpbml0aW9uOiBBbm5vdGF0aW9uUmVjb3JkLCBjb250ZXh0OiBDb252ZXJzaW9uQ29udGV4dCkge1xuICAgIGxldCB0YXJnZXRUeXBlO1xuICAgIGlmICghcmVjb3JkRGVmaW5pdGlvbi50eXBlICYmIGNvbnRleHQuY3VycmVudFRlcm0pIHtcbiAgICAgICAgdGFyZ2V0VHlwZSA9IGluZmVyVHlwZUZyb21UZXJtKFxuICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybSxcbiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRQcm9wZXJ0eVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFR5cGUgPSB1bmFsaWFzKGNvbnRleHQucmF3TWV0YWRhdGEucmVmZXJlbmNlcywgcmVjb3JkRGVmaW5pdGlvbi50eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFR5cGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkKFxuICAgIHJlY29yZERlZmluaXRpb246IEFubm90YXRpb25SZWNvcmQsXG4gICAgY3VycmVudEZRTjogc3RyaW5nLFxuICAgIG9iamVjdE1hcDogYW55LFxuICAgIGNvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0XG4pIHtcbiAgICBjb25zdCB0YXJnZXRUeXBlID0gcGFyc2VSZWNvcmRUeXBlKHJlY29yZERlZmluaXRpb24sIGNvbnRleHQpO1xuXG4gICAgY29uc3QgYW5ub3RhdGlvblRlcm06IGFueSA9IHtcbiAgICAgICAgJFR5cGU6IHRhcmdldFR5cGUsXG4gICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogY3VycmVudEZRTixcbiAgICAgICAgYW5ub3RhdGlvbnM6IHt9XG4gICAgfTtcbiAgICBjb25zdCBhbm5vdGF0aW9uQ29udGVudDogYW55ID0ge307XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkRGVmaW5pdGlvbi5hbm5vdGF0aW9ucykpIHtcbiAgICAgICAgY29uc3Qgc3ViQW5ub3RhdGlvbkxpc3QgPSB7XG4gICAgICAgICAgICB0YXJnZXQ6IGN1cnJlbnRGUU4sXG4gICAgICAgICAgICBhbm5vdGF0aW9uczogcmVjb3JkRGVmaW5pdGlvbi5hbm5vdGF0aW9ucyxcbiAgICAgICAgICAgIF9fc291cmNlOiBjb250ZXh0LmN1cnJlbnRTb3VyY2VcbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5hZGRpdGlvbmFsQW5ub3RhdGlvbnMucHVzaChzdWJBbm5vdGF0aW9uTGlzdCk7XG4gICAgfVxuICAgIGlmIChyZWNvcmREZWZpbml0aW9uLnByb3BlcnR5VmFsdWVzKSB7XG4gICAgICAgIHJlY29yZERlZmluaXRpb24ucHJvcGVydHlWYWx1ZXMuZm9yRWFjaCgocHJvcGVydHlWYWx1ZTogUHJvcGVydHlWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29udGV4dC5jdXJyZW50UHJvcGVydHkgPSBwcm9wZXJ0eVZhbHVlLm5hbWU7XG4gICAgICAgICAgICBhbm5vdGF0aW9uQ29udGVudFtwcm9wZXJ0eVZhbHVlLm5hbWVdID0gcGFyc2VWYWx1ZShcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLnZhbHVlLFxuICAgICAgICAgICAgICAgIGAke2N1cnJlbnRGUU59LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgb2JqZWN0TWFwLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFubm90YXRpb25MaXN0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGAke2N1cnJlbnRGUU59LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiBwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBfX3NvdXJjZTogY29udGV4dC5jdXJyZW50U291cmNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmFkZGl0aW9uYWxBbm5vdGF0aW9ucy5wdXNoKHN1YkFubm90YXRpb25MaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0RhdGFGaWVsZFdpdGhGb3JBY3Rpb24oYW5ub3RhdGlvbkNvbnRlbnQsIGFubm90YXRpb25UZXJtKSkge1xuICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXNvbHZlIHRvIGEgYm91bmQgYWN0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIHRhcmdldFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25Db250ZW50LkFjdGlvblRhcmdldCA9IGNvbnRleHQuY3VycmVudFRhcmdldC5hY3Rpb25zPy5bYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uXTtcblxuICAgICAgICAgICAgICAgIGlmICghYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IG9iamVjdE1hcFthbm5vdGF0aW9uQ29udGVudC5BY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uPy5pc0JvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZCBhY3Rpb24gb2YgYSBkaWZmZXJlbnQgZW50aXR5IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Db250ZW50LkFjdGlvblRhcmdldCA9IGFjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYm91bmQgYWN0aW9uIC0tPiByZXNvbHZlIHZpYSB0aGUgYWN0aW9uIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0ID0gYWN0aW9uLmFjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBkaWFnbm9zdGljcyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgQU5OT1RBVElPTl9FUlJPUlMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgYWN0aW9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Db250ZW50LkFjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkZWZpbmVkIGZvciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVGVybS5mdWxseVF1YWxpZmllZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dC5jdXJyZW50UHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFubm90YXRpb25UZXJtLCBhbm5vdGF0aW9uQ29udGVudCk7XG59XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25UeXBlID1cbiAgICB8ICdQcm9wZXJ0eVBhdGgnXG4gICAgfCAnUGF0aCdcbiAgICB8ICdJZidcbiAgICB8ICdBcHBseSdcbiAgICB8ICdOdWxsJ1xuICAgIHwgJ0FuZCdcbiAgICB8ICdFcSdcbiAgICB8ICdOZSdcbiAgICB8ICdOb3QnXG4gICAgfCAnR3QnXG4gICAgfCAnR2UnXG4gICAgfCAnTHQnXG4gICAgfCAnTGUnXG4gICAgfCAnT3InXG4gICAgfCAnQW5ub3RhdGlvblBhdGgnXG4gICAgfCAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCdcbiAgICB8ICdSZWNvcmQnXG4gICAgfCAnU3RyaW5nJ1xuICAgIHwgJ0VtcHR5Q29sbGVjdGlvbic7XG5cbi8qKlxuICogUmV0cmlldmUgb3IgaW5mZXIgdGhlIGNvbGxlY3Rpb24gdHlwZSBiYXNlZCBvbiBpdHMgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9ySW5mZXJDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uRGVmaW5pdGlvbjogYW55W10pOiBDb2xsZWN0aW9uVHlwZSB7XG4gICAgbGV0IHR5cGU6IENvbGxlY3Rpb25UeXBlID0gKGNvbGxlY3Rpb25EZWZpbml0aW9uIGFzIGFueSkudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkICYmIGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RDb2xJdGVtID0gY29sbGVjdGlvbkRlZmluaXRpb25bMF07XG4gICAgICAgIGlmIChmaXJzdENvbEl0ZW0uaGFzT3duUHJvcGVydHkoJ1Byb3BlcnR5UGF0aCcpKSB7XG4gICAgICAgICAgICB0eXBlID0gJ1Byb3BlcnR5UGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdQYXRoJykpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnUGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdBbm5vdGF0aW9uUGF0aCcpKSB7XG4gICAgICAgICAgICB0eXBlID0gJ0Fubm90YXRpb25QYXRoJztcbiAgICAgICAgfSBlbHNlIGlmIChmaXJzdENvbEl0ZW0uaGFzT3duUHJvcGVydHkoJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBmaXJzdENvbEl0ZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCd0eXBlJykgfHwgZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdwcm9wZXJ0eVZhbHVlcycpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHR5cGUgPSAnUmVjb3JkJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmlyc3RDb2xJdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHlwZSA9ICdTdHJpbmcnO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHlwZSA9ICdFbXB0eUNvbGxlY3Rpb24nO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xsZWN0aW9uKGNvbGxlY3Rpb25EZWZpbml0aW9uOiBhbnlbXSwgcGFyZW50RlFOOiBzdHJpbmcsIG9iamVjdE1hcDogYW55LCBjb250ZXh0OiBDb252ZXJzaW9uQ29udGV4dCkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25EZWZpbml0aW9uVHlwZSA9IGdldE9ySW5mZXJDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uRGVmaW5pdGlvbik7XG4gICAgc3dpdGNoIChjb2xsZWN0aW9uRGVmaW5pdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSAnUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKHByb3BlcnR5UGF0aCwgcHJvcGVydHlJZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5UGF0aC5Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke3Byb3BlcnR5SWR4fWAsXG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQ6IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLlByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocGF0aFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlLlBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gbmV3IFBhdGgocGF0aFZhbHVlLCAkdGFyZ2V0LCBjb250ZXh0LmN1cnJlbnRUZXJtLCAnJyk7XG4gICAgICAgICAgICAgICAgY29udGV4dC51bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogaXNBbm5vdGF0aW9uUGF0aChwYXRoVmFsdWUuUGF0aCksXG4gICAgICAgICAgICAgICAgICAgIHRvUmVzb2x2ZTogcGF0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ0Fubm90YXRpb25QYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKGFubm90YXRpb25QYXRoLCBhbm5vdGF0aW9uSWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblBhdGguQW5ub3RhdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUZXJtXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uQ29sbGVjdGlvbkVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhbm5vdGF0aW9uUGF0aC5Bbm5vdGF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtwYXJlbnRGUU59LyR7YW5ub3RhdGlvbklkeH1gLFxuICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0OiBhbm5vdGF0aW9uVGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc1Rlcm06IGNvbnRleHQuY3VycmVudFRlcm0sXG4gICAgICAgICAgICAgICAgICAgIHRlcm06ICcnLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udGV4dC51bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRvUmVzb2x2ZTogYW5ub3RhdGlvbkNvbGxlY3Rpb25FbGVtZW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Db2xsZWN0aW9uRWxlbWVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKG5hdlByb3BlcnR5UGF0aCwgbmF2UHJvcElkeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5hdlByb3BlcnR5UGF0aC5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZE5hbWU6IGAke3BhcmVudEZRTn0vJHtuYXZQcm9wSWR4fWAsXG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQ6IF9yZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGVybVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdSZWNvcmQnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocmVjb3JkRGVmaW5pdGlvbiwgcmVjb3JkSWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVjb3JkKHJlY29yZERlZmluaXRpb24sIGAke3BhcmVudEZRTn0vJHtyZWNvcmRJZHh9YCwgb2JqZWN0TWFwLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdBcHBseSc6XG4gICAgICAgIGNhc2UgJ051bGwnOlxuICAgICAgICBjYXNlICdJZic6XG4gICAgICAgIGNhc2UgJ0VxJzpcbiAgICAgICAgY2FzZSAnTmUnOlxuICAgICAgICBjYXNlICdMdCc6XG4gICAgICAgIGNhc2UgJ0d0JzpcbiAgICAgICAgY2FzZSAnTGUnOlxuICAgICAgICBjYXNlICdHZSc6XG4gICAgICAgIGNhc2UgJ05vdCc6XG4gICAgICAgIGNhc2UgJ0FuZCc6XG4gICAgICAgIGNhc2UgJ09yJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKGlmVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWZWYWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgoc3RyaW5nVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN0cmluZ1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUuU3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cblxudHlwZSBSZXNvbHZlYWJsZSA9IHtcbiAgICBpbmxpbmU6IGJvb2xlYW47XG4gICAgdG9SZXNvbHZlOiB7XG4gICAgICAgICR0YXJnZXQ6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0U3RyaW5nPzogc3RyaW5nO1xuICAgICAgICBhbm5vdGF0aW9uc1Rlcm0/OiBzdHJpbmc7XG4gICAgICAgIGFubm90YXRpb25UeXBlPzogc3RyaW5nO1xuICAgICAgICB0ZXJtOiBzdHJpbmc7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICB9O1xufTtcblxuZnVuY3Rpb24gY29udmVydEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbiwgb2JqZWN0TWFwOiBhbnksIGNvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0KTogYW55IHtcbiAgICBpZiAoYW5ub3RhdGlvbi5yZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlUmVjb3JkKGFubm90YXRpb24ucmVjb3JkLCBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSwgb2JqZWN0TWFwLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKGFubm90YXRpb24uY29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZShhbm5vdGF0aW9uLnZhbHVlLCBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSwgb2JqZWN0TWFwLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbjogYW55ID0gcGFyc2VDb2xsZWN0aW9uKFxuICAgICAgICAgICAgYW5ub3RhdGlvbi5jb2xsZWN0aW9uLFxuICAgICAgICAgICAgYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGNvbGxlY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lID0gYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVzb2x2ZVBhdGggZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZW50aXR5VHlwZS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0gb2JqZWN0TWFwIFRoZSBjdXJyZW50IG9iamVjdE1hcFxuICogQHJldHVybnMgdGhlIHJlc29sdmVQYXRoIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIGF0IHRoZSBlbnRpdHlUeXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVQYXRoRm4oZW50aXR5VHlwZTogRW50aXR5VHlwZSwgb2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGg6IHN0cmluZywgaW5jbHVkZVZpc2l0ZWRPYmplY3RzOiBib29sZWFuKTogYW55IHtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblRlcm06IHN0cmluZyA9ICcnO1xuICAgICAgICByZXR1cm4gX3Jlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBlbnRpdHlUeXBlLCByZWxhdGl2ZVBhdGgsIGZhbHNlLCBpbmNsdWRlVmlzaXRlZE9iamVjdHMsIGFubm90YXRpb25UZXJtKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVjJOYXZpZ2F0aW9uUHJvcGVydHkoXG4gICAgbmF2UHJvcDogUmF3VjJOYXZpZ2F0aW9uUHJvcGVydHksXG4gICAgYXNzb2NpYXRpb25zOiBSYXdBc3NvY2lhdGlvbltdLFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBvdXROYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHlcbik6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldEFzc29jaWF0aW9uID0gYXNzb2NpYXRpb25zLmZpbmQoXG4gICAgICAgIChhc3NvY2lhdGlvbikgPT4gYXNzb2NpYXRpb24uZnVsbHlRdWFsaWZpZWROYW1lID09PSBuYXZQcm9wLnJlbGF0aW9uc2hpcFxuICAgICk7XG4gICAgaWYgKHRhcmdldEFzc29jaWF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFzc29jaWF0aW9uRW5kID0gdGFyZ2V0QXNzb2NpYXRpb24uYXNzb2NpYXRpb25FbmQuZmluZCgoZW5kKSA9PiBlbmQucm9sZSA9PT0gbmF2UHJvcC50b1JvbGUpO1xuICAgICAgICBpZiAoYXNzb2NpYXRpb25FbmQpIHtcbiAgICAgICAgICAgIG91dE5hdlByb3AudGFyZ2V0VHlwZSA9IG9iamVjdE1hcFthc3NvY2lhdGlvbkVuZC50eXBlXTtcbiAgICAgICAgICAgIG91dE5hdlByb3AuaXNDb2xsZWN0aW9uID0gYXNzb2NpYXRpb25FbmQubXVsdGlwbGljaXR5ID09PSAnKic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3V0TmF2UHJvcC5yZWZlcmVudGlhbENvbnN0cmFpbnQgPSBuYXZQcm9wLnJlZmVyZW50aWFsQ29uc3RyYWludCB8fCBbXTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVY0TmF2aWdhdGlvblByb3BlcnR5KFxuICAgIG5hdlByb3A6IFJhd1Y0TmF2aWdhdGlvblByb3BlcnR5LFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBvdXROYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHlcbik6IHZvaWQge1xuICAgIG91dE5hdlByb3AudGFyZ2V0VHlwZSA9IG9iamVjdE1hcFtuYXZQcm9wLnRhcmdldFR5cGVOYW1lXTtcbiAgICBvdXROYXZQcm9wLnBhcnRuZXIgPSBuYXZQcm9wLnBhcnRuZXI7XG4gICAgb3V0TmF2UHJvcC5pc0NvbGxlY3Rpb24gPSBuYXZQcm9wLmlzQ29sbGVjdGlvbjtcbiAgICBvdXROYXZQcm9wLmNvbnRhaW5zVGFyZ2V0ID0gbmF2UHJvcC5jb250YWluc1RhcmdldDtcbiAgICBvdXROYXZQcm9wLnJlZmVyZW50aWFsQ29uc3RyYWludCA9IG5hdlByb3AucmVmZXJlbnRpYWxDb25zdHJhaW50O1xufVxuXG5mdW5jdGlvbiBpc1Y0TmF2aWdhdGlvblByb3BlcnR5KFxuICAgIG5hdlByb3A6IFJhd1YyTmF2aWdhdGlvblByb3BlcnR5IHwgUmF3VjROYXZpZ2F0aW9uUHJvcGVydHlcbik6IG5hdlByb3AgaXMgUmF3VjROYXZpZ2F0aW9uUHJvcGVydHkge1xuICAgIHJldHVybiAhIShuYXZQcm9wIGFzIEJhc2VOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGVOYW1lO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgbmF2aWdhdGlvblByb3BlcnRpZXM6IChSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eSB8IFJhd1YyTmF2aWdhdGlvblByb3BlcnR5KVtdLFxuICAgIGFzc29jaWF0aW9uczogUmF3QXNzb2NpYXRpb25bXSxcbiAgICBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICAgIHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydGllcy5tYXAoKG5hdlByb3ApID0+IHtcbiAgICAgICAgY29uc3Qgb3V0TmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5ID0ge1xuICAgICAgICAgICAgX3R5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHknLFxuICAgICAgICAgICAgbmFtZTogbmF2UHJvcC5uYW1lLFxuICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiBuYXZQcm9wLmZ1bGx5UXVhbGlmaWVkTmFtZSxcbiAgICAgICAgICAgIGlzQ29sbGVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBjb250YWluc1RhcmdldDogZmFsc2UsXG4gICAgICAgICAgICByZWZlcmVudGlhbENvbnN0cmFpbnQ6IFtdLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHt9LFxuICAgICAgICAgICAgcGFydG5lcjogJycsXG4gICAgICAgICAgICB0YXJnZXRUeXBlOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICAgICAgdGFyZ2V0VHlwZU5hbWU6ICcnXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpc1Y0TmF2aWdhdGlvblByb3BlcnR5KG5hdlByb3ApKSB7XG4gICAgICAgICAgICByZXNvbHZlVjROYXZpZ2F0aW9uUHJvcGVydHkobmF2UHJvcCwgb2JqZWN0TWFwLCBvdXROYXZQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVWMk5hdmlnYXRpb25Qcm9wZXJ0eShuYXZQcm9wLCBhc3NvY2lhdGlvbnMsIG9iamVjdE1hcCwgb3V0TmF2UHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dE5hdlByb3AudGFyZ2V0VHlwZSkge1xuICAgICAgICAgICAgb3V0TmF2UHJvcC50YXJnZXRUeXBlTmFtZSA9IG91dE5hdlByb3AudGFyZ2V0VHlwZS5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0TWFwW291dE5hdlByb3AuZnVsbHlRdWFsaWZpZWROYW1lXSA9IG91dE5hdlByb3A7XG4gICAgICAgIHJldHVybiBvdXROYXZQcm9wO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbnRpdHlUeXBlc1xuICogQHBhcmFtIGFzc29jaWF0aW9uc1xuICogQHBhcmFtIG9iamVjdE1hcFxuICovXG5mdW5jdGlvbiByZXNvbHZlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgZW50aXR5VHlwZXM6IFJhd0VudGl0eVR5cGVbXSxcbiAgICBhc3NvY2lhdGlvbnM6IFJhd0Fzc29jaWF0aW9uW10sXG4gICAgb2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiB2b2lkIHtcbiAgICBlbnRpdHlUeXBlcy5mb3JFYWNoKChlbnRpdHlUeXBlKSA9PiB7XG4gICAgICAgIGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgPSBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgICAgICAgICBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgYXNzb2NpYXRpb25zLFxuICAgICAgICAgICAgb2JqZWN0TWFwXG4gICAgICAgICk7XG4gICAgICAgIChlbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUpLnJlc29sdmVQYXRoID0gY3JlYXRlUmVzb2x2ZVBhdGhGbihlbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsIG9iamVjdE1hcCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG5hbWVzcGFjZVxuICogQHBhcmFtIGFjdGlvbnNcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqL1xuZnVuY3Rpb24gbGlua0FjdGlvbnNUb0VudGl0eVR5cGUobmFtZXNwYWNlOiBzdHJpbmcsIGFjdGlvbnM6IEFjdGlvbltdLCBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBhY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICBpZiAoIWFjdGlvbi5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgYWN0aW9uLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbi5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VFbnRpdHlUeXBlID0gb2JqZWN0TWFwW2FjdGlvbi5zb3VyY2VUeXBlXTtcbiAgICAgICAgICAgIGFjdGlvbi5zb3VyY2VFbnRpdHlUeXBlID0gc291cmNlRW50aXR5VHlwZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VFbnRpdHlUeXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VFbnRpdHlUeXBlLmFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRW50aXR5VHlwZS5hY3Rpb25zID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNvdXJjZUVudGl0eVR5cGUuYWN0aW9uc1tgJHtuYW1lc3BhY2V9LiR7YWN0aW9uLm5hbWV9YF0gPSBhY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY3Rpb24ucmV0dXJuRW50aXR5VHlwZSA9IG9iamVjdE1hcFthY3Rpb24ucmV0dXJuVHlwZV07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbGlua0FjdGlvbkltcG9ydHNUb0FjdGlvbnMoYWN0aW9uSW1wb3J0czogQWN0aW9uSW1wb3J0W10sIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGFjdGlvbkltcG9ydHMuZm9yRWFjaCgoYWN0aW9uSW1wb3J0KSA9PiB7XG4gICAgICAgIGFjdGlvbkltcG9ydC5hY3Rpb24gPSBvYmplY3RNYXBbYWN0aW9uSW1wb3J0LmFjdGlvbk5hbWVdO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbnRpdHlTZXRzXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKiBAcGFyYW0gcmVmZXJlbmNlc1xuICovXG5mdW5jdGlvbiBsaW5rRW50aXR5VHlwZVRvRW50aXR5U2V0KFxuICAgIGVudGl0eVNldHM6IEVudGl0eVNldFtdLFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcFxuKTogdm9pZCB7XG4gICAgZW50aXR5U2V0cy5mb3JFYWNoKChlbnRpdHlTZXQpID0+IHtcbiAgICAgICAgZW50aXR5U2V0LmVudGl0eVR5cGUgPSBvYmplY3RNYXBbZW50aXR5U2V0LmVudGl0eVR5cGVOYW1lXTtcbiAgICAgICAgaWYgKCFlbnRpdHlTZXQuZW50aXR5VHlwZSkge1xuICAgICAgICAgICAgZW50aXR5U2V0LmVudGl0eVR5cGUgPSBvYmplY3RNYXBbdW5hbGlhcyhyZWZlcmVuY2VzLCBlbnRpdHlTZXQuZW50aXR5VHlwZU5hbWUpIGFzIHN0cmluZ107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRpdHlTZXQuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIGVudGl0eVNldC5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50aXR5U2V0LmVudGl0eVR5cGUuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIGVudGl0eVNldC5lbnRpdHlUeXBlLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZW50aXR5U2V0LmVudGl0eVR5cGUua2V5cy5mb3JFYWNoKChrZXlQcm9wOiBQcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAga2V5UHJvcC5pc0tleSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBzaW5nbGV0b25zXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKiBAcGFyYW0gcmVmZXJlbmNlc1xuICovXG5mdW5jdGlvbiBsaW5rRW50aXR5VHlwZVRvU2luZ2xldG9uKFxuICAgIHNpbmdsZXRvbnM6IFNpbmdsZXRvbltdLFxuICAgIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcFxuKTogdm9pZCB7XG4gICAgc2luZ2xldG9ucy5mb3JFYWNoKChzaW5nbGV0b24pID0+IHtcbiAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUgPSBvYmplY3RNYXBbc2luZ2xldG9uLmVudGl0eVR5cGVOYW1lXTtcbiAgICAgICAgaWYgKCFzaW5nbGV0b24uZW50aXR5VHlwZSkge1xuICAgICAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUgPSBvYmplY3RNYXBbdW5hbGlhcyhyZWZlcmVuY2VzLCBzaW5nbGV0b24uZW50aXR5VHlwZU5hbWUpIGFzIHN0cmluZ107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaW5nbGV0b24uYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHNpbmdsZXRvbi5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2luZ2xldG9uLmVudGl0eVR5cGUuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHNpbmdsZXRvbi5lbnRpdHlUeXBlLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUua2V5cy5mb3JFYWNoKChrZXlQcm9wOiBQcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAga2V5UHJvcC5pc0tleSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbnRpdHlUeXBlc1xuICogQHBhcmFtIG9iamVjdE1hcFxuICovXG5mdW5jdGlvbiBsaW5rUHJvcGVydGllc1RvQ29tcGxleFR5cGVzKGVudGl0eVR5cGVzOiBFbnRpdHlUeXBlW10sIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpbmsocHJvcGVydHk6IFByb3BlcnR5KSB7XG4gICAgICAgIGlmICghcHJvcGVydHkuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5LmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUuaW5kZXhPZignRWRtJykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tcGxleFR5cGU6IENvbXBsZXhUeXBlIHwgVHlwZURlZmluaXRpb247XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUuc3RhcnRzV2l0aCgnQ29sbGVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhUeXBlTmFtZSA9IHByb3BlcnR5LnR5cGUuc3Vic3RyaW5nKDExLCBwcm9wZXJ0eS50eXBlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV4VHlwZSA9IG9iamVjdE1hcFtjb21wbGV4VHlwZU5hbWVdIGFzIENvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlID0gb2JqZWN0TWFwW3Byb3BlcnR5LnR5cGVdIGFzIENvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkudGFyZ2V0VHlwZSA9IGNvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGUucHJvcGVydGllcy5mb3JFYWNoKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChzRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvcGVydHkgVHlwZSBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW50aXR5VHlwZXMuZm9yRWFjaCgoZW50aXR5VHlwZSkgPT4ge1xuICAgICAgICBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaChsaW5rKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29tcGxleFR5cGVzXG4gKiBAcGFyYW0gYXNzb2NpYXRpb25zXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVDb21wbGV4VHlwZXMoXG4gICAgY29tcGxleFR5cGVzOiBSYXdDb21wbGV4VHlwZVtdLFxuICAgIGFzc29jaWF0aW9uczogUmF3QXNzb2NpYXRpb25bXSxcbiAgICBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICAgIGNvbXBsZXhUeXBlcy5mb3JFYWNoKChjb21wbGV4VHlwZSkgPT4ge1xuICAgICAgICAoY29tcGxleFR5cGUgYXMgQ29tcGxleFR5cGUpLmFubm90YXRpb25zID0ge307XG4gICAgICAgIGNvbXBsZXhUeXBlLnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIGlmICghKHByb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgICAgIChwcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcGxleFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgPSBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMoXG4gICAgICAgICAgICBjb21wbGV4VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcbiAgICAgICAgICAgIGFzc29jaWF0aW9ucyxcbiAgICAgICAgICAgIG9iamVjdE1hcFxuICAgICAgICApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSBhbGlhcyBmcm9tIHRoZSB0ZXJtIHZhbHVlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHNldCBvZiByZWZlcmVuY2VzXG4gKiBAcGFyYW0gdGVybVZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgdGVybVxuICogQHJldHVybnMgdGhlIHRlcm0gYWxpYXMgYW5kIHRoZSBhY3R1YWwgdGVybSB2YWx1ZVxuICovXG5mdW5jdGlvbiBzcGxpdFRlcm0ocmVmZXJlbmNlczogUmVmZXJlbmNlc1dpdGhNYXAsIHRlcm1WYWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWxpYXNlZFRlcm0gPSBhbGlhcyhyZWZlcmVuY2VzLCB0ZXJtVmFsdWUpO1xuICAgIGNvbnN0IGxhc3REb3QgPSBhbGlhc2VkVGVybS5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IHRlcm1BbGlhcyA9IGFsaWFzZWRUZXJtLnN1YnN0cmluZygwLCBsYXN0RG90KTtcbiAgICBjb25zdCB0ZXJtID0gYWxpYXNlZFRlcm0uc3Vic3RyaW5nKGxhc3REb3QgKyAxKTtcbiAgICByZXR1cm4gW3Rlcm1BbGlhcywgdGVybV07XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHJlc29sdmUgYSBzcGVjaWZpYyBwYXRoLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZWRPdXRwdXRcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqIEByZXR1cm5zIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gcmVzb2x2ZSBlbGVtZW50IGdsb2JhbGx5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxSZXNvbHZlKGNvbnZlcnRlZE91dHB1dDogQ29udmVydGVkTWV0YWRhdGEsIG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXNvbHZlUGF0aDxUPihzUGF0aDogc3RyaW5nLCByZXNvbHZlRGlyZWN0bHk6IGJvb2xlYW4gPSBmYWxzZSk6IFJlc29sdXRpb25UYXJnZXQ8VD4ge1xuICAgICAgICBpZiAocmVzb2x2ZURpcmVjdGx5KSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0UGF0aCA9IHNQYXRoO1xuICAgICAgICAgICAgaWYgKCFzUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gYC8ke3NQYXRofWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSZXNvbHV0aW9uOiBhbnkgPSBfcmVzb2x2ZVRhcmdldChvYmplY3RNYXAsIGNvbnZlcnRlZE91dHB1dCwgdGFyZ2V0UGF0aCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0UmVzb2x1dGlvbi52aXNpdGVkT2JqZWN0cy5wdXNoKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRSZXNvbHV0aW9uLnRhcmdldCxcbiAgICAgICAgICAgICAgICBvYmplY3RQYXRoOiB0YXJnZXRSZXNvbHV0aW9uLnZpc2l0ZWRPYmplY3RzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFQYXRoU3BsaXQgPSBzUGF0aC5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoYVBhdGhTcGxpdC5zaGlmdCgpICE9PSAnJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVhbCB3aXRoIHJlbGF0aXZlIHBhdGgnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRpdHlTZXROYW1lID0gYVBhdGhTcGxpdC5zaGlmdCgpO1xuICAgICAgICBjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZWRPdXRwdXQuZW50aXR5U2V0cy5maW5kKChldDogRW50aXR5U2V0KSA9PiBldC5uYW1lID09PSBlbnRpdHlTZXROYW1lKTtcbiAgICAgICAgY29uc3Qgc2luZ2xldG9uID0gY29udmVydGVkT3V0cHV0LnNpbmdsZXRvbnMuZmluZCgoZXQ6IFNpbmdsZXRvbikgPT4gZXQubmFtZSA9PT0gZW50aXR5U2V0TmFtZSk7XG4gICAgICAgIGlmICghZW50aXR5U2V0ICYmICFzaW5nbGV0b24pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBjb252ZXJ0ZWRPdXRwdXQuZW50aXR5Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIG9iamVjdFBhdGg6IFtjb252ZXJ0ZWRPdXRwdXQuZW50aXR5Q29udGFpbmVyXVxuICAgICAgICAgICAgfSBhcyBSZXNvbHV0aW9uVGFyZ2V0PFQ+O1xuICAgICAgICB9XG4gICAgICAgIGlmIChhUGF0aFNwbGl0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGVudGl0eVNldCB8fCBzaW5nbGV0b24sXG4gICAgICAgICAgICAgICAgb2JqZWN0UGF0aDogW2NvbnZlcnRlZE91dHB1dC5lbnRpdHlDb250YWluZXIsIGVudGl0eVNldCB8fCBzaW5nbGV0b25dXG4gICAgICAgICAgICB9IGFzIFJlc29sdXRpb25UYXJnZXQ8VD47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSZXNvbHV0aW9uOiBhbnkgPSBfcmVzb2x2ZVRhcmdldChcbiAgICAgICAgICAgICAgICBvYmplY3RNYXAsXG4gICAgICAgICAgICAgICAgZW50aXR5U2V0IHx8IHNpbmdsZXRvbixcbiAgICAgICAgICAgICAgICAnLycgKyBhUGF0aFNwbGl0LmpvaW4oJy8nKSxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0UmVzb2x1dGlvbi52aXNpdGVkT2JqZWN0cy5wdXNoKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRSZXNvbHV0aW9uLnRhcmdldCxcbiAgICAgICAgICAgICAgICBvYmplY3RQYXRoOiB0YXJnZXRSZXNvbHV0aW9uLnZpc2l0ZWRPYmplY3RzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxudHlwZSBDb252ZXJzaW9uQ29udGV4dCA9IHtcbiAgICB1bnJlc29sdmVkQW5ub3RhdGlvbnM6IFJlc29sdmVhYmxlW107XG4gICAgYWRkaXRpb25hbEFubm90YXRpb25zOiBBbm5vdGF0aW9uTGlzdFtdO1xuICAgIHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YTtcbiAgICBjdXJyZW50U291cmNlOiBzdHJpbmc7XG4gICAgY3VycmVudFRhcmdldDogYW55O1xuICAgIGN1cnJlbnRQcm9wZXJ0eT86IHN0cmluZztcbiAgICBjdXJyZW50VGVybTogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gZW5zdXJlQW5ub3RhdGlvbnMoY3VycmVudFRhcmdldDogYW55LCB2b2NBbGlhczogc3RyaW5nKSB7XG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zKSB7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXSkge1xuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXSA9IHt9O1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zKSB7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zID0ge307XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQW5ub3RhdGlvbnMoXG4gICAgY3VycmVudENvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0LFxuICAgIGFubm90YXRpb25MaXN0OiBBbm5vdGF0aW9uTGlzdCxcbiAgICBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgYk92ZXJyaWRlRXhpc3Rpbmc6IGJvb2xlYW5cbikge1xuICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50Q29udGV4dC5jdXJyZW50VGFyZ2V0O1xuICAgIGNvbnN0IGN1cnJlbnRUYXJnZXROYW1lID0gY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgYW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbjogUmF3QW5ub3RhdGlvbikgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGV4dC5jdXJyZW50U291cmNlID0gKGFubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZSB8fCAoYW5ub3RhdGlvbkxpc3QgYXMgYW55KS5fX3NvdXJjZTtcbiAgICAgICAgY29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IHNwbGl0VGVybShkZWZhdWx0UmVmZXJlbmNlcywgYW5ub3RhdGlvbi50ZXJtKTtcbiAgICAgICAgZW5zdXJlQW5ub3RhdGlvbnMoY3VycmVudFRhcmdldCwgdm9jQWxpYXMpO1xuXG4gICAgICAgIGNvbnN0IHZvY1Rlcm1XaXRoUXVhbGlmaWVyID0gYCR7dm9jVGVybX0ke2Fubm90YXRpb24ucXVhbGlmaWVyID8gJyMnICsgYW5ub3RhdGlvbi5xdWFsaWZpZXIgOiAnJ31gO1xuICAgICAgICBpZiAoIWJPdmVycmlkZUV4aXN0aW5nICYmIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnM/Llt2b2NBbGlhc10/Llt2b2NUZXJtV2l0aFF1YWxpZmllcl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDb250ZXh0LmN1cnJlbnRUZXJtID0gYW5ub3RhdGlvbi50ZXJtO1xuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPSBjb252ZXJ0QW5ub3RhdGlvbihcbiAgICAgICAgICAgIGFubm90YXRpb24gYXMgQW5ub3RhdGlvbixcbiAgICAgICAgICAgIG9iamVjdE1hcCxcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctd3JhcHBlcnNcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPSBuZXcgU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy13cmFwcGVyc1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSA9IG5ldyBCb29sZWFuKFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2YgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgIWN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS5hbm5vdGF0aW9uc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSA9PT0gJ29iamVjdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0udGVybSA9IHVuYWxpYXMoXG4gICAgICAgICAgICAgICAgZGVmYXVsdFJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgYCR7dm9jQWxpYXN9LiR7dm9jVGVybX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLnF1YWxpZmllciA9IGFubm90YXRpb24ucXVhbGlmaWVyO1xuICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLl9fc291cmNlID0gY3VycmVudENvbnRleHQuY3VycmVudFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVGFyZ2V0ID0gYCR7Y3VycmVudFRhcmdldE5hbWV9QCR7dW5hbGlhcyhcbiAgICAgICAgICAgIGRlZmF1bHRSZWZlcmVuY2VzLFxuICAgICAgICAgICAgdm9jQWxpYXMgKyAnLicgKyB2b2NUZXJtV2l0aFF1YWxpZmllclxuICAgICAgICApfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFubm90YXRpb24uYW5ub3RhdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJBbm5vdGF0aW9uTGlzdCA9IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGFubm90YXRpb25UYXJnZXQsXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGFubm90YXRpb24uYW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgX19zb3VyY2U6IGN1cnJlbnRDb250ZXh0LmN1cnJlbnRTb3VyY2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dC5hZGRpdGlvbmFsQW5ub3RhdGlvbnMucHVzaChzdWJBbm5vdGF0aW9uTGlzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5hbm5vdGF0aW9ucyAmJiAhY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLmFubm90YXRpb25zKSB7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0uYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uLmFubm90YXRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zW2Ake3ZvY0FsaWFzfS4ke3ZvY1Rlcm1XaXRoUXVhbGlmaWVyfWBdID1cbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zW3VuYWxpYXMoZGVmYXVsdFJlZmVyZW5jZXMsIGAke3ZvY0FsaWFzfS4ke3ZvY1Rlcm1XaXRoUXVhbGlmaWVyfWApIV0gPVxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXTtcbiAgICAgICAgb2JqZWN0TWFwW2Fubm90YXRpb25UYXJnZXRdID0gY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgYWxsIHRoZSB1bnJlc29sdmVkIHRhcmdldHMgc28gZmFyIHRvIHRyeSBhbmQgc2VlIGlmIHRoZXkgYXJlIHJlc29sdmVhYmxlIGluIHRoZSBlbmQuXG4gKlxuICogQHBhcmFtIHVucmVzb2x2ZWRUYXJnZXRzXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NVbnJlc29sdmVkVGFyZ2V0cyh1bnJlc29sdmVkVGFyZ2V0czogUmVzb2x2ZWFibGVbXSwgb2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdW5yZXNvbHZlZFRhcmdldHMuZm9yRWFjaCgocmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUb1Jlc29sdmUgPSByZXNvbHZhYmxlLnRvUmVzb2x2ZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gdGFyZ2V0VG9SZXNvbHZlLiR0YXJnZXQ7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gb2JqZWN0TWFwW3RhcmdldFN0cl07XG4gICAgICAgIGNvbnN0IHsgYW5ub3RhdGlvbnNUZXJtLCBhbm5vdGF0aW9uVHlwZSB9ID0gdGFyZ2V0VG9SZXNvbHZlO1xuICAgICAgICBkZWxldGUgdGFyZ2V0VG9SZXNvbHZlLmFubm90YXRpb25UeXBlO1xuICAgICAgICBkZWxldGUgdGFyZ2V0VG9SZXNvbHZlLmFubm90YXRpb25zVGVybTtcblxuICAgICAgICBpZiAocmVzb2x2YWJsZS5pbmxpbmUgJiYgIShyZXNvbHZlZFRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgICAgICAgIC8vIGlubGluZSB0aGUgcmVzb2x2ZWQgdGFyZ2V0XG4gICAgICAgICAgICBsZXQga2V5czoga2V5b2YgdHlwZW9mIHRhcmdldFRvUmVzb2x2ZTtcbiAgICAgICAgICAgIGZvciAoa2V5cyBpbiB0YXJnZXRUb1Jlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0VG9SZXNvbHZlW2tleXNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldFRvUmVzb2x2ZSwgcmVzb2x2ZWRUYXJnZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYXNzaWduIHRoZSByZXNvbHZlZCB0YXJnZXRcbiAgICAgICAgICAgIHRhcmdldFRvUmVzb2x2ZS4kdGFyZ2V0ID0gcmVzb2x2ZWRUYXJnZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc29sdmVkVGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXRUb1Jlc29sdmUudGFyZ2V0U3RyaW5nID0gdGFyZ2V0U3RyO1xuICAgICAgICAgICAgaWYgKGFubm90YXRpb25zVGVybSAmJiBhbm5vdGF0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9FcnJvck1zZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0ciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uIFRlcm0gPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zVGVybSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxSZWNvcmQgVHlwZSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvblBhdGggPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0ciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPidcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0U3RyLCBvRXJyb3JNc2cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRhcmdldFRvUmVzb2x2ZS50ZXJtO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSB0YXJnZXRUb1Jlc29sdmUucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXJtSW5mbyA9IHRhcmdldFN0ciA/IHRhcmdldFN0ci5zcGxpdCgnLycpWzBdIDogdGFyZ2V0U3RyO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9FcnJvck1zZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0ciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uIFRlcm0gPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1JbmZvICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPFByb3BlcnR5VmFsdWUgUHJvcGVydHkgPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIFBhdGg9ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPidcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0U3RyLCBvRXJyb3JNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5ub3RhdGlvbiBmcm9tIGRpZmZlcmVudCBzb3VyY2UgdG9nZXRoZXIgYnkgb3ZlcndyaXRpbmcgYXQgdGhlIHRlcm0gbGV2ZWwuXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhXG4gKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIG1lcmdlZCBhbm5vdGF0aW9uc1xuICovXG5mdW5jdGlvbiBtZXJnZUFubm90YXRpb25zKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXQ6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykuZm9yRWFjaCgoYW5ub3RhdGlvblNvdXJjZSkgPT4ge1xuICAgICAgICByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0uZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3Q6IEFubm90YXRpb25MaXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0TmFtZSA9IHVuYWxpYXMocmF3TWV0YWRhdGEucmVmZXJlbmNlcywgYW5ub3RhdGlvbkxpc3QudGFyZ2V0KSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAoYW5ub3RhdGlvbkxpc3QgYXMgYW55KS5fX3NvdXJjZSA9IGFubm90YXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBpZiAoIWFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSkge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGFubm90YXRpb25MaXN0LmFubm90YXRpb25zLmNvbmNhdCgpLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGN1cnJlbnRUYXJnZXROYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdIGFzIGFueSkuX19zb3VyY2UgPSBhbm5vdGF0aW9uU291cmNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTGlzdC5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5hbm5vdGF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVmZXJlbmNlQW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUFubm90YXRpb24udGVybSA9PT0gYW5ub3RhdGlvbi50ZXJtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUFubm90YXRpb24ucXVhbGlmaWVyID09PSBhbm5vdGF0aW9uLnF1YWxpZmllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIChhbm5vdGF0aW9uIGFzIGFueSkuX19zb3VyY2UgPSBhbm5vdGF0aW9uU291cmNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdLmFubm90YXRpb25zLnNwbGljZShmaW5kSW5kZXgsIDEsIGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdLmFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBSYXdNZXRhZGF0YSBpbnRvIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiB0byBiZSB1c2VkIHRvIGVhc2lseSBuYXZpZ2F0ZSBhIG1ldGFkYXRhIG9iamVjdCBhbmQgaXRzIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhXG4gKiBAcmV0dXJucyB0aGUgY29udmVydGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnQocmF3TWV0YWRhdGE6IFJhd01ldGFkYXRhKTogQ29udmVydGVkTWV0YWRhdGEge1xuICAgIEFOTk9UQVRJT05fRVJST1JTID0gW107XG4gICAgY29uc3Qgb2JqZWN0TWFwID0gYnVpbGRPYmplY3RNYXAocmF3TWV0YWRhdGEpO1xuICAgIHJlc29sdmVOYXZpZ2F0aW9uUHJvcGVydGllcyhcbiAgICAgICAgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSxcbiAgICAgICAgcmF3TWV0YWRhdGEuc2NoZW1hLmFzc29jaWF0aW9ucyxcbiAgICAgICAgb2JqZWN0TWFwXG4gICAgKTtcbiAgICAocmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lciBhcyBFbnRpdHlDb250YWluZXIpLmFubm90YXRpb25zID0ge307XG4gICAgbGlua0FjdGlvbnNUb0VudGl0eVR5cGUocmF3TWV0YWRhdGEuc2NoZW1hLm5hbWVzcGFjZSwgcmF3TWV0YWRhdGEuc2NoZW1hLmFjdGlvbnMgYXMgQWN0aW9uW10sIG9iamVjdE1hcCk7XG4gICAgbGlua0FjdGlvbkltcG9ydHNUb0FjdGlvbnMocmF3TWV0YWRhdGEuc2NoZW1hLmFjdGlvbkltcG9ydHMsIG9iamVjdE1hcCk7XG4gICAgbGlua0VudGl0eVR5cGVUb0VudGl0eVNldChyYXdNZXRhZGF0YS5zY2hlbWEuZW50aXR5U2V0cyBhcyBFbnRpdHlTZXRbXSwgb2JqZWN0TWFwLCByYXdNZXRhZGF0YS5yZWZlcmVuY2VzKTtcbiAgICBsaW5rRW50aXR5VHlwZVRvU2luZ2xldG9uKHJhd01ldGFkYXRhLnNjaGVtYS5zaW5nbGV0b25zIGFzIFNpbmdsZXRvbltdLCBvYmplY3RNYXAsIHJhd01ldGFkYXRhLnJlZmVyZW5jZXMpO1xuICAgIGxpbmtQcm9wZXJ0aWVzVG9Db21wbGV4VHlwZXMocmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSwgb2JqZWN0TWFwKTtcbiAgICBwcmVwYXJlQ29tcGxleFR5cGVzKHJhd01ldGFkYXRhLnNjaGVtYS5jb21wbGV4VHlwZXMgYXMgQ29tcGxleFR5cGVbXSwgcmF3TWV0YWRhdGEuc2NoZW1hLmFzc29jaWF0aW9ucywgb2JqZWN0TWFwKTtcbiAgICBjb25zdCB1bnJlc29sdmVkVGFyZ2V0czogUmVzb2x2ZWFibGVbXSA9IFtdO1xuICAgIGNvbnN0IHVucmVzb2x2ZWRBbm5vdGF0aW9uczogQW5ub3RhdGlvbkxpc3RbXSA9IFtdO1xuICAgIGNvbnN0IGFubm90YXRpb25MaXN0UGVyVGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uTGlzdD4gPSBtZXJnZUFubm90YXRpb25zKHJhd01ldGFkYXRhKTtcbiAgICBPYmplY3Qua2V5cyhhbm5vdGF0aW9uTGlzdFBlclRhcmdldCkuZm9yRWFjaCgoY3VycmVudFRhcmdldE5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbkxpc3QgPSBhbm5vdGF0aW9uTGlzdFBlclRhcmdldFtjdXJyZW50VGFyZ2V0TmFtZV07XG4gICAgICAgIGNvbnN0IG9iamVjdE1hcEVsZW1lbnQgPSBvYmplY3RNYXBbY3VycmVudFRhcmdldE5hbWVdO1xuICAgICAgICBpZiAoIW9iamVjdE1hcEVsZW1lbnQgJiYgY3VycmVudFRhcmdldE5hbWU/LmluZGV4T2YoJ0AnKSA+IDApIHtcbiAgICAgICAgICAgIHVucmVzb2x2ZWRBbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb25MaXN0KTtcbiAgICAgICAgfSBlbHNlIGlmIChvYmplY3RNYXBFbGVtZW50KSB7XG4gICAgICAgICAgICBsZXQgYWxsVGFyZ2V0cyA9IFtvYmplY3RNYXBFbGVtZW50XTtcbiAgICAgICAgICAgIGxldCBiT3ZlcnJpZGVFeGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICBpZiAob2JqZWN0TWFwRWxlbWVudC5fdHlwZSA9PT0gJ1VuYm91bmRHZW5lcmljQWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGFsbFRhcmdldHMgPSBvYmplY3RNYXBFbGVtZW50LmFjdGlvbnM7XG4gICAgICAgICAgICAgICAgYk92ZXJyaWRlRXhpc3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsbFRhcmdldHMuZm9yRWFjaCgoY3VycmVudFRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0OiBDb252ZXJzaW9uQ29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFubm90YXRpb25zOiB1bnJlc29sdmVkQW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2U6IChhbm5vdGF0aW9uTGlzdCBhcyBhbnkpLl9fc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGVybTogJycsXG4gICAgICAgICAgICAgICAgICAgIHJhd01ldGFkYXRhOiByYXdNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZEFubm90YXRpb25zOiB1bnJlc29sdmVkVGFyZ2V0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDb250ZXh0LCBhbm5vdGF0aW9uTGlzdCwgb2JqZWN0TWFwLCBiT3ZlcnJpZGVFeGlzdGluZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFVbnJlc29sdmVkQW5ub3RhdGlvbnM6IEFubm90YXRpb25MaXN0W10gPSBbXTtcbiAgICB1bnJlc29sdmVkQW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3QpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldE5hbWUgPSB1bmFsaWFzKHJhd01ldGFkYXRhLnJlZmVyZW5jZXMsIGFubm90YXRpb25MaXN0LnRhcmdldCkgYXMgc3RyaW5nO1xuICAgICAgICBsZXQgW2Jhc2VPYmosIGFubm90YXRpb25QYXJ0XSA9IGN1cnJlbnRUYXJnZXROYW1lLnNwbGl0KCdAJyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFNwbGl0ID0gYW5ub3RhdGlvblBhcnQuc3BsaXQoJy8nKTtcbiAgICAgICAgYmFzZU9iaiA9IGJhc2VPYmogKyAnQCcgKyB0YXJnZXRTcGxpdFswXTtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IHRhcmdldFNwbGl0LnNsaWNlKDEpLnJlZHVjZSgoY3VycmVudE9iaiwgcGF0aCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmo/LltwYXRoXTtcbiAgICAgICAgfSwgb2JqZWN0TWFwW2Jhc2VPYmpdKTtcbiAgICAgICAgaWYgKCFjdXJyZW50VGFyZ2V0IHx8IHR5cGVvZiBjdXJyZW50VGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgQU5OT1RBVElPTl9FUlJPUlMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbiB0YXJnZXQgd2FzIG5vdCBmb3VuZCBvbiB0aGUgc2VydmljZSAnICsgY3VycmVudFRhcmdldE5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQ6IENvbnZlcnNpb25Db250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxBbm5vdGF0aW9uczogZXh0cmFVbnJlc29sdmVkQW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZTogKGFubm90YXRpb25MaXN0IGFzIGFueSkuX19zb3VyY2UsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGVybTogJycsXG4gICAgICAgICAgICAgICAgcmF3TWV0YWRhdGE6IHJhd01ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRBbm5vdGF0aW9uczogdW5yZXNvbHZlZFRhcmdldHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwcm9jZXNzQW5ub3RhdGlvbnMoY3VycmVudENvbnRleHQsIGFubm90YXRpb25MaXN0LCBvYmplY3RNYXAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Nlc3NVbnJlc29sdmVkVGFyZ2V0cyh1bnJlc29sdmVkVGFyZ2V0cywgb2JqZWN0TWFwKTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIEFMTF9BTk5PVEFUSU9OX0VSUk9SUykge1xuICAgICAgICBBTk5PVEFUSU9OX0VSUk9SUy5wdXNoKEFMTF9BTk5PVEFUSU9OX0VSUk9SU1twcm9wZXJ0eV1bMF0pO1xuICAgIH1cbiAgICAocmF3TWV0YWRhdGEgYXMgYW55KS5lbnRpdHlTZXRzID0gcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHM7XG4gICAgY29uc3QgZXh0cmFSZWZlcmVuY2VzID0gcmF3TWV0YWRhdGEucmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZTogUmVmZXJlbmNlKSA9PiB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0UmVmZXJlbmNlcy5maW5kKChkZWZhdWx0UmVmKSA9PiBkZWZhdWx0UmVmLm5hbWVzcGFjZSA9PT0gcmVmZXJlbmNlLm5hbWVzcGFjZSkgPT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBjb25zdCBjb252ZXJ0ZWRPdXRwdXQ6IFBhcnRpYWw8Q29udmVydGVkTWV0YWRhdGE+ID0ge1xuICAgICAgICB2ZXJzaW9uOiByYXdNZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICBhbm5vdGF0aW9uczogcmF3TWV0YWRhdGEuc2NoZW1hLmFubm90YXRpb25zLFxuICAgICAgICBuYW1lc3BhY2U6IHJhd01ldGFkYXRhLnNjaGVtYS5uYW1lc3BhY2UsXG4gICAgICAgIGVudGl0eUNvbnRhaW5lcjogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lciBhcyBFbnRpdHlDb250YWluZXIsXG4gICAgICAgIGFjdGlvbnM6IHJhd01ldGFkYXRhLnNjaGVtYS5hY3Rpb25zIGFzIEFjdGlvbltdLFxuICAgICAgICBhY3Rpb25JbXBvcnRzOiByYXdNZXRhZGF0YS5zY2hlbWEuYWN0aW9uSW1wb3J0cyxcbiAgICAgICAgZW50aXR5U2V0czogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHMgYXMgRW50aXR5U2V0W10sXG4gICAgICAgIHNpbmdsZXRvbnM6IHJhd01ldGFkYXRhLnNjaGVtYS5zaW5nbGV0b25zIGFzIFNpbmdsZXRvbltdLFxuICAgICAgICBlbnRpdHlUeXBlczogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSxcbiAgICAgICAgY29tcGxleFR5cGVzOiByYXdNZXRhZGF0YS5zY2hlbWEuY29tcGxleFR5cGVzIGFzIENvbXBsZXhUeXBlW10sXG4gICAgICAgIHR5cGVEZWZpbml0aW9uczogcmF3TWV0YWRhdGEuc2NoZW1hLnR5cGVEZWZpbml0aW9ucyBhcyBUeXBlRGVmaW5pdGlvbltdLFxuICAgICAgICByZWZlcmVuY2VzOiBkZWZhdWx0UmVmZXJlbmNlcy5jb25jYXQoZXh0cmFSZWZlcmVuY2VzKSxcbiAgICAgICAgZGlhZ25vc3RpY3M6IEFOTk9UQVRJT05fRVJST1JTLmNvbmNhdCgpXG4gICAgfTtcbiAgICBjb252ZXJ0ZWRPdXRwdXQucmVzb2x2ZVBhdGggPSBjcmVhdGVHbG9iYWxSZXNvbHZlKGNvbnZlcnRlZE91dHB1dCBhcyBDb252ZXJ0ZWRNZXRhZGF0YSwgb2JqZWN0TWFwKTtcbiAgICByZXR1cm4gY29udmVydGVkT3V0cHV0IGFzIENvbnZlcnRlZE1ldGFkYXRhO1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi93cml0ZWJhY2snO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZmVyZW5jZSwgQ29tcGxleFR5cGUsIFR5cGVEZWZpbml0aW9uIH0gZnJvbSAnQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMnO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCA9IFtcbiAgICB7IGFsaWFzOiAnQ2FwYWJpbGl0aWVzJywgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMScsIHVyaTogJycgfSxcbiAgICB7IGFsaWFzOiAnQWdncmVnYXRpb24nLCBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEnLCB1cmk6ICcnIH0sXG4gICAgeyBhbGlhczogJ1ZhbGlkYXRpb24nLCBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMScsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ09yZy5PRGF0YS5Db3JlLlYxJywgYWxpYXM6ICdDb3JlJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLk1lYXN1cmVzLlYxJywgYWxpYXM6ICdNZWFzdXJlcycsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MScsIGFsaWFzOiAnQ29tbW9uJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEnLCBhbGlhczogJ1VJJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MScsIGFsaWFzOiAnU2Vzc2lvbicsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MScsIGFsaWFzOiAnQW5hbHl0aWNzJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEnLCBhbGlhczogJ0NvZGVMaXN0JywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxJywgYWxpYXM6ICdQZXJzb25hbERhdGEnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxJywgYWxpYXM6ICdDb21tdW5pY2F0aW9uJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEnLCBhbGlhczogJ0hUTUw1JywgdXJpOiAnJyB9XG5dO1xuXG5leHBvcnQgdHlwZSBSZWZlcmVuY2VzV2l0aE1hcCA9IFJlZmVyZW5jZVtdICYge1xuICAgIHJlZmVyZW5jZU1hcD86IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT47XG4gICAgcmV2ZXJzZVJlZmVyZW5jZU1hcD86IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT47XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFubm90YXRpb24gdG8gdGhlIGFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB1bmFsaWFzZWRWYWx1ZSB0aGUgdW5hbGlhc2VkIHZhbHVlXG4gKiBAcmV0dXJucyB0aGUgYWxpYXNlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGlhcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCwgdW5hbGlhc2VkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZXZlcnNlUmVmZXJlbmNlTWFwID0gcmVmZXJlbmNlcy5yZWR1Y2UoKG1hcDogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPiwgcmVmKSA9PiB7XG4gICAgICAgICAgICBtYXBbcmVmLm5hbWVzcGFjZV0gPSByZWY7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIGlmICghdW5hbGlhc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBsYXN0RG90SW5kZXggPSB1bmFsaWFzZWRWYWx1ZS5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHVuYWxpYXNlZFZhbHVlLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gdW5hbGlhc2VkVmFsdWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCArIDEpO1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXMucmV2ZXJzZVJlZmVyZW5jZU1hcFtuYW1lc3BhY2VdO1xuICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGAke3JlZmVyZW5jZS5hbGlhc30uJHt2YWx1ZX1gO1xuICAgIH0gZWxzZSBpZiAodW5hbGlhc2VkVmFsdWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAvLyBUcnkgdG8gc2VlIGlmIGl0J3MgYW4gYW5ub3RhdGlvbiBQYXRoIGxpa2UgdG9fU2FsZXNPcmRlci9AVUkuTGluZUl0ZW1cbiAgICAgICAgY29uc3QgW3ByZUFsaWFzLCAuLi5wb3N0QWxpYXNdID0gdW5hbGlhc2VkVmFsdWUuc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZUFsaWFzfUAke2FsaWFzKHJlZmVyZW5jZXMsIHBvc3RBbGlhcy5qb2luKCdAJykpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXNlZFZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYWxpYXNlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gYW5ub3RhdGlvbiB0byB0aGUgdW5hbGlhc2VkIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgY3VycmVudFJlZmVyZW5jZXMgZm9yIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gYWxpYXNlZFZhbHVlIHRoZSBhbGlhc2VkIHZhbHVlXG4gKiBAcmV0dXJucyB0aGUgdW5hbGlhc2VkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNhbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuYWxpYXMocmVmZXJlbmNlczogUmVmZXJlbmNlc1dpdGhNYXAsIGFsaWFzZWRWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXJlZmVyZW5jZXMucmVmZXJlbmNlTWFwKSB7XG4gICAgICAgIHJlZmVyZW5jZXMucmVmZXJlbmNlTWFwID0gcmVmZXJlbmNlcy5yZWR1Y2UoKG1hcDogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPiwgcmVmKSA9PiB7XG4gICAgICAgICAgICBtYXBbcmVmLmFsaWFzXSA9IHJlZjtcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgaWYgKCFhbGlhc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFsaWFzZWRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgW3ZvY0FsaWFzLCAuLi52YWx1ZV0gPSBhbGlhc2VkVmFsdWUuc3BsaXQoJy4nKTtcbiAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzLnJlZmVyZW5jZU1hcFt2b2NBbGlhc107XG4gICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gYCR7cmVmZXJlbmNlLm5hbWVzcGFjZX0uJHt2YWx1ZS5qb2luKCcuJyl9YDtcbiAgICB9IGVsc2UgaWYgKGFsaWFzZWRWYWx1ZS5pbmRleE9mKCdAJykgIT09IC0xKSB7XG4gICAgICAgIC8vIFRyeSB0byBzZWUgaWYgaXQncyBhbiBhbm5vdGF0aW9uIFBhdGggbGlrZSB0b19TYWxlc09yZGVyL0BVSS5MaW5lSXRlbVxuICAgICAgICBjb25zdCBbcHJlQWxpYXMsIC4uLnBvc3RBbGlhc10gPSBhbGlhc2VkVmFsdWUuc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZUFsaWFzfUAke3VuYWxpYXMocmVmZXJlbmNlcywgcG9zdEFsaWFzLmpvaW4oJ0AnKSl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxpYXNlZFZhbHVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gVGVybVRvVHlwZXMge1xuICAgICdPcmcuT0RhdGEuQXV0aG9yaXphdGlvbi5WMS5TZWN1cml0eVNjaGVtZXMnID0gJ09yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLlNlY3VyaXR5U2NoZW1lJyxcbiAgICAnT3JnLk9EYXRhLkF1dGhvcml6YXRpb24uVjEuQXV0aG9yaXphdGlvbnMnID0gJ09yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLkF1dGhvcml6YXRpb24nLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5SZXZpc2lvbnMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlJldmlzaW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkxpbmtzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5MaW5rJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuRXhhbXBsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuRXhhbXBsZVZhbHVlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuTWVzc2FnZXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLk1lc3NhZ2VUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuVmFsdWVFeGNlcHRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlZhbHVlRXhjZXB0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlJlc291cmNlRXhjZXB0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5SZXNvdXJjZUV4Y2VwdGlvblR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5EYXRhTW9kaWZpY2F0aW9uRXhjZXB0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5EYXRhTW9kaWZpY2F0aW9uRXhjZXB0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLklzTGFuZ3VhZ2VEZXBlbmRlbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkRlcmVmZXJlbmNlYWJsZUlEcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29udmVudGlvbmFsSURzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5QZXJtaXNzaW9ucycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUGVybWlzc2lvbicsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkRlZmF1bHROYW1lc3BhY2UnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkRGVmYXVsdFZhbHVlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Jc1VSTCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuSXNNZWRpYVR5cGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkNvbnRlbnREaXNwb3NpdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuQ29udGVudERpc3Bvc2l0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9wdGltaXN0aWNDb25jdXJyZW5jeScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkFkZGl0aW9uYWxQcm9wZXJ0aWVzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5BdXRvRXhwYW5kJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5BdXRvRXhwYW5kUmVmZXJlbmNlcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuTWF5SW1wbGVtZW50JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUeXBlTmFtZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9yZGVyZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlBvc2l0aW9uYWxJbnNlcnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkFsdGVybmF0ZUtleXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLkFsdGVybmF0ZUtleScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9wdGlvbmFsUGFyYW1ldGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5PcHRpb25hbFBhcmFtZXRlclR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGUnID0gJ0VkbS5Cb29sZWFuJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuU3ltYm9saWNOYW1lJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5TaW1wbGVJZGVudGlmaWVyJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db25mb3JtYW5jZUxldmVsJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbmZvcm1hbmNlTGV2ZWxUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Bc3luY2hyb25vdXNSZXF1ZXN0c1N1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5CYXRjaENvbnRpbnVlT25FcnJvclN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Jc29sYXRpb25TdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSXNvbGF0aW9uTGV2ZWwnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNyb3NzSm9pblN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DYWxsYmFja1N1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DYWxsYmFja1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNoYW5nZVRyYWNraW5nJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNoYW5nZVRyYWNraW5nVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ291bnRSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ291bnRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk5hdmlnYXRpb25SZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbmRleGFibGVCeUtleScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Ub3BTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2tpcFN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db21wdXRlU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlbGVjdFN1cHBvcnQnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VsZWN0U3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5CYXRjaFN1cHBvcnRUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU29ydFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Tb3J0UmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRXhwYW5kUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkV4cGFuZFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlYXJjaFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWFyY2hSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5LZXlBc1NlZ21lbnRTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuUXVlcnlTZWdtZW50U3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbnNlcnRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwSW5zZXJ0U3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwSW5zZXJ0U3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlVwZGF0ZVJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5VcGRhdGVSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwVXBkYXRlU3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwVXBkYXRlU3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWxldGVSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db2xsZWN0aW9uUHJvcGVydHlSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29sbGVjdGlvblByb3BlcnR5UmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuT3BlcmF0aW9uUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk9wZXJhdGlvblJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkFubm90YXRpb25WYWx1ZXNJblF1ZXJ5U3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk1vZGlmaWNhdGlvblF1ZXJ5T3B0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Nb2RpZmljYXRpb25RdWVyeU9wdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5SZWFkUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlJlYWRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DdXN0b21IZWFkZXJzJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbVBhcmFtZXRlcicsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3VzdG9tUXVlcnlPcHRpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbVBhcmFtZXRlcicsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTWVkaWFMb2NhdGlvblVwZGF0ZVN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFwcGx5U3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWRUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkdyb3VwYWJsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFnZ3JlZ2F0YWJsZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMnID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuTGV2ZWxlZEhpZXJhcmNoeScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5SZWN1cnNpdmVIaWVyYXJjaHknID0gJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5SZWN1cnNpdmVIaWVyYXJjaHlUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkF2YWlsYWJsZU9uQWdncmVnYXRlcycgPSAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkF2YWlsYWJsZU9uQWdncmVnYXRlc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5pbXVtJyA9ICdFZG0uUHJpbWl0aXZlVHlwZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0nID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuRXhjbHVzaXZlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVmFsdWVzJyA9ICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVmFsdWUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NdWx0aXBsZU9mJyA9ICdFZG0uRGVjaW1hbCcsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkNvbnN0cmFpbnRUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuSXRlbXNPZicgPSAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuSXRlbXNPZlR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5PcGVuUHJvcGVydHlUeXBlQ29uc3RyYWludCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUXVhbGlmaWVkVHlwZU5hbWUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5EZXJpdmVkVHlwZUNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFR5cGVOYW1lJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQWxsb3dlZFRlcm1zJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUZXJtTmFtZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkFwcGxpY2FibGVUZXJtcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUXVhbGlmaWVkVGVybU5hbWUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhJdGVtcycgPSAnRWRtLkludDY0JyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluSXRlbXMnID0gJ0VkbS5JbnQ2NCcsXG4gICAgJ09yZy5PRGF0YS5NZWFzdXJlcy5WMS5TY2FsZScgPSAnRWRtLkJ5dGUnLFxuICAgICdPcmcuT0RhdGEuTWVhc3VyZXMuVjEuRHVyYXRpb25HcmFudWxhcml0eScgPSAnT3JnLk9EYXRhLk1lYXN1cmVzLlYxLkR1cmF0aW9uR3JhbnVsYXJpdHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkRpbWVuc2lvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BY2N1bXVsYXRpdmVNZWFzdXJlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuUm9sbGVkVXBQcm9wZXJ0eUNvdW50JyA9ICdFZG0uSW50MTYnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuUGxhbm5pbmdBY3Rpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydGllcycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VydmljZVZlcnNpb24nID0gJ0VkbS5JbnQzMicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZXJ2aWNlU2NoZW1hVmVyc2lvbicgPSAnRWRtLkludDMyJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRGb3InID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNMYW5ndWFnZUlkZW50aWZpZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0Rm9ybWF0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEZvcm1hdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNVcHBlckNhc2UnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0N1cnJlbmN5JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNVbml0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVW5pdFNwZWNpZmljU2NhbGUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVuaXRTcGVjaWZpY1ByZWNpc2lvbicgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2Vjb25kYXJ5S2V5JyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1pbk9jY3VycycgPSAnRWRtLkludDY0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1heE9jY3VycycgPSAnRWRtLkludDY0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFzc29jaWF0aW9uRW50aXR5JyA9ICdFZG0uTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZXJpdmVkTmF2aWdhdGlvbicgPSAnRWRtLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWFza2VkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWFza2VkQWx3YXlzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNPYmplY3RNYXBwaW5nJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0luc3RhbmNlQW5ub3RhdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXBwbGljYXRpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5BcHBsaWNhdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGltZXN0YW1wJyA9ICdFZG0uRGF0ZVRpbWVPZmZzZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRXJyb3JSZXNvbHV0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRXJyb3JSZXNvbHV0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcycgPSAnRWRtLkNvbXBsZXhUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLm51bWVyaWNTZXZlcml0eScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk51bWVyaWNNZXNzYWdlU2V2ZXJpdHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1heGltdW1OdW1lcmljTWVzc2FnZVNldmVyaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTnVtZXJpY01lc3NhZ2VTZXZlcml0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNBY3Rpb25Dcml0aWNhbCcgPSAnRWRtLkJvb2xlYW4nLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXR0cmlidXRlcycgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWxhdGVkUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdFZG0uQW5ub3RhdGlvblBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSW50ZXJ2YWwnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5JbnRlcnZhbFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLldlYWtSZWZlcmVudGlhbENvbnN0cmFpbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5XZWFrUmVmZXJlbnRpYWxDb25zdHJhaW50VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc05hdHVyYWxQZXJzb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFJlbGV2YW50UXVhbGlmaWVycycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpbXBsZUlkZW50aWZpZXInLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0TWFwcGluZycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdE1hcHBpbmdUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhckhhbGZ5ZWFyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclF1YXJ0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyTW9udGgnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyV2VlaycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGF5T2ZDYWxlbmRhck1vbnRoJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkNhbGVuZGFyWWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFySGFsZnllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhclF1YXJ0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhck1vbnRoJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXJXZWVrJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhckRhdGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFBlcmlvZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclBlcmlvZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclF1YXJ0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFdlZWsnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXJXZWVrJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkZpc2NhbFllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXJWYXJpYW50JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTXV0dWFsbHlFeGNsdXNpdmVUZXJtJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGUnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0QWN0aXZhdGlvblZpYScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpbXBsZUlkZW50aWZpZXInLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRWRpdGFibGVGaWVsZEZvcicgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY0tleScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5RdWFsaWZpZWROYW1lJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckRlZmF1bHRWYWx1ZScgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRGVmYXVsdFZhbHVlSGlnaCcgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU29ydE9yZGVyJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU29ydE9yZGVyVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWN1cnNpdmVIaWVyYXJjaHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWN1cnNpdmVIaWVyYXJjaHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkNyZWF0ZWRBdCcgPSAnRWRtLkRhdGVUaW1lT2Zmc2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkNyZWF0ZWRCeScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVzZXJJRCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DaGFuZ2VkQXQnID0gJ0VkbS5EYXRlVGltZU9mZnNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DaGFuZ2VkQnknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vc2VySUQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXBwbHlNdWx0aVVuaXRCZWhhdmlvckZvclNvcnRpbmdBbmRGaWx0ZXJpbmcnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkN1cnJlbmN5Q29kZXMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkNvZGVMaXN0U291cmNlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuVW5pdHNPZk1lYXN1cmUnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkNvZGVMaXN0U291cmNlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuU3RhbmRhcmRDb2RlJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuRXh0ZXJuYWxDb2RlJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuSXNDb25maWd1cmF0aW9uRGVwcmVjYXRpb25Db2RlJyA9ICdFZG0uQm9vbGVhbicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5Db250YWN0VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQWRkcmVzcycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5BZGRyZXNzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuSXNFbWFpbEFkZHJlc3MnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuSXNQaG9uZU51bWJlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5FdmVudCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5FdmVudERhdGEnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLlRhc2snID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuVGFza0RhdGEnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLk1lc3NhZ2UnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuTWVzc2FnZURhdGEnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5IaWVyYXJjaHkudjEuUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5IaWVyYXJjaHkudjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5FbnRpdHlTZW1hbnRpY3MnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5FbnRpdHlTZW1hbnRpY3NUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkZpZWxkU2VtYW50aWNzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuRmllbGRTZW1hbnRpY3NUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlQZXJzb25hbCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm9UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSWRlbnRpZmljYXRpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEFic3RyYWN0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQmFkZ2UnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkJhZGdlVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlN0YXR1c0luZm8nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEFic3RyYWN0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvbnMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db250YWN0cycgPSAnRWRtLkFubm90YXRpb25QYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTWVkaWFSZXNvdXJjZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTWVkaWFSZXNvdXJjZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5LUEknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLktQSVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnREZWZpbml0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlZhbHVlQ3JpdGljYWxpdHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlZhbHVlQ3JpdGljYWxpdHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlMYWJlbHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5TGFiZWxUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uRmllbGRzJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckZhY2V0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5RdWlja1ZpZXdGYWNldHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUXVpY2tDcmVhdGVGYWNldHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmlsdGVyRmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWZlcmVuY2VGYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUHJlc2VudGF0aW9uVmFyaWFudCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUHJlc2VudGF0aW9uVmFyaWFudFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25WYXJpYW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25WYXJpYW50VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRoaW5nUGVyc3BlY3RpdmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklzU3VtbWFyeScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUGFydE9mUHJldmlldycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTWFwJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HYWxsZXJ5JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5NdWx0aUxpbmVUZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5JbXBvcnRhbmNlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5JbXBvcnRhbmNlVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JlYXRlSGlkZGVuJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5VcGRhdGVIaWRkZW4nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRlbGV0ZUhpZGRlbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkVtcGhhc2l6ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9yZGVyQnknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvbkxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlJlY29tbWVuZGF0aW9uTGlzdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5IVE1MNS52MS5Dc3NEZWZhdWx0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEuQ3NzRGVmYXVsdHNUeXBlJ1xufVxuXG4vKipcbiAqIERpZmZlcmVudGlhdGUgYmV0d2VlbiBhIENvbXBsZXhUeXBlIGFuZCBhIFR5cGVEZWZpbml0aW9uLlxuICogQHBhcmFtIGNvbXBsZXhUeXBlRGVmaW5pdGlvblxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBjb21wbGV4IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxleFR5cGVEZWZpbml0aW9uKFxuICAgIGNvbXBsZXhUeXBlRGVmaW5pdGlvbj86IENvbXBsZXhUeXBlIHwgVHlwZURlZmluaXRpb25cbik6IGNvbXBsZXhUeXBlRGVmaW5pdGlvbiBpcyBDb21wbGV4VHlwZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgISFjb21wbGV4VHlwZURlZmluaXRpb24gJiYgY29tcGxleFR5cGVEZWZpbml0aW9uLl90eXBlID09PSAnQ29tcGxleFR5cGUnICYmICEhY29tcGxleFR5cGVEZWZpbml0aW9uLnByb3BlcnRpZXNcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRGVjaW1hbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaXNEZWNpbWFsKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlT2YoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICAgIEFubm90YXRpb25QYXRoRXhwcmVzc2lvbixcbiAgICBBbm5vdGF0aW9uUmVjb3JkLFxuICAgIEFubm90YXRpb25UZXJtLFxuICAgIEV4cHJlc3Npb24sXG4gICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb24sXG4gICAgUGF0aEV4cHJlc3Npb24sXG4gICAgUHJvcGVydHlQYXRoRXhwcmVzc2lvbixcbiAgICBSYXdBbm5vdGF0aW9uLFxuICAgIFJlZmVyZW5jZVxufSBmcm9tICdAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcyc7XG5pbXBvcnQgeyB1bmFsaWFzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogUmV2ZXJ0IGFuIG9iamVjdCB0byBpdHMgcmF3IHR5cGUgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgY3VycmVudCByZWZlcmVuY2VcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSkge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIENvbGxlY3Rpb246IHZhbHVlLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0RlY2ltYWw/LigpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWNpbWFsJyxcbiAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNTdHJpbmc/LigpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlTWF0Y2hlcyA9IHZhbHVlLnZhbHVlT2YoKS5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmFsdWVNYXRjaGVzLmxlbmd0aCA+IDEgJiYgcmVmZXJlbmNlcy5maW5kKChyZWYpID0+IHJlZi5hbGlhcyA9PT0gdmFsdWVNYXRjaGVzWzBdKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICBFbnVtTWVtYmVyOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgU3RyaW5nOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzSW50Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0Zsb2F0Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRmxvYXQnLFxuICAgICAgICAgICAgRmxvYXQ6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNEYXRlPy4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGF0ZScsXG4gICAgICAgICAgICBEYXRlOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzQm9vbGVhbj8uKCkpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0Jvb2wnLFxuICAgICAgICAgICAgQm9vbDogdmFsdWUudmFsdWVPZigpID09PSAndHJ1ZSdcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdQYXRoJykge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnUGF0aCcsXG4gICAgICAgICAgICBQYXRoOiB2YWx1ZS5wYXRoXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICBBbm5vdGF0aW9uUGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdBcHBseScpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0FwcGx5JyxcbiAgICAgICAgICAgIEFwcGx5OiB2YWx1ZS5BcHBseVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ051bGwnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdOdWxsJ1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICBQcm9wZXJ0eVBhdGg6IHZhbHVlLnZhbHVlXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJyRUeXBlJykpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1JlY29yZCcsXG4gICAgICAgICAgICBSZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIHZhbHVlKSBhcyBBbm5vdGF0aW9uUmVjb3JkXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV2ZXJ0IGEgdmFsdWUgdG8gaXRzIHJhdyB2YWx1ZSBkZXBlbmRpbmcgb24gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byByZXZlcnRcbiAqIEByZXR1cm5zIHRoZSByYXcgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiByZXZlcnRWYWx1ZVRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3RvciA9IHZhbHVlPy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHN3aXRjaCAodmFsdWVDb25zdHJ1Y3Rvcikge1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY29uc3QgdmFsdWVNYXRjaGVzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgaWYgKHZhbHVlTWF0Y2hlcy5sZW5ndGggPiAxICYmIHJlZmVyZW5jZXMuZmluZCgocmVmKSA9PiByZWYuYWxpYXMgPT09IHZhbHVlTWF0Y2hlc1swXSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgRW51bU1lbWJlcjogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZzogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdCb29sJyxcbiAgICAgICAgICAgICAgICBCb29sOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkgPT09IHZhbHVlLnRvRml4ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRGVjaW1hbCcsXG4gICAgICAgICAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJlc3VsdCA9IHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzLCB2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgcmVzdHJpY3RlZEtleXMgPSBbJyRUeXBlJywgJ3Rlcm0nLCAnX19zb3VyY2UnLCAncXVhbGlmaWVyJywgJ0FjdGlvblRhcmdldCcsICdmdWxseVF1YWxpZmllZE5hbWUnLCAnYW5ub3RhdGlvbnMnXTtcblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgZW1iZWRkZWQgYW5ub3RhdGlvbnMgdG8gdGhlaXIgcmF3IHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIGN1cnJlbnRBbm5vdGF0aW9ucyB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gdGFyZ2V0QW5ub3RhdGlvbnMgdGhlIHBsYWNlIHdoZXJlIHdlIG5lZWQgdG8gYWRkIHRoZSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKFxuICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLFxuICAgIGN1cnJlbnRBbm5vdGF0aW9uczogYW55LFxuICAgIHRhcmdldEFubm90YXRpb25zOiBSYXdBbm5vdGF0aW9uW11cbikge1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRBbm5vdGF0aW9ucylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfYW5ub3RhdGlvbnMnKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnNba2V5XSkuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFubm90YXRpb24gPSByZXZlcnRUZXJtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBjdXJyZW50QW5ub3RhdGlvbnNba2V5XVt0ZXJtXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBbm5vdGF0aW9uLnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5hbGlhc2VkVGVybSA9IHVuYWxpYXMocmVmZXJlbmNlcywgYCR7a2V5fS4ke3Rlcm19YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmFsaWFzZWRUZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaWZpZWRTcGxpdCA9IHVuYWxpYXNlZFRlcm0uc3BsaXQoJyMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24udGVybSA9IHF1YWxpZmllZFNwbGl0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZFNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgQW5ub3RhdGlvbiB3aXRoIGEgcXVhbGlmaWVyLCBub3Qgc3VyZSB3aGVuIHRoYXQgY2FuIGhhcHBlbiBpbiByZWFsIHNjZW5hcmlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24ucXVhbGlmaWVyID0gcXVhbGlmaWVkU3BsaXRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0QW5ub3RhdGlvbnMucHVzaChwYXJzZWRBbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbn1cblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBpdGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJhdyBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHNldCBvZiByZWZlcmVuY2VcbiAqIEBwYXJhbSBjb2xsZWN0aW9uSXRlbSB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB0aGUgcmF3IHR5cGUgZXF1aXZhbGVudFxuICovXG5mdW5jdGlvbiByZXZlcnRDb2xsZWN0aW9uSXRlbVRvUmF3VHlwZShcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSxcbiAgICBjb2xsZWN0aW9uSXRlbTogYW55XG4pOlxuICAgIHwgQW5ub3RhdGlvblJlY29yZFxuICAgIHwgc3RyaW5nXG4gICAgfCBQcm9wZXJ0eVBhdGhFeHByZXNzaW9uXG4gICAgfCBQYXRoRXhwcmVzc2lvblxuICAgIHwgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb25cbiAgICB8IEFubm90YXRpb25QYXRoRXhwcmVzc2lvblxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbkl0ZW07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29sbGVjdGlvbkl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uSXRlbS5oYXNPd25Qcm9wZXJ0eSgnJFR5cGUnKSkge1xuICAgICAgICAgICAgLy8gQW5ub3RhdGlvbiBSZWNvcmRcbiAgICAgICAgICAgIGNvbnN0IG91dEl0ZW06IEFubm90YXRpb25SZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogY29sbGVjdGlvbkl0ZW0uJFR5cGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZXM6IFtdIGFzIGFueVtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ291bGQgdmFsaWRhdGUga2V5cyBhbmQgdHlwZSBiYXNlZCBvbiAkVHlwZVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW0pLmZvckVhY2goKGNvbGxlY3Rpb25LZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3RlZEtleXMuaW5kZXhPZihjb2xsZWN0aW9uS2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2xsZWN0aW9uSXRlbVtjb2xsZWN0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SXRlbS5wcm9wZXJ0eVZhbHVlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbGxlY3Rpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpIGFzIEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uS2V5ID09PSAnYW5ub3RhdGlvbnMnICYmIE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtW2NvbGxlY3Rpb25LZXldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEl0ZW0uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0QW5ub3RhdGlvbnNUb1Jhd1R5cGUocmVmZXJlbmNlcywgY29sbGVjdGlvbkl0ZW1bY29sbGVjdGlvbktleV0sIG91dEl0ZW0uYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG91dEl0ZW07XG4gICAgICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbkl0ZW0udHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgUHJvcGVydHlQYXRoOiBjb2xsZWN0aW9uSXRlbS52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uSXRlbS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICAgICAgQW5ub3RhdGlvblBhdGg6IGNvbGxlY3Rpb25JdGVtLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25JdGVtLnR5cGUgPT09ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogY29sbGVjdGlvbkl0ZW0udmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXZlcnQgYW4gYW5ub3RhdGlvbiB0ZXJtIHRvIGl0J3MgZ2VuZXJpYyBvciByYXcgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGNvbnRleHRcbiAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRlcm0gdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldmVydFRlcm1Ub0dlbmVyaWNUeXBlKHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uVGVybTxhbnk+KTogUmF3QW5ub3RhdGlvbiB7XG4gICAgY29uc3QgYmFzZUFubm90YXRpb246IFJhd0Fubm90YXRpb24gPSB7XG4gICAgICAgIHRlcm06IGFubm90YXRpb24udGVybSxcbiAgICAgICAgcXVhbGlmaWVyOiBhbm5vdGF0aW9uLnF1YWxpZmllclxuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvblxuICAgICAgICBpZiAoYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYW5ub3RhdGlvbnMnKSAmJiBPYmplY3Qua2V5cygoYW5ub3RhdGlvbiBhcyBhbnkpLmFubm90YXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBBbm5vdGF0aW9uIG9uIGEgY29sbGVjdGlvbiBpdHNlbGYsIG5vdCBzdXJlIHdoZW4gdGhhdCBoYXBwZW5zIGlmIGF0IGFsbFxuICAgICAgICAgICAgYmFzZUFubm90YXRpb24uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKHJlZmVyZW5jZXMsIChhbm5vdGF0aW9uIGFzIGFueSkuYW5ub3RhdGlvbnMsIGJhc2VBbm5vdGF0aW9uLmFubm90YXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZUFubm90YXRpb24sXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBhbm5vdGF0aW9uLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmhhc093blByb3BlcnR5KCckVHlwZScpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCByZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGFubm90YXRpb24pIGFzIGFueSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ub3RhdGlvbikgfTtcbiAgICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5NSk7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|
|
1998
|
+
|
|
1947
1999
|
return AnnotationConverter;
|
|
1948
|
-
|
|
2000
|
+
},true);
|
|
2001
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Bbm5vdGF0aW9uQ29udmVydGVyL25vZGVfbW9kdWxlcy8ucG5wbS9Ac2FwLXV4K2Fubm90YXRpb24tY29udmVydGVyQDAuNi4zL25vZGVfbW9kdWxlcy9Ac2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyL3NyYy9jb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjYuMy9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjYuMy9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci9ub2RlX21vZHVsZXMvLnBucG0vQHNhcC11eCthbm5vdGF0aW9uLWNvbnZlcnRlckAwLjYuMy9ub2RlX21vZHVsZXMvQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlci9zcmMvd3JpdGViYWNrLnRzIiwid2VicGFjazovL0Fubm90YXRpb25Db252ZXJ0ZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQW5ub3RhdGlvbkNvbnZlcnRlci93ZWJwYWNrL3N0YXJ0dXAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXdDQSx3Q0FhaUI7QUFFakI7O0dBRUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXREOzs7Ozs7R0FNRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBaUIsRUFBRSxhQUFrQjtJQUMzRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLGFBQWEsRUFBRTtRQUNyRCxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxhQUFhLENBQ2xCLFNBQW9CLEVBQ3BCLFlBQWlCLEVBQ2pCLElBQVksRUFDWixlQUF3Qjs7SUFFeEIsc0RBQXNEO0lBQ3RELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN0QixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUMsbURBQW1EO0tBQ2hGO0lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDaEUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLDhCQUE4QjtZQUM5QixNQUFNLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxHQUFHLHdCQUFZLEVBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlELFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDekM7YUFBTTtZQUNILFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUI7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDLEVBQUUsRUFBYyxDQUFDLENBQUM7SUFFbkIsa0RBQWtEO0lBQ2xELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtRQUM1Qix5REFBeUQ7UUFDekQsWUFBWSxHQUFHLFNBQVMsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0tBQzFEO1NBQU0sSUFBSSxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxTQUFTLEVBQUU7UUFDdEQsNkNBQTZDO1FBQzdDLFlBQVksR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUNsRDtTQUFNLElBQUksWUFBWSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUU7UUFDMUMsNkVBQTZFO1FBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsZ0NBQW9CLEVBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BGLFlBQVk7WUFDUixlQUFTLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsbUNBQUksU0FBUyxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDakg7SUFFRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUM5QixDQUFDLE9BQThCLEVBQUUsT0FBZSxFQUFFLEVBQUU7O1FBQ2hELE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUU7WUFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQzNCLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUMsQ0FBQztRQUVGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDOUIsT0FBTyxPQUFPLENBQUM7U0FDbEI7UUFFRCxPQUFPLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFFLGFBQWE7UUFDYixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxLQUFLLGdCQUFnQixFQUFFO1lBQ3pELE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxNQUFNLFVBQVUsR0FBRyxhQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUFHLElBQUksQ0FBQyxDQUFDO1lBRXBGLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7Z0JBQzVCLE9BQU8sT0FBTyxDQUFDO2FBQ2xCO1lBQ0QsT0FBTyxLQUFLLENBQ1IsZUFBZSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQ3JFLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQ25CLEdBQUcsQ0FDTixDQUFDO1NBQ0w7UUFFRCxpQ0FBaUM7UUFDakMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUN4QixJQUFJLE9BQTJCLENBQUM7WUFDaEMsSUFBSSxPQUFPLEtBQUssaUJBQWlCLEVBQUU7Z0JBQy9CLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNsQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7Z0JBQzVCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzthQUNqQztZQUVELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtnQkFDdkIsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZGLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQXFCLEVBQUUsRUFBRTtvQkFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7d0JBQ2hELE9BQU8sQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3FCQUMvRTtnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFFSCxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFFLE9BQU8sT0FBTyxDQUFDO2FBQ2xCO1NBQ0o7UUFFRCxxQ0FBcUM7UUFDckMsUUFBUSxhQUFPLENBQUMsTUFBTSwwQ0FBRSxLQUFLLEVBQUU7WUFDM0IsS0FBSyxpQkFBaUI7Z0JBQ2xCO29CQUNJLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUF5QixDQUFDO29CQUV0RCxJQUFJLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxLQUFLLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRTt3QkFDOUQsT0FBTyxPQUFPLENBQUM7cUJBQ2xCO29CQUVELHNEQUFzRDtvQkFDdEQsTUFBTSxXQUFXLEdBQ2IsdUJBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQ0FDdkMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1DQUN2QyxXQUFXLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFL0MsSUFBSSxXQUFXLEVBQUU7d0JBQ2IsT0FBTyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7d0JBQzdCLE9BQU8sT0FBTyxDQUFDO3FCQUNsQjtpQkFDSjtnQkFDRCxNQUFNO1lBRVYsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxXQUFXLENBQUMsQ0FBQztnQkFDZCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBK0IsQ0FBQztnQkFFNUQsSUFBSSxPQUFPLEtBQUssRUFBRSxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7b0JBQ3ZDLDhEQUE4RDtvQkFDOUQsT0FBTyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO29CQUN4QyxPQUFPLE9BQU8sQ0FBQztpQkFDbEI7Z0JBRUQsSUFBSSxPQUFPLEtBQUssR0FBRyxFQUFFO29CQUNqQixPQUFPLE9BQU8sQ0FBQztpQkFDbEI7Z0JBRUQsSUFBSSxPQUFPLEtBQUssNEJBQTRCLEVBQUU7b0JBQzFDLE1BQU0sMEJBQTBCLEdBQUcsV0FBVyxDQUFDLHlCQUF5QixDQUFDO29CQUN6RSxPQUFPLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDO29CQUM1QyxPQUFPLE9BQU8sQ0FBQztpQkFDbEI7Z0JBRUQsNERBQTREO2dCQUM1RCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDL0IsT0FBTyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BGLE9BQU8sT0FBTyxDQUFDO2FBQ2xCO1lBRUQsS0FBSyxZQUFZO2dCQUNiO29CQUNJLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFvQixDQUFDO29CQUVqRCxJQUFJLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxLQUFLLE9BQU8sRUFBRTt3QkFDdkMsT0FBTyxPQUFPLENBQUM7cUJBQ2xCO29CQUVELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQy9ELElBQUksUUFBUSxFQUFFO3dCQUNWLE9BQU8sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO3dCQUMxQixPQUFPLE9BQU8sQ0FBQztxQkFDbEI7b0JBRUQsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM3RSxJQUFJLGtCQUFrQixFQUFFO3dCQUNwQixPQUFPLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDO3dCQUNwQyxPQUFPLE9BQU8sQ0FBQztxQkFDbEI7b0JBRUQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxNQUFNLEVBQUU7d0JBQ1IsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7d0JBQ3hCLE9BQU8sT0FBTyxDQUFDO3FCQUNsQjtpQkFDSjtnQkFDRCxNQUFNO1lBRVYsS0FBSyxjQUFjLENBQUMsQ0FBQztnQkFDakIsbUNBQW1DO2dCQUNuQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRixPQUFPLE9BQU8sQ0FBQzthQUNsQjtZQUVELEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ1gsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQWdCLENBQUM7Z0JBRTdDLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxPQUFPLENBQUM7aUJBQ2xCO2dCQUVELElBQUksT0FBTyxLQUFLLGdCQUFnQixJQUFJLE9BQU8sS0FBSyxHQUFHLEVBQUU7b0JBQ2pELE9BQU8sT0FBTyxDQUFDO2lCQUNsQjtnQkFFRCxJQUFJLE9BQU8sS0FBSyxZQUFZLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtvQkFDakQsT0FBTyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO29CQUN4QyxPQUFPLE9BQU8sQ0FBQztpQkFDbEI7Z0JBRUQsTUFBTSxXQUFXLEdBQ2IsaUJBQVcsQ0FBQyxVQUFVLENBQUMsT0FBYyxDQUFDLG1DQUN0QyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQXNCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBRXBGLElBQUksV0FBVyxFQUFFO29CQUNiLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO29CQUM3QixPQUFPLE9BQU8sQ0FBQztpQkFDbEI7Z0JBQ0QsTUFBTTthQUNUO1lBRUQsS0FBSyxVQUFVO2dCQUNYO29CQUNJLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFrQixDQUFDO29CQUUvQyxvREFBb0Q7b0JBQ3BELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFxQyxDQUFDO29CQUMvRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7d0JBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNsRCxJQUFJLFFBQVEsRUFBRTs0QkFDVixPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQzs0QkFDMUIsT0FBTyxPQUFPLENBQUM7eUJBQ2xCO3dCQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEUsSUFBSSxrQkFBa0IsRUFBRTs0QkFDcEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQzs0QkFDcEMsT0FBTyxPQUFPLENBQUM7eUJBQ2xCO3FCQUNKO2lCQUNKO2dCQUNELE1BQU07WUFFVixLQUFLLGlCQUFpQjtnQkFDbEIsTUFBTSxjQUFjLEdBQUksT0FBTyxDQUFDLE1BQTBCLENBQUMsYUFBYSxDQUFDO2dCQUN6RSxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7b0JBQzlCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNqRSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQy9CLE9BQU8sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNwRixPQUFPLE9BQU8sQ0FBQztpQkFDbEI7Z0JBQ0QsTUFBTTtZQUVWLEtBQUssb0JBQW9CO2dCQUNyQixtREFBbUQ7Z0JBQ25ELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUcsT0FBTyxDQUFDLE1BQTZCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRixPQUFPLE9BQU8sQ0FBQztZQUVuQjtnQkFDSSxJQUFJLE9BQU8sS0FBSyxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sT0FBTyxDQUFDO2lCQUNsQjtnQkFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3pCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDekMsT0FBTyxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDMUUsT0FBTyxPQUFPLENBQUM7aUJBQ2xCO1NBQ1I7UUFFRCxPQUFPLEtBQUssQ0FDUixZQUFZLE9BQU8sa0JBQWtCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsQ0FDckcsQ0FBQztJQUNOLENBQUMsRUFDRCxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQ3pELENBQUM7SUFFRixjQUFjO0lBQ2QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDaEIsSUFBSSxlQUFlLEVBQUU7WUFDakIsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN0RyxTQUFTLENBQUMsUUFBUSxDQUNkLHlDQUF5QztnQkFDckMsSUFBSTtnQkFDSixJQUFJO2dCQUNKLElBQUk7Z0JBQ0osSUFBSTtnQkFDSiwwSkFBMEo7Z0JBQzFKLHFCQUFxQjtnQkFDckIsZUFBZTtnQkFDZixHQUFHO2dCQUNILElBQUk7Z0JBQ0osaUJBQWlCO2dCQUNqQixjQUFjO2dCQUNkLEdBQUc7Z0JBQ0gsSUFBSTtnQkFDSixvQkFBb0I7Z0JBQ3BCLElBQUk7Z0JBQ0osR0FBRyxDQUNWLENBQUM7U0FDTDthQUFNO1lBQ0gsU0FBUyxDQUFDLFFBQVEsQ0FDZCx5Q0FBeUM7Z0JBQ3JDLElBQUk7Z0JBQ0osSUFBSTtnQkFDSixJQUFJO2dCQUNKLDBKQUEwSjtnQkFDMUoscUJBQXFCO2dCQUNyQixZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNmLEdBQUc7Z0JBQ0gsSUFBSTtnQkFDSix3QkFBd0I7Z0JBQ3hCLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsR0FBRyxDQUNWLENBQUM7U0FDTDtLQUNKO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFlO0lBQ3JDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQ2YsU0FBb0IsRUFDcEIsYUFBa0IsRUFDbEIsV0FBbUIsRUFDbkIsZUFBdUIsRUFDdkIsYUFBcUIsRUFDckIsYUFBeUIsRUFDekIsUUFBZ0I7SUFFaEIsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1FBQzdCLE9BQU8sU0FBUyxDQUFDO0tBQ3BCO0lBQ0QsUUFBUSxhQUFhLENBQUMsSUFBSSxFQUFFO1FBQ3hCLEtBQUssUUFBUTtZQUNULE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNoQyxLQUFLLEtBQUs7WUFDTixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFDN0IsS0FBSyxNQUFNO1lBQ1AsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQzlCLEtBQUssU0FBUztZQUNWLE9BQU8sbUJBQU8sRUFBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsS0FBSyxNQUFNO1lBQ1AsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQzlCLEtBQUssWUFBWTtZQUNiLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQVUsQ0FBQyxnQ0FBb0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDckUsT0FBTyxTQUFTLENBQUM7YUFDcEI7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUV2QixLQUFLLGNBQWM7WUFDZixPQUFPO2dCQUNILElBQUksRUFBRSxjQUFjO2dCQUNwQixLQUFLLEVBQUUsYUFBYSxDQUFDLFlBQVk7Z0JBQ2pDLGtCQUFrQixFQUFFLFFBQVE7Z0JBQzVCLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDLE1BQU07Z0JBQ2hHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxhQUFhO2FBQ3JDLENBQUM7UUFDTixLQUFLLHdCQUF3QjtZQUN6QixPQUFPO2dCQUNILElBQUksRUFBRSx3QkFBd0I7Z0JBQzlCLEtBQUssRUFBRSxhQUFhLENBQUMsc0JBQXNCO2dCQUMzQyxrQkFBa0IsRUFBRSxRQUFRO2dCQUM1QixPQUFPLEVBQUUsYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsQ0FBQztxQkFDOUYsTUFBTTtnQkFDWCxDQUFDLGlCQUFpQixDQUFDLEVBQUUsYUFBYTthQUNyQyxDQUFDO1FBQ04sS0FBSyxnQkFBZ0I7WUFDakIsT0FBTztnQkFDSCxJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixLQUFLLEVBQUUsYUFBYSxDQUFDLGNBQWM7Z0JBQ25DLGtCQUFrQixFQUFFLFFBQVE7Z0JBQzVCLE9BQU8sRUFBRSxhQUFhLENBQ2xCLFNBQVMsRUFDVCxhQUFhLEVBQ2IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQy9DLFdBQVcsQ0FDZCxDQUFDLE1BQU07Z0JBQ1IsZUFBZSxFQUFFLFdBQVc7Z0JBQzVCLElBQUksRUFBRSxFQUFFO2dCQUNSLElBQUksRUFBRSxFQUFFO2dCQUNSLENBQUMsaUJBQWlCLENBQUMsRUFBRSxhQUFhO2FBQ3JDLENBQUM7UUFDTixLQUFLLE1BQU07WUFDUCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNoRyxJQUFJLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdEMsb0JBQW9CO2dCQUNwQixPQUFPLE9BQU8sQ0FBQzthQUNsQjtpQkFBTTtnQkFDSCxPQUFPO29CQUNILElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtvQkFDeEIsa0JBQWtCLEVBQUUsUUFBUTtvQkFDNUIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxhQUFhO2lCQUNyQyxDQUFDO2FBQ0w7UUFFTCxLQUFLLFFBQVE7WUFDVCxPQUFPLFdBQVcsQ0FDZCxTQUFTLEVBQ1QsV0FBVyxFQUNYLGFBQWEsRUFDYixlQUFlLEVBQ2YsYUFBYSxFQUNiLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLFFBQVEsQ0FDWCxDQUFDO1FBQ04sS0FBSyxZQUFZO1lBQ2IsT0FBTyxlQUFlLENBQ2xCLFNBQVMsRUFDVCxhQUFhLEVBQ2IsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsYUFBYSxDQUFDLFVBQVUsRUFDeEIsUUFBUSxDQUNYLENBQUM7UUFDTixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxJQUFJLENBQUM7UUFDVjtZQUNJLE9BQU8sYUFBYSxDQUFDO0tBQzVCO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDdEIsU0FBb0IsRUFDcEIsZUFBdUIsRUFDdkIsZ0JBQXdCLEVBQ3hCLGVBQXdCO0lBRXhCLElBQUksVUFBVSxHQUFJLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZELElBQUksZUFBZSxFQUFFO1FBQ2pCLGVBQWUsR0FBRyxHQUFHLCtCQUFtQixFQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwRixVQUFVLEdBQUksbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDdEQ7SUFFRCxTQUFTLENBQUMsUUFBUSxDQUNkLCtDQUErQyxlQUFlLHdDQUF3QyxVQUFVOzt1QkFFakcsZ0JBQWdCO3FCQUNsQixlQUFlOzs7ZUFHckIsQ0FDVixDQUFDO0lBRUYsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsaUJBQXNCO0lBQ3BELE9BQU8sQ0FDSCxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxLQUFLLCtDQUErQztZQUN4RSxpQkFBaUIsQ0FBQyxLQUFLLEtBQUssZ0RBQWdELENBQUMsQ0FDcEYsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FDcEIsU0FBb0IsRUFDcEIsV0FBbUIsRUFDbkIsYUFBa0IsRUFDbEIsZUFBbUMsRUFDbkMsZ0JBQWtDO0lBRWxDLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxXQUFXLEVBQUU7UUFDdkMsVUFBVSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0tBQzdHO1NBQU07UUFDSCxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN6RDtJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDaEIsU0FBb0IsRUFDcEIsV0FBbUIsRUFDbkIsYUFBa0IsRUFDbEIsZUFBbUMsRUFDbkMsYUFBcUIsRUFDckIsZ0JBQWtDLEVBQ2xDLFVBQWtCOztJQUVsQixNQUFNLGNBQWMsR0FBUTtRQUN4QixLQUFLLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQztRQUNoRyxrQkFBa0IsRUFBRSxVQUFVO1FBQzlCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxhQUFhO0tBQ3JDLENBQUM7SUFFRiw0QkFBNEI7SUFDNUIsZ0JBQUksRUFBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRTs7UUFDckMsZ0hBQWdIO1FBQ2hILDBDQUEwQztRQUMxQyxJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLGdCQUFnQixDQUFDLFdBQVcsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6RSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1NBQzlDO2FBQU07WUFDSCxXQUFXLEdBQUcsZUFBUyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQywwQ0FBRSxXQUFXLENBQUM7U0FDNUU7UUFFRCxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsT0FBTyxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUU7WUFDckMsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7WUFDL0IsVUFBVSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7WUFDcEMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsYUFBYSxDQUFDO1lBQzlDLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsV0FBVyxhQUFYLFdBQVcsY0FBWCxXQUFXLEdBQUksRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLGlCQUFpQixHQUFHLHNCQUFnQixDQUFDLGNBQWMsMENBQUUsTUFBTSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLEVBQUU7UUFDbkcsZ0JBQUksRUFBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUM3QyxVQUFVLENBQ04sU0FBUyxFQUNULGFBQWEsRUFDYixXQUFXLEVBQ1gsYUFBYSxDQUFDLElBQUksRUFDbEIsYUFBYSxFQUNiLGFBQWEsQ0FBQyxLQUFLLEVBQ25CLEdBQUcsVUFBVSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FDeEMsQ0FDSixDQUFDO1FBRUYsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFbkIsSUFBSSx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQzdDLGdCQUFJLEVBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRTs7WUFDekMsNERBQTREO1lBQzVELElBQUksWUFBWSxHQUFHLG1CQUFhLENBQUMsT0FBTywwQ0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVyRSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNmLDZDQUE2QztnQkFDN0MsWUFBWSxHQUFHLGVBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsMENBQUUsTUFBTSxDQUFDO2FBQ3ZGO1lBRUQsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZiwrQ0FBK0M7Z0JBQy9DLFlBQVksR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxhQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsT0FBTyxHQUFFO29CQUN4QixZQUFZLEdBQUcsU0FBUyxDQUFDO2lCQUM1QjthQUNKO1lBRUQsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZixTQUFTLENBQUMsUUFBUSxDQUNkLGlDQUFpQyxpQkFBaUIsQ0FBQyxNQUFNLGtCQUFrQixjQUFjLENBQUMsa0JBQWtCLEdBQUcsQ0FDbEgsQ0FBQzthQUNMO1lBQ0QsT0FBTyxZQUFZLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7S0FDTjtJQUNELE9BQU8saUJBQWlCLENBQUM7QUFDN0IsQ0FBQztBQXVCRDs7Ozs7R0FLRztBQUNILFNBQVMsd0JBQXdCLENBQUMsb0JBQTJCO0lBQ3pELElBQUksSUFBSSxHQUFvQixvQkFBNEIsQ0FBQyxJQUFJLENBQUM7SUFDOUQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdkQsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzdDLElBQUksR0FBRyxjQUFjLENBQUM7U0FDekI7YUFBTSxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDNUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztTQUNqQjthQUFNLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3RELElBQUksR0FBRyxnQkFBZ0IsQ0FBQztTQUMzQjthQUFNLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1lBQzlELElBQUksR0FBRyx3QkFBd0IsQ0FBQztTQUNuQzthQUFNLElBQ0gsT0FBTyxZQUFZLEtBQUssUUFBUTtZQUNoQyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQ3hGO1lBQ0UsSUFBSSxHQUFHLFFBQVEsQ0FBQztTQUNuQjthQUFNLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO1lBQ3pDLElBQUksR0FBRyxRQUFRLENBQUM7U0FDbkI7S0FDSjtTQUFNLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUMzQixJQUFJLEdBQUcsaUJBQWlCLENBQUM7S0FDNUI7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3BCLFNBQW9CLEVBQ3BCLGFBQWtCLEVBQ2xCLFdBQW1CLEVBQ25CLGVBQXVCLEVBQ3ZCLGFBQXFCLEVBQ3JCLG9CQUEyQixFQUMzQixTQUFpQjtJQUVqQixNQUFNLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFaEYsUUFBUSx3QkFBd0IsRUFBRTtRQUM5QixLQUFLLGNBQWM7WUFDZixPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQWdCLEVBQUU7Z0JBQ3hFLE1BQU0sTUFBTSxHQUFpQjtvQkFDekIsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLEtBQUssRUFBRSxZQUFZLENBQUMsWUFBWTtvQkFDaEMsa0JBQWtCLEVBQUUsR0FBRyxTQUFTLElBQUksV0FBVyxFQUFFO2lCQUM3QyxDQUFDO2dCQUVULGdCQUFJLEVBQ0EsTUFBTSxFQUNOLFNBQVMsRUFDVCxHQUFHLEVBQUU7O29CQUNELDBCQUFhLENBQVcsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQzt5QkFDcEYsTUFBTSxtQ0FBSyxFQUFlO2lCQUFBLENBQUMsK0NBQStDO2lCQUN0RixDQUFDO2dCQUVGLE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRVAsS0FBSyxNQUFNO1lBQ1AsbUJBQW1CO1lBQ25CLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQzFDLE9BQU8sYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDdkYsQ0FBQyxDQUFDLENBQUM7UUFFUCxLQUFLLGdCQUFnQjtZQUNqQixPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsRUFBRTtnQkFDOUQsTUFBTSxNQUFNLEdBQUc7b0JBQ1gsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsS0FBSyxFQUFFLGNBQWMsQ0FBQyxjQUFjO29CQUNwQyxrQkFBa0IsRUFBRSxHQUFHLFNBQVMsSUFBSSxhQUFhLEVBQUU7b0JBQ25ELGVBQWUsRUFBRSxXQUFXO29CQUM1QixJQUFJLEVBQUUsRUFBRTtvQkFDUixJQUFJLEVBQUUsRUFBRTtpQkFDSixDQUFDO2dCQUVULGdCQUFJLEVBQ0EsTUFBTSxFQUNOLFNBQVMsRUFDVCxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FDbkcsQ0FBQztnQkFFRixPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztRQUVQLEtBQUssd0JBQXdCO1lBQ3pCLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUM1RCxNQUFNLE1BQU0sR0FBRztvQkFDWCxJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixLQUFLLEVBQUUsZUFBZSxDQUFDLHNCQUFzQjtvQkFDN0Msa0JBQWtCLEVBQUUsR0FBRyxTQUFTLElBQUksVUFBVSxFQUFFO2lCQUM1QyxDQUFDO2dCQUVULGdCQUFJLEVBQ0EsTUFBTSxFQUNOLFNBQVMsRUFDVCxHQUFHLEVBQUUsQ0FDRCxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsc0JBQXNCLEVBQUUsV0FBVyxDQUFDO3FCQUN2RixNQUFNLENBQ2xCLENBQUM7Z0JBRUYsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFUCxLQUFLLFFBQVE7WUFDVCxPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxFQUFFO2dCQUM1RCxPQUFPLFdBQVcsQ0FDZCxTQUFTLEVBQ1QsV0FBVyxFQUNYLGFBQWEsRUFDYixlQUFlLEVBQ2YsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixHQUFHLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FDOUIsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUFDO1FBRVAsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssSUFBSTtZQUNMLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxRCxLQUFLLFFBQVE7WUFDVCxPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUM1QyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO29CQUM5RCxPQUFPLFdBQVcsQ0FBQztpQkFDdEI7cUJBQU07b0JBQ0gsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDO2lCQUM3QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1FBRVA7WUFDSSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ25DLE9BQU8sRUFBRSxDQUFDO2FBQ2I7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7S0FDM0M7QUFDTCxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDM0IsT0FBMEQ7SUFFMUQsT0FBTyxDQUFDLENBQUUsT0FBa0MsQ0FBQyxjQUFjLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsU0FBUyxDQUFDLFVBQTZCLEVBQUUsU0FBaUI7SUFDL0QsT0FBTyx1QkFBVyxFQUFDLGlCQUFLLEVBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFNBQW9CLEVBQUUsTUFBVyxFQUFFLGFBQTRCOztJQUN0RixJQUFJLFVBQWUsQ0FBQztJQUNwQixJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUU7UUFDdEIsVUFBVSxHQUFHLFdBQVcsQ0FDcEIsU0FBUyxFQUNULGFBQWEsQ0FBQyxJQUFJLEVBQ2xCLE1BQU0sRUFDTixFQUFFLEVBQ0QsYUFBcUIsQ0FBQyxRQUFRLEVBQy9CLGFBQWEsQ0FBQyxNQUFNLEVBQ25CLGFBQXFCLENBQUMsa0JBQWtCLENBQzVDLENBQUM7S0FDTDtTQUFNLElBQUksYUFBYSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7UUFDL0MsVUFBVSxHQUFHLFVBQVUsQ0FDbkIsU0FBUyxFQUNULE1BQU0sRUFDTixhQUFhLENBQUMsSUFBSSxFQUNsQixFQUFFLEVBQ0QsYUFBcUIsQ0FBQyxRQUFRLEVBQy9CLG1CQUFhLENBQUMsS0FBSyxtQ0FBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUNsRCxhQUFxQixDQUFDLGtCQUFrQixDQUM1QyxDQUFDO0tBQ0w7U0FBTSxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUU7UUFDakMsVUFBVSxHQUFHLGVBQWUsQ0FDeEIsU0FBUyxFQUNULE1BQU0sRUFDTixhQUFhLENBQUMsSUFBSSxFQUNsQixFQUFFLEVBQ0QsYUFBcUIsQ0FBQyxRQUFRLEVBQy9CLGFBQWEsQ0FBQyxVQUFVLEVBQ3ZCLGFBQXFCLENBQUMsa0JBQWtCLENBQzVDLENBQUM7S0FDTDtTQUFNO1FBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQsUUFBUSxPQUFPLFVBQVUsRUFBRTtRQUN2QixLQUFLLFFBQVE7WUFDVCwyQ0FBMkM7WUFDM0MsVUFBVSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU07UUFDVixLQUFLLFNBQVM7WUFDViwyQ0FBMkM7WUFDM0MsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLE1BQU07UUFDVixLQUFLLFFBQVE7WUFDVCxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEMsTUFBTTtRQUNWO1lBQ0ksYUFBYTtZQUNiLE1BQU07S0FDYjtJQUVELFVBQVUsQ0FBQyxrQkFBa0IsR0FBSSxhQUFxQixDQUFDLGtCQUFrQixDQUFDO0lBQzFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBFLFVBQVUsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlELFVBQVUsQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUMvQyxVQUFVLENBQUMsUUFBUSxHQUFJLGFBQXFCLENBQUMsUUFBUSxDQUFDO0lBRXRELElBQUk7UUFDQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFOztZQUNqQyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsa0JBQWtCLENBQUM7WUFFcEQsZ0hBQWdIO1lBQ2hILDBDQUEwQztZQUMxQyxJQUFJLFdBQVcsQ0FBQztZQUNoQixJQUFJLGFBQWEsQ0FBQyxXQUFXLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNuRSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQzthQUMzQztpQkFBTTtnQkFDSCxXQUFXLEdBQUcsZUFBUyxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQywwQ0FBRSxXQUFXLENBQUM7YUFDL0U7WUFFRCxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsT0FBTyxDQUFDLENBQUMsZ0JBQXFCLEVBQUUsRUFBRTtnQkFDM0MsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztnQkFDeEMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQ2hELGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUM3QyxnQkFBZ0IsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLGFBQWEsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sdUJBQXVCLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSSxFQUFFLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztLQUNOO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDUixtSEFBbUg7S0FDdEg7SUFFRCxPQUFPLFVBQXdCLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsaUJBQXlCLEVBQUUsVUFBdUIsRUFBRSxVQUF5QjtJQUNuRyxNQUFNLGFBQWEsR0FBRyxHQUFHLGlCQUFpQixJQUFJLG1CQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBRXJGLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtRQUN0QixPQUFPLEdBQUcsYUFBYSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztLQUNyRDtTQUFNO1FBQ0gsT0FBTyxhQUFhLENBQUM7S0FDeEI7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFdBQXdCO0lBQzlDLE1BQU0sdUJBQXVCLEdBQW1DLEVBQUUsQ0FBQztJQUNuRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtRQUNyRSxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQThCLEVBQUUsRUFBRTtZQUN4RixNQUFNLGlCQUFpQixHQUFHLG1CQUFPLEVBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFXLENBQUM7WUFDMUYsY0FBc0IsQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUM7WUFDcEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLEVBQUU7Z0JBQzdDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLEdBQUc7b0JBQ3pDLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQXlCLEVBQUUsRUFBRTt3QkFDckUsVUFBeUIsQ0FBQyxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FDNUQsaUJBQWlCLEVBQ2pCLFdBQVcsQ0FBQyxVQUFVLEVBQ3RCLFVBQVUsQ0FDYixDQUFDO3dCQUNELFVBQWtCLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDO3dCQUNoRCxPQUFPLFVBQVUsQ0FBQztvQkFDdEIsQ0FBQyxDQUFDO29CQUNGLE1BQU0sRUFBRSxpQkFBaUI7aUJBQzVCLENBQUM7Z0JBQ0QsdUJBQXVCLENBQUMsaUJBQWlCLENBQVMsQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUM7YUFDbkY7aUJBQU07Z0JBQ0gsY0FBYyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUF5QixFQUFFLEVBQUU7b0JBQzdELE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FDOUUsQ0FBQyxtQkFBa0MsRUFBRSxFQUFFO3dCQUNuQyxPQUFPLENBQ0gsbUJBQW1CLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxJQUFJOzRCQUM1QyxtQkFBbUIsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLFNBQVMsQ0FDekQsQ0FBQztvQkFDTixDQUFDLENBQ0osQ0FBQztvQkFDRCxVQUFrQixDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztvQkFDL0MsVUFBeUIsQ0FBQyxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FDNUQsaUJBQWlCLEVBQ2pCLFdBQVcsQ0FBQyxVQUFVLEVBQ3RCLFVBQVUsQ0FDYixDQUFDO29CQUNGLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUNsQix1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztxQkFDM0Y7eUJBQU07d0JBQ0gsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUMzRTtnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sdUJBQXVCLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sU0FBUztJQUVYLElBQUksdUJBQXVCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtZQUM3QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDekMsQ0FBQztJQUVELDJCQUEyQjtRQUN2QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQ3ZDLHNCQUFzQixDQUN6QixDQUFDO0lBQ04sQ0FBQztJQUVELHFCQUFxQixDQUFDLGtCQUFzQztRQUN4RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELHFCQUFxQixDQUFDLGtCQUFzQztRQUN4RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELHNCQUFzQixDQUFDLGtCQUFzQztRQUN6RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELHVCQUF1QixDQUFDLGtCQUFzQztRQUMxRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELDBCQUEwQixDQUFDLGtCQUFzQztRQUM3RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELHdCQUF3QixDQUFDLGtCQUFzQztRQUMzRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDZixZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDakY7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsa0JBQXNDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBVUQsT0FBTyxDQUNILFFBQXFCLEVBQ3JCLEdBQWtEO1FBRWxELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN6QixPQUFPLEdBQUcsRUFBRTtnQkFDUixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEVBQUU7b0JBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUM1QyxVQUFrQixDQUFDLGtCQUFrQixFQUN0QyxVQUFVLEVBQ1YsR0FBRyxDQUNOLENBQUM7b0JBQ0YsSUFBSSxnQkFBZ0IsRUFBRTt3QkFDbEIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7cUJBQzVDO29CQUNELE9BQU8saUJBQWlCLENBQUM7Z0JBQzdCLENBQUMsRUFBRSxFQUFpQixDQUFDLENBQUM7Z0JBQ3RCLHlCQUFhLEVBQUMsU0FBUyxFQUFFLE1BQWEsQ0FBQyxDQUFDO2dCQUN4Qyx5QkFBYSxFQUFDLFNBQVMsRUFBRSxvQkFBMkIsQ0FBQyxDQUFDO2dCQUN0RCxPQUFPLFNBQXFELENBQUM7WUFDakUsQ0FBQyxDQUFDO1NBQ0w7YUFBTTtZQUNILE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFFLENBQUM7U0FDdEY7SUFDTCxDQUFDO0lBUUQsWUFBWSxXQUF3QixFQUFFLGVBQWtDO1FBTGhFLHNCQUFpQixHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBTWhFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsbUJBQW1CLENBQ2Ysa0JBQXNDLEVBQ3RDLFVBQW1HLEVBQ25HLEdBQTBEO1FBRTFELElBQUksU0FBUyxHQUE4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUYsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ3pCLE1BQU0sV0FBVyxHQUNiLE9BQU8sVUFBVSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUN0RyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzdEO1NBQ0o7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQWU7UUFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVk7UUFDbEIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFhO1FBQ2YsT0FBTyxpQkFBSyxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxPQUFPLENBQUMsS0FBeUI7O1FBQzdCLE9BQU8seUJBQU8sRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsbUNBQUksRUFBRSxDQUFDO0lBQzdELENBQUM7Q0FDSjtBQUlELFNBQVMsaUJBQWlCLENBQUMsU0FBb0IsRUFBRSxrQkFBc0M7SUFDbkYsT0FBTyxHQUFHLEVBQUU7UUFDUixJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUV0RSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLGtCQUFrQixhQUFhLENBQUMsQ0FBQztZQUNuRSxVQUFVLEdBQUcsRUFBZ0IsQ0FBQztTQUNqQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLGlDQUFpQyxDQUN0QyxTQUFvQixFQUNwQiw2QkFBOEcsRUFDOUcsVUFBdUM7SUFFdkMsT0FBTyxHQUFHLEVBQUUsQ0FDUixNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsMEJBQTBCLEVBQUUsV0FBVyxFQUFFLEVBQUU7UUFDMUYsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVwRSxnQkFBSSxFQUFDLDBCQUEwQixFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDL0MsSUFBSSxxQkFBcUIsQ0FBQztZQUMxQixJQUFJLGdCQUFnQixDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUU7Z0JBQ3hDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2hHO2lCQUFNO2dCQUNILHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2hHO1lBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUN4QixTQUFTLENBQUMsUUFBUSxDQUNkLEdBQUcsVUFBVSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsa0JBQWtCLGtEQUFrRCxXQUFXLEVBQUUsQ0FDdkgsQ0FBQztnQkFDRixxQkFBcUIsR0FBRyxFQUFTLENBQUM7YUFDckM7WUFDRCxPQUFPLHFCQUFxQixDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTywwQkFBMEIsQ0FBQztJQUN0QyxDQUFDLEVBQUUsRUFBcUYsQ0FBQyxDQUFDO0FBQ2xHLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLFNBQW9CLEVBQUUsbUJBQXdCO0lBQ3RFLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFDO0lBRTFELE9BQU8sR0FBRyxFQUFFOztRQUNSLDhCQUF1QixDQUNuQixTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLHVCQUFpQixhQUFqQixpQkFBaUIsY0FBakIsaUJBQWlCLEdBQ2IsZUFBUyxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLDBDQUFFLFdBQVcsbUNBQ3RGLEVBQUUsQ0FDVDtLQUFBLENBQUM7QUFDVixDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxTQUFvQixFQUFFLE1BQVcsRUFBRSxjQUErQjtJQUMvRixPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsRUFBRTtRQUMzRCxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRW5HLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzNDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNwQztRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUNuRSxnQkFBSSxFQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxDQUN6RCxTQUFTLENBQUMsbUJBQW1CLENBQ3hCLFVBQXlCLENBQUMsa0JBQWtCLEVBQzdDLFVBQVUsRUFDVixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQ3BGLENBQ0osQ0FBQztTQUNMO1FBQ0QsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDLEVBQUUsRUFBUyxDQUFDLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsc0JBQXNCLENBQUMsU0FBb0IsRUFBRSxrQkFBc0M7SUFDeEYsTUFBTSx3QkFBd0IsR0FBRyxrQkFBcUMsQ0FBQztJQUV2RSxnQkFBSSxFQUFDLHdCQUF3QixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRWpHLGdCQUFJLEVBQUMsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBRWxILGdCQUFJLEVBQUMsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBRWxILGdCQUFJLEVBQ0Esd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLG1CQUFtQixDQUFDLENBQzVFLENBQUM7SUFFRixPQUFPLHdCQUF3QixDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQW9CLEVBQUUsWUFBMEI7SUFDdEUsTUFBTSxrQkFBa0IsR0FBRyxZQUF5QixDQUFDO0lBRXJELGtCQUFrQixDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVuRixnQkFBSSxFQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsZ0JBQUksRUFBQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQXlCLENBQUMsQ0FBQyxDQUFDO0lBRWxHLE1BQU0sOEJBQThCLEdBQUcsWUFBWSxDQUFDLHlCQUF5QixDQUFDO0lBQzlFLGdCQUFJLEVBQ0Esa0JBQWtCLEVBQ2xCLDJCQUEyQixFQUMzQixpQ0FBaUMsQ0FDN0IsU0FBUyxFQUNULDhCQUF3RSxFQUN4RSxZQUFZLENBQ2YsQ0FDSixDQUFDO0lBRUYsT0FBTyxrQkFBa0IsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFvQixFQUFFLFlBQTBCO0lBQ3RFLE1BQU0sa0JBQWtCLEdBQUcsWUFBeUIsQ0FBQztJQUVyRCxrQkFBa0IsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFbkYsZ0JBQUksRUFBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLGdCQUFJLEVBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUF5QixDQUFDLENBQUMsQ0FBQztJQUVsRyxNQUFNLDhCQUE4QixHQUFHLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQztJQUM5RSxnQkFBSSxFQUNBLGtCQUFrQixFQUNsQiwyQkFBMkIsRUFDM0IsaUNBQWlDLENBQzdCLFNBQVMsRUFDVCw4QkFBd0UsRUFDeEUsWUFBWSxDQUNmLENBQ0osQ0FBQztJQUVGLE9BQU8sa0JBQWtCLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsU0FBb0IsRUFBRSxhQUE0QjtJQUN6RSxNQUFNLG1CQUFtQixHQUFHLGFBQTJCLENBQUM7SUFFeEQsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtRQUN4QyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVILGdCQUFJLEVBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRXZGLGdCQUFJLEVBQUMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQzFGLGdCQUFJLEVBQUMsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNsSCxnQkFBSSxFQUNBLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsb0JBQTZCLEVBQUUseUJBQXlCLENBQUMsQ0FDNUYsQ0FBQztJQUVGLGdCQUFJLEVBQUMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUN0QyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU87U0FDdEIsTUFBTSxDQUNILENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDVixTQUFTLENBQUMsT0FBTztRQUNqQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLGtCQUFrQjtZQUN0RCxTQUFTLENBQUMsVUFBVSxLQUFLLGNBQWMsYUFBYSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FDdEY7U0FDQSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUUsQ0FBQztRQUM1RSxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDLEVBQUUsRUFBMkIsQ0FBQyxDQUN0QyxDQUFDO0lBRUYsbUJBQW1CLENBQUMsV0FBVyxHQUFHLENBQUMsWUFBb0IsRUFBRSxxQkFBK0IsRUFBRSxFQUFFO1FBQ3hGLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLElBQUkscUJBQXFCLEVBQUU7WUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDeEc7YUFBTTtZQUNILE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUMxQjtJQUNMLENBQUMsQ0FBQztJQUVGLE9BQU8sbUJBQW1CLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsZUFBZSxDQUFDLFNBQW9CLEVBQUUsV0FBd0I7SUFDbkUsTUFBTSxpQkFBaUIsR0FBRyxXQUF1QixDQUFDO0lBRWxELGlCQUFpQixDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxnQkFBSSxFQUFDLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUVuRixnQkFBSSxFQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUU7O1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTVGLE9BQU8sZUFBUyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxtQ0FBSSxTQUFTLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekcsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLGlCQUFpQixDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHlCQUF5QixDQUM5QixTQUFvQixFQUNwQixxQkFBd0U7O0lBRXhFLE1BQU0sMkJBQTJCLEdBQUcscUJBQTJDLENBQUM7SUFFaEYsMkJBQTJCLENBQUMscUJBQXFCLEdBQUcsaUNBQTJCLENBQUMscUJBQXFCLG1DQUFJLEVBQUUsQ0FBQztJQUU1RyxJQUFJLHNCQUFzQixDQUFDLHFCQUFxQixDQUFDLEVBQUU7UUFDL0MsMkJBQTJCLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDeEc7U0FBTTtRQUNILE1BQU0sY0FBYyxHQUFHLGVBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWTthQUNsRCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsS0FBSyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsMENBQzNGLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUUsMkJBQTJCLENBQUMsWUFBWSxHQUFHLGVBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxZQUFZLE1BQUssR0FBRyxDQUFDO1FBQ2hGLDJCQUEyQixDQUFDLGNBQWMsR0FBRyxvQkFBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLElBQUksbUNBQUksRUFBRSxDQUFDO0tBQzNFO0lBRUQsZ0JBQUksRUFDQSwyQkFBMkIsRUFDM0IsWUFBWSxFQUNaLGlCQUFpQixDQUFDLFNBQVMsRUFBRyxxQkFBNEMsQ0FBQyxjQUFjLENBQUMsQ0FDN0YsQ0FBQztJQUVGLGdCQUFJLEVBQUMsMkJBQTJCLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFFdkcsT0FBTywyQkFBMkIsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxTQUFvQixFQUFFLGVBQWdDO0lBQy9FLE1BQU0scUJBQXFCLEdBQUcsZUFBK0IsQ0FBQztJQUU5RCxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakYsZ0JBQUksRUFBQyxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFFM0YsZ0JBQUksRUFBQyxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRXRHLE9BQU8scUJBQXFCLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsYUFBYSxDQUFDLFNBQW9CLEVBQUUsU0FBb0I7SUFDN0QsTUFBTSxlQUFlLEdBQUcsU0FBbUIsQ0FBQztJQUU1QyxlQUFlLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRTtRQUM1QixnQkFBSSxFQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7S0FDakc7SUFFRCxlQUFlLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRTtRQUM1QixnQkFBSSxFQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7S0FDakc7SUFFRCxnQkFBSSxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQztJQUVyRyxnQkFBSSxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFOztRQUN0Qyw4RkFBOEY7UUFDOUYseUZBQXlGO1FBQ3pGLHlGQUF5RjtRQUN6RixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUUxRyxJQUFJLGNBQWMsR0FBb0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksaUJBQWlCLEVBQUU7WUFDbkIsSUFBSSx1QkFBaUIsQ0FBQyxNQUFNLDBDQUFFLFFBQVEsRUFBRTtnQkFDcEMsY0FBYyxHQUFHLHFCQUFTLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLDBDQUFFLFdBQVcsbUNBQUksRUFBRSxDQUFDO2FBQ3ZHO2lCQUFNO2dCQUNILGNBQWM7b0JBQ1YscUJBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLHVCQUFpQixDQUFDLE1BQU0sMENBQUUsTUFBTSxJQUFJLENBQUMsMENBQUUsV0FBVyxtQ0FBSSxFQUFFLENBQUM7YUFDckc7WUFFRCxJQUFJLHdCQUFpQixDQUFDLE1BQU0sMENBQUUsTUFBTSxLQUFJLHdCQUFpQixDQUFDLE1BQU0sMENBQUUsTUFBTSxNQUFLLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDdkcsTUFBTSxlQUFlLEdBQ2pCLHFCQUFTLENBQUMsdUJBQXVCLENBQUMsdUJBQWlCLENBQUMsTUFBTSwwQ0FBRSxNQUFNLENBQUMsMENBQUUsV0FBVyxtQ0FBSSxFQUFFLENBQUM7Z0JBQzNGLGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQzNEO1NBQ0o7UUFFRCxPQUFPLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDekUsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLGVBQWUsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxzQkFBc0IsQ0FDM0IsU0FBb0IsRUFDcEIsa0JBQW1EO0lBRW5ELE1BQU0sd0JBQXdCLEdBQUcsa0JBQXFDLENBQUM7SUFFdkUsZ0JBQUksRUFDQSx3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLEdBQUcsRUFBRTs7UUFDRCw0QkFBUyxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxtQ0FDekQsU0FBUyxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxtQ0FDMUQsU0FBUyxDQUFDLDBCQUEwQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztLQUFBLENBQ3BFLENBQUM7SUFFRixnQkFBSSxFQUFDLHdCQUF3QixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRWpHLE9BQU8sd0JBQXdCLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsa0JBQWtCLENBQUMsU0FBb0IsRUFBRSxjQUE4QjtJQUM1RSxNQUFNLG9CQUFvQixHQUFHLGNBQTZCLENBQUM7SUFFM0QsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDeEcsZ0JBQUksRUFDQSxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLG9CQUE2QixFQUFFLHlCQUF5QixDQUFDLENBQzdGLENBQUM7SUFDRixnQkFBSSxFQUFDLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUV6RixPQUFPLG9CQUFvQixDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFNBQW9CLEVBQUUsaUJBQW9DO0lBQ3JGLE1BQU0sdUJBQXVCLEdBQUcsaUJBQW1DLENBQUM7SUFFcEUsZ0JBQUksRUFBQyx1QkFBdUIsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUUvRixPQUFPLHVCQUF1QixDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxXQUF3QjtJQUM1Qyx5RUFBeUU7SUFDekUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckMsV0FBVyxDQUFDLFVBQVUsR0FBRyx5QkFBaUIsQ0FBQztLQUM5QztJQUVELG1CQUFtQjtJQUNuQixNQUFNLGVBQWUsR0FBc0I7UUFDdkMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO1FBQzVCLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVM7UUFDdkMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVztRQUMzQyxVQUFVLEVBQUUseUJBQWlCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDNUQsV0FBVyxFQUFFLEVBQUU7S0FDWCxDQUFDO0lBRVQsWUFBWTtJQUNaLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUU5RCxnQkFBSSxFQUNBLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxzQkFBc0IsQ0FBQyxDQUNqRixDQUFDO0lBQ0YsZ0JBQUksRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ3pHLGdCQUFJLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUN6RyxnQkFBSSxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFDNUcsZ0JBQUksRUFBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNoRyxnQkFBSSxFQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDL0csZ0JBQUksRUFBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2xILGdCQUFJLEVBQ0EsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLHFCQUFxQixDQUFDLENBQ2hGLENBQUM7SUFFRixlQUFlLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxDQUFJLElBQVk7UUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUksU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtZQUN6QixnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDMUU7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUVGLE9BQU8sZUFBZSxDQUFDO0FBQzNCLENBQUM7QUE1Q0QsMEJBNENDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5aURELGdEQUE0QjtBQUM1QixnREFBNEI7QUFDNUIsK0NBQXdCOzs7Ozs7Ozs7OztBQ0FYLHlCQUFpQixHQUFzQjtJQUNoRCxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLDJCQUEyQixFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDMUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSwwQkFBMEIsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ3hFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtJQUN0RSxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDMUQsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ2xFLEVBQUUsU0FBUyxFQUFFLGdDQUFnQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtJQUN6RSxFQUFFLFNBQVMsRUFBRSw0QkFBNEIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDakUsRUFBRSxTQUFTLEVBQUUsaUNBQWlDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQzNFLEVBQUUsU0FBUyxFQUFFLG1DQUFtQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtJQUMvRSxFQUFFLFNBQVMsRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDN0UsRUFBRSxTQUFTLEVBQUUsc0NBQXNDLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ3JGLEVBQUUsU0FBUyxFQUFFLHVDQUF1QyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtJQUN2RixFQUFFLFNBQVMsRUFBRSwrQkFBK0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7Q0FDMUUsQ0FBQztBQU9GLFNBQVMsT0FBTyxDQUFDLE1BQWMsRUFBRSxLQUFhO0lBQzFDLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsTUFBYyxFQUFFLEtBQWE7SUFDOUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixZQUFZLENBQUMsTUFBYyxFQUFFLFNBQWlCO0lBQzFELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUZELG9DQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLE1BQWMsRUFBRSxTQUFpQjtJQUN6RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFGRCxrQ0FFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLE1BQWMsRUFBRSxTQUFpQjtJQUNsRSxPQUFPLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFGRCxvREFFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxTQUFpQjtJQUNqRSxPQUFPLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFGRCxrREFFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLEtBQUssQ0FBQyxVQUE2QixFQUFFLGNBQXNCO0lBQ3ZFLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUU7UUFDakMsVUFBVSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUE4QixFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3ZGLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ1Y7SUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ2pCLE9BQU8sY0FBYyxDQUFDO0tBQ3pCO0lBQ0QsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxJQUFJLFNBQVMsRUFBRTtRQUNYLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO0tBQ3hDO1NBQU0sSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3JDLHdFQUF3RTtRQUN4RSxNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEUsT0FBTyxHQUFHLFFBQVEsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7S0FDeEQ7U0FBTTtRQUNILE9BQU8sY0FBYyxDQUFDO0tBQ3pCO0FBQ0wsQ0FBQztBQXJCRCxzQkFxQkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixPQUFPLENBQUMsVUFBNkIsRUFBRSxZQUFnQztJQUNuRixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTtRQUMxQixVQUFVLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUE4QixFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2hGLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ1Y7SUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ2YsT0FBTyxZQUFZLENBQUM7S0FDdkI7SUFDRCxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLFlBQVksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxJQUFJLFNBQVMsRUFBRTtRQUNYLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDO0tBQzVDO1NBQU0sSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ25DLHdFQUF3RTtRQUN4RSxNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsT0FBTyxHQUFHLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7S0FDMUQ7U0FBTTtRQUNILE9BQU8sWUFBWSxDQUFDO0tBQ3ZCO0FBQ0wsQ0FBQztBQXJCRCwwQkFxQkM7QUFDWSxrQkFBVSxHQUE0QjtJQUMvQyxrQkFBa0IsRUFBRSxLQUFLO0lBQ3pCLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsb0NBQW9DLEVBQUUsS0FBSztJQUMzQyxpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLG1DQUFtQyxFQUFFLEtBQUs7SUFDMUMsNkJBQTZCLEVBQUUsSUFBSTtJQUNuQyw2QkFBNkIsRUFBRSxLQUFLO0lBQ3BDLGdDQUFnQyxFQUFFLElBQUk7SUFDdEMseUJBQXlCLEVBQUUsSUFBSTtJQUMvQix3QkFBd0IsRUFBRSxLQUFLO0lBQy9CLHVCQUF1QixFQUFFLEtBQUs7SUFDOUIsNkJBQTZCLEVBQUUsS0FBSztJQUNwQyx5QkFBeUIsRUFBRSxLQUFLO0lBQ2hDLG1CQUFtQixFQUFFLElBQUk7SUFDekIsd0JBQXdCLEVBQUUsS0FBSztJQUMvQixzQ0FBc0MsRUFBRSxJQUFJO0lBQzVDLHlCQUF5QixFQUFFLElBQUk7SUFDL0IsMEJBQTBCLEVBQUUsS0FBSztJQUNqQyxzQkFBc0IsRUFBRSxLQUFLO0lBQzdCLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsNkJBQTZCLEVBQUUsS0FBSztJQUNwQyxjQUFjLEVBQUUsS0FBSztJQUNyQixjQUFjLEVBQUUsS0FBSztJQUNyQiwrQkFBK0IsRUFBRSxLQUFLO0lBQ3RDLG9DQUFvQyxFQUFFLEtBQUs7SUFDM0MsMkJBQTJCLEVBQUUsS0FBSztJQUNsQyx5QkFBeUIsRUFBRSxLQUFLO0lBQ2hDLDJCQUEyQixFQUFFLEtBQUs7SUFDbEMsNkJBQTZCLEVBQUUsS0FBSztJQUNwQyx3QkFBd0IsRUFBRSxLQUFLO0lBQy9CLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsa0NBQWtDLEVBQUUsS0FBSztJQUN6QywwQkFBMEIsRUFBRSxLQUFLO0NBQ3BDLENBQUM7QUFDRixJQUFZLFdBMFBYO0FBMVBELFdBQVksV0FBVztJQUNuQix1R0FBMEY7SUFDMUYscUdBQXdGO0lBQ3hGLDZFQUFnRTtJQUNoRSxpRUFBb0Q7SUFDcEQsMkVBQThEO0lBQzlELDJFQUE4RDtJQUM5RCx3RkFBMkU7SUFDM0UsOEZBQWlGO0lBQ2pGLDhHQUFpRztJQUNqRyw4RUFBaUU7SUFDakUsOEVBQWlFO0lBQ2pFLDZFQUFnRTtJQUNoRSwwRUFBNkQ7SUFDN0QsNkVBQWdFO0lBQ2hFLDJFQUE4RDtJQUM5RCxvRUFBdUQ7SUFDdkQsbUVBQXNEO0lBQ3RELCtFQUFrRTtJQUNsRSxnRUFBbUQ7SUFDbkQsc0VBQXlEO0lBQ3pELGdHQUFtRjtJQUNuRiwyRUFBOEQ7SUFDOUQsK0VBQWtFO0lBQ2xFLHFFQUF3RDtJQUN4RCwrRUFBa0U7SUFDbEUscUZBQXdFO0lBQ3hFLGtFQUFxRDtJQUNyRCwyRUFBOEQ7SUFDOUQsaUZBQW9FO0lBQ3BFLDhGQUFpRjtJQUNqRixtRUFBc0Q7SUFDdEQsb0ZBQXVFO0lBQ3ZFLDBGQUE2RTtJQUM3RSw0R0FBK0Y7SUFDL0YsZ0dBQW1GO0lBQ25GLGdHQUFtRjtJQUNuRix3R0FBMkY7SUFDM0YscUZBQXdFO0lBQ3hFLHFHQUF3RjtJQUN4Rix3R0FBMkY7SUFDM0YsOEdBQWlHO0lBQ2pHLHdIQUEyRztJQUMzRyxpRkFBb0U7SUFDcEUsK0VBQWtFO0lBQ2xFLGdGQUFtRTtJQUNuRSxtRkFBc0U7SUFDdEUsc0dBQXlGO0lBQ3pGLGlGQUFvRTtJQUNwRSxvR0FBdUY7SUFDdkYsZ0hBQW1HO0lBQ25HLDRHQUErRjtJQUMvRixnSEFBbUc7SUFDbkcsZ0hBQW1HO0lBQ25HLHdGQUEyRTtJQUMzRSx3RkFBMkU7SUFDM0UsZ0hBQW1HO0lBQ25HLDhHQUFpRztJQUNqRyxnSEFBbUc7SUFDbkcsOEdBQWlHO0lBQ2pHLGdIQUFtRztJQUNuRyx3SUFBMkg7SUFDM0gsc0hBQXlHO0lBQ3pHLG1HQUFzRjtJQUN0Riw0SEFBK0c7SUFDL0csNEdBQStGO0lBQy9GLG9HQUF1RjtJQUN2Rix5R0FBNEY7SUFDNUYsK0ZBQWtGO0lBQ2xGLHNHQUF5RjtJQUN6Riw4R0FBaUc7SUFDakcsMkVBQThEO0lBQzlELDhFQUFpRTtJQUNqRSxzRkFBeUU7SUFDekUsNkVBQWdFO0lBQ2hFLDhHQUFpRztJQUNqRyxvSEFBdUc7SUFDdkcsb0VBQXVEO0lBQ3ZELG9FQUF1RDtJQUN2RCwwRUFBNkQ7SUFDN0QsNkZBQWdGO0lBQ2hGLGlFQUFvRDtJQUNwRCw0RkFBK0U7SUFDL0Usc0ZBQXlFO0lBQ3pFLG9IQUF1RztJQUN2RywrR0FBa0c7SUFDbEcsMkZBQThFO0lBQzlFLDhGQUFpRjtJQUNqRiw2REFBZ0Q7SUFDaEQsNkRBQWdEO0lBQ2hELHVEQUEwQztJQUMxQywwR0FBNkY7SUFDN0Ysb0ZBQXVFO0lBQ3ZFLGtGQUFxRTtJQUNyRSw4RkFBaUY7SUFDakYsb0ZBQXVFO0lBQ3ZFLHlGQUE0RTtJQUM1RSxrSUFBcUg7SUFDckgsZ0lBQW1IO0lBQ25ILDhIQUFpSDtJQUNqSCwwRUFBNkQ7SUFDN0QsZ0ZBQW1FO0lBQ25FLDBFQUE2RDtJQUM3RCw0RkFBK0U7SUFDL0UsMEdBQTZGO0lBQzdGLHVGQUEwRTtJQUMxRSxtRkFBc0U7SUFDdEUsa0ZBQXFFO0lBQ3JFLDhFQUFpRTtJQUNqRSxxRkFBd0U7SUFDeEUseUZBQTRFO0lBQzVFLCtFQUFrRTtJQUNsRSxxRUFBd0Q7SUFDeEQscUVBQXdEO0lBQ3hELDhGQUFpRjtJQUNqRiw4RkFBaUY7SUFDakYsOEVBQWlFO0lBQ2pFLDRFQUErRDtJQUMvRCxnSUFBbUg7SUFDbkgsNEZBQStFO0lBQy9FLDZJQUFnSTtJQUNoSSw4R0FBaUc7SUFDakcsNEdBQStGO0lBQy9GLDhFQUFpRTtJQUNqRSxvSEFBdUc7SUFDdkcsMEVBQTZEO0lBQzdELDJIQUE4RztJQUM5Ryx5SUFBNEg7SUFDNUgsOEVBQWlFO0lBQ2pFLDZFQUFnRTtJQUNoRSw4RkFBaUY7SUFDakYsc0dBQXlGO0lBQ3pGLHFGQUF3RTtJQUN4RSx3SEFBMkc7SUFDM0csbUZBQXNFO0lBQ3RFLHVGQUEwRTtJQUMxRSx3R0FBMkY7SUFDM0YsZ0hBQW1HO0lBQ25HLGdHQUFtRjtJQUNuRixzSEFBeUc7SUFDekcsc0ZBQXlFO0lBQ3pFLDBGQUE2RTtJQUM3RSx5RkFBNEU7SUFDNUUsdUZBQTBFO0lBQzFFLHNGQUF5RTtJQUN6RSw0RkFBK0U7SUFDL0UsMkZBQThFO0lBQzlFLDhGQUFpRjtJQUNqRiw2RkFBZ0Y7SUFDaEYsMkZBQThFO0lBQzlFLDBGQUE2RTtJQUM3RSxzRkFBeUU7SUFDekUsb0ZBQXVFO0lBQ3ZFLHNGQUF5RTtJQUN6RSwwRkFBNkU7SUFDN0UsdUZBQTBFO0lBQzFFLDJGQUE4RTtJQUM5RSxvRkFBdUU7SUFDdkUsd0ZBQTJFO0lBQzNFLHlGQUE0RTtJQUM1RSwyRkFBOEU7SUFDOUUsNkZBQWdGO0lBQ2hGLHdHQUEyRjtJQUMzRix3R0FBMkY7SUFDM0YsdUdBQTBGO0lBQzFGLG1GQUFzRTtJQUN0RSw4RUFBaUU7SUFDakUsNEdBQStGO0lBQy9GLG9IQUF1RztJQUN2RyxzRkFBeUU7SUFDekUsMEZBQTZFO0lBQzdFLHdHQUEyRjtJQUMzRiwwSEFBNkc7SUFDN0csOEVBQWlFO0lBQ2pFLGlHQUFvRjtJQUNwRiw4RUFBaUU7SUFDakUsaUdBQW9GO0lBQ3BGLG9IQUF1RztJQUN2Ryw2RkFBZ0Y7SUFDaEYsaUhBQW9HO0lBQ3BHLGtIQUFxRztJQUNyRyxpRkFBb0U7SUFDcEUsaUZBQW9FO0lBQ3BFLDhGQUFpRjtJQUNqRixrSEFBcUc7SUFDckcsa0hBQXFHO0lBQ3JHLDZGQUFnRjtJQUNoRiw0RkFBK0U7SUFDL0UsOEdBQWlHO0lBQ2pHLDRHQUErRjtJQUMvRixrSEFBcUc7SUFDckcsZ0lBQW1IO0lBQ25ILGdJQUFtSDtJQUNuSCw4SEFBaUg7SUFDakgsbUdBQXNGO0lBQ3RGLG9HQUF1RjtJQUN2RixvSUFBdUg7SUFDdkgsa0dBQXFGO0lBQ3JGLHlHQUE0RjtJQUM1Rix3RkFBMkU7SUFDM0UsbUdBQXNGO0lBQ3RGLHFHQUF3RjtJQUN4RixrR0FBcUY7SUFDckYsNEdBQStGO0lBQy9GLHFHQUF3RjtJQUN4RixvR0FBdUY7SUFDdkYseUVBQTREO0lBQzVELHdHQUEyRjtJQUMzRixnR0FBbUY7SUFDbkYsb0ZBQXVFO0lBQ3ZFLGtHQUFxRjtJQUNyRiw4R0FBaUc7SUFDakcsK0dBQWtHO0lBQ2xHLDhFQUFpRTtJQUNqRSxxRkFBd0U7SUFDeEUsMkZBQThFO0lBQzlFLDhGQUFpRjtJQUNqRixnR0FBbUY7SUFDbkYsb0dBQXVGO0lBQ3ZGLHNJQUF5SDtJQUN6SCxvSEFBdUc7SUFDdkcsOEdBQWlHO0lBQ2pHLG9GQUF1RTtJQUN2RSw2RUFBZ0U7SUFDaEUsaUZBQW9FO0lBQ3BFLHVFQUEwRDtJQUMxRCwyRUFBOEQ7SUFDOUQsOEVBQWlFO0lBQ2pFLDJFQUE4RDtJQUM5RCxpRkFBb0U7SUFDcEUsNEdBQStGO0lBQy9GLGtHQUFxRjtJQUNyRiwwRUFBNkQ7SUFDN0QsZ0ZBQW1FO0lBQ25FLGdGQUFtRTtJQUNuRSxnRkFBbUU7SUFDbkUsZ0ZBQW1FO0lBQ25FLGdGQUFtRTtJQUNuRSxvRkFBdUU7SUFDdkUsMkdBQThGO0lBQzlGLG9HQUF1RjtJQUN2RiwwSEFBNkc7SUFDN0csOEVBQWlFO0lBQ2pFLHNFQUF5RDtJQUN6RCxxRkFBd0U7SUFDeEUsb0hBQXVHO0lBQ3ZHLGtIQUFxRztJQUNyRyxnR0FBbUY7SUFDbkYsMkZBQThFO0lBQzlFLDBHQUE2RjtBQUNqRyxDQUFDLEVBMVBXLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBMFB0QjtBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ25DLHFCQUFvRDtJQUVwRCxPQUFPLENBQ0gsQ0FBQyxDQUFDLHFCQUFxQixJQUFJLHFCQUFxQixDQUFDLEtBQUssS0FBSyxhQUFhLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FDakgsQ0FBQztBQUNOLENBQUM7QUFORCwwREFNQztBQUVELFNBQWdCLE9BQU8sQ0FBQyxLQUFhO0lBQ2pDLE9BQU87UUFDSCxTQUFTO1lBQ0wsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU87WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsUUFBUTtZQUNKLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQztBQVpELDBCQVlDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixJQUFJLENBQStCLE1BQVksRUFBRSxRQUFhLEVBQUUsSUFBcUI7SUFDakcsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxHQUErQixPQUFPLENBQUM7SUFFakQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFO1FBQ3BDLFVBQVUsRUFBRSxJQUFJO1FBRWhCLEdBQUc7WUFDQyxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7Z0JBQ3BCLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQzthQUNuQjtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxHQUFHLENBQUMsS0FBZ0I7WUFDaEIsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWxCRCxvQkFrQkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBSSxLQUFlLEVBQUUsUUFBaUI7SUFDbkUsTUFBTSxLQUFLLEdBQW1DLElBQUksR0FBRyxFQUFFLENBQUM7SUFFeEQsT0FBTyxTQUFTLElBQUksQ0FBQyxLQUFpQjtRQUNsQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFHLFFBQVEsQ0FBQyxNQUFLLEtBQUssRUFBRTtZQUMvQixPQUFPLE9BQU8sQ0FBQztTQUNsQjtRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzFCLElBQUksQ0FBQyxRQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFFO2dCQUNwQyxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsQyxPQUFPLGFBQWEsS0FBSyxLQUFLLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7QUFDTixDQUFDO0FBcEJELDhDQW9CQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLGFBQWEsQ0FBd0MsS0FBZSxFQUFFLFFBQVc7SUFDN0YsTUFBTSxTQUFTLEdBQXNCLE1BQU0sUUFBUSxFQUFFLENBQUM7SUFFdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDbEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzRztTQUFNO1FBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLFNBQVMsa0JBQWtCLENBQUMsQ0FBQztLQUM3RDtJQUNELE9BQU8sS0FBNkIsQ0FBQztBQUN6QyxDQUFDO0FBVEQsc0NBU0M7Ozs7Ozs7Ozs7O0FDbmdCRCx3Q0FBa0M7QUFFbEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxVQUF1QixFQUFFLEtBQVU7O0lBQzlELElBQUksTUFBOEIsQ0FBQztJQUNuQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxHQUFHO1lBQ0wsSUFBSSxFQUFFLFlBQVk7WUFDbEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLDZCQUE2QixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBVTtTQUM1RixDQUFDO0tBQ0w7U0FBTSxJQUFJLFdBQUssQ0FBQyxTQUFTLHFEQUFJLEVBQUU7UUFDNUIsTUFBTSxHQUFHO1lBQ0wsSUFBSSxFQUFFLFNBQVM7WUFDZixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtTQUMzQixDQUFDO0tBQ0w7U0FBTSxJQUFJLFdBQUssQ0FBQyxRQUFRLHFEQUFJLEVBQUU7UUFDM0IsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEYsTUFBTSxHQUFHO2dCQUNMLElBQUksRUFBRSxZQUFZO2dCQUNsQixVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTthQUM5QixDQUFDO1NBQ0w7YUFBTTtZQUNILE1BQU0sR0FBRztnQkFDTCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTthQUMxQixDQUFDO1NBQ0w7S0FDSjtTQUFNLElBQUksV0FBSyxDQUFDLEtBQUsscURBQUksRUFBRTtRQUN4QixNQUFNLEdBQUc7WUFDTCxJQUFJLEVBQUUsS0FBSztZQUNYLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO1NBQ3ZCLENBQUM7S0FDTDtTQUFNLElBQUksV0FBSyxDQUFDLE9BQU8scURBQUksRUFBRTtRQUMxQixNQUFNLEdBQUc7WUFDTCxJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO1NBQ3pCLENBQUM7S0FDTDtTQUFNLElBQUksV0FBSyxDQUFDLE1BQU0scURBQUksRUFBRTtRQUN6QixNQUFNLEdBQUc7WUFDTCxJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO1NBQ3hCLENBQUM7S0FDTDtTQUFNLElBQUksV0FBSyxDQUFDLFNBQVMscURBQUksRUFBRTtRQUM1QixNQUFNLEdBQUc7WUFDTCxJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssTUFBTTtTQUNuQyxDQUFDO0tBQ0w7U0FBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1FBQzlCLE1BQU0sR0FBRztZQUNMLElBQUksRUFBRSxNQUFNO1lBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1NBQ25CLENBQUM7S0FDTDtTQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtRQUN4QyxNQUFNLEdBQUc7WUFDTCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLGNBQWMsRUFBRSxLQUFLLENBQUMsS0FBSztTQUM5QixDQUFDO0tBQ0w7U0FBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO1FBQy9CLE1BQU0sR0FBRztZQUNMLElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQ3JCLENBQUM7S0FDTDtTQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7UUFDOUIsTUFBTSxHQUFHO1lBQ0wsSUFBSSxFQUFFLE1BQU07U0FDZixDQUFDO0tBQ0w7U0FBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO1FBQ3RDLE1BQU0sR0FBRztZQUNMLElBQUksRUFBRSxjQUFjO1lBQ3BCLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSztTQUM1QixDQUFDO0tBQ0w7U0FBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssd0JBQXdCLEVBQUU7UUFDaEQsTUFBTSxHQUFHO1lBQ0wsSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixzQkFBc0IsRUFBRSxLQUFLLENBQUMsS0FBSztTQUN0QyxDQUFDO0tBQ0w7U0FBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDN0QsTUFBTSxHQUFHO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxNQUFNLEVBQUUsNkJBQTZCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBcUI7U0FDL0UsQ0FBQztLQUNMO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsb0JBQW9CLENBQUMsVUFBdUIsRUFBRSxLQUFVO0lBQzdELElBQUksTUFBOEIsQ0FBQztJQUNuQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQ2pELFFBQVEsZ0JBQWdCLEVBQUU7UUFDdEIsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLFFBQVE7WUFDVCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEYsTUFBTSxHQUFHO29CQUNMLElBQUksRUFBRSxZQUFZO29CQUNsQixVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtpQkFDL0IsQ0FBQzthQUNMO2lCQUFNO2dCQUNILE1BQU0sR0FBRztvQkFDTCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtpQkFDM0IsQ0FBQzthQUNMO1lBQ0QsTUFBTTtRQUNWLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxTQUFTO1lBQ1YsTUFBTSxHQUFHO2dCQUNMLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO2FBQ3hCLENBQUM7WUFDRixNQUFNO1FBRVYsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLFFBQVE7WUFDVCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3RDLE1BQU0sR0FBRztvQkFDTCxJQUFJLEVBQUUsS0FBSztvQkFDWCxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtpQkFDdkIsQ0FBQzthQUNMO2lCQUFNO2dCQUNILE1BQU0sR0FBRztvQkFDTCxJQUFJLEVBQUUsU0FBUztvQkFDZixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtpQkFDM0IsQ0FBQzthQUNMO1lBQ0QsTUFBTTtRQUNWLEtBQUssUUFBUSxDQUFDO1FBQ2Q7WUFDSSxNQUFNLEdBQUcscUJBQXFCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE1BQU07S0FDYjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFFdkg7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FDL0IsVUFBdUIsRUFDdkIsa0JBQXVCLEVBQ3ZCLGlCQUFrQztJQUVsQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQzFCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLGNBQWMsQ0FBQztTQUN2QyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsRCxNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3hCLE1BQU0sYUFBYSxHQUFHLG1CQUFPLEVBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVELElBQUksYUFBYSxFQUFFO29CQUNmLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hELGdCQUFnQixDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFDLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQzNCLG1GQUFtRjt3QkFDbkYsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEQ7aUJBQ0o7YUFDSjtZQUNELGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyw2QkFBNkIsQ0FDbEMsVUFBdUIsRUFDdkIsY0FBbUI7SUFTbkIsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUU7UUFDcEMsT0FBTyxjQUFjLENBQUM7S0FDekI7U0FBTSxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRTtRQUMzQyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEMsb0JBQW9CO1lBQ3BCLE1BQU0sT0FBTyxHQUFxQjtnQkFDOUIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxLQUFLO2dCQUMxQixjQUFjLEVBQUUsRUFBVzthQUM5QixDQUFDO1lBQ0YsOENBQThDO1lBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQ2xELElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDOUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUM1QyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzt3QkFDeEIsSUFBSSxFQUFFLGFBQWE7d0JBQ25CLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFlO3FCQUMvRCxDQUFDLENBQUM7aUJBQ047cUJBQU0sSUFBSSxhQUFhLEtBQUssYUFBYSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakcsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7b0JBQ3pCLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUM5RjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUM7U0FDbEI7YUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO1lBQy9DLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLFlBQVksRUFBRSxjQUFjLENBQUMsS0FBSzthQUNyQyxDQUFDO1NBQ0w7YUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLEVBQUU7WUFDakQsT0FBTztnQkFDSCxJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixjQUFjLEVBQUUsY0FBYyxDQUFDLEtBQUs7YUFDdkMsQ0FBQztTQUNMO2FBQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxLQUFLLHdCQUF3QixFQUFFO1lBQ3pELE9BQU87Z0JBQ0gsSUFBSSxFQUFFLHdCQUF3QjtnQkFDOUIsc0JBQXNCLEVBQUUsY0FBYyxDQUFDLEtBQUs7YUFDL0MsQ0FBQztTQUNMO0tBQ0o7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsVUFBdUIsRUFBRSxVQUErQjtJQUM1RixNQUFNLGNBQWMsR0FBa0I7UUFDbEMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO1FBQ3JCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBQ0YsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzNCLGFBQWE7UUFDYixJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBRSxVQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckcsMEVBQTBFO1lBQzFFLGNBQWMsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLDBCQUEwQixDQUFDLFVBQVUsRUFBRyxVQUFrQixDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdkc7UUFDRCxPQUFPO1lBQ0gsR0FBRyxjQUFjO1lBQ2pCLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQVU7U0FDakcsQ0FBQztLQUNMO1NBQU0sSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzNDLE9BQU8sRUFBRSxHQUFHLGNBQWMsRUFBRSxNQUFNLEVBQUUsNkJBQTZCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBUSxFQUFFLENBQUM7S0FDdEc7U0FBTTtRQUNILE9BQU8sRUFBRSxHQUFHLGNBQWMsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7S0FDckY7QUFDTCxDQUFDO0FBckJELDBEQXFCQzs7Ozs7OztVQzNSRDtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7O1VDdEJBO1VBQ0E7VUFDQTtVQUNBIiwiZmlsZSI6IkFubm90YXRpb25Db252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICAgIEFjdGlvbixcbiAgICBBY3Rpb25JbXBvcnQsXG4gICAgQWN0aW9uUGFyYW1ldGVyLFxuICAgIEFubm90YXRpb24sXG4gICAgQW5ub3RhdGlvbkxpc3QsXG4gICAgQW5ub3RhdGlvblJlY29yZCxcbiAgICBBcnJheVdpdGhJbmRleCxcbiAgICBCYXNlTmF2aWdhdGlvblByb3BlcnR5LFxuICAgIENvbXBsZXhUeXBlLFxuICAgIENvbnZlcnRlZE1ldGFkYXRhLFxuICAgIEVudGl0eUNvbnRhaW5lcixcbiAgICBFbnRpdHlTZXQsXG4gICAgRW50aXR5VHlwZSxcbiAgICBFeHByZXNzaW9uLFxuICAgIEZ1bGx5UXVhbGlmaWVkTmFtZSxcbiAgICBOYXZpZ2F0aW9uUHJvcGVydHksXG4gICAgUHJvcGVydHksXG4gICAgUHJvcGVydHlQYXRoLFxuICAgIFJhd0FjdGlvbixcbiAgICBSYXdBY3Rpb25JbXBvcnQsXG4gICAgUmF3QW5ub3RhdGlvbixcbiAgICBSYXdDb21wbGV4VHlwZSxcbiAgICBSYXdFbnRpdHlDb250YWluZXIsXG4gICAgUmF3RW50aXR5U2V0LFxuICAgIFJhd0VudGl0eVR5cGUsXG4gICAgUmF3TWV0YWRhdGEsXG4gICAgUmF3UHJvcGVydHksXG4gICAgUmF3U2NoZW1hLFxuICAgIFJhd1NpbmdsZXRvbixcbiAgICBSYXdUeXBlRGVmaW5pdGlvbixcbiAgICBSYXdWMk5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICBSZWZlcmVuY2UsXG4gICAgUmVtb3ZlQW5ub3RhdGlvbkFuZFR5cGUsXG4gICAgUmVzb2x1dGlvblRhcmdldCxcbiAgICBTaW5nbGV0b24sXG4gICAgVHlwZURlZmluaXRpb25cbn0gZnJvbSAnQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZWZlcmVuY2VzV2l0aE1hcCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBhZGRHZXRCeVZhbHVlLFxuICAgIGFsaWFzLFxuICAgIERlY2ltYWwsXG4gICAgZGVmYXVsdFJlZmVyZW5jZXMsXG4gICAgRW51bUlzRmxhZyxcbiAgICBsYXp5LFxuICAgIHNwbGl0QXRGaXJzdCxcbiAgICBzcGxpdEF0TGFzdCxcbiAgICBzdWJzdHJpbmdCZWZvcmVGaXJzdCxcbiAgICBzdWJzdHJpbmdCZWZvcmVMYXN0LFxuICAgIFRlcm1Ub1R5cGVzLFxuICAgIHVuYWxpYXNcbn0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogU3ltYm9sIHRvIGV4dGVuZCBhbiBhbm5vdGF0aW9uIHdpdGggdGhlIHJlZmVyZW5jZSB0byBpdHMgdGFyZ2V0LlxuICovXG5jb25zdCBBTk5PVEFUSU9OX1RBUkdFVCA9IFN5bWJvbCgnQW5ub3RhdGlvbiBUYXJnZXQnKTtcblxuLyoqXG4gKiBBcHBlbmQgYW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIHZpc2l0ZWQgb2JqZWN0cyBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIGxpc3QuXG4gKlxuICogQHBhcmFtIG9iamVjdFBhdGggICAgVGhlIGxpc3Qgb2YgdmlzaXRlZCBvYmplY3RzXG4gKiBAcGFyYW0gdmlzaXRlZE9iamVjdCBUaGUgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiB2aXNpdGVkIG9iamVjdHNcbiAqL1xuZnVuY3Rpb24gYXBwZW5kT2JqZWN0UGF0aChvYmplY3RQYXRoOiBhbnlbXSwgdmlzaXRlZE9iamVjdDogYW55KTogYW55W10ge1xuICAgIGlmIChvYmplY3RQYXRoW29iamVjdFBhdGgubGVuZ3RoIC0gMV0gIT09IHZpc2l0ZWRPYmplY3QpIHtcbiAgICAgICAgb2JqZWN0UGF0aC5wdXNoKHZpc2l0ZWRPYmplY3QpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0UGF0aDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIChwb3NzaWJseSByZWxhdGl2ZSkgcGF0aC5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgICAgICAgQ29udmVydGVyXG4gKiBAcGFyYW0gc3RhcnRFbGVtZW50ICAgICAgVGhlIHN0YXJ0aW5nIHBvaW50IGluIGNhc2Ugb2YgcmVsYXRpdmUgcGF0aCByZXNvbHV0aW9uXG4gKiBAcGFyYW0gcGF0aCAgICAgICAgICAgICAgVGhlIHBhdGggdG8gcmVzb2x2ZVxuICogQHBhcmFtIGFubm90YXRpb25zVGVybSAgIE9ubHkgZm9yIGVycm9yIHJlcG9ydGluZzogVGhlIGFubm90YXRpb24gdGVybVxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlc29sdmVkIHRhcmdldCBhbmQgdGhlIGVsZW1lbnRzIHRoYXQgd2VyZSB2aXNpdGVkIHdoaWxlIGdldHRpbmcgdG8gdGhlIHRhcmdldC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldDxUPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcixcbiAgICBzdGFydEVsZW1lbnQ6IGFueSxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYW5ub3RhdGlvbnNUZXJtPzogc3RyaW5nXG4pOiBSZXNvbHV0aW9uVGFyZ2V0PFQ+IHtcbiAgICAvLyBhYnNvbHV0ZSBwYXRocyBhbHdheXMgc3RhcnQgYXQgdGhlIGVudGl0eSBjb250YWluZXJcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpO1xuICAgICAgICBzdGFydEVsZW1lbnQgPSB1bmRlZmluZWQ7IC8vIHdpbGwgcmVzb2x2ZSB0byB0aGUgZW50aXR5IGNvbnRhaW5lciAoc2VlIGJlbG93KVxuICAgIH1cblxuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IHBhdGguc3BsaXQoJy8nKS5yZWR1Y2UoKHRhcmdldFBhdGgsIHNlZ21lbnQpID0+IHtcbiAgICAgICAgaWYgKHNlZ21lbnQuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgICAgICAgLy8gU2VwYXJhdGUgb3V0IHRoZSBhbm5vdGF0aW9uXG4gICAgICAgICAgICBjb25zdCBbcGF0aFBhcnQsIGFubm90YXRpb25QYXJ0XSA9IHNwbGl0QXRGaXJzdChzZWdtZW50LCAnQCcpO1xuICAgICAgICAgICAgdGFyZ2V0UGF0aC5wdXNoKHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIHRhcmdldFBhdGgucHVzaChgQCR7YW5ub3RhdGlvblBhcnR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldFBhdGg7XG4gICAgfSwgW10gYXMgc3RyaW5nW10pO1xuXG4gICAgLy8gZGV0ZXJtaW5lIHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIHJlc29sdXRpb25cbiAgICBpZiAoc3RhcnRFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gbm8gc3RhcnRpbmcgcG9pbnQgZ2l2ZW46IHN0YXJ0IGF0IHRoZSBlbnRpdHkgY29udGFpbmVyXG4gICAgICAgIHN0YXJ0RWxlbWVudCA9IGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbnRpdHlDb250YWluZXIoKTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0RWxlbWVudFtBTk5PVEFUSU9OX1RBUkdFVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBhbm5vdGF0aW9uOiBzdGFydCBhdCB0aGUgYW5ub3RhdGlvbiB0YXJnZXRcbiAgICAgICAgc3RhcnRFbGVtZW50ID0gc3RhcnRFbGVtZW50W0FOTk9UQVRJT05fVEFSR0VUXTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0RWxlbWVudC5fdHlwZSA9PT0gJ1Byb3BlcnR5Jykge1xuICAgICAgICAvLyBwcm9wZXJ0eTogc3RhcnQgYXQgdGhlIGVudGl0eSB0eXBlIG9yIGNvbXBsZXggdHlwZSB0aGUgcHJvcGVydHkgYmVsb25ncyB0b1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50RlFOID0gc3Vic3RyaW5nQmVmb3JlRmlyc3Qoc3RhcnRFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSwgJy8nKTtcbiAgICAgICAgc3RhcnRFbGVtZW50ID1cbiAgICAgICAgICAgIGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbnRpdHlUeXBlKHBhcmVudEVsZW1lbnRGUU4pID8/IGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRDb21wbGV4VHlwZShwYXJlbnRFbGVtZW50RlFOKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBwYXRoU2VnbWVudHMucmVkdWNlKFxuICAgICAgICAoY3VycmVudDogUmVzb2x1dGlvblRhcmdldDxhbnk+LCBzZWdtZW50OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQubWVzc2FnZXMucHVzaCh7IG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudC50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50Lm9iamVjdFBhdGggPSBhcHBlbmRPYmplY3RQYXRoKGN1cnJlbnQub2JqZWN0UGF0aCwgY3VycmVudC50YXJnZXQpO1xuXG4gICAgICAgICAgICAvLyBBbm5vdGF0aW9uXG4gICAgICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKCdAJykgJiYgc2VnbWVudCAhPT0gJ0AkdWk1Lm92ZXJsb2FkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFt2b2NhYnVsYXJ5QWxpYXMsIHRlcm1dID0gY29udmVydGVyLnNwbGl0VGVybShzZWdtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gY3VycmVudC50YXJnZXQuYW5ub3RhdGlvbnNbdm9jYWJ1bGFyeUFsaWFzLnN1YnN0cmluZygxKV0/Llt0ZXJtXTtcblxuICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQW5ub3RhdGlvbiAnJHtzZWdtZW50LnN1YnN0cmluZygxKX0nIG5vdCBmb3VuZCBvbiAke2N1cnJlbnQudGFyZ2V0Ll90eXBlfSAnJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZVxuICAgICAgICAgICAgICAgICAgICB9J2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAkUGF0aCAvICRBbm5vdGF0aW9uUGF0aCBzeW50YXhcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnRhcmdldC4kdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YlBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJyRBbm5vdGF0aW9uUGF0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IGN1cnJlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gJyRQYXRoJykge1xuICAgICAgICAgICAgICAgICAgICBzdWJQYXRoID0gY3VycmVudC50YXJnZXQucGF0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ViUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YlRhcmdldCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCBjdXJyZW50LnRhcmdldFtBTk5PVEFUSU9OX1RBUkdFVF0sIHN1YlBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBzdWJUYXJnZXQub2JqZWN0UGF0aC5mb3JFYWNoKCh2aXNpdGVkU3ViT2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudC5vYmplY3RQYXRoLmluY2x1ZGVzKHZpc2l0ZWRTdWJPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5vYmplY3RQYXRoID0gYXBwZW5kT2JqZWN0UGF0aChjdXJyZW50Lm9iamVjdFBhdGgsIHZpc2l0ZWRTdWJPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnRhcmdldCA9IHN1YlRhcmdldC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQub2JqZWN0UGF0aCA9IGFwcGVuZE9iamVjdFBhdGgoY3VycmVudC5vYmplY3RQYXRoLCBjdXJyZW50LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdHJhdmVyc2UgYmFzZWQgb24gdGhlIGVsZW1lbnQgdHlwZVxuICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50LnRhcmdldD8uX3R5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRpdHlDb250YWluZXInOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzRWxlbWVudCA9IGN1cnJlbnQudGFyZ2V0IGFzIEVudGl0eUNvbnRhaW5lcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICcnIHx8IHNlZ21lbnQgPT09IHRoaXNFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGVsZW1lbnQ6IEVudGl0eVNldCwgU2luZ2xldG9uIG9yIEFjdGlvbkltcG9ydD9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCBBY3Rpb25JbXBvcnQgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNFbGVtZW50LmVudGl0eVNldHMuYnlfbmFtZShzZWdtZW50KSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNFbGVtZW50LnNpbmdsZXRvbnMuYnlfbmFtZShzZWdtZW50KSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNFbGVtZW50LmFjdGlvbkltcG9ydHMuYnlfbmFtZShzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBuZXh0RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGl0eVNldCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU2luZ2xldG9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzRWxlbWVudCA9IGN1cnJlbnQudGFyZ2V0IGFzIEVudGl0eVNldCB8IFNpbmdsZXRvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJycgfHwgc2VnbWVudCA9PT0gJyRUeXBlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgUGF0aCBhZnRlciBhbiBFbnRpdHlTZXQgb3IgU2luZ2xldG9uIG1lYW5zIEVudGl0eVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gdGhpc0VsZW1lbnQuZW50aXR5VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICckJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3MgPSB0aGlzRWxlbWVudC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5ncztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgcmVzb2x2aW5nIGF0IHRoZSBFbnRpdHlTZXQncyBvciBTaW5nbGV0b24ncyB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCB0aGlzRWxlbWVudC5lbnRpdHlUeXBlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSByZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm9iamVjdFBhdGggPSByZXN1bHQub2JqZWN0UGF0aC5yZWR1Y2UoYXBwZW5kT2JqZWN0UGF0aCwgY3VycmVudC5vYmplY3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50aXR5VHlwZSc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNFbGVtZW50ID0gY3VycmVudC50YXJnZXQgYXMgRW50aXR5VHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICcnIHx8IHNlZ21lbnQgPT09ICckVHlwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzRWxlbWVudC5lbnRpdHlQcm9wZXJ0aWVzLmJ5X25hbWUoc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnRhcmdldCA9IHByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uUHJvcGVydHkgPSB0aGlzRWxlbWVudC5uYXZpZ2F0aW9uUHJvcGVydGllcy5ieV9uYW1lKHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gbmF2aWdhdGlvblByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzRWxlbWVudC5hY3Rpb25zW3NlZ21lbnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gYWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQWN0aW9uSW1wb3J0Jzoge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSByZXNvbHZpbmcgYXQgdGhlIEFjdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgY3VycmVudC50YXJnZXQuYWN0aW9uLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSByZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm9iamVjdFBhdGggPSByZXN1bHQub2JqZWN0UGF0aC5yZWR1Y2UoYXBwZW5kT2JqZWN0UGF0aCwgY3VycmVudC5vYmplY3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnQWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzRWxlbWVudCA9IGN1cnJlbnQudGFyZ2V0IGFzIEFjdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICdAJHVpNS5vdmVybG9hZCcgfHwgc2VnbWVudCA9PT0gJzAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSAnJFBhcmFtZXRlcicgJiYgdGhpc0VsZW1lbnQuaXNCb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSB0aGlzRWxlbWVudC5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzRWxlbWVudC5wYXJhbWV0ZXJzW3NlZ21lbnQgYXMgYW55XSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0VsZW1lbnQucGFyYW1ldGVycy5maW5kKChwYXJhbTogQWN0aW9uUGFyYW1ldGVyKSA9PiBwYXJhbS5uYW1lID09PSBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gbmV4dEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICdQcm9wZXJ0eSc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNFbGVtZW50ID0gY3VycmVudC50YXJnZXQgYXMgUHJvcGVydHk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBvZiB0aGUgQ29tcGxleFR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzRWxlbWVudC50YXJnZXRUeXBlIGFzIENvbXBsZXhUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdHlwZS5wcm9wZXJ0aWVzLmJ5X25hbWUoc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gcHJvcGVydHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IHR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuYnlfbmFtZShzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2aWdhdGlvblByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gbmF2aWdhdGlvblByb3BlcnR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdBY3Rpb25QYXJhbWV0ZXInOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkVHlwZSA9IChjdXJyZW50LnRhcmdldCBhcyBBY3Rpb25QYXJhbWV0ZXIpLnR5cGVSZWZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgcmVmZXJlbmNlZFR5cGUsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSByZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5vYmplY3RQYXRoID0gcmVzdWx0Lm9iamVjdFBhdGgucmVkdWNlKGFwcGVuZE9iamVjdFBhdGgsIGN1cnJlbnQub2JqZWN0UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ05hdmlnYXRpb25Qcm9wZXJ0eSc6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGF0IHRoZSBOYXZpZ2F0aW9uUHJvcGVydHkncyB0YXJnZXQgdHlwZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgKGN1cnJlbnQudGFyZ2V0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZSwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudGFyZ2V0ID0gcmVzdWx0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5vYmplY3RQYXRoID0gcmVzdWx0Lm9iamVjdFBhdGgucmVkdWNlKGFwcGVuZE9iamVjdFBhdGgsIGN1cnJlbnQub2JqZWN0UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnRhcmdldFtzZWdtZW50XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50YXJnZXQgPSBjdXJyZW50LnRhcmdldFtzZWdtZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQub2JqZWN0UGF0aCA9IGFwcGVuZE9iamVjdFBhdGgoY3VycmVudC5vYmplY3RQYXRoLCBjdXJyZW50LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXJyb3IoXG4gICAgICAgICAgICAgICAgYEVsZW1lbnQgJyR7c2VnbWVudH0nIG5vdCBmb3VuZCBhdCAke2N1cnJlbnQudGFyZ2V0Ll90eXBlfSAnJHtjdXJyZW50LnRhcmdldC5mdWxseVF1YWxpZmllZE5hbWV9J2BcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgdGFyZ2V0OiBzdGFydEVsZW1lbnQsIG9iamVjdFBhdGg6IFtdLCBtZXNzYWdlczogW10gfVxuICAgICk7XG5cbiAgICAvLyBEaWFnbm9zdGljc1xuICAgIHJlc3VsdC5tZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlKSA9PiBjb252ZXJ0ZXIubG9nRXJyb3IobWVzc2FnZS5tZXNzYWdlKSk7XG4gICAgaWYgKCFyZXN1bHQudGFyZ2V0KSB7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uc1Rlcm0pIHtcbiAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gaW5mZXJUeXBlRnJvbVRlcm0oY29udmVydGVyLCBhbm5vdGF0aW9uc1Rlcm0sIHN0YXJ0RWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUpO1xuICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdIaW50OiBDaGVjayBhbmQgY29ycmVjdCB0aGUgcGF0aCB2YWx1ZXMgdW5kZXIgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIG1ldGFkYXRhIChhbm5vdGF0aW9uLnhtbCBmaWxlIG9yIENEUyBhbm5vdGF0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uKTogXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvbiBUZXJtID0gJyArXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zVGVybSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxSZWNvcmQgVHlwZSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uUGF0aCA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJz4nXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnPEFubm90YXRpb24gVGVybSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoU2VnbWVudHNbMF0gK1xuICAgICAgICAgICAgICAgICAgICAnPicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8UHJvcGVydHlWYWx1ZSAgUGF0aD0gJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGhTZWdtZW50c1sxXSArXG4gICAgICAgICAgICAgICAgICAgICc+J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVHlwZWd1YXJkIHRvIGNoZWNrIGlmIHRoZSBwYXRoIGNvbnRhaW5zIGFuIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHBhdGhTdHIgdGhlIHBhdGggdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW4gYW5ub3RhdGlvbiBpbiB0aGUgcGF0aC5cbiAqL1xuZnVuY3Rpb24gaXNBbm5vdGF0aW9uUGF0aChwYXRoU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGF0aFN0ci5pbmNsdWRlcygnQCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVZhbHVlKFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGFueSxcbiAgICBjdXJyZW50VGVybTogc3RyaW5nLFxuICAgIGN1cnJlbnRQcm9wZXJ0eTogc3RyaW5nLFxuICAgIGN1cnJlbnRTb3VyY2U6IHN0cmluZyxcbiAgICBwcm9wZXJ0eVZhbHVlOiBFeHByZXNzaW9uLFxuICAgIHZhbHVlRlFOOiBzdHJpbmdcbikge1xuICAgIGlmIChwcm9wZXJ0eVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc3dpdGNoIChwcm9wZXJ0eVZhbHVlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLlN0cmluZztcbiAgICAgICAgY2FzZSAnSW50JzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLkludDtcbiAgICAgICAgY2FzZSAnQm9vbCc6XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5Cb29sO1xuICAgICAgICBjYXNlICdEZWNpbWFsJzpcbiAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHByb3BlcnR5VmFsdWUuRGVjaW1hbCk7XG4gICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWUuRGF0ZTtcbiAgICAgICAgY2FzZSAnRW51bU1lbWJlcic6XG4gICAgICAgICAgICBjb25zdCBhbGlhc2VkRW51bSA9IGNvbnZlcnRlci5hbGlhcyhwcm9wZXJ0eVZhbHVlLkVudW1NZW1iZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRFbnVtID0gYWxpYXNlZEVudW0uc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGlmIChzcGxpdEVudW1bMF0gJiYgRW51bUlzRmxhZ1tzdWJzdHJpbmdCZWZvcmVGaXJzdChzcGxpdEVudW1bMF0sICcvJyldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwbGl0RW51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhbGlhc2VkRW51bTtcblxuICAgICAgICBjYXNlICdQcm9wZXJ0eVBhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiB2YWx1ZUZRTixcbiAgICAgICAgICAgICAgICAkdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgY3VycmVudFRhcmdldCwgcHJvcGVydHlWYWx1ZS5Qcm9wZXJ0eVBhdGgsIGN1cnJlbnRUZXJtKS50YXJnZXQsXG4gICAgICAgICAgICAgICAgW0FOTk9UQVRJT05fVEFSR0VUXTogY3VycmVudFRhcmdldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogcmVzb2x2ZVRhcmdldChjb252ZXJ0ZXIsIGN1cnJlbnRUYXJnZXQsIHByb3BlcnR5VmFsdWUuTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgY3VycmVudFRlcm0pXG4gICAgICAgICAgICAgICAgICAgIC50YXJnZXQsXG4gICAgICAgICAgICAgICAgW0FOTk9UQVRJT05fVEFSR0VUXTogY3VycmVudFRhcmdldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnQW5ub3RhdGlvblBhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQW5ub3RhdGlvblBhdGgnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogcmVzb2x2ZVRhcmdldChcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIudW5hbGlhcyhwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRlcm1cbiAgICAgICAgICAgICAgICApLnRhcmdldCxcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc1Rlcm06IGN1cnJlbnRUZXJtLFxuICAgICAgICAgICAgICAgIHRlcm06ICcnLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIFtBTk5PVEFUSU9OX1RBUkdFVF06IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCBjdXJyZW50VGFyZ2V0LCBwcm9wZXJ0eVZhbHVlLlBhdGgsIGN1cnJlbnRUZXJtKS50YXJnZXQ7XG4gICAgICAgICAgICBpZiAoaXNBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eVZhbHVlLlBhdGgpKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5saW5lIHRoZSB0YXJnZXRcbiAgICAgICAgICAgICAgICByZXR1cm4gJHRhcmdldDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BhdGgnLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwcm9wZXJ0eVZhbHVlLlBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQ6ICR0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIFtBTk5PVEFUSU9OX1RBUkdFVF06IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1JlY29yZCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VSZWNvcmQoXG4gICAgICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXJtLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS5SZWNvcmQsXG4gICAgICAgICAgICAgICAgdmFsdWVGUU5cbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29sbGVjdGlvbihcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZXIsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGVybSxcbiAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHksXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLkNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdmFsdWVGUU5cbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ0FwcGx5JzpcbiAgICAgICAgY2FzZSAnTnVsbCc6XG4gICAgICAgIGNhc2UgJ05vdCc6XG4gICAgICAgIGNhc2UgJ0VxJzpcbiAgICAgICAgY2FzZSAnTmUnOlxuICAgICAgICBjYXNlICdHdCc6XG4gICAgICAgIGNhc2UgJ0dlJzpcbiAgICAgICAgY2FzZSAnTHQnOlxuICAgICAgICBjYXNlICdMZSc6XG4gICAgICAgIGNhc2UgJ0lmJzpcbiAgICAgICAgY2FzZSAnQW5kJzpcbiAgICAgICAgY2FzZSAnT3InOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEluZmVyIHRoZSB0eXBlIG9mIGEgdGVybSBiYXNlZCBvbiBpdHMgdHlwZS5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgICAgICAgQ29udmVydGVyXG4gKiBAcGFyYW0gYW5ub3RhdGlvbnNUZXJtICAgVGhlIGFubm90YXRpb24gdGVybVxuICogQHBhcmFtIGFubm90YXRpb25UYXJnZXQgIFRoZSBhbm5vdGF0aW9uIHRhcmdldFxuICogQHBhcmFtIGN1cnJlbnRQcm9wZXJ0eSAgIFRoZSBjdXJyZW50IHByb3BlcnR5IG9mIHRoZSByZWNvcmRcbiAqIEByZXR1cm5zIFRoZSBpbmZlcnJlZCB0eXBlLlxuICovXG5mdW5jdGlvbiBpbmZlclR5cGVGcm9tVGVybShcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcixcbiAgICBhbm5vdGF0aW9uc1Rlcm06IHN0cmluZyxcbiAgICBhbm5vdGF0aW9uVGFyZ2V0OiBzdHJpbmcsXG4gICAgY3VycmVudFByb3BlcnR5Pzogc3RyaW5nXG4pIHtcbiAgICBsZXQgdGFyZ2V0VHlwZSA9IChUZXJtVG9UeXBlcyBhcyBhbnkpW2Fubm90YXRpb25zVGVybV07XG4gICAgaWYgKGN1cnJlbnRQcm9wZXJ0eSkge1xuICAgICAgICBhbm5vdGF0aW9uc1Rlcm0gPSBgJHtzdWJzdHJpbmdCZWZvcmVMYXN0KGFubm90YXRpb25zVGVybSwgJy4nKX0uJHtjdXJyZW50UHJvcGVydHl9YDtcbiAgICAgICAgdGFyZ2V0VHlwZSA9IChUZXJtVG9UeXBlcyBhcyBhbnkpW2Fubm90YXRpb25zVGVybV07XG4gICAgfVxuXG4gICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICBgVGhlIHR5cGUgb2YgdGhlIHJlY29yZCB1c2VkIHdpdGhpbiB0aGUgdGVybSAke2Fubm90YXRpb25zVGVybX0gd2FzIG5vdCBkZWZpbmVkIGFuZCB3YXMgaW5mZXJyZWQgYXMgJHt0YXJnZXRUeXBlfS5cbkhpbnQ6IElmIHBvc3NpYmxlLCB0cnkgdG8gbWFpbnRhaW4gdGhlIFR5cGUgcHJvcGVydHkgZm9yIGVhY2ggUmVjb3JkLlxuPEFubm90YXRpb25zIFRhcmdldD1cIiR7YW5ub3RhdGlvblRhcmdldH1cIj5cblx0PEFubm90YXRpb24gVGVybT1cIiR7YW5ub3RhdGlvbnNUZXJtfVwiPlxuXHRcdDxSZWNvcmQ+Li4uPC9SZWNvcmQ+XG5cdDwvQW5ub3RhdGlvbj5cbjwvQW5ub3RhdGlvbnM+YFxuICAgICk7XG5cbiAgICByZXR1cm4gdGFyZ2V0VHlwZTtcbn1cblxuZnVuY3Rpb24gaXNEYXRhRmllbGRXaXRoRm9yQWN0aW9uKGFubm90YXRpb25Db250ZW50OiBhbnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBhbm5vdGF0aW9uQ29udGVudC5oYXNPd25Qcm9wZXJ0eSgnQWN0aW9uJykgJiZcbiAgICAgICAgKGFubm90YXRpb25Db250ZW50LiRUeXBlID09PSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uJyB8fFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNvbnRlbnQuJFR5cGUgPT09ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoQWN0aW9uJylcbiAgICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlY29yZFR5cGUoXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXIsXG4gICAgY3VycmVudFRlcm06IHN0cmluZyxcbiAgICBjdXJyZW50VGFyZ2V0OiBhbnksXG4gICAgY3VycmVudFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjb3JkRGVmaW5pdGlvbjogQW5ub3RhdGlvblJlY29yZFxuKSB7XG4gICAgbGV0IHRhcmdldFR5cGU7XG4gICAgaWYgKCFyZWNvcmREZWZpbml0aW9uLnR5cGUgJiYgY3VycmVudFRlcm0pIHtcbiAgICAgICAgdGFyZ2V0VHlwZSA9IGluZmVyVHlwZUZyb21UZXJtKGNvbnZlcnRlciwgY3VycmVudFRlcm0sIGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjdXJyZW50UHJvcGVydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFR5cGUgPSBjb252ZXJ0ZXIudW5hbGlhcyhyZWNvcmREZWZpbml0aW9uLnR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0VHlwZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQoXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXIsXG4gICAgY3VycmVudFRlcm06IHN0cmluZyxcbiAgICBjdXJyZW50VGFyZ2V0OiBhbnksXG4gICAgY3VycmVudFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY3VycmVudFNvdXJjZTogc3RyaW5nLFxuICAgIGFubm90YXRpb25SZWNvcmQ6IEFubm90YXRpb25SZWNvcmQsXG4gICAgY3VycmVudEZRTjogc3RyaW5nXG4pIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uVGVybTogYW55ID0ge1xuICAgICAgICAkVHlwZTogcGFyc2VSZWNvcmRUeXBlKGNvbnZlcnRlciwgY3VycmVudFRlcm0sIGN1cnJlbnRUYXJnZXQsIGN1cnJlbnRQcm9wZXJ0eSwgYW5ub3RhdGlvblJlY29yZCksXG4gICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogY3VycmVudEZRTixcbiAgICAgICAgW0FOTk9UQVRJT05fVEFSR0VUXTogY3VycmVudFRhcmdldFxuICAgIH07XG5cbiAgICAvLyBhbm5vdGF0aW9ucyBvbiB0aGUgcmVjb3JkXG4gICAgbGF6eShhbm5vdGF0aW9uVGVybSwgJ2Fubm90YXRpb25zJywgKCkgPT4ge1xuICAgICAgICAvLyBiZSBncmFjZWZ1bCB3aGVuIHJlc29sdmluZyBhbm5vdGF0aW9ucyBvbiBhbm5vdGF0aW9uczogU29tZXRpbWVzIHRoZXkgYXJlIHJlZmVyZW5jZWQgZGlyZWN0bHksIHNvbWV0aW1lcyB0aGV5XG4gICAgICAgIC8vIGFyZSBwYXJ0IG9mIHRoZSBnbG9iYWwgYW5ub3RhdGlvbnMgbGlzdFxuICAgICAgICBsZXQgYW5ub3RhdGlvbnM7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uUmVjb3JkLmFubm90YXRpb25zICYmIGFubm90YXRpb25SZWNvcmQuYW5ub3RhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uUmVjb3JkLmFubm90YXRpb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXIucmF3QW5ub3RhdGlvbnNQZXJUYXJnZXRbY3VycmVudEZRTl0/LmFubm90YXRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgYW5ub3RhdGlvbnM/LmZvckVhY2goKGFubm90YXRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbi50YXJnZXQgPSBjdXJyZW50RlFOO1xuICAgICAgICAgICAgYW5ub3RhdGlvbi5fX3NvdXJjZSA9IGN1cnJlbnRTb3VyY2U7XG4gICAgICAgICAgICBhbm5vdGF0aW9uW0FOTk9UQVRJT05fVEFSR0VUXSA9IGN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgICBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGAke2N1cnJlbnRGUU59QCR7YW5ub3RhdGlvbi50ZXJtfWA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVBbm5vdGF0aW9uc09iamVjdChjb252ZXJ0ZXIsIGFubm90YXRpb25UZXJtLCBhbm5vdGF0aW9ucyA/PyBbXSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbm5vdGF0aW9uQ29udGVudCA9IGFubm90YXRpb25SZWNvcmQucHJvcGVydHlWYWx1ZXM/LnJlZHVjZSgoYW5ub3RhdGlvbkNvbnRlbnQsIHByb3BlcnR5VmFsdWUpID0+IHtcbiAgICAgICAgbGF6eShhbm5vdGF0aW9uQ29udGVudCwgcHJvcGVydHlWYWx1ZS5uYW1lLCAoKSA9PlxuICAgICAgICAgICAgcGFyc2VWYWx1ZShcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZXIsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGVybSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLnZhbHVlLFxuICAgICAgICAgICAgICAgIGAke2N1cnJlbnRGUU59LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNvbnRlbnQ7XG4gICAgfSwgYW5ub3RhdGlvblRlcm0pO1xuXG4gICAgaWYgKGlzRGF0YUZpZWxkV2l0aEZvckFjdGlvbihhbm5vdGF0aW9uQ29udGVudCkpIHtcbiAgICAgICAgbGF6eShhbm5vdGF0aW9uQ29udGVudCwgJ0FjdGlvblRhcmdldCcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIHRyeSB0byByZXNvbHZlIHRvIGEgYm91bmQgYWN0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIHRhcmdldFxuICAgICAgICAgICAgbGV0IGFjdGlvblRhcmdldCA9IGN1cnJlbnRUYXJnZXQuYWN0aW9ucz8uW2Fubm90YXRpb25Db250ZW50LkFjdGlvbl07XG5cbiAgICAgICAgICAgIGlmICghYWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBjb3JyZXNwb25kaW5nIHVuYm91bmQgYWN0aW9uXG4gICAgICAgICAgICAgICAgYWN0aW9uVGFyZ2V0ID0gY29udmVydGVyLmdldENvbnZlcnRlZEFjdGlvbkltcG9ydChhbm5vdGF0aW9uQ29udGVudC5BY3Rpb24pPy5hY3Rpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghYWN0aW9uVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBjb3JyZXNwb25kaW5nIGJvdW5kICghKSBhY3Rpb25cbiAgICAgICAgICAgICAgICBhY3Rpb25UYXJnZXQgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQWN0aW9uKGFubm90YXRpb25Db250ZW50LkFjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25UYXJnZXQ/LmlzQm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFhY3Rpb25UYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZXIubG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgYWN0aW9uICcke2Fubm90YXRpb25Db250ZW50LkFjdGlvbn0nIGRlZmluZWQgZm9yICcke2Fubm90YXRpb25UZXJtLmZ1bGx5UXVhbGlmaWVkTmFtZX0nYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uVGFyZ2V0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFubm90YXRpb25Db250ZW50O1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uVHlwZSA9XG4gICAgfCAnUHJvcGVydHlQYXRoJ1xuICAgIHwgJ1BhdGgnXG4gICAgfCAnSWYnXG4gICAgfCAnQXBwbHknXG4gICAgfCAnTnVsbCdcbiAgICB8ICdBbmQnXG4gICAgfCAnRXEnXG4gICAgfCAnTmUnXG4gICAgfCAnTm90J1xuICAgIHwgJ0d0J1xuICAgIHwgJ0dlJ1xuICAgIHwgJ0x0J1xuICAgIHwgJ0xlJ1xuICAgIHwgJ09yJ1xuICAgIHwgJ0Fubm90YXRpb25QYXRoJ1xuICAgIHwgJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnXG4gICAgfCAnUmVjb3JkJ1xuICAgIHwgJ1N0cmluZydcbiAgICB8ICdFbXB0eUNvbGxlY3Rpb24nO1xuXG4vKipcbiAqIFJldHJpZXZlIG9yIGluZmVyIHRoZSBjb2xsZWN0aW9uIHR5cGUgYmFzZWQgb24gaXRzIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGNvbGxlY3Rpb25EZWZpbml0aW9uXG4gKiBAcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvblxuICovXG5mdW5jdGlvbiBnZXRPckluZmVyQ29sbGVjdGlvblR5cGUoY29sbGVjdGlvbkRlZmluaXRpb246IGFueVtdKTogQ29sbGVjdGlvblR5cGUge1xuICAgIGxldCB0eXBlOiBDb2xsZWN0aW9uVHlwZSA9IChjb2xsZWN0aW9uRGVmaW5pdGlvbiBhcyBhbnkpLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q29sSXRlbSA9IGNvbGxlY3Rpb25EZWZpbml0aW9uWzBdO1xuICAgICAgICBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdQcm9wZXJ0eVBhdGgnKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdQcm9wZXJ0eVBhdGgnO1xuICAgICAgICB9IGVsc2UgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgnUGF0aCcpKSB7XG4gICAgICAgICAgICB0eXBlID0gJ1BhdGgnO1xuICAgICAgICB9IGVsc2UgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgnQW5ub3RhdGlvblBhdGgnKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdBbm5vdGF0aW9uUGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJykpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZmlyc3RDb2xJdGVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgndHlwZScpIHx8IGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgncHJvcGVydHlWYWx1ZXMnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gJ1JlY29yZCc7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0Q29sSXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnU3RyaW5nJztcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHR5cGUgPSAnRW1wdHlDb2xsZWN0aW9uJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29sbGVjdGlvbihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcixcbiAgICBjdXJyZW50VGFyZ2V0OiBhbnksXG4gICAgY3VycmVudFRlcm06IHN0cmluZyxcbiAgICBjdXJyZW50UHJvcGVydHk6IHN0cmluZyxcbiAgICBjdXJyZW50U291cmNlOiBzdHJpbmcsXG4gICAgY29sbGVjdGlvbkRlZmluaXRpb246IGFueVtdLFxuICAgIHBhcmVudEZRTjogc3RyaW5nXG4pIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uRGVmaW5pdGlvblR5cGUgPSBnZXRPckluZmVyQ29sbGVjdGlvblR5cGUoY29sbGVjdGlvbkRlZmluaXRpb24pO1xuXG4gICAgc3dpdGNoIChjb2xsZWN0aW9uRGVmaW5pdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSAnUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKHByb3BlcnR5UGF0aCwgcHJvcGVydHlJZHgpOiBQcm9wZXJ0eVBhdGggPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUHJvcGVydHlQYXRoID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5UGF0aC5Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke3Byb3BlcnR5SWR4fWBcbiAgICAgICAgICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICAgICAgICAgIGxhenkoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgJyR0YXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVRhcmdldDxQcm9wZXJ0eT4oY29udmVydGVyLCBjdXJyZW50VGFyZ2V0LCBwcm9wZXJ0eVBhdGguUHJvcGVydHlQYXRoLCBjdXJyZW50VGVybSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGFyZ2V0ID8/ICh7fSBhcyBQcm9wZXJ0eSkgLy8gVE9ETzogJHRhcmdldCBpcyBtYW5kYXRvcnkgLSB0aHJvdyBhbiBlcnJvcj9cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgLy8gVE9ETzogbWFrZSBsYXp5P1xuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocGF0aFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUYXJnZXQoY29udmVydGVyLCBjdXJyZW50VGFyZ2V0LCBwYXRoVmFsdWUuUGF0aCwgY3VycmVudFRlcm0pLnRhcmdldDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0Fubm90YXRpb25QYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKGFubm90YXRpb25QYXRoLCBhbm5vdGF0aW9uSWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQW5ub3RhdGlvblBhdGgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW5ub3RhdGlvblBhdGguQW5ub3RhdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke2Fubm90YXRpb25JZHh9YCxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNUZXJtOiBjdXJyZW50VGVybSxcbiAgICAgICAgICAgICAgICAgICAgdGVybTogJycsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICcnXG4gICAgICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBsYXp5KFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICckdGFyZ2V0JyxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZVRhcmdldChjb252ZXJ0ZXIsIGN1cnJlbnRUYXJnZXQsIGFubm90YXRpb25QYXRoLkFubm90YXRpb25QYXRoLCBjdXJyZW50VGVybSkudGFyZ2V0XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKG5hdlByb3BlcnR5UGF0aCwgbmF2UHJvcElkeCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke25hdlByb3BJZHh9YFxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgbGF6eShcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAnJHRhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlVGFyZ2V0KGNvbnZlcnRlciwgY3VycmVudFRhcmdldCwgbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGN1cnJlbnRUZXJtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YXJnZXRcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ1JlY29yZCc6XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKChyZWNvcmREZWZpbml0aW9uLCByZWNvcmRJZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VSZWNvcmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRlcm0sXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkRGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICAgICAgYCR7cGFyZW50RlFOfS8ke3JlY29yZElkeH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0FwcGx5JzpcbiAgICAgICAgY2FzZSAnTnVsbCc6XG4gICAgICAgIGNhc2UgJ0lmJzpcbiAgICAgICAgY2FzZSAnRXEnOlxuICAgICAgICBjYXNlICdOZSc6XG4gICAgICAgIGNhc2UgJ0x0JzpcbiAgICAgICAgY2FzZSAnR3QnOlxuICAgICAgICBjYXNlICdMZSc6XG4gICAgICAgIGNhc2UgJ0dlJzpcbiAgICAgICAgY2FzZSAnTm90JzpcbiAgICAgICAgY2FzZSAnQW5kJzpcbiAgICAgICAgY2FzZSAnT3InOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgoaWZWYWx1ZSkgPT4gaWZWYWx1ZSk7XG5cbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoKHN0cmluZ1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHJpbmdWYWx1ZSA9PT0gJ3N0cmluZycgfHwgc3RyaW5nVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlLlN0cmluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNWNE5hdmlnYXRpb25Qcm9wZXJ0eShcbiAgICBuYXZQcm9wOiBSYXdWMk5hdmlnYXRpb25Qcm9wZXJ0eSB8IFJhd1Y0TmF2aWdhdGlvblByb3BlcnR5XG4pOiBuYXZQcm9wIGlzIFJhd1Y0TmF2aWdhdGlvblByb3BlcnR5IHtcbiAgICByZXR1cm4gISEobmF2UHJvcCBhcyBCYXNlTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlTmFtZTtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgYWxpYXMgZnJvbSB0aGUgdGVybSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgY3VycmVudCBzZXQgb2YgcmVmZXJlbmNlc1xuICogQHBhcmFtIHRlcm1WYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHRlcm1cbiAqIEByZXR1cm5zIHRoZSB0ZXJtIGFsaWFzIGFuZCB0aGUgYWN0dWFsIHRlcm0gdmFsdWVcbiAqL1xuZnVuY3Rpb24gc3BsaXRUZXJtKHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNXaXRoTWFwLCB0ZXJtVmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiBzcGxpdEF0TGFzdChhbGlhcyhyZWZlcmVuY2VzLCB0ZXJtVmFsdWUpLCAnLicpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0QW5ub3RhdGlvbihjb252ZXJ0ZXI6IENvbnZlcnRlciwgdGFyZ2V0OiBhbnksIHJhd0Fubm90YXRpb246IFJhd0Fubm90YXRpb24pOiBBbm5vdGF0aW9uIHtcbiAgICBsZXQgYW5ub3RhdGlvbjogYW55O1xuICAgIGlmIChyYXdBbm5vdGF0aW9uLnJlY29yZCkge1xuICAgICAgICBhbm5vdGF0aW9uID0gcGFyc2VSZWNvcmQoXG4gICAgICAgICAgICBjb252ZXJ0ZXIsXG4gICAgICAgICAgICByYXdBbm5vdGF0aW9uLnRlcm0sXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuX19zb3VyY2UsXG4gICAgICAgICAgICByYXdBbm5vdGF0aW9uLnJlY29yZCxcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChyYXdBbm5vdGF0aW9uLmNvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhbm5vdGF0aW9uID0gcGFyc2VWYWx1ZShcbiAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24udGVybSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgKHJhd0Fubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZSxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24udmFsdWUgPz8geyB0eXBlOiAnQm9vbCcsIEJvb2w6IHRydWUgfSxcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChyYXdBbm5vdGF0aW9uLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgYW5ub3RhdGlvbiA9IHBhcnNlQ29sbGVjdGlvbihcbiAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24udGVybSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgKHJhd0Fubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZSxcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb24uY29sbGVjdGlvbixcbiAgICAgICAgICAgIChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjYXNlJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlb2YgYW5ub3RhdGlvbikge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy13cmFwcGVyc1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG5ldyBTdHJpbmcoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LXdyYXBwZXJzXG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gbmV3IEJvb2xlYW4oYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBuZXcgTnVtYmVyKGFubm90YXRpb24pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IChyYXdBbm5vdGF0aW9uIGFzIGFueSkuZnVsbHlRdWFsaWZpZWROYW1lO1xuICAgIGFubm90YXRpb25bQU5OT1RBVElPTl9UQVJHRVRdID0gdGFyZ2V0O1xuXG4gICAgY29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IGNvbnZlcnRlci5zcGxpdFRlcm0ocmF3QW5ub3RhdGlvbi50ZXJtKTtcblxuICAgIGFubm90YXRpb24udGVybSA9IGNvbnZlcnRlci51bmFsaWFzKGAke3ZvY0FsaWFzfS4ke3ZvY1Rlcm19YCk7XG4gICAgYW5ub3RhdGlvbi5xdWFsaWZpZXIgPSByYXdBbm5vdGF0aW9uLnF1YWxpZmllcjtcbiAgICBhbm5vdGF0aW9uLl9fc291cmNlID0gKHJhd0Fubm90YXRpb24gYXMgYW55KS5fX3NvdXJjZTtcblxuICAgIHRyeSB7XG4gICAgICAgIGxhenkoYW5ub3RhdGlvbiwgJ2Fubm90YXRpb25zJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbkZRTiA9IGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lO1xuXG4gICAgICAgICAgICAvLyBiZSBncmFjZWZ1bCB3aGVuIHJlc29sdmluZyBhbm5vdGF0aW9ucyBvbiBhbm5vdGF0aW9uczogU29tZXRpbWVzIHRoZXkgYXJlIHJlZmVyZW5jZWQgZGlyZWN0bHksIHNvbWV0aW1lcyB0aGV5XG4gICAgICAgICAgICAvLyBhcmUgcGFydCBvZiB0aGUgZ2xvYmFsIGFubm90YXRpb25zIGxpc3RcbiAgICAgICAgICAgIGxldCBhbm5vdGF0aW9ucztcbiAgICAgICAgICAgIGlmIChyYXdBbm5vdGF0aW9uLmFubm90YXRpb25zICYmIHJhd0Fubm90YXRpb24uYW5ub3RhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gcmF3QW5ub3RhdGlvbi5hbm5vdGF0aW9ucztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBjb252ZXJ0ZXIucmF3QW5ub3RhdGlvbnNQZXJUYXJnZXRbYW5ub3RhdGlvbkZRTl0/LmFubm90YXRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhbm5vdGF0aW9ucz8uZm9yRWFjaCgocmF3U3ViQW5ub3RhdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmF3U3ViQW5ub3RhdGlvbi50YXJnZXQgPSBhbm5vdGF0aW9uRlFOO1xuICAgICAgICAgICAgICAgIHJhd1N1YkFubm90YXRpb24uX19zb3VyY2UgPSBhbm5vdGF0aW9uLl9fc291cmNlO1xuICAgICAgICAgICAgICAgIHJhd1N1YkFubm90YXRpb25bQU5OT1RBVElPTl9UQVJHRVRdID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJhd1N1YkFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lID0gYCR7YW5ub3RhdGlvbkZRTn1AJHtyYXdTdWJBbm5vdGF0aW9uLnRlcm19YDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQW5ub3RhdGlvbnNPYmplY3QoY29udmVydGVyLCBhbm5vdGF0aW9uLCBhbm5vdGF0aW9ucyA/PyBbXSk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm90IGFuIGVycm9yOiBwYXJzZVJlY29yZCgpIGFscmVhZHkgYWRkcyBhbm5vdGF0aW9ucywgYnV0IHRoZSBvdGhlciBwYXJzZVhYWCBmdW5jdGlvbnMgZG9uJ3QsIHNvIHRoaXMgY2FuIGhhcHBlblxuICAgIH1cblxuICAgIHJldHVybiBhbm5vdGF0aW9uIGFzIEFubm90YXRpb247XG59XG5cbmZ1bmN0aW9uIGdldEFubm90YXRpb25GUU4oY3VycmVudFRhcmdldE5hbWU6IHN0cmluZywgcmVmZXJlbmNlczogUmVmZXJlbmNlW10sIGFubm90YXRpb246IFJhd0Fubm90YXRpb24pIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uRlFOID0gYCR7Y3VycmVudFRhcmdldE5hbWV9QCR7dW5hbGlhcyhyZWZlcmVuY2VzLCBhbm5vdGF0aW9uLnRlcm0pfWA7XG5cbiAgICBpZiAoYW5ub3RhdGlvbi5xdWFsaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGAke2Fubm90YXRpb25GUU59IyR7YW5ub3RhdGlvbi5xdWFsaWZpZXJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkZRTjtcbiAgICB9XG59XG5cbi8qKlxuICogTWVyZ2UgYW5ub3RhdGlvbiBmcm9tIGRpZmZlcmVudCBzb3VyY2UgdG9nZXRoZXIgYnkgb3ZlcndyaXRpbmcgYXQgdGhlIHRlcm0gbGV2ZWwuXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhXG4gKiBAcmV0dXJucyB0aGUgcmVzdWx0aW5nIG1lcmdlZCBhbm5vdGF0aW9uc1xuICovXG5mdW5jdGlvbiBtZXJnZUFubm90YXRpb25zKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXQ6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0PiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykuZm9yRWFjaCgoYW5ub3RhdGlvblNvdXJjZSkgPT4ge1xuICAgICAgICByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0uZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3Q6IEFubm90YXRpb25MaXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0TmFtZSA9IHVuYWxpYXMocmF3TWV0YWRhdGEucmVmZXJlbmNlcywgYW5ub3RhdGlvbkxpc3QudGFyZ2V0KSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAoYW5ub3RhdGlvbkxpc3QgYXMgYW55KS5fX3NvdXJjZSA9IGFubm90YXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBpZiAoIWFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSkge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGFubm90YXRpb25MaXN0LmFubm90YXRpb25zLm1hcCgoYW5ub3RhdGlvbjogUmF3QW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGFubm90YXRpb24gYXMgQW5ub3RhdGlvbikuZnVsbHlRdWFsaWZpZWROYW1lID0gZ2V0QW5ub3RhdGlvbkZRTihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdNZXRhZGF0YS5yZWZlcmVuY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbiBhcyBhbnkpLl9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBjdXJyZW50VGFyZ2V0TmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgKGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXSBhcyBhbnkpLl9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbjogUmF3QW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kSW5kZXggPSBhbm5vdGF0aW9uTGlzdFBlclRhcmdldFtjdXJyZW50VGFyZ2V0TmFtZV0uYW5ub3RhdGlvbnMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmVyZW5jZUFubm90YXRpb246IFJhd0Fubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VBbm5vdGF0aW9uLnRlcm0gPT09IGFubm90YXRpb24udGVybSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VBbm5vdGF0aW9uLnF1YWxpZmllciA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbiBhcyBhbnkpLl9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgKGFubm90YXRpb24gYXMgQW5ub3RhdGlvbikuZnVsbHlRdWFsaWZpZWROYW1lID0gZ2V0QW5ub3RhdGlvbkZRTihcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3TWV0YWRhdGEucmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5hbm5vdGF0aW9ucy5zcGxpY2UoZmluZEluZGV4LCAxLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5hbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBhbm5vdGF0aW9uTGlzdFBlclRhcmdldDtcbn1cblxuY2xhc3MgQ29udmVydGVyIHtcbiAgICBwcml2YXRlIF9yYXdBbm5vdGF0aW9uc1BlclRhcmdldDogUmVjb3JkPEZ1bGx5UXVhbGlmaWVkTmFtZSwgQW5ub3RhdGlvbkxpc3Q+O1xuICAgIGdldCByYXdBbm5vdGF0aW9uc1BlclRhcmdldCgpOiBSZWNvcmQ8RnVsbHlRdWFsaWZpZWROYW1lLCBBbm5vdGF0aW9uTGlzdD4ge1xuICAgICAgICBpZiAodGhpcy5fcmF3QW5ub3RhdGlvbnNQZXJUYXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcmF3QW5ub3RhdGlvbnNQZXJUYXJnZXQgPSBtZXJnZUFubm90YXRpb25zKHRoaXMucmF3TWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yYXdBbm5vdGF0aW9uc1BlclRhcmdldDtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRFbnRpdHlDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbnZlcnRlZEVsZW1lbnQoXG4gICAgICAgICAgICB0aGlzLnJhd01ldGFkYXRhLnNjaGVtYS5lbnRpdHlDb250YWluZXIuZnVsbHlRdWFsaWZpZWROYW1lLFxuICAgICAgICAgICAgdGhpcy5yYXdNZXRhZGF0YS5zY2hlbWEuZW50aXR5Q29udGFpbmVyLFxuICAgICAgICAgICAgY29udmVydEVudGl0eUNvbnRhaW5lclxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldENvbnZlcnRlZEVudGl0eVNldChmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRPdXRwdXQuZW50aXR5U2V0cy5ieV9mdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRTaW5nbGV0b24oZnVsbHlRdWFsaWZpZWROYW1lOiBGdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVkT3V0cHV0LnNpbmdsZXRvbnMuYnlfZnVsbHlRdWFsaWZpZWROYW1lKGZ1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29udmVydGVkRW50aXR5VHlwZShmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRPdXRwdXQuZW50aXR5VHlwZXMuYnlfZnVsbHlRdWFsaWZpZWROYW1lKGZ1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29udmVydGVkQ29tcGxleFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lOiBGdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVkT3V0cHV0LmNvbXBsZXhUeXBlcy5ieV9mdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbihmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRPdXRwdXQudHlwZURlZmluaXRpb25zLmJ5X2Z1bGx5UXVhbGlmaWVkTmFtZShmdWxseVF1YWxpZmllZE5hbWUpO1xuICAgIH1cblxuICAgIGdldENvbnZlcnRlZEFjdGlvbkltcG9ydChmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICBsZXQgYWN0aW9uSW1wb3J0ID0gdGhpcy5jb252ZXJ0ZWRPdXRwdXQuYWN0aW9uSW1wb3J0cy5ieV9mdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgaWYgKCFhY3Rpb25JbXBvcnQpIHtcbiAgICAgICAgICAgIGFjdGlvbkltcG9ydCA9IHRoaXMuY29udmVydGVkT3V0cHV0LmFjdGlvbkltcG9ydHMuYnlfbmFtZShmdWxseVF1YWxpZmllZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb25JbXBvcnQ7XG4gICAgfVxuXG4gICAgZ2V0Q29udmVydGVkQWN0aW9uKGZ1bGx5UXVhbGlmaWVkTmFtZTogRnVsbHlRdWFsaWZpZWROYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRlZE91dHB1dC5hY3Rpb25zLmJ5X2Z1bGx5UXVhbGlmaWVkTmFtZShmdWxseVF1YWxpZmllZE5hbWUpO1xuICAgIH1cblxuICAgIGNvbnZlcnQ8Q29udmVydGVkLCBSYXcgZXh0ZW5kcyBSYXdUeXBlPENvbnZlcnRlZD4+KFxuICAgICAgICByYXdWYWx1ZTogUmF3LFxuICAgICAgICBtYXA6IChjb252ZXJ0ZXI6IENvbnZlcnRlciwgcmF3OiBSYXcpID0+IENvbnZlcnRlZFxuICAgICk6ICgpID0+IENvbnZlcnRlZDtcbiAgICBjb252ZXJ0PENvbnZlcnRlZCwgUmF3IGV4dGVuZHMgUmF3VHlwZTxDb252ZXJ0ZWQ+LCBJbmRleFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBDb252ZXJ0ZWQsIHN0cmluZz4+KFxuICAgICAgICByYXdWYWx1ZTogUmF3W10sXG4gICAgICAgIG1hcDogKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXc6IFJhdykgPT4gQ29udmVydGVkXG4gICAgKTogKCkgPT4gQXJyYXlXaXRoSW5kZXg8Q29udmVydGVkLCBJbmRleFByb3BlcnR5PjtcbiAgICBjb252ZXJ0PENvbnZlcnRlZCwgUmF3IGV4dGVuZHMgUmF3VHlwZTxDb252ZXJ0ZWQ+LCBJbmRleFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBDb252ZXJ0ZWQsIHN0cmluZz4+KFxuICAgICAgICByYXdWYWx1ZTogUmF3IHwgUmF3W10sXG4gICAgICAgIG1hcDogKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXc6IFJhdykgPT4gQ29udmVydGVkXG4gICAgKTogKCgpID0+IENvbnZlcnRlZCkgfCAoKCkgPT4gQXJyYXlXaXRoSW5kZXg8Q29udmVydGVkLCBJbmRleFByb3BlcnR5Pikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0gcmF3VmFsdWUucmVkdWNlKChjb252ZXJ0ZWRFbGVtZW50cywgcmF3RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRFbGVtZW50ID0gdGhpcy5nZXRDb252ZXJ0ZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJhd0VsZW1lbnQgYXMgYW55KS5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRFbGVtZW50cy5wdXNoKGNvbnZlcnRlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRFbGVtZW50cztcbiAgICAgICAgICAgICAgICB9LCBbXSBhcyBDb252ZXJ0ZWRbXSk7XG4gICAgICAgICAgICAgICAgYWRkR2V0QnlWYWx1ZShjb252ZXJ0ZWQsICduYW1lJyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIGFkZEdldEJ5VmFsdWUoY29udmVydGVkLCAnZnVsbHlRdWFsaWZpZWROYW1lJyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWQgYXMgQXJyYXlXaXRoSW5kZXg8Q29udmVydGVkLCBJbmRleFByb3BlcnR5PjtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gdGhpcy5nZXRDb252ZXJ0ZWRFbGVtZW50KHJhd1ZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcmF3VmFsdWUsIG1hcCkhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByYXdNZXRhZGF0YTogUmF3TWV0YWRhdGE7XG4gICAgcHJpdmF0ZSBjb252ZXJ0ZWRFbGVtZW50czogTWFwPEZ1bGx5UXVhbGlmaWVkTmFtZSwgYW55PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGNvbnZlcnRlZE91dHB1dDogQ29udmVydGVkTWV0YWRhdGE7XG5cbiAgICByYXdTY2hlbWE6IFJhd1NjaGVtYTtcblxuICAgIGNvbnN0cnVjdG9yKHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSwgY29udmVydGVkT3V0cHV0OiBDb252ZXJ0ZWRNZXRhZGF0YSkge1xuICAgICAgICB0aGlzLnJhd01ldGFkYXRhID0gcmF3TWV0YWRhdGE7XG4gICAgICAgIHRoaXMucmF3U2NoZW1hID0gcmF3TWV0YWRhdGEuc2NoZW1hO1xuICAgICAgICB0aGlzLmNvbnZlcnRlZE91dHB1dCA9IGNvbnZlcnRlZE91dHB1dDtcbiAgICB9XG5cbiAgICBnZXRDb252ZXJ0ZWRFbGVtZW50PENvbnZlcnRlZFR5cGUsIFJhd1R5cGUgZXh0ZW5kcyBSZW1vdmVBbm5vdGF0aW9uQW5kVHlwZTxDb252ZXJ0ZWRUeXBlPj4oXG4gICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogRnVsbHlRdWFsaWZpZWROYW1lLFxuICAgICAgICByYXdFbGVtZW50OiBSYXdUeXBlIHwgdW5kZWZpbmVkIHwgKChmdWxseVF1YWxpZmllZE5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZSkgPT4gUmF3VHlwZSB8IHVuZGVmaW5lZCksXG4gICAgICAgIG1hcDogKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXc6IFJhd1R5cGUpID0+IENvbnZlcnRlZFR5cGVcbiAgICApOiBDb252ZXJ0ZWRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGNvbnZlcnRlZDogQ29udmVydGVkVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuY29udmVydGVkRWxlbWVudHMuZ2V0KGZ1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgICAgIGlmIChjb252ZXJ0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmF3TWV0YWRhdGEgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiByYXdFbGVtZW50ID09PSAnZnVuY3Rpb24nID8gcmF3RWxlbWVudC5hcHBseSh1bmRlZmluZWQsIFtmdWxseVF1YWxpZmllZE5hbWVdKSA6IHJhd0VsZW1lbnQ7XG4gICAgICAgICAgICBpZiAocmF3TWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IG1hcC5hcHBseSh1bmRlZmluZWQsIFt0aGlzLCByYXdNZXRhZGF0YV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udmVydGVkRWxlbWVudHMuc2V0KGZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkO1xuICAgIH1cblxuICAgIGxvZ0Vycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbnZlcnRlZE91dHB1dC5kaWFnbm9zdGljcy5wdXNoKHsgbWVzc2FnZSB9KTtcbiAgICB9XG5cbiAgICBzcGxpdFRlcm0odGVybTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzcGxpdFRlcm0odGhpcy5yYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCB0ZXJtKTtcbiAgICB9XG5cbiAgICBhbGlhcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhbGlhcyh0aGlzLnJhd01ldGFkYXRhLnJlZmVyZW5jZXMsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB1bmFsaWFzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXModGhpcy5yYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCB2YWx1ZSkgPz8gJyc7XG4gICAgfVxufVxuXG50eXBlIFJhd1R5cGU8VD4gPSBSZW1vdmVBbm5vdGF0aW9uQW5kVHlwZTxUPiAmIHsgZnVsbHlRdWFsaWZpZWROYW1lOiBGdWxseVF1YWxpZmllZE5hbWUgfTtcblxuZnVuY3Rpb24gcmVzb2x2ZUVudGl0eVR5cGUoY29udmVydGVyOiBDb252ZXJ0ZXIsIGZ1bGx5UXVhbGlmaWVkTmFtZTogRnVsbHlRdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbGV0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkRW50aXR5VHlwZShmdWxseVF1YWxpZmllZE5hbWUpO1xuXG4gICAgICAgIGlmICghZW50aXR5VHlwZSkge1xuICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKGBFbnRpdHlUeXBlICcke2Z1bGx5UXVhbGlmaWVkTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgZW50aXR5VHlwZSA9IHt9IGFzIEVudGl0eVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudGl0eVR5cGU7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyLFxuICAgIHJhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzOiBTaW5nbGV0b25bJ25hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcnXSB8IEVudGl0eVNldFsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddLFxuICAgIHJhd0VsZW1lbnQ6IFJhd1NpbmdsZXRvbiB8IFJhd0VudGl0eVNldFxuKSB7XG4gICAgcmV0dXJuICgpID0+XG4gICAgICAgIE9iamVjdC5rZXlzKHJhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKS5yZWR1Y2UoKG5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzLCBiaW5kaW5nTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmF3QmluZGluZ1RhcmdldCA9IHJhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzW2JpbmRpbmdOYW1lXTtcblxuICAgICAgICAgICAgbGF6eShuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5ncywgYmluZGluZ05hbWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzb2x2ZWRCaW5kaW5nVGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmIChyYXdCaW5kaW5nVGFyZ2V0Ll90eXBlID09PSAnU2luZ2xldG9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEJpbmRpbmdUYXJnZXQgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkU2luZ2xldG9uKHJhd0JpbmRpbmdUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEJpbmRpbmdUYXJnZXQgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkRW50aXR5U2V0KHJhd0JpbmRpbmdUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmRpbmdUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7cmF3RWxlbWVudC5fdHlwZX0gJyR7cmF3RWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWV9JzogRmFpbGVkIHRvIHJlc29sdmUgTmF2aWdhdGlvblByb3BlcnR5QmluZGluZyAke2JpbmRpbmdOYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRCaW5kaW5nVGFyZ2V0ID0ge30gYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRCaW5kaW5nVGFyZ2V0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3M7XG4gICAgICAgIH0sIHt9IGFzIEVudGl0eVNldFsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddIHwgU2luZ2xldG9uWyduYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJ10pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0Fubm90YXRpb25UYXJnZXQ6IGFueSkge1xuICAgIGNvbnN0IG5lc3RlZEFubm90YXRpb25zID0gcmF3QW5ub3RhdGlvblRhcmdldC5hbm5vdGF0aW9ucztcblxuICAgIHJldHVybiAoKSA9PlxuICAgICAgICBjcmVhdGVBbm5vdGF0aW9uc09iamVjdChcbiAgICAgICAgICAgIGNvbnZlcnRlcixcbiAgICAgICAgICAgIHJhd0Fubm90YXRpb25UYXJnZXQsXG4gICAgICAgICAgICBuZXN0ZWRBbm5vdGF0aW9ucyA/P1xuICAgICAgICAgICAgICAgIGNvbnZlcnRlci5yYXdBbm5vdGF0aW9uc1BlclRhcmdldFtyYXdBbm5vdGF0aW9uVGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZV0/LmFubm90YXRpb25zID8/XG4gICAgICAgICAgICAgICAgW11cbiAgICAgICAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5ub3RhdGlvbnNPYmplY3QoY29udmVydGVyOiBDb252ZXJ0ZXIsIHRhcmdldDogYW55LCByYXdBbm5vdGF0aW9uczogUmF3QW5ub3RhdGlvbltdKSB7XG4gICAgcmV0dXJuIHJhd0Fubm90YXRpb25zLnJlZHVjZSgodm9jYWJ1bGFyeUFsaWFzZXMsIGFubm90YXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IGNvbnZlcnRlci5zcGxpdFRlcm0oYW5ub3RhdGlvbi50ZXJtKTtcbiAgICAgICAgY29uc3Qgdm9jVGVybVdpdGhRdWFsaWZpZXIgPSBgJHt2b2NUZXJtfSR7YW5ub3RhdGlvbi5xdWFsaWZpZXIgPyAnIycgKyBhbm5vdGF0aW9uLnF1YWxpZmllciA6ICcnfWA7XG5cbiAgICAgICAgaWYgKHZvY2FidWxhcnlBbGlhc2VzW3ZvY0FsaWFzXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2b2NhYnVsYXJ5QWxpYXNlc1t2b2NBbGlhc10gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdm9jYWJ1bGFyeUFsaWFzZXNbdm9jQWxpYXNdLmhhc093blByb3BlcnR5KHZvY1Rlcm1XaXRoUXVhbGlmaWVyKSkge1xuICAgICAgICAgICAgbGF6eSh2b2NhYnVsYXJ5QWxpYXNlc1t2b2NBbGlhc10sIHZvY1Rlcm1XaXRoUXVhbGlmaWVyLCAoKSA9PlxuICAgICAgICAgICAgICAgIGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbiBhcyBBbm5vdGF0aW9uKS5mdWxseVF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIChjb252ZXJ0ZXIsIHJhd0Fubm90YXRpb24pID0+IGNvbnZlcnRBbm5vdGF0aW9uKGNvbnZlcnRlciwgdGFyZ2V0LCByYXdBbm5vdGF0aW9uKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvY2FidWxhcnlBbGlhc2VzO1xuICAgIH0sIHt9IGFzIGFueSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gRW50aXR5Q29udGFpbmVyLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgICAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0VudGl0eUNvbnRhaW5lciAgICBVbmNvbnZlcnRlZCBFbnRpdHlDb250YWluZXJcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgRW50aXR5Q29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRFbnRpdHlDb250YWluZXIoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0VudGl0eUNvbnRhaW5lcjogUmF3RW50aXR5Q29udGFpbmVyKTogRW50aXR5Q29udGFpbmVyIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRFbnRpdHlDb250YWluZXIgPSByYXdFbnRpdHlDb250YWluZXIgYXMgRW50aXR5Q29udGFpbmVyO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlDb250YWluZXIsICdhbm5vdGF0aW9ucycsIHJlc29sdmVBbm5vdGF0aW9ucyhjb252ZXJ0ZXIsIHJhd0VudGl0eUNvbnRhaW5lcikpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlDb250YWluZXIsICdlbnRpdHlTZXRzJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5lbnRpdHlTZXRzLCBjb252ZXJ0RW50aXR5U2V0KSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEVudGl0eUNvbnRhaW5lciwgJ3NpbmdsZXRvbnMnLCBjb252ZXJ0ZXIuY29udmVydChjb252ZXJ0ZXIucmF3U2NoZW1hLnNpbmdsZXRvbnMsIGNvbnZlcnRTaW5nbGV0b24pKTtcblxuICAgIGxhenkoXG4gICAgICAgIGNvbnZlcnRlZEVudGl0eUNvbnRhaW5lcixcbiAgICAgICAgJ2FjdGlvbkltcG9ydHMnLFxuICAgICAgICBjb252ZXJ0ZXIuY29udmVydChjb252ZXJ0ZXIucmF3U2NoZW1hLmFjdGlvbkltcG9ydHMsIGNvbnZlcnRBY3Rpb25JbXBvcnQpXG4gICAgKTtcblxuICAgIHJldHVybiBjb252ZXJ0ZWRFbnRpdHlDb250YWluZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBTaW5nbGV0b24uXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd1NpbmdsZXRvbiAgVW5jb252ZXJ0ZWQgU2luZ2xldG9uXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIFNpbmdsZXRvblxuICovXG5mdW5jdGlvbiBjb252ZXJ0U2luZ2xldG9uKGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdTaW5nbGV0b246IFJhd1NpbmdsZXRvbik6IFNpbmdsZXRvbiB7XG4gICAgY29uc3QgY29udmVydGVkU2luZ2xldG9uID0gcmF3U2luZ2xldG9uIGFzIFNpbmdsZXRvbjtcblxuICAgIGNvbnZlcnRlZFNpbmdsZXRvbi5lbnRpdHlUeXBlTmFtZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd1NpbmdsZXRvbi5lbnRpdHlUeXBlTmFtZSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZFNpbmdsZXRvbiwgJ2VudGl0eVR5cGUnLCByZXNvbHZlRW50aXR5VHlwZShjb252ZXJ0ZXIsIHJhd1NpbmdsZXRvbi5lbnRpdHlUeXBlTmFtZSkpO1xuICAgIGxhenkoY29udmVydGVkU2luZ2xldG9uLCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdTaW5nbGV0b24gYXMgU2luZ2xldG9uKSk7XG5cbiAgICBjb25zdCBfcmF3TmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3MgPSByYXdTaW5nbGV0b24ubmF2aWdhdGlvblByb3BlcnR5QmluZGluZztcbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRTaW5nbGV0b24sXG4gICAgICAgICduYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJyxcbiAgICAgICAgcmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKFxuICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgX3Jhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzIGFzIFNpbmdsZXRvblsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddLFxuICAgICAgICAgICAgcmF3U2luZ2xldG9uXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZFNpbmdsZXRvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBFbnRpdHlTZXQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0VudGl0eVNldCAgVW5jb252ZXJ0ZWQgRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIEVudGl0eVNldFxuICovXG5mdW5jdGlvbiBjb252ZXJ0RW50aXR5U2V0KGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdFbnRpdHlTZXQ6IFJhd0VudGl0eVNldCk6IEVudGl0eVNldCB7XG4gICAgY29uc3QgY29udmVydGVkRW50aXR5U2V0ID0gcmF3RW50aXR5U2V0IGFzIEVudGl0eVNldDtcblxuICAgIGNvbnZlcnRlZEVudGl0eVNldC5lbnRpdHlUeXBlTmFtZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd0VudGl0eVNldC5lbnRpdHlUeXBlTmFtZSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEVudGl0eVNldCwgJ2VudGl0eVR5cGUnLCByZXNvbHZlRW50aXR5VHlwZShjb252ZXJ0ZXIsIHJhd0VudGl0eVNldC5lbnRpdHlUeXBlTmFtZSkpO1xuICAgIGxhenkoY29udmVydGVkRW50aXR5U2V0LCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KSk7XG5cbiAgICBjb25zdCBfcmF3TmF2aWdhdGlvblByb3BlcnR5QmluZGluZ3MgPSByYXdFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZztcbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRFbnRpdHlTZXQsXG4gICAgICAgICduYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nJyxcbiAgICAgICAgcmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzKFxuICAgICAgICAgICAgY29udmVydGVyLFxuICAgICAgICAgICAgX3Jhd05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdzIGFzIEVudGl0eVNldFsnbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyddLFxuICAgICAgICAgICAgcmF3RW50aXR5U2V0XG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZEVudGl0eVNldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBFbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgICBDb252ZXJ0ZXJcbiAqIEBwYXJhbSByYXdFbnRpdHlUeXBlICBVbmNvbnZlcnRlZCBFbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIEVudGl0eVR5cGVcbiAqL1xuZnVuY3Rpb24gY29udmVydEVudGl0eVR5cGUoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0VudGl0eVR5cGU6IFJhd0VudGl0eVR5cGUpOiBFbnRpdHlUeXBlIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRFbnRpdHlUeXBlID0gcmF3RW50aXR5VHlwZSBhcyBFbnRpdHlUeXBlO1xuXG4gICAgcmF3RW50aXR5VHlwZS5rZXlzLmZvckVhY2goKGtleVByb3A6IGFueSkgPT4ge1xuICAgICAgICBrZXlQcm9wLmlzS2V5ID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGxhenkoY29udmVydGVkRW50aXR5VHlwZSwgJ2Fubm90YXRpb25zJywgcmVzb2x2ZUFubm90YXRpb25zKGNvbnZlcnRlciwgcmF3RW50aXR5VHlwZSkpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlUeXBlLCAna2V5cycsIGNvbnZlcnRlci5jb252ZXJ0KHJhd0VudGl0eVR5cGUua2V5cywgY29udmVydFByb3BlcnR5KSk7XG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlUeXBlLCAnZW50aXR5UHJvcGVydGllcycsIGNvbnZlcnRlci5jb252ZXJ0KHJhd0VudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcywgY29udmVydFByb3BlcnR5KSk7XG4gICAgbGF6eShcbiAgICAgICAgY29udmVydGVkRW50aXR5VHlwZSxcbiAgICAgICAgJ25hdmlnYXRpb25Qcm9wZXJ0aWVzJyxcbiAgICAgICAgY29udmVydGVyLmNvbnZlcnQocmF3RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcyBhcyBhbnlbXSwgY29udmVydE5hdmlnYXRpb25Qcm9wZXJ0eSlcbiAgICApO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRFbnRpdHlUeXBlLCAnYWN0aW9ucycsICgpID0+XG4gICAgICAgIGNvbnZlcnRlci5yYXdTY2hlbWEuYWN0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocmF3QWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICByYXdBY3Rpb24uaXNCb3VuZCAmJlxuICAgICAgICAgICAgICAgICAgICAocmF3QWN0aW9uLnNvdXJjZVR5cGUgPT09IHJhd0VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdBY3Rpb24uc291cmNlVHlwZSA9PT0gYENvbGxlY3Rpb24oJHtyYXdFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZX0pYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjdGlvbnMsIHJhd0FjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBgJHtjb252ZXJ0ZXIucmF3U2NoZW1hLm5hbWVzcGFjZX0uJHtyYXdBY3Rpb24ubmFtZX1gO1xuICAgICAgICAgICAgICAgIGFjdGlvbnNbbmFtZV0gPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQWN0aW9uKHJhd0FjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpITtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9ucztcbiAgICAgICAgICAgIH0sIHt9IGFzIEVudGl0eVR5cGVbJ2FjdGlvbnMnXSlcbiAgICApO1xuXG4gICAgY29udmVydGVkRW50aXR5VHlwZS5yZXNvbHZlUGF0aCA9IChyZWxhdGl2ZVBhdGg6IHN0cmluZywgaW5jbHVkZVZpc2l0ZWRPYmplY3RzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVUYXJnZXQoY29udmVydGVyLCByYXdFbnRpdHlUeXBlLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBpZiAoaW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0YXJnZXQ6IHJlc29sdmVkLnRhcmdldCwgdmlzaXRlZE9iamVjdHM6IHJlc29sdmVkLm9iamVjdFBhdGgsIG1lc3NhZ2VzOiByZXNvbHZlZC5tZXNzYWdlcyB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkLnRhcmdldDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gY29udmVydGVkRW50aXR5VHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgICBDb252ZXJ0ZXJcbiAqIEBwYXJhbSByYXdQcm9wZXJ0eSAgVW5jb252ZXJ0ZWQgUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgUHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gY29udmVydFByb3BlcnR5KGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdQcm9wZXJ0eTogUmF3UHJvcGVydHkpOiBQcm9wZXJ0eSB7XG4gICAgY29uc3QgY29udmVydGVkUHJvcGVydHkgPSByYXdQcm9wZXJ0eSBhcyBQcm9wZXJ0eTtcblxuICAgIGNvbnZlcnRlZFByb3BlcnR5LnR5cGUgPSBjb252ZXJ0ZXIudW5hbGlhcyhyYXdQcm9wZXJ0eS50eXBlKTtcbiAgICBsYXp5KGNvbnZlcnRlZFByb3BlcnR5LCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdQcm9wZXJ0eSkpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRQcm9wZXJ0eSwgJ3RhcmdldFR5cGUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSByYXdQcm9wZXJ0eS50eXBlO1xuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IHR5cGUuc3RhcnRzV2l0aCgnQ29sbGVjdGlvbicpID8gdHlwZS5zdWJzdHJpbmcoMTEsIHR5cGUubGVuZ3RoIC0gMSkgOiB0eXBlO1xuXG4gICAgICAgIHJldHVybiBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQ29tcGxleFR5cGUodHlwZU5hbWUpID8/IGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbih0eXBlTmFtZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkUHJvcGVydHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBOYXZpZ2F0aW9uUHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd05hdmlnYXRpb25Qcm9wZXJ0eSAgVW5jb252ZXJ0ZWQgTmF2aWdhdGlvblByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIE5hdmlnYXRpb25Qcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBjb252ZXJ0TmF2aWdhdGlvblByb3BlcnR5KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyLFxuICAgIHJhd05hdmlnYXRpb25Qcm9wZXJ0eTogUmF3VjJOYXZpZ2F0aW9uUHJvcGVydHkgfCBSYXdWNE5hdmlnYXRpb25Qcm9wZXJ0eVxuKTogTmF2aWdhdGlvblByb3BlcnR5IHtcbiAgICBjb25zdCBjb252ZXJ0ZWROYXZpZ2F0aW9uUHJvcGVydHkgPSByYXdOYXZpZ2F0aW9uUHJvcGVydHkgYXMgTmF2aWdhdGlvblByb3BlcnR5O1xuXG4gICAgY29udmVydGVkTmF2aWdhdGlvblByb3BlcnR5LnJlZmVyZW50aWFsQ29uc3RyYWludCA9IGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS5yZWZlcmVudGlhbENvbnN0cmFpbnQgPz8gW107XG5cbiAgICBpZiAoaXNWNE5hdmlnYXRpb25Qcm9wZXJ0eShyYXdOYXZpZ2F0aW9uUHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlTmFtZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd05hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXNzb2NpYXRpb25FbmQgPSBjb252ZXJ0ZXIucmF3U2NoZW1hLmFzc29jaWF0aW9uc1xuICAgICAgICAgICAgLmZpbmQoKGFzc29jaWF0aW9uKSA9PiBhc3NvY2lhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUgPT09IHJhd05hdmlnYXRpb25Qcm9wZXJ0eS5yZWxhdGlvbnNoaXApXG4gICAgICAgICAgICA/LmFzc29jaWF0aW9uRW5kLmZpbmQoKGVuZCkgPT4gZW5kLnJvbGUgPT09IHJhd05hdmlnYXRpb25Qcm9wZXJ0eS50b1JvbGUpO1xuXG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS5pc0NvbGxlY3Rpb24gPSBhc3NvY2lhdGlvbkVuZD8ubXVsdGlwbGljaXR5ID09PSAnKic7XG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlTmFtZSA9IGFzc29jaWF0aW9uRW5kPy50eXBlID8/ICcnO1xuICAgIH1cblxuICAgIGxhenkoXG4gICAgICAgIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eSxcbiAgICAgICAgJ3RhcmdldFR5cGUnLFxuICAgICAgICByZXNvbHZlRW50aXR5VHlwZShjb252ZXJ0ZXIsIChyYXdOYXZpZ2F0aW9uUHJvcGVydHkgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlTmFtZSlcbiAgICApO1xuXG4gICAgbGF6eShjb252ZXJ0ZWROYXZpZ2F0aW9uUHJvcGVydHksICdhbm5vdGF0aW9ucycsIHJlc29sdmVBbm5vdGF0aW9ucyhjb252ZXJ0ZXIsIHJhd05hdmlnYXRpb25Qcm9wZXJ0eSkpO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZE5hdmlnYXRpb25Qcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBY3Rpb25JbXBvcnQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0FjdGlvbkltcG9ydCAgVW5jb252ZXJ0ZWQgQWN0aW9uSW1wb3J0XG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIEFjdGlvbkltcG9ydFxuICovXG5mdW5jdGlvbiBjb252ZXJ0QWN0aW9uSW1wb3J0KGNvbnZlcnRlcjogQ29udmVydGVyLCByYXdBY3Rpb25JbXBvcnQ6IFJhd0FjdGlvbkltcG9ydCk6IEFjdGlvbkltcG9ydCB7XG4gICAgY29uc3QgY29udmVydGVkQWN0aW9uSW1wb3J0ID0gcmF3QWN0aW9uSW1wb3J0IGFzIEFjdGlvbkltcG9ydDtcblxuICAgIGNvbnZlcnRlZEFjdGlvbkltcG9ydC5hY3Rpb25OYW1lID0gY29udmVydGVyLnVuYWxpYXMocmF3QWN0aW9uSW1wb3J0LmFjdGlvbk5hbWUpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRBY3Rpb25JbXBvcnQsICdhbm5vdGF0aW9ucycsIHJlc29sdmVBbm5vdGF0aW9ucyhjb252ZXJ0ZXIsIHJhd0FjdGlvbkltcG9ydCkpO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRBY3Rpb25JbXBvcnQsICdhY3Rpb24nLCAoKSA9PiBjb252ZXJ0ZXIuZ2V0Q29udmVydGVkQWN0aW9uKHJhd0FjdGlvbkltcG9ydC5hY3Rpb25OYW1lKSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkQWN0aW9uSW1wb3J0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgQ29udmVydGVyXG4gKiBAcGFyYW0gcmF3QWN0aW9uICBVbmNvbnZlcnRlZCBBY3Rpb25cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgQWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRBY3Rpb24oY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0FjdGlvbjogUmF3QWN0aW9uKTogQWN0aW9uIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRBY3Rpb24gPSByYXdBY3Rpb24gYXMgQWN0aW9uO1xuXG4gICAgY29udmVydGVkQWN0aW9uLnNvdXJjZVR5cGUgPSBjb252ZXJ0ZXIudW5hbGlhcyhyYXdBY3Rpb24uc291cmNlVHlwZSk7XG4gICAgaWYgKGNvbnZlcnRlZEFjdGlvbi5zb3VyY2VUeXBlKSB7XG4gICAgICAgIGxhenkoY29udmVydGVkQWN0aW9uLCAnc291cmNlRW50aXR5VHlwZScsIHJlc29sdmVFbnRpdHlUeXBlKGNvbnZlcnRlciwgcmF3QWN0aW9uLnNvdXJjZVR5cGUpKTtcbiAgICB9XG5cbiAgICBjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuVHlwZSA9IGNvbnZlcnRlci51bmFsaWFzKHJhd0FjdGlvbi5yZXR1cm5UeXBlKTtcbiAgICBpZiAoY29udmVydGVkQWN0aW9uLnJldHVyblR5cGUpIHtcbiAgICAgICAgbGF6eShjb252ZXJ0ZWRBY3Rpb24sICdyZXR1cm5FbnRpdHlUeXBlJywgcmVzb2x2ZUVudGl0eVR5cGUoY29udmVydGVyLCByYXdBY3Rpb24ucmV0dXJuVHlwZSkpO1xuICAgIH1cblxuICAgIGxhenkoY29udmVydGVkQWN0aW9uLCAncGFyYW1ldGVycycsIGNvbnZlcnRlci5jb252ZXJ0KHJhd0FjdGlvbi5wYXJhbWV0ZXJzLCBjb252ZXJ0QWN0aW9uUGFyYW1ldGVyKSk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEFjdGlvbiwgJ2Fubm90YXRpb25zJywgKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLmlzLnRoZS5hY3Rpb24ob24udGhpcy50eXBlKSAtLT4gYWN0aW9uOiAndGhpcy5pcy50aGUuYWN0aW9uJywgb3ZlcmxvYWQ6ICdvbi50aGlzLnR5cGUnXG4gICAgICAgIC8vIHRoaXMuaXMudGhlLmFjdGlvbigpICAgICAgICAgICAgIC0tPiBhY3Rpb246ICd0aGlzLmlzLnRoZS5hY3Rpb24nLCBvdmVybG9hZDogdW5kZWZpbmVkXG4gICAgICAgIC8vIHRoaXMuaXMudGhlLmFjdGlvbiAgICAgICAgICAgICAgIC0tPiBhY3Rpb246ICd0aGlzLmlzLnRoZS5hY3Rpb24nLCBvdmVybG9hZDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IGFjdGlvbkFuZE92ZXJsb2FkID0gcmF3QWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5tYXRjaCgvKD88YWN0aW9uPlteKCldKykoPzpcXCgoPzxvdmVybG9hZD4uKilcXCkpPy8pO1xuXG4gICAgICAgIGxldCByYXdBbm5vdGF0aW9uczogUmF3QW5ub3RhdGlvbltdID0gW107XG4gICAgICAgIGlmIChhY3Rpb25BbmRPdmVybG9hZCkge1xuICAgICAgICAgICAgaWYgKGFjdGlvbkFuZE92ZXJsb2FkLmdyb3Vwcz8ub3ZlcmxvYWQpIHtcbiAgICAgICAgICAgICAgICByYXdBbm5vdGF0aW9ucyA9IGNvbnZlcnRlci5yYXdBbm5vdGF0aW9uc1BlclRhcmdldFtyYXdBY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lXT8uYW5ub3RhdGlvbnMgPz8gW107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJhd0Fubm90YXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLnJhd0Fubm90YXRpb25zUGVyVGFyZ2V0W2Ake2FjdGlvbkFuZE92ZXJsb2FkLmdyb3Vwcz8uYWN0aW9ufSgpYF0/LmFubm90YXRpb25zID8/IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWN0aW9uQW5kT3ZlcmxvYWQuZ3JvdXBzPy5hY3Rpb24gJiYgYWN0aW9uQW5kT3ZlcmxvYWQuZ3JvdXBzPy5hY3Rpb24gIT09IHJhd0FjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlQW5ub3RhdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIucmF3QW5ub3RhdGlvbnNQZXJUYXJnZXRbYWN0aW9uQW5kT3ZlcmxvYWQuZ3JvdXBzPy5hY3Rpb25dPy5hbm5vdGF0aW9ucyA/PyBbXTtcbiAgICAgICAgICAgICAgICByYXdBbm5vdGF0aW9ucyA9IHJhd0Fubm90YXRpb25zLmNvbmNhdChiYXNlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFubm90YXRpb25zT2JqZWN0KGNvbnZlcnRlciwgcmF3QWN0aW9uLCByYXdBbm5vdGF0aW9ucyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkQWN0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEFjdGlvblBhcmFtZXRlci5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyICAgQ29udmVydGVyXG4gKiBAcGFyYW0gcmF3QWN0aW9uUGFyYW1ldGVyICBVbmNvbnZlcnRlZCBBY3Rpb25QYXJhbWV0ZXJcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgQWN0aW9uUGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRBY3Rpb25QYXJhbWV0ZXIoXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXIsXG4gICAgcmF3QWN0aW9uUGFyYW1ldGVyOiBSYXdBY3Rpb25bJ3BhcmFtZXRlcnMnXVtudW1iZXJdXG4pOiBBY3Rpb25QYXJhbWV0ZXIge1xuICAgIGNvbnN0IGNvbnZlcnRlZEFjdGlvblBhcmFtZXRlciA9IHJhd0FjdGlvblBhcmFtZXRlciBhcyBBY3Rpb25QYXJhbWV0ZXI7XG5cbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRBY3Rpb25QYXJhbWV0ZXIsXG4gICAgICAgICd0eXBlUmVmZXJlbmNlJyxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGNvbnZlcnRlci5nZXRDb252ZXJ0ZWRFbnRpdHlUeXBlKHJhd0FjdGlvblBhcmFtZXRlci50eXBlKSA/P1xuICAgICAgICAgICAgY29udmVydGVyLmdldENvbnZlcnRlZENvbXBsZXhUeXBlKHJhd0FjdGlvblBhcmFtZXRlci50eXBlKSA/P1xuICAgICAgICAgICAgY29udmVydGVyLmdldENvbnZlcnRlZFR5cGVEZWZpbml0aW9uKHJhd0FjdGlvblBhcmFtZXRlci50eXBlKVxuICAgICk7XG5cbiAgICBsYXp5KGNvbnZlcnRlZEFjdGlvblBhcmFtZXRlciwgJ2Fubm90YXRpb25zJywgcmVzb2x2ZUFubm90YXRpb25zKGNvbnZlcnRlciwgcmF3QWN0aW9uUGFyYW1ldGVyKSk7XG5cbiAgICByZXR1cm4gY29udmVydGVkQWN0aW9uUGFyYW1ldGVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgQ29tcGxleFR5cGUuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd0NvbXBsZXhUeXBlICBVbmNvbnZlcnRlZCBDb21wbGV4VHlwZVxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBDb21wbGV4VHlwZVxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q29tcGxleFR5cGUoY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd0NvbXBsZXhUeXBlOiBSYXdDb21wbGV4VHlwZSk6IENvbXBsZXhUeXBlIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRDb21wbGV4VHlwZSA9IHJhd0NvbXBsZXhUeXBlIGFzIENvbXBsZXhUeXBlO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRDb21wbGV4VHlwZSwgJ3Byb3BlcnRpZXMnLCBjb252ZXJ0ZXIuY29udmVydChyYXdDb21wbGV4VHlwZS5wcm9wZXJ0aWVzLCBjb252ZXJ0UHJvcGVydHkpKTtcbiAgICBsYXp5KFxuICAgICAgICBjb252ZXJ0ZWRDb21wbGV4VHlwZSxcbiAgICAgICAgJ25hdmlnYXRpb25Qcm9wZXJ0aWVzJyxcbiAgICAgICAgY29udmVydGVyLmNvbnZlcnQocmF3Q29tcGxleFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgYXMgYW55W10sIGNvbnZlcnROYXZpZ2F0aW9uUHJvcGVydHkpXG4gICAgKTtcbiAgICBsYXp5KGNvbnZlcnRlZENvbXBsZXhUeXBlLCAnYW5ub3RhdGlvbnMnLCByZXNvbHZlQW5ub3RhdGlvbnMoY29udmVydGVyLCByYXdDb21wbGV4VHlwZSkpO1xuXG4gICAgcmV0dXJuIGNvbnZlcnRlZENvbXBsZXhUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgVHlwZURlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlciAgIENvbnZlcnRlclxuICogQHBhcmFtIHJhd1R5cGVEZWZpbml0aW9uICBVbmNvbnZlcnRlZCBUeXBlRGVmaW5pdGlvblxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBUeXBlRGVmaW5pdGlvblxuICovXG5mdW5jdGlvbiBjb252ZXJ0VHlwZURlZmluaXRpb24oY29udmVydGVyOiBDb252ZXJ0ZXIsIHJhd1R5cGVEZWZpbml0aW9uOiBSYXdUeXBlRGVmaW5pdGlvbik6IFR5cGVEZWZpbml0aW9uIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbiA9IHJhd1R5cGVEZWZpbml0aW9uIGFzIFR5cGVEZWZpbml0aW9uO1xuXG4gICAgbGF6eShjb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbiwgJ2Fubm90YXRpb25zJywgcmVzb2x2ZUFubm90YXRpb25zKGNvbnZlcnRlciwgcmF3VHlwZURlZmluaXRpb24pKTtcblxuICAgIHJldHVybiBjb252ZXJ0ZWRUeXBlRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgUmF3TWV0YWRhdGEgaW50byBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gdG8gYmUgdXNlZCB0byBlYXNpbHkgbmF2aWdhdGUgYSBtZXRhZGF0YSBvYmplY3QgYW5kIGl0cyBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSByYXdNZXRhZGF0YVxuICogQHJldHVybnMgdGhlIGNvbnZlcnRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0KHJhd01ldGFkYXRhOiBSYXdNZXRhZGF0YSk6IENvbnZlcnRlZE1ldGFkYXRhIHtcbiAgICAvLyBmYWxsIGJhY2sgb24gdGhlIGRlZmF1bHQgcmVmZXJlbmNlcyBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IHNwZWNpZnkgYW55XG4gICAgaWYgKHJhd01ldGFkYXRhLnJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJhd01ldGFkYXRhLnJlZmVyZW5jZXMgPSBkZWZhdWx0UmVmZXJlbmNlcztcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0ZXIgT3V0cHV0XG4gICAgY29uc3QgY29udmVydGVkT3V0cHV0OiBDb252ZXJ0ZWRNZXRhZGF0YSA9IHtcbiAgICAgICAgdmVyc2lvbjogcmF3TWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgbmFtZXNwYWNlOiByYXdNZXRhZGF0YS5zY2hlbWEubmFtZXNwYWNlLFxuICAgICAgICBhbm5vdGF0aW9uczogcmF3TWV0YWRhdGEuc2NoZW1hLmFubm90YXRpb25zLFxuICAgICAgICByZWZlcmVuY2VzOiBkZWZhdWx0UmVmZXJlbmNlcy5jb25jYXQocmF3TWV0YWRhdGEucmVmZXJlbmNlcyksXG4gICAgICAgIGRpYWdub3N0aWNzOiBbXVxuICAgIH0gYXMgYW55O1xuXG4gICAgLy8gQ29udmVydGVyXG4gICAgY29uc3QgY29udmVydGVyID0gbmV3IENvbnZlcnRlcihyYXdNZXRhZGF0YSwgY29udmVydGVkT3V0cHV0KTtcblxuICAgIGxhenkoXG4gICAgICAgIGNvbnZlcnRlZE91dHB1dCxcbiAgICAgICAgJ2VudGl0eUNvbnRhaW5lcicsXG4gICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KGNvbnZlcnRlci5yYXdTY2hlbWEuZW50aXR5Q29udGFpbmVyLCBjb252ZXJ0RW50aXR5Q29udGFpbmVyKVxuICAgICk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdlbnRpdHlTZXRzJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5lbnRpdHlTZXRzLCBjb252ZXJ0RW50aXR5U2V0KSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdzaW5nbGV0b25zJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5zaW5nbGV0b25zLCBjb252ZXJ0U2luZ2xldG9uKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdlbnRpdHlUeXBlcycsIGNvbnZlcnRlci5jb252ZXJ0KGNvbnZlcnRlci5yYXdTY2hlbWEuZW50aXR5VHlwZXMsIGNvbnZlcnRFbnRpdHlUeXBlKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdhY3Rpb25zJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5hY3Rpb25zLCBjb252ZXJ0QWN0aW9uKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdjb21wbGV4VHlwZXMnLCBjb252ZXJ0ZXIuY29udmVydChjb252ZXJ0ZXIucmF3U2NoZW1hLmNvbXBsZXhUeXBlcywgY29udmVydENvbXBsZXhUeXBlKSk7XG4gICAgbGF6eShjb252ZXJ0ZWRPdXRwdXQsICdhY3Rpb25JbXBvcnRzJywgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS5hY3Rpb25JbXBvcnRzLCBjb252ZXJ0QWN0aW9uSW1wb3J0KSk7XG4gICAgbGF6eShcbiAgICAgICAgY29udmVydGVkT3V0cHV0LFxuICAgICAgICAndHlwZURlZmluaXRpb25zJyxcbiAgICAgICAgY29udmVydGVyLmNvbnZlcnQoY29udmVydGVyLnJhd1NjaGVtYS50eXBlRGVmaW5pdGlvbnMsIGNvbnZlcnRUeXBlRGVmaW5pdGlvbilcbiAgICApO1xuXG4gICAgY29udmVydGVkT3V0cHV0LnJlc29sdmVQYXRoID0gZnVuY3Rpb24gcmVzb2x2ZVBhdGg8VD4ocGF0aDogc3RyaW5nKTogUmVzb2x1dGlvblRhcmdldDxUPiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFJlc29sdXRpb24gPSByZXNvbHZlVGFyZ2V0PFQ+KGNvbnZlcnRlciwgdW5kZWZpbmVkLCBwYXRoKTtcbiAgICAgICAgaWYgKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KSB7XG4gICAgICAgICAgICBhcHBlbmRPYmplY3RQYXRoKHRhcmdldFJlc29sdXRpb24ub2JqZWN0UGF0aCwgdGFyZ2V0UmVzb2x1dGlvbi50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXRSZXNvbHV0aW9uO1xuICAgIH07XG5cbiAgICByZXR1cm4gY29udmVydGVkT3V0cHV0O1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi93cml0ZWJhY2snO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG4iLCJpbXBvcnQgdHlwZSB7IEluZGV4LCBDb21wbGV4VHlwZSwgUmVmZXJlbmNlLCBUeXBlRGVmaW5pdGlvbiwgQXJyYXlXaXRoSW5kZXggfSBmcm9tICdAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0UmVmZXJlbmNlczogUmVmZXJlbmNlc1dpdGhNYXAgPSBbXG4gICAgeyBhbGlhczogJ0NhcGFiaWxpdGllcycsIG5hbWVzcGFjZTogJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEnLCB1cmk6ICcnIH0sXG4gICAgeyBhbGlhczogJ0FnZ3JlZ2F0aW9uJywgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxJywgdXJpOiAnJyB9LFxuICAgIHsgYWxpYXM6ICdWYWxpZGF0aW9uJywgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuQ29yZS5WMScsIGFsaWFzOiAnQ29yZScsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ09yZy5PRGF0YS5NZWFzdXJlcy5WMScsIGFsaWFzOiAnTWVhc3VyZXMnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEnLCBhbGlhczogJ0NvbW1vbicsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxJywgYWxpYXM6ICdVSScsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEnLCBhbGlhczogJ1Nlc3Npb24nLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEnLCBhbGlhczogJ0FuYWx5dGljcycsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxJywgYWxpYXM6ICdDb2RlTGlzdCcsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MScsIGFsaWFzOiAnUGVyc29uYWxEYXRhJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MScsIGFsaWFzOiAnQ29tbXVuaWNhdGlvbicsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkhUTUw1LnYxJywgYWxpYXM6ICdIVE1MNScsIHVyaTogJycgfVxuXTtcblxuZXhwb3J0IHR5cGUgUmVmZXJlbmNlc1dpdGhNYXAgPSBSZWZlcmVuY2VbXSAmIHtcbiAgICByZWZlcmVuY2VNYXA/OiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+O1xuICAgIHJldmVyc2VSZWZlcmVuY2VNYXA/OiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+O1xufTtcblxuZnVuY3Rpb24gc3BsaXRBdChzdHJpbmc6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIHJldHVybiBpbmRleCA8IDAgPyBbc3RyaW5nLCAnJ10gOiBbc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCksIHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKV07XG59XG5cbmZ1bmN0aW9uIHN1YnN0cmluZ0F0KHN0cmluZzogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGluZGV4IDwgMCA/IHN0cmluZyA6IHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvci5cbiAqXG4gKiBAcGFyYW0gc3RyaW5nICAgIFRoZSBzdHJpbmcgdG8gc3BsaXRcbiAqIEBwYXJhbSBzZXBhcmF0b3IgU2VwYXJhdG9yLCBlLmcuIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIEFuIGFycmF5IGNvbnNpc3Rpbmcgb2YgdHdvIGVsZW1lbnRzOiB0aGUgcGFydCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlcGFyYXRvciBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuIElmIHRoZSBzdHJpbmcgZG9lcyBub3QgY29udGFpbiB0aGUgc2VwYXJhdG9yLCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIGVtcHR5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QXRGaXJzdChzdHJpbmc6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICByZXR1cm4gc3BsaXRBdChzdHJpbmcsIHN0cmluZy5pbmRleE9mKHNlcGFyYXRvcikpO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIHN0cmluZyBhdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yLlxuICpcbiAqIEBwYXJhbSBzdHJpbmcgICAgVGhlIHN0cmluZyB0byBzcGxpdFxuICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IsIGUuZy4gYSBzaW5nbGUgY2hhcmFjdGVyLlxuICogQHJldHVybnMgQW4gYXJyYXkgY29uc2lzdGluZyBvZiB0d28gZWxlbWVudHM6IHRoZSBwYXJ0IGJlZm9yZSB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBzZXBhcmF0b3IgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LiBJZiB0aGUgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdGhlIHNlcGFyYXRvciwgdGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0TGFzdChzdHJpbmc6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICByZXR1cm4gc3BsaXRBdChzdHJpbmcsIHN0cmluZy5sYXN0SW5kZXhPZihzZXBhcmF0b3IpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yLlxuICpcbiAqIEBwYXJhbSBzdHJpbmcgICAgVGhlIHN0cmluZ1xuICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IsIGUuZy4gYSBzaW5nbGUgY2hhcmFjdGVyLlxuICogQHJldHVybnMgVGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlcGFyYXRvciwgb3IgdGhlIGlucHV0IHN0cmluZyBpZiBpdCBkb2VzIG5vdCBjb250YWluIHRoZSBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdHJpbmdCZWZvcmVGaXJzdChzdHJpbmc6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWJzdHJpbmdBdChzdHJpbmcsIHN0cmluZy5pbmRleE9mKHNlcGFyYXRvcikpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvci5cbiAqXG4gKiBAcGFyYW0gc3RyaW5nICAgIFRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzZXBhcmF0b3IgU2VwYXJhdG9yLCBlLmcuIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIFRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlcGFyYXRvciwgb3IgdGhlIGlucHV0IHN0cmluZyBpZiBpdCBkb2VzIG5vdCBjb250YWluIHRoZSBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdHJpbmdCZWZvcmVMYXN0KHN0cmluZzogc3RyaW5nLCBzZXBhcmF0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1YnN0cmluZ0F0KHN0cmluZywgc3RyaW5nLmxhc3RJbmRleE9mKHNlcGFyYXRvcikpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFubm90YXRpb24gdG8gdGhlIGFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB1bmFsaWFzZWRWYWx1ZSB0aGUgdW5hbGlhc2VkIHZhbHVlXG4gKiBAcmV0dXJucyB0aGUgYWxpYXNlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGlhcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCwgdW5hbGlhc2VkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFyZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZXZlcnNlUmVmZXJlbmNlTWFwID0gcmVmZXJlbmNlcy5yZWR1Y2UoKG1hcDogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPiwgcmVmKSA9PiB7XG4gICAgICAgICAgICBtYXBbcmVmLm5hbWVzcGFjZV0gPSByZWY7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIGlmICghdW5hbGlhc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbbmFtZXNwYWNlLCB2YWx1ZV0gPSBzcGxpdEF0TGFzdCh1bmFsaWFzZWRWYWx1ZSwgJy4nKTtcbiAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXBbbmFtZXNwYWNlXTtcbiAgICBpZiAocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBgJHtyZWZlcmVuY2UuYWxpYXN9LiR7dmFsdWV9YDtcbiAgICB9IGVsc2UgaWYgKHVuYWxpYXNlZFZhbHVlLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgLy8gVHJ5IHRvIHNlZSBpZiBpdCdzIGFuIGFubm90YXRpb24gUGF0aCBsaWtlIHRvX1NhbGVzT3JkZXIvQFVJLkxpbmVJdGVtXG4gICAgICAgIGNvbnN0IFtwcmVBbGlhcywgcG9zdEFsaWFzXSA9IHNwbGl0QXRGaXJzdCh1bmFsaWFzZWRWYWx1ZSwgJ0AnKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZUFsaWFzfUAke2FsaWFzKHJlZmVyZW5jZXMsIHBvc3RBbGlhcyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5hbGlhc2VkVmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhbGlhc2VkIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbm5vdGF0aW9uIHRvIHRoZSB1bmFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBhbGlhc2VkVmFsdWUgdGhlIGFsaWFzZWQgdmFsdWVcbiAqIEByZXR1cm5zIHRoZSB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2FtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hbGlhcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCwgYWxpYXNlZFZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXAgPSByZWZlcmVuY2VzLnJlZHVjZSgobWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+LCByZWYpID0+IHtcbiAgICAgICAgICAgIG1hcFtyZWYuYWxpYXNdID0gcmVmO1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICBpZiAoIWFsaWFzZWRWYWx1ZSkge1xuICAgICAgICByZXR1cm4gYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbdm9jQWxpYXMsIHZhbHVlXSA9IHNwbGl0QXRGaXJzdChhbGlhc2VkVmFsdWUsICcuJyk7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXBbdm9jQWxpYXNdO1xuICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGAke3JlZmVyZW5jZS5uYW1lc3BhY2V9LiR7dmFsdWV9YDtcbiAgICB9IGVsc2UgaWYgKGFsaWFzZWRWYWx1ZS5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIC8vIFRyeSB0byBzZWUgaWYgaXQncyBhbiBhbm5vdGF0aW9uIFBhdGggbGlrZSB0b19TYWxlc09yZGVyL0BVSS5MaW5lSXRlbVxuICAgICAgICBjb25zdCBbcHJlQWxpYXMsIHBvc3RBbGlhc10gPSBzcGxpdEF0Rmlyc3QoYWxpYXNlZFZhbHVlLCAnQCcpO1xuICAgICAgICByZXR1cm4gYCR7cHJlQWxpYXN9QCR7dW5hbGlhcyhyZWZlcmVuY2VzLCBwb3N0QWxpYXMpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFsaWFzZWRWYWx1ZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgRW51bUlzRmxhZzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7XG4gICAgJ0F1dGguS2V5TG9jYXRpb24nOiBmYWxzZSxcbiAgICAnQ29yZS5SZXZpc2lvbktpbmQnOiBmYWxzZSxcbiAgICAnQ29yZS5EYXRhTW9kaWZpY2F0aW9uT3BlcmF0aW9uS2luZCc6IGZhbHNlLFxuICAgICdDb3JlLlBlcm1pc3Npb24nOiB0cnVlLFxuICAgICdDYXBhYmlsaXRpZXMuQ29uZm9ybWFuY2VMZXZlbFR5cGUnOiBmYWxzZSxcbiAgICAnQ2FwYWJpbGl0aWVzLklzb2xhdGlvbkxldmVsJzogdHJ1ZSxcbiAgICAnQ2FwYWJpbGl0aWVzLk5hdmlnYXRpb25UeXBlJzogZmFsc2UsXG4gICAgJ0NhcGFiaWxpdGllcy5TZWFyY2hFeHByZXNzaW9ucyc6IHRydWUsXG4gICAgJ0NhcGFiaWxpdGllcy5IdHRwTWV0aG9kJzogdHJ1ZSxcbiAgICAnQWdncmVnYXRpb24uUm9sbHVwVHlwZSc6IGZhbHNlLFxuICAgICdDb21tb24uVGV4dEZvcm1hdFR5cGUnOiBmYWxzZSxcbiAgICAnQ29tbW9uLkZpbHRlckV4cHJlc3Npb25UeXBlJzogZmFsc2UsXG4gICAgJ0NvbW1vbi5GaWVsZENvbnRyb2xUeXBlJzogZmFsc2UsXG4gICAgJ0NvbW1vbi5FZmZlY3RUeXBlJzogdHJ1ZSxcbiAgICAnQ29tbXVuaWNhdGlvbi5LaW5kVHlwZSc6IGZhbHNlLFxuICAgICdDb21tdW5pY2F0aW9uLkNvbnRhY3RJbmZvcm1hdGlvblR5cGUnOiB0cnVlLFxuICAgICdDb21tdW5pY2F0aW9uLlBob25lVHlwZSc6IHRydWUsXG4gICAgJ0NvbW11bmljYXRpb24uR2VuZGVyVHlwZSc6IGZhbHNlLFxuICAgICdVSS5WaXN1YWxpemF0aW9uVHlwZSc6IGZhbHNlLFxuICAgICdVSS5Dcml0aWNhbGl0eVR5cGUnOiBmYWxzZSxcbiAgICAnVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlJzogZmFsc2UsXG4gICAgJ1VJLlRyZW5kVHlwZSc6IGZhbHNlLFxuICAgICdVSS5DaGFydFR5cGUnOiBmYWxzZSxcbiAgICAnVUkuQ2hhcnRBeGlzU2NhbGVCZWhhdmlvclR5cGUnOiBmYWxzZSxcbiAgICAnVUkuQ2hhcnRBeGlzQXV0b1NjYWxlRGF0YVNjb3BlVHlwZSc6IGZhbHNlLFxuICAgICdVSS5DaGFydERpbWVuc2lvblJvbGVUeXBlJzogZmFsc2UsXG4gICAgJ1VJLkNoYXJ0TWVhc3VyZVJvbGVUeXBlJzogZmFsc2UsXG4gICAgJ1VJLlNlbGVjdGlvblJhbmdlU2lnblR5cGUnOiBmYWxzZSxcbiAgICAnVUkuU2VsZWN0aW9uUmFuZ2VPcHRpb25UeXBlJzogZmFsc2UsXG4gICAgJ1VJLlRleHRBcnJhbmdlbWVudFR5cGUnOiBmYWxzZSxcbiAgICAnVUkuSW1wb3J0YW5jZVR5cGUnOiBmYWxzZSxcbiAgICAnVUkuQ3JpdGljYWxpdHlSZXByZXNlbnRhdGlvblR5cGUnOiBmYWxzZSxcbiAgICAnVUkuT3BlcmF0aW9uR3JvdXBpbmdUeXBlJzogZmFsc2Vcbn07XG5leHBvcnQgZW51bSBUZXJtVG9UeXBlcyB7XG4gICAgJ09yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLlNlY3VyaXR5U2NoZW1lcycgPSAnT3JnLk9EYXRhLkF1dGhvcml6YXRpb24uVjEuU2VjdXJpdHlTY2hlbWUnLFxuICAgICdPcmcuT0RhdGEuQXV0aG9yaXphdGlvbi5WMS5BdXRob3JpemF0aW9ucycgPSAnT3JnLk9EYXRhLkF1dGhvcml6YXRpb24uVjEuQXV0aG9yaXphdGlvbicsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlJldmlzaW9ucycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuUmV2aXNpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuTGlua3MnID0gJ09yZy5PRGF0YS5Db3JlLlYxLkxpbmsnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5FeGFtcGxlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5FeGFtcGxlVmFsdWUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5NZXNzYWdlcycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuTWVzc2FnZVR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5WYWx1ZUV4Y2VwdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVmFsdWVFeGNlcHRpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuUmVzb3VyY2VFeGNlcHRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlJlc291cmNlRXhjZXB0aW9uVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkRhdGFNb2RpZmljYXRpb25FeGNlcHRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLkRhdGFNb2RpZmljYXRpb25FeGNlcHRpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuSXNMYW5ndWFnZURlcGVuZGVudCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQXBwbGllc1ZpYUNvbnRhaW5lcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuRGVyZWZlcmVuY2VhYmxlSURzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Db252ZW50aW9uYWxJRHMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLlBlcm1pc3Npb25zJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5QZXJtaXNzaW9uJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuRGVmYXVsdE5hbWVzcGFjZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWREZWZhdWx0VmFsdWUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLklzVVJMJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5Jc01lZGlhVHlwZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQ29udGVudERpc3Bvc2l0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5Db250ZW50RGlzcG9zaXRpb25UeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuT3B0aW1pc3RpY0NvbmN1cnJlbmN5JyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQWRkaXRpb25hbFByb3BlcnRpZXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkF1dG9FeHBhbmQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLkF1dG9FeHBhbmRSZWZlcmVuY2VzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5NYXlJbXBsZW1lbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFR5cGVOYW1lJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuT3JkZXJlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuUG9zaXRpb25hbEluc2VydCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuQWx0ZXJuYXRlS2V5cycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuQWx0ZXJuYXRlS2V5JyxcbiAgICAnT3JnLk9EYXRhLkNvcmUuVjEuT3B0aW9uYWxQYXJhbWV0ZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLk9wdGlvbmFsUGFyYW1ldGVyVHlwZScsXG4gICAgJ09yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZScgPSAnRWRtLkJvb2xlYW4nLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5TeW1ib2xpY05hbWUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlNpbXBsZUlkZW50aWZpZXInLFxuICAgICdPcmcuT0RhdGEuQ29yZS5WMS5HZW9tZXRyeUZlYXR1cmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLkdlb21ldHJ5RmVhdHVyZVR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbmZvcm1hbmNlTGV2ZWwnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29uZm9ybWFuY2VMZXZlbFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkFzeW5jaHJvbm91c1JlcXVlc3RzU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoQ29udGludWVPbkVycm9yU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLklzb2xhdGlvblN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Jc29sYXRpb25MZXZlbCcsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3Jvc3NKb2luU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNhbGxiYWNrU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNhbGxiYWNrVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ2hhbmdlVHJhY2tpbmcnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ2hhbmdlVHJhY2tpbmdUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db3VudFJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db3VudFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk5hdmlnYXRpb25SZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTmF2aWdhdGlvblJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluZGV4YWJsZUJ5S2V5JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlRvcFN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Ta2lwU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbXB1dGVTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VsZWN0U3VwcG9ydCcgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWxlY3RTdXBwb3J0VHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQmF0Y2hTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQmF0Y2hTdXBwb3J0JyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlclJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Tb3J0UmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNvcnRSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5FeHBhbmRSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRXhwYW5kUmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VhcmNoUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlYXJjaFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLktleUFzU2VnbWVudFN1cHBvcnRlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5RdWVyeVNlZ21lbnRTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSW5zZXJ0UmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBJbnNlcnRTdXBwb3J0JyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBJbnNlcnRTdXBwb3J0VHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuVXBkYXRlUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlVwZGF0ZVJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBVcGRhdGVTdXBwb3J0JyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBVcGRhdGVTdXBwb3J0VHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVsZXRlUmVzdHJpY3Rpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbGxlY3Rpb25Qcm9wZXJ0eVJlc3RyaWN0aW9ucycgPSAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db2xsZWN0aW9uUHJvcGVydHlSZXN0cmljdGlvbnNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5PcGVyYXRpb25SZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuT3BlcmF0aW9uUmVzdHJpY3Rpb25zVHlwZScsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQW5ub3RhdGlvblZhbHVlc0luUXVlcnlTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTW9kaWZpY2F0aW9uUXVlcnlPcHRpb25zJyA9ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk1vZGlmaWNhdGlvblF1ZXJ5T3B0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlJlYWRSZXN0cmljdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuUmVhZFJlc3RyaWN0aW9uc1R5cGUnLFxuICAgICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbUhlYWRlcnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3VzdG9tUGFyYW1ldGVyJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DdXN0b21RdWVyeU9wdGlvbnMnID0gJ09yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3VzdG9tUGFyYW1ldGVyJyxcbiAgICAnT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5NZWRpYUxvY2F0aW9uVXBkYXRlU3VwcG9ydGVkJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWQnID0gJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BcHBseVN1cHBvcnRlZFR5cGUnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWREZWZhdWx0cycgPSAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFwcGx5U3VwcG9ydGVkQmFzZScsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5Hcm91cGFibGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BZ2dyZWdhdGFibGUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5Db250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkxldmVsZWRIaWVyYXJjaHknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZScsXG4gICAgJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BdmFpbGFibGVPbkFnZ3JlZ2F0ZXMnID0gJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BdmFpbGFibGVPbkFnZ3JlZ2F0ZXNUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bScgPSAnRWRtLlByaW1pdGl2ZVR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhpbXVtJyA9ICdFZG0uUHJpbWl0aXZlVHlwZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkV4Y2x1c2l2ZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQWxsb3dlZFZhbHVlcycgPSAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQWxsb3dlZFZhbHVlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTXVsdGlwbGVPZicgPSAnRWRtLkRlY2ltYWwnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5Db25zdHJhaW50JyA9ICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5Db25zdHJhaW50VHlwZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkl0ZW1zT2YnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkl0ZW1zT2ZUeXBlJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuT3BlblByb3BlcnR5VHlwZUNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLlNpbmdsZU9yQ29sbGVjdGlvblR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5EZXJpdmVkVHlwZUNvbnN0cmFpbnQnID0gJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLlNpbmdsZU9yQ29sbGVjdGlvblR5cGUnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVGVybXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFRlcm1OYW1lJyxcbiAgICAnT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQXBwbGljYWJsZVRlcm1zJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUZXJtTmFtZScsXG4gICAgJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heEl0ZW1zJyA9ICdFZG0uSW50NjQnLFxuICAgICdPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5JdGVtcycgPSAnRWRtLkludDY0JyxcbiAgICAnT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlNjYWxlJyA9ICdFZG0uQnl0ZScsXG4gICAgJ09yZy5PRGF0YS5NZWFzdXJlcy5WMS5EdXJhdGlvbkdyYW51bGFyaXR5JyA9ICdPcmcuT0RhdGEuTWVhc3VyZXMuVjEuRHVyYXRpb25HcmFudWxhcml0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuRGltZW5zaW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFjY3VtdWxhdGl2ZU1lYXN1cmUnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5Sb2xsZWRVcFByb3BlcnR5Q291bnQnID0gJ0VkbS5JbnQxNicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5QbGFubmluZ0FjdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuQWdncmVnYXRlZFByb3BlcnR5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydHlUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFuYWx5dGljYWxDb250ZXh0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuQW5hbHl0aWNhbENvbnRleHRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlcnZpY2VWZXJzaW9uJyA9ICdFZG0uSW50MzInLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VydmljZVNjaGVtYVZlcnNpb24nID0gJ0VkbS5JbnQzMicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0Rm9yJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzTGFuZ3VhZ2VJZGVudGlmaWVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEZvcm1hdCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRGb3JtYXRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzVXBwZXJDYXNlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDdXJyZW5jeScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzVW5pdCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVuaXRTcGVjaWZpY1NjYWxlJyA9ICdFZG0uUHJpbWl0aXZlVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vbml0U3BlY2lmaWNQcmVjaXNpb24nID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlY29uZGFyeUtleScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NaW5PY2N1cnMnID0gJ0VkbS5JbnQ2NCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NYXhPY2N1cnMnID0gJ0VkbS5JbnQ2NCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Bc3NvY2lhdGlvbkVudGl0eScgPSAnRWRtLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVyaXZlZE5hdmlnYXRpb24nID0gJ0VkbS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1hc2tlZCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJldmVhbE9uRGVtYW5kJyA9ICdFZG0uQm9vbGVhbicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdE1hcHBpbmcnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzSW5zdGFuY2VBbm5vdGF0aW9uJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5BcHBsaWNhdGlvbicgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFwcGxpY2F0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UaW1lc3RhbXAnID0gJ0VkbS5EYXRlVGltZU9mZnNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FcnJvclJlc29sdXRpb24nID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FcnJvclJlc29sdXRpb25UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzJyA9ICdFZG0uQ29tcGxleFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEubnVtZXJpY1NldmVyaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTnVtZXJpY01lc3NhZ2VTZXZlcml0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWF4aW11bU51bWVyaWNNZXNzYWdlU2V2ZXJpdHknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5OdW1lcmljTWVzc2FnZVNldmVyaXR5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0FjdGlvbkNyaXRpY2FsJyA9ICdFZG0uQm9vbGVhbicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5BdHRyaWJ1dGVzJyA9ICdFZG0uUHJvcGVydHlQYXRoJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlbGF0ZWRSZWN1cnNpdmVIaWVyYXJjaHknID0gJ0VkbS5Bbm5vdGF0aW9uUGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5JbnRlcnZhbCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkludGVydmFsVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU0FQT2JqZWN0Tm9kZVR5cGUnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TQVBPYmplY3ROb2RlVHlwZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ29tcG9zaXRpb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc05hdHVyYWxQZXJzb24nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFJlbGV2YW50UXVhbGlmaWVycycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuU2ltcGxlSWRlbnRpZmllcicsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RNYXBwaW5nJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0TWFwcGluZ1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFySGFsZnllYXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJNb250aCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJXZWVrJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkNhbGVuZGFyTW9udGgnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RheU9mQ2FsZW5kYXJZZWFyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXJIYWxmeWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyTW9udGgnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhcldlZWsnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyRGF0ZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsUGVyaW9kJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxZZWFyUGVyaW9kJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxRdWFydGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxZZWFyUXVhcnRlcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsV2VlaycgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhcldlZWsnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RheU9mRmlzY2FsWWVhcicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclZhcmlhbnQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NdXR1YWxseUV4Y2x1c2l2ZVRlcm0nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRBY3RpdmF0aW9uVmlhJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5TaW1wbGVJZGVudGlmaWVyJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkVkaXRhYmxlRmllbGRGb3InID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0c1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUXVhbGlmaWVkTmFtZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJEZWZhdWx0VmFsdWUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckRlZmF1bHRWYWx1ZUhpZ2gnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNvcnRPcmRlcicgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNvcnRPcmRlclR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVjdXJzaXZlSGllcmFyY2h5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DcmVhdGVkQXQnID0gJ0VkbS5EYXRlVGltZU9mZnNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DcmVhdGVkQnknID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vc2VySUQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ2hhbmdlZEF0JyA9ICdFZG0uRGF0ZVRpbWVPZmZzZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ2hhbmdlZEJ5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVXNlcklEJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFwcGx5TXVsdGlVbml0QmVoYXZpb3JGb3JTb3J0aW5nQW5kRmlsdGVyaW5nJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUHJpbWl0aXZlUHJvcGVydHlQYXRoJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5DdXJyZW5jeUNvZGVzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5Db2RlTGlzdFNvdXJjZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLlVuaXRzT2ZNZWFzdXJlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5Db2RlTGlzdFNvdXJjZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLlN0YW5kYXJkQ29kZScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkV4dGVybmFsQ29kZScgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLklzQ29uZmlndXJhdGlvbkRlcHJlY2F0aW9uQ29kZScgPSAnRWRtLkJvb2xlYW4nLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkFkZHJlc3MnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQWRkcmVzc1R5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLklzRW1haWxBZGRyZXNzJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLklzUGhvbmVOdW1iZXInID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuRXZlbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuRXZlbnREYXRhJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5UYXNrJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLlRhc2tEYXRhJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5NZXNzYWdlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLk1lc3NhZ2VEYXRhJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuSGllcmFyY2h5LnYxLlJlY3Vyc2l2ZUhpZXJhcmNoeScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuSGllcmFyY2h5LnYxLlJlY3Vyc2l2ZUhpZXJhcmNoeVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuRW50aXR5U2VtYW50aWNzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuRW50aXR5U2VtYW50aWNzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5GaWVsZFNlbWFudGljcycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkZpZWxkU2VtYW50aWNzVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5UGVyc29uYWwnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklkZW50aWZpY2F0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkJhZGdlJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5CYWRnZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkQWJzdHJhY3QnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TdGF0dXNJbmZvJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpZWxkR3JvdXAnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpZWxkR3JvdXBUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ29ubmVjdGVkRmllbGRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHNUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2VvTG9jYXRpb25zJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvbicgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2VvTG9jYXRpb25UeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ29udGFjdHMnID0gJ0VkbS5Bbm5vdGF0aW9uUGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1lZGlhUmVzb3VyY2UnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1lZGlhUmVzb3VyY2VUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuS1BJJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5LUElUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0RGVmaW5pdGlvblR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5WYWx1ZUNyaXRpY2FsaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5WYWx1ZUNyaXRpY2FsaXR5VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5TGFiZWxzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUxhYmVsVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvbkZpZWxkcycgPSAnRWRtLlByb3BlcnR5UGF0aCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJGYWNldHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0JyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUXVpY2tWaWV3RmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlF1aWNrQ3JlYXRlRmFjZXRzJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GYWNldCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0cycgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVmZXJlbmNlRmFjZXQnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50VHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnQnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uVmFyaWFudCcgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uVmFyaWFudFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UaGluZ1BlcnNwZWN0aXZlJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc1N1bW1hcnknID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlBhcnRPZlByZXZpZXcnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1hcCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2FsbGVyeScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZVVSTCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZScgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTXVsdGlMaW5lVGV4dCcgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSW1wb3J0YW5jZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSW1wb3J0YW5jZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW4nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklzQ29weUFjdGlvbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JlYXRlSGlkZGVuJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5VcGRhdGVIaWRkZW4nID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRlbGV0ZUhpZGRlbicgPSAnT3JnLk9EYXRhLkNvcmUuVjEuVGFnJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5BZGFwdGF0aW9uSGlkZGVuJyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdCcsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5JyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uJyA9ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uVHlwZScsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkVtcGhhc2l6ZWQnID0gJ09yZy5PRGF0YS5Db3JlLlYxLlRhZycsXG4gICAgJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9yZGVyQnknID0gJ0VkbS5Qcm9wZXJ0eVBhdGgnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWUnID0gJ0VkbS5QcmltaXRpdmVUeXBlJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZScgPSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZVR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvbkxpc3QnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlJlY29tbWVuZGF0aW9uTGlzdFR5cGUnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0JyA9ICdPcmcuT0RhdGEuQ29yZS5WMS5UYWcnLFxuICAgICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Eb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHknID0gJ0VkbS5Cb29sZWFuJyxcbiAgICAnY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEuQ3NzRGVmYXVsdHMnID0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkhUTUw1LnYxLkNzc0RlZmF1bHRzVHlwZSdcbn1cblxuLyoqXG4gKiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBDb21wbGV4VHlwZSBhbmQgYSBUeXBlRGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29tcGxleFR5cGVEZWZpbml0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGNvbXBsZXggdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wbGV4VHlwZURlZmluaXRpb24oXG4gICAgY29tcGxleFR5cGVEZWZpbml0aW9uPzogQ29tcGxleFR5cGUgfCBUeXBlRGVmaW5pdGlvblxuKTogY29tcGxleFR5cGVEZWZpbml0aW9uIGlzIENvbXBsZXhUeXBlIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAhIWNvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjb21wbGV4VHlwZURlZmluaXRpb24uX3R5cGUgPT09ICdDb21wbGV4VHlwZScgJiYgISFjb21wbGV4VHlwZURlZmluaXRpb24ucHJvcGVydGllc1xuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZWNpbWFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpc0RlY2ltYWwoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWVPZigpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIGxhenkgcHJvcGVydHkuXG4gKlxuICogVGhlIHByb3BlcnR5IGlzIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24gb24gdGhlIGZpcnN0IHJlYWQgYWNjZXNzLCBvciBieSBkaXJlY3RseSBhc3NpZ25pbmcgYSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0ICAgIFRoZSBob3N0IG9iamVjdFxuICogQHBhcmFtIHByb3BlcnR5ICBUaGUgbGF6eSBwcm9wZXJ0eSB0byBhZGRcbiAqIEBwYXJhbSBpbml0ICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHByb3BlcnR5J3MgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhenk8VHlwZSwgS2V5IGV4dGVuZHMga2V5b2YgVHlwZT4ob2JqZWN0OiBUeXBlLCBwcm9wZXJ0eTogS2V5LCBpbml0OiAoKSA9PiBUeXBlW0tleV0pIHtcbiAgICBjb25zdCBpbml0aWFsID0gU3ltYm9sKCdpbml0aWFsJyk7XG4gICAgbGV0IF92YWx1ZTogVHlwZVtLZXldIHwgdHlwZW9mIGluaXRpYWwgPSBpbml0aWFsO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcblxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoX3ZhbHVlID09PSBpbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgX3ZhbHVlID0gaW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF92YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWU6IFR5cGVbS2V5XSkge1xuICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gZmluZCBhbiBhcnJheSBlbGVtZW50IGJ5IHByb3BlcnR5IHZhbHVlLlxuICpcbiAqIEBwYXJhbSBhcnJheSAgICAgVGhlIGFycmF5XG4gKiBAcGFyYW0gcHJvcGVydHkgIEVsZW1lbnRzIGluIHRoZSBhcnJheSBhcmUgc2VhcmNoZWQgYnkgdGhpcyBwcm9wZXJ0eVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbmQgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkgYnkgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmRleGVkRmluZDxUPihhcnJheTogQXJyYXk8VD4sIHByb3BlcnR5OiBrZXlvZiBUKSB7XG4gICAgY29uc3QgaW5kZXg6IE1hcDxUW2tleW9mIFRdLCBUIHwgdW5kZWZpbmVkPiA9IG5ldyBNYXAoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBmaW5kKHZhbHVlOiBUW2tleW9mIFRdKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBpbmRleC5nZXQodmFsdWUpO1xuXG4gICAgICAgIGlmIChlbGVtZW50Py5bcHJvcGVydHldID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyYXkuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50Py5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBlbGVtZW50W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGluZGV4LnNldChwcm9wZXJ0eVZhbHVlLCBlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgJ2dldCBieSB2YWx1ZScgZnVuY3Rpb24gdG8gYW4gYXJyYXkuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhZGRJbmRleChteUFycmF5LCAnbmFtZScpLCBhIG5ldyBmdW5jdGlvbiAnYnlfbmFtZSh2YWx1ZSknIHdpbGwgYmUgYWRkZWQgdGhhdCBhbGxvd3MgdG9cbiAqIGZpbmQgYSBtZW1iZXIgb2YgdGhlIGFycmF5IGJ5IHRoZSB2YWx1ZSBvZiBpdHMgJ25hbWUnIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBhcnJheSAgICAgIFRoZSBhcnJheVxuICogQHBhcmFtIHByb3BlcnR5ICAgVGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSAnYnlfe3Byb3BlcnR5fSgpJyBmdW5jdGlvblxuICogQHJldHVybnMgVGhlIGFycmF5IHdpdGggdGhlIGFkZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRHZXRCeVZhbHVlPFQsIFAgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIFQsIHN0cmluZz4+KGFycmF5OiBBcnJheTxUPiwgcHJvcGVydHk6IFApIHtcbiAgICBjb25zdCBpbmRleE5hbWU6IGtleW9mIEluZGV4PFQsIFA+ID0gYGJ5XyR7cHJvcGVydHl9YDtcblxuICAgIGlmICghYXJyYXkuaGFzT3duUHJvcGVydHkoaW5kZXhOYW1lKSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksIGluZGV4TmFtZSwgeyB3cml0YWJsZTogZmFsc2UsIHZhbHVlOiBjcmVhdGVJbmRleGVkRmluZChhcnJheSwgcHJvcGVydHkpIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJyR7aW5kZXhOYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5IGFzIEFycmF5V2l0aEluZGV4PFQsIFA+O1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICAgIEFubm90YXRpb25QYXRoRXhwcmVzc2lvbixcbiAgICBBbm5vdGF0aW9uUmVjb3JkLFxuICAgIEFubm90YXRpb25UZXJtLFxuICAgIEV4cHJlc3Npb24sXG4gICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb24sXG4gICAgUGF0aEV4cHJlc3Npb24sXG4gICAgUHJvcGVydHlQYXRoRXhwcmVzc2lvbixcbiAgICBSYXdBbm5vdGF0aW9uLFxuICAgIFJlZmVyZW5jZVxufSBmcm9tICdAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcyc7XG5pbXBvcnQgeyB1bmFsaWFzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogUmV2ZXJ0IGFuIG9iamVjdCB0byBpdHMgcmF3IHR5cGUgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgY3VycmVudCByZWZlcmVuY2VcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSkge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIENvbGxlY3Rpb246IHZhbHVlLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0RlY2ltYWw/LigpKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWNpbWFsJyxcbiAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNTdHJpbmc/LigpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlTWF0Y2hlcyA9IHZhbHVlLnZhbHVlT2YoKS5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmFsdWVNYXRjaGVzLmxlbmd0aCA+IDEgJiYgcmVmZXJlbmNlcy5maW5kKChyZWYpID0+IHJlZi5hbGlhcyA9PT0gdmFsdWVNYXRjaGVzWzBdKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICBFbnVtTWVtYmVyOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgU3RyaW5nOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzSW50Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pc0Zsb2F0Py4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRmxvYXQnLFxuICAgICAgICAgICAgRmxvYXQ6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaXNEYXRlPy4oKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGF0ZScsXG4gICAgICAgICAgICBEYXRlOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLmlzQm9vbGVhbj8uKCkpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0Jvb2wnLFxuICAgICAgICAgICAgQm9vbDogdmFsdWUudmFsdWVPZigpID09PSAndHJ1ZSdcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdQYXRoJykge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnUGF0aCcsXG4gICAgICAgICAgICBQYXRoOiB2YWx1ZS5wYXRoXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICBBbm5vdGF0aW9uUGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdBcHBseScpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0FwcGx5JyxcbiAgICAgICAgICAgIEFwcGx5OiB2YWx1ZS5BcHBseVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ051bGwnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdOdWxsJ1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICBQcm9wZXJ0eVBhdGg6IHZhbHVlLnZhbHVlXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJyRUeXBlJykpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1JlY29yZCcsXG4gICAgICAgICAgICBSZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIHZhbHVlKSBhcyBBbm5vdGF0aW9uUmVjb3JkXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV2ZXJ0IGEgdmFsdWUgdG8gaXRzIHJhdyB2YWx1ZSBkZXBlbmRpbmcgb24gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byByZXZlcnRcbiAqIEByZXR1cm5zIHRoZSByYXcgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiByZXZlcnRWYWx1ZVRvUmF3VHlwZShyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSwgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3RvciA9IHZhbHVlPy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHN3aXRjaCAodmFsdWVDb25zdHJ1Y3Rvcikge1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY29uc3QgdmFsdWVNYXRjaGVzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgaWYgKHZhbHVlTWF0Y2hlcy5sZW5ndGggPiAxICYmIHJlZmVyZW5jZXMuZmluZCgocmVmKSA9PiByZWYuYWxpYXMgPT09IHZhbHVlTWF0Y2hlc1swXSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgRW51bU1lbWJlcjogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZzogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdCb29sJyxcbiAgICAgICAgICAgICAgICBCb29sOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkgPT09IHZhbHVlLnRvRml4ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRGVjaW1hbCcsXG4gICAgICAgICAgICAgICAgICAgIERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJlc3VsdCA9IHJldmVydE9iamVjdFRvUmF3VHlwZShyZWZlcmVuY2VzLCB2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgcmVzdHJpY3RlZEtleXMgPSBbJyRUeXBlJywgJ3Rlcm0nLCAnX19zb3VyY2UnLCAncXVhbGlmaWVyJywgJ0FjdGlvblRhcmdldCcsICdmdWxseVF1YWxpZmllZE5hbWUnLCAnYW5ub3RhdGlvbnMnXTtcblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgZW1iZWRkZWQgYW5ub3RhdGlvbnMgdG8gdGhlaXIgcmF3IHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIGN1cnJlbnRBbm5vdGF0aW9ucyB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gdGFyZ2V0QW5ub3RhdGlvbnMgdGhlIHBsYWNlIHdoZXJlIHdlIG5lZWQgdG8gYWRkIHRoZSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKFxuICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLFxuICAgIGN1cnJlbnRBbm5vdGF0aW9uczogYW55LFxuICAgIHRhcmdldEFubm90YXRpb25zOiBSYXdBbm5vdGF0aW9uW11cbikge1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRBbm5vdGF0aW9ucylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfYW5ub3RhdGlvbnMnKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnNba2V5XSkuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFubm90YXRpb24gPSByZXZlcnRUZXJtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBjdXJyZW50QW5ub3RhdGlvbnNba2V5XVt0ZXJtXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBbm5vdGF0aW9uLnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5hbGlhc2VkVGVybSA9IHVuYWxpYXMocmVmZXJlbmNlcywgYCR7a2V5fS4ke3Rlcm19YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmFsaWFzZWRUZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaWZpZWRTcGxpdCA9IHVuYWxpYXNlZFRlcm0uc3BsaXQoJyMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24udGVybSA9IHF1YWxpZmllZFNwbGl0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZFNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgQW5ub3RhdGlvbiB3aXRoIGEgcXVhbGlmaWVyLCBub3Qgc3VyZSB3aGVuIHRoYXQgY2FuIGhhcHBlbiBpbiByZWFsIHNjZW5hcmlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFubm90YXRpb24ucXVhbGlmaWVyID0gcXVhbGlmaWVkU3BsaXRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0QW5ub3RhdGlvbnMucHVzaChwYXJzZWRBbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbn1cblxuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBpdGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJhdyBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHNldCBvZiByZWZlcmVuY2VcbiAqIEBwYXJhbSBjb2xsZWN0aW9uSXRlbSB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyB0aGUgcmF3IHR5cGUgZXF1aXZhbGVudFxuICovXG5mdW5jdGlvbiByZXZlcnRDb2xsZWN0aW9uSXRlbVRvUmF3VHlwZShcbiAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSxcbiAgICBjb2xsZWN0aW9uSXRlbTogYW55XG4pOlxuICAgIHwgQW5ub3RhdGlvblJlY29yZFxuICAgIHwgc3RyaW5nXG4gICAgfCBQcm9wZXJ0eVBhdGhFeHByZXNzaW9uXG4gICAgfCBQYXRoRXhwcmVzc2lvblxuICAgIHwgTmF2aWdhdGlvblByb3BlcnR5UGF0aEV4cHJlc3Npb25cbiAgICB8IEFubm90YXRpb25QYXRoRXhwcmVzc2lvblxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbkl0ZW07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29sbGVjdGlvbkl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uSXRlbS5oYXNPd25Qcm9wZXJ0eSgnJFR5cGUnKSkge1xuICAgICAgICAgICAgLy8gQW5ub3RhdGlvbiBSZWNvcmRcbiAgICAgICAgICAgIGNvbnN0IG91dEl0ZW06IEFubm90YXRpb25SZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogY29sbGVjdGlvbkl0ZW0uJFR5cGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZXM6IFtdIGFzIGFueVtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ291bGQgdmFsaWRhdGUga2V5cyBhbmQgdHlwZSBiYXNlZCBvbiAkVHlwZVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW0pLmZvckVhY2goKGNvbGxlY3Rpb25LZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3RlZEtleXMuaW5kZXhPZihjb2xsZWN0aW9uS2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2xsZWN0aW9uSXRlbVtjb2xsZWN0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SXRlbS5wcm9wZXJ0eVZhbHVlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbGxlY3Rpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpIGFzIEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uS2V5ID09PSAnYW5ub3RhdGlvbnMnICYmIE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtW2NvbGxlY3Rpb25LZXldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEl0ZW0uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0QW5ub3RhdGlvbnNUb1Jhd1R5cGUocmVmZXJlbmNlcywgY29sbGVjdGlvbkl0ZW1bY29sbGVjdGlvbktleV0sIG91dEl0ZW0uYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG91dEl0ZW07XG4gICAgICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbkl0ZW0udHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgUHJvcGVydHlQYXRoOiBjb2xsZWN0aW9uSXRlbS52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uSXRlbS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICAgICAgQW5ub3RhdGlvblBhdGg6IGNvbGxlY3Rpb25JdGVtLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25JdGVtLnR5cGUgPT09ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogY29sbGVjdGlvbkl0ZW0udmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXZlcnQgYW4gYW5ub3RhdGlvbiB0ZXJtIHRvIGl0J3MgZ2VuZXJpYyBvciByYXcgZXF1aXZhbGVudC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGNvbnRleHRcbiAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRlcm0gdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldmVydFRlcm1Ub0dlbmVyaWNUeXBlKHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uVGVybTxhbnk+KTogUmF3QW5ub3RhdGlvbiB7XG4gICAgY29uc3QgYmFzZUFubm90YXRpb246IFJhd0Fubm90YXRpb24gPSB7XG4gICAgICAgIHRlcm06IGFubm90YXRpb24udGVybSxcbiAgICAgICAgcXVhbGlmaWVyOiBhbm5vdGF0aW9uLnF1YWxpZmllclxuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvblxuICAgICAgICBpZiAoYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYW5ub3RhdGlvbnMnKSAmJiBPYmplY3Qua2V5cygoYW5ub3RhdGlvbiBhcyBhbnkpLmFubm90YXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBBbm5vdGF0aW9uIG9uIGEgY29sbGVjdGlvbiBpdHNlbGYsIG5vdCBzdXJlIHdoZW4gdGhhdCBoYXBwZW5zIGlmIGF0IGFsbFxuICAgICAgICAgICAgYmFzZUFubm90YXRpb24uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKHJlZmVyZW5jZXMsIChhbm5vdGF0aW9uIGFzIGFueSkuYW5ub3RhdGlvbnMsIGJhc2VBbm5vdGF0aW9uLmFubm90YXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZUFubm90YXRpb24sXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBhbm5vdGF0aW9uLm1hcCgoYW5ubykgPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ubykpIGFzIGFueVtdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLmhhc093blByb3BlcnR5KCckVHlwZScpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCByZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGFubm90YXRpb24pIGFzIGFueSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ub3RhdGlvbikgfTtcbiAgICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MSk7XG4iLCIiXX0=
|