@sapui5/sap.fe.core 1.121.2 → 1.123.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.js +2 -2
- package/src/sap/fe/core/ActionRuntime.ts +1 -2
- package/src/sap/fe/core/CommonUtils.js +14 -171
- package/src/sap/fe/core/CommonUtils.ts +15 -221
- package/src/sap/fe/core/PageController.js +13 -1
- package/src/sap/fe/core/PageController.ts +16 -0
- package/src/sap/fe/core/TemplateComponent.js +6 -1
- package/src/sap/fe/core/TemplateComponent.ts +8 -0
- package/src/sap/fe/core/UIProvider.js +23 -0
- package/src/sap/fe/core/UIProvider.ts +38 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
- package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
- package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
- package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
- package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
- package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
- package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
- package/src/sap/fe/core/controllerextensions/Share.js +7 -7
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
- package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
- package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
- package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
- package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
- package/src/sap/fe/core/converters/ConverterContext.js +17 -9
- package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
- package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
- package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
- package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
- package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
- package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
- package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
- package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
- package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
- package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
- package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
- package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
- package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
- package/src/sap/fe/core/converters/helpers/Key.js +2 -2
- package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
- package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
- package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
- package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
- package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
- package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
- package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
- package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
- package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
- package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
- package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
- package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
- package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
- package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
- package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
- package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
- package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
- package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
- package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
- package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
- package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
- package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
- package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +5 -2
- package/src/sap/fe/core/messagebundle_da.properties +1 -1
- package/src/sap/fe/core/messagebundle_en.properties +267 -2
- package/src/sap/fe/core/messagebundle_sl.properties +1 -1
- package/src/sap/fe/core/operationsHelper.js +2 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
- package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
- package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
- package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
- package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
- package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
- package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
- package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
- package/src/sap/fe/core/templating/FilterHelper.js +13 -10
- package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
- package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
- package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
- package/src/sap/fe/core/templating/UIFormatters.js +23 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
- package/src/sap/fe/core/type/EDM.js +1 -1
- package/src/sap/fe/core/type/EDM.ts +2 -2
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.ts +2 -2
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BaseControllerExtension", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/Feedback", "sap/fe/core/controllerextensions/HookSupport", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/m/Text", "sap/ui/core/Element", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/Filter", "sap/ui/model/Sorter", "../ActionRuntime", "../controls/Recommendations/ConfirmRecommendationDialog.block", "./routing/NavigationReason"], function (Log, CommonUtils, BaseControllerExtension, BusyLocker, Feedback, HookSupport, CollaborationCommon, TransactionHelper, draft, UiModelConstants, sticky, MetaModelConverter, ClassSupport, EditState, ModelHelper, ResourceModelHelper, SemanticKeyHelper, FELibrary, Button, Dialog, MessageToast, Text, Element, Library, Messaging, coreLibrary, Message, OverrideExecution, Filter, Sorter, ActionRuntime, ConfirmRecommendationDialog_block, NavigationReason) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _class, _class2;
|
|
8
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _dec43, _class, _class2;
|
|
9
9
|
var RecommendationDialogDecision = ConfirmRecommendationDialog_block.RecommendationDialogDecision;
|
|
10
10
|
var ConfirmRecommendationDialogBlock = ConfirmRecommendationDialog_block.ConfirmRecommendationDialogBlock;
|
|
11
11
|
var getResourceModel = ResourceModelHelper.getResourceModel;
|
|
@@ -38,7 +38,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
38
38
|
* @public
|
|
39
39
|
* @since 1.90.0
|
|
40
40
|
*/
|
|
41
|
-
let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = finalExtension(), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible(
|
|
41
|
+
let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = finalExtension(), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible("AfterAsync"), _dec12 = publicExtension(), _dec13 = extensible("AfterAsync"), _dec14 = hookable("after", true), _dec15 = publicExtension(), _dec16 = extensible(OverrideExecution.After), _dec17 = publicExtension(), _dec18 = extensible(OverrideExecution.After), _dec19 = publicExtension(), _dec20 = hookable("after"), _dec21 = extensible(OverrideExecution.After), _dec22 = publicExtension(), _dec23 = extensible(OverrideExecution.After), _dec24 = publicExtension(), _dec25 = extensible(OverrideExecution.After), _dec26 = publicExtension(), _dec27 = extensible(OverrideExecution.After), _dec28 = publicExtension(), _dec29 = extensible(OverrideExecution.After), _dec30 = publicExtension(), _dec31 = finalExtension(), _dec32 = publicExtension(), _dec33 = finalExtension(), _dec34 = publicExtension(), _dec35 = finalExtension(), _dec36 = publicExtension(), _dec37 = finalExtension(), _dec38 = publicExtension(), _dec39 = finalExtension(), _dec40 = publicExtension(), _dec41 = extensible(OverrideExecution.After), _dec42 = publicExtension(), _dec43 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseControllerExtens) {
|
|
42
42
|
_inheritsLoose(EditFlow, _BaseControllerExtens);
|
|
43
43
|
function EditFlow() {
|
|
44
44
|
var _this;
|
|
@@ -306,12 +306,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
306
306
|
const viewBindingContext = this.getView().getBindingContext();
|
|
307
307
|
if (listBinding.isRoot()) {
|
|
308
308
|
// keep promise chain pending until refresh of listbinding is completed
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
if (this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
|
|
310
|
+
// We use a side-effect refresh for a TreeTable, to preserve expansion states
|
|
311
|
+
result = this.getAppComponent().getSideEffectsService().requestSideEffects([{
|
|
312
|
+
$NavigationPropertyPath: ""
|
|
313
|
+
}], listBinding.getHeaderContext());
|
|
314
|
+
} else {
|
|
315
|
+
result = new Promise(resolve => {
|
|
316
|
+
listBinding.attachEventOnce("dataReceived", function () {
|
|
317
|
+
resolve();
|
|
318
|
+
});
|
|
312
319
|
});
|
|
313
|
-
|
|
314
|
-
|
|
320
|
+
listBinding.refresh();
|
|
321
|
+
}
|
|
315
322
|
} else if (parameters.requestSideEffects) {
|
|
316
323
|
this.requestSideEffectsOnDelete(listBinding, viewBindingContext);
|
|
317
324
|
}
|
|
@@ -329,6 +336,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
329
336
|
await this.base.editFlow.onAfterDelete({
|
|
330
337
|
contexts: contextsToDelete
|
|
331
338
|
});
|
|
339
|
+
if (parentControl.isA("sap.ui.mdc.Table")) {
|
|
340
|
+
var _tableAPI$tableDefini, _tableAPI$tableDefini2;
|
|
341
|
+
const tableAPI = parentControl.getParent();
|
|
342
|
+
const inactiveContextsToDelete = contextsToDelete.filter(context => context.isInactive());
|
|
343
|
+
if ((tableAPI === null || tableAPI === void 0 ? void 0 : (_tableAPI$tableDefini = tableAPI.tableDefinition) === null || _tableAPI$tableDefini === void 0 ? void 0 : (_tableAPI$tableDefini2 = _tableAPI$tableDefini.control) === null || _tableAPI$tableDefini2 === void 0 ? void 0 : _tableAPI$tableDefini2.creationMode) === CreationMode.InlineCreationRows && inactiveContextsToDelete.length > 0) {
|
|
344
|
+
tableAPI.removeEmptyRowsMessages(inactiveContextsToDelete);
|
|
345
|
+
await tableAPI.setUpEmptyRows(parentControl, false);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
332
348
|
this._sendActivity(Activity.Delete, contextsToDelete);
|
|
333
349
|
return await result;
|
|
334
350
|
} catch (error) {
|
|
@@ -540,13 +556,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
540
556
|
context: newDocumentContext
|
|
541
557
|
});
|
|
542
558
|
this.setEditMode(EditMode.Editable); // The createMode flag will be set in computeEditMode
|
|
543
|
-
if (!listBinding.isRelative()
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
559
|
+
if (!listBinding.isRelative()) {
|
|
560
|
+
if (programmingModel === ProgrammingModel.Sticky) {
|
|
561
|
+
var _entitySet$annotation3, _entitySet$annotation4;
|
|
562
|
+
// Workaround to tell the OP that we've created a new object from the LR
|
|
563
|
+
const metaContext = model.getMetaModel().getMetaContext(listBinding.getPath());
|
|
564
|
+
const entitySet = getInvolvedDataModelObjects(metaContext).startingEntitySet;
|
|
565
|
+
const newAction = entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation3 = entitySet.annotations.Session) === null || _entitySet$annotation3 === void 0 ? void 0 : (_entitySet$annotation4 = _entitySet$annotation3.StickySessionSupported) === null || _entitySet$annotation4 === void 0 ? void 0 : _entitySet$annotation4.NewAction;
|
|
566
|
+
this.getInternalModel().setProperty("/lastInvokedAction", newAction);
|
|
567
|
+
} else if (this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
|
|
568
|
+
// Creating a new item in a hierarchy from the ListReport (since the listBinding is not relative)
|
|
569
|
+
// --> we want to force the user to either save or discard the draft before leaving the OP
|
|
570
|
+
this.forceDraftSaveOrDiscard(true);
|
|
571
|
+
}
|
|
550
572
|
}
|
|
551
573
|
if (newDocumentContext) {
|
|
552
574
|
this.setDocumentModifiedOnCreate(listBinding);
|
|
@@ -668,7 +690,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
668
690
|
* @returns Promise resolves once the document has been created
|
|
669
691
|
*/;
|
|
670
692
|
_proto.createInlineDocument = async function createInlineDocument(parameters, listBinding) {
|
|
671
|
-
var _table,
|
|
693
|
+
var _table, _table4, _table4$getParent, _table4$getParent$get;
|
|
672
694
|
let table;
|
|
673
695
|
if (parameters.tableId) {
|
|
674
696
|
table = this.getView().byId(parameters.tableId);
|
|
@@ -677,8 +699,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
677
699
|
table.getRowBinding().attachEventOnce("change", async () => {
|
|
678
700
|
var _table2;
|
|
679
701
|
const newContext = await creation;
|
|
680
|
-
const
|
|
702
|
+
const allCurrentContexts = listBinding.getAllCurrentContexts();
|
|
703
|
+
const contextIndex = allCurrentContexts.indexOf(newContext);
|
|
681
704
|
(_table2 = table) === null || _table2 === void 0 ? void 0 : _table2.focusRow(contextIndex, true);
|
|
705
|
+
if (this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
|
|
706
|
+
// In case of a tree table, we also scroll to keep the parent visible
|
|
707
|
+
const parentContext = newContext.getParent();
|
|
708
|
+
const parentIndex = parentContext ? allCurrentContexts.indexOf(parentContext) : undefined;
|
|
709
|
+
if (parentIndex !== undefined && parentIndex >= 0) {
|
|
710
|
+
var _table3;
|
|
711
|
+
(_table3 = table) === null || _table3 === void 0 ? void 0 : _table3.scrollToIndex(parentIndex);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
682
714
|
});
|
|
683
715
|
}
|
|
684
716
|
|
|
@@ -691,7 +723,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
691
723
|
// currently not fully supported
|
|
692
724
|
busyMode: "Local",
|
|
693
725
|
// busy handling shall be done locally only
|
|
694
|
-
busyId: (
|
|
726
|
+
busyId: (_table4 = table) === null || _table4 === void 0 ? void 0 : (_table4$getParent = _table4.getParent()) === null || _table4$getParent === void 0 ? void 0 : (_table4$getParent$get = _table4$getParent.getTableDefinition()) === null || _table4$getParent$get === void 0 ? void 0 : _table4$getParent$get.annotation.id,
|
|
695
727
|
parentControl: this.getView(),
|
|
696
728
|
beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
|
|
697
729
|
skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate,
|
|
@@ -756,7 +788,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
756
788
|
beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
|
|
757
789
|
skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate // In case the application was called with preferredMode=autoCreateWith, we want to skip the action parameter dialog
|
|
758
790
|
}
|
|
759
|
-
}, this.getAppComponent(), this.getMessageHandler(), false)
|
|
791
|
+
}, this.getAppComponent(), this.getMessageHandler(), false).then(newDocumentContext => {
|
|
792
|
+
if (this._isFclEnabled() && newDocumentContext && newDocumentContext.getBinding() !== listBinding) {
|
|
793
|
+
// In FCL case, if the new context has been created with an action (not with the standard POST create), we need to refresh
|
|
794
|
+
// the original listBinding so that it contains the newly created object (this is done automatically by the listBinding for standard create)
|
|
795
|
+
listBinding.refresh();
|
|
796
|
+
}
|
|
797
|
+
return newDocumentContext;
|
|
798
|
+
});
|
|
799
|
+
|
|
760
800
|
// Don't do this if the invocation comes from a deferred creation or if Save is pressed directly after filling the CreationRow
|
|
761
801
|
if (parameters.bFromDeferred !== true && !parameters.skipSideEffects) {
|
|
762
802
|
this.handleSideEffects(listBinding, creation);
|
|
@@ -953,25 +993,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
953
993
|
}
|
|
954
994
|
}
|
|
955
995
|
|
|
956
|
-
/**
|
|
957
|
-
* This function can be used to intercept the 'Save' action. You can execute custom coding in this function.
|
|
958
|
-
* The framework waits for the returned promise to be resolved before continuing the 'Save' action.
|
|
959
|
-
* If you reject the promise, the 'Save' action is stopped and the user stays in edit mode.
|
|
960
|
-
*
|
|
961
|
-
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
962
|
-
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
963
|
-
*
|
|
964
|
-
* @param _mParameters Object containing the parameters passed to onBeforeSave
|
|
965
|
-
* @param _mParameters.context Page context that is going to be saved.
|
|
966
|
-
* @returns A promise to be returned by the overridden method. If resolved, the 'Save' action is triggered. If rejected, the 'Save' action is not triggered and the user stays in edit mode.
|
|
967
|
-
* @public
|
|
968
|
-
* @since 1.90.0
|
|
969
|
-
*/;
|
|
970
|
-
_proto.onBeforeSave = async function onBeforeSave(_mParameters) {
|
|
971
|
-
// to be overridden
|
|
972
|
-
return Promise.resolve();
|
|
973
|
-
}
|
|
974
|
-
|
|
975
996
|
/**
|
|
976
997
|
* This function can be used to intercept the 'Create' action. You can execute custom coding in this function.
|
|
977
998
|
* The framework waits for the returned promise to be resolved before continuing the 'Create' action.
|
|
@@ -1011,6 +1032,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1011
1032
|
return Promise.resolve();
|
|
1012
1033
|
}
|
|
1013
1034
|
|
|
1035
|
+
/**
|
|
1036
|
+
* This function can be used to intercept the 'Save' action. You can execute custom coding in this function.
|
|
1037
|
+
* The framework waits for the returned promise to be resolved before continuing the 'Save' action.
|
|
1038
|
+
* If you reject the promise, the 'Save' action is stopped and the user stays in edit mode.
|
|
1039
|
+
*
|
|
1040
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
1041
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
1042
|
+
*
|
|
1043
|
+
* @param _mParameters Object containing the parameters passed to onBeforeSave
|
|
1044
|
+
* @param _mParameters.context Page context that is going to be saved.
|
|
1045
|
+
* @returns A promise to be returned by the overridden method. If resolved, the 'Save' action is triggered. If rejected, the 'Save' action is not triggered and the user stays in edit mode.
|
|
1046
|
+
* @public
|
|
1047
|
+
* @since 1.90.0
|
|
1048
|
+
*/;
|
|
1049
|
+
_proto.onBeforeSave = async function onBeforeSave(_mParameters) {
|
|
1050
|
+
// to be overridden
|
|
1051
|
+
return Promise.resolve();
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1014
1054
|
/**
|
|
1015
1055
|
* This function can be used to intercept the 'Discard' action. You can execute custom coding in this function.
|
|
1016
1056
|
* The framework waits for the returned promise to be resolved before continuing the 'Discard' action.
|
|
@@ -1205,6 +1245,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1205
1245
|
if (activeDocumentContext !== oContext) {
|
|
1206
1246
|
let contextToNavigate = activeDocumentContext;
|
|
1207
1247
|
siblingInfo = siblingInfo ?? this._createSiblingInfo(oContext, activeDocumentContext);
|
|
1248
|
+
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
1249
|
+
// When saving, the semantic keys may have changed.
|
|
1250
|
+
// In this case, we also need to manage the semantic URL change in the history
|
|
1251
|
+
const previousSemanticPath = SemanticKeyHelper.getSemanticPath(oContext, true);
|
|
1252
|
+
const newSemanticPath = SemanticKeyHelper.getSemanticPath(activeDocumentContext, true);
|
|
1253
|
+
if (previousSemanticPath && newSemanticPath && previousSemanticPath !== newSemanticPath) {
|
|
1254
|
+
siblingInfo.pathMapping.push({
|
|
1255
|
+
oldPath: previousSemanticPath,
|
|
1256
|
+
newPath: newSemanticPath
|
|
1257
|
+
});
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1208
1260
|
this._updatePathsInHistory(siblingInfo.pathMapping);
|
|
1209
1261
|
if (oRootViewController.isFclEnabled()) {
|
|
1210
1262
|
if (siblingInfo.targetContext.getPath() !== activeDocumentContext.getPath()) {
|
|
@@ -1581,7 +1633,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1581
1633
|
* @final
|
|
1582
1634
|
*/;
|
|
1583
1635
|
_proto.invokeAction = async function invokeAction(sActionName, mInParameters, mExtraParams) {
|
|
1584
|
-
var _mInParameters, _mInParameters2, _this$getView$getMode;
|
|
1636
|
+
var _mInParameters, _mInParameters2, _this$getView$getMode, _mParameters$internal;
|
|
1585
1637
|
const transactionHelper = this.getTransactionHelper();
|
|
1586
1638
|
let aParts;
|
|
1587
1639
|
let sOverloadEntityType;
|
|
@@ -1634,6 +1686,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1634
1686
|
} else {
|
|
1635
1687
|
mParameters.internalModelContext = oView.getBindingContext("internal");
|
|
1636
1688
|
}
|
|
1689
|
+
|
|
1690
|
+
// if sticky session is enabled we trigger actions without eTag
|
|
1691
|
+
mParameters.ignoreETag = (_mParameters$internal = mParameters.internalModelContext) === null || _mParameters$internal === void 0 ? void 0 : _mParameters$internal.getProperty("/sessionOn");
|
|
1637
1692
|
if (sActionName && sActionName.includes("(")) {
|
|
1638
1693
|
// get entity type of action overload and remove it from the action path
|
|
1639
1694
|
// Example sActionName = "<ActionName>(Collection(<OverloadEntityType>))"
|
|
@@ -1838,19 +1893,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1838
1893
|
* @param oEvent The event sent by the binding
|
|
1839
1894
|
*/;
|
|
1840
1895
|
_proto.handlePatchSent = function handlePatchSent(oEvent) {
|
|
1841
|
-
var _this$getView
|
|
1842
|
-
// In collaborative draft, disable ETag check for PATCH requests
|
|
1843
|
-
const
|
|
1844
|
-
|
|
1896
|
+
var _this$getView;
|
|
1897
|
+
// In collaborative draft or sticky session, disable ETag check for PATCH requests
|
|
1898
|
+
const internalContext = (_this$getView = this.getView()) === null || _this$getView === void 0 ? void 0 : _this$getView.getBindingContext("internal");
|
|
1899
|
+
const ignoreETag = this.base.collaborativeDraft.isConnected() || internalContext.getProperty("/sessionOn");
|
|
1900
|
+
if (ignoreETag) {
|
|
1845
1901
|
oEvent.getSource().getModel().setIgnoreETag(true);
|
|
1846
1902
|
}
|
|
1847
|
-
if (!(
|
|
1903
|
+
if (!(internalContext !== null && internalContext !== void 0 && internalContext.getProperty("skipPatchHandlers"))) {
|
|
1848
1904
|
const sourceBinding = oEvent.getSource(); // FIXME: UI5 type says this should be an ODataContextBinding
|
|
1849
1905
|
// Create a promise that will be resolved or rejected when the path is completed
|
|
1850
1906
|
const oPatchPromise = new Promise((resolve, reject) => {
|
|
1851
1907
|
oEvent.getSource().attachEventOnce("patchCompleted", patchCompletedEvent => {
|
|
1852
1908
|
// Re-enable ETag checks
|
|
1853
|
-
if (
|
|
1909
|
+
if (ignoreETag) {
|
|
1854
1910
|
oEvent.getSource().getModel().setIgnoreETag(false);
|
|
1855
1911
|
}
|
|
1856
1912
|
if (oEvent.getSource().isA("sap.ui.model.odata.v4.ODataListBinding")) {
|
|
@@ -1971,6 +2027,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1971
2027
|
*/;
|
|
1972
2028
|
_proto.deleteDocumentTransaction = async function deleteDocumentTransaction(contexts, parameters) {
|
|
1973
2029
|
var _Element$getElementBy;
|
|
2030
|
+
if (parameters.selectedContexts) {
|
|
2031
|
+
// as selected contexts may include inactive context we need to compute this parameter again to ensure delete helper works properly
|
|
2032
|
+
parameters.numberOfSelectedContexts = parameters.selectedContexts.length;
|
|
2033
|
+
}
|
|
1974
2034
|
const resourceModel = this._getResourceModel();
|
|
1975
2035
|
const transactionHelper = this.getTransactionHelper();
|
|
1976
2036
|
|
|
@@ -2104,6 +2164,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2104
2164
|
const globalModel = this.getGlobalUIModel();
|
|
2105
2165
|
if (editMode) {
|
|
2106
2166
|
globalModel.setProperty("/isEditable", editMode === "Editable", undefined, true);
|
|
2167
|
+
if (editMode !== "Editable") {
|
|
2168
|
+
this.forceDraftSaveOrDiscard(false);
|
|
2169
|
+
}
|
|
2107
2170
|
}
|
|
2108
2171
|
if (isCreation !== undefined) {
|
|
2109
2172
|
// Since setCreationMode is public in EditFlow and can be overriden, make sure to call it via the controller
|
|
@@ -2112,6 +2175,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2112
2175
|
}
|
|
2113
2176
|
}
|
|
2114
2177
|
|
|
2178
|
+
/**
|
|
2179
|
+
* Sets the flag to force Save or Discard when leaving a draft.
|
|
2180
|
+
* @param forced
|
|
2181
|
+
*/;
|
|
2182
|
+
_proto.forceDraftSaveOrDiscard = function forceDraftSaveOrDiscard(forced) {
|
|
2183
|
+
this.getGlobalUIModel().setProperty("/forceDraftSaveOrDiscard", forced, undefined, true);
|
|
2184
|
+
}
|
|
2185
|
+
|
|
2186
|
+
/**
|
|
2187
|
+
* Checks if we should force the user to Save or Discard when leaving a draft, or if keeping the draft is allowed.
|
|
2188
|
+
*
|
|
2189
|
+
* @returns True if keeping the draft is not allowed
|
|
2190
|
+
*/;
|
|
2191
|
+
_proto.shallForceDraftSaveOrDiscard = function shallForceDraftSaveOrDiscard() {
|
|
2192
|
+
return this.getGlobalUIModel().getProperty("/forceDraftSaveOrDiscard") === true;
|
|
2193
|
+
}
|
|
2194
|
+
|
|
2115
2195
|
/**
|
|
2116
2196
|
* Checks if an action corresponds to a create action for a sticky session.
|
|
2117
2197
|
*
|
|
@@ -2486,9 +2566,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2486
2566
|
}
|
|
2487
2567
|
};
|
|
2488
2568
|
_proto.createEmptyRowsAndFocus = async function createEmptyRowsAndFocus(table) {
|
|
2489
|
-
var _tableAPI$
|
|
2569
|
+
var _tableAPI$tableDefini3, _tableAPI$tableDefini4, _table$getBindingCont3;
|
|
2490
2570
|
const tableAPI = table.getParent();
|
|
2491
|
-
if (tableAPI !== null && tableAPI !== void 0 && (_tableAPI$
|
|
2571
|
+
if (tableAPI !== null && tableAPI !== void 0 && (_tableAPI$tableDefini3 = tableAPI.tableDefinition) !== null && _tableAPI$tableDefini3 !== void 0 && (_tableAPI$tableDefini4 = _tableAPI$tableDefini3.control) !== null && _tableAPI$tableDefini4 !== void 0 && _tableAPI$tableDefini4.inlineCreationRowsHiddenInEditMode && !((_table$getBindingCont3 = table.getBindingContext("ui")) !== null && _table$getBindingCont3 !== void 0 && _table$getBindingCont3.getProperty("createMode"))) {
|
|
2492
2572
|
// With the parameter, we don't have empty rows in Edit mode, so we need to create them before setting the focus on them
|
|
2493
2573
|
await tableAPI.setUpEmptyRows(table, true);
|
|
2494
2574
|
}
|
|
@@ -2633,23 +2713,34 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2633
2713
|
});
|
|
2634
2714
|
if (!bReturnedContextIsSame) {
|
|
2635
2715
|
return new Promise(resolve => {
|
|
2716
|
+
const appComponent = this.getAppComponent();
|
|
2636
2717
|
if (oBinding.isRoot()) {
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2718
|
+
if (this.getTransactionHelper().isListBindingHierarchical(oBinding)) {
|
|
2719
|
+
// We use a side-effect refresh for a TreeTable, to preserve expansion states
|
|
2720
|
+
appComponent.getSideEffectsService().requestSideEffects([{
|
|
2721
|
+
$NavigationPropertyPath: ""
|
|
2722
|
+
}], oBinding.getHeaderContext()).then(() => {
|
|
2723
|
+
resolve(true);
|
|
2724
|
+
return;
|
|
2725
|
+
}).catch(e => {
|
|
2726
|
+
Log.error("Error while refreshing the table", e);
|
|
2727
|
+
resolve(true);
|
|
2728
|
+
});
|
|
2729
|
+
} else {
|
|
2730
|
+
oBinding.attachEventOnce("dataReceived", function () {
|
|
2731
|
+
resolve(true);
|
|
2732
|
+
});
|
|
2733
|
+
oBinding.refresh();
|
|
2734
|
+
}
|
|
2641
2735
|
} else {
|
|
2642
|
-
|
|
2643
|
-
oAppComponent.getSideEffectsService().requestSideEffects([{
|
|
2736
|
+
appComponent.getSideEffectsService().requestSideEffects([{
|
|
2644
2737
|
$NavigationPropertyPath: oBinding.getPath()
|
|
2645
|
-
}], oBinding.getContext()).then(
|
|
2646
|
-
resolve(
|
|
2738
|
+
}], oBinding.getContext()).then(() => {
|
|
2739
|
+
resolve(true);
|
|
2647
2740
|
return;
|
|
2648
|
-
}
|
|
2649
|
-
Log.error("Error while refreshing the table");
|
|
2650
|
-
resolve(!bReturnedContextIsSame);
|
|
2651
|
-
}).catch(function (e) {
|
|
2741
|
+
}).catch(e => {
|
|
2652
2742
|
Log.error("Error while refreshing the table", e);
|
|
2743
|
+
resolve(true);
|
|
2653
2744
|
});
|
|
2654
2745
|
}
|
|
2655
2746
|
});
|
|
@@ -2796,7 +2887,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2796
2887
|
return recommendationOptionChoosen;
|
|
2797
2888
|
};
|
|
2798
2889
|
return EditFlow;
|
|
2799
|
-
}(BaseControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "
|
|
2890
|
+
}(BaseControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec12, _dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec19, _dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec34, _dec35], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec36, _dec37], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec38, _dec39], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec40, _dec41], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec42, _dec43], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype)), _class2)) || _class);
|
|
2800
2891
|
return EditFlow;
|
|
2801
2892
|
}, false);
|
|
2802
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaG9va2FibGUiLCJzeW5jVGFza3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZVNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmciLCJjcmVhdGlvblByb21pc2UiLCJ2aWV3QmluZGluZ0NvbnRleHQiLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFBhdGgiLCJlcnJvciIsIkxvZyIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsInZhbGlkYXRpb25NZXNzYWdlcyIsInRhYmxlIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJkYXRhIiwiY3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsImN1c3RvbU1lc3NhZ2VzIiwiZmllbGRDb250cm9sIiwiZmluYWxUYXJnZXQiLCJvbGRNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0Q29kZSIsInJlbW92ZU1lc3NhZ2VzIiwiZm9yRWFjaCIsInZhbGlkYXRpb25NZXNzYWdlIiwibWVzc2FnZVRhcmdldCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwibGVuZ3RoIiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJFcnJvciIsImNvZGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsImNyZWF0ZURhdGEiLCJOZXdQYWdlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJpc1JlbGF0aXZlIiwiZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJEcmFmdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsInRhcmdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwicGFyYW1ldGVycyIsIkRlZmVycmVkIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJBc3luYyIsImdldEludGVyZmFjZSIsImJhc2UiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsInRyYW5zYWN0aW9uSGVscGVyIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtb2RlbCIsIm9WaWV3RGF0YSIsImdldFZpZXdEYXRhIiwic1Byb2dyYW1taW5nTW9kZWwiLCJvUm9vdENvbnRleHQiLCJvVmlldyIsImdyb3VwSWQiLCJ2aWV3TGV2ZWwiLCJTdGlja3kiLCJjcmVhdGVSb290Q29udGV4dCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsInJpZ2h0bW9zdENvbnRleHQiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIm9OZXdEb2N1bWVudENvbnRleHRQcm9taXNlIiwicm9vdENvbnRleHRJbmZvIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwic2libGluZ0luZm9Qcm9taXNlIiwiY29tcHV0ZVNpYmxpbmdJbmZvIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzdWJtaXRCYXRjaCIsInNpYmxpbmdJbmZvIiwib05ld0RvY3VtZW50Q29udGV4dCIsImNvbnRleHRUb05hdmlnYXRlIiwidW5kZWZpbmVkIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNldERvY3VtZW50TW9kaWZpZWQiLCJvbkFmdGVyRWRpdCIsIl9oYW5kbGVOZXdDb250ZXh0IiwiZWRpdGFibGUiLCJyZWNyZWF0ZUNvbnRleHQiLCJmb3JjZUZvY3VzIiwic3RpY2t5Q29udGV4dCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJoYW5kbGVTdGlja3lPbiIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaGFyZU9iamVjdCIsIm9FcnJvciIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJCdXN5TG9ja2VyIiwibG9jayIsInNlbGVjdGVkQ29udGV4dHMiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwicmVzdWx0IiwiaXNBIiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJEZWxldGUiLCJ1bmxvY2siLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJpc0RyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic3luY1Rhc2siLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsImVudGl0eVNldE5hbWUiLCJnZXRPYmplY3QiLCJzZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImN1cnJlbnRTZW1hbnRpY01hcHBpbmciLCJfZ2V0U2VtYW50aWNNYXBwaW5nIiwiY3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJzaG93TWVzc2FnZXMiLCJnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbiIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9EYXRhTGlzdEJpbmRpbmciLCJjcmVhdGlvbk1vZGUiLCJFeHRlcm5hbCIsIm9EYXRhTW9kZWwiLCJiaW5kTGlzdCIsIlN5bmMiLCJjcmVhdGVBdEVuZCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzaW5nbGVEcmFmdEZvckNyZWF0ZSIsImdldE1hbmlmZXN0IiwiYXBwIiwiZ2V0Um9vdEJpbmRpbmciLCJnZXRIZWFkZXJDb250ZXh0IiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZUlubGluZURvY3VtZW50IiwidGFibGVJZCIsImNyZWF0ZVN5bmNBc3luY0RvY3VtZW50IiwiYkZyb21EZWZlcnJlZCIsImNyZWF0ZUFjdGlvbiIsInBvc3REb2N1bWVudENyZWF0aW9uIiwicHJlcmVxdWlzaXRlIiwicGFyYW1zIiwibmV3RG9jdW1lbnRDb250ZXh0Iiwib25BZnRlckNyZWF0ZSIsIm1ldGFDb250ZXh0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJnZXRJbnRlcm5hbE1vZGVsIiwic2V0UHJvcGVydHkiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJDcmVhdGUiLCJpc0RyYWZ0Um9vdCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiYXBwQ29tcG9uZW50IiwiZ2V0UGFyZW50IiwibmF2aWdhdGlvbiIsImNyZWF0aW9uUm93Q29udGV4dCIsImRvY3VtZW50VmFsaWRhdGlvbiIsImdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uIiwiZW50aXR5VHlwZSIsImNyZWF0aW9uUm93UGF5bG9hZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJjcmVhdGlvbiIsInNjcm9sbFRvSW5kZXgiLCJnZXRMZW5ndGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJPYmplY3QiLCJhc3NpZ24iLCJrZXlzIiwicHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJmaW5kSW5kZXgiLCJwcm9wZXJ0eSIsIm5hbWUiLCJtYXAiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsImNyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJuZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJhbGwiLCJjb250ZXh0SW5kZXgiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJpbmRleE9mIiwiZm9jdXNSb3ciLCJnZXRJbnRlcm5hbFJvdXRpbmciLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycyIsIm1vZGUiLCJyb3V0aW5nTGlzdGVuZXIiLCJjcmVhdGVDb250ZXh0UHJvbWlzZSIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibmF2UGFyYW1ldGVycyIsInRyYW5zaWVudCIsIm5hdmlnYXRlVG9Db250ZXh0IiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ3JlYXRpb25GYWlsZWQiLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsImluY2x1ZGVzIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJjcmVhdGVQYXRoIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInZhbGlkYXRlRG9jdW1lbnQiLCJjcmVhdGlvblJvd09iamVjdHMiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsImRhdGFGb3JDcmVhdGUiLCJpc0Zyb21Db3B5UGFzdGUiLCJjcmVhdGVBc0luYWN0aXZlIiwidGFyZ2V0TGlzdEJpbmRpbmciLCJjb250ZXh0UGF0aCIsIm1ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJjcmVhdGlvblByb21pc2VzIiwicHJvcGVydHlWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiaW5hY3RpdmUiLCIka2luZCIsImNyZWF0ZWRDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwiaXNJbmFjdGl2ZSIsImVyciIsIm9uQmVmb3JlU2F2ZSIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQWZ0ZXJTYXZlIiwib25BZnRlckRpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJtUGFyYW1ldGVycyIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJtZXJnZVBhdGNoRHJhZnQiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4iLCJjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uIiwiaXNGY2xFbmFibGVkIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZ2V0UmVzb3VyY2VNb2RlbCIsImdldENyZWF0aW9uTW9kZSIsIl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiQWN0aXZhdGUiLCJkaXNjb25uZWN0IiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiU3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsIlRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5Iiwic3RvcmVEYXRhRm9yVGVsZW1ldHJ5IiwiX2NyZWF0ZVNpYmxpbmdJbmZvIiwicGF0aE1hcHBpbmciLCJ0YXJnZXRDb250ZXh0IiwiY2FuY2VsZWQiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsIm9Db250ZXh0RGF0YSIsImJJc0RyYWZ0IiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJjYW5jZWxQYXJhbWV0ZXJzIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiY2FuY2VsQnV0dG9uIiwiY29udHJvbCIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJ2aWV3IiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJEaXNjYXJkIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMiLCJza2lwQmluZGluZ1RvVmlldyIsInNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIiwicmVzb3VyY2VNb2RlbCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJkZWxldGVEb2N1bWVudCIsIm9BcHBDb21wb25lbnQiLCJnZXRJbmRleCIsInNpYmxpbmdDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJkcmFmdFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRyYWZ0Q29udGV4dFRvUmVtb3ZlIiwicmVwbGFjZVdpdGgiLCJjb250ZXh0QmluZGluZyIsInBhcmVudExpc3RCaW5kaW5nIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJvTG9ja09iamVjdCIsImNoZWNrSWZSZWNvbW1lbmRhdGlvbnNFeGlzdCIsImlzQ29udGludWUiLCJzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIlJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24iLCJDb250aW51ZSIsImludm9rZUFjdGlvbiIsInNBY3Rpb25OYW1lIiwibUV4dHJhUGFyYW1zIiwiYVBhcnRzIiwic092ZXJsb2FkRW50aXR5VHlwZSIsIm9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzIiwiQXJyYXkiLCJpc0FycmF5IiwiaXNOYXZpZ2FibGUiLCJyZXF1aXJlc05hdmlnYXRpb24iLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsImVudGl0eUNvbnRhaW5lciIsImlzQm91bmQiLCJvQ29udHJvbCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsIm9MaXN0QmluZGluZyIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJnZXRJZCIsImJHZXRCb3VuZENvbnRleHQiLCJfZ2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJjb252ZXJ0ZXJUeXBlIiwib1Jlc3BvbnNlIiwiY2FsbEFjdGlvbiIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMiLCJ2YWx1ZSIsIkFjdGlvbiIsImFjdGlvbiIsImZSZXNvbHZlciIsInZDb250ZXh0Iiwib01ldGFNb2RlbCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwicmV0dXJuQ29udGV4dCIsImluZm8iLCJvbkFmdGVyQWN0aW9uRXhlY3V0aW9uIiwiZlJlamVjdG9yIiwiZXJyUHJvbWlzZSIsInJlamVjdGVkSXRlbXMiLCJfYWN0aW9uTmFtZSIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsInJlamVjdCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJpc0luQ29sbGFib3JhdGl2ZURyYWZ0IiwiZ2V0U291cmNlIiwic2V0SWdub3JlRVRhZyIsInNvdXJjZUJpbmRpbmciLCJvUGF0Y2hQcm9taXNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlU2VudCIsImV2ZW50IiwibmV3VGFzayIsImRlYnVnIiwiY29tcHV0ZUVkaXRNb2RlIiwiZ2xvYmFsTW9kZWwiLCJpc0FjdGl2ZUVudGl0eSIsInJlcXVlc3RPYmplY3QiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsImdldFJlc291cmNlTW9kZWwiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm1lc3NhZ2VIYW5kbGVyIiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInVpTW9kZWxDb250ZXh0IiwiVWlNb2RlbENvbnN0YW50cyIsIkNyZWF0ZU1vZGUiLCJEb2N1bWVudE1vZGlmaWVkIiwibW9kaWZpZWQiLCJiaW5kaW5nIiwiYXR0YWNoRXZlbnQiLCJzdWNjZXNzIiwiZHJhZnRTdGF0dXMiLCJzb3VyY2UiLCJlZGl0TW9kZSIsImlzQ3JlYXRpb24iLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiYmluZCIsImRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJpMThuTW9kZWwiLCJzZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbiIsImF0dGFjaFNlc3Npb25UaW1lb3V0Iiwic3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uIiwiZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24iLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiZ2V0SHR0cEhlYWRlcnMiLCJuYXZpZ2F0aW9uQ29udGV4dCIsInRhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwicm91dGVyUHJveHkiLCJsY2xIYXNoVHJhY2tlciIsImlzRGlydHkiLCJpc1Nlc3Npb25PbiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJ3YXJuaW5nRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsInJlc2V0Q2hhbmdlcyIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsInJlc3BvbnNlIiwiY3VycmVudFZpZXciLCJtZXRhTW9kZWxEYXRhIiwibWV0YU1vZGVsQWN0aW9uIiwiYWN0aW9uUmV0dXJuVHlwZSIsIiRSZXR1cm5UeXBlIiwiJFR5cGUiLCIkS2V5Iiwib0RhdGEiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiaXNTYXZlIiwiY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIkNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ0Jsb2NrIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwidGFibGVBUEkiLCJ0YWJsZURlZmluaXRpb24iLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwic2V0VXBFbXB0eVJvd3MiLCJyZWxhdGVkQ29udGV4dHMiLCJ0cmlnZ2VyZWRBY3Rpb25OYW1lIiwicmVmcmVzaExpc3RCaW5kaW5nIiwic2VuZCIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJvTW9kZWwiLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiaGlzdG9yeSIsImJhY2siLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBlcnNpc3RPUFNjcm9sbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJFZGl0Rmxvd0FjdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInNWaWV3SWQiLCJhTWVzc2FnZXMiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib0JpbmRpbmciLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3VzdG9tTWVzc2FnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBDYW5jZWxQYXJhbWV0ZXJzLCBDcmVhdGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycywgUm9vdENvbnRleHRJbmZvLCBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0U2libGluZ1BhaXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHtcblx0Q29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2ssXG5cdFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb25cbn0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlLFxuXHRNZXNzYWdlVHlwZSA9IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2s7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgZWRpdGFibGUgY29udGV4dFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9Sb290Q29udGV4dDogQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBncm91cElkID0gXCJlZGl0R3JvdXBcIjtcblx0XHR0cnkge1xuXHRcdFx0aWYgKChvVmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0b1Jvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KHNQcm9ncmFtbWluZ01vZGVsLCBvVmlldywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSkpIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiBvUm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHJpZ2h0bW9zdENvbnRleHQgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKSA/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dFByb21pc2UgPSB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHRJbmZvID0ge1xuXHRcdFx0XHRyb290U2libGluZ1BhdGhQcm9taXNlOiBvTmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdC8vIHJpZ2h0bW9zdENvbnRleHQgPT09IHJvb3RDb250ZXh0ID0+IHdlJ3JlIGluIE9QLiBJZiBub3QsIHdlJ3JlIGluIG11bHRpLWNvbHVtbiBsYXlvdXQgb2YgRkNMXG5cdFx0XHRjb25zdCBjb21wdXRlU2libGluZ0luZm8gPSByaWdodG1vc3RDb250ZXh0ICE9PSBvUm9vdENvbnRleHQgfHwgKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSAoYXdhaXQgb05ld0RvY3VtZW50Q29udGV4dFByb21pc2UpIGFzIENvbnRleHQ7XG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0XHRcIiRhdXRvXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gdGhpcy5fZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQsIHNpYmxpbmdJbmZvKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCAhPT0gb1Jvb3RDb250ZXh0KSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJFZGl0KHsgY29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogZmFsc2UsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdGxldCBzdGlja3lDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgdXNlZCB0byBiaW5kIHRoZSBwYWdlXG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQob05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3Qob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBzaWRlIGVmZmVjdHMgcmVxdWlyZWQgYWZ0ZXIgZGVsZXRpbmcgYW4gb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0aGUgZGVsZXRlZCBvYmplY3QgYmVsb25ncyB0b1xuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiBwYXJlbnQgb2JqZWN0IG9mIHRoZSBkZWxldGVkIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSByZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCwgcGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGlmICghbGlzdEJpbmRpbmcgfHwgIXBhcmVudENvbnRleHQgfHwgQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdFNlcnZpY2UgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHBhcmVudENvbnRleHQpO1xuXG5cdFx0Y29uc3Qgc3RhdGVNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgobGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgcGFyZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdC8vIEluIGNhc2Ugb2YgYSBUcmVlVGFibGUsIHdlIG5lZWQgdG8gcmVmcmVzaCBzdGF0ZSBtZXNzYWdlcyBmb3IgdGhlIE9iamVjdFBhZ2UsIGFzIHNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgbWlnaHQgYmUgYXR0YWNoZWRcblx0XHQvLyB0byBjaGlsZHJlbiBvZiBhIGRlbGV0ZWQgcm93IHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZCB5ZXQsIGFuZCB0aGVyZWZvcmUgdGhlIG1vZGVsIHdvdWxkbid0IGNsZWFuIHVwIHRoZXNlIG1lc3NhZ2VzXG5cdFx0aWYgKHN0YXRlTWVzc2FnZXNQYXRoICYmIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtzdGF0ZU1lc3NhZ2VzUGF0aF0sIHBhcmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHNUb0RlbGV0ZSBUaGUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubm9EaWFsb2dcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGFzeW5jIGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZDogc3RyaW5nO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKSA/PyBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2wgYXMgQ29udHJvbDtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSAocGFyZW50Q29udHJvbC5nZXRCaW5kaW5nKFwiaXRlbXNcIikgfHwgKHBhcmVudENvbnRyb2wgYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHBhcmFtZXRlcnM/LnNlbGVjdGVkQ29udGV4dHM/LlswXSA/PyBjb250ZXh0c1RvRGVsZXRlWzBdKSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRsZXQgcmVzdWx0O1xuXG5cdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0cGFyZW50Q29udHJvbC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0cmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRsaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUgfSk7XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIGNvbnRleHRzVG9EZWxldGUpO1xuXG5cdFx0XHRyZXR1cm4gYXdhaXQgcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQHBhcmFtIHVwZGF0ZWRDb250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHVwZGF0ZVByb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHVwZGF0ZURvY3VtZW50KHVwZGF0ZWRDb250ZXh0OiBvYmplY3QsIHVwZGF0ZVByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvcmlnaW5hbEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBpc0RyYWZ0ID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHVwZGF0ZWRDb250ZXh0IGFzIEJpbmRpbmcgfCBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKHNlbWFudGljS2V5cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY1BhdGggPSBjdXJyZW50U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoY3VycmVudEJpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHQvLyBjdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRTZW1hbnRpY1BhdGggJiYgY3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRpZiAoaXNEcmFmdCAmJiBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24oc2VsZWN0ZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCk6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoc2VsZWN0ZWRDb250ZXh0cyAmJiBzZWxlY3RlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIE9uZSBwYXJlbnQgYXQgbW9zdCAhIVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGEgbmV3IGRvY3VtZW50IGluIGEgVHJlZVRhYmxlIHdpdGggJHtzZWxlY3RlZENvbnRleHRzLmxlbmd0aH0gcGFyZW50c2ApO1xuXHRcdH1cblxuXHRcdHJldHVybiBzZWxlY3RlZENvbnRleHRzPy5sZW5ndGggPT09IDEgPyBzZWxlY3RlZENvbnRleHRzWzBdIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzo8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWQ8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKTxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCB2aWEgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRhYmxlSWQgSUQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5idXN5TW9kZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgVGhlIGNvbnRleHRzIHRoYXQgYXJlIHNlbGVjdGVkIGluIHRoZSB0YWJsZSBpbml0aWF0aW5nIHRoZSBjcmVhdGlvbi4gVXNlZCBpbiBjYXNlIG9mIGEgVHJlZVRhYmxlIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGNvbnRleHQgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgV2hlbiBlbmFibGVkLCBhbiBleHRyYSByZXF1ZXN0IGNoZWNrcyBpZiBhbnkgZHJhZnRzIGV4aXN0IHRoYXQgd2VyZSBuZXZlciBzYXZlZC4gSWYgdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCB0aGUgbmV3ZXN0IG9uZSBpcyBvcGVuZWQuIElmIG5vIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHR2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0c2luZ2xlRHJhZnRGb3JDcmVhdGU/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9EYXRhTGlzdEJpbmRpbmchOiBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdGxldCBwYXJlbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb25zdCBvRGF0YU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdFx0aWYgKCFvRGF0YU1vZGVsKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBvRGF0YU1vZGVsLmJpbmRMaXN0KHZMaXN0QmluZGluZykgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdFx0bUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuU3luYztcblx0XHRcdFx0ZGVsZXRlIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2UgaWYgKHZMaXN0QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gdkxpc3RCaW5kaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKG9EYXRhTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRleHQgPSB0aGlzLmdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKG1JblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSB0aGlzLnJlc29sdmVDcmVhdGlvbk1vZGUobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsIG9EYXRhTGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMuZGF0YSk7XG5cblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAoXG5cdFx0XHQobUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gbUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZVxuXHRcdFx0XHQ6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3QoKVtcInNhcC5mZVwiXT8uYXBwPy5zaW5nbGVEcmFmdEZvckNyZWF0ZSkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPT09IG9EYXRhTGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkgIT09IG51bGxcblx0XHQpIHtcblx0XHRcdGNvbnN0IG5ld0JpbmRpbmcgPSBvRGF0YUxpc3RCaW5kaW5nLmdldE1vZGVsKCk/LmJpbmRMaXN0KFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRDb250ZXh0KCksXG5cdFx0XHRcdG5ldyBTb3J0ZXIoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9MYXN0Q2hhbmdlRGF0ZVRpbWVcIiwgdHJ1ZSksXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdGZpbHRlcnM6IFtcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIklzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSGFzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRhbmQ6IHRydWVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXdCaW5kaW5nPy5yZXF1ZXN0Q29udGV4dHMoMCwgMSk7XG5cdFx0XHRpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZU5ld0NvbnRleHQocmVzdWx0WzBdLCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pLnRoZW4oKCkgPT4gbmV3QmluZGluZz8uZGVzdHJveSgpKTtcblx0XHRcdH1cblx0XHRcdG5ld0JpbmRpbmc/LmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUocmVzb2x2ZWRDcmVhdGlvbk1vZGUsIHZMaXN0QmluZGluZywgbUluUGFyYW1ldGVycywgb0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUocmVzb2x2ZWRDcmVhdGlvbk1vZGUsIHZMaXN0QmluZGluZywgbUluUGFyYW1ldGVycywgb0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlOiBzdHJpbmcsXG5cdFx0dkxpc3RCaW5kaW5nOiBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRvRGF0YUxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWRcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0c3dpdGNoIChyZXNvbHZlZENyZWF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWw6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUV4dGVybmFsRG9jdW1lbnQodkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLm91dGJvdW5kKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEZWZlcnJlZERvY3VtZW50KG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3dcblx0XHRcdFx0XHQ/IHRoaXMuY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogcGFyYW1ldGVycy5jcmVhdGlvblJvdyxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmRcblx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUlubGluZURvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiByZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0XHRcdGJGcm9tRGVmZXJyZWQ6IHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjcmVhdGVBY3Rpb246IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlICR7cmVzb2x2ZWRDcmVhdGlvbk1vZGV9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqRXhlY3V0ZXMgdGhlIG1hbmRhdG9yeSBjb25maWd1cmF0aW9uIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJlcmVxdWlzaXRlIFByb21pc2Ugb2YgdGhlIGRvY3VtZW50IGNyZWF0aW9uIGFuZCB0aGUgZm9sbG93aW5nIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHBvc3REb2N1bWVudENyZWF0aW9uKHByZXJlcXVpc2l0ZTogUHJvbWlzZTxbQ29udGV4dCwgdW5rbm93bl0+LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmFtcyA9IGF3YWl0IHByZXJlcXVpc2l0ZTtcblx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHQgPSBwYXJhbXNbMF07XG5cdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7IC8vIFRoZSBjcmVhdGVNb2RlIGZsYWcgd2lsbCBiZSBzZXQgaW4gY29tcHV0ZUVkaXRNb2RlXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgJiYgcHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIG5ld0FjdGlvbik7XG5cdFx0fVxuXHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRhd2FpdCBzaGFyZU9iamVjdChuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0fSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdGNvbnN0IHRhYmxlID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgbmF2aWdhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghdGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJDcmVhdGlvblJvd1wiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dDb250ZXh0ID0gY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGRvY3VtZW50VmFsaWRhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGUpO1xuXHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRpZiAoY3JlYXRpb25Sb3cuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zeW5jVGFzayhkb2N1bWVudFZhbGlkYXRpb24pO1xuXHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXModmFsaWRhdGlvbk1lc3NhZ2VzLCB0YWJsZSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKSkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBjcmVhdGlvblJvd1BheWxvYWQgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdC8vbW92ZWQgYWZ0ZXIgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyB0byBhdm9pZCBcIidjcmVhdGlvbicgdXNlIGJlZm9yZSBpbml0aWFsaXphdGlvblwiIGNvbnNvbGUgZXJyb3JzXG5cdFx0Ly9hZnRlciB2YWxpZGF0aW9uIGVycm9ycyBvY2N1cnJlZFxuXHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgocGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHQuLi5PYmplY3Qua2V5cyhjcmVhdGlvblJvd1BheWxvYWQpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eVBhdGgpID09PSAtMVxuXHRcdFx0XHRcdFx0KSAvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Lm1hcCgocGF0aCkgPT4gKHsgW3BhdGhdOiBjcmVhdGlvblJvd1BheWxvYWRbcGF0aF0gfSkpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogYXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvd1xuXHRcdFx0fSxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBpbmxpbmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGFcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0XHRjb25zdCBjb250ZXh0SW5kZXggPSBsaXN0QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKS5pbmRleE9mKG5ld0NvbnRleHQpO1xuXHRcdFx0XHR0YWJsZT8uZm9jdXNSb3coY29udGV4dEluZGV4LCB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCxcblx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCB0aGlzLnN5bmNUYXNrKGNyZWF0aW9uKV0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRlZmZlcmVkIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgT3B0aW9uYWwgcGFyZW50IGNvbnRleHQgd2hlbiBjcmVhdGluZyBhIG5vZGUgaW4gVHJlZVRhYmxlXG5cdCAqIEBwYXJhbSBkYXRhXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEZWZlcnJlZERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQsIGRhdGE/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVyczogeyBtb2RlOiBcIkRlZmVycmVkXCIsIHBhcmVudENvbnRleHQsIGxpc3RCaW5kaW5nLCBkYXRhIH0sXG5cdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHR9KTtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3luYyBvciBhc3luYyBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIHN5bmMgb3IgYXN5bmMgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFRoaXMgZG9jdW1lbnQgaXMgY3JlYXRlZCBhZnRlciBhIGRlZmZlcmVkIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiAgVGhlIGNyZWF0ZSBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBjcmVhdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgIERhdGEgdG8gc2F2ZSBvbiB0aGUgbmV3IGRvY3VtZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG5hdmlnYXRpb246IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHJvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0Li4ue1xuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdC8vIERvbid0IGRvIHRoaXMgaWYgdGhlIGludm9jYXRpb24gY29tZXMgZnJvbSBhIGRlZmVycmVkIGNyZWF0aW9uIG9yIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvd1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgIT09IHRydWUgJiYgIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmMpIHtcblx0XHRcdG5hdmlnYXRpb24gPSByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiQXN5bmNcIiwgY3JlYXRlQ29udGV4dFByb21pc2U6IGNyZWF0aW9uIH0sXG5cdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uLnRoZW4oYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoIW5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdFx0cmV0dXJuIHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfRURJVEZMT1dfU0FQRkVfQ1JFQVRJT05fRkFJTEVEX0RFU0NSSVBUSU9OXCIpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgU3luYyBjcmVhdGlvbiB3YXMgdHJpZ2dlcmVkIGZvciBhIGRlZmVycmVkIGNyZWF0aW9uLCB3ZSBkb24ndCBuYXZpZ2F0ZSBmb3J3YXJkXG5cdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0Y29uc3QgbmF2UGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0dHJhbnNpZW50OlxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHQ/IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdC8vIGNyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB1c2VyIG9yIGZhaWxlZCBpbiBiYWNrZW5kID0+IGluIGNhc2Ugd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdHJhbnNpZW50IGNvbnRleHQgYmVmb3JlLCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHQvLyB0aGUgc3dpdGNoLXN0YXRlbWVudCBhYm92ZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaGFwcGVucyBpbiBjcmVhdGlvbk1vZGVzIGRlZmVycmVkIGFuZCBhc3luYy4gQnV0IGluIGZhY3QsIGluIHRoZXNlIGNhc2VzIGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGZyb20gcm91dGVNYXRjaGVkIGluIE9QIGNvbXBvbmVudFxuXHRcdFx0Ly8gY3JlYXRlRGVmZXJyZWREb2N1bWVudCBpcyB0cmlnZ2VyZWQsIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIChjcmVhdGVEb2N1bWVudCkgYWdhaW4gLSB0aGlzIHRpbWUgd2l0aCBjcmVhdGlvbk1vZGUgc3luYy4gVGhlcmVmb3JlLCBhbHNvIGluIHRoYXQgbW9kZSB3ZSBuZWVkIHRvIHRyaWdnZXIgYmFjayBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gVGhlIG90aGVyIGNhc2VzIG1pZ2h0IHN0aWxsIGJlIG5lZWRlZCBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyxcblx0XHRcdFx0XHRDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWRcblx0XHRcdFx0XS5pbmNsdWRlcyhlcnJvcilcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV4dGVybmFsIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIG91dGJvdW5kIFRoZSBvdXRib3VuZCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXh0ZXJuYWxEb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZywgb3V0Ym91bmQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRpZiAob3V0Ym91bmQpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdEJpbmRpbmcgIT09IFwic3RyaW5nXCIgJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkV4dGVybmFsXCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXHRcdFx0Y29uc3QgY3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmJhc2UuZ2V0VmlldygpLCBsaXN0QmluZGluZyk7XG5cdFx0XHRjb250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKGNvbnRyb2xsZXIsIG91dGJvdW5kLCB1bmRlZmluZWQsIGNyZWF0ZVBhdGgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB0byBleGVjdXRlIGFmdGVyIHRoZSBkb2N1bWVudCBjcmVhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjcmVhdGlvblByb21pc2UgVGhlIHByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIFNpZGVFZmZlY3RzIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0aGFuZGxlU2lkZUVmZmVjdHMgPSBhc3luYyAobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0Pik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uUHJvbWlzZTtcblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgbmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSAmJiB2aWV3QmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhlIGNyZWF0aW9uUm93LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2VzIFRoZSBlcnJvciBtZXNzYWdlcyBmb3JtIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRhcmdldGVkIGJ5IHRoZSBtZXNzYWdlc1xuXHQgKi9cblx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKHZhbGlkYXRpb25NZXNzYWdlczogeyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXSwgdGFibGU6IFRhYmxlKTogdm9pZCA9PiB7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpO1xuXHRcdGNvbnN0IGN1c3RvbVZhbGlkaXR5ID0gdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpO1xuXHRcdGNvbnN0IGN1c3RvbU1lc3NhZ2VzOiBDdXN0b21NZXNzYWdlW10gPSBbXTtcblx0XHRsZXQgZmllbGRDb250cm9sO1xuXHRcdGxldCBmaW5hbFRhcmdldDogc3RyaW5nO1xuXG5cdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdGNvbnN0IG9sZE1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldENvZGUoKSA9PT0gY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKTtcblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMob2xkTWVzc2FnZXMpO1xuXG5cdFx0dmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKHZhbGlkYXRpb25NZXNzYWdlKSA9PiB7XG5cdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRpZiAodmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRmaWVsZENvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGN1c3RvbVZhbGlkaXR5W3ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdGZpbmFsVGFyZ2V0ID0gYCR7ZmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ1BhdGgoXCJ2YWx1ZVwiKX1gO1xuXHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCFNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0ID09PSBmaW5hbFRhcmdldCkpLmxlbmd0aFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdFx0XHRjb2RlOiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IGZpbmFsVGFyZ2V0XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0ID09PSBmaW5hbFRhcmdldCkpO1xuXHRcdFx0XHRleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlc1swXS5hZGRDb250cm9sSWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdXN0b21NZXNzYWdlcy5wdXNoKHtcblx0XHRcdFx0XHRjb2RlOiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0dGV4dDogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChjdXN0b21NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBjdXN0b21NZXNzYWdlc1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXNvbHZlcyB0aGUgY3JlYXRpb24gbW9kZVxuXHQgKiBQcm92aWRlcyB0aGUgZXhwZWN0ZWQgY3JlYXRpb24gbW9kZTpcblx0ICogIC0gcHJlc2VydmVzIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZSB3aGVuIHRoaXMgb25lIGlzIG5vdCBhIE5ld1BhZ2Vcblx0ICogIC0gY2FsY3VsYXRlcyB0aGUgbmV3IG9uZSBpZiB0aGUgY3JlYXRpb24gbW9kZSBpcyBhIE5ld1BhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBpbml0aWFsQ3JlYXRpb25Nb2RlIFRoZSBpbml0aWFsIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGNyZWF0ZURhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3Igb2JqZWN0IGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0cmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRuZXdBY3Rpb24gPSAoXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ6IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHRcdCk/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblxuXHRcdFx0XHRpZiAobmV3QWN0aW9uICYmIGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlUeXBlLmFjdGlvbnNbbmV3QWN0aW9uXS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mXG5cdCAqIGEgY3JlYXRpb24gcm93J3MgY3VzdG9tIHZhbGlkYXRpb24gYXMgYSBwcm9taXNlLiBJZiBubyBjcmVhdGlvbiByb3cgaXMgaW52b2x2ZWRcblx0ICogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZS5cblx0ICpcblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aXRoIHRoZSBjcmVhdGlvblJvd1xuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2Vcblx0ICovXG5cdGdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZCk6ICgpID0+IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gdGFibGU/LmdldENyZWF0aW9uUm93KCk7XG5cdFx0aWYgKGNyZWF0aW9uUm93ICYmIHRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4gPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGlvblJvd09iamVjdHMgPSAoY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRPYmplY3QoKTtcblx0XHRcdFx0ZGVsZXRlIGNyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlRG9jdW1lbnQodGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZGF0YTogY3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGFzeW5jICgpID0+IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlLFxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxDb250ZXh0W10+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHMgPSByZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKGJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdGF3YWl0IGJlZm9yZUNyZWF0ZUNhbGxCYWNrKHsgY29udGV4dFBhdGg6IHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSB9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGxldCBtZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRpZiAodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3RhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCl9LyR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHModGFyZ2V0TGlzdEJpbmRpbmcpO1xuXG5cdFx0XHQvLyBJdGVyYXRlIG9uIGFsbCBpdGVtcyBhbmQgc3RvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRpb24gcHJvbWlzZVxuXHRcdFx0Y29uc3QgY3JlYXRpb25Qcm9taXNlcyA9IGRhdGFGb3JDcmVhdGUubWFwKGFzeW5jIChwcm9wZXJ0eVZhbHVlcykgPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzID0geyBkYXRhOiB7fSwgcGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCkgfTtcblxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSBjcmVhdGVBdEVuZDtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5pbmFjdGl2ZSA9IGNyZWF0ZUFzSW5hY3RpdmU7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke21ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0XHRcdCFwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmRhdGEhW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHR0YXJnZXRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBjcmVhdGVkQ29udGV4dHMuZmlsdGVyKChuZXdDb250ZXh0KSA9PiAhbmV3Q29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZlQ29udGV4dHMubWFwKGFzeW5jIChuZXdDb250ZXh0KSA9PiBuZXdDb250ZXh0LmNyZWF0ZWQoKSkpO1xuXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKHJlcXVlc3RTaWRlRWZmZWN0cyAmJiAhQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dCh0YXJnZXRMaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBhY3RpdmVDb250ZXh0cyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBjcmVhdGVkQ29udGV4dHM7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEaXNjYXJkJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEZWxldGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgY29udGV4dCB3ZSBvYnRhaW5lZCBhZnRlciBzYXZpbmdcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBob29rYWJsZShcImFmdGVyXCIpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyU2F2ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IG9idGFpbmVkIGFmdGVyIGRpc2NhcmRpbmcgdGhlIG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIHdlIGRpc2NhcmRlZCBhIG5ldyBvYmplY3Rcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2Ugc2F2ZSBpcyBjb21wbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBTYXZlRG9jdW1lbnRQYXJhbWV0ZXJzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncyBhcyBPRGF0YUxpc3RCaW5kaW5nW107XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0XHQvLyBpcyBzZW50IHRvIHRoZSBiYWNrZW5kXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0ICE9PSB0cnVlKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdFx0Ly93ZSBuZWVkIHRvIHJlcXVlc3QgZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQgdGhlbiBicmluZyB0aGUgZGlhbG9nIGhlcmVcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLmNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgJGF1dG8gcXVldWUgY2FuIG9ubHkgaGF2ZSBwZW5kaW5nIGNoYW5nZXMgYXQgdGhpcyBwb2ludCB3aGVuIFNBVkUgd2FzIGNsaWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hhbmdpbmcgYSBmaWVsZC5cblx0XHRcdC8vIEluIHRoaXMgY2FzZSB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHN1Ym1pdCBiYXRjaCBzaG91bGQgbm90IGNyZWF0ZSBhIHNlcGFyYXRlIGJhdGNoIHJlcXVlc3QuXG5cdFx0XHQvLyBJdCBpcyBkb25lIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHBhdGNoLCBkcmFmdHByZXBhcmUsIGRyYWZ0YWN0aXZhdGUgZWFjaCBoYXZlIHRoZWlyIG93biBjaGFuZ2VzZXRcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikgJiYgbVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0KSB7XG5cdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgYXMgYm9vbGVhbixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRjb250ZXh0OiBhY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyB1cGRhdGUgdGVsZW1ldHJ5IGRhdGEgZm9yIGhvdyBwYWdlIHdhcyBzYXZlZCBhbmQgdGhlbiBkbyBzdG9yaW5nIG9mIHRoaXMgZGF0YSB0byBiYWNrZW5kIHRocm91Z2ggdGhlIHN0b3JlRGF0YSBmdW5jdGlvblxuXHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5zdG9yZURhdGFGb3JUZWxlbWV0cnkocmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBhY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRpZiAoIShvRXJyb3IgJiYgKG9FcnJvciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbiB9KS5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGVkaXRhYmxlID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHN0YXJ0IHBvaW50IGFjdGl2ZSBkb2N1bWVudFxuXHRcdFx0ZWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmICghc2libGluZ0luZm8gJiYgb0NvbnRleHQgIT09IG9SaWdodG1vc3RDb250ZXh0KSB7XG5cdFx0XHRcdC8vIFRyeSB0byBjb21wdXRlIHNpYmxpbmcgaW5mbyBmb3IgdGhlIHJvb3QgY29udGV4dCBpZiBpdCBmYWlscyBmb3IgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHRcdC8vIC0tPiBJbiBjYXNlIG9mIEZDTCwgaWYgd2UgdHJ5IHRvIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgYnV0IGEgY2hpbGQgZW50aXR5IGhhcyBubyBzaWJsaW5nLCB0aGUgc3dpdGNoIHdpbGwgY2xvc2UgdGhlIGNoaWxkIGNvbHVtblxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShlZGl0YWJsZSA/IEVkaXRNb2RlLkVkaXRhYmxlIDogRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpOyAvL3N3aXRjaCB0byBlZGl0IG1vZGUgb25seSBpZiBhIGRyYWZ0IGlzIGF2YWlsYWJsZVxuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLCBuZXdQYXRoOiB0YXJnZXRQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCB7IGVkaXRhYmxlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlOiR7b0Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0Y29udHJvbD86IEJ1dHRvbjtcblx0XHRcdGNhbmNlbEJ1dHRvbj86IEJ1dHRvbjtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmFja05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRsZXQgaXNOZXdEb2N1bWVudCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNhbmNlbFBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciA9PT0gdHJ1ZSxcblx0XHRcdGNhbmNlbEJ1dHRvbjogKG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKSEsXG5cdFx0XHRiZWZvcmVDYW5jZWxDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZFxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0aWYgKChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmIHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbmNlbFJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0Y2FuY2VsUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCksXG5cdFx0XHRcdHRoaXMuaXNEb2N1bWVudE1vZGlmaWVkKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHQuZm9yRWFjaCgodmlldykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHQgJiYgY29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEaXNjYXJkKHtcblx0XHRcdFx0Y29udGV4dDogdHlwZW9mIGNhbmNlbFJlc3VsdCA9PT0gXCJib29sZWFuXCIgfHwgY2FuY2VsUmVzdWx0ID09PSBudWxsID8gdW5kZWZpbmVkIDogY2FuY2VsUmVzdWx0XG5cdFx0XHR9KTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9Db250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRpc05ld0RvY3VtZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdDtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50LCBhbmQgaXQncyB0aGUgc2FtZSBhcyB0aGUgZWRpdGVkIGNvbnRleHRcblx0XHRcdFx0XHQvLyBTbywgd2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gYXMgaXQgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgd2hlbiBjYWxsaW5nIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gYWxsIHZpZXcncyBjb250ZXh0c1xuXHRcdFx0XHRcdC8vIGVhcmxpZXIgaW4gdGhpcyBtZXRob2Rcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0Ly9zaG93IERyYWZ0IGRpc2NhcmRlZCBtZXNzYWdlIHRvYXN0IG9ubHkgZm9yIGRyYWZ0IGVuYWJsZWQgYXBwc1xuXHRcdFx0XHR0aGlzLnNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJyaW5ncyB1cCBhIG1lc3NhZ2UgdG9hc3Qgd2hlbiBhIGRyYWZ0IGlzIGRpc2NhcmRlZC5cblx0ICpcblx0ICogQHBhcmFtIGlzTmV3RG9jdW1lbnQgVGhpcyBpcyBhIEJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgbmV3IG9yIGFscmVhZHkgZXhpc3RzLlxuXHQgKi9cblx0c2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudD86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGlmIChpc05ld0RvY3VtZW50ID09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gaW4gc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2Ugd2hlbiBubyBjb250ZXh0IGlzIHBhc3NlZC5cblx0ICovXG5cdHNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCgpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdHByaXZhdGUgaXNEcmFmdFJvb3QoY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5U2V0KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM/OiB7IGVudGl0eVNldE5hbWU6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgYkZpbmRBY3RpdmVDb250ZXh0czogZmFsc2UsIGJlZm9yZURlbGV0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUgfTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRMaXN0QmluZGluZyA9IGNvbnRleHRCaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHRcdFx0PyBjb250ZXh0QmluZGluZ1xuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUocGFyZW50TGlzdEJpbmRpbmcsIHBhcmVudExpc3RCaW5kaW5nPy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdG9BcHBDb21wb25lbnQ/LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhbb0NvbnRleHRdKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBbb0NvbnRleHRdIH0pO1xuXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluaykge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcCBoYXMgYmVlbiBsYXVuY2hlZCB3aXRoIHNlbWFudGljIGtleXMsIGRlbGV0aW5nIHRoZSBvYmplY3Qgd2UndmUgbGFuZGVkIG9uIHNoYWxsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEVsc2UgbmF2aWdhdGUgYmFjayBmcm9tIHRoZSBwYWdlLiBJbiBGQ0wsIHRoaXMgaXMgZG9uZSB3aGVuIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgaXMgZGVzdHJveWVkIChjYWxsYmFjaylcblx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBhcHBseURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdFx0Ly93ZSBuZWVkIHRvIHJlcXVlc3QgZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQgdGhlbiBicmluZyB0aGUgZGlhbG9nIGhlcmVcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmNoZWNrSWZSZWNvbW1lbmRhdGlvbnNFeGlzdCgpKSB7XG5cdFx0XHRcdGNvbnN0IGlzQ29udGludWUgPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGZhbHNlKTtcblx0XHRcdFx0aWYgKGlzQ29udGludWUgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbSBpbiBwYXJhbWV0ZXJWYWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRyb2xJZCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBvbmNlIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQsIHByb3ZpZGluZyB0aGUgcmVzcG9uc2Vcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IHt9XG5cdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0ZlJlc29sdmVyOiBGdW5jdGlvbjtcblx0XHRcdFx0XHRmUmVqZWN0b3I6IEZ1bmN0aW9uO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cblx0XHQvLyBEdWUgdG8gYSBtaXN0YWtlIHRoZSBpbnZva2VBY3Rpb24gaW4gdGhlIGV4dGVuc2lvbkFQSSBoYWQgYSBkaWZmZXJlbnQgQVBJIHRoYW4gdGhpcyBvbmUuXG5cdFx0Ly8gVGhlIG9uZSBmcm9tIHRoZSBleHRlbnNpb25BUEkgZG9lc24ndCBleGlzdCBhbnltb3JlIGFzIHdlIGV4cG9zZSB0aGUgZnVsbCBlZGl0IGZsb3cgbm93IGJ1dFxuXHRcdC8vIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBvbGQgc2lnbmF0dXJlXG5cdFx0aWYgKFxuXHRcdFx0KChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0EgJiYgKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtSW5QYXJhbWV0ZXJzKSB8fFxuXHRcdFx0bUV4dHJhUGFyYW1zICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQgPSBtSW5QYXJhbWV0ZXJzIGFzIE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZDtcblx0XHRcdG1JblBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5jb250ZXh0cyA9IGNvbnRleHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBtUGFyYW1ldGVyczoge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRiR2V0Qm91bmRDb250ZXh0PzogYm9vbGVhbjtcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRwYXJlbnRDb250cm9sOiBGRVZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0Yk9iamVjdFBhZ2U/OiBib29sZWFuO1xuXHRcdFx0YklzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0Z3JvdXBJZD86IHN0cmluZztcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0aXNCb3VuZD86IGJvb2xlYW47XG5cdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9IHx8IHsgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9O1xuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgdGhlIHJlZmVyZW5jZWQgYWN0aW9uIGlzIGJvdW5kIG9yIHVuYm91bmRcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0Ly8gVGhlIEVudGl0eUNvbnRhaW5lciBtYXkgTk9UIGJlIG1pc3NpbmcsIHNvIGl0IHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSB1bmRlZmluZWQsIGJ1dCBzaW5jZSBpbiBvdXIgY29udmVydGVkIE1ldGFkYXRhXG5cdFx0Ly8gaXQgY2FuIGJlIHVuZGVmaW5lZCwgSSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBoZXJlIG9mIGFkZGluZyBcIlwiIHNpbmNlIGluZGV4T2YgZG9lcyBub3QgYWNjZXB0IHNvbWV0aGluZyB0aGF0J3Ncblx0XHQvLyB1bmRlZmluZWQuXG5cdFx0aWYgKHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiXCIgKyBjb252ZXJ0ZWRNZXRhZGF0YS5lbnRpdHlDb250YWluZXIubmFtZSkpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lID0gbVBhcmFtZXRlcnMubW9kZWxcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhQ29udGV4dCgobVBhcmFtZXRlcnMuY29udGV4dHMgYXMgQ29udGV4dCkuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiKFwiKSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uICYmIG9Db250cm9sKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpICYmIG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gKFxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmJpbmRMaXN0KG9Db250cm9sLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSkgYXMgT0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCkuYmluZExpc3Qoc0JpbmRpbmdQYXRoKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgoXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCxcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCkge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyA9IHRoaXMuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuZ2V0SWQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBvVmlldy5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGxldCBvUmVzcG9uc2UgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uKFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cdFx0XHRsZXQgbGlzdFJlZnJlc2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSAmJiBtUGFyYW1ldGVycy5pc0JvdW5kID09PSB0cnVlKSB7XG5cdFx0XHRcdGxpc3RSZWZyZXNoZWQgPSBhd2FpdCB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0XHRcdFx0dGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdGxldCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRpZiAob1Jlc3BvbnNlKSB7XG5cdFx0XHRcdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKVxuXHRcdFx0XHRcdFx0PyBPYmplY3Qua2V5cygob1Jlc3BvbnNlWzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KS52YWx1ZT8uZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdFx0XHQ6IE9iamVjdC5rZXlzKG9SZXNwb25zZS5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMsIHNBY3Rpb25OYW1lLCBsaXN0UmVmcmVzaGVkLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkgJiYgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgIT09IFwiTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlKSB7XG5cdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodkNvbnRleHQpICYmIHZDb250ZXh0Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHZDb250ZXh0ID0gKHZDb250ZXh0WzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dCA9IHZDb250ZXh0O1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBDb250ZXh0W10sIGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXSk6IENvbnRleHRbXSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChhcHBsaWNhYmxlQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYXBwbGljYWJsZUNvbnRleHRzLmluY2x1ZGVzKGVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cylbMF1cblx0XHRcdFx0XHRcdDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRNZXRhUGF0aCA9IG9BY3Rpb25Db250ZXh0ICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRcdFx0XHRcdGlmIChzQ29udGV4dE1ldGFQYXRoICE9IHVuZGVmaW5lZCAmJiBzQ29udGV4dE1ldGFQYXRoID09PSBzQWN0aW9uQ29udGV4dE1ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQ/LmdldFBhdGgoKSAhPT0gY29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBhY3Rpb24gcmV0dXJucyBhIGRyYWZ0IGNvbnRleHQsIHdlIGFscmVhZHkgdGFrZSBjYXJlIGR1cmluZyBuYXZpZ2F0aW9uIHRvIGVpdGhlciBjcmVhdGUgYSBuZXdcblx0XHRcdFx0XHRcdFx0Ly8gKGZ1bGwgc2NyZWVuKSBvciB0byB1c2UgdGhlIGxpc3QgYmluZGluZyBjb250ZXh0IGFmdGVyIHJlZnJlc2ggKGFuZCBub3QgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0KS5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGRyYWZ0IGlzIGRpc2NhcmRlZCBvciBhY3RpdmF0ZWQsIGhhdmluZyB0aGUgY29udGV4dCBzdGlsbCBhcyBkZXBlbmRlbnQgY29udGV4dCBjYXVzZSBpc3N1ZXNcblx0XHRcdFx0XHRcdFx0Ly8gKGUuZy4gaWYgYSBzaWRlIGVmZmVjdCBpcyB0cmlnZ2VyZWQpLiBUaGVyZWZvcmUsIHdlIGRlc3Ryb3kgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0IGhlcmUsXG5cdFx0XHRcdFx0XHRcdC8vIGFuZCB0byBiZSBjb21wYXRpYmxlIHdlIHJldHVybiBhIG5ldyBjb250ZXh0IHdpdGggdGhlIHNhbWUgcGF0aC5cblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJlxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcmV0dXJuQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0KG9SZXNwb25zZVswXSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0PikudmFsdWUgPSByZXR1cm5Db250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzcG9uc2UgPSByZXR1cm5Db250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0LmdldEJpbmRpbmcoKS5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oc0FjdGlvbk5hbWUpO1xuXHRcdFx0cmV0dXJuIG9SZXNwb25zZTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGVyclByb21pc2UgPSBlcnIgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW47IHJlamVjdGVkSXRlbXM/OiB7IGNhbmNlbGVkOiBib29sZWFuIH1bXSB9O1xuXHRcdFx0Ly8gRklYTUU6IGluIG1vc3Qgc2l0dWF0aW9ucyB0aGVyZSBpcyBubyBoYW5kbGVyIGZvciB0aGUgcmVqZWN0ZWQgcHJvbWlzZXMgcmV0dXJuZWRxXG5cdFx0XHRpZiAoZXJyID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdC8vIFRoaXMgbGVhZHMgdG8gY29uc29sZSBlcnJvci4gQWN0dWFsbHkgdGhlIGVycm9yIGlzIGFscmVhZHkgaGFuZGxlZCAoY3VycmVudGx5IGRpcmVjdGx5IGluIHByZXNzIGhhbmRsZXIgb2YgZW5kIGJ1dHRvbiBpbiBkaWFsb2cpLCBzbyBpdCBzaG91bGQgbm90IGJlIGZvcndhcmRlZFxuXHRcdFx0XHQvLyB1cCB0byBoZXJlLiBIb3dldmVyLCB3aGVuIGRpYWxvZyBoYW5kbGluZyBhbmQgYmFja2VuZCBleGVjdXRpb24gYXJlIHNlcGFyYXRlZCwgaW5mb3JtYXRpb24gd2hldGhlciBkaWFsb2cgd2FzIGNhbmNlbGxlZCwgb3IgYmFja2VuZCBleGVjdXRpb24gaGFzIGZhaWxlZCBuZWVkc1xuXHRcdFx0XHQvLyB0byBiZSB0cmFuc3BvcnRlZCB0byB0aGUgcGxhY2UgcmVzcG9uc2libGUgZm9yIGNvbm5lY3RpbmcgdGhlc2UgdHdvIHRoaW5ncy5cblx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb25lIGRpYWxvZyBoYW5kbGluZyBhbmQgYmFja2VuZCBleGVjdXRpb24gYXJlIHNlcGFyYXRlZFxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJEaWFsb2cgY2FuY2VsbGVkXCIpO1xuXHRcdFx0fSBlbHNlIGlmICghKGVyciAmJiAoZXJyUHJvbWlzZS5jYW5jZWxlZCB8fCAoZXJyUHJvbWlzZS5yZWplY3RlZEl0ZW1zICYmIGVyclByb21pc2UucmVqZWN0ZWRJdGVtc1swXS5jYW5jZWxlZCkpKSkge1xuXHRcdFx0XHQvLyBUT0RPOiBhbmFseXplLCB3aGV0aGVyIHRoaXMgaXMgb2YgdGhlIHNhbWUgY2F0ZWdvcnkgYXMgYWJvdmVcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246JHtlcnJ9YCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBUT0RPOiBBbnkgdW5leHBlY3RlZCBlcnJvcnMgcHJvYmFibHkgc2hvdWxkIG5vdCBiZSBpZ25vcmVkIVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGFmdGVyIHRoZSBhY3Rpb24gZXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gX2FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oX2FjdGlvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNlY3VyZWRFeGVjdXRpb24oXG5cdFx0Zm5GdW5jdGlvbjogRnVuY3Rpb24sXG5cdFx0bVBhcmFtZXRlcnM/OiB7XG5cdFx0XHRidXN5Pzoge1xuXHRcdFx0XHRzZXQ/OiBib29sZWFuO1xuXHRcdFx0XHRjaGVjaz86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0dXBkYXRlc0RvY3VtZW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJCdXN5U2V0ID0gbVBhcmFtZXRlcnM/LmJ1c3k/LnNldCA/PyB0cnVlLFxuXHRcdFx0YkJ1c3lDaGVjayA9IG1QYXJhbWV0ZXJzPy5idXN5Py5jaGVjayA/PyB0cnVlLFxuXHRcdFx0YlVwZGF0ZXNEb2N1bWVudCA9IG1QYXJhbWV0ZXJzPy51cGRhdGVzRG9jdW1lbnQgPz8gZmFsc2UsXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0YklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQgYXMgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHRpZiAoYkJ1c3lDaGVjayAmJiBCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQXBwbGljYXRpb24gYWxyZWFkeSBidXN5IHRoZXJlZm9yZSBleGVjdXRpb24gcmVqZWN0ZWRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgaGF2ZSB0byBzZXQgYnVzeSBhbmQgZHJhZnQgaW5kaWNhdG9yIGltbWVkaWF0ZWx5IGFsc28gdGhlIGZ1bmN0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIGxhdGVyIGluIHF1ZXVlXG5cdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdH1cblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGZuRnVuY3Rpb24gYXMgKCkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQpOiB2b2lkIHtcblx0XHQvLyBJbiBjb2xsYWJvcmF0aXZlIGRyYWZ0LCBkaXNhYmxlIEVUYWcgY2hlY2sgZm9yIFBBVENIIHJlcXVlc3RzXG5cdFx0Y29uc3QgaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCA9IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKTtcblx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKHRydWUpO1xuXHRcdH1cblx0XHRpZiAoISh0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdGNvbnN0IHNvdXJjZUJpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nOyAvLyBGSVhNRTogVUk1IHR5cGUgc2F5cyB0aGlzIHNob3VsZCBiZSBhbiBPRGF0YUNvbnRleHRCaW5kaW5nXG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4pID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGVTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlQ3JlYXRlU2VudChldmVudDogVUk1RXZlbnQ8eyBjb250ZXh0OiBDb250ZXh0IH0+KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSBbbmV3VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICovXG5cdGFzeW5jIHN5bmNUYXNrPFQ+KG5ld1Rhc2s/OiAoKCkgPT4gVCkgfCBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG5cdFx0aWYgKG5ld1Rhc2spIHtcblx0XHRcdGlmICh0eXBlb2YgbmV3VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3MudGhlbihuZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3Ncblx0XHRcdFx0XHQudGhlbihhc3luYyAoKSA9PiBuZXdUYXNrKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2tzIGFzIFByb21pc2U8VD47XG5cdH1cblxuXHQvKipcblx0ICogRGVjaWRlcyBpZiBhIGRvY3VtZW50IGlzIHRvIGJlIHNob3duIGluIGRpc3BsYXkgb3IgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0YXN5bmMgY29tcHV0ZUVkaXRNb2RlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBpc0FjdGl2ZUVudGl0eSA9IGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRpZiAoaXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQgc2V0IGl0IGluIGVkaXQgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdGNvbnN0IGhhc0FjdGl2ZUVudGl0eSA9IGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKHVuZGVmaW5lZCwgIWhhc0FjdGl2ZUVudGl0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYWN0aXZlIGRvY3VtZW50LCBzdGF5IG9uIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCksIGNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIEludGVybmFsIG1ldGhvZCB0byBkZWxldGUgYSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGNvbnRleHQocykgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciBkZWxldGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRpdGxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5sb2NrZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmVcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihcblx0XHRjb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgeyBwYXRoOiBzdHJpbmcgfTtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHM/OiBudW1iZXI7XG5cdFx0XHR1blNhdmVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRsb2NrZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/OiBEcmFmdFNpYmxpbmdQYWlyW107XG5cdFx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgc2V0dGluZyBhbmQgcmVtb3Zpbmcgb2YgY29udGV4dHMgc2hvdWxkbid0IGJlIGluIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgYXQgYWxsXG5cdFx0Ly8gZm9yIHRoZSB0aW1lIGJlaW5nIEkga2VwdCBpdCBhbmQgcHJvdmlkZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB0byBub3QgYnJlYWsgc29tZXRoaW5nXG5cdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IHBhcmFtZXRlcnMuY29udHJvbElkXG5cdFx0XHQ/IChFbGVtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtZXRlcnMuY29udHJvbElkKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IHVuZGVmaW5lZClcblx0XHRcdDogbnVsbDtcblxuXHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5kZWxldGVEb2N1bWVudChjb250ZXh0cywgcGFyYW1ldGVycywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSwgcmVzb3VyY2VNb2RlbCwgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZU1vZGVsKCk6IFJlc291cmNlTW9kZWwge1xuXHRcdHJldHVybiBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTogdHlwZW9mIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0XHRyZXR1cm4gVHJhbnNhY3Rpb25IZWxwZXI7XG5cdH1cblxuXHRwcml2YXRlIGdldE1lc3NhZ2VIYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyIHtcblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlLCBiQ3JlYXRpb25Nb2RlLCB1aU1vZGVsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgdWlNb2RlbENvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZCBvciBub3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBpc0RvY3VtZW50TW9kaWZpZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWQobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQsIG1vZGlmaWVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgY3JlYXRpbmcgYSBzdWItb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyBvbiB3aGljaCB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogdm9pZCB7XG5cdFx0Ly8gU2V0IHRoZSBtb2RpZmllZCBmbGFnIG9ubHkgb24gcmVsYXRpdmUgbGlzdEJpbmRpbmdzLCBpLmUuIHdoZW4gY3JlYXRpbmcgYSBzdWItb2JqZWN0XG5cdFx0Ly8gSWYgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSwgdGhlbiBpdCdzIGEgY3JlYXRpb24gZnJvbSB0aGUgTGlzdFJlcG9ydCwgYW5kIGJ5IGRlZmF1bHQgYSBuZXdseSBjcmVhdGVkIHJvb3Qgb2JqZWN0IGlzbid0IGNvbnNpZGVyZWQgYXMgbW9kaWZpZWRcblx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKiBAcGFyYW0gYmluZGluZyBPRGF0YSBsaXN0IGJpbmRpbmcgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZUV2ZW50cyhiaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGJpbmRpbmcpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKCkgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlIChkaXNwbGF5ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBkcmFmdFN0YXR1cyBUaGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2Vcblx0ICovXG5cdHNldERyYWZ0U3RhdHVzKGRyYWZ0U3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIGRyYWZ0U3RhdHVzLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb2dyYW1taW5nIG1vZGVsIGZyb20gYSBiaW5kaW5nIG9yIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYmluZGluZyBvciBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogQ29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZWRpdE1vZGUgVGhlIGVkaXQgbW9kZVxuXHQgKiBAcGFyYW0gaXNDcmVhdGlvbiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbmV3bHkgY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRFZGl0TW9kZShlZGl0TW9kZT86IHN0cmluZywgaXNDcmVhdGlvbj86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoZWRpdE1vZGUpIHtcblx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIiwgZWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYW4gYWN0aW9uIGNvcnJlc3BvbmRzIHRvIGEgY3JlYXRlIGFjdGlvbiBmb3IgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIGEgY3JlYXRlIGFjdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBpc05ld0FjdGlvbkZvclN0aWNreShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCBzdGlja3lTZXNzaW9uID0gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uTmV3QWN0aW9uID09PSBhY3Rpb25OYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zICYmIHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zLmluY2x1ZGVzKGFjdGlvbk5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8vIFRPRE8gTW92ZSBhbGwgc3RpY2t5LXJlbGF0ZWQgYmVsb3cgdG8gYSBzdGlja3kgc2Vzc2lvbiBtYW5hZ2VyIGNsYXNzXG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9uKGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBoYXNoVHJhY2tlciA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXG5cdFx0XHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdFx0XHQvLyB0aGUgbmV3IGhhc2gsIGFuZCB0aGUgZ3VhcmQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnkgb2YgdGhlIHJvdXRlciBwcm94eVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQoY29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbih0aGlzLm9uQmFja05hdmlnYXRpb25JblNlc3Npb24uYmluZCh0aGlzLCBjb250ZXh0KSk7XG5cblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHRoaXMuZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbCwgaGFzaFRyYWNrZXIpO1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzZXNzaW9uIHRpbWVvdXRcblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24gPSB0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKTtcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cblx0XHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9mZigpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5kaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKTtcblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0XHRpZiAobW9kZWwgJiYgdGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKSB7XG5cdFx0XHRcdG1vZGVsLmRldGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbikge1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxSb3V0aW5nKCk6IEludGVybmFsUm91dGluZyB7XG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpOiBSb290Vmlld0Jhc2VDb250cm9sbGVyIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEByZXR1cm5zIFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cdHByaXZhdGUgY3JlYXRlQWN0aW9uUHJvbWlzZShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRyb2xJZDogc3RyaW5nKTogeyBmUmVzb2x2ZXI6IEZ1bmN0aW9uOyBmUmVqZWN0b3I6IEZ1bmN0aW9uIH0ge1xuXHRcdGxldCByZXNvbHZlRnVuY3Rpb246IEZ1bmN0aW9uLCByZWplY3RGdW5jdGlvbjogRnVuY3Rpb247XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKG9SZXNwb25zZTogdW5rbm93bikgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdHsgY29udHJvbElkIH0sXG5cdFx0XHRcdHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRcdFx0XHRhY3Rpb25OYW1lLFxuXHRcdFx0XHRcdG9SZXNwb25zZSBhcyB1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U/OiAodW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSkgfCBudWxsXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggPj0gMSkge1xuXHRcdFx0XHRyZXNwb25zZSA9IChyZXNwb25zZVswXSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPikudmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIXJlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsRGF0YSA9IChjdXJyZW50Vmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldERhdGEoKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBhY3Rpb25SZXR1cm5UeXBlID0gbWV0YU1vZGVsQWN0aW9uPy5bMF0uJFJldHVyblR5cGUgPyBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZS4kVHlwZSA6IG51bGw7XG5cdFx0Y29uc3Qga2V5cyA9XG5cdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdD8gKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSkuJEtleVxuXHRcdFx0XHQ6IFtdO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9EYXRhOiByZXNwb25zZS5nZXRPYmplY3QoKSxcblx0XHRcdGtleXNcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIHRoaXMuYWN0aW9uUHJvbWlzZTtcblx0fVxuXG5cdGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk6IHZvaWQge1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIHNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGlzU2F2ZTogYm9vbGVhbik6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbj4ge1xuXHRcdGlmICghdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKSB7XG5cdFx0XHR0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cgPSBuZXcgQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2soe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRDb250ZXh0cygpO1xuXHRcdFx0aWYgKCFhbGxSb3dDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGZvY3VzUm93ID0gYWN0aXZlUm93SW5kZXgsXG5cdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdGZvciAoY29uc3Qgc2luZ2xlQ29udGV4dCBvZiBhbGxSb3dDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2luZ2xlQ29udGV4dC5pc0luYWN0aXZlKCkgJiYgaW5kZXggPCBmb2N1c1Jvdykge1xuXHRcdFx0XHRcdGZvY3VzUm93ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHRcdGlmIChmb2N1c1JvdyA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChmb2N1c1Jvdyk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1Jvdyhmb2N1c1JvdywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXModGFibGU6IFRhYmxlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoXG5cdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlICYmXG5cdFx0XHQhdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIpXG5cdFx0KSB7XG5cdFx0XHQvLyBXaXRoIHRoZSBwYXJhbWV0ZXIsIHdlIGRvbid0IGhhdmUgZW1wdHkgcm93cyBpbiBFZGl0IG1vZGUsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZW0gYmVmb3JlIHNldHRpbmcgdGhlIGZvY3VzIG9uIHRoZW1cblx0XHRcdGF3YWl0IHRhYmxlQVBJLnNldFVwRW1wdHlSb3dzKHRhYmxlLCB0cnVlKTtcblx0XHR9XG5cdFx0dGhpcy5fc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KHRhYmxlKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoXG5cdFx0YWN0aW9uOiBBY3Rpdml0eSxcblx0XHRyZWxhdGVkQ29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHRyaWdnZXJlZEFjdGlvbk5hbWU/OiBzdHJpbmcsXG5cdFx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbixcblx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW11cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7IGFjdGlvbiwgY29udGVudCwgdHJpZ2dlcmVkQWN0aW9uTmFtZSwgcmVmcmVzaExpc3RCaW5kaW5nLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIH0pO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSk6IHZvaWQge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuYmFzZS5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBTdWJtaXQgYW55IGxlZnRvdmVyIGNoYW5nZXMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWRcblx0XHRcdC8vIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRcdGF3YWl0IG9Nb2RlbC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgY2hhbmdlc1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGFncmVlZCB3aXRoIHRoZSB2NCBtb2RlbCB0ZWFtIHRvIHVzZSBhbiBpbnRlcm5hbCBtZXRob2QuIFdlJ2xsIHJlcGxhY2UgaXQgb25jZVxuXHRcdFx0Ly8gYSBwdWJsaWMgb3IgcmVzdHJpY3RlZCBtZXRob2Qgd2FzIHByb3ZpZGVkXG5cdFx0XHRhd2FpdCAob01vZGVsLm9SZXF1ZXN0b3IgYXMgdW5rbm93biBhcyB7IHdhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHM6IEZ1bmN0aW9uIH0pLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgcm91dGVyUHJveHkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAocm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0c3RpY2t5LnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0YXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhQcm9ncmFtbWluZ01vZGVsLlN0aWNreSk7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHZpZXcsXG5cdFx0XHRcdFByb2dyYW1taW5nTW9kZWwuU3RpY2t5XG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IHsgZWRpdGFibGU6IGJvb2xlYW47IHJlY3JlYXRlQ29udGV4dDogYm9vbGVhbjsgZm9yY2VGb2N1cz86IGJvb2xlYW4gfVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5lZGl0YWJsZSxcblx0XHRcdHBlcnNpc3RPUFNjcm9sbDogdHJ1ZSxcblx0XHRcdHJlY3JlYXRlQ29udGV4dDogbmF2aWdhdGlvblBhcmFtZXRlcnMucmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0cmVhc29uOiBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBmYWxzZSxcblx0XHRcdGZvcmNlRm9jdXM6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmZvcmNlRm9jdXMgPz8gZmFsc2UsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBGRVZpZXcsIHBhcmFtczogeyBjb250cm9sSWQ/OiBzdHJpbmc7IGlzTmF2aWdhYmxlPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBlcnJvcnMsIGFuZCByZWplY3RzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9yc1xuXHQgKi9cblxuXHRhc3luYyBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkIHwgdm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uub0RhdGFcblx0ICogQHBhcmFtIG9SZXNwb25zZS5rZXlzXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYm91bmQgY29udGV4dCBvbiB3aGljaCB0aGUgYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRhc3luYyBfcmVmcmVzaExpc3RJZlJlcXVpcmVkKFxuXHRcdG9SZXNwb25zZT86IHsgb0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5cz86IHN0cmluZ1tdIHwgbnVsbCB9LFxuXHRcdG9Db250ZXh0PzogQ29udGV4dFxuXHQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSB8fCAhb1Jlc3BvbnNlLmtleXMpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Ly8gcmVmcmVzaCBvbmx5IGxpc3RzXG5cdFx0aWYgKG9CaW5kaW5nICYmIG9CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRjb25zdCBhS2V5cyA9IG9SZXNwb25zZS5rZXlzO1xuXHRcdFx0Y29uc3Qgb0N1cnJlbnREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRsZXQgYlJldHVybmVkQ29udGV4dElzU2FtZSA9IHRydWU7XG5cdFx0XHQvLyBlbnN1cmUgY29udGV4dCBpcyBpbiB0aGUgcmVzcG9uc2Vcblx0XHRcdGlmIChPYmplY3Qua2V5cyhvQ29udGV4dERhdGEpLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBjaGVjayBpZiBjb250ZXh0IGluIHJlc3BvbnNlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBib3VuZCBjb250ZXh0XG5cdFx0XHRcdGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXJyZW50RGF0YVtzS2V5XSA9PT0gb0NvbnRleHREYXRhW3NLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0JpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogb0JpbmRpbmcuZ2V0UGF0aCgpIH1dLCBvQmluZGluZy5nZXRDb250ZXh0KCkpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSghYlJldHVybmVkQ29udGV4dElzU2FtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZTogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxuXG5cdGFzeW5jIF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChhc3luYyBmdW5jdGlvbiAob0tleTogeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pOiB2b2lkIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0bmV3RG9jdW1lbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWRcblx0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8oY29udGV4dCwgbmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9IG5ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQsIHJvb3RDb250ZXh0SW5mbywgZ3JvdXBJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vdCBpbiBkcmFmdCBtb2RlLCB3ZSBqdXN0IHJlY3JlYXRlIGEgY29udGV4dCBmcm9tIHRoZSBwYXRoIG9mIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0Ly8gTm8gcGF0aCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKSxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdF9pc0ZjbEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpO1xuXHR9XG5cblx0YXN5bmMgY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRsZXQgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHRcdGlmICh0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmNoZWNrSWZSZWNvbW1lbmRhdGlvbnNFeGlzdCgpKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW47XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUVBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0lBQzFDRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBZ0I7SUFDN0NDLFNBQVMsR0FBR0YsU0FBUyxDQUFDRSxTQUFT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
|
|
2893
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaG9va2FibGUiLCJzeW5jVGFza3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZVNpZGVFZmZlY3RzIiwibGlzdEJpbmRpbmciLCJjcmVhdGlvblByb21pc2UiLCJ2aWV3QmluZGluZ0NvbnRleHQiLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuZXdDb250ZXh0IiwiY3JlYXRlZCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldFBhdGgiLCJlcnJvciIsIkxvZyIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsInZhbGlkYXRpb25NZXNzYWdlcyIsInRhYmxlIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiZ2V0Q3JlYXRpb25Sb3ciLCJkYXRhIiwiY3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsImN1c3RvbU1lc3NhZ2VzIiwiZmllbGRDb250cm9sIiwiZmluYWxUYXJnZXQiLCJvbGRNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0Q29kZSIsInJlbW92ZU1lc3NhZ2VzIiwiZm9yRWFjaCIsInZhbGlkYXRpb25NZXNzYWdlIiwibWVzc2FnZVRhcmdldCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImdldFRhcmdldHMiLCJzb21lIiwidGFyZ2V0IiwibGVuZ3RoIiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJnZXRNb2RlbCIsInR5cGUiLCJFcnJvciIsImNvZGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsImNyZWF0ZURhdGEiLCJOZXdQYWdlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJpc1JlbGF0aXZlIiwiZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJEcmFmdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsInRhcmdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwicGFyYW1ldGVycyIsIkRlZmVycmVkIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJBc3luYyIsImdldEludGVyZmFjZSIsImJhc2UiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsInRyYW5zYWN0aW9uSGVscGVyIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtb2RlbCIsIm9WaWV3RGF0YSIsImdldFZpZXdEYXRhIiwic1Byb2dyYW1taW5nTW9kZWwiLCJvUm9vdENvbnRleHQiLCJvVmlldyIsImdyb3VwSWQiLCJ2aWV3TGV2ZWwiLCJTdGlja3kiLCJjcmVhdGVSb290Q29udGV4dCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsInJpZ2h0bW9zdENvbnRleHQiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIm9OZXdEb2N1bWVudENvbnRleHRQcm9taXNlIiwicm9vdENvbnRleHRJbmZvIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwic2libGluZ0luZm9Qcm9taXNlIiwiY29tcHV0ZVNpYmxpbmdJbmZvIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzdWJtaXRCYXRjaCIsInNpYmxpbmdJbmZvIiwib05ld0RvY3VtZW50Q29udGV4dCIsImNvbnRleHRUb05hdmlnYXRlIiwidW5kZWZpbmVkIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNldERvY3VtZW50TW9kaWZpZWQiLCJvbkFmdGVyRWRpdCIsIl9oYW5kbGVOZXdDb250ZXh0IiwiZWRpdGFibGUiLCJyZWNyZWF0ZUNvbnRleHQiLCJmb3JjZUZvY3VzIiwic3RpY2t5Q29udGV4dCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJoYW5kbGVTdGlja3lPbiIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaGFyZU9iamVjdCIsIm9FcnJvciIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJCdXN5TG9ja2VyIiwibG9jayIsInNlbGVjdGVkQ29udGV4dHMiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwicmVzdWx0IiwiaXNBIiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsImluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSIsImlzSW5hY3RpdmUiLCJ0YWJsZURlZmluaXRpb24iLCJjb250cm9sIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwicmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMiLCJzZXRVcEVtcHR5Um93cyIsIl9zZW5kQWN0aXZpdHkiLCJBY3Rpdml0eSIsIkRlbGV0ZSIsInVubG9jayIsInVwZGF0ZURvY3VtZW50IiwidXBkYXRlZENvbnRleHQiLCJ1cGRhdGVQcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImlzRHJhZnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJzeW5jVGFzayIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiZW50aXR5U2V0TmFtZSIsImdldE9iamVjdCIsInNlbWFudGljS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwiY3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJjdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uIiwiY3JlYXRlRG9jdW1lbnQiLCJ2TGlzdEJpbmRpbmciLCJtSW5QYXJhbWV0ZXJzIiwib0RhdGFMaXN0QmluZGluZyIsIkV4dGVybmFsIiwib0RhdGFNb2RlbCIsImJpbmRMaXN0IiwiU3luYyIsImNyZWF0ZUF0RW5kIiwicmVzb2x2ZWRDcmVhdGlvbk1vZGUiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsInNpbmdsZURyYWZ0Rm9yQ3JlYXRlIiwiZ2V0TWFuaWZlc3QiLCJhcHAiLCJnZXRSb290QmluZGluZyIsIm5ld0JpbmRpbmciLCJnZXRDb250ZXh0IiwiU29ydGVyIiwiRmlsdGVyIiwiZmlsdGVycyIsInBhdGgiLCJvcGVyYXRvciIsInZhbHVlMSIsImFuZCIsInJlcXVlc3RDb250ZXh0cyIsInRoZW4iLCJkZXN0cm95IiwiX2hhbmRsZUNyZWF0aW9uTW9kZSIsImNyZWF0ZUV4dGVybmFsRG9jdW1lbnQiLCJvdXRib3VuZCIsImNyZWF0ZURlZmVycmVkRG9jdW1lbnQiLCJDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93IiwiY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQiLCJza2lwU2lkZUVmZmVjdHMiLCJJbmxpbmUiLCJjcmVhdGVJbmxpbmVEb2N1bWVudCIsInRhYmxlSWQiLCJjcmVhdGVTeW5jQXN5bmNEb2N1bWVudCIsImJGcm9tRGVmZXJyZWQiLCJjcmVhdGVBY3Rpb24iLCJwb3N0RG9jdW1lbnRDcmVhdGlvbiIsInByZXJlcXVpc2l0ZSIsInBhcmFtcyIsIm5ld0RvY3VtZW50Q29udGV4dCIsIm9uQWZ0ZXJDcmVhdGUiLCJtZXRhQ29udGV4dCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiZ2V0SW50ZXJuYWxNb2RlbCIsInNldFByb3BlcnR5IiwiZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJDcmVhdGUiLCJpc0RyYWZ0Um9vdCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiYXBwQ29tcG9uZW50IiwibmF2aWdhdGlvbiIsImNyZWF0aW9uUm93Q29udGV4dCIsImRvY3VtZW50VmFsaWRhdGlvbiIsImdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uIiwiZW50aXR5VHlwZSIsImNyZWF0aW9uUm93UGF5bG9hZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJjcmVhdGlvbiIsInNjcm9sbFRvSW5kZXgiLCJnZXRMZW5ndGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJPYmplY3QiLCJhc3NpZ24iLCJrZXlzIiwicHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJmaW5kSW5kZXgiLCJwcm9wZXJ0eSIsIm5hbWUiLCJtYXAiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsImNyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJuZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJhbGwiLCJhbGxDdXJyZW50Q29udGV4dHMiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJjb250ZXh0SW5kZXgiLCJpbmRleE9mIiwiZm9jdXNSb3ciLCJwYXJlbnRJbmRleCIsImdldEludGVybmFsUm91dGluZyIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsInJvdXRpbmdMaXN0ZW5lciIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY29yZVJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJuYXZQYXJhbWV0ZXJzIiwidHJhbnNpZW50IiwibmF2aWdhdGVUb0NvbnRleHQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDcmVhdGlvbkZhaWxlZCIsIk9uQmVmb3JlQ3JlYXRlRmFpbGVkIiwiaW5jbHVkZXMiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImNyZWF0ZVBhdGgiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwidmFsaWRhdGVEb2N1bWVudCIsImNyZWF0aW9uUm93T2JqZWN0cyIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwiZGF0YUZvckNyZWF0ZSIsImlzRnJvbUNvcHlQYXN0ZSIsImNyZWF0ZUFzSW5hY3RpdmUiLCJ0YXJnZXRMaXN0QmluZGluZyIsImNvbnRleHRQYXRoIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImNyZWF0aW9uUHJvbWlzZXMiLCJwcm9wZXJ0eVZhbHVlcyIsImNyZWF0ZVBhcmFtZXRlcnMiLCJpbmFjdGl2ZSIsIiRraW5kIiwiY3JlYXRlZENvbnRleHRzIiwiYWN0aXZlQ29udGV4dHMiLCJlcnIiLCJfbVBhcmFtZXRlcnMiLCJvbkJlZm9yZVNhdmUiLCJvbkJlZm9yZURpc2NhcmQiLCJvbkFmdGVyU2F2ZSIsIm9uQWZ0ZXJEaXNjYXJkIiwic2F2ZURvY3VtZW50IiwibVBhcmFtZXRlcnMiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwibWVyZ2VQYXRjaERyYWZ0IiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwicmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuIiwiY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbiIsImlzRmNsRW5hYmxlZCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX2dldFJlc291cmNlTW9kZWwiLCJnZXRDcmVhdGlvbk1vZGUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiZGlzY29ubmVjdCIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsInN0b3JlRGF0YUZvclRlbGVtZXRyeSIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsInByZXZpb3VzU2VtYW50aWNQYXRoIiwibmV3U2VtYW50aWNQYXRoIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInRhcmdldENvbnRleHQiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJjYW5jZWxQYXJhbWV0ZXJzIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiY2FuY2VsQnV0dG9uIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInZpZXciLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImRlbGV0ZURvY3VtZW50Iiwib0FwcENvbXBvbmVudCIsImdldEluZGV4Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwicGFyZW50TGlzdEJpbmRpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsIm9Mb2NrT2JqZWN0IiwiY2hlY2tJZlJlY29tbWVuZGF0aW9uc0V4aXN0IiwiaXNDb250aW51ZSIsInNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJBcnJheSIsImlzQXJyYXkiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZW50aXR5Q29udGFpbmVyIiwiaXNCb3VuZCIsIm9Db250cm9sIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpZ25vcmVFVGFnIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsIm9MaXN0QmluZGluZyIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJnZXRJZCIsImJHZXRCb3VuZENvbnRleHQiLCJfZ2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJjb252ZXJ0ZXJUeXBlIiwib1Jlc3BvbnNlIiwiY2FsbEFjdGlvbiIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMiLCJ2YWx1ZSIsIkFjdGlvbiIsImFjdGlvbiIsImZSZXNvbHZlciIsInZDb250ZXh0Iiwib01ldGFNb2RlbCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwicmV0dXJuQ29udGV4dCIsImluZm8iLCJvbkFmdGVyQWN0aW9uRXhlY3V0aW9uIiwiZlJlamVjdG9yIiwiZXJyUHJvbWlzZSIsInJlamVjdGVkSXRlbXMiLCJfYWN0aW9uTmFtZSIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsInJlamVjdCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJpbnRlcm5hbENvbnRleHQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwic291cmNlQmluZGluZyIsIm9QYXRjaFByb21pc2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVTZW50IiwiZXZlbnQiLCJuZXdUYXNrIiwiZGVidWciLCJjb21wdXRlRWRpdE1vZGUiLCJnbG9iYWxNb2RlbCIsImlzQWN0aXZlRW50aXR5IiwicmVxdWVzdE9iamVjdCIsImhhc0FjdGl2ZUVudGl0eSIsImxhc3RJbnZva2VkQWN0aW9uTmFtZSIsImlzTmV3QWN0aW9uRm9yU3RpY2t5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwiZ2V0UmVzb3VyY2VNb2RlbCIsIlRyYW5zYWN0aW9uSGVscGVyIiwibWVzc2FnZUhhbmRsZXIiLCJzZXRDcmVhdGlvbk1vZGUiLCJiQ3JlYXRpb25Nb2RlIiwidWlNb2RlbENvbnRleHQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiQ3JlYXRlTW9kZSIsIkRvY3VtZW50TW9kaWZpZWQiLCJtb2RpZmllZCIsImJpbmRpbmciLCJhdHRhY2hFdmVudCIsInN1Y2Nlc3MiLCJkcmFmdFN0YXR1cyIsInNvdXJjZSIsImVkaXRNb2RlIiwiaXNDcmVhdGlvbiIsImZvcmNlZCIsInNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiYmluZCIsImRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJpMThuTW9kZWwiLCJzZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbiIsImF0dGFjaFNlc3Npb25UaW1lb3V0Iiwic3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uIiwiZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24iLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiZ2V0SHR0cEhlYWRlcnMiLCJuYXZpZ2F0aW9uQ29udGV4dCIsInRhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwicm91dGVyUHJveHkiLCJsY2xIYXNoVHJhY2tlciIsImlzRGlydHkiLCJpc1Nlc3Npb25PbiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJ3YXJuaW5nRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsInJlc2V0Q2hhbmdlcyIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsInJlc3BvbnNlIiwiY3VycmVudFZpZXciLCJtZXRhTW9kZWxEYXRhIiwibWV0YU1vZGVsQWN0aW9uIiwiYWN0aW9uUmV0dXJuVHlwZSIsIiRSZXR1cm5UeXBlIiwiJFR5cGUiLCIkS2V5Iiwib0RhdGEiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiaXNTYXZlIiwiY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIkNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ0Jsb2NrIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInJlbGF0ZWRDb250ZXh0cyIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJzZW5kIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIm9Nb2RlbCIsIm9SZXF1ZXN0b3IiLCJ3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzIiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJoaXN0b3J5IiwiYmFjayIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGVyc2lzdE9QU2Nyb2xsIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIkVkaXRGbG93QWN0aW9uIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwic1ZpZXdJZCIsImFNZXNzYWdlcyIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJvQmluZGluZyIsImFLZXlzIiwib0N1cnJlbnREYXRhIiwiYlJldHVybmVkQ29udGV4dElzU2FtZSIsImV2ZXJ5Iiwic0tleSIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3VzdG9tTWVzc2FnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBDYW5jZWxQYXJhbWV0ZXJzLCBDcmVhdGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycywgUm9vdENvbnRleHRJbmZvLCBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0U2libGluZ1BhaXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHtcblx0Q29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2ssXG5cdFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb25cbn0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlLFxuXHRNZXNzYWdlVHlwZSA9IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2s7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgZWRpdGFibGUgY29udGV4dFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9Sb290Q29udGV4dDogQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBncm91cElkID0gXCJlZGl0R3JvdXBcIjtcblx0XHR0cnkge1xuXHRcdFx0aWYgKChvVmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0b1Jvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KHNQcm9ncmFtbWluZ01vZGVsLCBvVmlldywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSkpIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiBvUm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHJpZ2h0bW9zdENvbnRleHQgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKSA/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dFByb21pc2UgPSB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHRJbmZvID0ge1xuXHRcdFx0XHRyb290U2libGluZ1BhdGhQcm9taXNlOiBvTmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZVxuXHRcdFx0fTtcblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdC8vIHJpZ2h0bW9zdENvbnRleHQgPT09IHJvb3RDb250ZXh0ID0+IHdlJ3JlIGluIE9QLiBJZiBub3QsIHdlJ3JlIGluIG11bHRpLWNvbHVtbiBsYXlvdXQgb2YgRkNMXG5cdFx0XHRjb25zdCBjb21wdXRlU2libGluZ0luZm8gPSByaWdodG1vc3RDb250ZXh0ICE9PSBvUm9vdENvbnRleHQgfHwgKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxO1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRzaWJsaW5nSW5mb1Byb21pc2UgPSB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSAoYXdhaXQgb05ld0RvY3VtZW50Q29udGV4dFByb21pc2UpIGFzIENvbnRleHQ7XG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0aWYgKGNvbXB1dGVTaWJsaW5nSW5mbykge1xuXHRcdFx0XHRpZiAoc2libGluZ0luZm8gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0XHRcIiRhdXRvXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gdGhpcy5fZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQsIHNpYmxpbmdJbmZvKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCAhPT0gb1Jvb3RDb250ZXh0KSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJFZGl0KHsgY29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogZmFsc2UsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdGxldCBzdGlja3lDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgdXNlZCB0byBiaW5kIHRoZSBwYWdlXG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQob05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3Qob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBzaWRlIGVmZmVjdHMgcmVxdWlyZWQgYWZ0ZXIgZGVsZXRpbmcgYW4gb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0aGUgZGVsZXRlZCBvYmplY3QgYmVsb25ncyB0b1xuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiBwYXJlbnQgb2JqZWN0IG9mIHRoZSBkZWxldGVkIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSByZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCwgcGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGlmICghbGlzdEJpbmRpbmcgfHwgIXBhcmVudENvbnRleHQgfHwgQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdFNlcnZpY2UgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHBhcmVudENvbnRleHQpO1xuXG5cdFx0Y29uc3Qgc3RhdGVNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgobGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgcGFyZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdC8vIEluIGNhc2Ugb2YgYSBUcmVlVGFibGUsIHdlIG5lZWQgdG8gcmVmcmVzaCBzdGF0ZSBtZXNzYWdlcyBmb3IgdGhlIE9iamVjdFBhZ2UsIGFzIHNvbWUgb2YgdGhlc2UgbWVzc2FnZXMgbWlnaHQgYmUgYXR0YWNoZWRcblx0XHQvLyB0byBjaGlsZHJlbiBvZiBhIGRlbGV0ZWQgcm93IHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZCB5ZXQsIGFuZCB0aGVyZWZvcmUgdGhlIG1vZGVsIHdvdWxkbid0IGNsZWFuIHVwIHRoZXNlIG1lc3NhZ2VzXG5cdFx0aWYgKHN0YXRlTWVzc2FnZXNQYXRoICYmIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtzdGF0ZU1lc3NhZ2VzUGF0aF0sIHBhcmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHNUb0RlbGV0ZSBUaGUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubm9EaWFsb2dcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGFzeW5jIGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZDogc3RyaW5nO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKSA/PyBFbGVtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2wgYXMgQ29udHJvbDtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSAocGFyZW50Q29udHJvbC5nZXRCaW5kaW5nKFwiaXRlbXNcIikgfHwgKHBhcmVudENvbnRyb2wgYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHBhcmFtZXRlcnM/LnNlbGVjdGVkQ29udGV4dHM/LlswXSA/PyBjb250ZXh0c1RvRGVsZXRlWzBdKSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRsZXQgcmVzdWx0O1xuXG5cdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0cGFyZW50Q29udHJvbC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdC8vIFdlIHVzZSBhIHNpZGUtZWZmZWN0IHJlZnJlc2ggZm9yIGEgVHJlZVRhYmxlLCB0byBwcmVzZXJ2ZSBleHBhbnNpb24gc3RhdGVzXG5cdFx0XHRcdFx0cmVzdWx0ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmcsIHZpZXdCaW5kaW5nQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSB9KTtcblxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBwYXJlbnRDb250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRjb25zdCBpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUgPSBjb250ZXh0c1RvRGVsZXRlLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlLmxlbmd0aCA+IDBcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMoaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyhwYXJlbnRDb250cm9sLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgY29udGV4dHNUb0RlbGV0ZSk7XG5cblx0XHRcdHJldHVybiBhd2FpdCByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gdXBkYXRlZENvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gdXBkYXRlUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IG9iamVjdCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9yaWdpbmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGlzRHJhZnQgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodXBkYXRlZENvbnRleHQgYXMgQmluZGluZyB8IENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdXBkYXRlUHJvbWlzZTtcblx0XHRcdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICghaXNEcmFmdCB8fCAhY3VycmVudEJpbmRpbmdDb250ZXh0IHx8IGN1cnJlbnRCaW5kaW5nQ29udGV4dCAhPT0gb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdC8vIElmIGEgbmF2aWdhdGlvbiBoYXBwZW5lZCB3aGlsZSBvUHJvbWlzZSB3YXMgYmVpbmcgcmVzb2x2ZWQsIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgY2hhbmdlZFxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlJ3JlIHN0aWxsIG9uIHRoZSBzYW1lIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY3VycmVudEJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhtZXRhTW9kZWwsIGVudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRpZiAoc2VtYW50aWNLZXlzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljUGF0aCA9IGN1cnJlbnRTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChjdXJyZW50QmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdC8vIGN1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRpZiAoY3VycmVudFNlbWFudGljUGF0aCAmJiBjdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkKTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChzZWxlY3RlZENvbnRleHRzICYmIHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gT25lIHBhcmVudCBhdCBtb3N0ICEhXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgaW4gYSBUcmVlVGFibGUgd2l0aCAke3NlbGVjdGVkQ29udGV4dHMubGVuZ3RofSBwYXJlbnRzYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29udGV4dHM/Lmxlbmd0aCA9PT0gMSA/IHNlbGVjdGVkQ29udGV4dHNbMF0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOjxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgKGluIGEgdGFibGUpPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGFibGVJZCBJRCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kYXRhIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJ1c3lNb2RlIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyBUaGUgY29udGV4dHMgdGhhdCBhcmUgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlIGluaXRpYXRpbmcgdGhlIGNyZWF0aW9uLiBVc2VkIGluIGNhc2Ugb2YgYSBUcmVlVGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBwYXJlbnQgY29udGV4dCBvZiB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZSBXaGVuIGVuYWJsZWQsIGFuIGV4dHJhIHJlcXVlc3QgY2hlY2tzIGlmIGFueSBkcmFmdHMgZXhpc3QgdGhhdCB3ZXJlIG5ldmVyIHNhdmVkLiBJZiB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIHRoZSBuZXdlc3Qgb25lIGlzIG9wZW5lZC4gSWYgbm8gdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRidXN5TW9kZT86IHN0cmluZztcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGNyZWF0aW9uUm93PzogQ3JlYXRpb25Sb3c7XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRzaW5nbGVEcmFmdEZvckNyZWF0ZT86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0RhdGFMaXN0QmluZGluZyE6IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0bGV0IHBhcmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRpZiAoIW9EYXRhTW9kZWwpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IG9EYXRhTW9kZWwuYmluZExpc3Qodkxpc3RCaW5kaW5nKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5TeW5jO1xuXHRcdFx0XHRkZWxldGUgbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSBpZiAodkxpc3RCaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIG9iamVjdCBvciBwYXRoIGV4cGVjdGVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwob0RhdGFMaXN0QmluZGluZykpIHtcblx0XHRcdFx0cGFyZW50Q29udGV4dCA9IHRoaXMuZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24obUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByZXNvbHZlZENyZWF0aW9uTW9kZSA9IHRoaXMucmVzb2x2ZUNyZWF0aW9uTW9kZShtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSwgb0RhdGFMaXN0QmluZGluZywgbUluUGFyYW1ldGVycy5kYXRhKTtcblxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChcblx0XHRcdChtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlXG5cdFx0XHRcdDogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdCgpW1wic2FwLmZlXCJdPy5hcHA/LnNpbmdsZURyYWZ0Rm9yQ3JlYXRlKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9PT0gb0RhdGFMaXN0QmluZGluZy5nZXRSb290QmluZGluZygpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAhPT0gbnVsbFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgbmV3QmluZGluZyA9IG9EYXRhTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKT8uYmluZExpc3QoXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldENvbnRleHQoKSxcblx0XHRcdFx0bmV3IFNvcnRlcihcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZVwiLCB0cnVlKSxcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0ZmlsdGVyczogW1xuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJIYXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdGFuZDogdHJ1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ld0JpbmRpbmc/LnJlcXVlc3RDb250ZXh0cygwLCAxKTtcblx0XHRcdGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlTmV3Q29udGV4dChyZXN1bHRbMF0sIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSkudGhlbigoKSA9PiBuZXdCaW5kaW5nPy5kZXN0cm95KCkpO1xuXHRcdFx0fVxuXHRcdFx0bmV3QmluZGluZz8uZGVzdHJveSgpO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShyZXNvbHZlZENyZWF0aW9uTW9kZSwgdkxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLCBvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShyZXNvbHZlZENyZWF0aW9uTW9kZSwgdkxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLCBvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0KTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHR2TGlzdEJpbmRpbmc6IHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogSW50ZXJuYWxDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdG9EYXRhTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5FeHRlcm5hbDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCh2TGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMub3V0Ym91bmQpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURlZmVycmVkRG9jdW1lbnQob0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCwgcGFyYW1ldGVycy5kYXRhKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5jcmVhdGlvblJvd1xuXHRcdFx0XHRcdD8gdGhpcy5jcmVhdGVDcmVhdGVSb3dEb2N1bWVudCh7XG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uUm93OiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93LFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZFxuXHRcdFx0XHRcdCAgfSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSW5saW5lRG9jdW1lbnQoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGFibGVJZDogcGFyYW1ldGVycy50YWJsZUlkLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0YkZyb21EZWZlcnJlZDogcGFyYW1ldGVycy5iRnJvbURlZmVycmVkLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNyZWF0ZUFjdGlvbjogcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpFeGVjdXRlcyB0aGUgbWFuZGF0b3J5IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcmVyZXF1aXNpdGUgUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgY3JlYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgcG9zdERvY3VtZW50Q3JlYXRpb24ocHJlcmVxdWlzaXRlOiBQcm9taXNlPFtDb250ZXh0LCB1bmtub3duXT4sIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0gYXdhaXQgcHJlcmVxdWlzaXRlO1xuXHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IHBhcmFtc1swXTtcblx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlRWRpdE1vZGVcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgbmV3QWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGl0ZW0gaW4gYSBoaWVyYXJjaHkgZnJvbSB0aGUgTGlzdFJlcG9ydCAoc2luY2UgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSlcblx0XHRcdFx0Ly8gLS0+IHdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZWl0aGVyIHNhdmUgb3IgZGlzY2FyZCB0aGUgZHJhZnQgYmVmb3JlIGxlYXZpbmcgdGhlIE9QXG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRhd2FpdCBzaGFyZU9iamVjdChuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0fSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdGNvbnN0IHRhYmxlID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgbmF2aWdhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghdGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJDcmVhdGlvblJvd1wiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dDb250ZXh0ID0gY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGRvY3VtZW50VmFsaWRhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGUpO1xuXHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRpZiAoY3JlYXRpb25Sb3cuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zeW5jVGFzayhkb2N1bWVudFZhbGlkYXRpb24pO1xuXHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXModmFsaWRhdGlvbk1lc3NhZ2VzLCB0YWJsZSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKSkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBjcmVhdGlvblJvd1BheWxvYWQgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdC8vbW92ZWQgYWZ0ZXIgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyB0byBhdm9pZCBcIidjcmVhdGlvbicgdXNlIGJlZm9yZSBpbml0aWFsaXphdGlvblwiIGNvbnNvbGUgZXJyb3JzXG5cdFx0Ly9hZnRlciB2YWxpZGF0aW9uIGVycm9ycyBvY2N1cnJlZFxuXHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgocGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHQuLi5PYmplY3Qua2V5cyhjcmVhdGlvblJvd1BheWxvYWQpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eVBhdGgpID09PSAtMVxuXHRcdFx0XHRcdFx0KSAvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Lm1hcCgocGF0aCkgPT4gKHsgW3BhdGhdOiBjcmVhdGlvblJvd1BheWxvYWRbcGF0aF0gfSkpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogYXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvd1xuXHRcdFx0fSxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBpbmxpbmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGFcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0XHRjb25zdCBhbGxDdXJyZW50Q29udGV4dHMgPSBsaXN0QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0Y29uc3QgY29udGV4dEluZGV4ID0gYWxsQ3VycmVudENvbnRleHRzLmluZGV4T2YobmV3Q29udGV4dCk7XG5cdFx0XHRcdHRhYmxlPy5mb2N1c1Jvdyhjb250ZXh0SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIHRyZWUgdGFibGUsIHdlIGFsc28gc2Nyb2xsIHRvIGtlZXAgdGhlIHBhcmVudCB2aXNpYmxlXG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IG5ld0NvbnRleHQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRDb250ZXh0ID8gYWxsQ3VycmVudENvbnRleHRzLmluZGV4T2YocGFyZW50Q29udGV4dCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKHBhcmVudEluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgocGFyZW50SW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXG5cdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIHRoaXMuc3luY1Rhc2soY3JlYXRpb24pXSksIGxpc3RCaW5kaW5nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZGVmZmVyZWQgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBPcHRpb25hbCBwYXJlbnQgY29udGV4dCB3aGVuIGNyZWF0aW5nIGEgbm9kZSBpbiBUcmVlVGFibGVcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURlZmVycmVkRG9jdW1lbnQobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCwgZGF0YT86IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiRGVmZXJyZWRcIiwgcGFyZW50Q29udGV4dCwgbGlzdEJpbmRpbmcsIGRhdGEgfSxcblx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdH0pO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzeW5jIG9yIGFzeW5jIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgc3luYyBvciBhc3luYyBjcmVhdGlvbiBtb2RlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgVGhpcyBkb2N1bWVudCBpcyBjcmVhdGVkIGFmdGVyIGEgZGVmZmVyZWQgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uICBUaGUgY3JlYXRlIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIGNyZWF0ZSBhY3Rpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSAgRGF0YSB0byBzYXZlIG9uIHRoZSBuZXcgZG9jdW1lbnRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgbmF2aWdhdGlvbjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3Qgcm91dGluZ0xpc3RlbmVyID0gdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKVxuXHRcdFx0LmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC4uLnBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0Li4ue1xuXHRcdFx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0XHQudGhlbigobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiBuZXdEb2N1bWVudENvbnRleHQgJiYgbmV3RG9jdW1lbnRDb250ZXh0LmdldEJpbmRpbmcoKSAhPT0gbGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBJbiBGQ0wgY2FzZSwgaWYgdGhlIG5ldyBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBhbiBhY3Rpb24gKG5vdCB3aXRoIHRoZSBzdGFuZGFyZCBQT1NUIGNyZWF0ZSksIHdlIG5lZWQgdG8gcmVmcmVzaFxuXHRcdFx0XHRcdC8vIHRoZSBvcmlnaW5hbCBsaXN0QmluZGluZyBzbyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCAodGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGxpc3RCaW5kaW5nIGZvciBzdGFuZGFyZCBjcmVhdGUpXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW52b2NhdGlvbiBjb21lcyBmcm9tIGEgZGVmZXJyZWQgY3JlYXRpb24gb3IgaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93XG5cdFx0aWYgKHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCAhPT0gdHJ1ZSAmJiAhcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cblx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5Bc3luYykge1xuXHRcdFx0bmF2aWdhdGlvbiA9IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJBc3luY1wiLCBjcmVhdGVDb250ZXh0UHJvbWlzZTogY3JlYXRpb24gfSxcblx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb24udGhlbihhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICghbmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3QgY29yZVJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRcdFx0XHRyZXR1cm4gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHQvLyBhcyB3ZSdyZSBhbHJlYWR5IG9uIHRoZSBjb3JyZXNwb25kaW5nIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRjb25zdCBuYXZQYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWUsXG5cdFx0XHRcdFx0XHR0cmFuc2llbnQ6XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZykgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gPyB0cnVlIDogdW5kZWZpbmVkXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWRcblx0XHRcdFx0XHRcdD8gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG5ld0RvY3VtZW50Q29udGV4dCwgbmF2UGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCBuYXZpZ2F0aW9uXSksIGxpc3RCaW5kaW5nKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0Ly8gY3JlYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHVzZXIgb3IgZmFpbGVkIGluIGJhY2tlbmQgPT4gaW4gY2FzZSB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0cmFuc2llbnQgY29udGV4dCBiZWZvcmUsIG5hdmlnYXRlIGJhY2tcblx0XHRcdC8vIHRoZSBzd2l0Y2gtc3RhdGVtZW50IGFib3ZlIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgdGhpcyBoYXBwZW5zIGluIGNyZWF0aW9uTW9kZXMgZGVmZXJyZWQgYW5kIGFzeW5jLiBCdXQgaW4gZmFjdCwgaW4gdGhlc2UgY2FzZXMgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gZnJvbSByb3V0ZU1hdGNoZWQgaW4gT1AgY29tcG9uZW50XG5cdFx0XHQvLyBjcmVhdGVEZWZlcnJlZERvY3VtZW50IGlzIHRyaWdnZXJlZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nLFxuXHRcdFx0XHRcdENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZFxuXHRcdFx0XHRdLmluY2x1ZGVzKGVycm9yKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gb3V0Ym91bmQgVGhlIG91dGJvdW5kIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFeHRlcm5hbERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLCBvdXRib3VuZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdGlmIChvdXRib3VuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBsaXN0QmluZGluZyAhPT0gXCJzdHJpbmdcIiAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiRXh0ZXJuYWxcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRjb25zdCBjcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuYmFzZS5nZXRWaWV3KCksIGxpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoY29udHJvbGxlciwgb3V0Ym91bmQsIHVuZGVmaW5lZCwgY3JlYXRlUGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRvY3VtZW50IGNyZWF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIGNyZWF0aW9uUHJvbWlzZSBUaGUgcHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgU2lkZUVmZmVjdHMgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpICYmIHZpZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAgLSBwcmVzZXJ2ZXMgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlIHdoZW4gdGhpcyBvbmUgaXMgbm90IGEgTmV3UGFnZVxuXHQgKiAgLSBjYWxjdWxhdGVzIHRoZSBuZXcgb25lIGlmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGEgTmV3UGFnZS5cblx0ICpcblx0ICogQHBhcmFtIGluaXRpYWxDcmVhdGlvbk1vZGUgVGhlIGluaXRpYWwgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gY3JlYXRlRGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciBvYmplY3QgY3JlYXRpb25cblx0ICogQHJldHVybnMgVGhlIG5ldyBjcmVhdGlvbiBtb2RlXG5cdCAqL1xuXHRyZXNvbHZlQ3JlYXRpb25Nb2RlID0gKGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZywgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG5cdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHQvLyB1c2UgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlXG5cdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCB8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHQvLyBpZiBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGlzIHByZXNlbnQsIHRoZW4gY3JlYXRpb24gaXMgJ0RlZmVycmVkJ1xuXHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdG5ld0FjdGlvbiA9IChcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0PyBlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdDogZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdFx0XHRcdFx0KT8uTmV3QWN0aW9uPy50b1N0cmluZygpO1xuXG5cdFx0XHRcdGlmIChuZXdBY3Rpb24gJiYgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVR5cGUuYWN0aW9uc1tuZXdBY3Rpb25dLnBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuQXN5bmM7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICovXG5cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkudmFsaWRhdGVEb2N1bWVudChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIHRoZSByZXN1bHQgb2Zcblx0ICogYSBjcmVhdGlvbiByb3cncyBjdXN0b20gdmFsaWRhdGlvbiBhcyBhIHByb21pc2UuIElmIG5vIGNyZWF0aW9uIHJvdyBpcyBpbnZvbHZlZFxuXHQgKiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHdpdGggdGhlIGNyZWF0aW9uUm93XG5cdCAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZVxuXHQgKi9cblx0Z2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkKTogKCkgPT4gUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZT8uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRpZiAoY3JlYXRpb25Sb3cgJiYgdGFibGUpIHtcblx0XHRcdHJldHVybiBhc3luYyAoKTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0aW9uUm93T2JqZWN0cyA9IChjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldE9iamVjdCgpO1xuXHRcdFx0XHRkZWxldGUgY3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVEb2N1bWVudCh0YWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRkYXRhOiBjcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIilcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gYXN5bmMgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBkb2N1bWVudHNcblx0ICogQHBhcmFtIGRhdGFGb3JDcmVhdGUgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudHNcblx0ICogQHBhcmFtIGNyZWF0ZUF0RW5kIFRydWUgaWYgdGhlIG5ldyBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBpc0Zyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBiZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gY3JlYXRlQXNJbmFjdGl2ZSBUcnVlIGlmIHRoZSBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXMgaW5hY3RpdmVcblx0ICogQHBhcmFtIHJlcXVlc3RTaWRlRWZmZWN0cyBUcnVlIGJ5IGRlZmF1bHQsIGZhbHNlIGlmIFNpZGVFZmZlY3RzIHNob3VsZCBub3QgYmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcblx0XHRjcmVhdGVBdEVuZDogYm9vbGVhbixcblx0XHRpc0Zyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbixcblx0XHRjcmVhdGVBc0luYWN0aXZlID0gZmFsc2UsXG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPENvbnRleHRbXT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cyA9IHJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAoYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHByb3BlcnR5ICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdFx0XHRcdFx0IXByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF1cblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuZGF0YSFbcHJvcGVydHlQYXRoXSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0aXNGcm9tQ29weVBhc3RlXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgY3JlYXRlZENvbnRleHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY3JlYXRpb25Qcm9taXNlcyk7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUodGFyZ2V0TGlzdEJpbmRpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGNyZWF0ZWRDb250ZXh0cy5maWx0ZXIoKG5ld0NvbnRleHQpID0+ICFuZXdDb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChhY3RpdmVDb250ZXh0cy5tYXAoYXN5bmMgKG5ld0NvbnRleHQpID0+IG5ld0NvbnRleHQuY3JlYXRlZCgpKSk7XG5cblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAocmVxdWVzdFNpZGVFZmZlY3RzICYmICFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2ZUNvbnRleHRzKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRAaG9va2FibGUoXCJhZnRlclwiLCB0cnVlKVxuXHRhc3luYyBvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IHdlIG9idGFpbmVkIGFmdGVyIHNhdmluZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGhvb2thYmxlKFwiYWZ0ZXJcIilcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgb2J0YWluZWQgYWZ0ZXIgZGlzY2FyZGluZyB0aGUgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgd2UgZGlzY2FyZGVkIGEgbmV3IG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckRlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNhdmVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbVBhcmFtZXRlcnM6IFNhdmVEb2N1bWVudFBhcmFtZXRlcnMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIGFzIE9EYXRhTGlzdEJpbmRpbmdbXTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHRcdC8vIGlzIHNlbnQgdG8gdGhlIGJhY2tlbmRcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQgIT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJlxuXHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSAkYXV0byBxdWV1ZSBjYW4gb25seSBoYXZlIHBlbmRpbmcgY2hhbmdlcyBhdCB0aGlzIHBvaW50IHdoZW4gU0FWRSB3YXMgY2xpY2tlZCBpbW1lZGlhdGVseSBhZnRlciBjaGFuZ2luZyBhIGZpZWxkLlxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlIHRoZSAkYXV0byBxdWV1ZSBpcyBsb2NrZWQgdGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgc3VibWl0IGJhdGNoIHNob3VsZCBub3QgY3JlYXRlIGEgc2VwYXJhdGUgYmF0Y2ggcmVxdWVzdC5cblx0XHRcdC8vIEl0IGlzIGRvbmUgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgcGF0Y2gsIGRyYWZ0cHJlcGFyZSwgZHJhZnRhY3RpdmF0ZSBlYWNoIGhhdmUgdGhlaXIgb3duIGNoYW5nZXNldFxuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSAmJiBtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQpIHtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBhcyBib29sZWFuLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoU3RhbmRhcmRBY3Rpb25zLnNhdmUsIFRyaWdnZXJUeXBlLnN0YW5kYXJkQWN0aW9uKTtcblxuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdGNvbnRleHQ6IGFjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHVwZGF0ZSB0ZWxlbWV0cnkgZGF0YSBmb3IgaG93IHBhZ2Ugd2FzIHNhdmVkIGFuZCB0aGVuIGRvIHN0b3Jpbmcgb2YgdGhpcyBkYXRhIHRvIGJhY2tlbmQgdGhyb3VnaCB0aGUgc3RvcmVEYXRhIGZ1bmN0aW9uXG5cdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLnN0b3JlRGF0YUZvclRlbGVtZXRyeShyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4pO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBzYXZpbmcsIHRoZSBzZW1hbnRpYyBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIG5lZWQgdG8gbWFuYWdlIHRoZSBzZW1hbnRpYyBVUkwgY2hhbmdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChhY3RpdmVEb2N1bWVudENvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGlmIChwcmV2aW91c1NlbWFudGljUGF0aCAmJiBuZXdTZW1hbnRpY1BhdGggJiYgcHJldmlvdXNTZW1hbnRpY1BhdGggIT09IG5ld1NlbWFudGljUGF0aCkge1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IHByZXZpb3VzU2VtYW50aWNQYXRoLCBuZXdQYXRoOiBuZXdTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIChvRXJyb3IgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW4gfSkuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIHRoZSBVSSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBzd2l0Y2ggZnJvbVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIHN3aXRjaCBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyB0b2dnbGVEcmFmdEFjdGl2ZShvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBlZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRlZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGVkaXRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoIXNpYmxpbmdJbmZvICYmIG9Db250ZXh0ICE9PSBvUmlnaHRtb3N0Q29udGV4dCkge1xuXHRcdFx0XHQvLyBUcnkgdG8gY29tcHV0ZSBzaWJsaW5nIGluZm8gZm9yIHRoZSByb290IGNvbnRleHQgaWYgaXQgZmFpbHMgZm9yIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0XHQvLyAtLT4gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlIHRyeSB0byBzd2l0Y2ggYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGJ1dCBhIGNoaWxkIGVudGl0eSBoYXMgbm8gc2libGluZywgdGhlIHN3aXRjaCB3aWxsIGNsb3NlIHRoZSBjaGlsZCBjb2x1bW5cblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoZWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgeyBlZGl0YWJsZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGNvbnRyb2w/OiBCdXR0b247XG5cdFx0XHRjYW5jZWxCdXR0b24/OiBCdXR0b247XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJhY2tOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGlzTmV3RG9jdW1lbnQgPSBmYWxzZTtcblx0XHRjb25zdCBjYW5jZWxQYXJhbWV0ZXJzOiBDYW5jZWxQYXJhbWV0ZXJzID0ge1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgPT09IHRydWUsXG5cdFx0XHRjYW5jZWxCdXR0b246IChtUGFyYW1ldGVycy5jb250cm9sIHx8IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbikhLFxuXHRcdFx0YmVmb3JlQ2FuY2VsQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmRcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHQob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdGNhbmNlbFBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZvckVhY2goKHZpZXcpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChjb250ZXh0ICYmIGNvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGlzY2FyZCh7XG5cdFx0XHRcdGNvbnRleHQ6IHR5cGVvZiBjYW5jZWxSZXN1bHQgPT09IFwiYm9vbGVhblwiIHx8IGNhbmNlbFJlc3VsdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGNhbmNlbFJlc3VsdFxuXHRcdFx0fSk7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0aXNOZXdEb2N1bWVudCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudCwgYW5kIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGVkaXRlZCBjb250ZXh0XG5cdFx0XHRcdFx0Ly8gU28sIHdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIGFzIGl0IG1heSBoYXZlIGJlZW4gZGVzdHJveWVkIHdoZW4gY2FsbGluZyBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIGFsbCB2aWV3J3MgY29udGV4dHNcblx0XHRcdFx0XHQvLyBlYXJsaWVyIGluIHRoaXMgbWV0aG9kXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdC8vc2hvdyBEcmFmdCBkaXNjYXJkZWQgbWVzc2FnZSB0b2FzdCBvbmx5IGZvciBkcmFmdCBlbmFibGVkIGFwcHNcblx0XHRcdFx0dGhpcy5zaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCcmluZ3MgdXAgYSBtZXNzYWdlIHRvYXN0IHdoZW4gYSBkcmFmdCBpcyBkaXNjYXJkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBpc05ld0RvY3VtZW50IFRoaXMgaXMgYSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIG5ldyBvciBhbHJlYWR5IGV4aXN0cy5cblx0ICovXG5cdHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQ/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRpZiAoaXNOZXdEb2N1bWVudCA9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQoe30sIHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGluIHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIHdoZW4gbm8gY29udGV4dCBpcyBwYXNzZWQuXG5cdCAqL1xuXHRzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqL1xuXHRwcml2YXRlIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzPzogeyBlbnRpdHlTZXROYW1lOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlLCBiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlIH07XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG9Db250ZXh0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gRGVsZXRpbmcgYW4gYWN0aXZlIGVudGl0eSB3aGljaCBoYXMgYSBkcmFmdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTGlzdFJlcG9ydCAoRkNMIGNhc2UpXG5cdFx0XHRcdC8vIC0tPiBuZWVkIHRvIHJlbW92ZSB0aGUgZHJhZnQgZnJvbSB0aGUgTFIgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0aXZlIHZlcnNpb24sIHNvIHRoYXQgdGhlIExpc3RCaW5kaW5nIGlzIHByb3Blcmx5IHJlZnJlc2hlZFxuXHRcdFx0XHQvLyBUaGUgY29uZGl0aW9uICdvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQnIG1ha2VzIHN1cmUgdGhlIGFjdGl2ZSB2ZXJzaW9uIGlzbid0IGFscmVhZHkgZGlzcGxheWVkIGluIHRoZSBMUlxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IGFzeW5jIChwYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlKHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdFBhdGggPSBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRDb250ZXh0VG9SZW1vdmUgPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0UGF0aCk7XG5cdFx0XHRcdFx0XHRkcmFmdENvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcGxhY2luZyB0aGUgZHJhZnQgaW5zdGFuY2UgaW4gdGhlIExSIE9ETEJcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0Y29uc3QgcGFyZW50TGlzdEJpbmRpbmcgPSBjb250ZXh0QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0XHRcdD8gY29udGV4dEJpbmRpbmdcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKHBhcmVudExpc3RCaW5kaW5nLCBwYXJlbnRMaXN0QmluZGluZz8uZ2V0Q29udGV4dCgpKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0YWNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRvQXBwQ29tcG9uZW50Py5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoW29Db250ZXh0XSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogW29Db250ZXh0XSB9KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudD8uZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuRGVlcGxpbmspIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHAgaGFzIGJlZW4gbGF1bmNoZWQgd2l0aCBzZW1hbnRpYyBrZXlzLCBkZWxldGluZyB0aGUgb2JqZWN0IHdlJ3ZlIGxhbmRlZCBvbiBzaGFsbCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdFx0Ly8gdG8gdGhlIGFwcCB3ZSBjYW1lIGZyb20gKGV4Y2VwdCBmb3IgRkNMLCB3aGVyZSB3ZSBuYXZpZ2F0ZSB0byBMUiBhcyB1c3VhbClcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBFbHNlIG5hdmlnYXRlIGJhY2sgZnJvbSB0aGUgcGFnZS4gSW4gRkNMLCB0aGlzIGlzIGRvbmUgd2hlbiB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IGlzIGRlc3Ryb3llZCAoY2FsbGJhY2spXG5cdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5jaGVja0lmUmVjb21tZW5kYXRpb25zRXhpc3QoKSkge1xuXHRcdFx0XHRjb25zdCBpc0NvbnRpbnVlID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhmYWxzZSk7XG5cdFx0XHRcdGlmIChpc0NvbnRpbnVlID09PSBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pc05hdmlnYWJsZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250cm9sSWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCBwcm92aWRpbmcgdGhlIHJlc3BvbnNlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiB7fVxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRsZXQgYVBhcnRzO1xuXHRcdGxldCBzT3ZlcmxvYWRFbnRpdHlUeXBlO1xuXHRcdGxldCBvQ3VycmVudEFjdGlvbkNhbGxCYWNrczpcblx0XHRcdHwge1xuXHRcdFx0XHRcdGZSZXNvbHZlcjogRnVuY3Rpb247XG5cdFx0XHRcdFx0ZlJlamVjdG9yOiBGdW5jdGlvbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXG5cdFx0Ly8gRHVlIHRvIGEgbWlzdGFrZSB0aGUgaW52b2tlQWN0aW9uIGluIHRoZSBleHRlbnNpb25BUEkgaGFkIGEgZGlmZmVyZW50IEFQSSB0aGFuIHRoaXMgb25lLlxuXHRcdC8vIFRoZSBvbmUgZnJvbSB0aGUgZXh0ZW5zaW9uQVBJIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBhcyB3ZSBleHBvc2UgdGhlIGZ1bGwgZWRpdCBmbG93IG5vdyBidXRcblx0XHQvLyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIHNpZ25hdHVyZVxuXHRcdGlmIChcblx0XHRcdCgobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBICYmIChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHxcblx0XHRcdEFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkID0gbUluUGFyYW1ldGVycyBhcyBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRtSW5QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMubW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0YkdldEJvdW5kQ29udGV4dD86IGJvb2xlYW47XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCBudWxsO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cGFyZW50Q29udHJvbDogRkVWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0XHRcdGJJc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGlzQm91bmQ/OiBib29sZWFuO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSA9IHsgLi4ubUluUGFyYW1ldGVycywgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9IHx8IHsgcGFyZW50Q29udHJvbDogdGhpcy5iYXNlLmdldFZpZXcoKSB9O1xuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgdGhlIHJlZmVyZW5jZWQgYWN0aW9uIGlzIGJvdW5kIG9yIHVuYm91bmRcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0Ly8gVGhlIEVudGl0eUNvbnRhaW5lciBtYXkgTk9UIGJlIG1pc3NpbmcsIHNvIGl0IHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSB1bmRlZmluZWQsIGJ1dCBzaW5jZSBpbiBvdXIgY29udmVydGVkIE1ldGFkYXRhXG5cdFx0Ly8gaXQgY2FuIGJlIHVuZGVmaW5lZCwgSSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBoZXJlIG9mIGFkZGluZyBcIlwiIHNpbmNlIGluZGV4T2YgZG9lcyBub3QgYWNjZXB0IHNvbWV0aGluZyB0aGF0J3Ncblx0XHQvLyB1bmRlZmluZWQuXG5cdFx0aWYgKHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiXCIgKyBjb252ZXJ0ZWRNZXRhZGF0YS5lbnRpdHlDb250YWluZXIubmFtZSkpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lID0gbVBhcmFtZXRlcnMubW9kZWxcblx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhQ29udGV4dCgobVBhcmFtZXRlcnMuY29udGV4dHMgYXMgQ29udGV4dCkuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgc3RpY2t5IHNlc3Npb24gaXMgZW5hYmxlZCB3ZSB0cmlnZ2VyIGFjdGlvbnMgd2l0aG91dCBlVGFnXG5cdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZyA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCIoXCIpKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0ucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gJiYgb0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgJiYgb0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSAoXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uYmluZExpc3Qob0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKSBhcyBPRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKS5iaW5kTGlzdChzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCA9IHRoaXMuX2dldEJvdW5kQ29udGV4dChvVmlldywgbVBhcmFtZXRlcnMpO1xuXHRcdC8vIE5lZWQgdG8ga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgY2FsbGVkIGZyb20gT2JqZWN0UGFnZSBmb3IgY2hhbmdlU2V0IElzb2xhdGVkIHdvcmthcm91bmRcblx0XHRtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IG9WaWV3LmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCI7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0bGV0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0bGV0IGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGlmIChvUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzID0gQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpXG5cdFx0XHRcdFx0XHQ/IE9iamVjdC5rZXlzKChvUmVzcG9uc2VbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4pLnZhbHVlPy5nZXRPYmplY3QoKSlcblx0XHRcdFx0XHRcdDogT2JqZWN0LmtleXMob1Jlc3BvbnNlLmdldE9iamVjdCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aW9uLCBtUGFyYW1ldGVycy5jb250ZXh0cywgc0FjdGlvbk5hbWUsIGxpc3RSZWZyZXNoZWQsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVzb2x2ZXIob1Jlc3BvbnNlKTtcblx0XHRcdH1cblx0XHRcdC8qXG5cdFx0XHRcdFx0V2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHRUT0RPOiBnZXQgcmlkIG9mIHRoaXMgd29ya2Fyb3VuZFxuXHRcdFx0XHRcdFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0T25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHRpcyBhbHJlYWR5IHJlZnJlc2hlZCAoaXQncyBqdXN0IG5vdCByZWZsZWN0ZWQgaW4gdGhlIG9iamVjdCBwYWdlKVxuXHRcdFx0XHRcdHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0YXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdHdlIGNhbiBsaXZlIHdpdGggdGhpc1xuXHRcdFx0XHRcdHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0Zmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCovXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSAhPT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSAodkNvbnRleHRbMF0gYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4pLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2Q29udGV4dCAmJiAhQXJyYXkuaXNBcnJheSh2Q29udGV4dCkpIHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdkNvbnRleHQ7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9mblZhbGlkQ29udGV4dHMgPSAoY29udGV4dHM6IENvbnRleHRbXSwgYXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdKTogQ29udGV4dFtdID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5jbHVkZXMoZWxlbWVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cylcblx0XHRcdFx0XHRcdD8gX2ZuVmFsaWRDb250ZXh0cyhtUGFyYW1ldGVycy5jb250ZXh0cywgbVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzKVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dD8uZ2V0UGF0aCgpICE9PSBjb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWVcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFjdGlvbiByZXR1cm5zIGEgZHJhZnQgY29udGV4dCwgd2UgYWxyZWFkeSB0YWtlIGNhcmUgZHVyaW5nIG5hdmlnYXRpb24gdG8gZWl0aGVyIGNyZWF0ZSBhIG5ld1xuXHRcdFx0XHRcdFx0XHQvLyAoZnVsbCBzY3JlZW4pIG9yIHRvIHVzZSB0aGUgbGlzdCBiaW5kaW5nIGNvbnRleHQgYWZ0ZXIgcmVmcmVzaCAoYW5kIG5vdCB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQpLlxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZHJhZnQgaXMgZGlzY2FyZGVkIG9yIGFjdGl2YXRlZCwgaGF2aW5nIHRoZSBjb250ZXh0IHN0aWxsIGFzIGRlcGVuZGVudCBjb250ZXh0IGNhdXNlIGlzc3Vlc1xuXHRcdFx0XHRcdFx0XHQvLyAoZS5nLiBpZiBhIHNpZGUgZWZmZWN0IGlzIHRyaWdnZXJlZCkuIFRoZXJlZm9yZSwgd2UgZGVzdHJveSB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgaGVyZSxcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRvIGJlIGNvbXBhdGlibGUgd2UgcmV0dXJuIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwYXRoLlxuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXR1cm5Db250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQob1Jlc3BvbnNlWzBdIGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQ+KS52YWx1ZSA9IHJldHVybkNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNwb25zZSA9IHJldHVybkNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0QmluZGluZygpLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXJyUHJvbWlzZSA9IGVyciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbjsgcmVqZWN0ZWRJdGVtcz86IHsgY2FuY2VsZWQ6IGJvb2xlYW4gfVtdIH07XG5cdFx0XHQvLyBGSVhNRTogaW4gbW9zdCBzaXR1YXRpb25zIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoZSByZWplY3RlZCBwcm9taXNlcyByZXR1cm5lZHFcblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0Ly8gVGhpcyBsZWFkcyB0byBjb25zb2xlIGVycm9yLiBBY3R1YWxseSB0aGUgZXJyb3IgaXMgYWxyZWFkeSBoYW5kbGVkIChjdXJyZW50bHkgZGlyZWN0bHkgaW4gcHJlc3MgaGFuZGxlciBvZiBlbmQgYnV0dG9uIGluIGRpYWxvZyksIHNvIGl0IHNob3VsZCBub3QgYmUgZm9yd2FyZGVkXG5cdFx0XHRcdC8vIHVwIHRvIGhlcmUuIEhvd2V2ZXIsIHdoZW4gZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkLCBpbmZvcm1hdGlvbiB3aGV0aGVyIGRpYWxvZyB3YXMgY2FuY2VsbGVkLCBvciBiYWNrZW5kIGV4ZWN1dGlvbiBoYXMgZmFpbGVkIG5lZWRzXG5cdFx0XHRcdC8vIHRvIGJlIHRyYW5zcG9ydGVkIHRvIHRoZSBwbGFjZSByZXNwb25zaWJsZSBmb3IgY29ubmVjdGluZyB0aGVzZSB0d28gdGhpbmdzLlxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvbmUgZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9IGVsc2UgaWYgKCEoZXJyICYmIChlcnJQcm9taXNlLmNhbmNlbGVkIHx8IChlcnJQcm9taXNlLnJlamVjdGVkSXRlbXMgJiYgZXJyUHJvbWlzZS5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdC8vIFRPRE86IGFuYWx5emUsIHdoZXRoZXIgdGhpcyBpcyBvZiB0aGUgc2FtZSBjYXRlZ29yeSBhcyBhYm92ZVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93Lmludm9rZUFjdGlvbjoke2Vycn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRPRE86IEFueSB1bmV4cGVjdGVkIGVycm9ycyBwcm9iYWJseSBzaG91bGQgbm90IGJlIGlnbm9yZWQhXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBfYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckFjdGlvbkV4ZWN1dGlvbihfYWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly90byBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPilcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBwYXRjaFNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCk6IHZvaWQge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24sIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBpZ25vcmVFVGFnID0gdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8IGludGVybmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKHRydWUpO1xuXHRcdH1cblx0XHRpZiAoIWludGVybmFsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyB1bmtub3duIGFzIE9EYXRhTGlzdEJpbmRpbmc7IC8vIEZJWE1FOiBVSTUgdHlwZSBzYXlzIHRoaXMgc2hvdWxkIGJlIGFuIE9EYXRhQ29udGV4dEJpbmRpbmdcblx0XHRcdC8vIENyZWF0ZSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhlIHBhdGggaXMgY29tcGxldGVkXG5cdFx0XHRjb25zdCBvUGF0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKHBhdGNoQ29tcGxldGVkRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbiB9PikgPT4ge1xuXHRcdFx0XHRcdC8vIFJlLWVuYWJsZSBFVGFnIGNoZWNrc1xuXHRcdFx0XHRcdGlmIChpZ25vcmVFVGFnKSB7XG5cdFx0XHRcdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLnNldElnbm9yZUVUYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRXZlbnQuZ2V0U291cmNlKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0XHRzb3VyY2VCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBwYXRjaENvbXBsZXRlZEV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudXBkYXRlRG9jdW1lbnQoc291cmNlQmluZGluZywgb1BhdGNoUHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZVNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVDcmVhdGVTZW50KGV2ZW50OiBVSTVFdmVudDx7IGNvbnRleHQ6IENvbnRleHQgfT4pOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZXh0ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKGZhbHNlLCBmYWxzZSwgY29udGV4dC5nZXRQYXRoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBlcmZvcm1zIGEgdGFzayBpbiBzeW5jIHdpdGggb3RoZXIgdGFza3MgY3JlYXRlZCB2aWEgdGhpcyBmdW5jdGlvbi5cblx0ICogUmV0dXJucyB0aGUgcHJvbWlzZSBjaGFpbiBvZiB0aGUgdGFzay5cblx0ICpcblx0ICogQHBhcmFtIFtuZXdUYXNrXSBPcHRpb25hbCwgYSBwcm9taXNlIG9yIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHlcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSB0YXNrIGlzIGNvbXBsZXRlZFxuXHQgKi9cblx0YXN5bmMgc3luY1Rhc2s8VD4obmV3VGFzaz86ICgoKSA9PiBUKSB8IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcblx0XHRpZiAobmV3VGFzaykge1xuXHRcdFx0aWYgKHR5cGVvZiBuZXdUYXNrID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrcy50aGVuKG5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uIChlcnI6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrc1xuXHRcdFx0XHRcdC50aGVuKGFzeW5jICgpID0+IG5ld1Rhc2spXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFza3MgYXMgUHJvbWlzZTxUPjtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGxhc3RJbnZva2VkQWN0aW9uTmFtZSA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIpO1xuXHRcdFx0aWYgKGxhc3RJbnZva2VkQWN0aW9uTmFtZSAmJiB0aGlzLmlzTmV3QWN0aW9uRm9yU3RpY2t5KGxhc3RJbnZva2VkQWN0aW9uTmFtZSwgY29udGV4dCkpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgdHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKGNvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KSwgY29udGV4dC5nZXRNb2RlbCgpKTtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogSW50ZXJuYWwgbWV0aG9kIHRvIGRlbGV0ZSBhIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBUaGUgY29udGV4dChzKSB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIGRlbGV0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubm9EaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGl0bGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGVzY3JpcHRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKFxuXHRcdGNvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZyB9O1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cz86IG51bWJlcjtcblx0XHRcdHVuU2F2ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGxvY2tlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZT86IERyYWZ0U2libGluZ1BhaXJbXTtcblx0XHRcdGRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmU/OiBDb250ZXh0W107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHQvLyBhcyBzZWxlY3RlZCBjb250ZXh0cyBtYXkgaW5jbHVkZSBpbmFjdGl2ZSBjb250ZXh0IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGlzIHBhcmFtZXRlciBhZ2FpbiB0byBlbnN1cmUgZGVsZXRlIGhlbHBlciB3b3JrcyBwcm9wZXJseVxuXHRcdFx0cGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMubGVuZ3RoO1xuXHRcdH1cblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0XHRcdD8gKEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0IHwgdW5kZWZpbmVkKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50KGNvbnRleHRzLCBwYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCByZXNvdXJjZU1vZGVsLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHR9XG5cblx0X2dldFJlc291cmNlTW9kZWwoKTogUmVzb3VyY2VNb2RlbCB7XG5cdFx0cmV0dXJuIGdldFJlc291cmNlTW9kZWwodGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRUcmFuc2FjdGlvbkhlbHBlcigpOiB0eXBlb2YgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRcdHJldHVybiBUcmFuc2FjdGlvbkhlbHBlcjtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWVzc2FnZUhhbmRsZXIoKTogTWVzc2FnZUhhbmRsZXIge1xuXHRcdGlmICh0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiBtZXNzYWdlIGhhbmRsZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRHbG9iYWxVSU1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBiQ3JlYXRpb25Nb2RlIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdHByaXZhdGUgc2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIikgYXMgQ29udGV4dDtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkNyZWF0ZU1vZGUsIGJDcmVhdGlvbk1vZGUsIHVpTW9kZWxDb250ZXh0LCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Qgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRnZXRDcmVhdGlvbk1vZGUoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlLCB1aU1vZGVsQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkIG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4pOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoc3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2UgKGRpc3BsYXllZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlKS5cblx0ICpcblx0ICogQHBhcmFtIGRyYWZ0U3RhdHVzIFRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZVxuXHQgKi9cblx0c2V0RHJhZnRTdGF0dXMoZHJhZnRTdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuXHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvZHJhZnRTdGF0dXNcIiwgZHJhZnRTdGF0dXMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBhIGJpbmRpbmcgb3IgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBiaW5kaW5nIG9yIGNvbnRleHRcblx0ICogQHJldHVybnMgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqL1xuXHRwcml2YXRlIGdldFByb2dyYW1taW5nTW9kZWwoc291cmNlOiBDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwoc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBlZGl0TW9kZSBUaGUgZWRpdCBtb2RlXG5cdCAqIEBwYXJhbSBpc0NyZWF0aW9uIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBuZXdseSBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldEVkaXRNb2RlKGVkaXRNb2RlPzogc3RyaW5nLCBpc0NyZWF0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChlZGl0TW9kZSkge1xuXHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiLCBlZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0aWYgKGVkaXRNb2RlICE9PSBcIkVkaXRhYmxlXCIpIHtcblx0XHRcdFx0dGhpcy5mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlzQ3JlYXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gU2luY2Ugc2V0Q3JlYXRpb25Nb2RlIGlzIHB1YmxpYyBpbiBFZGl0RmxvdyBhbmQgY2FuIGJlIG92ZXJyaWRlbiwgbWFrZSBzdXJlIHRvIGNhbGwgaXQgdmlhIHRoZSBjb250cm9sbGVyXG5cdFx0XHQvLyB0byBlbnN1cmUgYW55IG92ZXJyaWRlcyBhcmUgdGFrZW4gaW50byBhY2NvdW50XG5cdFx0XHR0aGlzLnNldENyZWF0aW9uTW9kZShpc0NyZWF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZmxhZyB0byBmb3JjZSBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQuXG5cdCAqIEBwYXJhbSBmb3JjZWRcblx0ICovXG5cdHByaXZhdGUgZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoZm9yY2VkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoXCIvZm9yY2VEcmFmdFNhdmVPckRpc2NhcmRcIiwgZm9yY2VkLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB3ZSBzaG91bGQgZm9yY2UgdGhlIHVzZXIgdG8gU2F2ZSBvciBEaXNjYXJkIHdoZW4gbGVhdmluZyBhIGRyYWZ0LCBvciBpZiBrZWVwaW5nIHRoZSBkcmFmdCBpcyBhbGxvd2VkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIG5vdCBhbGxvd2VkXG5cdCAqL1xuXHRzaGFsbEZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiKSA9PT0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYW4gYWN0aW9uIGNvcnJlc3BvbmRzIHRvIGEgY3JlYXRlIGFjdGlvbiBmb3IgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIGEgY3JlYXRlIGFjdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBpc05ld0FjdGlvbkZvclN0aWNreShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCBzdGlja3lTZXNzaW9uID0gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uTmV3QWN0aW9uID09PSBhY3Rpb25OYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zICYmIHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zLmluY2x1ZGVzKGFjdGlvbk5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8vIFRPRE8gTW92ZSBhbGwgc3RpY2t5LXJlbGF0ZWQgYmVsb3cgdG8gYSBzdGlja3kgc2Vzc2lvbiBtYW5hZ2VyIGNsYXNzXG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9uKGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBoYXNoVHJhY2tlciA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXG5cdFx0XHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdFx0XHQvLyB0aGUgbmV3IGhhc2gsIGFuZCB0aGUgZ3VhcmQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnkgb2YgdGhlIHJvdXRlciBwcm94eVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQoY29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbih0aGlzLm9uQmFja05hdmlnYXRpb25JblNlc3Npb24uYmluZCh0aGlzLCBjb250ZXh0KSk7XG5cblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHRoaXMuZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbCwgaGFzaFRyYWNrZXIpO1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzZXNzaW9uIHRpbWVvdXRcblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24gPSB0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKTtcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cblx0XHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9mZigpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5kaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKTtcblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0XHRpZiAobW9kZWwgJiYgdGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKSB7XG5cdFx0XHRcdG1vZGVsLmRldGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbikge1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxSb3V0aW5nKCk6IEludGVybmFsUm91dGluZyB7XG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpOiBSb290Vmlld0Jhc2VDb250cm9sbGVyIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEByZXR1cm5zIFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cdHByaXZhdGUgY3JlYXRlQWN0aW9uUHJvbWlzZShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRyb2xJZDogc3RyaW5nKTogeyBmUmVzb2x2ZXI6IEZ1bmN0aW9uOyBmUmVqZWN0b3I6IEZ1bmN0aW9uIH0ge1xuXHRcdGxldCByZXNvbHZlRnVuY3Rpb246IEZ1bmN0aW9uLCByZWplY3RGdW5jdGlvbjogRnVuY3Rpb247XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKG9SZXNwb25zZTogdW5rbm93bikgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdHsgY29udHJvbElkIH0sXG5cdFx0XHRcdHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRcdFx0XHRhY3Rpb25OYW1lLFxuXHRcdFx0XHRcdG9SZXNwb25zZSBhcyB1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U/OiAodW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSkgfCBudWxsXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggPj0gMSkge1xuXHRcdFx0XHRyZXNwb25zZSA9IChyZXNwb25zZVswXSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPikudmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIXJlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsRGF0YSA9IChjdXJyZW50Vmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldERhdGEoKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBhY3Rpb25SZXR1cm5UeXBlID0gbWV0YU1vZGVsQWN0aW9uPy5bMF0uJFJldHVyblR5cGUgPyBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZS4kVHlwZSA6IG51bGw7XG5cdFx0Y29uc3Qga2V5cyA9XG5cdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdD8gKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSkuJEtleVxuXHRcdFx0XHQ6IFtdO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9EYXRhOiByZXNwb25zZS5nZXRPYmplY3QoKSxcblx0XHRcdGtleXNcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG5cdFx0cmV0dXJuIHRoaXMuYWN0aW9uUHJvbWlzZTtcblx0fVxuXG5cdGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk6IHZvaWQge1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIHNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGlzU2F2ZTogYm9vbGVhbik6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbj4ge1xuXHRcdGlmICghdGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKSB7XG5cdFx0XHR0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cgPSBuZXcgQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nQmxvY2soe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRDb250ZXh0cygpO1xuXHRcdFx0aWYgKCFhbGxSb3dDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGZvY3VzUm93ID0gYWN0aXZlUm93SW5kZXgsXG5cdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdGZvciAoY29uc3Qgc2luZ2xlQ29udGV4dCBvZiBhbGxSb3dDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2luZ2xlQ29udGV4dC5pc0luYWN0aXZlKCkgJiYgaW5kZXggPCBmb2N1c1Jvdykge1xuXHRcdFx0XHRcdGZvY3VzUm93ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHRcdGlmIChmb2N1c1JvdyA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChmb2N1c1Jvdyk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1Jvdyhmb2N1c1JvdywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXModGFibGU6IFRhYmxlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoXG5cdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlICYmXG5cdFx0XHQhdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIpXG5cdFx0KSB7XG5cdFx0XHQvLyBXaXRoIHRoZSBwYXJhbWV0ZXIsIHdlIGRvbid0IGhhdmUgZW1wdHkgcm93cyBpbiBFZGl0IG1vZGUsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZW0gYmVmb3JlIHNldHRpbmcgdGhlIGZvY3VzIG9uIHRoZW1cblx0XHRcdGF3YWl0IHRhYmxlQVBJLnNldFVwRW1wdHlSb3dzKHRhYmxlLCB0cnVlKTtcblx0XHR9XG5cdFx0dGhpcy5fc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KHRhYmxlKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoXG5cdFx0YWN0aW9uOiBBY3Rpdml0eSxcblx0XHRyZWxhdGVkQ29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHRyaWdnZXJlZEFjdGlvbk5hbWU/OiBzdHJpbmcsXG5cdFx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbixcblx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW11cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7IGFjdGlvbiwgY29udGVudCwgdHJpZ2dlcmVkQWN0aW9uTmFtZSwgcmVmcmVzaExpc3RCaW5kaW5nLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIH0pO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSk6IHZvaWQge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuYmFzZS5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBTdWJtaXQgYW55IGxlZnRvdmVyIGNoYW5nZXMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWRcblx0XHRcdC8vIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRcdGF3YWl0IG9Nb2RlbC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgY2hhbmdlc1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGFncmVlZCB3aXRoIHRoZSB2NCBtb2RlbCB0ZWFtIHRvIHVzZSBhbiBpbnRlcm5hbCBtZXRob2QuIFdlJ2xsIHJlcGxhY2UgaXQgb25jZVxuXHRcdFx0Ly8gYSBwdWJsaWMgb3IgcmVzdHJpY3RlZCBtZXRob2Qgd2FzIHByb3ZpZGVkXG5cdFx0XHRhd2FpdCAob01vZGVsLm9SZXF1ZXN0b3IgYXMgdW5rbm93biBhcyB7IHdhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHM6IEZ1bmN0aW9uIH0pLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgcm91dGVyUHJveHkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAocm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0c3RpY2t5LnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0YXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhQcm9ncmFtbWluZ01vZGVsLlN0aWNreSk7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHZpZXcsXG5cdFx0XHRcdFByb2dyYW1taW5nTW9kZWwuU3RpY2t5XG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IHsgZWRpdGFibGU6IGJvb2xlYW47IHJlY3JlYXRlQ29udGV4dDogYm9vbGVhbjsgZm9yY2VGb2N1cz86IGJvb2xlYW4gfVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5lZGl0YWJsZSxcblx0XHRcdHBlcnNpc3RPUFNjcm9sbDogdHJ1ZSxcblx0XHRcdHJlY3JlYXRlQ29udGV4dDogbmF2aWdhdGlvblBhcmFtZXRlcnMucmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0cmVhc29uOiBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBmYWxzZSxcblx0XHRcdGZvcmNlRm9jdXM6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmZvcmNlRm9jdXMgPz8gZmFsc2UsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBGRVZpZXcsIHBhcmFtczogeyBjb250cm9sSWQ/OiBzdHJpbmc7IGlzTmF2aWdhYmxlPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBlcnJvcnMsIGFuZCByZWplY3RzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9yc1xuXHQgKi9cblxuXHRhc3luYyBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkIHwgdm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uub0RhdGFcblx0ICogQHBhcmFtIG9SZXNwb25zZS5rZXlzXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYm91bmQgY29udGV4dCBvbiB3aGljaCB0aGUgYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRhc3luYyBfcmVmcmVzaExpc3RJZlJlcXVpcmVkKFxuXHRcdG9SZXNwb25zZT86IHsgb0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5cz86IHN0cmluZ1tdIHwgbnVsbCB9LFxuXHRcdG9Db250ZXh0PzogQ29udGV4dFxuXHQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSB8fCAhb1Jlc3BvbnNlLmtleXMpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Ly8gcmVmcmVzaCBvbmx5IGxpc3RzXG5cdFx0aWYgKG9CaW5kaW5nICYmIG9CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRjb25zdCBhS2V5cyA9IG9SZXNwb25zZS5rZXlzO1xuXHRcdFx0Y29uc3Qgb0N1cnJlbnREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRsZXQgYlJldHVybmVkQ29udGV4dElzU2FtZSA9IHRydWU7XG5cdFx0XHQvLyBlbnN1cmUgY29udGV4dCBpcyBpbiB0aGUgcmVzcG9uc2Vcblx0XHRcdGlmIChPYmplY3Qua2V5cyhvQ29udGV4dERhdGEpLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBjaGVjayBpZiBjb250ZXh0IGluIHJlc3BvbnNlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBib3VuZCBjb250ZXh0XG5cdFx0XHRcdGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXJyZW50RGF0YVtzS2V5XSA9PT0gb0NvbnRleHREYXRhW3NLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdFx0aWYgKG9CaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvQmluZGluZykpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSB1c2UgYSBzaWRlLWVmZmVjdCByZWZyZXNoIGZvciBhIFRyZWVUYWJsZSwgdG8gcHJlc2VydmUgZXhwYW5zaW9uIHN0YXRlc1xuXHRcdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBvQmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhKVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogb0JpbmRpbmcuZ2V0UGF0aCgpIH1dLCBvQmluZGluZy5nZXRDb250ZXh0KCkpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cblxuXHRhc3luYyBfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhUmVxdWVzdFByb21pc2VzID0gYVNlbWFudGljS2V5cy5tYXAoYXN5bmMgZnVuY3Rpb24gKG9LZXk6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVxdWVzdFByb21pc2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgbGF0ZXN0IGNvbnRleHQgaW4gdGhlIG1ldGFkYXRhIGhpZXJhcmNoeSBmcm9tIHJvb3RCaW5kaW5nIHRvIGdpdmVuIGNvbnRleHQgcG9pbnRpbmcgdG8gZ2l2ZW4gZW50aXR5VHlwZVxuXHQgKiBpZiBhbnkgc3VjaCBjb250ZXh0IGV4aXN0cy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBvcmlnaW5hbCBjb250ZXh0LlxuXHQgKiBOb3RlOiBJdCBpcyBvbmx5IG5lZWRlZCBhcyB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZy4gQ29ycmVjdCBtb2RlbGxpbmcgd291bGQgaW1wbHkgYSBEYXRhRmllbGRGb3JBY3Rpb24gaW4gYSBMaW5lSXRlbVxuXHQgKiB0byBwb2ludCB0byBhbiBvdmVybG9hZCBkZWZpbmVkIGVpdGhlciBvbiB0aGUgY29ycmVzcG9uZGluZyBFbnRpdHlUeXBlIG9yIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZS5cblx0ICpcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0IFRoZSBjb250ZXh0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBvdmVybG9hZEVudGl0eVR5cGUgVGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eSB0eXBlIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5XG5cdCAqL1xuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChyb290Q29udGV4dDogQ29udGV4dCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIG92ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB7XG5cdFx0Y29uc3QgbW9kZWw6IE9EYXRhTW9kZWwgPSByb290Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgY29udGV4dFNlZ21lbnRzOiBzdHJpbmdbXSA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGN1cnJlbnRDb250ZXh0OiBDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cblx0XHQvLyBXZSBleHBlY3QgdGhhdCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBsaXN0QmluZGluZyBpcyB0aGUgTGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlLiBSZW1vdmUgdGhpcyBmcm9tIGNvbnRleHRTZWdtZW50c1xuXHRcdC8vIGJlY2F1c2UgaXQgaXMgaW5jb3JyZWN0IHRvIGV4ZWN1dGUgYmluZENvbnRleHQgb24gYSBsaXN0LiBXZSBkbyBub3QgYW55d2F5IG5lZWQgdG8gc2VhcmNoIHRoaXMgY29udGV4dCBmb3IgdGhlIG92ZXJsb2FkLlxuXHRcdGNvbnRleHRTZWdtZW50cy5wb3AoKTtcblx0XHRpZiAoY29udGV4dFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzID0gW1wiXCJdOyAvLyBEb24ndCBsZWF2ZSBjb250ZXh0U2VnbWVudHMgdW5kZWZpbmVkXG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRleHRTZWdtZW50c1swXSAhPT0gXCJcIikge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzLnVuc2hpZnQoXCJcIik7IC8vIHRvIGFsc28gZ2V0IHRoZSByb290IGNvbnRleHQsIGkuZS4gdGhlIGJpbmRpbmdDb250ZXh0IG9mIHRoZSB0YWJsZVxuXHRcdH1cblx0XHQvLyBsb2FkIGFsbCB0aGUgcGFyZW50IGNvbnRleHRzIGludG8gYW4gYXJyYXlcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0czogQ29udGV4dFtdID0gY29udGV4dFNlZ21lbnRzXG5cdFx0XHQubWFwKChwYXRoU2VnbWVudDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGlmIChwYXRoU2VnbWVudCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocGF0aFNlZ21lbnQsIGN1cnJlbnRDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHVzaW5nIGJpbmRDb250ZXh0KC4uLikuZ2V0Qm91bmRDb250ZXh0KCkgZG9lcyBub3Qgd29yayBpZiB0aGUgZXRhZyBpcyBuZWVkZWQuIEFjY29yZGluZyB0byBtb2RlbCBjb2xsZWFndWVzLFxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBhbHdheXMgdXNlIGFuIGV4aXN0aW5nIGNvbnRleHQgaWYgcG9zc2libGUuXG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5LCB0aGUgb25seSBleGFtcGxlIHdlIGtub3cgYWJvdXQgaXMgdXNpbmcgdGhlIHJvb3RDb250ZXh0IC0gYW5kIGluIHRoaXMgY2FzZSwgd2UgY2FuIG9idmlvdXNseSByZXVzZSB0aGF0IGV4aXN0aW5nIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gSWYgb3RoZXIgZXhhbXBsZXMgc2hvdWxkIGNvbWUgdXAsIHRoZSBiZXN0IHBvc3NpYmxlIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIHJlcXVlc3Qgc29tZSBkYXRhIHRvIGdldCBhbiBleGlzdGluZyBjb250ZXh0LiBUbyBrZWVwIHRoZVxuXHRcdFx0XHRcdC8vIHJlcXVlc3QgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUsIHdlIHNob3VsZCByZXF1ZXN0IG9ubHkgdGhlIGZpcnN0IGtleSBwcm9wZXJ0eS4gQXMgdGhpcyB3b3VsZCBpbnRyb2R1Y2UgYXN5bmNocm9uaXNtLCBhbmQgYW55d2F5XG5cdFx0XHRcdFx0Ly8gdGhlIHdob2xlIGxvZ2ljIGlzIG9ubHkgcGFydCBvZiB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZywgd2Ugd2FpdCB1bnRpbCB3ZSBoYXZlIGFuIGV4YW1wbGUgbmVlZGluZyBpdCBiZWZvcmUgaW1wbGVtZW50aW5nIHRoaXMuXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSByb290Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY3VycmVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJldmVyc2UoKTtcblx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgYmFja3dhcmRzXG5cdFx0Y29uc3Qgb3ZlcmxvYWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gcGFyZW50Q29udGV4dHMuZmluZChcblx0XHRcdChwYXJlbnRDb250ZXh0OiBDb250ZXh0KSA9PlxuXHRcdFx0XHQobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSBhcyB1bmtub3duIGFzIHN0cmluZykgPT09IG92ZXJsb2FkRW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0cmV0dXJuIG92ZXJsb2FkQ29udGV4dCB8fCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhO1xuXHR9XG5cblx0X2NyZWF0ZVNpYmxpbmdJbmZvKGN1cnJlbnRDb250ZXh0OiBDb250ZXh0LCBuZXdDb250ZXh0OiBDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdF9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkXG5cdCk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aFxuXHQgKiBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRocyBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3Rcblx0ICogQHBhcmFtIHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcGFyYW0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEBwYXJhbSByb290Q29udGV4dEluZm8gVGhlIHJvb3QgY29udGV4dCBpbmZvcm1hdGlvbiBvZiByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gZ3JvdXBJZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsXG5cdFx0ZG9Ob3RDb21wdXRlSWZSb290OiBib29sZWFuLFxuXHRcdHJvb3RDb250ZXh0SW5mbz86IFJvb3RDb250ZXh0SW5mbyxcblx0XHRncm91cElkPzogc3RyaW5nXG5cdCk6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dCA/PyByb290Q3VycmVudENvbnRleHQ7XG5cdFx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRpZiAoZG9Ob3RDb21wdXRlSWZSb290ICYmIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LCByb290Q29udGV4dEluZm8sIGdyb3VwSWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxuXG5cdGFzeW5jIGNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0bGV0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbjtcblx0XHRpZiAodGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5jaGVja0lmUmVjb21tZW5kYXRpb25zRXhpc3QoKSkge1xuXHRcdFx0cmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyh0cnVlKTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXFFQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBWTtJQUMxQ0UsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCO0lBQzdDQyxTQUFTLEdBQUdGLFNBQVMsQ0FBQ0UsU0FBUztJQUMvQkMsV0FBVyxHQUFHSCxTQUFTLENBQUNHLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0osU0FBUyxDQUFDSSxRQUFRO0lBQzdCQyxXQUFXLEdBQUdMLFNBQVMsQ0FBQ0ssV0FBVztJQUNuQ0MsV0FBVyxHQUFHQyxXQUFXLENBQUNELFdBQVc7RUF3QnRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkEsSUFRTUUsUUFBUSxXQURiQyxjQUFjLENBQUMsMkNBQTJDLENBQUMsVUFvQzFEQyxlQUFlLEVBQUUsVUFDakJDLGNBQWMsRUFBRSxVQW1QaEJELGVBQWUsRUFBRSxVQUNqQkMsY0FBYyxFQUFFLFVBK0ZoQkQsZUFBZSxFQUFFLFVBQ2pCQyxjQUFjLEVBQUUsVUF1eUJoQkQsZUFBZSxFQUFFLFVBQ2pCRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0Fv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
|