@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
|
@@ -31,6 +31,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
31
31
|
* @param [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
|
|
32
32
|
* @param [mParameters.parentControl] If specified, the dialogs are added as dependent of the parent control
|
|
33
33
|
* @param [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
|
|
34
|
+
* @param [mParameters.ignoreETag] If specified, the action is called without ETag handling
|
|
34
35
|
* @param [strictHandlingUtilities] Optional, utility flags and messages for strictHandling
|
|
35
36
|
* @returns Promise resolves with an array of response objects (TODO: to be changed)
|
|
36
37
|
*/
|
|
@@ -93,27 +94,30 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
93
94
|
/**
|
|
94
95
|
* Calls an action import.
|
|
95
96
|
*
|
|
96
|
-
* @param
|
|
97
|
-
* @param
|
|
98
|
-
* @param
|
|
99
|
-
* @param [
|
|
100
|
-
* @param [
|
|
101
|
-
* @param [
|
|
102
|
-
* @param [
|
|
103
|
-
* @param [
|
|
104
|
-
* @param [
|
|
97
|
+
* @param actionName The name of the action import to be called
|
|
98
|
+
* @param model An instance of an OData V4 model
|
|
99
|
+
* @param appComponent The AppComponent
|
|
100
|
+
* @param [parameters] Optional, can contain the following attributes:
|
|
101
|
+
* @param [parameters.parameterValues] A map of action parameter names and provided values
|
|
102
|
+
* @param [parameters.label] A human-readable label for the action
|
|
103
|
+
* @param [parameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
|
|
104
|
+
* @param [parameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
|
|
105
|
+
* @param [parameters.defaultParameters] Can contain default parameters from FLP user defaults
|
|
106
|
+
* @param [parameters.ignoreETag] If specified, the action is called without ETag handling
|
|
105
107
|
* @param [strictHandlingUtilities] Optional, utility flags and messages for strictHandling
|
|
106
108
|
* @returns Promise resolves with an array of response objects (TODO: to be changed)
|
|
107
109
|
*/
|
|
108
|
-
async function callActionImport(
|
|
109
|
-
if (!
|
|
110
|
+
async function callActionImport(actionName, model, appComponent, parameters, strictHandlingUtilities) {
|
|
111
|
+
if (!model) {
|
|
110
112
|
return Promise.reject("Action expects a model/context for execution");
|
|
111
113
|
}
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
const metaModel = model.getMetaModel(),
|
|
115
|
+
actionPath = model.bindContext(`/${actionName}`).getPath(),
|
|
116
|
+
actionNameFromModel = metaModel.getObject(actionPath).$Action,
|
|
117
|
+
unboundActionIndex = metaModel.getObject(`/${actionNameFromModel}`).findIndex(action => !action.$IsBound),
|
|
118
|
+
actionImport = metaModel.createBindingContext(`/${actionNameFromModel}/${unboundActionIndex}`);
|
|
119
|
+
parameters.isCriticalAction = await ActionRuntime.getIsActionCritical(metaModel, `${actionPath}/@$ui5.overload`);
|
|
120
|
+
return callAction(actionName, model, actionImport, appComponent, parameters, strictHandlingUtilities);
|
|
117
121
|
}
|
|
118
122
|
async function callBoundFunction(sFunctionName, context, oModel) {
|
|
119
123
|
if (!context) {
|
|
@@ -236,7 +240,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
236
240
|
selectedItems: mParameters.selectedItems
|
|
237
241
|
};
|
|
238
242
|
if (oAction.getObject("$IsBound")) {
|
|
239
|
-
|
|
243
|
+
var _mParameters$addition;
|
|
244
|
+
if ((_mParameters$addition = mParameters.additionalSideEffect) !== null && _mParameters$addition !== void 0 && _mParameters$addition.pathExpressions) {
|
|
240
245
|
oMetaModel = oModel.getMetaModel();
|
|
241
246
|
sMetaPath = oMetaModel.getMetaPath(aContexts[0].getPath());
|
|
242
247
|
sMessagesPath = ModelHelper.getMessagesPath(oMetaModel, aContexts[0].getPath());
|
|
@@ -255,14 +260,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
255
260
|
// to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it.
|
|
256
261
|
mParameters.mBindingParameters = mParameters.mBindingParameters || {};
|
|
257
262
|
if (oAction.getObject(`$ReturnType/$Type/${sMessagesPath}`) && (!mParameters.mBindingParameters.$select || !mParameters.mBindingParameters.$select.split(",").includes(sMessagesPath))) {
|
|
258
|
-
var _mParameters$
|
|
263
|
+
var _mParameters$addition2;
|
|
259
264
|
mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? `${mParameters.mBindingParameters.$select},${sMessagesPath}` : sMessagesPath;
|
|
260
265
|
// Add side effects at entity level because $select stops these being returned by the action
|
|
261
266
|
// Only if no other side effects were added for Messages
|
|
262
267
|
if (iMessageSideEffect === -1) {
|
|
263
268
|
mParameters.additionalSideEffect.pathExpressions.push("*");
|
|
264
269
|
}
|
|
265
|
-
if (((_mParameters$
|
|
270
|
+
if (((_mParameters$addition2 = mParameters.additionalSideEffect.triggerActions) === null || _mParameters$addition2 === void 0 ? void 0 : _mParameters$addition2.length) === 0 && iMessageSideEffect > -1) {
|
|
266
271
|
// no trigger action therefore no need to request messages again
|
|
267
272
|
mParameters.additionalSideEffect.pathExpressions.splice(iMessageSideEffect, 1);
|
|
268
273
|
}
|
|
@@ -288,6 +293,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
288
293
|
mParameters.control = mParameters.parentControl;
|
|
289
294
|
}
|
|
290
295
|
}
|
|
296
|
+
mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
|
|
291
297
|
if (bIsCreateAction) {
|
|
292
298
|
mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
|
|
293
299
|
}
|
|
@@ -297,7 +303,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
297
303
|
});
|
|
298
304
|
mActionExecutionParameters.isStatic = isStatic;
|
|
299
305
|
if (fnDialog) {
|
|
300
|
-
oActionPromise = fnDialog(sActionName, oAppComponent, sActionLabel, mActionExecutionParameters, aActionParameters, aParameterValues, oAction, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler, strictHandlingUtilities);
|
|
306
|
+
oActionPromise = fnDialog(sActionName, oAppComponent, sActionLabel, mActionExecutionParameters, aActionParameters, aParameterValues, oAction, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
|
|
301
307
|
return oActionPromise.then(function (oOperationResult) {
|
|
302
308
|
afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
|
|
303
309
|
resolve(oOperationResult);
|
|
@@ -321,7 +327,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
321
327
|
}
|
|
322
328
|
let oOperationResult;
|
|
323
329
|
try {
|
|
324
|
-
oOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities);
|
|
330
|
+
oOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
|
|
325
331
|
const messages = Messaging.getMessageModel().getData();
|
|
326
332
|
if (strictHandlingUtilities && strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
|
|
327
333
|
strictHandlingUtilities.delaySuccessMessages = strictHandlingUtilities.delaySuccessMessages.concat(messages);
|
|
@@ -340,7 +346,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
340
346
|
aFailedContexts.push(fail.oAction.getContext());
|
|
341
347
|
});
|
|
342
348
|
mActionExecutionParameters.aContexts = aFailedContexts;
|
|
343
|
-
const oFailedOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities);
|
|
349
|
+
const oFailedOperationResult = await _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
|
|
344
350
|
strictHandlingUtilities.strictHandlingTransitionFails = [];
|
|
345
351
|
Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
|
|
346
352
|
afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
|
|
@@ -350,7 +356,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
350
356
|
}
|
|
351
357
|
}
|
|
352
358
|
let showGenericErrorMessageForChangeSet = false;
|
|
353
|
-
if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped &&
|
|
359
|
+
if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && hasTransitionErrorsOrWarnings()) {
|
|
354
360
|
showGenericErrorMessageForChangeSet = true;
|
|
355
361
|
}
|
|
356
362
|
mParameters === null || mParameters === void 0 ? void 0 : (_mParameters$messageH = mParameters.messageHandler) === null || _mParameters$messageH === void 0 ? void 0 : _mParameters$messageH.showMessageDialog({
|
|
@@ -375,7 +381,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
375
381
|
}
|
|
376
382
|
});
|
|
377
383
|
}
|
|
378
|
-
async function confirmCriticalAction(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, aParameterValues, oActionContext, oParentControl, entitySetName, messageHandler, strictHandlingUtilities) {
|
|
384
|
+
async function confirmCriticalAction(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, aParameterValues, oActionContext, oParentControl, entitySetName, messageHandler, strictHandlingUtilities, ignoreETag) {
|
|
379
385
|
return new Promise((resolve, reject) => {
|
|
380
386
|
let boundActionName = sActionName;
|
|
381
387
|
boundActionName = boundActionName.includes(".") ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
|
|
@@ -386,7 +392,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
386
392
|
onClose: async function (sAction) {
|
|
387
393
|
if (sAction === Action.OK) {
|
|
388
394
|
try {
|
|
389
|
-
const oOperation = await _executeAction(oAppComponent, mParameters, oParentControl, messageHandler, strictHandlingUtilities);
|
|
395
|
+
const oOperation = await _executeAction(oAppComponent, mParameters, oParentControl, messageHandler, strictHandlingUtilities, ignoreETag);
|
|
390
396
|
resolve(oOperation);
|
|
391
397
|
} catch (oError) {
|
|
392
398
|
try {
|
|
@@ -403,8 +409,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
403
409
|
});
|
|
404
410
|
});
|
|
405
411
|
}
|
|
406
|
-
async function executeAPMAction(oAppComponent, mParameters, oParentControl, messageHandler, aContexts, oDialog, after412, strictHandlingUtilities) {
|
|
407
|
-
const aResult = await _executeAction(oAppComponent, mParameters, oParentControl, messageHandler, strictHandlingUtilities);
|
|
412
|
+
async function executeAPMAction(oAppComponent, mParameters, oParentControl, messageHandler, aContexts, oDialog, after412, strictHandlingUtilities, ignoreETag) {
|
|
413
|
+
const aResult = await _executeAction(oAppComponent, mParameters, oParentControl, messageHandler, strictHandlingUtilities, ignoreETag);
|
|
408
414
|
// If some entries were successful, and others have failed, the overall process is still successful. However, this was treated as rejection
|
|
409
415
|
// before, and this currently is still kept, as long as dialog handling is mixed with backend process handling.
|
|
410
416
|
// TODO: Refactor to only reject in case of overall process error.
|
|
@@ -422,7 +428,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
422
428
|
} else {
|
|
423
429
|
Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
|
|
424
430
|
let showGenericErrorMessageForChangeSet = false;
|
|
425
|
-
if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped &&
|
|
431
|
+
if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && hasTransitionErrorsOrWarnings()) {
|
|
426
432
|
showGenericErrorMessageForChangeSet = true;
|
|
427
433
|
}
|
|
428
434
|
if (messages.length) {
|
|
@@ -442,7 +448,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
442
448
|
} else if (messages.length) {
|
|
443
449
|
// BOUND TRANSITION AS PART OF SAP_MESSAGE
|
|
444
450
|
let showGenericErrorMessageForChangeSet = false;
|
|
445
|
-
if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped &&
|
|
451
|
+
if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && hasTransitionErrorsOrWarnings()) {
|
|
446
452
|
showGenericErrorMessageForChangeSet = true;
|
|
447
453
|
}
|
|
448
454
|
oDialog.attachEventOnce("afterClose", function () {
|
|
@@ -507,7 +513,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
507
513
|
const messageModel = Messaging.getMessageModel();
|
|
508
514
|
const messagesInModel = messageModel.getData();
|
|
509
515
|
const model = oControl && oControl.getModel();
|
|
510
|
-
const aBoundMessages = messageHandling.getMessages(true
|
|
516
|
+
const aBoundMessages = messageHandling.getMessages(true);
|
|
511
517
|
let genericMessage;
|
|
512
518
|
const isEditable = oControl && oControl.getModel("ui").getProperty("/isEditable");
|
|
513
519
|
const nonErrorMessageExistsInDialog = messages.findIndex(function (message) {
|
|
@@ -629,7 +635,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
629
635
|
*
|
|
630
636
|
*/
|
|
631
637
|
|
|
632
|
-
async function showActionParameterDialog(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, aParameterValues, oActionContext, oParentControl, entitySetName, messageHandler, strictHandlingUtilities) {
|
|
638
|
+
async function showActionParameterDialog(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, aParameterValues, oActionContext, oParentControl, entitySetName, messageHandler, strictHandlingUtilities, ignoreETag) {
|
|
633
639
|
const sPath = _getPath(oActionContext, sActionName),
|
|
634
640
|
metaModel = oActionContext.getModel().oModel.getMetaModel(),
|
|
635
641
|
entitySetContext = metaModel.createBindingContext(sPath),
|
|
@@ -779,7 +785,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
779
785
|
const innerParameters = Object.assign({}, mParameters);
|
|
780
786
|
innerParameters.label = sActionLabel;
|
|
781
787
|
try {
|
|
782
|
-
const aResult = await executeAPMAction(oAppComponent, innerParameters, oParentControl, messageHandler, aContexts, oDialog, false, strictHandlingUtilities);
|
|
788
|
+
const aResult = await executeAPMAction(oAppComponent, innerParameters, oParentControl, messageHandler, aContexts, oDialog, false, strictHandlingUtilities, ignoreETag);
|
|
783
789
|
actionResult = {
|
|
784
790
|
dialogCancelled: false,
|
|
785
791
|
result: aResult
|
|
@@ -797,7 +803,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
797
803
|
try {
|
|
798
804
|
failedContexts = strictHandlingUtilities.strictHandlingTransitionFails.map(fail => fail.oAction.getContext());
|
|
799
805
|
innerParameters.aContexts = failedContexts;
|
|
800
|
-
const aResult = await executeAPMAction(oAppComponent, innerParameters, oParentControl, messageHandler, aContexts, oDialog, true, strictHandlingUtilities);
|
|
806
|
+
const aResult = await executeAPMAction(oAppComponent, innerParameters, oParentControl, messageHandler, aContexts, oDialog, true, strictHandlingUtilities, ignoreETag);
|
|
801
807
|
strictHandlingUtilities.strictHandlingTransitionFails = [];
|
|
802
808
|
actionResult = {
|
|
803
809
|
dialogCancelled: false,
|
|
@@ -809,7 +815,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
809
815
|
Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
|
|
810
816
|
}
|
|
811
817
|
let showGenericErrorMessageForChangeSet = false;
|
|
812
|
-
if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped &&
|
|
818
|
+
if (mParameters.bGrouped && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && hasTransitionErrorsOrWarnings()) {
|
|
813
819
|
showGenericErrorMessageForChangeSet = true;
|
|
814
820
|
}
|
|
815
821
|
await messageHandler.showMessageDialog({
|
|
@@ -830,7 +836,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
830
836
|
} catch (oError) {
|
|
831
837
|
let showMessageDialog = true;
|
|
832
838
|
let showGenericErrorMessageForChangeSet = false;
|
|
833
|
-
if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped &&
|
|
839
|
+
if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && hasTransitionErrorsOrWarnings()) {
|
|
834
840
|
showGenericErrorMessageForChangeSet = true;
|
|
835
841
|
}
|
|
836
842
|
await messageHandler.showMessages({
|
|
@@ -1180,7 +1186,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1180
1186
|
return resourceModel.getText("C_COMMON_DIALOG_OK");
|
|
1181
1187
|
}
|
|
1182
1188
|
}
|
|
1183
|
-
async function executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId, resourceModel, messageHandler, iContextLength, current_context_index, internalOperationsPromiseResolve, internalOperationsPromiseReject, strictHandlingUtilities) {
|
|
1189
|
+
async function executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId, resourceModel, messageHandler, iContextLength, current_context_index, internalOperationsPromiseResolve, internalOperationsPromiseReject, strictHandlingUtilities, ignoreETag) {
|
|
1184
1190
|
let oActionPromise,
|
|
1185
1191
|
bEnableStrictHandling = true;
|
|
1186
1192
|
if (mParameters) {
|
|
@@ -1200,14 +1206,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1200
1206
|
}
|
|
1201
1207
|
}
|
|
1202
1208
|
if (!bEnableStrictHandling) {
|
|
1203
|
-
oActionPromise = oAction.execute(sGroupId).then(function () {
|
|
1209
|
+
oActionPromise = oAction.execute(sGroupId, ignoreETag).then(function () {
|
|
1204
1210
|
internalOperationsPromiseResolve(oAction.getBoundContext());
|
|
1205
1211
|
return oAction.getBoundContext();
|
|
1206
1212
|
});
|
|
1207
1213
|
} else {
|
|
1208
|
-
oActionPromise = bGetBoundContext ? oAction.execute(sGroupId,
|
|
1214
|
+
oActionPromise = bGetBoundContext ? oAction.execute(sGroupId, ignoreETag, operationsHelper.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters, resourceModel, current_context_index, oAction.getContext(), iContextLength, messageHandler, strictHandlingUtilities)).then(function () {
|
|
1209
1215
|
if (strictHandlingUtilities && !mParameters.bGrouped) {
|
|
1210
|
-
update412TransistionMessages(oAction, sGroupId, strictHandlingUtilities, mParameters);
|
|
1216
|
+
update412TransistionMessages(oAction, sGroupId, strictHandlingUtilities, mParameters, true);
|
|
1211
1217
|
}
|
|
1212
1218
|
internalOperationsPromiseResolve(oAction.getBoundContext());
|
|
1213
1219
|
return oAction.getBoundContext();
|
|
@@ -1217,9 +1223,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1217
1223
|
}
|
|
1218
1224
|
internalOperationsPromiseReject();
|
|
1219
1225
|
throw Constants.ActionExecutionFailed;
|
|
1220
|
-
}) : oAction.execute(sGroupId,
|
|
1226
|
+
}) : oAction.execute(sGroupId, ignoreETag, operationsHelper.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters, resourceModel, current_context_index, oAction.getContext(), iContextLength, messageHandler, strictHandlingUtilities)).then(function (result) {
|
|
1221
1227
|
if (strictHandlingUtilities && !mParameters.bGrouped) {
|
|
1222
|
-
update412TransistionMessages(oAction, sGroupId, strictHandlingUtilities, mParameters);
|
|
1228
|
+
update412TransistionMessages(oAction, sGroupId, strictHandlingUtilities, mParameters, true);
|
|
1223
1229
|
}
|
|
1224
1230
|
internalOperationsPromiseResolve(result);
|
|
1225
1231
|
return result;
|
|
@@ -1242,9 +1248,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1242
1248
|
* @param oAction Action executed
|
|
1243
1249
|
* @param sGroupId GroupId of the batch
|
|
1244
1250
|
* @param strictHandlingUtilities Utility flags and messages for strictHandling
|
|
1251
|
+
* @param mParameters Strict Handling parameters
|
|
1252
|
+
* @param onlySuccessMessages To update only successful transition messages
|
|
1245
1253
|
* @param [mParameters] Optional, contains attributes related to strickHandling
|
|
1246
1254
|
*/
|
|
1247
1255
|
function update412TransistionMessages(oAction, sGroupId, strictHandlingUtilities, mParameters) {
|
|
1256
|
+
let onlySuccessMessages = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
1248
1257
|
const messages = Messaging.getMessageModel().getData();
|
|
1249
1258
|
const {
|
|
1250
1259
|
processedMessageIds,
|
|
@@ -1266,7 +1275,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1266
1275
|
return message.getPersistent() === true && message.getType() !== MessageType.Success && !isDuplicate;
|
|
1267
1276
|
});
|
|
1268
1277
|
//update the strictHandlingUtilites with the failed transistion messages which needs to be retriggered
|
|
1269
|
-
if (transitionMessages.length) {
|
|
1278
|
+
if (!onlySuccessMessages && transitionMessages.length) {
|
|
1270
1279
|
if (mParameters !== null && mParameters !== void 0 && mParameters.internalModelContext) {
|
|
1271
1280
|
strictHandlingTransitionFails.push({
|
|
1272
1281
|
oAction: oAction,
|
|
@@ -1296,15 +1305,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1296
1305
|
*
|
|
1297
1306
|
* @returns Boolean indicating existance of messages
|
|
1298
1307
|
*/
|
|
1299
|
-
function
|
|
1300
|
-
const unBoundMsgs = messageHandling.getMessages(undefined,
|
|
1301
|
-
const boundMsgs = messageHandling.getMessages(true,
|
|
1308
|
+
function hasTransitionErrorsOrWarnings() {
|
|
1309
|
+
const unBoundMsgs = messageHandling.getMessages(undefined, true);
|
|
1310
|
+
const boundMsgs = messageHandling.getMessages(true, true);
|
|
1302
1311
|
const messages = [...unBoundMsgs, ...boundMsgs];
|
|
1303
1312
|
return messages.some(function (message) {
|
|
1304
1313
|
return message.getType() === "Error" || message.getType() === "Warning";
|
|
1305
1314
|
});
|
|
1306
1315
|
}
|
|
1307
|
-
async function _executeAction(oAppComponent, mParameters, oParentControl, messageHandler, strictHandlingUtilities) {
|
|
1316
|
+
async function _executeAction(oAppComponent, mParameters, oParentControl, messageHandler, strictHandlingUtilities, ignoreETag) {
|
|
1308
1317
|
const aContexts = mParameters.aContexts || [];
|
|
1309
1318
|
const oModel = mParameters.model;
|
|
1310
1319
|
const aActionParameters = mParameters.aActionParameters || [];
|
|
@@ -1356,7 +1365,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1356
1365
|
// For invocation grouping "isolated" need batch group per action call
|
|
1357
1366
|
sGroupId = !bGrouped ? `$auto.${current_context_index}` : actionContext.getUpdateGroupId();
|
|
1358
1367
|
mParameters.requestSideEffects = fnRequestSideEffects.bind(operations, oAppComponent, oSideEffect, mParameters, sGroupId, individualActionPromise);
|
|
1359
|
-
oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId, resourceModel, messageHandler, iContextLength, current_context_index, ointernalOperationsPromiseObject.internalOperationsPromiseResolve, ointernalOperationsPromiseObject.internalOperationsPromiseReject, strictHandlingUtilities);
|
|
1368
|
+
oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId, resourceModel, messageHandler, iContextLength, current_context_index, ointernalOperationsPromiseObject.internalOperationsPromiseResolve, ointernalOperationsPromiseObject.internalOperationsPromiseReject, strictHandlingUtilities, ignoreETag);
|
|
1360
1369
|
aActionPromises.push(oActionPromise);
|
|
1361
1370
|
individualActionPromise.push(ointernalOperationsPromiseObject.oLocalActionPromise);
|
|
1362
1371
|
fnRequestSideEffects(oAppComponent, oSideEffect, mParameters, sGroupId, individualActionPromise);
|
|
@@ -1368,7 +1377,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1368
1377
|
// For invocation grouping "isolated" need batch group per action call
|
|
1369
1378
|
sGroupId = mParameters.groupId || `apiMode${current_context_index}`;
|
|
1370
1379
|
mParameters.requestSideEffects = fnRequestSideEffects.bind(operations, oAppComponent, oSideEffect, mParameters, sGroupId, individualActionPromise);
|
|
1371
|
-
oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId, resourceModel, messageHandler, iContextLength, current_context_index, ointernalOperationsPromiseObject.internalOperationsPromiseResolve, ointernalOperationsPromiseObject.internalOperationsPromiseReject, strictHandlingUtilities);
|
|
1380
|
+
oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId, resourceModel, messageHandler, iContextLength, current_context_index, ointernalOperationsPromiseObject.internalOperationsPromiseResolve, ointernalOperationsPromiseObject.internalOperationsPromiseReject, strictHandlingUtilities, ignoreETag);
|
|
1372
1381
|
aActionPromises.push(oActionPromise);
|
|
1373
1382
|
individualActionPromise.push(ointernalOperationsPromiseObject.oLocalActionPromise);
|
|
1374
1383
|
fnRequestSideEffects(oAppComponent, oSideEffect, mParameters, sGroupId, individualActionPromise);
|
|
@@ -1391,7 +1400,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1391
1400
|
await Promise.allSettled(aChangeSetLocalPromises);
|
|
1392
1401
|
if (strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length) {
|
|
1393
1402
|
try {
|
|
1394
|
-
if (!
|
|
1403
|
+
if (!hasTransitionErrorsOrWarnings()) {
|
|
1395
1404
|
await operationsHelper.renderMessageView(mParameters, resourceModel, messageHandler, strictHandlingUtilities.strictHandlingWarningMessages, strictHandlingUtilities, aContexts.length > 1);
|
|
1396
1405
|
} else {
|
|
1397
1406
|
strictHandlingUtilities.strictHandlingPromises.forEach(function (shPromise) {
|
|
@@ -1460,14 +1469,26 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1460
1469
|
label: mParameters.label,
|
|
1461
1470
|
model: oModel
|
|
1462
1471
|
}, resourceModel, null, null, null, messageHandler, strictHandlingUtilities));
|
|
1472
|
+
const allPromise = [oActionPromise];
|
|
1473
|
+
if (mParameters.additionalSideEffect) {
|
|
1474
|
+
const context = oModel.bindContext("/unBoundAction").getBoundContext();
|
|
1475
|
+
const sideEffect = {
|
|
1476
|
+
context: context,
|
|
1477
|
+
pathExpressions: mParameters.additionalSideEffect.pathExpressions,
|
|
1478
|
+
triggerActions: mParameters.additionalSideEffect.triggerActions
|
|
1479
|
+
};
|
|
1480
|
+
operations.fnRequestSideEffects(oAppComponent, sideEffect, mParameters, sGroupId, allPromise);
|
|
1481
|
+
context.destroy();
|
|
1482
|
+
}
|
|
1463
1483
|
oModel.submitBatch(sGroupId);
|
|
1464
1484
|
// trigger onSubmitted "event"
|
|
1465
1485
|
(fnOnSubmitted || function noop() {
|
|
1466
1486
|
/**/
|
|
1467
1487
|
})(oActionPromise);
|
|
1468
|
-
return
|
|
1488
|
+
return Promise.all(allPromise).then(function (currentPromiseValues) {
|
|
1469
1489
|
// Here we ensure that we return the response we got from an unbound action to the
|
|
1470
1490
|
// caller BCP : 2270139279
|
|
1491
|
+
const currentPromiseValue = currentPromiseValues[0];
|
|
1471
1492
|
if (currentPromiseValue) {
|
|
1472
1493
|
return currentPromiseValue;
|
|
1473
1494
|
} else {
|
|
@@ -1561,8 +1582,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonU
|
|
|
1561
1582
|
getActionParameterActionName: _getActionParameterActionName,
|
|
1562
1583
|
actionParameterShowMessageCallback: actionParameterShowMessageCallback,
|
|
1563
1584
|
afterActionResolution: afterActionResolution,
|
|
1564
|
-
|
|
1585
|
+
hasTransitionErrorsOrWarnings: hasTransitionErrorsOrWarnings,
|
|
1586
|
+
fnRequestSideEffects: fnRequestSideEffects
|
|
1565
1587
|
};
|
|
1566
1588
|
return operations;
|
|
1567
1589
|
}, false);
|
|
1568
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25zdGFudHMiLCJGRUxpYnJhcnkiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJBY3Rpb24iLCJNZXNzYWdlQm94IiwiY2FsbEJvdW5kQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJjb250ZXh0cyIsIm9Nb2RlbCIsIm9BcHBDb21wb25lbnQiLCJtUGFyYW1ldGVycyIsInN0cmljdEhhbmRsaW5nVXRpbGl0aWVzIiwiaXM0MTJFeGVjdXRlZCIsInN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzIiwic3RyaWN0SGFuZGxpbmdQcm9taXNlcyIsInN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzIiwiZGVsYXlTdWNjZXNzTWVzc2FnZXMiLCJwcm9jZXNzZWRNZXNzYWdlSWRzIiwibGVuZ3RoIiwiUHJvbWlzZSIsInJlamVjdCIsImlzQ2FsbGVkV2l0aEFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiYUNvbnRleHRzIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNBY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwib0JvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJpc0NyaXRpY2FsQWN0aW9uIiwiQWN0aW9uUnVudGltZSIsImdldElzQWN0aW9uQ3JpdGljYWwiLCJleHRyYWN0U2luZ2xlUmVzdWx0IiwicmVzdWx0Iiwic3RhdHVzIiwidmFsdWUiLCJyZWFzb24iLCJjYWxsQWN0aW9uIiwidGhlbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9BY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0Iiwic0Z1bmN0aW9uUGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiX2V4ZWN1dGVGdW5jdGlvbiIsImNhbGxGdW5jdGlvbkltcG9ydCIsInJlc29sdmUiLCJvRnVuY3Rpb25JbXBvcnQiLCJvRnVuY3Rpb24iLCJzR3JvdXBJZCIsIkVycm9yIiwiZnVuY3Rpb25Ub0NhbGwiLCJvRnVuY3Rpb25Qcm9taXNlIiwiZXhlY3V0ZSIsInN1Ym1pdEJhdGNoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib0FjdGlvbiIsImJHcm91cGVkIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiQ2hhbmdlU2V0IiwiZm5EaWFsb2ciLCJvQWN0aW9uUHJvbWlzZSIsInNBY3Rpb25MYWJlbCIsImxhYmVsIiwiYlNraXBQYXJhbWV0ZXJEaWFsb2ciLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiYklzQ3JlYXRlQWN0aW9uIiwiYklzQ3JpdGljYWxBY3Rpb24iLCJzTWV0YVBhdGgiLCJzTWVzc2FnZXNQYXRoIiwiaU1lc3NhZ2VTaWRlRWZmZWN0IiwiYklzU2FtZUVudGl0eSIsIm9SZXR1cm5UeXBlIiwiYlZhbHVlc1Byb3ZpZGVkRm9yQWxsUGFyYW1ldGVycyIsImFjdGlvbkRlZmluaXRpb24iLCJhQWN0aW9uUGFyYW1ldGVycyIsImdldEFjdGlvblBhcmFtZXRlcnMiLCJiQWN0aW9uTmVlZHNQYXJhbWV0ZXJEaWFsb2ciLCIkTmFtZSIsImFQYXJhbWV0ZXJWYWx1ZXMiLCJwYXJhbWV0ZXJWYWx1ZXMiLCJvQ29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzdGFydHVwUGFyYW1ldGVycyIsIl92YWx1ZXNQcm92aWRlZEZvckFsbFBhcmFtZXRlcnMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwiY29uZmlybUNyaXRpY2FsQWN0aW9uIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJmbk9uU3VibWl0dGVkIiwib25TdWJtaXR0ZWQiLCJmbk9uUmVzcG9uc2UiLCJvblJlc3BvbnNlIiwiYWN0aW9uTmFtZSIsIm1vZGVsIiwiYkdldEJvdW5kQ29udGV4dCIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsInNlbGVjdGVkSXRlbXMiLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsInBhdGhFeHByZXNzaW9ucyIsIk1vZGVsSGVscGVyIiwiZ2V0TWVzc2FnZXNQYXRoIiwiZmluZEluZGV4IiwiZXhwIiwiJGlzQ29sbGVjdGlvbiIsImdldE1vZGVsIiwiJFR5cGUiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCIkc2VsZWN0Iiwic3BsaXQiLCJpbmNsdWRlcyIsInB1c2giLCJ0cmlnZ2VyQWN0aW9ucyIsInNwbGljZSIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiaXNDcmVhdGVBY3Rpb24iLCJiT2JqZWN0UGFnZSIsImRpc2FibGVTdHJpY3RIYW5kbGluZyIsImdyb3VwSWQiLCJjb250cm9sSWQiLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJpc1N0YXRpYyIsIiRQYXJhbWV0ZXIiLCJzb21lIiwiYVBhcmFtZXRlciIsIiRFbnRpdHlTZXRQYXRoIiwiJElzQm91bmQiLCJlbnRpdHlTZXROYW1lIiwibWVzc2FnZUhhbmRsZXIiLCJvT3BlcmF0aW9uUmVzdWx0IiwiYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uIiwiY2F0Y2giLCJpIiwiZmluZCIsImVsZW1lbnQiLCJuYW1lIiwiX2V4ZWN1dGVBY3Rpb24iLCJtZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJjb25jYXQiLCJzdHJpY3RIYW5kbGluZ0ZhaWxzIiwiYUZhaWxlZENvbnRleHRzIiwiZm9yRWFjaCIsImZhaWwiLCJnZXRDb250ZXh0Iiwib0ZhaWxlZE9wZXJhdGlvblJlc3VsdCIsImFkZE1lc3NhZ2VzIiwic2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQiLCJoYXNFcnJvcnNPcldhcm5pbmdzIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJvbkJlZm9yZVNob3dNZXNzYWdlIiwiYU1lc3NhZ2VzIiwic2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4iLCJhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrIiwidW5kZWZpbmVkIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJvQWN0aW9uQ29udGV4dCIsIm9QYXJlbnRDb250cm9sIiwiYm91bmRBY3Rpb25OYW1lIiwic3VmZml4UmVzb3VyY2VLZXkiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsInNDb25maXJtYXRpb25UZXh0IiwiZ2V0VGV4dCIsImNvbmZpcm0iLCJvbkNsb3NlIiwic0FjdGlvbiIsIk9LIiwib09wZXJhdGlvbiIsIm9FcnJvciIsImUiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJleGVjdXRlQVBNQWN0aW9uIiwib0RpYWxvZyIsImFmdGVyNDEyIiwiYVJlc3VsdCIsIm9TaW5nbGVSZXN1bHQiLCJhdHRhY2hFdmVudE9uY2UiLCJpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW4iLCJpc09wZW4iLCJzZWxlY3RlZENvbnRleHRzIiwiZ2V0UHJvcGVydHkiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiaXNBIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkRlbGV0ZUhlbHBlciIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwic2hvd01lc3NhZ2VCb3giLCJvQ29udHJvbCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsInVuYm91bmRNZXNzYWdlcyIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRUYXJnZXRzIiwiQVBEbWVzc2FnZXMiLCJhY3Rpb25QYXJhbSIsIkFQRE1lc3NhZ2UiLCJpc0FQRFRhcmdldCIsImVycm9yVGFyZ2V0c0luQVBEIiwiaGFzQ2hhbmdlU2V0TW9kaWZpZWRNZXNzYWdlIiwic01lc3NhZ2UiLCJzRGVzY3JpcHRpb25UZXh0IiwibWVzc2FnZU1vZGVsIiwibWVzc2FnZXNJbk1vZGVsIiwiYUJvdW5kTWVzc2FnZXMiLCJtZXNzYWdlSGFuZGxpbmciLCJnZXRNZXNzYWdlcyIsImdlbmVyaWNNZXNzYWdlIiwiaXNFZGl0YWJsZSIsIm5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nIiwiZ2V0VHlwZSIsIm5vbkVycm9yTWVzc2FnZUV4aXN0c0luTW9kZWwiLCJzZXRNZXNzYWdlIiwiZ2V0TWVzc2FnZSIsIk1lc3NhZ2UiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJ0YXJnZXQiLCJwZXJzaXN0ZW50IiwiZGVzY3JpcHRpb24iLCJjb2RlIiwidW5zaGlmdCIsImNsb3NlIiwiZGVzdHJveSIsImZpbHRlcmVkTWVzc2FnZXMiLCJiSXNBUERPcGVuIiwiZm5HZXRNZXNzYWdlU3VidGl0bGUiLCJzZXRNZXNzYWdlU3VidGl0bGUiLCJiaW5kIiwic2hvd0NoYW5nZVNldEVycm9yRGlhbG9nIiwic1BhdGgiLCJfZ2V0UGF0aCIsIm1ldGFNb2RlbCIsImVudGl0eVNldENvbnRleHQiLCJzQWN0aW9uTmFtZVBhdGgiLCJhY3Rpb25OYW1lQ29udGV4dCIsInNGcmFnbWVudE5hbWUiLCJhY3Rpb25QYXJhbWV0ZXJJbmZvcyIsIl9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyIiwicGFyYW1ldGVyIiwiYWxsTWVzc2FnZXMiLCJnZW5lcmF0ZSIsInJlbGV2YW50TWVzc2FnZXMiLCJtc2ciLCJnZXRDb250cm9sSWRzIiwiaWQiLCJyZW1vdmVNZXNzYWdlcyIsIm9Db250cm9sbGVyIiwiaGFuZGxlQ2hhbmdlIiwib0V2ZW50IiwiZmllbGQiLCJnZXRTb3VyY2UiLCJhY3Rpb25QYXJhbWV0ZXJJbmZvIiwidmFsaWRhdGlvblByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJoYXNFcnJvciIsImVycm9yIiwiX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIm9QYXJhbWV0ZXJNb2RlbCIsIkpTT05Nb2RlbCIsIiRkaXNwbGF5TW9kZSIsImNyZWF0ZWRGcmFnbWVudCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJhY3Rpb24iLCJlbnRpdHlTZXQiLCJtb2RlbHMiLCJhRnVuY3Rpb25QYXJhbXMiLCJDb21tb25VdGlscyIsInNldFVzZXJEZWZhdWx0cyIsIm9EaWFsb2dDb250ZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJtYXAiLCJhY3Rpb25QYXJhbWV0ZXIiLCJFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJpc011bHRpVmFsdWUiLCJhY3Rpb25SZXN1bHQiLCJkaWFsb2dDYW5jZWxsZWQiLCJidXR0b25Mb2NrIiwiRGlhbG9nIiwidGl0bGUiLCJjb250ZW50IiwiZXNjYXBlSGFuZGxlciIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidGV4dCIsIl9nZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lIiwicHJlc3MiLCJfdmFsaWRhdGVQcm9wZXJ0aWVzIiwiQnVzeUxvY2tlciIsImxvY2siLCJmYWlsZWRDb250ZXh0cyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInZQYXJhbWV0ZXJWYWx1ZSIsImFsbE51bGxQYXJhbWV0ZXJzIiwib1BhcmFtZXRlckNvbnRleHQiLCJvT3BlcmF0aW9uQmluZGluZyIsImdldFBhcmFtZXRlckNvbnRleHQiLCJhTVZGQ29udGVudCIsImFLZXlWYWx1ZXMiLCJqIiwiS2V5Iiwic2V0UHJvcGVydHkiLCJVaU1vZGVsQ29uc3RhbnRzIiwiRG9jdW1lbnRNb2RpZmllZCIsImlubmVyUGFyYW1ldGVycyIsIk9iamVjdCIsImFzc2lnbiIsImlzTG9ja2VkIiwidW5sb2NrIiwic2hvd01lc3NhZ2VzIiwibWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2siLCJzaG93TWVzc2FnZVBhcmFtZXRlcnMiLCJlbmRCdXR0b24iLCJiZWZvcmVPcGVuIiwib0Nsb25lRXZlbnQiLCJnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uIiwiZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2ciLCJzQmluZGluZ1BhcmFtZXRlciIsInNCb3VuZEZ1bmN0aW9uTmFtZSIsInBhcmFtZXRlck1vZGVsRGF0YSIsInByZWZpbGxQYXJhbWV0ZXIiLCJzUGFyYW1OYW1lIiwidlBhcmFtRGVmYXVsdFZhbHVlIiwiJFBhdGgiLCJ2UGFyYW1WYWx1ZSIsInJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eSIsInJlcXVlc3RQcm9wZXJ0eSIsInNQYXRoRm9yQ29udGV4dCIsImluZGV4T2YiLCJyZXBsYWNlIiwicGFyYW1OYW1lIiwiYk5vUG9zc2libGVWYWx1ZSIsIkxvZyIsImJMYXRlUHJvcGVydHlFcnJvciIsImhhc093blByb3BlcnR5IiwiZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwic0FjdGlvblBhcmFtZXRlckFubm90YXRpb25QYXRoIiwiZ2V0UGFyYW1ldGVyUGF0aCIsIm9QYXJhbWV0ZXJBbm5vdGF0aW9ucyIsIm9QYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlIiwidlBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFQcmVmaWxsUGFyYW1Qcm9taXNlcyIsImFsbCIsImFFeGVjRnVuY3Rpb25Qcm9taXNlcyIsIm9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiRlBNSGVscGVyIiwiYWN0aW9uV3JhcHBlciIsImFQcm9taXNlcyIsImN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSIsImZ1bmN0aW9uUGFyYW1zIiwib0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Iiwic0RpYWxvZ1BhcmFtTmFtZSIsInZQYXJhbWV0ZXJQcm92aWRlZFZhbHVlIiwic2V0UGFyYW1ldGVyIiwiYkVycm9yRm91bmQiLCJvVmFsdWUiLCJzVGV4dCIsIndhcm5pbmciLCJjb250ZW50V2lkdGgiLCJmbkFzeW5jQmVmb3JlT3BlbiIsImFQYXJhbWV0ZXJzIiwib0NvbnRleHRPYmplY3QiLCJyZXF1ZXN0T2JqZWN0IiwiZ2V0SXRlbXMiLCJnZXRWYWx1ZSIsImFmdGVyQ2xvc2UiLCJzZXRNb2RlbCIsImJpbmRFbGVtZW50IiwicGF0aCIsIm9NVkZNb2RlbCIsImdldEJpbmRpbmciLCJhdHRhY2hDaGFuZ2UiLCJhZGREZXBlbmRlbnQiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldE9iamVjdEJpbmRpbmciLCJvcGVuIiwic2xpY2UiLCJzRW50aXR5U2V0TmFtZSIsImFBY3Rpb25OYW1lIiwic0tleSIsImJSZXNvdXJjZUtleUV4aXN0cyIsImNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cyIsImV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMiLCJpQ29udGV4dExlbmd0aCIsImN1cnJlbnRfY29udGV4dF9pbmRleCIsImludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlIiwiaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCIsImJFbmFibGVTdHJpY3RIYW5kbGluZyIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwib3BlcmF0aW9uc0hlbHBlciIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsIm9wZXJhdGlvbnMiLCJ1cGRhdGU0MTJUcmFuc2lzdGlvbk1lc3NhZ2VzIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwidHJhbnNpdGlvbk1lc3NhZ2VzIiwiaXNEdXBsaWNhdGUiLCJnZXRJZCIsIlN1Y2Nlc3MiLCJnZXRQZXJzaXN0ZW50IiwiY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbiIsIm9Mb2NhbEFjdGlvblByb21pc2UiLCJ1bkJvdW5kTXNncyIsImJvdW5kTXNncyIsInNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFBY3Rpb25Qcm9taXNlcyIsIm9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0IiwiZm5FeGVjdXRlQWN0aW9uIiwiYWN0aW9uQ29udGV4dCIsIm9TaWRlRWZmZWN0IiwiaW5kaXZpZHVhbEFjdGlvblByb21pc2UiLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZm5SZXF1ZXN0U2lkZUVmZmVjdHMiLCJhbGxTZXR0bGVkIiwiZm5FeGVjdXRlU2luZ2xlQWN0aW9uIiwiZm5FeGVjdXRlQ2hhbmdlc2V0IiwiYUNoYW5nZVNldExvY2FsUHJvbWlzZXMiLCJub29wIiwicmVuZGVyTWVzc2FnZVZpZXciLCJzaFByb21pc2UiLCJzZXREYXRhIiwiZm5IYW5kbGVSZXN1bHRzIiwiZm5FeGVjdXRlU2VxdWVudGlhbGx5IiwiY29udGV4dHNUb0V4ZWN1dGUiLCJwcm9jZXNzT25lQWN0aW9uIiwiYWN0aW9uSW5kZXgiLCJpbml0aWFsVGFibGVDb250ZXh0IiwiZ2V0Um93QmluZGluZyIsImdldEhlYWRlckNvbnRleHQiLCJyZWR1Y2UiLCJwcm9taXNlIiwiZmluYWxseSIsImN1cnJlbnRQcm9taXNlVmFsdWUiLCJhY3Rpb25QYXJhbWV0ZXJzIiwiYUxvY2FsUHJvbWlzZSIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJvTG9jYWxQcm9taXNlIiwic1RyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwidmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzIiwiZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZmFjYWRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IFNob3dNZXNzYWdlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCBEZWxldGVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCB0eXBlIHsgRGlhbG9nJEJlZm9yZU9wZW5FdmVudCB9IGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZEl0ZW0gZnJvbSBcInNhcC91aS9tZGMvZmllbGQvTXVsdGlWYWx1ZUZpZWxkSXRlbVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwiLi4vLi4vLi4vQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgb3BlcmF0aW9uc0hlbHBlciwgeyB0eXBlIFN0cmljdEhhbmRsaW5nUGFyYW1ldGVycywgdHlwZSBTdHJpY3RIYW5kbGluZ1V0aWxpdGllcyB9IGZyb20gXCIuLi8uLi8uLi9vcGVyYXRpb25zSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwiLi4vLi4vTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uUGFyYW1ldGVyLCBBY3Rpb25QYXJhbWV0ZXJJbmZvIH0gZnJvbSBcIi4vX2ludGVybmFsXCI7XG5pbXBvcnQgeyBfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlciwgX3ZhbGlkYXRlUHJvcGVydGllcyB9IGZyb20gXCIuL19pbnRlcm5hbFwiO1xuXG5jb25zdCBDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHRJbnZvY2F0aW9uR3JvdXBpbmcgPSBGRUxpYnJhcnkuSW52b2NhdGlvbkdyb3VwaW5nO1xuY29uc3QgQWN0aW9uID0gTWVzc2FnZUJveC5BY3Rpb247XG5cbmV4cG9ydCB0eXBlIEFjdGlvblJlc3BvbnNlID0gdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD5bXTtcblxuLyoqXG4gKiBDYWxscyBhIGJvdW5kIGFjdGlvbiBmb3Igb25lIG9yIG11bHRpcGxlIGNvbnRleHRzLlxuICpcbiAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIGNvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBPRGF0YSBNb2RlbFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzXSBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzXSBBIG1hcCBvZiBiaW5kaW5nIHBhcmFtZXRlcnMgdGhhdCB3b3VsZCBiZSBwYXJ0IG9mICRzZWxlY3QgYW5kICRleHBhbmQgY29taW5nIGZyb20gc2lkZSBlZmZlY3RzIGZvciBib3VuZCBhY3Rpb25zXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0XSBBcnJheSBvZiBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgaW4gYWRkaXRpb24gdG8gYWN0dWFsIHRhcmdldCBwcm9wZXJ0aWVzIG9mIHRoZSBzaWRlIGVmZmVjdFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXSBJZiBzZXQgYW5kIGlmIHBhcmFtZXRlcnMgZXhpc3QgdGhlIHVzZXIgcmV0cmlldmVzIGEgZGlhbG9nIHRvIGZpbGwgaW4gcGFyYW1ldGVycywgaWYgYWN0aW9uUGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZXkgYXJlIHNob3duIHRvIHRoZSB1c2VyXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiBDaGFuZ2VzZXQgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCBJc29sYXRlZCB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHMsIGRlZmF1bHRzIHRvIElzb2xhdGVkXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xdIElmIHNwZWNpZmllZCwgdGhlIGRpYWxvZ3MgYXJlIGFkZGVkIGFzIGRlcGVuZGVudCBvZiB0aGUgcGFyZW50IGNvbnRyb2xcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dF0gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuICogQHBhcmFtIFtzdHJpY3RIYW5kbGluZ1V0aWxpdGllc10gT3B0aW9uYWwsIHV0aWxpdHkgZmxhZ3MgYW5kIG1lc3NhZ2VzIGZvciBzdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGxCb3VuZEFjdGlvbihcblx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0Y29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogQ2FsbEFjdGlvblBhcmFtZXRlcnMsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzPzogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcbik6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0aWYgKCFzdHJpY3RIYW5kbGluZ1V0aWxpdGllcykge1xuXHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzID0ge1xuXHRcdFx0aXM0MTJFeGVjdXRlZDogZmFsc2UsXG5cdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlsczogW10sXG5cdFx0XHRzdHJpY3RIYW5kbGluZ1Byb21pc2VzOiBbXSxcblx0XHRcdHN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzOiBbXSxcblx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzOiBbXSxcblx0XHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHM6IFtdXG5cdFx0fTtcblx0fVxuXHRpZiAoIWNvbnRleHRzIHx8IGNvbnRleHRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vSW4gRnJlZXN0eWxlIGFwcHMgYm91bmQgYWN0aW9ucyBjYW4gaGF2ZSBubyBjb250ZXh0XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQm91bmQgYWN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbnRleHRcIik7XG5cdH1cblx0Ly8gdGhpcyBtZXRob2QgZWl0aGVyIGFjY2VwdHMgc2luZ2xlIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHNcblx0Ly8gVE9ETzogUmVmYWN0b3IgdG8gYW4gdW5hbWJpZ3VvcyBBUElcblx0Y29uc3QgaXNDYWxsZWRXaXRoQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbnRleHRzKTtcblxuXHQvLyBpbiBjYXNlIG9mIHNpbmdsZSBjb250ZXh0IHdyYXAgaW50byBhbiBhcnJheSBmb3IgY2FsbGVkIG1ldGhvZHMgKGVzcC4gY2FsbEFjdGlvbilcblx0bVBhcmFtZXRlcnMuYUNvbnRleHRzID0gaXNDYWxsZWRXaXRoQXJyYXkgPyBjb250ZXh0cyA6IFtjb250ZXh0c107XG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHQvLyBBbmFseXppbmcgbWV0YU1vZGVsUGF0aCBmb3IgYWN0aW9uIG9ubHkgZnJvbSBmaXJzdCBjb250ZXh0IHNlZW1zIHdlaXJkLCBidXQgcHJvYmFibHkgd29ya3MgaW4gYWxsIGV4aXN0aW5nIHN6ZW5hcmlvcyAtIGlmIHNldmVyYWwgY29udGV4dHMgYXJlIHBhc3NlZCwgdGhleSBwcm9iYWJseVxuXHRcdC8vIGJlbG9uZyB0byB0aGUgc2FtZSBtZXRhbW9kZWxwYXRoLiBUT0RPOiBDaGVjaywgd2hldGhlciB0aGlzIGNhbiBiZSBpbXByb3ZlZCAvIHN6ZW5hcmlvcyB3aXRoIGRpZmZlcmVudCBtZXRhTW9kZWxQYXRocyBtaWdodCBleGlzdFxuXHRcdHNBY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0uZ2V0UGF0aCgpKX0vJHtzQWN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEFjdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7c0FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgKSE7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGgsIG1QYXJhbWV0ZXJzLmFDb250ZXh0cyk7XG5cblx0Ly8gUHJvbWlzZSByZXR1cm5lZCBieSBjYWxsQWN0aW9uIGN1cnJlbnRseSBpcyByZWplY3RlZCBpbiBjYXNlIG9mIGV4ZWN1dGlvbiBmb3IgbXVsdGlwbGUgY29udGV4dHMgcGFydGx5IGZhaWxpbmcuIFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgKHNvbWUgZmFpbGluZyBjb250ZXh0cyBkbyBub3QgbWVhblxuXHQvLyB0aGF0IGZ1bmN0aW9uIGRpZCBub3QgZnVsZmlsbCBpdHMgdGFzayksIGJ1dCBhcyB0aGlzIGlzIGEgYmlnZ2VyIHJlZmFjdG9yaW5nLCBmb3IgdGhlIHRpbWUgYmVpbmcgd2UgbmVlZCB0byBkZWFsIHdpdGggdGhhdCBhdCB0aGUgY2FsbGluZyBwbGFjZSAoaS5lLiBoZXJlKVxuXHQvLyA9PiBwcm92aWRlIHRoZSBzYW1lIGhhbmRsZXIgKG1hcHBpbmcgYmFjayBmcm9tIGFycmF5IHRvIHNpbmdsZSByZXN1bHQvZXJyb3IgaWYgbmVlZGVkKSBmb3IgcmVzb2x2ZWQvcmVqZWN0ZWQgY2FzZVxuXHRjb25zdCBleHRyYWN0U2luZ2xlUmVzdWx0ID0gZnVuY3Rpb24gKHJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gc2luZ2xlIGFjdGlvbiBjb3VsZCBiZSByZXNvbHZlZCBvciByZWplY3RlZFxuXHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0WzBdLnZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRpYWxvZyBjYW5jZWxsYXRpb24sIG5vIGFycmF5IGlzIHJldHVybmVkID0+IHRocm93IHRoZSByZXN1bHQuXG5cdFx0XHQvLyBJZGVhbGx5LCBkaWZmZXJlbnRpYXRpbmcgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaGVyZSA9PiBUT0RPOiBGaW5kIGJldHRlciBzb2x1dGlvbiB3aGVuIHNlcGFyYXRpbmcgZGlhbG9nIGhhbmRsaW5nIChzaW5nbGUgb2JqZWN0IHdpdGggc2luZ2xlIHJlc3VsdCkgZnJvbSBiYWNrZW5kXG5cdFx0XHQvLyBleGVjdXRpb24gKHBvdGVudGlhbGx5IG11bHRpcGxlIG9iamVjdHMpXG5cdFx0XHR0aHJvdyByZXN1bHRbMF0ucmVhc29uIHx8IHJlc3VsdDtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kQWN0aW9uLCBvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycywgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMpLnRoZW4oXG5cdFx0KHJlc3VsdCkgPT4ge1xuXHRcdFx0aWYgKGlzQ2FsbGVkV2l0aEFycmF5KSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZXh0cmFjdFNpbmdsZVJlc3VsdChyZXN1bHQgYXMgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQ+W10pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0KHJlc3VsdCkgPT4ge1xuXHRcdFx0aWYgKGlzQ2FsbGVkV2l0aEFycmF5KSB7XG5cdFx0XHRcdHRocm93IHJlc3VsdDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBleHRyYWN0U2luZ2xlUmVzdWx0KHJlc3VsdCBhcyBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dD5bXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufVxuLyoqXG4gKiBDYWxscyBhbiBhY3Rpb24gaW1wb3J0LlxuICpcbiAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIGltcG9ydCB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBvTW9kZWwgQW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ddIElmIHNldCBhbmQgaWYgcGFyYW1ldGVycyBleGlzdCB0aGUgdXNlciByZXRyaWV2ZXMgYSBkaWFsb2cgdG8gZmlsbCBpbiBwYXJhbWV0ZXJzLCBpZiBhY3Rpb25QYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhleSBhcmUgc2hvd24gdG8gdGhlIHVzZXJcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub25TdWJtaXR0ZWRdIEZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBvbmNlIHRoZSBhY3Rpb25zIGFyZSBzdWJtaXR0ZWQgd2l0aCBhbiBhcnJheSBvZiBwcm9taXNlc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEBwYXJhbSBbc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNdIE9wdGlvbmFsLCB1dGlsaXR5IGZsYWdzIGFuZCBtZXNzYWdlcyBmb3Igc3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsQWN0aW9uSW1wb3J0KFxuXHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHtcblx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdO1xuXHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0b25TdWJtaXR0ZWQ6IEZ1bmN0aW9uO1xuXHRcdG9uUmVzcG9uc2U6IEZ1bmN0aW9uO1xuXHRcdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjtcblx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0c2VsZWN0ZWRJdGVtcz86IE9EYXRhVjRDb250ZXh0W107XG5cdH0gJiB7XG5cdFx0aXNDcml0aWNhbEFjdGlvbj86IGJvb2xlYW47XG5cdH0sXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzPzogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcbik6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0aWYgKCFvTW9kZWwpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBY3Rpb24gZXhwZWN0cyBhIG1vZGVsL2NvbnRleHQgZm9yIGV4ZWN1dGlvblwiKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNBY3Rpb25QYXRoID0gb01vZGVsLmJpbmRDb250ZXh0KGAvJHtzQWN0aW9uTmFtZX1gKS5nZXRQYXRoKCksXG5cdFx0b0FjdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvblBhdGgpIS5nZXRPYmplY3QoXCIkQWN0aW9uXCIpfS8wYCk7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgYCR7c0FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkYCk7XG5cdHJldHVybiBjYWxsQWN0aW9uKHNBY3Rpb25OYW1lLCBvTW9kZWwsIG9BY3Rpb25JbXBvcnQsIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzLCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyk7XG59XG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQsIG9Nb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0aWYgKCFjb250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQm91bmQgZnVuY3Rpb25zIGFsd2F5cyByZXF1aXJlcyBhIGNvbnRleHRcIik7XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRnVuY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSl9LyR7c0Z1bmN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEZ1bmN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKTtcblx0cmV0dXJuIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRGdW5jdGlvbiwgY29udGV4dCk7XG59XG50eXBlIFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzID0ge1xuXHRmbk9uU3VibWl0dGVkOiBGdW5jdGlvbjtcblx0Zm5PblJlc3BvbnNlOiBGdW5jdGlvbjtcblx0YWN0aW9uTmFtZTogc3RyaW5nO1xuXHRtb2RlbDogT0RhdGFNb2RlbDtcblx0YUFjdGlvblBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcltdO1xuXHRiR2V0Qm91bmRDb250ZXh0PzogYm9vbGVhbjtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0c2VsZWN0ZWRJdGVtczogT0RhdGFWNENvbnRleHRbXTtcblx0YUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0bUJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRhZGRpdGlvbmFsU2lkZUVmZmVjdD86IEFjdGlvblNpZGVFZmZlY3RzVHlwZTtcblx0Ykdyb3VwZWQ/OiBib29sZWFuO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0YklzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Z3JvdXBJZD86IHN0cmluZztcblx0aXNTdGF0aWM/OiBib29sZWFuO1xuXHRjb250cm9sPzogQ29udHJvbDtcblx0b0RpYWxvZz86IERpYWxvZztcblx0cmVxdWVzdFNpZGVFZmZlY3RzPzogRnVuY3Rpb247XG5cdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlPzogRnVuY3Rpb247XG59O1xuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIGltcG9ydC5cbiAqXG4gKiBAcGFyYW0gc0Z1bmN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0gb01vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIHY0IG1vZGVsXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGxGdW5jdGlvbkltcG9ydChzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8dm9pZCB8IE9EYXRhVjRDb250ZXh0PiB7XG5cdGlmICghc0Z1bmN0aW9uTmFtZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBDb250ZXh0IHwgbnVsbCxcblx0Y29udGV4dD86IENvbnRleHRcbik6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0bGV0IHNHcm91cElkO1xuXHRpZiAoIW9GdW5jdGlvbiB8fCAhb0Z1bmN0aW9uLmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdH1cblx0bGV0IGZ1bmN0aW9uVG9DYWxsOiBPRGF0YUNvbnRleHRCaW5kaW5nO1xuXHRpZiAoY29udGV4dCkge1xuXHRcdGZ1bmN0aW9uVG9DYWxsID0gb01vZGVsLmJpbmRDb250ZXh0KGAke2NvbnRleHQuZ2V0UGF0aCgpfS8ke3NGdW5jdGlvbk5hbWV9KC4uLilgKTtcblx0XHRzR3JvdXBJZCA9IFwiZnVuY3Rpb25Hcm91cFwiO1xuXHR9IGVsc2Uge1xuXHRcdGZ1bmN0aW9uVG9DYWxsID0gb01vZGVsLmJpbmRDb250ZXh0KGAvJHtzRnVuY3Rpb25OYW1lfSguLi4pYCk7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uSW1wb3J0XCI7XG5cdH1cblx0Y29uc3Qgb0Z1bmN0aW9uUHJvbWlzZSA9IGZ1bmN0aW9uVG9DYWxsLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRyZXR1cm4gb0Z1bmN0aW9uUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb25Ub0NhbGwuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdH0pO1xufVxudHlwZSBDYWxsQWN0aW9uUGFyYW1ldGVycyA9IHtcblx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXTtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRvblN1Ym1pdHRlZDogRnVuY3Rpb247XG5cdG9uUmVzcG9uc2U6IEZ1bmN0aW9uO1xuXHRwYXJlbnRDb250cm9sOiBWaWV3O1xuXHRjb250cm9sPzogQ29udHJvbDtcblx0YklzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyO1xuXHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdGlzQ3JpdGljYWxBY3Rpb24/OiBib29sZWFuO1xuXHRjb250cm9sSWQ/OiBzdHJpbmc7XG59ICYge1xuXHRiR2V0Qm91bmRDb250ZXh0PzogYm9vbGVhbjtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xufSAmIHtcblx0Ykdyb3VwZWQ/OiBib29sZWFuO1xuXHRhQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRzZWxlY3RlZEl0ZW1zPzogT0RhdGFWNENvbnRleHRbXTtcblx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdG1CaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0Z3JvdXBJZD86IHN0cmluZztcbn07XG5hc3luYyBmdW5jdGlvbiBjYWxsQWN0aW9uKFxuXHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BY3Rpb246IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcz86IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG4pOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdGlmICghc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMpIHtcblx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyA9IHtcblx0XHRcdGlzNDEyRXhlY3V0ZWQ6IGZhbHNlLFxuXHRcdFx0c3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHM6IFtdLFxuXHRcdFx0c3RyaWN0SGFuZGxpbmdQcm9taXNlczogW10sXG5cdFx0XHRzdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlczogW10sXG5cdFx0XHRkZWxheVN1Y2Nlc3NNZXNzYWdlczogW10sXG5cdFx0XHRwcm9jZXNzZWRNZXNzYWdlSWRzOiBbXVxuXHRcdH07XG5cdH1cblx0bVBhcmFtZXRlcnMuYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgPT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXQ7XG5cdHJldHVybiBuZXcgUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4oYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHJlc29sdmU6ICh2YWx1ZTogQWN0aW9uUmVzcG9uc2UpID0+IHZvaWQsXG5cdFx0cmVqZWN0OiAocmVhc29uPzogRXJyb3IgfCBBY3Rpb25SZXNwb25zZSkgPT4gdm9pZFxuXHQpIHtcblx0XHRsZXQgZm5EaWFsb2c6XG5cdFx0XHR8ICgoXG5cdFx0XHRcdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0c0FjdGlvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJbXSxcblx0XHRcdFx0XHRhUGFyYW1ldGVyVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdG9BY3Rpb246IENvbnRleHQsXG5cdFx0XHRcdFx0cGFyZW50Q29udHJvbDogVmlldyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzOiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllcyB8IHVuZGVmaW5lZFxuXHRcdFx0ICApID0+IFByb21pc2U8dW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXT4pXG5cdFx0XHR8IG51bGw7XG5cdFx0bGV0IG9BY3Rpb25Qcm9taXNlO1xuXHRcdC8vbGV0IGZhaWxlZEFjdGlvblByb21pc2U6IGFueTtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRjb25zdCBiU2tpcFBhcmFtZXRlckRpYWxvZyA9IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2c7XG5cdFx0Y29uc3QgYUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzO1xuXHRcdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0XHRjb25zdCBiSXNDcml0aWNhbEFjdGlvbiA9IG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb247XG5cdFx0bGV0IG9NZXRhTW9kZWw7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDogc3RyaW5nO1xuXHRcdGxldCBpTWVzc2FnZVNpZGVFZmZlY3Q7XG5cdFx0bGV0IGJJc1NhbWVFbnRpdHk7XG5cdFx0bGV0IG9SZXR1cm5UeXBlO1xuXHRcdGxldCBiVmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IGFjdGlvbkRlZmluaXRpb24gPSBvQWN0aW9uLmdldE9iamVjdCgpIGFzIE1ldGFNb2RlbEFjdGlvbjtcblx0XHRpZiAoIW9BY3Rpb24gfHwgIW9BY3Rpb24uZ2V0T2JqZWN0KCkpIHtcblx0XHRcdHJldHVybiByZWplY3QobmV3IEVycm9yKGBBY3Rpb24gJHtzQWN0aW9uTmFtZX0gbm90IGZvdW5kYCkpO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgYWN0aW9uXG5cdFx0Y29uc3QgYUFjdGlvblBhcmFtZXRlcnMgPSBnZXRBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb24pO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBoYXMgcGFyYW1ldGVycyBhbmQgd291bGQgbmVlZCBhIHBhcmFtZXRlciBkaWFsb2dcblx0XHQvLyBUaGUgcGFyYW1ldGVyIFJlc3VsdElzQWN0aXZlRW50aXR5IGlzIGFsd2F5cyBoaWRkZW4gaW4gdGhlIGRpYWxvZyEgSGVuY2UgaWZcblx0XHQvLyB0aGlzIGlzIHRoZSBvbmx5IHBhcmFtZXRlciwgdGhpcyBpcyB0cmVhdGVkIGFzIG5vIHBhcmFtZXRlciBoZXJlIGJlY2F1c2UgdGhlXG5cdFx0Ly8gZGlhbG9nIHdvdWxkIGJlIGVtcHR5IVxuXHRcdC8vIEZJWE1FOiBTaG91bGQgb25seSBpZ25vcmUgdGhpcyBpZiB0aGlzIGlzIGEgJ2NyZWF0ZScgYWN0aW9uLCBvdGhlcndpc2UgaXQgaXMganVzdCBzb21lIG5vcm1hbCBwYXJhbWV0ZXIgdGhhdCBoYXBwZW5zIHRvIGhhdmUgdGhpcyBuYW1lXG5cdFx0Y29uc3QgYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nID1cblx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiYgIShhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDEgJiYgYUFjdGlvblBhcmFtZXRlcnNbMF0uJE5hbWUgPT09IFwiUmVzdWx0SXNBY3RpdmVFbnRpdHlcIik7XG5cblx0XHQvLyBQcm92aWRlZCB2YWx1ZXMgZm9yIHRoZSBhY3Rpb24gcGFyYW1ldGVycyBmcm9tIGludm9rZUFjdGlvbiBjYWxsXG5cdFx0Y29uc3QgYVBhcmFtZXRlclZhbHVlcyA9IG1QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcztcblxuXHRcdC8vIERldGVybWluZSBzdGFydHVwIHBhcmFtZXRlcnMgaWYgcHJvdmlkZWRcblx0XHRjb25zdCBvQ29tcG9uZW50RGF0YSA9IG9BcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdGNvbnN0IG9TdGFydHVwUGFyYW1ldGVycyA9IChvQ29tcG9uZW50RGF0YSAmJiBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge307XG5cblx0XHQvLyBJbiBjYXNlIGFuIGFjdGlvbiBwYXJhbWV0ZXIgaXMgbmVlZGVkLCBhbmQgd2Ugc2hhbGwgc2tpcCB0aGUgZGlhbG9nLCBjaGVjayBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgcGFyYW1ldGVyc1xuXHRcdGlmIChiQWN0aW9uTmVlZHNQYXJhbWV0ZXJEaWFsb2cgJiYgYlNraXBQYXJhbWV0ZXJEaWFsb2cpIHtcblx0XHRcdGJWYWx1ZXNQcm92aWRlZEZvckFsbFBhcmFtZXRlcnMgPSBfdmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzKFxuXHRcdFx0XHQhIWJJc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBEZXBlbmRpbmcgb24gdGhlIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBkYXRhLCBlaXRoZXIgc2V0IGEgZGlhbG9nIG9yIGxlYXZlIGl0IGVtcHR5IHdoaWNoXG5cdFx0Ly8gd2lsbCBsZWFkIHRvIGRpcmVjdCBleGVjdXRpb24gb2YgdGhlIGFjdGlvbiB3aXRob3V0IGEgZGlhbG9nXG5cdFx0Zm5EaWFsb2cgPSBudWxsO1xuXHRcdGlmIChiQWN0aW9uTmVlZHNQYXJhbWV0ZXJEaWFsb2cpIHtcblx0XHRcdGlmICghKGJTa2lwUGFyYW1ldGVyRGlhbG9nICYmIGJWYWx1ZXNQcm92aWRlZEZvckFsbFBhcmFtZXRlcnMpKSB7XG5cdFx0XHRcdGZuRGlhbG9nID0gc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZztcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGJJc0NyaXRpY2FsQWN0aW9uKSB7XG5cdFx0XHRmbkRpYWxvZyA9IGNvbmZpcm1Dcml0aWNhbEFjdGlvbjtcblx0XHR9XG5cblx0XHRjb25zdCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMgPSB7XG5cdFx0XHRmbk9uU3VibWl0dGVkOiBtUGFyYW1ldGVycy5vblN1Ym1pdHRlZCxcblx0XHRcdGZuT25SZXNwb25zZTogbVBhcmFtZXRlcnMub25SZXNwb25zZSxcblx0XHRcdGFjdGlvbk5hbWU6IHNBY3Rpb25OYW1lLFxuXHRcdFx0bW9kZWw6IG9Nb2RlbCxcblx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzOiBhQWN0aW9uUGFyYW1ldGVycyxcblx0XHRcdGJHZXRCb3VuZENvbnRleHQ6IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdHNlbGVjdGVkSXRlbXM6IG1QYXJhbWV0ZXJzLnNlbGVjdGVkSXRlbXMhXG5cdFx0fTtcblx0XHRpZiAob0FjdGlvbi5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucykge1xuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGFDb250ZXh0cyFbMF0uZ2V0UGF0aCgpKTtcblx0XHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBhQ29udGV4dHMhWzBdLmdldFBhdGgoKSkhO1xuXG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0aU1lc3NhZ2VTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLmZpbmRJbmRleChmdW5jdGlvbiAoZXhwKSB7XG5cdFx0XHRcdFx0XHQvLyAnKicgZWZmZWN0aXZlbHkgaW5jbHVkZXMgdGhlIG1lc3NhZ2VzIHBhdGggaWYgdGhlcmUgaXMgb25lXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHlwZW9mIGV4cCA9PT0gXCJzdHJpbmdcIiAmJiAoZXhwID09PSBzTWVzc2FnZXNQYXRoIHx8IGV4cCA9PT0gXCIqXCIpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIFNBUF9NZXNzYWdlcyBieSBkZWZhdWx0IGlmIG5vdCBhbm5vdGF0ZWQgYnkgc2lkZSBlZmZlY3RzLCBhY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgY29sbGVjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyB0aGUgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIHR5cGVcblx0XHRcdFx0XHRvUmV0dXJuVHlwZSA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFJldHVyblR5cGVcIik7XG5cdFx0XHRcdFx0YklzU2FtZUVudGl0eSA9XG5cdFx0XHRcdFx0XHRvUmV0dXJuVHlwZSAmJiAhb1JldHVyblR5cGUuJGlzQ29sbGVjdGlvbiAmJiBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0T2JqZWN0KHNNZXRhUGF0aCkuJFR5cGUgPT09IG9SZXR1cm5UeXBlLiRUeXBlO1xuXG5cdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xIHx8IGJJc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBtZXNzYWdlIHBhdGggaXMgYW5ub3RhdGVkIGFzIHNpZGUgZWZmZWN0LiBBcyB0aGVyZSdzIG5vIGJpbmRpbmcgZm9yIGl0IGFuZCB0aGUgbW9kZWwgZG9lcyBjdXJyZW50bHkgbm90IGFsbG93XG5cdFx0XHRcdFx0XHQvLyB0byBhZGQgaXQgYXQgYSBsYXRlciBwb2ludCBvZiB0aW1lIHdlIGhhdmUgdG8gdGFrZSBjYXJlIGl0J3MgcGFydCBvZiB0aGUgJHNlbGVjdCBvZiB0aGUgUE9TVCwgdGhlcmVmb3JlIG1vdmluZyBpdC5cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLmdldE9iamVjdChgJFJldHVyblR5cGUvJFR5cGUvJHtzTWVzc2FnZXNQYXRofWApICYmXG5cdFx0XHRcdFx0XHRcdCghbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgfHxcblx0XHRcdFx0XHRcdFx0XHQhbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3Quc3BsaXQoXCIsXCIpLmluY2x1ZGVzKHNNZXNzYWdlc1BhdGgpKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3Rcblx0XHRcdFx0XHRcdFx0XHQ/IGAke21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0fSwke3NNZXNzYWdlc1BhdGh9YFxuXHRcdFx0XHRcdFx0XHRcdDogc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0XHRcdFx0Ly8gQWRkIHNpZGUgZWZmZWN0cyBhdCBlbnRpdHkgbGV2ZWwgYmVjYXVzZSAkc2VsZWN0IHN0b3BzIHRoZXNlIGJlaW5nIHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0XHRcdFx0XHRcdFx0Ly8gT25seSBpZiBubyBvdGhlciBzaWRlIGVmZmVjdHMgd2VyZSBhZGRlZCBmb3IgTWVzc2FnZXNcblx0XHRcdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMucHVzaChcIipcIik7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCA9PT0gMCAmJiBpTWVzc2FnZVNpZGVFZmZlY3QgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG5vIHRyaWdnZXIgYWN0aW9uIHRoZXJlZm9yZSBubyBuZWVkIHRvIHJlcXVlc3QgbWVzc2FnZXMgYWdhaW5cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuc3BsaWNlKGlNZXNzYWdlU2lkZUVmZmVjdCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzID0gYUNvbnRleHRzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJHcm91cGVkID0gbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nID09PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZTtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZyA9IG1QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmdyb3VwSWQgPSBtUGFyYW1ldGVycy5ncm91cElkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiSXNDcmVhdGVBY3Rpb24pIHtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbiA9IGJJc0NyZWF0ZUFjdGlvbjtcblx0XHR9XG5cdFx0Ly9jaGVjayBmb3Igc2tpcHBpbmcgc3RhdGljIGFjdGlvbnNcblx0XHRjb25zdCBpc1N0YXRpYyA9IChhY3Rpb25EZWZpbml0aW9uLiRQYXJhbWV0ZXIgfHwgW10pLnNvbWUoXG5cdFx0XHQoYVBhcmFtZXRlcjoge1xuXHRcdFx0XHQkVHlwZTogc3RyaW5nO1xuXHRcdFx0XHQkTmFtZTogc3RyaW5nO1xuXHRcdFx0XHQkTnVsbGFibGU/OiBib29sZWFuO1xuXHRcdFx0XHQkTWF4TGVuZ3RoPzogbnVtYmVyO1xuXHRcdFx0XHQkUHJlY2lzaW9uPzogbnVtYmVyO1xuXHRcdFx0XHQkU2NhbGU/OiBudW1iZXI7XG5cdFx0XHRcdCRpc0NvbGxlY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0fSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdCgoYWN0aW9uRGVmaW5pdGlvbi4kRW50aXR5U2V0UGF0aCAmJiBhY3Rpb25EZWZpbml0aW9uLiRFbnRpdHlTZXRQYXRoID09PSBhUGFyYW1ldGVyLiROYW1lKSB8fFxuXHRcdFx0XHRcdFx0YWN0aW9uRGVmaW5pdGlvbi4kSXNCb3VuZCkgJiZcblx0XHRcdFx0XHRhUGFyYW1ldGVyLiRpc0NvbGxlY3Rpb25cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHQpO1xuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmlzU3RhdGljID0gaXNTdGF0aWM7XG5cdFx0aWYgKGZuRGlhbG9nKSB7XG5cdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGZuRGlhbG9nKFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0c0FjdGlvbkxhYmVsLFxuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdG9BY3Rpb24sXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0KTtcblx0XHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob09wZXJhdGlvblJlc3VsdDogdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSk6IHZvaWQge1xuXHRcdFx0XHRcdGFmdGVyQWN0aW9uUmVzb2x1dGlvbihtUGFyYW1ldGVycywgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsIGFjdGlvbkRlZmluaXRpb24pO1xuXHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9PcGVyYXRpb25SZXN1bHQ6IHVua25vd24pIHtcblx0XHRcdFx0XHRyZWplY3Qob09wZXJhdGlvblJlc3VsdCBhcyBFcnJvciB8IEFjdGlvblJlc3BvbnNlKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRha2Ugb3ZlciBhbGwgcHJvdmlkZWQgcGFyYW1ldGVyIHZhbHVlcyBhbmQgY2FsbCB0aGUgYWN0aW9uLlxuXHRcdFx0Ly8gVGhpcyBzaGFsbCBvbmx5IGhhcHBlbiBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMsIG90aGVyd2lzZSB0aGUgcGFyYW1ldGVyIGRpYWxvZyBzaGFsbCBiZSBzaG93biB3aGljaCBpcyBlbnN1cmVkIGVhcmxpZXJcblx0XHRcdGlmIChhUGFyYW1ldGVyVmFsdWVzKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgaSBpbiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzW2ldLnZhbHVlID0gYVBhcmFtZXRlclZhbHVlcz8uZmluZChcblx0XHRcdFx0XHRcdChlbGVtZW50KSA9PiBlbGVtZW50Lm5hbWUgPT09IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lXG5cdFx0XHRcdFx0KT8udmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoY29uc3QgaSBpbiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzW2ldLnZhbHVlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW1xuXHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWVcblx0XHRcdFx0XHRdPy5bMF0gYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV0IG9PcGVyYXRpb25SZXN1bHQ6IHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W107XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRvT3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgX2V4ZWN1dGVBY3Rpb24oXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29uc3QgbWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiZcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZnRlckFjdGlvblJlc29sdXRpb24obVBhcmFtZXRlcnMsIG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLCBhY3Rpb25EZWZpbml0aW9uKTtcblx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRyZWplY3Qob09wZXJhdGlvblJlc3VsdCBhcyBFcnJvciB8IEFjdGlvblJlc3BvbnNlKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJlxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGggJiZcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMhLmxlbmd0aCA+IDFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHN0cmljdEhhbmRsaW5nRmFpbHMgPSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscztcblx0XHRcdFx0XHRcdGNvbnN0IGFGYWlsZWRDb250ZXh0cyA9IFtdIGFzIE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ0ZhaWxzLmZvckVhY2goZnVuY3Rpb24gKGZhaWw6IHsgb0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZzsgZ3JvdXBJZDogc3RyaW5nIH0pOiB2b2lkIHtcblx0XHRcdFx0XHRcdFx0YUZhaWxlZENvbnRleHRzLnB1c2goZmFpbC5vQWN0aW9uLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFGYWlsZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IG9GYWlsZWRPcGVyYXRpb25SZXN1bHQgPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzID0gW107XG5cdFx0XHRcdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMpO1xuXHRcdFx0XHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9GYWlsZWRPcGVyYXRpb25SZXN1bHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9GYWlsZWRPcGVyYXRpb25SZXN1bHQpIHtcblx0XHRcdFx0XHRcdHJlamVjdChcblx0XHRcdFx0XHRcdFx0b0ZhaWxlZE9wZXJhdGlvblJlc3VsdCBhc1xuXHRcdFx0XHRcdFx0XHRcdHwgRXJyb3Jcblx0XHRcdFx0XHRcdFx0XHR8IE9EYXRhVjRDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0fCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHR8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgc2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0XHQobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgaGFzRXJyb3JzT3JXYXJuaW5ncyhvTW9kZWwpKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0bVBhcmFtZXRlcnM/Lm1lc3NhZ2VIYW5kbGVyPy5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0Y29udHJvbDogbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnM/LmNvbnRyb2wsXG5cdFx0XHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZTogZnVuY3Rpb24gKGFNZXNzYWdlczogTWVzc2FnZVtdLCBzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdGFDb250ZXh0cyEsXG5cdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0YU1lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbixcblx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0czogbVBhcmFtZXRlcnMuYUNvbnRleHRzLFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzQWN0aW9uTGFiZWxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcykge1xuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzID0ge1xuXHRcdFx0XHRcdFx0aXM0MTJFeGVjdXRlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlsczogW10sXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1Byb21pc2VzOiBbXSxcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzOiBbXSxcblx0XHRcdFx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzOiBbXSxcblx0XHRcdFx0XHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHM6IFtdXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm1Dcml0aWNhbEFjdGlvbihcblx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRzQWN0aW9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQWN0aW9uUGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyW10sXG5cdGFQYXJhbWV0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gfCB1bmRlZmluZWQsXG5cdG9BY3Rpb25Db250ZXh0OiBDb250ZXh0LFxuXHRvUGFyZW50Q29udHJvbDogVmlldyxcblx0ZW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzPzogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcbik6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRsZXQgYm91bmRBY3Rpb25OYW1lID0gc0FjdGlvbk5hbWU7XG5cdFx0Ym91bmRBY3Rpb25OYW1lID0gYm91bmRBY3Rpb25OYW1lLmluY2x1ZGVzKFwiLlwiKVxuXHRcdFx0PyBib3VuZEFjdGlvbk5hbWUuc3BsaXQoXCIuXCIpW2JvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIikubGVuZ3RoIC0gMV1cblx0XHRcdDogYm91bmRBY3Rpb25OYW1lO1xuXHRcdGNvbnN0IHN1ZmZpeFJlc291cmNlS2V5ID0gYm91bmRBY3Rpb25OYW1lICYmIGVudGl0eVNldE5hbWUgPyBgJHtlbnRpdHlTZXROYW1lfXwke2JvdW5kQWN0aW9uTmFtZX1gIDogXCJcIjtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvUGFyZW50Q29udHJvbCk7XG5cdFx0Y29uc3Qgc0NvbmZpcm1hdGlvblRleHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX09QRVJBVElPTlNfQUNUSU9OX0NPTkZJUk1fTUVTU0FHRVwiLCB1bmRlZmluZWQsIHN1ZmZpeFJlc291cmNlS2V5KTtcblxuXHRcdE1lc3NhZ2VCb3guY29uZmlybShzQ29uZmlybWF0aW9uVGV4dCwge1xuXHRcdFx0b25DbG9zZTogYXN5bmMgZnVuY3Rpb24gKHNBY3Rpb246IHN0cmluZykge1xuXHRcdFx0XHRpZiAoc0FjdGlvbiA9PT0gQWN0aW9uLk9LKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9PcGVyYXRpb24gPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb24pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQVBNQWN0aW9uKFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0b1BhcmVudENvbnRyb2w6IFZpZXcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0YUNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRvRGlhbG9nOiBEaWFsb2csXG5cdGFmdGVyNDEyOiBib29sZWFuLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcz86IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+IHtcblx0Y29uc3QgYVJlc3VsdCA9IGF3YWl0IF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzLCBvUGFyZW50Q29udHJvbCwgbWVzc2FnZUhhbmRsZXIsIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzKTtcblx0Ly8gSWYgc29tZSBlbnRyaWVzIHdlcmUgc3VjY2Vzc2Z1bCwgYW5kIG90aGVycyBoYXZlIGZhaWxlZCwgdGhlIG92ZXJhbGwgcHJvY2VzcyBpcyBzdGlsbCBzdWNjZXNzZnVsLiBIb3dldmVyLCB0aGlzIHdhcyB0cmVhdGVkIGFzIHJlamVjdGlvblxuXHQvLyBiZWZvcmUsIGFuZCB0aGlzIGN1cnJlbnRseSBpcyBzdGlsbCBrZXB0LCBhcyBsb25nIGFzIGRpYWxvZyBoYW5kbGluZyBpcyBtaXhlZCB3aXRoIGJhY2tlbmQgcHJvY2VzcyBoYW5kbGluZy5cblx0Ly8gVE9ETzogUmVmYWN0b3IgdG8gb25seSByZWplY3QgaW4gY2FzZSBvZiBvdmVyYWxsIHByb2Nlc3MgZXJyb3IuXG5cdC8vIEZvciB0aGUgdGltZSBiZWluZzogbWFwIHRvIG9sZCBsb2dpYyB0byByZWplY3QgaWYgYXQgbGVhc3Qgb25lIGVudHJ5IGhhcyBmYWlsZWRcblx0Ly8gVGhpcyBjaGVjayBpcyBvbmx5IGRvbmUgZm9yIGJvdW5kIGFjdGlvbnMgPT4gYUNvbnRleHRzIG5vdCBlbXB0eVxuXHRpZiAobVBhcmFtZXRlcnMuYUNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLmFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0aWYgKFxuXHRcdFx0KGFSZXN1bHQgYXMgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pPy5zb21lKFxuXHRcdFx0XHQob1NpbmdsZVJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KSA9PiBvU2luZ2xlUmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBhUmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiYgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoKSB7XG5cdFx0aWYgKCFhZnRlcjQxMikge1xuXHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMgPSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcy5jb25jYXQobWVzc2FnZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMpO1xuXHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIGhhc0Vycm9yc09yV2FybmluZ3MobVBhcmFtZXRlcnMubW9kZWwpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gQk9VTkQgVFJBTlNJVElPTiBBUyBQQVJUIE9GIFNBUF9NRVNTQUdFXG5cdFx0XHRcdG9EaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZTogZnVuY3Rpb24gKGFNZXNzYWdlczogTWVzc2FnZVtdLCBzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHRcdGFNZXNzYWdlcyxcblx0XHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbixcblx0XHRcdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbnRyb2w6IG1QYXJhbWV0ZXJzLmNvbnRyb2wsXG5cdFx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0czogbVBhcmFtZXRlcnMuYUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0c0FjdGlvbk5hbWU6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcblx0XHQvLyBCT1VORCBUUkFOU0lUSU9OIEFTIFBBUlQgT0YgU0FQX01FU1NBR0Vcblx0XHRsZXQgc2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSBmYWxzZTtcblx0XHRpZiAoXG5cdFx0XHQobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiYgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdQcm9taXNlcy5sZW5ndGgpIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgaGFzRXJyb3JzT3JXYXJuaW5ncyhtUGFyYW1ldGVycy5tb2RlbCkpXG5cdFx0KSB7XG5cdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCA9IHRydWU7XG5cdFx0fVxuXHRcdG9EaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdGlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nT3BlbjogbVBhcmFtZXRlcnM/Lm9EaWFsb2c/LmlzT3BlbigpLFxuXHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoYU1lc3NhZ2VzOiBNZXNzYWdlW10sIHNob3dNZXNzYWdlUGFyYW1ldGVyc0luOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0b0RpYWxvZyxcblx0XHRcdFx0XHRcdGFNZXNzYWdlcyxcblx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLFxuXHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb250cm9sOiBtUGFyYW1ldGVycy5jb250cm9sLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0czogbVBhcmFtZXRlcnMuYUNvbnRleHRzLFxuXHRcdFx0XHRzQWN0aW9uTmFtZTogbVBhcmFtZXRlcnMubGFiZWxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIGFSZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFmdGVyQWN0aW9uUmVzb2x1dGlvbihcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzLFxuXHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdGFjdGlvbkRlZmluaXRpb246IE1ldGFNb2RlbEFjdGlvblxuKTogdm9pZCB7XG5cdGlmIChcblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCAmJlxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJlxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyAmJlxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cy5sZW5ndGggJiZcblx0XHRhY3Rpb25EZWZpbml0aW9uLiRJc0JvdW5kXG5cdCkge1xuXHRcdGxldCBzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdFx0Ly9jaGVjayBmb3Igc2tpcHBpbmcgc3RhdGljIGFjdGlvbnNcblx0XHRjb25zdCBpc1N0YXRpYyA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmlzU3RhdGljO1xuXHRcdGlmICghaXNTdGF0aWMpIHtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIikgfHwgW107XG5cdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRKU09OLnBhcnNlKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wpIHtcblx0XHRcdGNvbnN0IGNvbnRyb2wgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sO1xuXHRcdFx0aWYgKGNvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGNvbnRyb2wuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRKU09OLnBhcnNlKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly91cGRhdGUgZGVsZXRlIGJ1dHRvblxuXHRcdERlbGV0ZUhlbHBlci51cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyhtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdG9EaWFsb2c6IERpYWxvZyB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZXM6IE1lc3NhZ2VbXSxcblx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycyxcblx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQ6IGJvb2xlYW5cbik6IFNob3dNZXNzYWdlUGFyYW1ldGVycyB7XG5cdGxldCBzaG93TWVzc2FnZUJveCA9IHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLnNob3dNZXNzYWdlQm94LFxuXHRcdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4uc2hvd01lc3NhZ2VEaWFsb2c7XG5cdGNvbnN0IG9Db250cm9sID0gbVBhcmFtZXRlcnMuY29udHJvbDtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0Y29uc3QgdW5ib3VuZE1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0gPT09IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBBUERtZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbiAobWVzc2FnZSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZXNzYWdlLmdldFRhcmdldHMgJiZcblx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMobVBhcmFtZXRlcnMuYWN0aW9uTmFtZSkgJiZcblx0XHRcdG1QYXJhbWV0ZXJzPy5hQWN0aW9uUGFyYW1ldGVycz8uc29tZShmdW5jdGlvbiAoYWN0aW9uUGFyYW0pIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMoYWN0aW9uUGFyYW0uJE5hbWUpO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9KTtcblx0QVBEbWVzc2FnZXM/LmZvckVhY2goZnVuY3Rpb24gKEFQRE1lc3NhZ2UpIHtcblx0XHQoQVBETWVzc2FnZSBhcyB1bmtub3duIGFzIHsgaXNBUERUYXJnZXQ6IGJvb2xlYW4gfSkuaXNBUERUYXJnZXQgPSB0cnVlO1xuXHR9KTtcblxuXHRjb25zdCBlcnJvclRhcmdldHNJbkFQRCA9IEFQRG1lc3NhZ2VzLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcblx0bGV0IGhhc0NoYW5nZVNldE1vZGlmaWVkTWVzc2FnZSA9IGZhbHNlO1xuXHRpZiAoc2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgJiYgIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0aGFzQ2hhbmdlU2V0TW9kaWZpZWRNZXNzYWdlID0gdHJ1ZTtcblx0XHRsZXQgc01lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfRVJST1JfTUVTU0FHRVNfVEVYVFwiKTtcblx0XHRsZXQgc0Rlc2NyaXB0aW9uVGV4dCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9FUlJPUl9NRVNTQUdFU19ERVRBSUxfVEVYVFwiKTtcblx0XHRjb25zdCBtZXNzYWdlTW9kZWwgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZXNJbk1vZGVsID0gbWVzc2FnZU1vZGVsLmdldERhdGEoKTtcblx0XHRjb25zdCBtb2RlbCA9IG9Db250cm9sICYmIChvQ29udHJvbC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpO1xuXHRcdGNvbnN0IGFCb3VuZE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtb2RlbCk7XG5cdFx0bGV0IGdlbmVyaWNNZXNzYWdlO1xuXHRcdGNvbnN0IGlzRWRpdGFibGUgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpIS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXG5cdFx0Y29uc3Qgbm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5EaWFsb2cgPSBtZXNzYWdlcy5maW5kSW5kZXgoZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJFcnJvclwiIHx8IG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIldhcm5pbmdcIjtcblx0XHR9KTtcblx0XHRjb25zdCBub25FcnJvck1lc3NhZ2VFeGlzdHNJbk1vZGVsID0gbWVzc2FnZXNJbk1vZGVsLmZpbmRJbmRleChmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIkVycm9yXCIgfHwgbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiV2FybmluZ1wiO1xuXHRcdH0pO1xuXG5cdFx0aWYgKFxuXHRcdFx0bm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5EaWFsb2cgIT09IDEgJiZcblx0XHRcdG5vbkVycm9yTWVzc2FnZUV4aXN0c0luTW9kZWwgIT09IC0xICYmXG5cdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMgJiZcblx0XHRcdG1QYXJhbWV0ZXJzLmFDb250ZXh0cy5sZW5ndGggPiAxXG5cdFx0KSB7XG5cdFx0XHRpZiAobWVzc2FnZXNJbk1vZGVsLmxlbmd0aCA9PT0gMSAmJiBhQm91bmRNZXNzYWdlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0aWYgKGlzRWRpdGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0bWVzc2FnZXNJbk1vZGVsWzBdLnNldE1lc3NhZ2UoXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfU0lOR0xFX0VSUk9SX01FU1NBR0VfVEVYVFwiKSArXG5cdFx0XHRcdFx0XHRcdFwiXFxuXFxuXCIgK1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlc0luTW9kZWxbMF0uZ2V0TWVzc2FnZSgpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzTWVzc2FnZSA9IGlzRWRpdGFibGVcblx0XHRcdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX1NJTkdMRV9FUlJPUl9NRVNTQUdFX1RFWFRfRURJVFwiKVxuXHRcdFx0XHRcdFx0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfU0lOR0xFX0VSUk9SX01FU1NBR0VfVEVYVFwiKTtcblx0XHRcdFx0XHRzRGVzY3JpcHRpb25UZXh0ID0gXCJcIjtcblx0XHRcdFx0XHRnZW5lcmljTWVzc2FnZSA9IG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdG1lc3NhZ2U6IHNNZXNzYWdlLFxuXHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHR0YXJnZXQ6IFwiXCIsXG5cdFx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNEZXNjcmlwdGlvblRleHQsXG5cdFx0XHRcdFx0XHRjb2RlOiBcIkZFX0NVU1RPTV9NRVNTQUdFX0NIQU5HRVNFVF9BTExfRkFJTEVEXCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRtZXNzYWdlcy51bnNoaWZ0KGdlbmVyaWNNZXNzYWdlKTtcblx0XHRcdFx0XHRpZiAobWVzc2FnZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IHRydWU7XG5cdFx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Z2VuZXJpY01lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0bWVzc2FnZTogc01lc3NhZ2UsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNEZXNjcmlwdGlvblRleHQsXG5cdFx0XHRcdFx0Y29kZTogXCJGRV9DVVNUT01fTUVTU0FHRV9DSEFOR0VTRVRfQUxMX0ZBSUxFRFwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtZXNzYWdlcy51bnNoaWZ0KGdlbmVyaWNNZXNzYWdlKTtcblx0XHRcdFx0aWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKG9EaWFsb2cgJiYgb0RpYWxvZy5pc09wZW4oKSAmJiBhQ29udGV4dHMubGVuZ3RoICE9PSAwICYmICFtUGFyYW1ldGVycy5pc1N0YXRpYykge1xuXHRcdGlmICghbVBhcmFtZXRlcnMuYkdyb3VwZWQpIHtcblx0XHRcdC8vaXNvbGF0ZWRcblx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSB8fCAhZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdFx0Ly8gZG9lcyBub3QgbWF0dGVyIGlmIGVycm9yIGlzIGluIEFQRCBvciBub3QsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb250ZXh0cyBzZWxlY3RlZCBvciBpZiB0aGUgZXJyb3IgaXMgbm90IHRoZSBBUEQsIHdlIGNsb3NlIGl0LlxuXHRcdFx0XHQvLyBUT0RPOiBEaWxhb2cgaGFuZGxpbmcgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mIG1lc3NhZ2UgaGFuZGxpbmcuIFJlZmFjdG9yIGFjY29yZGluZ2x5IC0gZGlhbG9nIHNob3VsZCBub3QgYmUgbmVlZGVkIGluc2lkZSB0aGlzIG1ldGhvZCAtIG5laXRoZXJcblx0XHRcdFx0Ly8gdG8gYXNrIHdoZXRoZXIgaXQncyBvcGVuLCBub3IgdG8gY2xvc2UvZGVzdHJveSBpdCFcblx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0Ly9jaGFuZ2VzZXRcblx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXHRsZXQgZmlsdGVyZWRNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG5cdGNvbnN0IGJJc0FQRE9wZW4gPSBvRGlhbG9nICYmIG9EaWFsb2cuaXNPcGVuKCk7XG5cdGlmICghaGFzQ2hhbmdlU2V0TW9kaWZpZWRNZXNzYWdlKSB7XG5cdFx0aWYgKFxuXHRcdFx0bWVzc2FnZXMubGVuZ3RoID09PSAxICYmXG5cdFx0XHRtZXNzYWdlc1swXS5nZXRUYXJnZXRzICYmXG5cdFx0XHRtZXNzYWdlc1swXS5nZXRUYXJnZXRzKCk/LlswXSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRtZXNzYWdlc1swXS5nZXRUYXJnZXRzKCk/LlswXSAhPT0gXCJcIlxuXHRcdCkge1xuXHRcdFx0aWYgKChvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpIS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpID09PSBmYWxzZSkgfHwgIW9Db250cm9sKSB7XG5cdFx0XHRcdC8vIE9QIGVkaXQgb3IgTFJcblx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSAhZXJyb3JUYXJnZXRzSW5BUEQ7XG5cdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKG9Db250cm9sICYmIG9Db250cm9sLmdldE1vZGVsKFwidWlcIikhLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgPT09IHRydWUpIHtcblx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSBmYWxzZTtcblx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG9Db250cm9sKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSEuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0aWYgKGJJc0FQRE9wZW4gJiYgZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9Db250cm9sLmdldE1vZGVsKFwidWlcIikhLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgPT09IHRydWUpIHtcblx0XHRcdFx0aWYgKCFiSXNBUERPcGVuICYmIGVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSB0cnVlO1xuXHRcdFx0XHRcdGZpbHRlcmVkTWVzc2FnZXMgPSB1bmJvdW5kTWVzc2FnZXMuY29uY2F0KEFQRG1lc3NhZ2VzKTtcblx0XHRcdFx0fSBlbHNlIGlmICghYklzQVBET3BlbiAmJiB1bmJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gZXJyb3IgdGFyZ2V0cyBpbiBBUEQgPT4gdGhlcmUgaXMgYXRsZWFzdCBvbmUgYm91bmQgbWVzc2FnZS4gSWYgdGhlcmUgYXJlIHVuYm91bmQgbWVzc2FnZXMsIGRpYWxvZyBtdXN0IGJlIHNob3duLlxuXHRcdFx0XHRcdC8vIGZvciBkcmFmdCBlbnRpdHksIHdlIGFscmVhZHkgY2xvc2VkIHRoZSBBUERcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0bGV0IGZuR2V0TWVzc2FnZVN1YnRpdGxlO1xuXHRpZiAob0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRmbkdldE1lc3NhZ2VTdWJ0aXRsZSA9IG1lc3NhZ2VIYW5kbGluZy5zZXRNZXNzYWdlU3VidGl0bGUuYmluZCh7fSwgb0NvbnRyb2wsIGFDb250ZXh0cyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzaG93TWVzc2FnZUJveDogc2hvd01lc3NhZ2VCb3gsXG5cdFx0c2hvd01lc3NhZ2VEaWFsb2c6IHNob3dNZXNzYWdlRGlhbG9nLFxuXHRcdGZpbHRlcmVkTWVzc2FnZXM6IGZpbHRlcmVkTWVzc2FnZXMubGVuZ3RoID8gZmlsdGVyZWRNZXNzYWdlcyA6IG1lc3NhZ2VzLFxuXHRcdGZuR2V0TWVzc2FnZVN1YnRpdGxlOiBmbkdldE1lc3NhZ2VTdWJ0aXRsZSxcblx0XHRzaG93Q2hhbmdlU2V0RXJyb3JEaWFsb2c6IG1QYXJhbWV0ZXJzLmJHcm91cGVkXG5cdH07XG59XG5cbi8qXG4gKiBDdXJyZW50bHksIHRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBkaWFsb2cgYW5kIGV4ZWN1dGluZyB0aGUgYWN0aW9uLiBUaGUgcHJvbWlzZSByZXR1cm5lZCBpcyBwZW5kaW5nIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQsIGFzIHdlbGwgYXMgd2hpbGUgdGhlXG4gKiBiYWNrLWVuZCByZXF1ZXN0IGlzIHJ1bm5pbmcuIFRoZSBwcm9taXNlIGlzIHJlamVjdGVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgZGlhbG9nIGFuZCBhbHNvIHdoZW4gdGhlIGJhY2stZW5kIHJlcXVlc3QgZmFpbHMuXG4gKiBUT0RPOiBSZWZhY3RvcmluZzogU2VwYXJhdGUgZGlhbG9nIGhhbmRsaW5nIGZyb20gYmFja2VuZCBwcm9jZXNzaW5nLiBEaWFsb2cgaGFuZGxpbmcgc2hvdWxkIHJldHVybiBhIFByb21pc2UgcmVzb2x2aW5nIHRvIHBhcmFtZXRlcnMgdG8gYmUgcHJvdmlkZWQgdG8gYmFja2VuZC4gSWYgZGlhbG9nIGlzXG4gKiBjYW5jZWxsZWQsIHRoYXQgcHJvbWlzZSBjYW4gYmUgcmVqZWN0ZWQuIE1ldGhvZCByZXNwb25zaWJsZSBmb3IgYmFja2VuZCBwcm9jZXNzaW5nIG5lZWQgdG8gZGVhbCB3aXRoIG11bHRpcGxlIGNvbnRleHRzIC0gaS5lLiBpdCBzaG91bGQgZWl0aGVyIHJldHVybiBhbiBhcnJheSBvZiBQcm9taXNlcyBvclxuICogYSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheS4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGF0IFByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIGFsc28gd2hlbiBzb21lIG9yIGV2ZW4gYWxsIGNvbnRleHRzIGZhaWxlZCBpbiBiYWNrZW5kIC0gdGhlIG92ZXJhbGwgcHJvY2VzcyBzdGlsbCB3YXNcbiAqIHN1Y2Nlc3NmdWwuXG4gKlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2coXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0c0FjdGlvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YUFjdGlvblBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcltdLFxuXHRhUGFyYW1ldGVyVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHwgdW5kZWZpbmVkLFxuXHRvQWN0aW9uQ29udGV4dDogQ29udGV4dCxcblx0b1BhcmVudENvbnRyb2w6IFZpZXcsXG5cdGVudGl0eVNldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcz86IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+IHtcblx0Y29uc3Qgc1BhdGggPSBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dCwgc0FjdGlvbk5hbWUpLFxuXHRcdG1ldGFNb2RlbCA9IChvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKS5vTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0c0FjdGlvbk5hbWVQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIilcblx0XHRcdD8gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0AkdWk1Lm92ZXJsb2FkLzBcIilbMF1cblx0XHRcdDogb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiLzBcIilbMF0sXG5cdFx0YWN0aW9uTmFtZUNvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvbk5hbWVQYXRoKSxcblx0XHRiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyZWF0ZUFjdGlvbixcblx0XHRzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9BY3Rpb25QYXJhbWV0ZXJEaWFsb2dcIjtcblx0cmV0dXJuIG5ldyBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+KGFzeW5jIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRsZXQgYWN0aW9uUGFyYW1ldGVySW5mb3M6IEFjdGlvblBhcmFtZXRlckluZm9bXTsgLy8gdG8gYmUgZmlsbGVkIGFmdGVyIGZyYWdtZW50IChmb3IgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cpIGlzIGxvYWRlZC4gQWN0dWFsbHkgb25seSBuZWVkZWQgZHVyaW5nIGRpYWxvZyBwcm9jZXNzaW5nLCBpLmUuIGNvdWxkIGJlIG1vdmVkIGludG8gdGhlIGNvbnRyb2xsZXIgYW5kIGRpcmVjdGx5IGluaXRpYWxpemVkIHRoZXJlLCBidXQgb25seSBhZnRlciBtb3ZpbmcgYWxsIGhhbmRsZXJzIChlc3AuIHByZXNzIGhhbmRsZXIgZm9yIGFjdGlvbiBidXR0b24pIHRvIGNvbnRyb2xsZXIuXG5cblx0XHRjb25zdCBfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlciA9IChwYXJhbWV0ZXI6IEFjdGlvblBhcmFtZXRlcik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3QgYWxsTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0Y29uc3QgY29udHJvbElkID0gZ2VuZXJhdGUoW1wiQVBEX1wiLCBwYXJhbWV0ZXIuJE5hbWVdKTtcblx0XHRcdC8vIGFsc28gcmVtb3ZlIG1lc3NhZ2VzIGFzc2lnbmVkIHRvIGlubmVyIGNvbnRyb2xzLCBidXQgYXZvaWQgcmVtb3ZpbmcgbWVzc2FnZXMgZm9yIGRpZmZlcmVudCBwYXJhbXRlcnMgKHdpdGggbmFtZSBiZWluZyBzdWJzdHJpbmcgb2YgYW5vdGhlciBwYXJhbWV0ZXIgbmFtZSlcblx0XHRcdGNvbnN0IHJlbGV2YW50TWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG1zZzogTWVzc2FnZSkgPT5cblx0XHRcdFx0bXNnLmdldENvbnRyb2xJZHMoKS5zb21lKChpZDogc3RyaW5nKSA9PiBjb250cm9sSWQuc3BsaXQoXCItXCIpLmluY2x1ZGVzKGlkKSlcblx0XHRcdCk7XG5cdFx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMocmVsZXZhbnRNZXNzYWdlcyk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0aGFuZGxlQ2hhbmdlOiBhc3luYyBmdW5jdGlvbiAob0V2ZW50OiBFdmVudDx7IHByb21pc2U6IFByb21pc2U8c3RyaW5nPiB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRjb25zdCBmaWVsZCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0Y29uc3QgYWN0aW9uUGFyYW1ldGVySW5mbyA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8pID0+IGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQgPT09IGZpZWxkXG5cdFx0XHRcdCkgYXMgQWN0aW9uUGFyYW1ldGVySW5mbztcblx0XHRcdFx0Ly8gZmllbGQgdmFsdWUgaXMgYmVpbmcgY2hhbmdlZCwgdGh1cyBleGlzdGluZyBtZXNzYWdlcyByZWxhdGVkIHRvIHRoYXQgZmllbGQgYXJlIG5vdCB2YWxpZCBhbnltb3JlXG5cdFx0XHRcdF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyKGFjdGlvblBhcmFtZXRlckluZm8ucGFyYW1ldGVyKTtcblx0XHRcdFx0Ly8gYWRhcHQgaW5mby4gUHJvbWlzZSBpcyByZXNvbHZlZCB0byB2YWx1ZSBvciByZWplY3RlZCB3aXRoIGV4Y2VwdGlvbiBjb250YWluaW5nIG1lc3NhZ2Vcblx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mby52YWxpZGF0aW9uUHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8udmFsdWUgPSBhd2FpdCBhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlO1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8uaGFzRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRkZWxldGUgYWN0aW9uUGFyYW1ldGVySW5mby52YWx1ZTtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLmhhc0Vycm9yID0gdHJ1ZTtcblx0XHRcdFx0XHRfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlcihbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm86IGFjdGlvblBhcmFtZXRlckluZm8sXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IChlcnJvciBhcyB7IG1lc3NhZ2U6IHN0cmluZyB9KS5tZXNzYWdlXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0Y29uc3Qgb1BhcmFtZXRlck1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHQkZGlzcGxheU1vZGU6IHt9XG5cdFx0fSk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY3JlYXRlZEZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdGFjdGlvbjogb0FjdGlvbkNvbnRleHQsXG5cdFx0XHRcdFx0XHRhY3Rpb25OYW1lOiBhY3Rpb25OYW1lQ29udGV4dCxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRhY3Rpb246IG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRhY3Rpb25OYW1lOiBhY3Rpb25OYW1lQ29udGV4dD8uZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dD8uZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogZW50aXR5U2V0Q29udGV4dD8uZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRjb25zdCBhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBtUGFyYW1ldGVycy5hQ29udGV4dHMgfHwgW107XG5cdFx0XHRjb25zdCBhRnVuY3Rpb25QYXJhbXM6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+W10gPSBbXTtcblxuXHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKG9BcHBDb21wb25lbnQsIGFBY3Rpb25QYXJhbWV0ZXJzLCBvUGFyYW1ldGVyTW9kZWwsIHRydWUpO1xuXHRcdFx0Y29uc3Qgb0RpYWxvZ0NvbnRlbnQgPSAoYXdhaXQgRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdGRlZmluaXRpb246IGNyZWF0ZWRGcmFnbWVudCBhcyB1bmtub3duIGFzIHN0cmluZyxcblx0XHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXJcblx0XHRcdH0pKSBhcyBDb250cm9sO1xuXG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvcyA9IGFBY3Rpb25QYXJhbWV0ZXJzLm1hcCgoYWN0aW9uUGFyYW1ldGVyKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChnZW5lcmF0ZShbXCJBUERfXCIsIGFjdGlvblBhcmFtZXRlci4kTmFtZV0pKSBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZDtcblx0XHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gZmllbGQuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyOiBhY3Rpb25QYXJhbWV0ZXIsXG5cdFx0XHRcdFx0ZmllbGQ6IGZpZWxkLFxuXHRcdFx0XHRcdGlzTXVsdGlWYWx1ZTogaXNNdWx0aVZhbHVlXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwob1BhcmVudENvbnRyb2wpO1xuXHRcdFx0bGV0IGFjdGlvblJlc3VsdDoge1xuXHRcdFx0XHRkaWFsb2dDYW5jZWxsZWQ6IGJvb2xlYW47XG5cdFx0XHRcdHJlc3VsdDogdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXTtcblx0XHRcdH0gPSB7XG5cdFx0XHRcdGRpYWxvZ0NhbmNlbGxlZDogdHJ1ZSwgLy8gdG8gYmUgc2V0IHRvIGZhbHNlIGluIGNhc2Ugb2Ygc3VjY2Vzc2Z1bCBhY3Rpb24gZXhlY3Rpb25cblx0XHRcdFx0cmVzdWx0OiB1bmRlZmluZWRcblx0XHRcdH07XG5cblx0XHRcdGxldCBidXR0b25Mb2NrID0gZmFsc2U7XG5cblx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZV0pLCB7XG5cdFx0XHRcdHRpdGxlOiBzQWN0aW9uTGFiZWwgfHwgcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX1RJVExFXCIpLFxuXHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRlc2NhcGVIYW5kbGVyOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0Ly8gZXNjYXBlIGhhbmRsZXIgaXMgbWVhbnQgdG8gcG9zc2libHkgc3VwcHJlc3Mgb3IgcG9zdHBvbmUgY2xvc2luZyB0aGUgZGlhbG9nIG9uIGVzY2FwZSAoYnkgY2FsbGluZyBcInJlamVjdFwiIG9uIHRoZSBwcm92aWRlZCBvYmplY3QsIG9yIFwicmVzb2x2ZVwiIG9ubHkgd2hlblxuXHRcdFx0XHRcdC8vIGRvbmUgd2l0aCBhbGwgdGFza3MgdG8gaGFwcGVuIGJlZm9yZSBkaWFsb2cgY2FuIGJlIGNsb3NlZCkuIEl0J3Mgbm90IGludGVuZGVkIHRvIGV4cGxpY2V0bHkgY2xvc2UgdGhlIGRpYWxvZyBoZXJlICh0aGF0IGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIG5vXG5cdFx0XHRcdFx0Ly8gZXNjYXBlSGFuZGxlciBpcyBwcm92aWRlZCBvciB0aGUgcmVzb2x2ZS1jYWxsYmFjayBpcyBjYWxsZWQpIG9yIGZvciBvd24gd3JhcCB1cCB0YXNrcyAobGlrZSByZW1vdmluZyB2YWxpZGl0aW9uIG1lc3NhZ2VzIC0gdGhpcyBzaG91bGQgaGFwcGVuIGluIHRoZVxuXHRcdFx0XHRcdC8vIGFmdGVyQ2xvc2UpLlxuXHRcdFx0XHRcdC8vIFRPRE86IE1vdmUgd3JhcCB1cCB0YXNrcyB0byBhZnRlckNsb3NlLCBhbmQgcmVtb3ZlIHRoaXMgbWV0aG9kIGNvbXBsZXRlbHkuIFRha2UgY2FyZSB0byBhbHNvIGFkYXB0IGVuZCBidXR0b24gcHJlc3MgaGFuZGxlciBhY2NvcmRpbmdseS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHkgb25seSBzdGlsbCBuZWVkZWQgdG8gZGlmZmVyZW50aWF0ZSBjbG9zaW5nIGRpYWxvZyBhZnRlciBzdWNjZXNzZnVsIGV4ZWN1dGlvbiAodXNlcyByZXNvbHZlKSBmcm9tIHVzZXIgY2FuY2VsbGF0aW9uICh1c2luZyByZWplY3QpXG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdC8vXHRcdHJlamVjdChDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oZ2VuZXJhdGUoW1wiZmVcIiwgXCJBUERfXCIsIHNBY3Rpb25OYW1lLCBcIkFjdGlvblwiLCBcIk9rXCJdKSwge1xuXHRcdFx0XHRcdHRleHQ6IGJJc0NyZWF0ZUFjdGlvblxuXHRcdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiKVxuXHRcdFx0XHRcdFx0OiBfZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZShyZXNvdXJjZU1vZGVsLCBzQWN0aW9uTGFiZWwsIHNBY3Rpb25OYW1lLCBlbnRpdHlTZXROYW1lKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Ly8gcHJldmVudCBtdWx0aXBsZSBwcmVzcyBldmVudHMuIFRoZSBCdXN5TG9ja2VyIGlzIG5vdCBmYXN0IGVub3VnaC4gKEJDUDogMjM3MDEzMDIxMClcblx0XHRcdFx0XHRcdFx0Ly8gYnV0dG9uTG9jayBpcyBzZXQgb25jZSBhbmQgcmVzZXQgaW5cblx0XHRcdFx0XHRcdFx0Ly8gLSBhZnRlciB2YWxpZGF0aW9uIGVycm9yXG5cdFx0XHRcdFx0XHRcdC8vIC0gaW4gY2FzZSBvZiBhY3Rpb24gZXJyb3IgbWVzc2FnZSBpcyBjYW5jZWxlZFxuXHRcdFx0XHRcdFx0XHQvLyAtIGluIGFmdGVyQ2xvc2UgZXZlbnRcblxuXHRcdFx0XHRcdFx0XHRpZiAoYnV0dG9uTG9jayA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRidXR0b25Mb2NrID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIShhd2FpdCBfdmFsaWRhdGVQcm9wZXJ0aWVzKGFjdGlvblBhcmFtZXRlckluZm9zLCByZXNvdXJjZU1vZGVsKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRidXR0b25Mb2NrID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9EaWFsb2cpO1xuXG5cdFx0XHRcdFx0XHRcdGxldCBmYWlsZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogZHVlIHRvIHVzaW5nIHRoZSBzZWFyY2ggYW5kIHZhbHVlIGhlbHBzIG9uIHRoZSBhY3Rpb24gZGlhbG9nIHRyYW5zaWVudCBtZXNzYWdlcyBjb3VsZCBhcHBlYXJcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBuZWVkIGFuIFVYIGRlc2lnbiBmb3IgdGhvc2UgdG8gc2hvdyB0aGVtIHRvIHRoZSB1c2VyIC0gZm9yIG5vdyByZW1vdmUgdGhlbSBiZWZvcmUgY29udGludWluZ1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIG1vdmUgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIERpYWxvZyAoU2ltcGxlRm9ybSkgdG8gbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVycyBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0aGUgb3BlcmF0aW9uIGJpbmRpbmdzIGZvciBhbGwgY29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRsZXQgdlBhcmFtZXRlclZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhbGxOdWxsUGFyYW1ldGVycyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtZXRlckNvbnRleHQgPSBvT3BlcmF0aW9uQmluZGluZyAmJiBvT3BlcmF0aW9uQmluZGluZy5nZXRQYXJhbWV0ZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUFjdGlvblBhcmFtZXRlcnNbaV0uJGlzQ29sbGVjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhTVZGQ29udGVudCA9IChvRGlhbG9nLmdldE1vZGVsKFwibXZmdmlld1wiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YC8ke2FBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lfWBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFLZXlWYWx1ZXMgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBqIGluIGFNVkZDb250ZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUtleVZhbHVlcy5wdXNoKGFNVkZDb250ZW50W2pdLktleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gYUtleVZhbHVlcztcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IG9QYXJhbWV0ZXJDb250ZXh0Py5nZXRQcm9wZXJ0eShhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS52YWx1ZSA9IHZQYXJhbWV0ZXJWYWx1ZTsgLy8gd3JpdGluZyB0aGUgY3VycmVudCB2YWx1ZSAodXNlciBpbnB1dCEpIGludG8gdGhlIG1ldGFtb2RlbCA9PiBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byB1c2UgQWN0aW9uUGFyYW1ldGVySW5mb3MgaW5zdGVhZC4gVXNlZCBpbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh2UGFyYW1ldGVyVmFsdWUgIT09IG51bGwgJiYgdlBhcmFtZXRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWxsTnVsbFBhcmFtZXRlcnMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFhbGxOdWxsUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIGF2b2lkIG92ZXJyaWRpbmcgaW5jb21pbmcgcGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlubmVyUGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0XHRpbm5lclBhcmFtZXRlcnMubGFiZWwgPSBzQWN0aW9uTGFiZWw7XG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN1bHQgPSBhd2FpdCBleGVjdXRlQVBNQWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbm5lclBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRpYWxvZ0NhbmNlbGxlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdDogYVJlc3VsdFxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlc29sdmUoYVJlc3VsdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzLmNvbmNhdChtZXNzYWdlcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuaXM0MTJFeGVjdXRlZCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhaWxlZENvbnRleHRzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubWFwKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGZhaWwpID0+IGZhaWwub0FjdGlvbi5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlubmVyUGFyYW1ldGVycy5hQ29udGV4dHMgPSBmYWlsZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUFQTUFjdGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbm5lclBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvblJlc3VsdCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpYWxvZ0NhbmNlbGxlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQ6IGFSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlc29sdmUoYVJlc3VsdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIGhhc0Vycm9yc09yV2FybmluZ3MobVBhcmFtZXRlcnMubW9kZWwpKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZXNzYWdlczogTWVzc2FnZVtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZXNzYWdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzOiB1bmRlZmluZWQsIC8vIG5vdCB1c2VkIGF0IGFsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWU6IHNBY3Rpb25MYWJlbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvRGlhbG9nKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRcdGxldCBzaG93TWVzc2FnZURpYWxvZzogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIGhhc0Vycm9yc09yV2FybmluZ3MobVBhcmFtZXRlcnMubW9kZWwpKVxuXHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dDogZmFpbGVkQ29udGV4dHNbMF0sIC8vIG9ubHkgdXNlZCBpbiBjYXNlIG9mIGZhaWxlZCBjb250ZXh0IHRvIHJlc2V0IGluIG1lc3NhZ2VIYW5kbGluZyBzaG93VW5ib3VuZE1lc3NhZ2VzXG5cdFx0XHRcdFx0XHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjazogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZTogZnVuY3Rpb24gKGFNZXNzYWdlczogTWVzc2FnZVtdLCBzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFdoeSBpcyB0aGlzIGltcGxlbWVudGVkIGFzIGNhbGxiYWNrPyBBcHBhcmVudGx5LCBhbGwgbmVlZGVkIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBiZWZvcmVoYW5kXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFRPRE86IHJlZmFjdG9yIGFjY29yZGluZ2x5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNob3dNZXNzYWdlUGFyYW1ldGVycyA9IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2csXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlRGlhbG9nO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzOiB1bmRlZmluZWQsIC8vIG5vdCB1c2VkIGF0IGFsbCFcblx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzQWN0aW9uTGFiZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250cm9sOiBtUGFyYW1ldGVycy5jb250cm9sXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnV0dG9uTG9jayA9IGZhbHNlOyAvL25lZWRlZCBpZiB0aGUgYWN0aW9uIGZhaWxzIHdpdGggYW4gZXJyb3IgcG9wdXAgYW5kIHRoaXMgb25lIGlzIGNhbmNlbGQgKEpvdXJuZXk6IDQxMldhcm5pbmdIYW5kbGluZylcblx0XHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIG9mIGJhY2tlbmQgdmFsaWRhdGlvbiBlcnJvcihzPyksIG1lc3NhZ2Ugc2hhbGwgbm90IGJlIHNob3duIGluIG1lc3NhZ2UgZGlhbG9nIGJ1dCBuZXh0IHRvIHRoZSBmaWVsZCBvbiBwYXJhbWV0ZXIgZGlhbG9nLCB3aGljaCBzaG91bGRcblx0XHRcdFx0XHRcdFx0XHQvLyBzdGF5IG9wZW4gaW4gdGhpcyBjYXNlID0+IGluIHRoaXMgY2FzZSwgd2UgbXVzdCBub3QgcmVzb2x2ZSBvciByZWplY3QgdGhlIHByb21pc2UgY29udHJvbGxpbmcgdGhlIHBhcmFtZXRlciBkaWFsb2cuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW4gYWxsIG90aGVyIGNhc2VzIChlLmcuIG90aGVyIGJhY2tlbmQgZXJyb3JzIG9yIHVzZXIgY2FuY2VsbGF0aW9uKSwgdGhlIHByb21pc2UgY29udHJvbGxpbmcgdGhlIHBhcmFtZXRlciBkaWFsb2cgbmVlZHMgdG8gYmUgcmVqZWN0ZWQgdG8gYWxsb3dcblx0XHRcdFx0XHRcdFx0XHQvLyBjYWxsZXJzIHRvIHJlYWN0LiAoRXhhbXBsZTogSWYgY3JlYXRpb24gaW4gYmFja2VuZCBhZnRlciBuYXZpZ2F0aW9uIHRvIHRyYW5zaWVudCBjb250ZXh0IGZhaWxzLCBiYWNrIG5hdmlnYXRpb24gbmVlZHMgdG8gYmUgdHJpZ2dlcmVkKVxuXHRcdFx0XHRcdFx0XHRcdC8vIFRPRE86IFJlZmFjdG9yIHRvIHNlcGFyYXRlIGRpYWxvZyBoYW5kbGluZyBmcm9tIGJhY2tlbmQgcmVxdWVzdCBpbnN0ZWFkIG9mIHRha2luZyBkZWNpc2lvbiBiYXNlZCBvbiBtZXNzYWdlIGhhbmRsaW5nXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNob3dNZXNzYWdlRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBkbyBub3RoaW5nLCBkbyBub3QgcmVqZWN0IHByb21pc2UgaGVyZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBXZSBkbyBub3QgY2xvc2UgdGhlIEFQTSBkaWFsb2cgaWYgdXNlciBlbnRlcnMgYSB3cm9uZyB2YWx1ZSBpbiBvZiB0aGUgZmllbGRzIHRoYXQgcmVzdWx0cyBpbiBhbiBlcnJvciBmcm9tIHRoZSBiYWNrZW5kLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBjYW4gY2xvc2UgdGhlIG1lc3NhZ2UgZGlhbG9nIGFuZCB0aGUgQVBNIGRpYWxvZyB3b3VsZCBzdGlsbCBiZSBvcGVuIG9uIHdoaWNoIGhlIGNvdWxkIGVudGVyIGEgbmV3IHZhbHVlIGFuZCB0cmlnZ2VyIHRoZSBhY3Rpb24gYWdhaW4uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEVhcmxpZXIgd2Ugd2VyZSByZWplY3RpbmcgdGhlIHByb21pc2Ugb24gZXJyb3IgaGVyZSwgYW5kIHRoZSBjYWxsIHN0YWNrIHdhcyBkZXN0cm95ZWQgYXMgdGhlIHByb21pc2Ugd2FzIHJlamVjdGVkIGFuZCByZXR1cm5lZCB0byBFZGl0RmxvdyBpbnZva2UgYWN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBCdXQgc2luY2UgdGhlIEFQTSBkaWFsb2cgd2FzIHN0aWxsIG9wZW4sIGEgbmV3IHByb21pc2Ugd2FzIHJlc29sdmVkIGluIGNhc2UgdGhlIHVzZXIgcmV0cmllZCB0aGUgYWN0aW9uIGFuZCB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBidXQgdGhlIG5hdmlnYXRpb24gdG8gb2JqZWN0IHBhZ2Ugd2FzIG5vdCB0YWtpbmcgcGxhY2UuXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcykge1xuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aXM0MTJFeGVjdXRlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlsczogW10sXG5cdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1Byb21pc2VzOiBbXSxcblx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzOiBbXSxcblx0XHRcdFx0XHRcdFx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzOiBbXSxcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHM6IFtdXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvRGlhbG9nKSkge1xuXHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJDYW5jZWxcIl0pLCB7XG5cdFx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBjYW5jZWwgYnV0dG9uIHNob3VsZCBqdXN0IGNsb3NlIHRoZSBkaWFsb2cgKHNpbWlsYXIgdG8gdXNpbmcgZXNjYXBlKS4gQWxsIHdyYXAgdXAgdGFza3Mgc2hvdWxkIGJlIG1vdmVkIHRvIGFmdGVyQ2xvc2UuXG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHQvLyByZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0Ly8gVE9ETzogYmVmb3JlT3BlbiBpcyBqdXN0IGFuIGV2ZW50LCBpLmUuIG5vdCB3YWl0aW5nIGZvciB0aGUgUHJvbWlzZSB0byBiZSByZXNvbHZlZC4gQ2hlY2sgaWYgdGFza3Mgb2YgdGhpcyBmdW5jdGlvbiBuZWVkIHRvIGJlIGRvbmUgYmVmb3JlIG9wZW5pbmcgdGhlIGRpYWxvZ1xuXHRcdFx0XHQvLyAtIGlmIHllcywgdGhleSBuZWVkIHRvIGJlIG1vdmVkIG91dHNpZGUuXG5cdFx0XHRcdC8vIEFzc3VtcHRpb246IFNvbWV0aW1lcyBkaWFsb2cgY2FuIGJlIHNlZW4gd2l0aG91dCBhbnkgZmllbGRzIGZvciBhIHNob3J0IHRpbWUgLSBtYXliZSB0aGlzIGlzIGNhdXNlZCBieSB0aGlzIGFzeW5jaHJvbml0eVxuXHRcdFx0XHRiZWZvcmVPcGVuOiBhc3luYyBmdW5jdGlvbiAob0V2ZW50OiBEaWFsb2ckQmVmb3JlT3BlbkV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdFx0Ly8gY2xvbmUgZXZlbnQgZm9yIGFjdGlvbldyYXBwZXIgYXMgb0V2ZW50Lm9Tb3VyY2UgZ2V0cyBsb3N0IGR1cmluZyBwcm9jZXNzaW5nIG9mIGJlZm9yZU9wZW4gZXZlbnQgaGFuZGxlclxuXHRcdFx0XHRcdGNvbnN0IG9DbG9uZUV2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgb0V2ZW50KTtcblxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdGNvbnN0IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IChvRGlhbG9nLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICYmIG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi9AXCIpWzBdLFxuXHRcdFx0XHRcdFx0XHRzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRcdFx0YCR7c0FjdGlvblBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc0RlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nID0gYXN5bmMgZnVuY3Rpb24gKHNCaW5kaW5nUGFyYW1ldGVyPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQm91bmRGdW5jdGlvbk5hbWUgPSBnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24oKTtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmFtZXRlck1vZGVsRGF0YSA9IG9QYXJhbWV0ZXJNb2RlbC5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBwcmVmaWxsUGFyYW1ldGVyID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRcdFx0XHRcdFx0XHRzUGFyYW1OYW1lOiBzdHJpbmcsXG5cdFx0XHRcdFx0XHRcdHZQYXJhbURlZmF1bHRWYWx1ZT86IHN0cmluZyB8IHsgJFBhdGg/OiBzdHJpbmcgfVxuXHRcdFx0XHRcdFx0KTogUHJvbWlzZTx7IHBhcmFtTmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgYkxhdGVQcm9wZXJ0eUVycm9yPzogYm9vbGVhbjsgYk5vUG9zc2libGVWYWx1ZT86IGJvb2xlYW4gfT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBDYXNlIDE6IFRoZXJlIGlzIGEgUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbURlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAwICYmIHR5cGVvZiB2UGFyYW1EZWZhdWx0VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdlBhcmFtVmFsdWUgPSBhd2FpdCBDb21tb25VdGlscy5yZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbVZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtVmFsdWUgPSBhd2FpdCBvT3BlcmF0aW9uQmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFBhcmFtZXRlckNvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RQcm9wZXJ0eSh2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBtdWx0aSBzZWxlY3QsIG5lZWQgdG8gbG9vcCBvdmVyIGFDb250ZXh0cyAoYXMgY29udGV4dHMgY2Fubm90IGJlIHJldHJpZXZlZCB2aWEgYmluZGluZyBwYXJhbWV0ZXIgb2YgdGhlIG9wZXJhdGlvbiBiaW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzUGF0aEZvckNvbnRleHQgPSB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNQYXRoRm9yQ29udGV4dC5pbmRleE9mKGAke3NCaW5kaW5nUGFyYW1ldGVyfS9gKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhdGhGb3JDb250ZXh0ID0gc1BhdGhGb3JDb250ZXh0LnJlcGxhY2UoYCR7c0JpbmRpbmdQYXJhbWV0ZXJ9L2AsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0c1tpXS5nZXRQcm9wZXJ0eShzUGF0aEZvckNvbnRleHQpICE9PSB2UGFyYW1WYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRleHRzIGFyZSBub3QgYWxsIHRoZSBzYW1lLCBkbyBub3QgcHJlZmlsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJOb1Bvc3NpYmxlVmFsdWU6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdlBhcmFtVmFsdWUgfTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWFkaW5nIGRlZmF1bHQgYWN0aW9uIHBhcmFtZXRlclwiLCBzUGFyYW1OYW1lLCBtUGFyYW1ldGVycy5hY3Rpb25OYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbU5hbWU6IHNQYXJhbU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiTGF0ZVByb3BlcnR5RXJyb3I6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAxLjI6IFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBkZWZpbmVzIGEgZml4ZWQgc3RyaW5nIHZhbHVlIChpLmUuIHZQYXJhbURlZmF1bHRWYWx1ZSA9ICdzb21lU3RyaW5nJylcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHZQYXJhbURlZmF1bHRWYWx1ZSB9O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJNb2RlbERhdGEuaGFzT3duUHJvcGVydHkoc1BhcmFtTmFtZSkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDI6IFRoZXJlIGlzIG5vIFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBhbm5vdGF0aW9uICg9PiBsb29rIGludG8gdGhlIEZMUCBVc2VyIERlZmF1bHRzKVxuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJhbWV0ZXJNb2RlbERhdGFbc1BhcmFtTmFtZV1cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRjb25zdCBnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiAoc1BhcmFtTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgeyAkUGF0aDogc3RyaW5nIH0ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gKG9EaWFsb2cuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblBhdGggPSBDb21tb25VdGlscy5nZXRQYXJhbWV0ZXJQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSwgc1BhcmFtTmFtZSkgKyBcIkBcIixcblx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblBhdGgpLFxuXHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckFubm90YXRpb25zICYmIG9QYXJhbWV0ZXJBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcIl07IC8vIGVpdGhlciB7ICRQYXRoOiAnc29tZVBhdGgnIH0gb3IgJ3NvbWVTdHJpbmcnXG5cdFx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFzIHN0cmluZyB8IHsgJFBhdGg6IHN0cmluZyB9O1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSA9IFtdO1xuXHRcdFx0XHRcdFx0bGV0IHNQYXJhbU5hbWUsIHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lO1xuXHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyRGVmYXVsdFZhbHVlID0gZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlKHNQYXJhbU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnB1c2gocHJlZmlsbFBhcmFtZXRlcihzUGFyYW1OYW1lLCB2UGFyYW1ldGVyRGVmYXVsdFZhbHVlKSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmIHNCb3VuZEZ1bmN0aW9uTmFtZS5sZW5ndGggPiAwICYmIHR5cGVvZiBzQm91bmRGdW5jdGlvbk5hbWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXMucHVzaChjYWxsQm91bmRGdW5jdGlvbihzQm91bmRGdW5jdGlvbk5hbWUsIGFDb250ZXh0c1tpXSwgbVBhcmFtZXRlcnMubW9kZWwpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgYVByZWZpbGxQYXJhbVByb21pc2VzID0gUHJvbWlzZS5hbGwoYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSk7XG5cdFx0XHRcdFx0XHRsZXQgYUV4ZWNGdW5jdGlvblByb21pc2VzOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0W10+ID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRcdFx0XHRcdGxldCBvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZTtcblx0XHRcdFx0XHRcdGlmIChhRnVuY3Rpb25QYXJhbXMgJiYgYUZ1bmN0aW9uUGFyYW1zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0YUV4ZWNGdW5jdGlvblByb21pc2VzID0gUHJvbWlzZS5hbGwoYUZ1bmN0aW9uUGFyYW1zKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc01vZHVsZSA9IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0LnN1YnN0cmluZygwLCBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL1xcLi9naSwgXCIvXCIpLFxuXHRcdFx0XHRcdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24ubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0b0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2UgPSBGUE1IZWxwZXIuYWN0aW9uV3JhcHBlcihvQ2xvbmVFdmVudCwgc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRzOiBhQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdFx0XHRcdFx0XHRhUHJlZmlsbFBhcmFtUHJvbWlzZXMsXG5cdFx0XHRcdFx0XHRcdFx0YUV4ZWNGdW5jdGlvblByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRcdG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlXG5cdFx0XHRcdFx0XHRcdF0pO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUgPSBhUHJvbWlzZXNbMF07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZ1bmN0aW9uUGFyYW1zID0gYVByb21pc2VzWzFdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gYVByb21pc2VzWzJdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0XHRcdFx0XHRsZXQgc0RpYWxvZ1BhcmFtTmFtZTogc3RyaW5nO1xuXG5cdFx0XHRcdFx0XHRcdC8vIEZpbGwgdGhlIGRpYWxvZyB3aXRoIHRoZSBlYXJsaWVyIGRldGVybWluZWQgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIHRoZSBkaWZmZXJlbnQgc291cmNlc1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRzRGlhbG9nUGFyYW1OYW1lID0gYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUGFyYW1ldGVyIHZhbHVlcyBwcm92aWRlZCBpbiB0aGUgY2FsbCBvZiBpbnZva2VBY3Rpb24gb3ZlcnJ1bGUgb3RoZXIgc291cmNlc1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHZQYXJhbWV0ZXJQcm92aWRlZFZhbHVlID0gYVBhcmFtZXRlclZhbHVlcz8uZmluZChcblx0XHRcdFx0XHRcdFx0XHRcdChlbGVtZW50KSA9PiBlbGVtZW50Lm5hbWUgPT09IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KT8udmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbWV0ZXJQcm92aWRlZFZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsIHZQYXJhbWV0ZXJQcm92aWRlZFZhbHVlKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdCAmJiBvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QuaGFzT3duUHJvcGVydHkoc0RpYWxvZ1BhcmFtTmFtZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdFtzRGlhbG9nUGFyYW1OYW1lXVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXSAmJiBjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0udmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLCBjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0udmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlIGRlZmF1bHQgdmFsdWUgaGFkIG5vdCBiZWVuIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBkdWUgdG8gZGlmZmVyZW50IGNvbnRleHRzLCB3ZSBkbyBub3RoaW5nIGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHNCb3VuZEZ1bmN0aW9uTmFtZSAmJiAhY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldLmJOb1Bvc3NpYmxlVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBjaGVjayBpZiB0aGUgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBzYW1lIHBhcmFtIHZhbHVlIGZvciBhbGwgdGhlIGNvbnRleHRzOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgaiA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlIChqIDwgYUNvbnRleHRzLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqXSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbaiArIDFdICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2ogKyAxXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGorKztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vcGFyYW0gdmFsdWVzIGFyZSBhbGwgdGhlIHNhbWU6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChqID09PSBhQ29udGV4dHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbal0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChmdW5jdGlvblBhcmFtc1swXSAmJiBmdW5jdGlvblBhcmFtc1swXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9Pbmx5IG9uZSBjb250ZXh0LCB0aGVuIHRoZSBkZWZhdWx0IHBhcmFtIHZhbHVlcyBhcmUgdG8gYmUgdmVyaWZpZWQgZnJvbSB0aGUgZnVuY3Rpb246XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb25zdCBiRXJyb3JGb3VuZCA9IGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZS5zb21lKGZ1bmN0aW9uIChvVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAob1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9WYWx1ZS5iTGF0ZVByb3BlcnR5RXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgYXQgbGVhc3Qgb25lIERlZmF1bHQgUHJvcGVydHkgaXMgYSBMYXRlIFByb3BlcnR5IGFuZCBhbiBlVGFnIGVycm9yIHdhcyByYWlzZWQuXG5cdFx0XHRcdFx0XHRcdGlmIChiRXJyb3JGb3VuZCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNUZXh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfTEFURV9QUk9QRVJUWVwiKTtcblx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94Lndhcm5pbmcoc1RleHQsIHsgY29udGVudFdpZHRoOiBcIjI1ZW1cIiB9IGFzIG9iamVjdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBwYXJhbWV0ZXJcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmbkFzeW5jQmVmb3JlT3BlbiA9IGFzeW5jIGZ1bmN0aW9uICgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIik7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGFyYW1ldGVyID0gYVBhcmFtZXRlcnNbMF0gJiYgYVBhcmFtZXRlcnNbMF0uJE5hbWU7XG5cblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ29udGV4dE9iamVjdCA9IGF3YWl0IGFDb250ZXh0c1swXS5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoc0JpbmRpbmdQYXJhbWV0ZXIsIG9Db250ZXh0T2JqZWN0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2coc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBwYXJhbWV0ZXJcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGF3YWl0IGZuQXN5bmNCZWZvcmVPcGVuKCk7XG5cblx0XHRcdFx0XHQvLyBhZGRpbmcgZGVmYXVsdGVkIHZhbHVlcyBvbmx5IGhlcmUgYWZ0ZXIgdGhleSBhcmUgbm90IHNldCB0byB0aGUgZmllbGRzXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXJJbmZvIG9mIGFjdGlvblBhcmFtZXRlckluZm9zKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFjdGlvblBhcmFtZXRlckluZm8uaXNNdWx0aVZhbHVlXG5cdFx0XHRcdFx0XHRcdD8gKGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQgYXMgTXVsdGlWYWx1ZUZpZWxkKS5nZXRJdGVtcygpXG5cdFx0XHRcdFx0XHRcdDogKGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQgYXMgRmllbGQpLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHQvLyB3aGVuIHRoZSBkaWFsb2cgaXMgY2FuY2VsbGVkLCBtZXNzYWdlcyBuZWVkIHRvIGJlIHJlbW92ZWQgaW4gY2FzZSB0aGUgc2FtZSBhY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIGFnYWluXG5cdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnMuZm9yRWFjaChfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlcik7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0YnV0dG9uTG9jayA9IGZhbHNlOyAvL25lZWRlZCBoZXJlLCBub3QgaW4gdGhlIHByZXNzIGV2ZW50cyBmaW5hbGx5IGNsYXVzZS4gSW4gY2FzZSB0aGUgVUkgaXMgc2x1Z2dpc2gsIGJlZ2luIGJ1dHRvbiBjb3VsZCBiZSBwcmVzc2VkIGFnYWluLlxuXHRcdFx0XHRcdGlmIChhY3Rpb25SZXN1bHQuZGlhbG9nQ2FuY2VsbGVkKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoYWN0aW9uUmVzdWx0LnJlc3VsdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdG1QYXJhbWV0ZXJzLm9EaWFsb2cgPSBvRGlhbG9nO1xuXHRcdFx0b0RpYWxvZy5zZXRNb2RlbCgob0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCkub01vZGVsKTtcblx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob1BhcmFtZXRlck1vZGVsLCBcInBhcmFtc01vZGVsXCIpO1xuXHRcdFx0b0RpYWxvZy5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0XHRtb2RlbDogXCJwYXJhbXNNb2RlbFwiXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gZW1wdHkgbW9kZWwgdG8gYWRkIGVsZW1lbnRzIGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiBudW1iZXIgb2YgTVZGIGZpZWxkcyBkZWZpbmVkIG9uIHRoZSBkaWFsb2dcblx0XHRcdGNvbnN0IG9NVkZNb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvTVZGTW9kZWwsIFwibXZmdmlld1wiKTtcblxuXHRcdFx0LyogRXZlbnQgbmVlZGVkIGZvciByZW1vdmluZyBtZXNzYWdlcyBvZiB2YWxpZCBjaGFuZ2VkIGZpZWxkICovXG5cdFx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlckluZm8gb2YgYWN0aW9uUGFyYW1ldGVySW5mb3MpIHtcblx0XHRcdFx0aWYgKGFjdGlvblBhcmFtZXRlckluZm8uaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mbz8uZmllbGQ/LmdldEJpbmRpbmcoXCJpdGVtc1wiKT8uYXR0YWNoQ2hhbmdlKCgpID0+IHtcblx0XHRcdFx0XHRcdF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyKGFjdGlvblBhcmFtZXRlckluZm8ucGFyYW1ldGVyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvPy5maWVsZD8uZ2V0QmluZGluZyhcInZhbHVlXCIpPy5hdHRhY2hDaGFuZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdFx0X3JlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW10ZXIoYWN0aW9uUGFyYW1ldGVySW5mby5wYXJhbWV0ZXIpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGxldCBzQWN0aW9uUGF0aCA9IGAke3NBY3Rpb25OYW1lfSguLi4pYDtcblx0XHRcdGlmICghYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRzQWN0aW9uUGF0aCA9IGAvJHtzQWN0aW9uUGF0aH1gO1xuXHRcdFx0fVxuXHRcdFx0b0RpYWxvZy5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdHBhdGg6IHNBY3Rpb25QYXRoXG5cdFx0XHR9KTtcblx0XHRcdGlmIChvUGFyZW50Q29udHJvbCkge1xuXHRcdFx0XHQvLyBpZiB0aGVyZSBpcyBhIHBhcmVudCBjb250cm9sIHNwZWNpZmllZCBhZGQgdGhlIGRpYWxvZyBhcyBkZXBlbmRlbnRcblx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoYUNvbnRleHRzWzBdKTsgLy8gdXNlIGNvbnRleHQgb2YgZmlyc3Qgc2VsZWN0ZWQgbGluZSBpdGVtXG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvT3BlcmF0aW9uQmluZGluZyA9IG9EaWFsb2cuZ2V0T2JqZWN0QmluZGluZygpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdH1cblx0fSk7XG59XG5mdW5jdGlvbiBnZXRBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb246IENvbnRleHQpOiBBY3Rpb25QYXJhbWV0ZXJbXSB7XG5cdGNvbnN0IGFQYXJhbWV0ZXJzID0gb0FjdGlvbi5nZXRPYmplY3QoXCIkUGFyYW1ldGVyXCIpIHx8IFtdO1xuXHRpZiAoYVBhcmFtZXRlcnMgJiYgYVBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0aWYgKG9BY3Rpb24uZ2V0T2JqZWN0KFwiJElzQm91bmRcIikpIHtcblx0XHRcdC8vaW4gY2FzZSBvZiBib3VuZCBhY3Rpb25zLCBpZ25vcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgY29uc2lkZXIgdGhlIHJlc3Rcblx0XHRcdHJldHVybiBhUGFyYW1ldGVycy5zbGljZSgxLCBhUGFyYW1ldGVycy5sZW5ndGgpIHx8IFtdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYVBhcmFtZXRlcnM7XG59XG5cbmZ1bmN0aW9uIF9nZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lKFxuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRzQWN0aW9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0c0VudGl0eVNldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcblx0bGV0IGJvdW5kQWN0aW9uTmFtZTogc3RyaW5nID0gc0FjdGlvbk5hbWU7XG5cdGNvbnN0IGFBY3Rpb25OYW1lID0gYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKTtcblx0Ym91bmRBY3Rpb25OYW1lID0gYm91bmRBY3Rpb25OYW1lLmluY2x1ZGVzKFwiLlwiKSA/IGFBY3Rpb25OYW1lW2FBY3Rpb25OYW1lLmxlbmd0aCAtIDFdIDogYm91bmRBY3Rpb25OYW1lO1xuXHRjb25zdCBzdWZmaXhSZXNvdXJjZUtleSA9IGJvdW5kQWN0aW9uTmFtZSAmJiBzRW50aXR5U2V0TmFtZSA/IGAke3NFbnRpdHlTZXROYW1lfXwke2JvdW5kQWN0aW9uTmFtZX1gIDogXCJcIjtcblx0Y29uc3Qgc0tleSA9IFwiQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfQUNUSU9OX05BTUVcIjtcblx0Y29uc3QgYlJlc291cmNlS2V5RXhpc3RzID0gcmVzb3VyY2VNb2RlbC5jaGVja0lmUmVzb3VyY2VLZXlFeGlzdHMoYCR7c0tleX18JHtzdWZmaXhSZXNvdXJjZUtleX1gKTtcblx0aWYgKHNBY3Rpb25MYWJlbCkge1xuXHRcdGlmIChiUmVzb3VyY2VLZXlFeGlzdHMpIHtcblx0XHRcdHJldHVybiByZXNvdXJjZU1vZGVsLmdldFRleHQoc0tleSwgdW5kZWZpbmVkLCBzdWZmaXhSZXNvdXJjZUtleSk7XG5cdFx0fSBlbHNlIGlmIChyZXNvdXJjZU1vZGVsLmNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cyhgJHtzS2V5fXwke3NFbnRpdHlTZXROYW1lfWApKSB7XG5cdFx0XHRyZXR1cm4gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KHNLZXksIHVuZGVmaW5lZCwgYCR7c0VudGl0eVNldE5hbWV9YCk7XG5cdFx0fSBlbHNlIGlmIChyZXNvdXJjZU1vZGVsLmNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cyhgJHtzS2V5fWApKSB7XG5cdFx0XHRyZXR1cm4gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KHNLZXkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gc0FjdGlvbkxhYmVsO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX09LXCIpO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMoXG5cdG9BY3Rpb246IE9EYXRhQ29udGV4dEJpbmRpbmcsXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YkdldEJvdW5kQ29udGV4dDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0c0dyb3VwSWQ6IHN0cmluZyxcblx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyIHwgdW5kZWZpbmVkLFxuXHRpQ29udGV4dExlbmd0aDogbnVtYmVyIHwgbnVsbCxcblx0Y3VycmVudF9jb250ZXh0X2luZGV4OiBudW1iZXIgfCBudWxsLFxuXHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZTogRnVuY3Rpb24sXG5cdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3Q6IEZ1bmN0aW9uLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcz86IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0PiB7XG5cdGxldCBvQWN0aW9uUHJvbWlzZTogUHJvbWlzZTx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD4sXG5cdFx0YkVuYWJsZVN0cmljdEhhbmRsaW5nID0gdHJ1ZTtcblx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUgPSBpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZTtcblx0fVxuXHRpZiAoYkdldEJvdW5kQ29udGV4dCkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0FjdGlvbi5nZXRCb3VuZENvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc01ldGFQYXRoID0gb0FjdGlvbi5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRjb25zdCBvUHJvcGVydHkgPSBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KHNNZXRhUGF0aCk7XG5cdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHlbMF0/LiRraW5kICE9PSBcIkFjdGlvblwiKSB7XG5cdFx0XHQvL2RvIG5vdCBlbmFibGUgdGhlIHN0cmljdCBoYW5kbGluZyBpZiBpdHMgbm90IGFuIGFjdGlvblxuXHRcdFx0YkVuYWJsZVN0cmljdEhhbmRsaW5nID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5kaXNhYmxlU3RyaWN0SGFuZGxpbmcpIHtcblx0XHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmICghYkVuYWJsZVN0cmljdEhhbmRsaW5nKSB7XG5cdFx0b0FjdGlvblByb21pc2UgPSBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUob0FjdGlvbi5nZXRCb3VuZENvbnRleHQoKSk7XG5cdFx0XHRyZXR1cm4gb0FjdGlvbi5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvQWN0aW9uUHJvbWlzZSA9IGJHZXRCb3VuZENvbnRleHRcblx0XHRcdD8gb0FjdGlvblxuXHRcdFx0XHRcdC5leGVjdXRlKFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleCxcblx0XHRcdFx0XHRcdFx0b0FjdGlvbi5nZXRDb250ZXh0KCksXG5cdFx0XHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmICFtUGFyYW1ldGVycy5iR3JvdXBlZCkge1xuXHRcdFx0XHRcdFx0XHR1cGRhdGU0MTJUcmFuc2lzdGlvbk1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRcdG9BY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgYXMgU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZShvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpKTtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiAhbVBhcmFtZXRlcnMuYkdyb3VwZWQpIHtcblx0XHRcdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpc3Rpb25NZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzIGFzIFN0cmljdEhhbmRsaW5nUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCgpO1xuXHRcdFx0XHRcdFx0dGhyb3cgQ29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0OiBvQWN0aW9uXG5cdFx0XHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbnNIZWxwZXIuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdFx0XHRcdG9wZXJhdGlvbnMsXG5cdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y3VycmVudF9jb250ZXh0X2luZGV4LFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLmdldENvbnRleHQoKSxcblx0XHRcdFx0XHRcdFx0aUNvbnRleHRMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAocmVzdWx0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmICFtUGFyYW1ldGVycy5iR3JvdXBlZCkge1xuXHRcdFx0XHRcdFx0XHR1cGRhdGU0MTJUcmFuc2lzdGlvbk1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRcdG9BY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgYXMgU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiYgIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHRcdFx0XHRcdHVwZGF0ZTQxMlRyYW5zaXN0aW9uTWVzc2FnZXMoXG5cdFx0XHRcdFx0XHRcdFx0b0FjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyBhcyBTdHJpY3RIYW5kbGluZ1BhcmFtZXRlcnNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QoKTtcblx0XHRcdFx0XHRcdHRocm93IENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQ7XG5cdFx0XHRcdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb0FjdGlvblByb21pc2UuY2F0Y2goKCkgPT4ge1xuXHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QoKTtcblx0XHR0aHJvdyBDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkO1xuXHR9KTtcbn1cbi8qKlxuICogVXBkYXRlcyB0aGUgc3RyaWN0SGFuZGxpbmdVdGlsaXRlcyB3aXRoIHRoZSBmYWlsZWQgYW5kIHN1Y2Nlc3NmdWwgdHJhbnNpc2l0aW9uIG1lc3NhZ2VzLlxuICpcbiAqIEBwYXJhbSBvQWN0aW9uIEFjdGlvbiBleGVjdXRlZFxuICogQHBhcmFtIHNHcm91cElkIEdyb3VwSWQgb2YgdGhlIGJhdGNoXG4gKiBAcGFyYW0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgVXRpbGl0eSBmbGFncyBhbmQgbWVzc2FnZXMgZm9yIHN0cmljdEhhbmRsaW5nXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY29udGFpbnMgYXR0cmlidXRlcyByZWxhdGVkIHRvIHN0cmlja0hhbmRsaW5nXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZTQxMlRyYW5zaXN0aW9uTWVzc2FnZXMoXG5cdG9BY3Rpb246IE9EYXRhQ29udGV4dEJpbmRpbmcsXG5cdHNHcm91cElkOiBzdHJpbmcsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzOiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0bVBhcmFtZXRlcnM/OiBTdHJpY3RIYW5kbGluZ1BhcmFtZXRlcnNcbik6IHZvaWQge1xuXHRjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRjb25zdCB7IHByb2Nlc3NlZE1lc3NhZ2VJZHMsIGRlbGF5U3VjY2Vzc01lc3NhZ2VzLCBzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyB9ID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM7XG5cdGNvbnN0IHRyYW5zaXRpb25NZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdC8vY2hlY2sgaWYgdGhlIHRyYW5zaXN0aW9uIG1lc3NhZ2VzIGlzIGFscmVhZHkgcHJvY2Vzc2VkXG5cdFx0Y29uc3QgaXNEdXBsaWNhdGUgPSBwcm9jZXNzZWRNZXNzYWdlSWRzLmZpbmQoZnVuY3Rpb24gKGlkOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlLmdldElkKCkgPT09IGlkO1xuXHRcdH0pO1xuXHRcdC8vIHVwZGF0ZSB0aGUgc3RyaWN0SGFuZGxpbmcgd2l0aCB0aGUgc3VjY2VzcyBtZXNzYWdlcyB3aGljaCBuZWVkcyB0byBiZSBzaG93biBsYXRlclxuXHRcdGlmICghaXNEdXBsaWNhdGUpIHtcblx0XHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHMucHVzaChtZXNzYWdlLmdldElkKCkpO1xuXHRcdFx0aWYgKG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzKSB7XG5cdFx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBtZXNzYWdlLmdldFBlcnNpc3RlbnQoKSA9PT0gdHJ1ZSAmJiBtZXNzYWdlLmdldFR5cGUoKSAhPT0gTWVzc2FnZVR5cGUuU3VjY2VzcyAmJiAhaXNEdXBsaWNhdGU7XG5cdH0pO1xuXHQvL3VwZGF0ZSB0aGUgc3RyaWN0SGFuZGxpbmdVdGlsaXRlcyB3aXRoIHRoZSBmYWlsZWQgdHJhbnNpc3Rpb24gbWVzc2FnZXMgd2hpY2ggbmVlZHMgdG8gYmUgcmV0cmlnZ2VyZWRcblx0aWYgKHRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRpZiAobVBhcmFtZXRlcnM/LmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5wdXNoKHtcblx0XHRcdFx0b0FjdGlvbjogb0FjdGlvbixcblx0XHRcdFx0Z3JvdXBJZDogc0dyb3VwSWRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uKCk6IHtcblx0b0xvY2FsQWN0aW9uUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPjtcblx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmU6IEZ1bmN0aW9uO1xuXHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0OiBGdW5jdGlvbjtcbn0ge1xuXHRsZXQgaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUhOiBGdW5jdGlvbjtcblx0bGV0IGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QhOiBGdW5jdGlvbjtcblx0Y29uc3Qgb0xvY2FsQWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHVua25vd24+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCA9IHJlamVjdDtcblx0fSkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcikge1xuXHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyBhY3Rpb24gXCIsIG9FcnJvcik7XG5cdH0pO1xuXG5cdHJldHVybiB7IG9Mb2NhbEFjdGlvblByb21pc2UsIGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlLCBpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0IH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZXJlIGFyZSBhbnkgd2FybmluZyBvciBlcnJvciBtZXNzYWdlcyhib3VuZCBhbmQgdW5ib3VuZCkuIFByZXNlbnRseSBvbmx5IHByb3ZpZGVzIHRoZW0gZm9yIGNoYW5nZXNldCBiYXRjaCBjb25maWcuXG4gKlxuICogQHJldHVybnMgQm9vbGVhbiBpbmRpY2F0aW5nIGV4aXN0YW5jZSBvZiBtZXNzYWdlc1xuICovXG5mdW5jdGlvbiBoYXNFcnJvcnNPcldhcm5pbmdzKG1vZGVsOiBPRGF0YU1vZGVsKTogYm9vbGVhbiB7XG5cdGNvbnN0IHVuQm91bmRNc2dzOiBNZXNzYWdlW10gPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbW9kZWwpO1xuXHRjb25zdCBib3VuZE1zZ3M6IE1lc3NhZ2VbXSA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbW9kZWwpO1xuXHRjb25zdCBtZXNzYWdlcyA9IFsuLi51bkJvdW5kTXNncywgLi4uYm91bmRNc2dzXTtcblxuXHRyZXR1cm4gbWVzc2FnZXMuc29tZShmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJFcnJvclwiIHx8IG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIldhcm5pbmdcIjtcblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9leGVjdXRlQWN0aW9uKFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0b1BhcmVudENvbnRyb2w6IFZpZXcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM/OiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdPiB7XG5cdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyB8fCBbXTtcblx0Y29uc3Qgb01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdGNvbnN0IGFBY3Rpb25QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMgfHwgW107XG5cdGNvbnN0IHNBY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMuYWN0aW9uTmFtZTtcblx0Y29uc3QgZm5PblN1Ym1pdHRlZCA9IG1QYXJhbWV0ZXJzLmZuT25TdWJtaXR0ZWQ7XG5cdGNvbnN0IGZuT25SZXNwb25zZSA9IG1QYXJhbWV0ZXJzLmZuT25SZXNwb25zZTtcblx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwob1BhcmVudENvbnRyb2wpO1xuXHRsZXQgb0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZztcblxuXHRmdW5jdGlvbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTogdm9pZCB7XG5cdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzICYmIGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAoIWFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChhQWN0aW9uUGFyYW1ldGVyc1tqXS4kVHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5TdHJpbmdcIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gdGJjXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0FjdGlvbi5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbal0uJE5hbWUsIGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHQvLyBUT0RPOiByZWZhY3RvciB0byBkaXJlY3QgdXNlIG9mIFByb21pc2UuYWxsU2V0dGxlZFxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdPihmdW5jdGlvbiAoXG5cdFx0XHRyZXNvbHZlOiAodmFsdWU6IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pID0+IHZvaWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycztcblx0XHRcdGNvbnN0IGJHcm91cGVkID0gbVBhcmFtZXRlcnMuYkdyb3VwZWQ7XG5cdFx0XHRjb25zdCBiR2V0Qm91bmRDb250ZXh0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dDtcblx0XHRcdGNvbnN0IGFBY3Rpb25Qcm9taXNlczogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSA9IFtdO1xuXHRcdFx0bGV0IG9BY3Rpb25Qcm9taXNlO1xuXHRcdFx0bGV0IGk7XG5cdFx0XHRsZXQgc0dyb3VwSWQ6IHN0cmluZztcblx0XHRcdGNvbnN0IG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0ID0gY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbigpO1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRcdFx0XHRhY3Rpb25Db250ZXh0OiBPRGF0YUNvbnRleHRCaW5kaW5nLFxuXHRcdFx0XHRjdXJyZW50X2NvbnRleHRfaW5kZXg6IG51bWJlciB8IG51bGwsXG5cdFx0XHRcdG9TaWRlRWZmZWN0OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgJiB7IGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0IH0sXG5cdFx0XHRcdGlDb250ZXh0TGVuZ3RoOiBudW1iZXJcblx0XHRcdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRcdFx0Y29uc3QgaW5kaXZpZHVhbEFjdGlvblByb21pc2U6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSAhYkdyb3VwZWQgPyBgJGF1dG8uJHtjdXJyZW50X2NvbnRleHRfaW5kZXh9YCA6IGFjdGlvbkNvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBmblJlcXVlc3RTaWRlRWZmZWN0cy5iaW5kKFxuXHRcdFx0XHRcdG9wZXJhdGlvbnMsXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMoXG5cdFx0XHRcdFx0YWN0aW9uQ29udGV4dCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0aUNvbnRleHRMZW5ndGgsXG5cdFx0XHRcdFx0Y3VycmVudF9jb250ZXh0X2luZGV4LFxuXHRcdFx0XHRcdG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0LmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlLFxuXHRcdFx0XHRcdG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0LmludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QsXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcblx0XHRcdFx0KTtcblx0XHRcdFx0YUFjdGlvblByb21pc2VzLnB1c2gob0FjdGlvblByb21pc2UpO1xuXHRcdFx0XHRpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZS5wdXNoKG9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0Lm9Mb2NhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0XHRmblJlcXVlc3RTaWRlRWZmZWN0cyhvQXBwQ29tcG9uZW50LCBvU2lkZUVmZmVjdCwgbVBhcmFtZXRlcnMsIHNHcm91cElkLCBpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaW5kaXZpZHVhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuRXhlY3V0ZVNpbmdsZUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRcdFx0YWN0aW9uQ29udGV4dDogT0RhdGFDb250ZXh0QmluZGluZyxcblx0XHRcdFx0Y3VycmVudF9jb250ZXh0X2luZGV4OiBudW1iZXIgfCBudWxsLFxuXHRcdFx0XHRvU2lkZUVmZmVjdDogKEFjdGlvblNpZGVFZmZlY3RzVHlwZSAmIHsgY29udGV4dDogT0RhdGFWNENvbnRleHQgfSkgfCB1bmRlZmluZWQsXG5cdFx0XHRcdGlDb250ZXh0TGVuZ3RoOiBudW1iZXJcblx0XHRcdCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXT4ge1xuXHRcdFx0XHRjb25zdCBpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZTogdW5rbm93bltdID0gW107XG5cdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSBtUGFyYW1ldGVycy5ncm91cElkIHx8IGBhcGlNb2RlJHtjdXJyZW50X2NvbnRleHRfaW5kZXh9YDtcblx0XHRcdFx0bVBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gZm5SZXF1ZXN0U2lkZUVmZmVjdHMuYmluZChcblx0XHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0b1NpZGVFZmZlY3QsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0aW5kaXZpZHVhbEFjdGlvblByb21pc2Vcblx0XHRcdFx0KTtcblx0XHRcdFx0b0FjdGlvblByb21pc2UgPSBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKFxuXHRcdFx0XHRcdGFjdGlvbkNvbnRleHQsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoLFxuXHRcdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleCxcblx0XHRcdFx0XHRvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSxcblx0XHRcdFx0XHRvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0LFxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFBY3Rpb25Qcm9taXNlcy5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0aW5kaXZpZHVhbEFjdGlvblByb21pc2UucHVzaChvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5vTG9jYWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0Zm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudCwgb1NpZGVFZmZlY3QsIG1QYXJhbWV0ZXJzLCBzR3JvdXBJZCwgaW5kaXZpZHVhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0XHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdH07XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIGZuRXhlY3V0ZUNoYW5nZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0Y29uc3QgYUNoYW5nZVNldExvY2FsUHJvbWlzZXM6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0b0FjdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtzQWN0aW9uTmFtZX0oLi4uKWAsIGFDb250ZXh0c1tpXSwgbUJpbmRpbmdQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRhQ2hhbmdlU2V0TG9jYWxQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0Zm5FeGVjdXRlQWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubGVuZ3RoIDw9IDEgPyBudWxsIDogaSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQ6IGFDb250ZXh0c1tpXSxcblx0XHRcdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnNcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0KFxuXHRcdFx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdFx0XHRmdW5jdGlvbiBub29wKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KShhQWN0aW9uUHJvbWlzZXMpO1xuXG5cdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhQ2hhbmdlU2V0TG9jYWxQcm9taXNlcyk7XG5cdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRpZiAoIWhhc0Vycm9yc09yV2FybmluZ3MobVBhcmFtZXRlcnMubW9kZWwpKSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG9wZXJhdGlvbnNIZWxwZXIucmVuZGVyTWVzc2FnZVZpZXcoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlcyxcblx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubGVuZ3RoID4gMVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdQcm9taXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzaFByb21pc2UpIHtcblx0XHRcdFx0XHRcdFx0XHRzaFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlTW9kZWwgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VzSW5Nb2RlbCA9IG1lc3NhZ2VNb2RlbC5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VNb2RlbC5zZXREYXRhKG1lc3NhZ2VzSW5Nb2RlbC5jb25jYXQoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXMpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIlJldHJpZ2dlcmluZyBvZiBzdHJpY3QgaGFuZGxpbmcgYWN0aW9ucyBmYWlsZWRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0fVxuXG5cdFx0XHRhc3luYyBmdW5jdGlvbiBmbkV4ZWN1dGVTZXF1ZW50aWFsbHkoY29udGV4dHNUb0V4ZWN1dGU6IE9EYXRhVjRDb250ZXh0W10pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0Ly8gT25lIGFjdGlvbiBhbmQgaXRzIHNpZGUgZWZmZWN0cyBhcmUgY29tcGxldGVkIGJlZm9yZSB0aGUgbmV4dCBhY3Rpb24gaXMgZXhlY3V0ZWRcblx0XHRcdFx0KFxuXHRcdFx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdFx0XHRmdW5jdGlvbiBub29wKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KShhQWN0aW9uUHJvbWlzZXMpO1xuXHRcdFx0XHRhc3luYyBmdW5jdGlvbiBwcm9jZXNzT25lQWN0aW9uKFxuXHRcdFx0XHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdGFjdGlvbkluZGV4OiBudW1iZXIsXG5cdFx0XHRcdFx0aUNvbnRleHRMZW5ndGg6IG51bWJlclxuXHRcdFx0XHQpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W10+IHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KGAke3NBY3Rpb25OYW1lfSguLi4pYCwgY29udGV4dCwgbUJpbmRpbmdQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHQvLyBBY3Rpb24gb24gdGhlIHRhYmxlIGxldmVsIGlzIGJvdW5kIG9uIGEgY29weSBvZiB0aGUgb0RhdGFMaXN0QmluZGluZywgdG8gZXhlY3V0ZSB0aGUgU2lkZUVmZmVjdHMgd2UgbmVlZFxuXHRcdFx0XHRcdC8vIHRvIGRvIGl0IG9uIHRoZSBvcmlnaW5hbCBvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3QgaW5pdGlhbFRhYmxlQ29udGV4dCA9IChtUGFyYW1ldGVycy5jb250cm9sIGFzIFRhYmxlKT8uZ2V0Um93QmluZGluZz8uKCk/LmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRyZXR1cm4gZm5FeGVjdXRlU2luZ2xlQWN0aW9uKFxuXHRcdFx0XHRcdFx0b0FjdGlvbixcblx0XHRcdFx0XHRcdGFjdGlvbkluZGV4LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0OlxuXHRcdFx0XHRcdFx0XHRcdGluaXRpYWxUYWJsZUNvbnRleHQgJiYgaW5pdGlhbFRhYmxlQ29udGV4dC5nZXRQYXRoKCkgPT09IGNvbnRleHQuZ2V0UGF0aCgpID8gaW5pdGlhbFRhYmxlQ29udGV4dCA6IGNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRpQ29udGV4dExlbmd0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBzZXJpYWxpemF0aW9uOiBwcm9jZXNzT25lQWN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBlbnRyeSBpbiBjb250ZXh0c1RvRXhlY3V0ZSBvbmx5IGFmdGVyIHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIG9uZSBiZWZvcmUgaGFzIGJlZW4gcmVzb2x2ZWRcblx0XHRcdFx0YXdhaXQgY29udGV4dHNUb0V4ZWN1dGUucmVkdWNlKGFzeW5jIChwcm9taXNlOiBQcm9taXNlPHZvaWQ+LCBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHByb21pc2U7XG5cdFx0XHRcdFx0YXdhaXQgcHJvY2Vzc09uZUFjdGlvbihjb250ZXh0LCBpZCArIDEsIGFDb250ZXh0cy5sZW5ndGgpO1xuXHRcdFx0XHR9LCBQcm9taXNlLnJlc29sdmUoKSk7XG5cblx0XHRcdFx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0YXdhaXQgb3BlcmF0aW9uc0hlbHBlci5yZW5kZXJNZXNzYWdlVmlldyhcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdGFDb250ZXh0cy5sZW5ndGggPiAxXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmbkhhbmRsZVJlc3VsdHMoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFiR3JvdXBlZCkge1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIsIGVuc3VyZSB0aGF0IGVhY2ggYWN0aW9uIGFuZCBtYXRjaGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gYXJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIG5leHQgc2V0IGlzIHN1Ym1pdHRlZC4gV29ya2Fyb3VuZCB1bnRpbCBKU09OIGJhdGNoIGlzIGF2YWlsYWJsZS5cblx0XHRcdFx0Ly8gQWxsb3cgYWxzbyBmb3IgTGlzdCBSZXBvcnQuXG5cdFx0XHRcdGZuRXhlY3V0ZVNlcXVlbnRpYWxseShhQ29udGV4dHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm5FeGVjdXRlQ2hhbmdlc2V0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIGZuSGFuZGxlUmVzdWx0cygpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0Ly8gUHJvbWlzZS5hbGxTZXR0bGVkIHdpbGwgbmV2ZXIgYmUgcmVqZWN0ZWQuIEhvd2V2ZXIsIGVzbGludCByZXF1aXJlcyBlaXRoZXIgY2F0Y2ggb3IgcmV0dXJuIC0gdGh1cyB3ZSByZXR1cm4gdGhlIHJlc3VsdGluZyBQcm9taXNlIGFsdGhvdWdoIG5vIG9uZSB3aWxsIHVzZSBpdC5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChhQWN0aW9uUHJvbWlzZXMpLnRoZW4ocmVzb2x2ZSk7XG5cdFx0XHR9XG5cdFx0fSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHQoXG5cdFx0XHRcdGZuT25SZXNwb25zZSB8fFxuXHRcdFx0XHRmdW5jdGlvbiBub29wKCk6IHZvaWQge1xuXHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0fVxuXHRcdFx0KSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NBY3Rpb25OYW1lfSguLi4pYCk7XG5cdFx0c2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImFjdGlvbkltcG9ydFwiO1xuXHRcdGNvbnN0IG9BY3Rpb25Qcm9taXNlOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiA9IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0b3BlcmF0aW9uc0hlbHBlci5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0b3BlcmF0aW9ucyxcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdHsgbGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLCBtb2RlbDogb01vZGVsIH0sXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuXHRcdFx0KVxuXHRcdCk7XG5cdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHQvLyB0cmlnZ2VyIG9uU3VibWl0dGVkIFwiZXZlbnRcIlxuXHRcdChcblx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdC8qKi9cblx0XHRcdH1cblx0XHQpKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRyZXR1cm4gb0FjdGlvblByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChjdXJyZW50UHJvbWlzZVZhbHVlOiB1bmtub3duKSB7XG5cdFx0XHRcdC8vIEhlcmUgd2UgZW5zdXJlIHRoYXQgd2UgcmV0dXJuIHRoZSByZXNwb25zZSB3ZSBnb3QgZnJvbSBhbiB1bmJvdW5kIGFjdGlvbiB0byB0aGVcblx0XHRcdFx0Ly8gY2FsbGVyIEJDUCA6IDIyNzAxMzkyNzlcblx0XHRcdFx0aWYgKGN1cnJlbnRQcm9taXNlVmFsdWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gY3VycmVudFByb21pc2VWYWx1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gb0FjdGlvbi5nZXRCb3VuZENvbnRleHQ/LigpPy5nZXRPYmplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyBhY3Rpb24gXCIgKyBzQWN0aW9uTmFtZSwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdChcblx0XHRcdFx0XHRmbk9uUmVzcG9uc2UgfHxcblx0XHRcdFx0XHRmdW5jdGlvbiBub29wKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KSgpO1xuXHRcdFx0fSk7XG5cdH1cbn1cbmZ1bmN0aW9uIF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0OiBDb250ZXh0LCBzQWN0aW9uTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IHNQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpO1xuXHRzUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpID8gc1BhdGguc3BsaXQoXCJAJHVpNS5vdmVybG9hZFwiKVswXSA6IHNQYXRoLnNwbGl0KFwiLzBcIilbMF07XG5cdHJldHVybiBzUGF0aC5zcGxpdChgLyR7c0FjdGlvbk5hbWV9YClbMF07XG59XG5cbmZ1bmN0aW9uIF92YWx1ZXNQcm92aWRlZEZvckFsbFBhcmFtZXRlcnMoXG5cdGlzQ3JlYXRlQWN0aW9uOiBib29sZWFuLFxuXHRhY3Rpb25QYXJhbWV0ZXJzOiB7ICROYW1lOiBzdHJpbmcgfVtdLFxuXHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuXHRzdGFydHVwUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBib29sZWFuIHtcblx0aWYgKHBhcmFtZXRlclZhbHVlcykge1xuXHRcdC8vIElmIHNob3dEaWFsb2cgaXMgZmFsc2UgYnV0IHRoZXJlIGFyZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGludm9rZUFjdGlvbiBjYWxsLCB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdmFsdWVzIGhhdmUgYmVlblxuXHRcdC8vIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbVxuXHRcdGZvciAoY29uc3QgYWN0aW9uUGFyYW1ldGVyIG9mIGFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0YWN0aW9uUGFyYW1ldGVyLiROYW1lICE9PSBcIlJlc3VsdElzQWN0aXZlRW50aXR5XCIgJiZcblx0XHRcdFx0IXBhcmFtZXRlclZhbHVlcz8uZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5uYW1lID09PSBhY3Rpb25QYXJhbWV0ZXIuJE5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gQXQgbGVhc3QgZm9yIG9uZSBwYXJhbWV0ZXIgbm8gdmFsdWUgaGFzIGJlZW4gcHJvdmlkZWQsIHNvIHdlIGNhbid0IHNraXAgdGhlIGRpYWxvZ1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGlzQ3JlYXRlQWN0aW9uICYmIHN0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0Ly8gSWYgcGFyYW1ldGVycyBoYXZlIGJlZW4gcHJvdmlkZWQgZHVyaW5nIGFwcGxpY2F0aW9uIGxhdW5jaCwgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgc2V0IGlzIGNvbXBsZXRlXG5cdFx0Ly8gSWYgbm90LCB0aGUgcGFyYW1ldGVyIGRpYWxvZyBzdGlsbCBuZWVkcyB0byBiZSBzaG93bi5cblx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlciBvZiBhY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoIXN0YXJ0dXBQYXJhbWV0ZXJzW2FjdGlvblBhcmFtZXRlci4kTmFtZV0pIHtcblx0XHRcdFx0Ly8gQXQgbGVhc3QgZm9yIG9uZSBwYXJhbWV0ZXIgbm8gdmFsdWUgaGFzIGJlZW4gcHJvdmlkZWQsIHNvIHdlIGNhbid0IHNraXAgdGhlIGRpYWxvZ1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmblJlcXVlc3RTaWRlRWZmZWN0cyhcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRvU2lkZUVmZmVjdDogKEFjdGlvblNpZGVFZmZlY3RzVHlwZSAmIHsgY29udGV4dDogT0RhdGFWNENvbnRleHQgfSkgfCB1bmRlZmluZWQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdHNlbGVjdGVkSXRlbXM6IE9EYXRhVjRDb250ZXh0W107XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdH0sXG5cdHNHcm91cElkOiBzdHJpbmcsXG5cdGFMb2NhbFByb21pc2U/OiB1bmtub3duW11cbik6IHZvaWQge1xuXHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0bGV0IG9Mb2NhbFByb21pc2U7XG5cdC8vIHRyaWdnZXIgYWN0aW9ucyBmcm9tIHNpZGUgZWZmZWN0c1xuXHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0b1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc1RyaWdnZXJBY3Rpb246IHN0cmluZykge1xuXHRcdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0aWYgKGFMb2NhbFByb21pc2UpIHtcblx0XHRcdFx0XHRhTG9jYWxQcm9taXNlLnB1c2gob0xvY2FsUHJvbWlzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvLyByZXF1ZXN0IHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBhY3Rpb25cblx0Ly8gYXMgd2UgbW92ZSB0aGUgbWVzc2FnZXMgcmVxdWVzdCB0byBQT1NUICRzZWxlY3Qgd2UgbmVlZCB0byBiZSBwcmVwYXJlZCBmb3IgYW4gZW1wdHkgYXJyYXlcblx0aWYgKG9TaWRlRWZmZWN0ICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMubGVuZ3RoID4gMCkge1xuXHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRpZiAoYUxvY2FsUHJvbWlzZSkge1xuXHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9Mb2NhbFByb21pc2UpO1xuXHRcdH1cblx0XHRvTG9jYWxQcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdEpTT04ucGFyc2UobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnNlbGVjdGVkSXRlbXMsXG5cdFx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyB0byBjYWxsIE9EYXRhIGFjdGlvbnMgKGJvdW5kL2ltcG9ydCkgYW5kIGZ1bmN0aW9ucyAoYm91bmQvaW1wb3J0KVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxCb3VuZEFjdGlvbjogY2FsbEJvdW5kQWN0aW9uLFxuXHRjYWxsQWN0aW9uSW1wb3J0OiBjYWxsQWN0aW9uSW1wb3J0LFxuXHRjYWxsQm91bmRGdW5jdGlvbjogY2FsbEJvdW5kRnVuY3Rpb24sXG5cdGNhbGxGdW5jdGlvbkltcG9ydDogY2FsbEZ1bmN0aW9uSW1wb3J0LFxuXHRleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzOiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzLFxuXHRjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uOiBjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uLFxuXHR2YWx1ZXNQcm92aWRlZEZvckFsbFBhcmFtZXRlcnM6IF92YWx1ZXNQcm92aWRlZEZvckFsbFBhcmFtZXRlcnMsXG5cdGdldEFjdGlvblBhcmFtZXRlckFjdGlvbk5hbWU6IF9nZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lLFxuXHRhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrOiBhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrLFxuXHRhZnRlckFjdGlvblJlc29sdXRpb246IGFmdGVyQWN0aW9uUmVzb2x1dGlvbixcblx0aGFzRXJyb3JzT3JXYXJuaW5nczogaGFzRXJyb3JzT3JXYXJuaW5nc1xufTtcblxuZXhwb3J0IGRlZmF1bHQgb3BlcmF0aW9ucztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7O0VBaURBLE1BQU1BLFNBQVMsR0FBR0MsU0FBUyxDQUFDRCxTQUFTO0lBQ3BDRSxrQkFBa0IsR0FBR0QsU0FBUyxDQUFDQyxrQkFBa0I7RUFDbEQsTUFBTUMsTUFBTSxHQUFHQyxVQUFVLENBQUNELE1BQU07RUFJaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
|
|
1590
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25zdGFudHMiLCJGRUxpYnJhcnkiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJBY3Rpb24iLCJNZXNzYWdlQm94IiwiY2FsbEJvdW5kQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJjb250ZXh0cyIsIm9Nb2RlbCIsIm9BcHBDb21wb25lbnQiLCJtUGFyYW1ldGVycyIsInN0cmljdEhhbmRsaW5nVXRpbGl0aWVzIiwiaXM0MTJFeGVjdXRlZCIsInN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzIiwic3RyaWN0SGFuZGxpbmdQcm9taXNlcyIsInN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzIiwiZGVsYXlTdWNjZXNzTWVzc2FnZXMiLCJwcm9jZXNzZWRNZXNzYWdlSWRzIiwibGVuZ3RoIiwiUHJvbWlzZSIsInJlamVjdCIsImlzQ2FsbGVkV2l0aEFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiYUNvbnRleHRzIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNBY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwib0JvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJpc0NyaXRpY2FsQWN0aW9uIiwiQWN0aW9uUnVudGltZSIsImdldElzQWN0aW9uQ3JpdGljYWwiLCJleHRyYWN0U2luZ2xlUmVzdWx0IiwicmVzdWx0Iiwic3RhdHVzIiwidmFsdWUiLCJyZWFzb24iLCJjYWxsQWN0aW9uIiwidGhlbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJhY3Rpb25OYW1lIiwibW9kZWwiLCJhcHBDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwibWV0YU1vZGVsIiwiYWN0aW9uUGF0aCIsImJpbmRDb250ZXh0IiwiYWN0aW9uTmFtZUZyb21Nb2RlbCIsImdldE9iamVjdCIsIiRBY3Rpb24iLCJ1bmJvdW5kQWN0aW9uSW5kZXgiLCJmaW5kSW5kZXgiLCJhY3Rpb24iLCIkSXNCb3VuZCIsImFjdGlvbkltcG9ydCIsImNhbGxCb3VuZEZ1bmN0aW9uIiwic0Z1bmN0aW9uTmFtZSIsImNvbnRleHQiLCJzRnVuY3Rpb25QYXRoIiwib0JvdW5kRnVuY3Rpb24iLCJfZXhlY3V0ZUZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwicmVzb2x2ZSIsIm9GdW5jdGlvbkltcG9ydCIsIm9GdW5jdGlvbiIsInNHcm91cElkIiwiRXJyb3IiLCJmdW5jdGlvblRvQ2FsbCIsIm9GdW5jdGlvblByb21pc2UiLCJleGVjdXRlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwiYkdyb3VwZWQiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJDaGFuZ2VTZXQiLCJmbkRpYWxvZyIsIm9BY3Rpb25Qcm9taXNlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2tpcFBhcmFtZXRlckRpYWxvZyIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXRhUGF0aCIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJiSXNTYW1lRW50aXR5Iiwib1JldHVyblR5cGUiLCJiVmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzIiwiYWN0aW9uRGVmaW5pdGlvbiIsImFBY3Rpb25QYXJhbWV0ZXJzIiwiZ2V0QWN0aW9uUGFyYW1ldGVycyIsImJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZyIsIiROYW1lIiwiYVBhcmFtZXRlclZhbHVlcyIsInBhcmFtZXRlclZhbHVlcyIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwiX3ZhbHVlc1Byb3ZpZGVkRm9yQWxsUGFyYW1ldGVycyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJjb25maXJtQ3JpdGljYWxBY3Rpb24iLCJtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyIsImZuT25TdWJtaXR0ZWQiLCJvblN1Ym1pdHRlZCIsImZuT25SZXNwb25zZSIsIm9uUmVzcG9uc2UiLCJiR2V0Qm91bmRDb250ZXh0IiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwic2VsZWN0ZWRJdGVtcyIsImFkZGl0aW9uYWxTaWRlRWZmZWN0IiwicGF0aEV4cHJlc3Npb25zIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXNzYWdlc1BhdGgiLCJleHAiLCIkaXNDb2xsZWN0aW9uIiwiZ2V0TW9kZWwiLCIkVHlwZSIsIm1CaW5kaW5nUGFyYW1ldGVycyIsIiRzZWxlY3QiLCJzcGxpdCIsImluY2x1ZGVzIiwicHVzaCIsInRyaWdnZXJBY3Rpb25zIiwic3BsaWNlIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJpc0NyZWF0ZUFjdGlvbiIsImJPYmplY3RQYWdlIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiZ3JvdXBJZCIsImNvbnRyb2xJZCIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImlzU3RhdGljIiwiJFBhcmFtZXRlciIsInNvbWUiLCJhUGFyYW1ldGVyIiwiJEVudGl0eVNldFBhdGgiLCJlbnRpdHlTZXROYW1lIiwibWVzc2FnZUhhbmRsZXIiLCJpZ25vcmVFVGFnIiwib09wZXJhdGlvblJlc3VsdCIsImFmdGVyQWN0aW9uUmVzb2x1dGlvbiIsImNhdGNoIiwiaSIsImZpbmQiLCJlbGVtZW50IiwibmFtZSIsIl9leGVjdXRlQWN0aW9uIiwibWVzc2FnZXMiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiY29uY2F0Iiwic3RyaWN0SGFuZGxpbmdGYWlscyIsImFGYWlsZWRDb250ZXh0cyIsImZvckVhY2giLCJmYWlsIiwiZ2V0Q29udGV4dCIsIm9GYWlsZWRPcGVyYXRpb25SZXN1bHQiLCJhZGRNZXNzYWdlcyIsInNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0IiwiaGFzVHJhbnNpdGlvbkVycm9yc09yV2FybmluZ3MiLCJzaG93TWVzc2FnZURpYWxvZyIsIm9uQmVmb3JlU2hvd01lc3NhZ2UiLCJhTWVzc2FnZXMiLCJzaG93TWVzc2FnZVBhcmFtZXRlcnNJbiIsImFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2siLCJ1bmRlZmluZWQiLCJhU2VsZWN0ZWRDb250ZXh0cyIsIm9BY3Rpb25Db250ZXh0Iiwib1BhcmVudENvbnRyb2wiLCJib3VuZEFjdGlvbk5hbWUiLCJzdWZmaXhSZXNvdXJjZUtleSIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwic0NvbmZpcm1hdGlvblRleHQiLCJnZXRUZXh0IiwiY29uZmlybSIsIm9uQ2xvc2UiLCJzQWN0aW9uIiwiT0siLCJvT3BlcmF0aW9uIiwib0Vycm9yIiwiZSIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImV4ZWN1dGVBUE1BY3Rpb24iLCJvRGlhbG9nIiwiYWZ0ZXI0MTIiLCJhUmVzdWx0Iiwib1NpbmdsZVJlc3VsdCIsImF0dGFjaEV2ZW50T25jZSIsImlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nT3BlbiIsImlzT3BlbiIsInNlbGVjdGVkQ29udGV4dHMiLCJnZXRQcm9wZXJ0eSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJpc0EiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiRGVsZXRlSGVscGVyIiwidXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMiLCJzaG93TWVzc2FnZUJveCIsIm9Db250cm9sIiwib1Jlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwidW5ib3VuZE1lc3NhZ2VzIiwiZmlsdGVyIiwibWVzc2FnZSIsImdldFRhcmdldHMiLCJBUERtZXNzYWdlcyIsImFjdGlvblBhcmFtIiwiQVBETWVzc2FnZSIsImlzQVBEVGFyZ2V0IiwiZXJyb3JUYXJnZXRzSW5BUEQiLCJoYXNDaGFuZ2VTZXRNb2RpZmllZE1lc3NhZ2UiLCJzTWVzc2FnZSIsInNEZXNjcmlwdGlvblRleHQiLCJtZXNzYWdlTW9kZWwiLCJtZXNzYWdlc0luTW9kZWwiLCJhQm91bmRNZXNzYWdlcyIsIm1lc3NhZ2VIYW5kbGluZyIsImdldE1lc3NhZ2VzIiwiZ2VuZXJpY01lc3NhZ2UiLCJpc0VkaXRhYmxlIiwibm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5EaWFsb2ciLCJnZXRUeXBlIiwibm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5Nb2RlbCIsInNldE1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiTWVzc2FnZSIsInR5cGUiLCJNZXNzYWdlVHlwZSIsInRhcmdldCIsInBlcnNpc3RlbnQiLCJkZXNjcmlwdGlvbiIsImNvZGUiLCJ1bnNoaWZ0IiwiY2xvc2UiLCJkZXN0cm95IiwiZmlsdGVyZWRNZXNzYWdlcyIsImJJc0FQRE9wZW4iLCJmbkdldE1lc3NhZ2VTdWJ0aXRsZSIsInNldE1lc3NhZ2VTdWJ0aXRsZSIsImJpbmQiLCJzaG93Q2hhbmdlU2V0RXJyb3JEaWFsb2ciLCJzUGF0aCIsIl9nZXRQYXRoIiwiZW50aXR5U2V0Q29udGV4dCIsInNBY3Rpb25OYW1lUGF0aCIsImFjdGlvbk5hbWVDb250ZXh0Iiwic0ZyYWdtZW50TmFtZSIsImFjdGlvblBhcmFtZXRlckluZm9zIiwiX3JlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW10ZXIiLCJwYXJhbWV0ZXIiLCJhbGxNZXNzYWdlcyIsImdlbmVyYXRlIiwicmVsZXZhbnRNZXNzYWdlcyIsIm1zZyIsImdldENvbnRyb2xJZHMiLCJpZCIsInJlbW92ZU1lc3NhZ2VzIiwib0NvbnRyb2xsZXIiLCJoYW5kbGVDaGFuZ2UiLCJvRXZlbnQiLCJmaWVsZCIsImdldFNvdXJjZSIsImFjdGlvblBhcmFtZXRlckluZm8iLCJ2YWxpZGF0aW9uUHJvbWlzZSIsImdldFBhcmFtZXRlciIsImhhc0Vycm9yIiwiZXJyb3IiLCJfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlciIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwib1BhcmFtZXRlck1vZGVsIiwiSlNPTk1vZGVsIiwiJGRpc3BsYXlNb2RlIiwiY3JlYXRlZEZyYWdtZW50IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVNldCIsIm1vZGVscyIsImFGdW5jdGlvblBhcmFtcyIsIkNvbW1vblV0aWxzIiwic2V0VXNlckRlZmF1bHRzIiwib0RpYWxvZ0NvbnRlbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm1hcCIsImFjdGlvblBhcmFtZXRlciIsIkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImlzTXVsdGlWYWx1ZSIsImFjdGlvblJlc3VsdCIsImRpYWxvZ0NhbmNlbGxlZCIsImJ1dHRvbkxvY2siLCJEaWFsb2ciLCJ0aXRsZSIsImNvbnRlbnQiLCJlc2NhcGVIYW5kbGVyIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0ZXh0IiwiX2dldEFjdGlvblBhcmFtZXRlckFjdGlvbk5hbWUiLCJwcmVzcyIsIl92YWxpZGF0ZVByb3BlcnRpZXMiLCJCdXN5TG9ja2VyIiwibG9jayIsImZhaWxlZENvbnRleHRzIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwidlBhcmFtZXRlclZhbHVlIiwiYWxsTnVsbFBhcmFtZXRlcnMiLCJvUGFyYW1ldGVyQ29udGV4dCIsIm9PcGVyYXRpb25CaW5kaW5nIiwiZ2V0UGFyYW1ldGVyQ29udGV4dCIsImFNVkZDb250ZW50IiwiYUtleVZhbHVlcyIsImoiLCJLZXkiLCJzZXRQcm9wZXJ0eSIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwiaW5uZXJQYXJhbWV0ZXJzIiwiT2JqZWN0IiwiYXNzaWduIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJzaG93TWVzc2FnZXMiLCJtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjayIsInNob3dNZXNzYWdlUGFyYW1ldGVycyIsImVuZEJ1dHRvbiIsImJlZm9yZU9wZW4iLCJvQ2xvbmVFdmVudCIsImdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsInNEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyIsInNCaW5kaW5nUGFyYW1ldGVyIiwic0JvdW5kRnVuY3Rpb25OYW1lIiwicGFyYW1ldGVyTW9kZWxEYXRhIiwicHJlZmlsbFBhcmFtZXRlciIsInNQYXJhbU5hbWUiLCJ2UGFyYW1EZWZhdWx0VmFsdWUiLCIkUGF0aCIsInZQYXJhbVZhbHVlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5IiwicmVxdWVzdFByb3BlcnR5Iiwic1BhdGhGb3JDb250ZXh0IiwiaW5kZXhPZiIsInJlcGxhY2UiLCJwYXJhbU5hbWUiLCJiTm9Qb3NzaWJsZVZhbHVlIiwiTG9nIiwiYkxhdGVQcm9wZXJ0eUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblBhdGgiLCJnZXRQYXJhbWV0ZXJQYXRoIiwib1BhcmFtZXRlckFubm90YXRpb25zIiwib1BhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUiLCJ2UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwiYVByZWZpbGxQYXJhbVByb21pc2VzIiwiYWxsIiwiYUV4ZWNGdW5jdGlvblByb21pc2VzIiwib0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2UiLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJGUE1IZWxwZXIiLCJhY3Rpb25XcmFwcGVyIiwiYVByb21pc2VzIiwiY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlIiwiZnVuY3Rpb25QYXJhbXMiLCJvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QiLCJzRGlhbG9nUGFyYW1OYW1lIiwidlBhcmFtZXRlclByb3ZpZGVkVmFsdWUiLCJzZXRQYXJhbWV0ZXIiLCJiRXJyb3JGb3VuZCIsIm9WYWx1ZSIsInNUZXh0Iiwid2FybmluZyIsImNvbnRlbnRXaWR0aCIsImZuQXN5bmNCZWZvcmVPcGVuIiwiYVBhcmFtZXRlcnMiLCJvQ29udGV4dE9iamVjdCIsInJlcXVlc3RPYmplY3QiLCJnZXRJdGVtcyIsImdldFZhbHVlIiwiYWZ0ZXJDbG9zZSIsInNldE1vZGVsIiwiYmluZEVsZW1lbnQiLCJwYXRoIiwib01WRk1vZGVsIiwiZ2V0QmluZGluZyIsImF0dGFjaENoYW5nZSIsImFkZERlcGVuZGVudCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0QmluZGluZyIsIm9wZW4iLCJzbGljZSIsInNFbnRpdHlTZXROYW1lIiwiYUFjdGlvbk5hbWUiLCJzS2V5IiwiYlJlc291cmNlS2V5RXhpc3RzIiwiY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzIiwiZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyIsImlDb250ZXh0TGVuZ3RoIiwiY3VycmVudF9jb250ZXh0X2luZGV4IiwiaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUiLCJpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0IiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJvcGVyYXRpb25zSGVscGVyIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwib3BlcmF0aW9ucyIsInVwZGF0ZTQxMlRyYW5zaXN0aW9uTWVzc2FnZXMiLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJvbmx5U3VjY2Vzc01lc3NhZ2VzIiwidHJhbnNpdGlvbk1lc3NhZ2VzIiwiaXNEdXBsaWNhdGUiLCJnZXRJZCIsIlN1Y2Nlc3MiLCJnZXRQZXJzaXN0ZW50IiwiY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbiIsIm9Mb2NhbEFjdGlvblByb21pc2UiLCJ1bkJvdW5kTXNncyIsImJvdW5kTXNncyIsInNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFBY3Rpb25Qcm9taXNlcyIsIm9pbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlT2JqZWN0IiwiZm5FeGVjdXRlQWN0aW9uIiwiYWN0aW9uQ29udGV4dCIsIm9TaWRlRWZmZWN0IiwiaW5kaXZpZHVhbEFjdGlvblByb21pc2UiLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZm5SZXF1ZXN0U2lkZUVmZmVjdHMiLCJhbGxTZXR0bGVkIiwiZm5FeGVjdXRlU2luZ2xlQWN0aW9uIiwiZm5FeGVjdXRlQ2hhbmdlc2V0IiwiYUNoYW5nZVNldExvY2FsUHJvbWlzZXMiLCJub29wIiwicmVuZGVyTWVzc2FnZVZpZXciLCJzaFByb21pc2UiLCJzZXREYXRhIiwiZm5IYW5kbGVSZXN1bHRzIiwiZm5FeGVjdXRlU2VxdWVudGlhbGx5IiwiY29udGV4dHNUb0V4ZWN1dGUiLCJwcm9jZXNzT25lQWN0aW9uIiwiYWN0aW9uSW5kZXgiLCJpbml0aWFsVGFibGVDb250ZXh0IiwiZ2V0Um93QmluZGluZyIsImdldEhlYWRlckNvbnRleHQiLCJyZWR1Y2UiLCJwcm9taXNlIiwiZmluYWxseSIsImFsbFByb21pc2UiLCJzaWRlRWZmZWN0IiwiY3VycmVudFByb21pc2VWYWx1ZXMiLCJjdXJyZW50UHJvbWlzZVZhbHVlIiwiYWN0aW9uUGFyYW1ldGVycyIsImFMb2NhbFByb21pc2UiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwib0xvY2FsUHJvbWlzZSIsInNUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsInZhbHVlc1Byb3ZpZGVkRm9yQWxsUGFyYW1ldGVycyIsImdldEFjdGlvblBhcmFtZXRlckFjdGlvbk5hbWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImZhY2FkZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBTaG93TWVzc2FnZVBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgRGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgeyBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSB7IERpYWxvZyRCZWZvcmVPcGVuRXZlbnQgfSBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uLy4uLy4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IG9wZXJhdGlvbnNIZWxwZXIsIHsgdHlwZSBTdHJpY3RIYW5kbGluZ1BhcmFtZXRlcnMsIHR5cGUgU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgfSBmcm9tIFwiLi4vLi4vLi4vb3BlcmF0aW9uc0hlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uLy4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblBhcmFtZXRlciwgQWN0aW9uUGFyYW1ldGVySW5mbyB9IGZyb20gXCIuL19pbnRlcm5hbFwiO1xuaW1wb3J0IHsgX2FkZE1lc3NhZ2VGb3JBY3Rpb25QYXJhbWV0ZXIsIF92YWxpZGF0ZVByb3BlcnRpZXMgfSBmcm9tIFwiLi9faW50ZXJuYWxcIjtcblxuY29uc3QgQ29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0SW52b2NhdGlvbkdyb3VwaW5nID0gRkVMaWJyYXJ5Lkludm9jYXRpb25Hcm91cGluZztcbmNvbnN0IEFjdGlvbiA9IE1lc3NhZ2VCb3guQWN0aW9uO1xuXG5leHBvcnQgdHlwZSBBY3Rpb25SZXNwb25zZSA9IHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQ+W107XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBhY3Rpb24gZm9yIG9uZSBvciBtdWx0aXBsZSBjb250ZXh0cy5cbiAqXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBjb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBiZSBjYWxsZWRcbiAqIEBwYXJhbSBvTW9kZWwgT0RhdGEgTW9kZWxcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVyc10gQSBtYXAgb2YgYmluZGluZyBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgcGFydCBvZiAkc2VsZWN0IGFuZCAkZXhwYW5kIGNvbWluZyBmcm9tIHNpZGUgZWZmZWN0cyBmb3IgYm91bmQgYWN0aW9uc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdF0gQXJyYXkgb2YgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIGluIGFkZGl0aW9uIHRvIGFjdHVhbCB0YXJnZXQgcHJvcGVydGllcyBvZiB0aGUgc2lkZSBlZmZlY3RcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogQ2hhbmdlc2V0IHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgSXNvbGF0ZWQgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzLCBkZWZhdWx0cyB0byBJc29sYXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXSBJZiBzcGVjaWZpZWQsIHRoZSBkaWFsb2dzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbnQgb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaWdub3JlRVRhZ10gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcbiAqIEBwYXJhbSBbc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNdIE9wdGlvbmFsLCB1dGlsaXR5IGZsYWdzIGFuZCBtZXNzYWdlcyBmb3Igc3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcz86IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG4pOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdGlmICghc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMpIHtcblx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyA9IHtcblx0XHRcdGlzNDEyRXhlY3V0ZWQ6IGZhbHNlLFxuXHRcdFx0c3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHM6IFtdLFxuXHRcdFx0c3RyaWN0SGFuZGxpbmdQcm9taXNlczogW10sXG5cdFx0XHRzdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlczogW10sXG5cdFx0XHRkZWxheVN1Y2Nlc3NNZXNzYWdlczogW10sXG5cdFx0XHRwcm9jZXNzZWRNZXNzYWdlSWRzOiBbXVxuXHRcdH07XG5cdH1cblx0aWYgKCFjb250ZXh0cyB8fCBjb250ZXh0cy5sZW5ndGggPT09IDApIHtcblx0XHQvL0luIEZyZWVzdHlsZSBhcHBzIGJvdW5kIGFjdGlvbnMgY2FuIGhhdmUgbm8gY29udGV4dFxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGFjdGlvbnMgYWx3YXlzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjb250ZXh0XCIpO1xuXHR9XG5cdC8vIHRoaXMgbWV0aG9kIGVpdGhlciBhY2NlcHRzIHNpbmdsZSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzXG5cdC8vIFRPRE86IFJlZmFjdG9yIHRvIGFuIHVuYW1iaWd1b3MgQVBJXG5cdGNvbnN0IGlzQ2FsbGVkV2l0aEFycmF5ID0gQXJyYXkuaXNBcnJheShjb250ZXh0cyk7XG5cblx0Ly8gaW4gY2FzZSBvZiBzaW5nbGUgY29udGV4dCB3cmFwIGludG8gYW4gYXJyYXkgZm9yIGNhbGxlZCBtZXRob2RzIChlc3AuIGNhbGxBY3Rpb24pXG5cdG1QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGlzQ2FsbGVkV2l0aEFycmF5ID8gY29udGV4dHMgOiBbY29udGV4dHNdO1xuXG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0Ly8gQW5hbHl6aW5nIG1ldGFNb2RlbFBhdGggZm9yIGFjdGlvbiBvbmx5IGZyb20gZmlyc3QgY29udGV4dCBzZWVtcyB3ZWlyZCwgYnV0IHByb2JhYmx5IHdvcmtzIGluIGFsbCBleGlzdGluZyBzemVuYXJpb3MgLSBpZiBzZXZlcmFsIGNvbnRleHRzIGFyZSBwYXNzZWQsIHRoZXkgcHJvYmFibHlcblx0XHQvLyBiZWxvbmcgdG8gdGhlIHNhbWUgbWV0YW1vZGVscGF0aC4gVE9ETzogQ2hlY2ssIHdoZXRoZXIgdGhpcyBjYW4gYmUgaW1wcm92ZWQgLyBzemVuYXJpb3Mgd2l0aCBkaWZmZXJlbnQgbWV0YU1vZGVsUGF0aHMgbWlnaHQgZXhpc3Rcblx0XHRzQWN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgobVBhcmFtZXRlcnMuYUNvbnRleHRzWzBdLmdldFBhdGgoKSl9LyR7c0FjdGlvbk5hbWV9YCxcblx0XHRvQm91bmRBY3Rpb24gPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NBY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZC8wYCkhO1xuXHRtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uID0gYXdhaXQgQWN0aW9uUnVudGltZS5nZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWwsIHNBY3Rpb25QYXRoLCBtUGFyYW1ldGVycy5hQ29udGV4dHMpO1xuXG5cdC8vIFByb21pc2UgcmV0dXJuZWQgYnkgY2FsbEFjdGlvbiBjdXJyZW50bHkgaXMgcmVqZWN0ZWQgaW4gY2FzZSBvZiBleGVjdXRpb24gZm9yIG11bHRpcGxlIGNvbnRleHRzIHBhcnRseSBmYWlsaW5nLiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIChzb21lIGZhaWxpbmcgY29udGV4dHMgZG8gbm90IG1lYW5cblx0Ly8gdGhhdCBmdW5jdGlvbiBkaWQgbm90IGZ1bGZpbGwgaXRzIHRhc2spLCBidXQgYXMgdGhpcyBpcyBhIGJpZ2dlciByZWZhY3RvcmluZywgZm9yIHRoZSB0aW1lIGJlaW5nIHdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoYXQgYXQgdGhlIGNhbGxpbmcgcGxhY2UgKGkuZS4gaGVyZSlcblx0Ly8gPT4gcHJvdmlkZSB0aGUgc2FtZSBoYW5kbGVyIChtYXBwaW5nIGJhY2sgZnJvbSBhcnJheSB0byBzaW5nbGUgcmVzdWx0L2Vycm9yIGlmIG5lZWRlZCkgZm9yIHJlc29sdmVkL3JlamVjdGVkIGNhc2Vcblx0Y29uc3QgZXh0cmFjdFNpbmdsZVJlc3VsdCA9IGZ1bmN0aW9uIChyZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdKTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdC8vIHNpbmdsZSBhY3Rpb24gY291bGQgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWRcblx0XHRpZiAocmVzdWx0WzBdLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuXHRcdFx0cmV0dXJuIHJlc3VsdFswXS52YWx1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkaWFsb2cgY2FuY2VsbGF0aW9uLCBubyBhcnJheSBpcyByZXR1cm5lZCA9PiB0aHJvdyB0aGUgcmVzdWx0LlxuXHRcdFx0Ly8gSWRlYWxseSwgZGlmZmVyZW50aWF0aW5nIHNob3VsZCBub3QgYmUgbmVlZGVkIGhlcmUgPT4gVE9ETzogRmluZCBiZXR0ZXIgc29sdXRpb24gd2hlbiBzZXBhcmF0aW5nIGRpYWxvZyBoYW5kbGluZyAoc2luZ2xlIG9iamVjdCB3aXRoIHNpbmdsZSByZXN1bHQpIGZyb20gYmFja2VuZFxuXHRcdFx0Ly8gZXhlY3V0aW9uIChwb3RlbnRpYWxseSBtdWx0aXBsZSBvYmplY3RzKVxuXHRcdFx0dGhyb3cgcmVzdWx0WzBdLnJlYXNvbiB8fCByZXN1bHQ7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBjYWxsQWN0aW9uKHNBY3Rpb25OYW1lLCBvTW9kZWwsIG9Cb3VuZEFjdGlvbiwgb0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMsIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzKS50aGVuKFxuXHRcdChyZXN1bHQpID0+IHtcblx0XHRcdGlmIChpc0NhbGxlZFdpdGhBcnJheSkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGV4dHJhY3RTaW5nbGVSZXN1bHQocmVzdWx0IGFzIFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0PltdKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdChyZXN1bHQpID0+IHtcblx0XHRcdGlmIChpc0NhbGxlZFdpdGhBcnJheSkge1xuXHRcdFx0XHR0aHJvdyByZXN1bHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZXh0cmFjdFNpbmdsZVJlc3VsdChyZXN1bHQgYXMgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQ+W10pO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn1cbi8qKlxuICogQ2FsbHMgYW4gYWN0aW9uIGltcG9ydC5cbiAqXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIGltcG9ydCB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBtb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzXSBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFtwYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ddIElmIHNldCBhbmQgaWYgcGFyYW1ldGVycyBleGlzdCB0aGUgdXNlciByZXRyaWV2ZXMgYSBkaWFsb2cgdG8gZmlsbCBpbiBwYXJhbWV0ZXJzLCBpZiBhY3Rpb25QYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhleSBhcmUgc2hvd24gdG8gdGhlIHVzZXJcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuaWdub3JlRVRhZ10gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcbiAqIEBwYXJhbSBbc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNdIE9wdGlvbmFsLCB1dGlsaXR5IGZsYWdzIGFuZCBtZXNzYWdlcyBmb3Igc3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsQWN0aW9uSW1wb3J0KFxuXHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG1vZGVsOiBPRGF0YU1vZGVsLFxuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0cGFyYW1ldGVyczoge1xuXHRcdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W107XG5cdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdD86IEFjdGlvblNpZGVFZmZlY3RzVHlwZTtcblx0XHRvblN1Ym1pdHRlZDogRnVuY3Rpb247XG5cdFx0b25SZXNwb25zZTogRnVuY3Rpb247XG5cdFx0cGFyZW50Q29udHJvbDogVmlldztcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyO1xuXHRcdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0XHRzZWxlY3RlZEl0ZW1zPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0fSAmIHtcblx0XHRpc0NyaXRpY2FsQWN0aW9uPzogYm9vbGVhbjtcblx0fSxcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM/OiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRpZiAoIW1vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQWN0aW9uIGV4cGVjdHMgYSBtb2RlbC9jb250ZXh0IGZvciBleGVjdXRpb25cIik7XG5cdH1cblx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0YWN0aW9uUGF0aCA9IG1vZGVsLmJpbmRDb250ZXh0KGAvJHthY3Rpb25OYW1lfWApLmdldFBhdGgoKSxcblx0XHRhY3Rpb25OYW1lRnJvbU1vZGVsID0gbWV0YU1vZGVsLmdldE9iamVjdChhY3Rpb25QYXRoKS4kQWN0aW9uLFxuXHRcdHVuYm91bmRBY3Rpb25JbmRleCA9IChtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHthY3Rpb25OYW1lRnJvbU1vZGVsfWApIGFzIE1ldGFNb2RlbEFjdGlvbltdKS5maW5kSW5kZXgoKGFjdGlvbikgPT4gIWFjdGlvbi4kSXNCb3VuZCksXG5cdFx0YWN0aW9uSW1wb3J0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAvJHthY3Rpb25OYW1lRnJvbU1vZGVsfS8ke3VuYm91bmRBY3Rpb25JbmRleH1gKTtcblx0cGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uID0gYXdhaXQgQWN0aW9uUnVudGltZS5nZXRJc0FjdGlvbkNyaXRpY2FsKG1ldGFNb2RlbCwgYCR7YWN0aW9uUGF0aH0vQCR1aTUub3ZlcmxvYWRgKTtcblx0cmV0dXJuIGNhbGxBY3Rpb24oYWN0aW9uTmFtZSwgbW9kZWwsIGFjdGlvbkltcG9ydCwgYXBwQ29tcG9uZW50LCBwYXJhbWV0ZXJzLCBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyk7XG59XG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQsIG9Nb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0aWYgKCFjb250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQm91bmQgZnVuY3Rpb25zIGFsd2F5cyByZXF1aXJlcyBhIGNvbnRleHRcIik7XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRnVuY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSl9LyR7c0Z1bmN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEZ1bmN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKTtcblx0cmV0dXJuIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRGdW5jdGlvbiwgY29udGV4dCk7XG59XG50eXBlIFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzID0ge1xuXHRmbk9uU3VibWl0dGVkOiBGdW5jdGlvbjtcblx0Zm5PblJlc3BvbnNlOiBGdW5jdGlvbjtcblx0YWN0aW9uTmFtZTogc3RyaW5nO1xuXHRtb2RlbDogT0RhdGFNb2RlbDtcblx0YUFjdGlvblBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcltdO1xuXHRiR2V0Qm91bmRDb250ZXh0PzogYm9vbGVhbjtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0c2VsZWN0ZWRJdGVtczogT0RhdGFWNENvbnRleHRbXTtcblx0YUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0bUJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRhZGRpdGlvbmFsU2lkZUVmZmVjdD86IEFjdGlvblNpZGVFZmZlY3RzVHlwZTtcblx0Ykdyb3VwZWQ/OiBib29sZWFuO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0YklzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Z3JvdXBJZD86IHN0cmluZztcblx0aXNTdGF0aWM/OiBib29sZWFuO1xuXHRjb250cm9sPzogQ29udHJvbDtcblx0b0RpYWxvZz86IERpYWxvZztcblx0cmVxdWVzdFNpZGVFZmZlY3RzPzogRnVuY3Rpb247XG5cdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlPzogRnVuY3Rpb247XG59O1xuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIGltcG9ydC5cbiAqXG4gKiBAcGFyYW0gc0Z1bmN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0gb01vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIHY0IG1vZGVsXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGxGdW5jdGlvbkltcG9ydChzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8dm9pZCB8IE9EYXRhVjRDb250ZXh0PiB7XG5cdGlmICghc0Z1bmN0aW9uTmFtZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBDb250ZXh0IHwgbnVsbCxcblx0Y29udGV4dD86IENvbnRleHRcbik6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0bGV0IHNHcm91cElkO1xuXHRpZiAoIW9GdW5jdGlvbiB8fCAhb0Z1bmN0aW9uLmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdH1cblx0bGV0IGZ1bmN0aW9uVG9DYWxsOiBPRGF0YUNvbnRleHRCaW5kaW5nO1xuXHRpZiAoY29udGV4dCkge1xuXHRcdGZ1bmN0aW9uVG9DYWxsID0gb01vZGVsLmJpbmRDb250ZXh0KGAke2NvbnRleHQuZ2V0UGF0aCgpfS8ke3NGdW5jdGlvbk5hbWV9KC4uLilgKTtcblx0XHRzR3JvdXBJZCA9IFwiZnVuY3Rpb25Hcm91cFwiO1xuXHR9IGVsc2Uge1xuXHRcdGZ1bmN0aW9uVG9DYWxsID0gb01vZGVsLmJpbmRDb250ZXh0KGAvJHtzRnVuY3Rpb25OYW1lfSguLi4pYCk7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uSW1wb3J0XCI7XG5cdH1cblx0Y29uc3Qgb0Z1bmN0aW9uUHJvbWlzZSA9IGZ1bmN0aW9uVG9DYWxsLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRyZXR1cm4gb0Z1bmN0aW9uUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb25Ub0NhbGwuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdH0pO1xufVxudHlwZSBDYWxsQWN0aW9uUGFyYW1ldGVycyA9IHtcblx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXTtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRvblN1Ym1pdHRlZDogRnVuY3Rpb247XG5cdG9uUmVzcG9uc2U6IEZ1bmN0aW9uO1xuXHRwYXJlbnRDb250cm9sOiBWaWV3O1xuXHRjb250cm9sPzogQ29udHJvbDtcblx0YklzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyO1xuXHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdGlzQ3JpdGljYWxBY3Rpb24/OiBib29sZWFuO1xuXHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdGlnbm9yZUVUYWc/OiBib29sZWFuO1xufSAmIHtcblx0YkdldEJvdW5kQ29udGV4dD86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcbn0gJiB7XG5cdGJHcm91cGVkPzogYm9vbGVhbjtcblx0YUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0c2VsZWN0ZWRJdGVtcz86IE9EYXRhVjRDb250ZXh0W107XG5cdGFkZGl0aW9uYWxTaWRlRWZmZWN0PzogQWN0aW9uU2lkZUVmZmVjdHNUeXBlO1xuXHRtQmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW47XG5cdGdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuYXN5bmMgZnVuY3Rpb24gY2FsbEFjdGlvbihcblx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0b01vZGVsOiBPRGF0YU1vZGVsLFxuXHRvQWN0aW9uOiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiBDYWxsQWN0aW9uUGFyYW1ldGVycyxcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM/OiBTdHJpY3RIYW5kbGluZ1V0aWxpdGllc1xuKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRpZiAoIXN0cmljdEhhbmRsaW5nVXRpbGl0aWVzKSB7XG5cdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgPSB7XG5cdFx0XHRpczQxMkV4ZWN1dGVkOiBmYWxzZSxcblx0XHRcdHN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzOiBbXSxcblx0XHRcdHN0cmljdEhhbmRsaW5nUHJvbWlzZXM6IFtdLFxuXHRcdFx0c3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXM6IFtdLFxuXHRcdFx0ZGVsYXlTdWNjZXNzTWVzc2FnZXM6IFtdLFxuXHRcdFx0cHJvY2Vzc2VkTWVzc2FnZUlkczogW11cblx0XHR9O1xuXHR9XG5cdG1QYXJhbWV0ZXJzLmJHcm91cGVkID0gbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nID09PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0O1xuXHRyZXR1cm4gbmV3IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+KGFzeW5jIGZ1bmN0aW9uIChcblx0XHRyZXNvbHZlOiAodmFsdWU6IEFjdGlvblJlc3BvbnNlKSA9PiB2b2lkLFxuXHRcdHJlamVjdDogKHJlYXNvbj86IEVycm9yIHwgQWN0aW9uUmVzcG9uc2UpID0+IHZvaWRcblx0KSB7XG5cdFx0bGV0IGZuRGlhbG9nOlxuXHRcdFx0fCAoKFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdHNBY3Rpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyW10sXG5cdFx0XHRcdFx0YVBhcmFtZXRlclZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRvQWN0aW9uOiBDb250ZXh0LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IFZpZXcsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllczogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW5cblx0XHRcdCAgKSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+KVxuXHRcdFx0fCBudWxsO1xuXHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHQvL2xldCBmYWlsZWRBY3Rpb25Qcm9taXNlOiBhbnk7XG5cdFx0Y29uc3Qgc0FjdGlvbkxhYmVsID0gbVBhcmFtZXRlcnMubGFiZWw7XG5cdFx0Y29uc3QgYlNraXBQYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg6IHN0cmluZztcblx0XHRsZXQgaU1lc3NhZ2VTaWRlRWZmZWN0O1xuXHRcdGxldCBiSXNTYW1lRW50aXR5O1xuXHRcdGxldCBvUmV0dXJuVHlwZTtcblx0XHRsZXQgYlZhbHVlc1Byb3ZpZGVkRm9yQWxsUGFyYW1ldGVycztcblx0XHRjb25zdCBhY3Rpb25EZWZpbml0aW9uID0gb0FjdGlvbi5nZXRPYmplY3QoKSBhcyBNZXRhTW9kZWxBY3Rpb247XG5cdFx0aWYgKCFvQWN0aW9uIHx8ICFvQWN0aW9uLmdldE9iamVjdCgpKSB7XG5cdFx0XHRyZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQWN0aW9uICR7c0FjdGlvbk5hbWV9IG5vdCBmb3VuZGApKTtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGFjdGlvblxuXHRcdGNvbnN0IGFBY3Rpb25QYXJhbWV0ZXJzID0gZ2V0QWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uKTtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaGFzIHBhcmFtZXRlcnMgYW5kIHdvdWxkIG5lZWQgYSBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0Ly8gVGhlIHBhcmFtZXRlciBSZXN1bHRJc0FjdGl2ZUVudGl0eSBpcyBhbHdheXMgaGlkZGVuIGluIHRoZSBkaWFsb2chIEhlbmNlIGlmXG5cdFx0Ly8gdGhpcyBpcyB0aGUgb25seSBwYXJhbWV0ZXIsIHRoaXMgaXMgdHJlYXRlZCBhcyBubyBwYXJhbWV0ZXIgaGVyZSBiZWNhdXNlIHRoZVxuXHRcdC8vIGRpYWxvZyB3b3VsZCBiZSBlbXB0eSFcblx0XHQvLyBGSVhNRTogU2hvdWxkIG9ubHkgaWdub3JlIHRoaXMgaWYgdGhpcyBpcyBhICdjcmVhdGUnIGFjdGlvbiwgb3RoZXJ3aXNlIGl0IGlzIGp1c3Qgc29tZSBub3JtYWwgcGFyYW1ldGVyIHRoYXQgaGFwcGVucyB0byBoYXZlIHRoaXMgbmFtZVxuXHRcdGNvbnN0IGJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZyA9XG5cdFx0XHRhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwICYmICEoYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAxICYmIGFBY3Rpb25QYXJhbWV0ZXJzWzBdLiROYW1lID09PSBcIlJlc3VsdElzQWN0aXZlRW50aXR5XCIpO1xuXG5cdFx0Ly8gUHJvdmlkZWQgdmFsdWVzIGZvciB0aGUgYWN0aW9uIHBhcmFtZXRlcnMgZnJvbSBpbnZva2VBY3Rpb24gY2FsbFxuXHRcdGNvbnN0IGFQYXJhbWV0ZXJWYWx1ZXMgPSBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXM7XG5cblx0XHQvLyBEZXRlcm1pbmUgc3RhcnR1cCBwYXJhbWV0ZXJzIGlmIHByb3ZpZGVkXG5cdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSBvQXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9O1xuXG5cdFx0Ly8gSW4gY2FzZSBhbiBhY3Rpb24gcGFyYW1ldGVyIGlzIG5lZWRlZCwgYW5kIHdlIHNoYWxsIHNraXAgdGhlIGRpYWxvZywgY2hlY2sgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIHBhcmFtZXRlcnNcblx0XHRpZiAoYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nICYmIGJTa2lwUGFyYW1ldGVyRGlhbG9nKSB7XG5cdFx0XHRiVmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzID0gX3ZhbHVlc1Byb3ZpZGVkRm9yQWxsUGFyYW1ldGVycyhcblx0XHRcdFx0ISFiSXNDcmVhdGVBY3Rpb24sXG5cdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRhUGFyYW1ldGVyVmFsdWVzLFxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gRGVwZW5kaW5nIG9uIHRoZSBwcmV2aW91c2x5IGRldGVybWluZWQgZGF0YSwgZWl0aGVyIHNldCBhIGRpYWxvZyBvciBsZWF2ZSBpdCBlbXB0eSB3aGljaFxuXHRcdC8vIHdpbGwgbGVhZCB0byBkaXJlY3QgZXhlY3V0aW9uIG9mIHRoZSBhY3Rpb24gd2l0aG91dCBhIGRpYWxvZ1xuXHRcdGZuRGlhbG9nID0gbnVsbDtcblx0XHRpZiAoYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nKSB7XG5cdFx0XHRpZiAoIShiU2tpcFBhcmFtZXRlckRpYWxvZyAmJiBiVmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzKSkge1xuXHRcdFx0XHRmbkRpYWxvZyA9IHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChiSXNDcml0aWNhbEFjdGlvbikge1xuXHRcdFx0Zm5EaWFsb2cgPSBjb25maXJtQ3JpdGljYWxBY3Rpb247XG5cdFx0fVxuXG5cdFx0Y29uc3QgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzID0ge1xuXHRcdFx0Zm5PblN1Ym1pdHRlZDogbVBhcmFtZXRlcnMub25TdWJtaXR0ZWQsXG5cdFx0XHRmbk9uUmVzcG9uc2U6IG1QYXJhbWV0ZXJzLm9uUmVzcG9uc2UsXG5cdFx0XHRhY3Rpb25OYW1lOiBzQWN0aW9uTmFtZSxcblx0XHRcdG1vZGVsOiBvTW9kZWwsXG5cdFx0XHRhQWN0aW9uUGFyYW1ldGVyczogYUFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24sXG5cdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRzZWxlY3RlZEl0ZW1zOiBtUGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zIVxuXHRcdH07XG5cdFx0aWYgKG9BY3Rpb24uZ2V0T2JqZWN0KFwiJElzQm91bmRcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdD8ucGF0aEV4cHJlc3Npb25zKSB7XG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYUNvbnRleHRzIVswXS5nZXRQYXRoKCkpO1xuXHRcdFx0XHRzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIGFDb250ZXh0cyFbMF0uZ2V0UGF0aCgpKSE7XG5cblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRpTWVzc2FnZVNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChleHApIHtcblx0XHRcdFx0XHRcdC8vICcqJyBlZmZlY3RpdmVseSBpbmNsdWRlcyB0aGUgbWVzc2FnZXMgcGF0aCBpZiB0aGVyZSBpcyBvbmVcblx0XHRcdFx0XHRcdHJldHVybiB0eXBlb2YgZXhwID09PSBcInN0cmluZ1wiICYmIChleHAgPT09IHNNZXNzYWdlc1BhdGggfHwgZXhwID09PSBcIipcIik7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQvLyBBZGQgU0FQX01lc3NhZ2VzIGJ5IGRlZmF1bHQgaWYgbm90IGFubm90YXRlZCBieSBzaWRlIGVmZmVjdHMsIGFjdGlvbiBkb2VzIG5vdCByZXR1cm4gYSBjb2xsZWN0aW9uIGFuZFxuXHRcdFx0XHRcdC8vIHRoZSByZXR1cm4gdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUgYm91bmQgdHlwZVxuXHRcdFx0XHRcdG9SZXR1cm5UeXBlID0gb0FjdGlvbi5nZXRPYmplY3QoXCIkUmV0dXJuVHlwZVwiKTtcblx0XHRcdFx0XHRiSXNTYW1lRW50aXR5ID1cblx0XHRcdFx0XHRcdG9SZXR1cm5UeXBlICYmICFvUmV0dXJuVHlwZS4kaXNDb2xsZWN0aW9uICYmIG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRPYmplY3Qoc01ldGFQYXRoKS4kVHlwZSA9PT0gb1JldHVyblR5cGUuJFR5cGU7XG5cblx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEgfHwgYklzU2FtZUVudGl0eSkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIG1lc3NhZ2UgcGF0aCBpcyBhbm5vdGF0ZWQgYXMgc2lkZSBlZmZlY3QuIEFzIHRoZXJlJ3Mgbm8gYmluZGluZyBmb3IgaXQgYW5kIHRoZSBtb2RlbCBkb2VzIGN1cnJlbnRseSBub3QgYWxsb3dcblx0XHRcdFx0XHRcdC8vIHRvIGFkZCBpdCBhdCBhIGxhdGVyIHBvaW50IG9mIHRpbWUgd2UgaGF2ZSB0byB0YWtlIGNhcmUgaXQncyBwYXJ0IG9mIHRoZSAkc2VsZWN0IG9mIHRoZSBQT1NULCB0aGVyZWZvcmUgbW92aW5nIGl0LlxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG9BY3Rpb24uZ2V0T2JqZWN0KGAkUmV0dXJuVHlwZS8kVHlwZS8ke3NNZXNzYWdlc1BhdGh9YCkgJiZcblx0XHRcdFx0XHRcdFx0KCFtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCB8fFxuXHRcdFx0XHRcdFx0XHRcdCFtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdC5zcGxpdChcIixcIikuaW5jbHVkZXMoc01lc3NhZ2VzUGF0aCkpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdFxuXHRcdFx0XHRcdFx0XHRcdD8gYCR7bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LCR7c01lc3NhZ2VzUGF0aH1gXG5cdFx0XHRcdFx0XHRcdFx0OiBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdFx0XHQvLyBBZGQgc2lkZSBlZmZlY3RzIGF0IGVudGl0eSBsZXZlbCBiZWNhdXNlICRzZWxlY3Qgc3RvcHMgdGhlc2UgYmVpbmcgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBPbmx5IGlmIG5vIG90aGVyIHNpZGUgZWZmZWN0cyB3ZXJlIGFkZGVkIGZvciBNZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5wdXNoKFwiKlwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoID09PSAwICYmIGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbm8gdHJpZ2dlciBhY3Rpb24gdGhlcmVmb3JlIG5vIG5lZWQgdG8gcmVxdWVzdCBtZXNzYWdlcyBhZ2FpblxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5zcGxpY2UoaU1lc3NhZ2VTaWRlRWZmZWN0LCAxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMgPSBhQ29udGV4dHM7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgPT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXQ7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaXNDcmVhdGVBY3Rpb24gPSBiSXNDcmVhdGVBY3Rpb247XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuZGlzYWJsZVN0cmljdEhhbmRsaW5nID0gbVBhcmFtZXRlcnMuZGlzYWJsZVN0cmljdEhhbmRsaW5nO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuZ3JvdXBJZCA9IG1QYXJhbWV0ZXJzLmdyb3VwSWQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250cm9sID0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdDtcblx0XHRpZiAoYklzQ3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb24gPSBiSXNDcmVhdGVBY3Rpb247XG5cdFx0fVxuXHRcdC8vY2hlY2sgZm9yIHNraXBwaW5nIHN0YXRpYyBhY3Rpb25zXG5cdFx0Y29uc3QgaXNTdGF0aWMgPSAoYWN0aW9uRGVmaW5pdGlvbi4kUGFyYW1ldGVyIHx8IFtdKS5zb21lKFxuXHRcdFx0KGFQYXJhbWV0ZXI6IHtcblx0XHRcdFx0JFR5cGU6IHN0cmluZztcblx0XHRcdFx0JE5hbWU6IHN0cmluZztcblx0XHRcdFx0JE51bGxhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0JE1heExlbmd0aD86IG51bWJlcjtcblx0XHRcdFx0JFByZWNpc2lvbj86IG51bWJlcjtcblx0XHRcdFx0JFNjYWxlPzogbnVtYmVyO1xuXHRcdFx0XHQkaXNDb2xsZWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdH0pID0+IHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHQoKGFjdGlvbkRlZmluaXRpb24uJEVudGl0eVNldFBhdGggJiYgYWN0aW9uRGVmaW5pdGlvbi4kRW50aXR5U2V0UGF0aCA9PT0gYVBhcmFtZXRlci4kTmFtZSkgfHxcblx0XHRcdFx0XHRcdGFjdGlvbkRlZmluaXRpb24uJElzQm91bmQpICYmXG5cdFx0XHRcdFx0YVBhcmFtZXRlci4kaXNDb2xsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0KTtcblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuXHRcdGlmIChmbkRpYWxvZykge1xuXHRcdFx0b0FjdGlvblByb21pc2UgPSBmbkRpYWxvZyhcblx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdHNBY3Rpb25MYWJlbCxcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRhUGFyYW1ldGVyVmFsdWVzLFxuXHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gb0FjdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9PcGVyYXRpb25SZXN1bHQ6IHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pOiB2b2lkIHtcblx0XHRcdFx0XHRhZnRlckFjdGlvblJlc29sdXRpb24obVBhcmFtZXRlcnMsIG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLCBhY3Rpb25EZWZpbml0aW9uKTtcblx0XHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb25SZXN1bHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvT3BlcmF0aW9uUmVzdWx0OiB1bmtub3duKSB7XG5cdFx0XHRcdFx0cmVqZWN0KG9PcGVyYXRpb25SZXN1bHQgYXMgRXJyb3IgfCBBY3Rpb25SZXNwb25zZSk7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUYWtlIG92ZXIgYWxsIHByb3ZpZGVkIHBhcmFtZXRlciB2YWx1ZXMgYW5kIGNhbGwgdGhlIGFjdGlvbi5cblx0XHRcdC8vIFRoaXMgc2hhbGwgb25seSBoYXBwZW4gaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIHRoZSBwYXJhbWV0ZXJzLCBvdGhlcndpc2UgdGhlIHBhcmFtZXRlciBkaWFsb2cgc2hhbGwgYmUgc2hvd24gd2hpY2ggaXMgZW5zdXJlZCBlYXJsaWVyXG5cdFx0XHRpZiAoYVBhcmFtZXRlclZhbHVlcykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXS52YWx1ZSA9IGFQYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoXG5cdFx0XHRcdFx0XHQoZWxlbWVudCkgPT4gZWxlbWVudC5uYW1lID09PSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZVxuXHRcdFx0XHRcdCk/LnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXS52YWx1ZSA9IG9TdGFydHVwUGFyYW1ldGVyc1tcblx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lXG5cdFx0XHRcdFx0XT8uWzBdIGFzIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxldCBvT3BlcmF0aW9uUmVzdWx0OiB1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0b09wZXJhdGlvblJlc3VsdCA9IGF3YWl0IF9leGVjdXRlQWN0aW9uKFxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29uc3QgbWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiZcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZnRlckFjdGlvblJlc29sdXRpb24obVBhcmFtZXRlcnMsIG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLCBhY3Rpb25EZWZpbml0aW9uKTtcblx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRyZWplY3Qob09wZXJhdGlvblJlc3VsdCBhcyBFcnJvciB8IEFjdGlvblJlc3BvbnNlKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJlxuXHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGggJiZcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMhLmxlbmd0aCA+IDFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHN0cmljdEhhbmRsaW5nRmFpbHMgPSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscztcblx0XHRcdFx0XHRcdGNvbnN0IGFGYWlsZWRDb250ZXh0cyA9IFtdIGFzIE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ0ZhaWxzLmZvckVhY2goZnVuY3Rpb24gKGZhaWw6IHsgb0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZzsgZ3JvdXBJZDogc3RyaW5nIH0pOiB2b2lkIHtcblx0XHRcdFx0XHRcdFx0YUZhaWxlZENvbnRleHRzLnB1c2goZmFpbC5vQWN0aW9uLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFGYWlsZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IG9GYWlsZWRPcGVyYXRpb25SZXN1bHQgPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzID0gW107XG5cdFx0XHRcdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMpO1xuXHRcdFx0XHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9GYWlsZWRPcGVyYXRpb25SZXN1bHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9GYWlsZWRPcGVyYXRpb25SZXN1bHQpIHtcblx0XHRcdFx0XHRcdHJlamVjdChcblx0XHRcdFx0XHRcdFx0b0ZhaWxlZE9wZXJhdGlvblJlc3VsdCBhc1xuXHRcdFx0XHRcdFx0XHRcdHwgRXJyb3Jcblx0XHRcdFx0XHRcdFx0XHR8IE9EYXRhVjRDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0fCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHR8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgc2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0XHQobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgaGFzVHJhbnNpdGlvbkVycm9yc09yV2FybmluZ3MoKSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzPy5tZXNzYWdlSGFuZGxlcj8uc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdGNvbnRyb2w6IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzPy5jb250cm9sLFxuXHRcdFx0XHRcdG9uQmVmb3JlU2hvd01lc3NhZ2U6IGZ1bmN0aW9uIChhTWVzc2FnZXM6IE1lc3NhZ2VbXSwgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHMhLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdGFNZXNzYWdlcyxcblx0XHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4sXG5cdFx0XHRcdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHM6IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyxcblx0XHRcdFx0XHRzQWN0aW9uTmFtZTogc0FjdGlvbkxhYmVsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMpIHtcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyA9IHtcblx0XHRcdFx0XHRcdGlzNDEyRXhlY3V0ZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHM6IFtdLFxuXHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdQcm9taXNlczogW10sXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlczogW10sXG5cdFx0XHRcdFx0XHRkZWxheVN1Y2Nlc3NNZXNzYWdlczogW10sXG5cdFx0XHRcdFx0XHRwcm9jZXNzZWRNZXNzYWdlSWRzOiBbXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0c0FjdGlvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YUFjdGlvblBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcltdLFxuXHRhUGFyYW1ldGVyVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHwgdW5kZWZpbmVkLFxuXHRvQWN0aW9uQ29udGV4dDogQ29udGV4dCxcblx0b1BhcmVudENvbnRyb2w6IFZpZXcsXG5cdGVudGl0eVNldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcz86IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGxldCBib3VuZEFjdGlvbk5hbWUgPSBzQWN0aW9uTmFtZTtcblx0XHRib3VuZEFjdGlvbk5hbWUgPSBib3VuZEFjdGlvbk5hbWUuaW5jbHVkZXMoXCIuXCIpXG5cdFx0XHQ/IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIilbYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggLSAxXVxuXHRcdFx0OiBib3VuZEFjdGlvbk5hbWU7XG5cdFx0Y29uc3Qgc3VmZml4UmVzb3VyY2VLZXkgPSBib3VuZEFjdGlvbk5hbWUgJiYgZW50aXR5U2V0TmFtZSA/IGAke2VudGl0eVNldE5hbWV9fCR7Ym91bmRBY3Rpb25OYW1lfWAgOiBcIlwiO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9QYXJlbnRDb250cm9sKTtcblx0XHRjb25zdCBzQ29uZmlybWF0aW9uVGV4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9NRVNTQUdFXCIsIHVuZGVmaW5lZCwgc3VmZml4UmVzb3VyY2VLZXkpO1xuXG5cdFx0TWVzc2FnZUJveC5jb25maXJtKHNDb25maXJtYXRpb25UZXh0LCB7XG5cdFx0XHRvbkNsb3NlOiBhc3luYyBmdW5jdGlvbiAoc0FjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChzQWN0aW9uID09PSBBY3Rpb24uT0spIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGF3YWl0IF9leGVjdXRlQWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0aWdub3JlRVRhZ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBUE1BY3Rpb24oXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRvUGFyZW50Q29udHJvbDogVmlldyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdG9EaWFsb2c6IERpYWxvZyxcblx0YWZ0ZXI0MTI6IGJvb2xlYW4sXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzPzogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+IHtcblx0Y29uc3QgYVJlc3VsdCA9IGF3YWl0IF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzLCBvUGFyZW50Q29udHJvbCwgbWVzc2FnZUhhbmRsZXIsIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLCBpZ25vcmVFVGFnKTtcblx0Ly8gSWYgc29tZSBlbnRyaWVzIHdlcmUgc3VjY2Vzc2Z1bCwgYW5kIG90aGVycyBoYXZlIGZhaWxlZCwgdGhlIG92ZXJhbGwgcHJvY2VzcyBpcyBzdGlsbCBzdWNjZXNzZnVsLiBIb3dldmVyLCB0aGlzIHdhcyB0cmVhdGVkIGFzIHJlamVjdGlvblxuXHQvLyBiZWZvcmUsIGFuZCB0aGlzIGN1cnJlbnRseSBpcyBzdGlsbCBrZXB0LCBhcyBsb25nIGFzIGRpYWxvZyBoYW5kbGluZyBpcyBtaXhlZCB3aXRoIGJhY2tlbmQgcHJvY2VzcyBoYW5kbGluZy5cblx0Ly8gVE9ETzogUmVmYWN0b3IgdG8gb25seSByZWplY3QgaW4gY2FzZSBvZiBvdmVyYWxsIHByb2Nlc3MgZXJyb3IuXG5cdC8vIEZvciB0aGUgdGltZSBiZWluZzogbWFwIHRvIG9sZCBsb2dpYyB0byByZWplY3QgaWYgYXQgbGVhc3Qgb25lIGVudHJ5IGhhcyBmYWlsZWRcblx0Ly8gVGhpcyBjaGVjayBpcyBvbmx5IGRvbmUgZm9yIGJvdW5kIGFjdGlvbnMgPT4gYUNvbnRleHRzIG5vdCBlbXB0eVxuXHRpZiAobVBhcmFtZXRlcnMuYUNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLmFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0aWYgKFxuXHRcdFx0KGFSZXN1bHQgYXMgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10pPy5zb21lKFxuXHRcdFx0XHQob1NpbmdsZVJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+KSA9PiBvU2luZ2xlUmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBhUmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiYgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoKSB7XG5cdFx0aWYgKCFhZnRlcjQxMikge1xuXHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMgPSBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcy5jb25jYXQobWVzc2FnZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMpO1xuXHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIGhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzKCkpXG5cdFx0XHQpIHtcblx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBCT1VORCBUUkFOU0lUSU9OIEFTIFBBUlQgT0YgU0FQX01FU1NBR0Vcblx0XHRcdFx0b0RpYWxvZy5hdHRhY2hFdmVudE9uY2UoXCJhZnRlckNsb3NlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoYU1lc3NhZ2VzOiBNZXNzYWdlW10sIHNob3dNZXNzYWdlUGFyYW1ldGVyc0luOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2csXG5cdFx0XHRcdFx0XHRcdFx0YU1lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLFxuXHRcdFx0XHRcdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29udHJvbDogbVBhcmFtZXRlcnMuY29udHJvbCxcblx0XHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzOiBtUGFyYW1ldGVycy5hQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRzQWN0aW9uTmFtZTogbVBhcmFtZXRlcnMubGFiZWxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdC8vIEJPVU5EIFRSQU5TSVRJT04gQVMgUEFSVCBPRiBTQVBfTUVTU0FHRVxuXHRcdGxldCBzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCA9IGZhbHNlO1xuXHRcdGlmIChcblx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBoYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdCkge1xuXHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdH1cblx0XHRvRGlhbG9nLmF0dGFjaEV2ZW50T25jZShcImFmdGVyQ2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG1QYXJhbWV0ZXJzPy5vRGlhbG9nPy5pc09wZW4oKSxcblx0XHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZTogZnVuY3Rpb24gKGFNZXNzYWdlczogTWVzc2FnZVtdLCBzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRcdG9EaWFsb2csXG5cdFx0XHRcdFx0XHRhTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbixcblx0XHRcdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29udHJvbDogbVBhcmFtZXRlcnMuY29udHJvbCxcblx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHM6IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyxcblx0XHRcdFx0c0FjdGlvbk5hbWU6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBhUmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhZnRlckFjdGlvblJlc29sdXRpb24oXG5cdG1QYXJhbWV0ZXJzOiBDYWxsQWN0aW9uUGFyYW1ldGVycyxcblx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhY3Rpb25EZWZpbml0aW9uOiBNZXRhTW9kZWxBY3Rpb25cbik6IHZvaWQge1xuXHRpZiAoXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiZcblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgJiZcblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMgJiZcblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoICYmXG5cdFx0YWN0aW9uRGVmaW5pdGlvbi4kSXNCb3VuZFxuXHQpIHtcblx0XHRsZXQgc2VsZWN0ZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSA9IFtdO1xuXHRcdC8vY2hlY2sgZm9yIHNraXBwaW5nIHN0YXRpYyBhY3Rpb25zXG5cdFx0Y29uc3QgaXNTdGF0aWMgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pc1N0YXRpYztcblx0XHRpZiAoIWlzU3RhdGljKSB7XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzID0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIpIHx8IFtdO1xuXHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0SlNPTi5wYXJzZShtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sKSB7XG5cdFx0XHRjb25zdCBjb250cm9sID0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbDtcblx0XHRcdGlmIChjb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBjb250cm9sLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0SlNPTi5wYXJzZShtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vdXBkYXRlIGRlbGV0ZSBidXR0b25cblx0XHREZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsIHNlbGVjdGVkQ29udGV4dHMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdG1QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YUNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRvRGlhbG9nOiBEaWFsb2cgfCB1bmRlZmluZWQsXG5cdG1lc3NhZ2VzOiBNZXNzYWdlW10sXG5cdHNob3dNZXNzYWdlUGFyYW1ldGVyc0luOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMsXG5cdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0OiBib29sZWFuXG4pOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMge1xuXHRsZXQgc2hvd01lc3NhZ2VCb3ggPSBzaG93TWVzc2FnZVBhcmFtZXRlcnNJbi5zaG93TWVzc2FnZUJveCxcblx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLnNob3dNZXNzYWdlRGlhbG9nO1xuXHRjb25zdCBvQ29udHJvbCA9IG1QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdGNvbnN0IHVuYm91bmRNZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldHMoKT8uWzBdID09PSBcIlwiO1xuXHR9KTtcblx0Y29uc3QgQVBEbWVzc2FnZXMgPSBtZXNzYWdlcy5maWx0ZXIoZnVuY3Rpb24gKG1lc3NhZ2UpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0bWVzc2FnZS5nZXRUYXJnZXRzICYmXG5cdFx0XHRtZXNzYWdlLmdldFRhcmdldHMoKT8uWzBdLmluY2x1ZGVzKG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWUpICYmXG5cdFx0XHRtUGFyYW1ldGVycz8uYUFjdGlvblBhcmFtZXRlcnM/LnNvbWUoZnVuY3Rpb24gKGFjdGlvblBhcmFtKSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldHMoKT8uWzBdLmluY2x1ZGVzKGFjdGlvblBhcmFtLiROYW1lKTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fSk7XG5cdEFQRG1lc3NhZ2VzPy5mb3JFYWNoKGZ1bmN0aW9uIChBUERNZXNzYWdlKSB7XG5cdFx0KEFQRE1lc3NhZ2UgYXMgdW5rbm93biBhcyB7IGlzQVBEVGFyZ2V0OiBib29sZWFuIH0pLmlzQVBEVGFyZ2V0ID0gdHJ1ZTtcblx0fSk7XG5cblx0Y29uc3QgZXJyb3JUYXJnZXRzSW5BUEQgPSBBUERtZXNzYWdlcy5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG5cdGxldCBoYXNDaGFuZ2VTZXRNb2RpZmllZE1lc3NhZ2UgPSBmYWxzZTtcblx0aWYgKHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ICYmICFlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdGhhc0NoYW5nZVNldE1vZGlmaWVkTWVzc2FnZSA9IHRydWU7XG5cdFx0bGV0IHNNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX0VSUk9SX01FU1NBR0VTX1RFWFRcIik7XG5cdFx0bGV0IHNEZXNjcmlwdGlvblRleHQgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfRVJST1JfTUVTU0FHRVNfREVUQUlMX1RFWFRcIik7XG5cdFx0Y29uc3QgbWVzc2FnZU1vZGVsID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzSW5Nb2RlbCA9IG1lc3NhZ2VNb2RlbC5nZXREYXRhKCk7XG5cdFx0Y29uc3QgbW9kZWwgPSBvQ29udHJvbCAmJiAob0NvbnRyb2wuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKTtcblx0XHRjb25zdCBhQm91bmRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlKTtcblx0XHRsZXQgZ2VuZXJpY01lc3NhZ2U7XG5cdFx0Y29uc3QgaXNFZGl0YWJsZSA9IG9Db250cm9sICYmIG9Db250cm9sLmdldE1vZGVsKFwidWlcIikhLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cblx0XHRjb25zdCBub25FcnJvck1lc3NhZ2VFeGlzdHNJbkRpYWxvZyA9IG1lc3NhZ2VzLmZpbmRJbmRleChmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIkVycm9yXCIgfHwgbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiV2FybmluZ1wiO1xuXHRcdH0pO1xuXHRcdGNvbnN0IG5vbkVycm9yTWVzc2FnZUV4aXN0c0luTW9kZWwgPSBtZXNzYWdlc0luTW9kZWwuZmluZEluZGV4KGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIiB8fCBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJXYXJuaW5nXCI7XG5cdFx0fSk7XG5cblx0XHRpZiAoXG5cdFx0XHRub25FcnJvck1lc3NhZ2VFeGlzdHNJbkRpYWxvZyAhPT0gMSAmJlxuXHRcdFx0bm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5Nb2RlbCAhPT0gLTEgJiZcblx0XHRcdG1QYXJhbWV0ZXJzLmFDb250ZXh0cyAmJlxuXHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzLmxlbmd0aCA+IDFcblx0XHQpIHtcblx0XHRcdGlmIChtZXNzYWdlc0luTW9kZWwubGVuZ3RoID09PSAxICYmIGFCb3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRtZXNzYWdlc0luTW9kZWxbMF0uc2V0TWVzc2FnZShcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9TSU5HTEVfRVJST1JfTUVTU0FHRV9URVhUXCIpICtcblx0XHRcdFx0XHRcdFx0XCJcXG5cXG5cIiArXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VzSW5Nb2RlbFswXS5nZXRNZXNzYWdlKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNNZXNzYWdlID0gaXNFZGl0YWJsZVxuXHRcdFx0XHRcdFx0PyBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfU0lOR0xFX0VSUk9SX01FU1NBR0VfVEVYVF9FRElUXCIpXG5cdFx0XHRcdFx0XHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9TSU5HTEVfRVJST1JfTUVTU0FHRV9URVhUXCIpO1xuXHRcdFx0XHRcdHNEZXNjcmlwdGlvblRleHQgPSBcIlwiO1xuXHRcdFx0XHRcdGdlbmVyaWNNZXNzYWdlID0gbmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0bWVzc2FnZTogc01lc3NhZ2UsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdHRhcmdldDogXCJcIixcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Rlc2NyaXB0aW9uVGV4dCxcblx0XHRcdFx0XHRcdGNvZGU6IFwiRkVfQ1VTVE9NX01FU1NBR0VfQ0hBTkdFU0VUX0FMTF9GQUlMRURcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG1lc3NhZ2VzLnVuc2hpZnQoZ2VuZXJpY01lc3NhZ2UpO1xuXHRcdFx0XHRcdGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdHNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHNob3dNZXNzYWdlQm94ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRnZW5lcmljTWVzc2FnZSA9IG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBzTWVzc2FnZSxcblx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHR0YXJnZXQ6IFwiXCIsXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Rlc2NyaXB0aW9uVGV4dCxcblx0XHRcdFx0XHRjb2RlOiBcIkZFX0NVU1RPTV9NRVNTQUdFX0NIQU5HRVNFVF9BTExfRkFJTEVEXCJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG1lc3NhZ2VzLnVuc2hpZnQoZ2VuZXJpY01lc3NhZ2UpO1xuXHRcdFx0XHRpZiAobWVzc2FnZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSB0cnVlO1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlQm94ID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAob0RpYWxvZyAmJiBvRGlhbG9nLmlzT3BlbigpICYmIGFDb250ZXh0cy5sZW5ndGggIT09IDAgJiYgIW1QYXJhbWV0ZXJzLmlzU3RhdGljKSB7XG5cdFx0aWYgKCFtUGFyYW1ldGVycy5iR3JvdXBlZCkge1xuXHRcdFx0Ly9pc29sYXRlZFxuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxIHx8ICFlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0XHQvLyBkb2VzIG5vdCBtYXR0ZXIgaWYgZXJyb3IgaXMgaW4gQVBEIG9yIG5vdCwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvbnRleHRzIHNlbGVjdGVkIG9yIGlmIHRoZSBlcnJvciBpcyBub3QgdGhlIEFQRCwgd2UgY2xvc2UgaXQuXG5cdFx0XHRcdC8vIFRPRE86IERpbGFvZyBoYW5kbGluZyBzaG91bGQgbm90IGJlIHBhcnQgb2YgbWVzc2FnZSBoYW5kbGluZy4gUmVmYWN0b3IgYWNjb3JkaW5nbHkgLSBkaWFsb2cgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaW5zaWRlIHRoaXMgbWV0aG9kIC0gbmVpdGhlclxuXHRcdFx0XHQvLyB0byBhc2sgd2hldGhlciBpdCdzIG9wZW4sIG5vciB0byBjbG9zZS9kZXN0cm95IGl0IVxuXHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHQvL2NoYW5nZXNldFxuXHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0fVxuXHR9XG5cdGxldCBmaWx0ZXJlZE1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcblx0Y29uc3QgYklzQVBET3BlbiA9IG9EaWFsb2cgJiYgb0RpYWxvZy5pc09wZW4oKTtcblx0aWYgKCFoYXNDaGFuZ2VTZXRNb2RpZmllZE1lc3NhZ2UpIHtcblx0XHRpZiAoXG5cdFx0XHRtZXNzYWdlcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdG1lc3NhZ2VzWzBdLmdldFRhcmdldHMgJiZcblx0XHRcdG1lc3NhZ2VzWzBdLmdldFRhcmdldHMoKT8uWzBdICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdG1lc3NhZ2VzWzBdLmdldFRhcmdldHMoKT8uWzBdICE9PSBcIlwiXG5cdFx0KSB7XG5cdFx0XHRpZiAoKG9Db250cm9sICYmIG9Db250cm9sLmdldE1vZGVsKFwidWlcIikhLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgPT09IGZhbHNlKSB8fCAhb0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gT1AgZWRpdCBvciBMUlxuXHRcdFx0XHRzaG93TWVzc2FnZUJveCA9ICFlcnJvclRhcmdldHNJbkFQRDtcblx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAob0NvbnRyb2wgJiYgb0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSEuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5nZXRNb2RlbChcInVpXCIpIS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpID09PSBmYWxzZSkge1xuXHRcdFx0XHRpZiAoYklzQVBET3BlbiAmJiBlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0NvbnRyb2wuZ2V0TW9kZWwoXCJ1aVwiKSEuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRpZiAoIWJJc0FQRE9wZW4gJiYgZXJyb3JUYXJnZXRzSW5BUEQpIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0ZmlsdGVyZWRNZXNzYWdlcyA9IHVuYm91bmRNZXNzYWdlcy5jb25jYXQoQVBEbWVzc2FnZXMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFiSXNBUERPcGVuICYmIHVuYm91bmRNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHQvLyBlcnJvciB0YXJnZXRzIGluIEFQRCA9PiB0aGVyZSBpcyBhdGxlYXN0IG9uZSBib3VuZCBtZXNzYWdlLiBJZiB0aGVyZSBhcmUgdW5ib3VuZCBtZXNzYWdlcywgZGlhbG9nIG11c3QgYmUgc2hvd24uXG5cdFx0XHRcdFx0Ly8gZm9yIGRyYWZ0IGVudGl0eSwgd2UgYWxyZWFkeSBjbG9zZWQgdGhlIEFQRFxuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRsZXQgZm5HZXRNZXNzYWdlU3VidGl0bGU7XG5cdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdGZuR2V0TWVzc2FnZVN1YnRpdGxlID0gbWVzc2FnZUhhbmRsaW5nLnNldE1lc3NhZ2VTdWJ0aXRsZS5iaW5kKHt9LCBvQ29udHJvbCwgYUNvbnRleHRzKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNob3dNZXNzYWdlQm94OiBzaG93TWVzc2FnZUJveCxcblx0XHRzaG93TWVzc2FnZURpYWxvZzogc2hvd01lc3NhZ2VEaWFsb2csXG5cdFx0ZmlsdGVyZWRNZXNzYWdlczogZmlsdGVyZWRNZXNzYWdlcy5sZW5ndGggPyBmaWx0ZXJlZE1lc3NhZ2VzIDogbWVzc2FnZXMsXG5cdFx0Zm5HZXRNZXNzYWdlU3VidGl0bGU6IGZuR2V0TWVzc2FnZVN1YnRpdGxlLFxuXHRcdHNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZzogbVBhcmFtZXRlcnMuYkdyb3VwZWRcblx0fTtcbn1cblxuLypcbiAqIEN1cnJlbnRseSwgdGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIGRpYWxvZyBhbmQgZXhlY3V0aW5nIHRoZSBhY3Rpb24uIFRoZSBwcm9taXNlIHJldHVybmVkIGlzIHBlbmRpbmcgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBpbnB1dCwgYXMgd2VsbCBhcyB3aGlsZSB0aGVcbiAqIGJhY2stZW5kIHJlcXVlc3QgaXMgcnVubmluZy4gVGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBkaWFsb2cgYW5kIGFsc28gd2hlbiB0aGUgYmFjay1lbmQgcmVxdWVzdCBmYWlscy5cbiAqIFRPRE86IFJlZmFjdG9yaW5nOiBTZXBhcmF0ZSBkaWFsb2cgaGFuZGxpbmcgZnJvbSBiYWNrZW5kIHByb2Nlc3NpbmcuIERpYWxvZyBoYW5kbGluZyBzaG91bGQgcmV0dXJuIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gcGFyYW1ldGVycyB0byBiZSBwcm92aWRlZCB0byBiYWNrZW5kLiBJZiBkaWFsb2cgaXNcbiAqIGNhbmNlbGxlZCwgdGhhdCBwcm9taXNlIGNhbiBiZSByZWplY3RlZC4gTWV0aG9kIHJlc3BvbnNpYmxlIGZvciBiYWNrZW5kIHByb2Nlc3NpbmcgbmVlZCB0byBkZWFsIHdpdGggbXVsdGlwbGUgY29udGV4dHMgLSBpLmUuIGl0IHNob3VsZCBlaXRoZXIgcmV0dXJuIGFuIGFycmF5IG9mIFByb21pc2VzIG9yXG4gKiBhIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIGFycmF5LiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoYXQgUHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgYWxzbyB3aGVuIHNvbWUgb3IgZXZlbiBhbGwgY29udGV4dHMgZmFpbGVkIGluIGJhY2tlbmQgLSB0aGUgb3ZlcmFsbCBwcm9jZXNzIHN0aWxsIHdhc1xuICogc3VjY2Vzc2Z1bC5cbiAqXG4gKi9cblxuYXN5bmMgZnVuY3Rpb24gc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyhcblx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRzQWN0aW9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQWN0aW9uUGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyW10sXG5cdGFQYXJhbWV0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gfCB1bmRlZmluZWQsXG5cdG9BY3Rpb25Db250ZXh0OiBDb250ZXh0LFxuXHRvUGFyZW50Q29udHJvbDogVmlldyxcblx0ZW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzPzogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+IHtcblx0Y29uc3Qgc1BhdGggPSBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dCwgc0FjdGlvbk5hbWUpLFxuXHRcdG1ldGFNb2RlbCA9IChvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKS5vTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0c0FjdGlvbk5hbWVQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIilcblx0XHRcdD8gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0AkdWk1Lm92ZXJsb2FkLzBcIilbMF1cblx0XHRcdDogb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiLzBcIilbMF0sXG5cdFx0YWN0aW9uTmFtZUNvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvbk5hbWVQYXRoKSxcblx0XHRiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyZWF0ZUFjdGlvbixcblx0XHRzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9BY3Rpb25QYXJhbWV0ZXJEaWFsb2dcIjtcblx0cmV0dXJuIG5ldyBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+KGFzeW5jIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRsZXQgYWN0aW9uUGFyYW1ldGVySW5mb3M6IEFjdGlvblBhcmFtZXRlckluZm9bXTsgLy8gdG8gYmUgZmlsbGVkIGFmdGVyIGZyYWdtZW50IChmb3IgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cpIGlzIGxvYWRlZC4gQWN0dWFsbHkgb25seSBuZWVkZWQgZHVyaW5nIGRpYWxvZyBwcm9jZXNzaW5nLCBpLmUuIGNvdWxkIGJlIG1vdmVkIGludG8gdGhlIGNvbnRyb2xsZXIgYW5kIGRpcmVjdGx5IGluaXRpYWxpemVkIHRoZXJlLCBidXQgb25seSBhZnRlciBtb3ZpbmcgYWxsIGhhbmRsZXJzIChlc3AuIHByZXNzIGhhbmRsZXIgZm9yIGFjdGlvbiBidXR0b24pIHRvIGNvbnRyb2xsZXIuXG5cblx0XHRjb25zdCBfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlciA9IChwYXJhbWV0ZXI6IEFjdGlvblBhcmFtZXRlcik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3QgYWxsTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0Y29uc3QgY29udHJvbElkID0gZ2VuZXJhdGUoW1wiQVBEX1wiLCBwYXJhbWV0ZXIuJE5hbWVdKTtcblx0XHRcdC8vIGFsc28gcmVtb3ZlIG1lc3NhZ2VzIGFzc2lnbmVkIHRvIGlubmVyIGNvbnRyb2xzLCBidXQgYXZvaWQgcmVtb3ZpbmcgbWVzc2FnZXMgZm9yIGRpZmZlcmVudCBwYXJhbXRlcnMgKHdpdGggbmFtZSBiZWluZyBzdWJzdHJpbmcgb2YgYW5vdGhlciBwYXJhbWV0ZXIgbmFtZSlcblx0XHRcdGNvbnN0IHJlbGV2YW50TWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG1zZzogTWVzc2FnZSkgPT5cblx0XHRcdFx0bXNnLmdldENvbnRyb2xJZHMoKS5zb21lKChpZDogc3RyaW5nKSA9PiBjb250cm9sSWQuc3BsaXQoXCItXCIpLmluY2x1ZGVzKGlkKSlcblx0XHRcdCk7XG5cdFx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMocmVsZXZhbnRNZXNzYWdlcyk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0aGFuZGxlQ2hhbmdlOiBhc3luYyBmdW5jdGlvbiAob0V2ZW50OiBFdmVudDx7IHByb21pc2U6IFByb21pc2U8c3RyaW5nPiB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRjb25zdCBmaWVsZCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0Y29uc3QgYWN0aW9uUGFyYW1ldGVySW5mbyA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHRcdFx0KGFjdGlvblBhcmFtZXRlckluZm8pID0+IGFjdGlvblBhcmFtZXRlckluZm8uZmllbGQgPT09IGZpZWxkXG5cdFx0XHRcdCkgYXMgQWN0aW9uUGFyYW1ldGVySW5mbztcblx0XHRcdFx0Ly8gZmllbGQgdmFsdWUgaXMgYmVpbmcgY2hhbmdlZCwgdGh1cyBleGlzdGluZyBtZXNzYWdlcyByZWxhdGVkIHRvIHRoYXQgZmllbGQgYXJlIG5vdCB2YWxpZCBhbnltb3JlXG5cdFx0XHRcdF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyKGFjdGlvblBhcmFtZXRlckluZm8ucGFyYW1ldGVyKTtcblx0XHRcdFx0Ly8gYWRhcHQgaW5mby4gUHJvbWlzZSBpcyByZXNvbHZlZCB0byB2YWx1ZSBvciByZWplY3RlZCB3aXRoIGV4Y2VwdGlvbiBjb250YWluaW5nIG1lc3NhZ2Vcblx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mby52YWxpZGF0aW9uUHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8udmFsdWUgPSBhd2FpdCBhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlO1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8uaGFzRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRkZWxldGUgYWN0aW9uUGFyYW1ldGVySW5mby52YWx1ZTtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvLmhhc0Vycm9yID0gdHJ1ZTtcblx0XHRcdFx0XHRfYWRkTWVzc2FnZUZvckFjdGlvblBhcmFtZXRlcihbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm86IGFjdGlvblBhcmFtZXRlckluZm8sXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IChlcnJvciBhcyB7IG1lc3NhZ2U6IHN0cmluZyB9KS5tZXNzYWdlXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0Y29uc3Qgb1BhcmFtZXRlck1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHQkZGlzcGxheU1vZGU6IHt9XG5cdFx0fSk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY3JlYXRlZEZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdGFjdGlvbjogb0FjdGlvbkNvbnRleHQsXG5cdFx0XHRcdFx0XHRhY3Rpb25OYW1lOiBhY3Rpb25OYW1lQ29udGV4dCxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRhY3Rpb246IG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRhY3Rpb25OYW1lOiBhY3Rpb25OYW1lQ29udGV4dD8uZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dD8uZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogZW50aXR5U2V0Q29udGV4dD8uZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRjb25zdCBhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBtUGFyYW1ldGVycy5hQ29udGV4dHMgfHwgW107XG5cdFx0XHRjb25zdCBhRnVuY3Rpb25QYXJhbXM6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+W10gPSBbXTtcblxuXHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKG9BcHBDb21wb25lbnQsIGFBY3Rpb25QYXJhbWV0ZXJzLCBvUGFyYW1ldGVyTW9kZWwsIHRydWUpO1xuXHRcdFx0Y29uc3Qgb0RpYWxvZ0NvbnRlbnQgPSAoYXdhaXQgRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdGRlZmluaXRpb246IGNyZWF0ZWRGcmFnbWVudCBhcyB1bmtub3duIGFzIHN0cmluZyxcblx0XHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXJcblx0XHRcdH0pKSBhcyBDb250cm9sO1xuXG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvcyA9IGFBY3Rpb25QYXJhbWV0ZXJzLm1hcCgoYWN0aW9uUGFyYW1ldGVyKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChnZW5lcmF0ZShbXCJBUERfXCIsIGFjdGlvblBhcmFtZXRlci4kTmFtZV0pKSBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZDtcblx0XHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gZmllbGQuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyOiBhY3Rpb25QYXJhbWV0ZXIsXG5cdFx0XHRcdFx0ZmllbGQ6IGZpZWxkLFxuXHRcdFx0XHRcdGlzTXVsdGlWYWx1ZTogaXNNdWx0aVZhbHVlXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwob1BhcmVudENvbnRyb2wpO1xuXHRcdFx0bGV0IGFjdGlvblJlc3VsdDoge1xuXHRcdFx0XHRkaWFsb2dDYW5jZWxsZWQ6IGJvb2xlYW47XG5cdFx0XHRcdHJlc3VsdDogdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXTtcblx0XHRcdH0gPSB7XG5cdFx0XHRcdGRpYWxvZ0NhbmNlbGxlZDogdHJ1ZSwgLy8gdG8gYmUgc2V0IHRvIGZhbHNlIGluIGNhc2Ugb2Ygc3VjY2Vzc2Z1bCBhY3Rpb24gZXhlY3Rpb25cblx0XHRcdFx0cmVzdWx0OiB1bmRlZmluZWRcblx0XHRcdH07XG5cblx0XHRcdGxldCBidXR0b25Mb2NrID0gZmFsc2U7XG5cblx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZV0pLCB7XG5cdFx0XHRcdHRpdGxlOiBzQWN0aW9uTGFiZWwgfHwgcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19PUEVSQVRJT05TX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX1RJVExFXCIpLFxuXHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRlc2NhcGVIYW5kbGVyOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0Ly8gZXNjYXBlIGhhbmRsZXIgaXMgbWVhbnQgdG8gcG9zc2libHkgc3VwcHJlc3Mgb3IgcG9zdHBvbmUgY2xvc2luZyB0aGUgZGlhbG9nIG9uIGVzY2FwZSAoYnkgY2FsbGluZyBcInJlamVjdFwiIG9uIHRoZSBwcm92aWRlZCBvYmplY3QsIG9yIFwicmVzb2x2ZVwiIG9ubHkgd2hlblxuXHRcdFx0XHRcdC8vIGRvbmUgd2l0aCBhbGwgdGFza3MgdG8gaGFwcGVuIGJlZm9yZSBkaWFsb2cgY2FuIGJlIGNsb3NlZCkuIEl0J3Mgbm90IGludGVuZGVkIHRvIGV4cGxpY2V0bHkgY2xvc2UgdGhlIGRpYWxvZyBoZXJlICh0aGF0IGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIG5vXG5cdFx0XHRcdFx0Ly8gZXNjYXBlSGFuZGxlciBpcyBwcm92aWRlZCBvciB0aGUgcmVzb2x2ZS1jYWxsYmFjayBpcyBjYWxsZWQpIG9yIGZvciBvd24gd3JhcCB1cCB0YXNrcyAobGlrZSByZW1vdmluZyB2YWxpZGl0aW9uIG1lc3NhZ2VzIC0gdGhpcyBzaG91bGQgaGFwcGVuIGluIHRoZVxuXHRcdFx0XHRcdC8vIGFmdGVyQ2xvc2UpLlxuXHRcdFx0XHRcdC8vIFRPRE86IE1vdmUgd3JhcCB1cCB0YXNrcyB0byBhZnRlckNsb3NlLCBhbmQgcmVtb3ZlIHRoaXMgbWV0aG9kIGNvbXBsZXRlbHkuIFRha2UgY2FyZSB0byBhbHNvIGFkYXB0IGVuZCBidXR0b24gcHJlc3MgaGFuZGxlciBhY2NvcmRpbmdseS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHkgb25seSBzdGlsbCBuZWVkZWQgdG8gZGlmZmVyZW50aWF0ZSBjbG9zaW5nIGRpYWxvZyBhZnRlciBzdWNjZXNzZnVsIGV4ZWN1dGlvbiAodXNlcyByZXNvbHZlKSBmcm9tIHVzZXIgY2FuY2VsbGF0aW9uICh1c2luZyByZWplY3QpXG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdC8vXHRcdHJlamVjdChDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oZ2VuZXJhdGUoW1wiZmVcIiwgXCJBUERfXCIsIHNBY3Rpb25OYW1lLCBcIkFjdGlvblwiLCBcIk9rXCJdKSwge1xuXHRcdFx0XHRcdHRleHQ6IGJJc0NyZWF0ZUFjdGlvblxuXHRcdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiKVxuXHRcdFx0XHRcdFx0OiBfZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZShyZXNvdXJjZU1vZGVsLCBzQWN0aW9uTGFiZWwsIHNBY3Rpb25OYW1lLCBlbnRpdHlTZXROYW1lKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Ly8gcHJldmVudCBtdWx0aXBsZSBwcmVzcyBldmVudHMuIFRoZSBCdXN5TG9ja2VyIGlzIG5vdCBmYXN0IGVub3VnaC4gKEJDUDogMjM3MDEzMDIxMClcblx0XHRcdFx0XHRcdFx0Ly8gYnV0dG9uTG9jayBpcyBzZXQgb25jZSBhbmQgcmVzZXQgaW5cblx0XHRcdFx0XHRcdFx0Ly8gLSBhZnRlciB2YWxpZGF0aW9uIGVycm9yXG5cdFx0XHRcdFx0XHRcdC8vIC0gaW4gY2FzZSBvZiBhY3Rpb24gZXJyb3IgbWVzc2FnZSBpcyBjYW5jZWxlZFxuXHRcdFx0XHRcdFx0XHQvLyAtIGluIGFmdGVyQ2xvc2UgZXZlbnRcblxuXHRcdFx0XHRcdFx0XHRpZiAoYnV0dG9uTG9jayA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRidXR0b25Mb2NrID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIShhd2FpdCBfdmFsaWRhdGVQcm9wZXJ0aWVzKGFjdGlvblBhcmFtZXRlckluZm9zLCByZXNvdXJjZU1vZGVsKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRidXR0b25Mb2NrID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9EaWFsb2cpO1xuXG5cdFx0XHRcdFx0XHRcdGxldCBmYWlsZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogZHVlIHRvIHVzaW5nIHRoZSBzZWFyY2ggYW5kIHZhbHVlIGhlbHBzIG9uIHRoZSBhY3Rpb24gZGlhbG9nIHRyYW5zaWVudCBtZXNzYWdlcyBjb3VsZCBhcHBlYXJcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBuZWVkIGFuIFVYIGRlc2lnbiBmb3IgdGhvc2UgdG8gc2hvdyB0aGVtIHRvIHRoZSB1c2VyIC0gZm9yIG5vdyByZW1vdmUgdGhlbSBiZWZvcmUgY29udGludWluZ1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIG1vdmUgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIERpYWxvZyAoU2ltcGxlRm9ybSkgdG8gbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVycyBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0aGUgb3BlcmF0aW9uIGJpbmRpbmdzIGZvciBhbGwgY29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRsZXQgdlBhcmFtZXRlclZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhbGxOdWxsUGFyYW1ldGVycyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtZXRlckNvbnRleHQgPSBvT3BlcmF0aW9uQmluZGluZyAmJiBvT3BlcmF0aW9uQmluZGluZy5nZXRQYXJhbWV0ZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUFjdGlvblBhcmFtZXRlcnNbaV0uJGlzQ29sbGVjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhTVZGQ29udGVudCA9IChvRGlhbG9nLmdldE1vZGVsKFwibXZmdmlld1wiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YC8ke2FBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lfWBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFLZXlWYWx1ZXMgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBqIGluIGFNVkZDb250ZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUtleVZhbHVlcy5wdXNoKGFNVkZDb250ZW50W2pdLktleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gYUtleVZhbHVlcztcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IG9QYXJhbWV0ZXJDb250ZXh0Py5nZXRQcm9wZXJ0eShhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS52YWx1ZSA9IHZQYXJhbWV0ZXJWYWx1ZTsgLy8gd3JpdGluZyB0aGUgY3VycmVudCB2YWx1ZSAodXNlciBpbnB1dCEpIGludG8gdGhlIG1ldGFtb2RlbCA9PiBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byB1c2UgQWN0aW9uUGFyYW1ldGVySW5mb3MgaW5zdGVhZC4gVXNlZCBpbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh2UGFyYW1ldGVyVmFsdWUgIT09IG51bGwgJiYgdlBhcmFtZXRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWxsTnVsbFBhcmFtZXRlcnMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFhbGxOdWxsUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIGF2b2lkIG92ZXJyaWRpbmcgaW5jb21pbmcgcGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlubmVyUGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0XHRpbm5lclBhcmFtZXRlcnMubGFiZWwgPSBzQWN0aW9uTGFiZWw7XG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN1bHQgPSBhd2FpdCBleGVjdXRlQVBNQWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbm5lclBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlnbm9yZUVUYWdcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRpYWxvZ0NhbmNlbGxlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdDogYVJlc3VsdFxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlc29sdmUoYVJlc3VsdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmlzNDEyRXhlY3V0ZWQgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzLmNvbmNhdChtZXNzYWdlcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuaXM0MTJFeGVjdXRlZCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhaWxlZENvbnRleHRzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMubWFwKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGZhaWwpID0+IGZhaWwub0FjdGlvbi5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlubmVyUGFyYW1ldGVycy5hQ29udGV4dHMgPSBmYWlsZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUFQTUFjdGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbm5lclBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlnbm9yZUVUYWdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkaWFsb2dDYW5jZWxsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0OiBhUmVzdWx0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlKGFSZXN1bHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBoYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZXNzYWdlczogTWVzc2FnZVtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbjogU2hvd01lc3NhZ2VQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5uZXJQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZXNzYWdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnNJbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzOiB1bmRlZmluZWQsIC8vIG5vdCB1c2VkIGF0IGFsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWU6IHNBY3Rpb25MYWJlbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvRGlhbG9nKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRcdGxldCBzaG93TWVzc2FnZURpYWxvZzogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nUHJvbWlzZXMubGVuZ3RoKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIGhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzKCkpXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0OiBmYWlsZWRDb250ZXh0c1swXSwgLy8gb25seSB1c2VkIGluIGNhc2Ugb2YgZmFpbGVkIGNvbnRleHQgdG8gcmVzZXQgaW4gbWVzc2FnZUhhbmRsaW5nIHNob3dVbmJvdW5kTWVzc2FnZXNcblx0XHRcdFx0XHRcdFx0XHRcdGlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nT3Blbjogb0RpYWxvZy5pc09wZW4oKSxcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoYU1lc3NhZ2VzOiBNZXNzYWdlW10sIHNob3dNZXNzYWdlUGFyYW1ldGVyc0luOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gV2h5IGlzIHRoaXMgaW1wbGVtZW50ZWQgYXMgY2FsbGJhY2s/IEFwcGFyZW50bHksIGFsbCBuZWVkZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGJlZm9yZWhhbmRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogcmVmYWN0b3IgYWNjb3JkaW5nbHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzID0gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXRcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBzaG93TWVzc2FnZVBhcmFtZXRlcnMuc2hvd01lc3NhZ2VEaWFsb2c7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzaG93TWVzc2FnZVBhcmFtZXRlcnM7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHM6IHVuZGVmaW5lZCwgLy8gbm90IHVzZWQgYXQgYWxsIVxuXHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWU6IHNBY3Rpb25MYWJlbCxcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRyb2w6IG1QYXJhbWV0ZXJzLmNvbnRyb2xcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRidXR0b25Mb2NrID0gZmFsc2U7IC8vbmVlZGVkIGlmIHRoZSBhY3Rpb24gZmFpbHMgd2l0aCBhbiBlcnJvciBwb3B1cCBhbmQgdGhpcyBvbmUgaXMgY2FuY2VsZCAoSm91cm5leTogNDEyV2FybmluZ0hhbmRsaW5nKVxuXHRcdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYmFja2VuZCB2YWxpZGF0aW9uIGVycm9yKHM/KSwgbWVzc2FnZSBzaGFsbCBub3QgYmUgc2hvd24gaW4gbWVzc2FnZSBkaWFsb2cgYnV0IG5leHQgdG8gdGhlIGZpZWxkIG9uIHBhcmFtZXRlciBkaWFsb2csIHdoaWNoIHNob3VsZFxuXHRcdFx0XHRcdFx0XHRcdC8vIHN0YXkgb3BlbiBpbiB0aGlzIGNhc2UgPT4gaW4gdGhpcyBjYXNlLCB3ZSBtdXN0IG5vdCByZXNvbHZlIG9yIHJlamVjdCB0aGUgcHJvbWlzZSBjb250cm9sbGluZyB0aGUgcGFyYW1ldGVyIGRpYWxvZy5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbiBhbGwgb3RoZXIgY2FzZXMgKGUuZy4gb3RoZXIgYmFja2VuZCBlcnJvcnMgb3IgdXNlciBjYW5jZWxsYXRpb24pLCB0aGUgcHJvbWlzZSBjb250cm9sbGluZyB0aGUgcGFyYW1ldGVyIGRpYWxvZyBuZWVkcyB0byBiZSByZWplY3RlZCB0byBhbGxvd1xuXHRcdFx0XHRcdFx0XHRcdC8vIGNhbGxlcnMgdG8gcmVhY3QuIChFeGFtcGxlOiBJZiBjcmVhdGlvbiBpbiBiYWNrZW5kIGFmdGVyIG5hdmlnYXRpb24gdG8gdHJhbnNpZW50IGNvbnRleHQgZmFpbHMsIGJhY2sgbmF2aWdhdGlvbiBuZWVkcyB0byBiZSB0cmlnZ2VyZWQpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogUmVmYWN0b3IgdG8gc2VwYXJhdGUgZGlhbG9nIGhhbmRsaW5nIGZyb20gYmFja2VuZCByZXF1ZXN0IGluc3RlYWQgb2YgdGFraW5nIGRlY2lzaW9uIGJhc2VkIG9uIG1lc3NhZ2UgaGFuZGxpbmdcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2hvd01lc3NhZ2VEaWFsb2cpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nLmlzT3BlbigpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGRvIG5vdGhpbmcsIGRvIG5vdCByZWplY3QgcHJvbWlzZSBoZXJlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFdlIGRvIG5vdCBjbG9zZSB0aGUgQVBNIGRpYWxvZyBpZiB1c2VyIGVudGVycyBhIHdyb25nIHZhbHVlIGluIG9mIHRoZSBmaWVsZHMgdGhhdCByZXN1bHRzIGluIGFuIGVycm9yIGZyb20gdGhlIGJhY2tlbmQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFRoZSB1c2VyIGNhbiBjbG9zZSB0aGUgbWVzc2FnZSBkaWFsb2cgYW5kIHRoZSBBUE0gZGlhbG9nIHdvdWxkIHN0aWxsIGJlIG9wZW4gb24gd2hpY2ggaGUgY291bGQgZW50ZXIgYSBuZXcgdmFsdWUgYW5kIHRyaWdnZXIgdGhlIGFjdGlvbiBhZ2Fpbi5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRWFybGllciB3ZSB3ZXJlIHJlamVjdGluZyB0aGUgcHJvbWlzZSBvbiBlcnJvciBoZXJlLCBhbmQgdGhlIGNhbGwgc3RhY2sgd2FzIGRlc3Ryb3llZCBhcyB0aGUgcHJvbWlzZSB3YXMgcmVqZWN0ZWQgYW5kIHJldHVybmVkIHRvIEVkaXRGbG93IGludm9rZSBhY3Rpb24uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEJ1dCBzaW5jZSB0aGUgQVBNIGRpYWxvZyB3YXMgc3RpbGwgb3BlbiwgYSBuZXcgcHJvbWlzZSB3YXMgcmVzb2x2ZWQgaW4gY2FzZSB0aGUgdXNlciByZXRyaWVkIHRoZSBhY3Rpb24gYW5kIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQsIGJ1dCB0aGUgbmF2aWdhdGlvbiB0byBvYmplY3QgcGFnZSB3YXMgbm90IHRha2luZyBwbGFjZS5cblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdFx0aWYgKHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpczQxMkV4ZWN1dGVkOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzOiBbXSxcblx0XHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nUHJvbWlzZXM6IFtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXM6IFtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsYXlTdWNjZXNzTWVzc2FnZXM6IFtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc2VkTWVzc2FnZUlkczogW11cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9EaWFsb2cpKSB7XG5cdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oZ2VuZXJhdGUoW1wiZmVcIiwgXCJBUERfXCIsIHNBY3Rpb25OYW1lLCBcIkFjdGlvblwiLCBcIkNhbmNlbFwiXSksIHtcblx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiksXG5cdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdC8vIFRPRE86IGNhbmNlbCBidXR0b24gc2hvdWxkIGp1c3QgY2xvc2UgdGhlIGRpYWxvZyAoc2ltaWxhciB0byB1c2luZyBlc2NhcGUpLiBBbGwgd3JhcCB1cCB0YXNrcyBzaG91bGQgYmUgbW92ZWQgdG8gYWZ0ZXJDbG9zZS5cblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdC8vIHJlamVjdChDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHQvLyBUT0RPOiBiZWZvcmVPcGVuIGlzIGp1c3QgYW4gZXZlbnQsIGkuZS4gbm90IHdhaXRpbmcgZm9yIHRoZSBQcm9taXNlIHRvIGJlIHJlc29sdmVkLiBDaGVjayBpZiB0YXNrcyBvZiB0aGlzIGZ1bmN0aW9uIG5lZWQgdG8gYmUgZG9uZSBiZWZvcmUgb3BlbmluZyB0aGUgZGlhbG9nXG5cdFx0XHRcdC8vIC0gaWYgeWVzLCB0aGV5IG5lZWQgdG8gYmUgbW92ZWQgb3V0c2lkZS5cblx0XHRcdFx0Ly8gQXNzdW1wdGlvbjogU29tZXRpbWVzIGRpYWxvZyBjYW4gYmUgc2VlbiB3aXRob3V0IGFueSBmaWVsZHMgZm9yIGEgc2hvcnQgdGltZSAtIG1heWJlIHRoaXMgaXMgY2F1c2VkIGJ5IHRoaXMgYXN5bmNocm9uaXR5XG5cdFx0XHRcdGJlZm9yZU9wZW46IGFzeW5jIGZ1bmN0aW9uIChvRXZlbnQ6IERpYWxvZyRCZWZvcmVPcGVuRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0XHQvLyBjbG9uZSBldmVudCBmb3IgYWN0aW9uV3JhcHBlciBhcyBvRXZlbnQub1NvdXJjZSBnZXRzIGxvc3QgZHVyaW5nIHByb2Nlc3Npbmcgb2YgYmVmb3JlT3BlbiBldmVudCBoYW5kbGVyXG5cdFx0XHRcdFx0Y29uc3Qgb0Nsb25lRXZlbnQgPSBPYmplY3QuYXNzaWduKHt9LCBvRXZlbnQpO1xuXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0Y29uc3QgZ2V0RGVmYXVsdFZhbHVlc0Z1bmN0aW9uID0gZnVuY3Rpb24gKCk6IHN0cmluZyB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gKG9EaWFsb2cuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0c0FjdGlvblBhdGggPSBvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkgJiYgb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0BcIilbMF0sXG5cdFx0XHRcdFx0XHRcdHNEZWZhdWx0VmFsdWVzRnVuY3Rpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRcdFx0XHRgJHtzQWN0aW9uUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvbmBcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybiBzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2cgPSBhc3luYyBmdW5jdGlvbiAoc0JpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHNCb3VuZEZ1bmN0aW9uTmFtZSA9IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbigpO1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFyYW1ldGVyTW9kZWxEYXRhID0gb1BhcmFtZXRlck1vZGVsLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHByZWZpbGxQYXJhbWV0ZXIgPSBhc3luYyBmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRcdHNQYXJhbU5hbWU6IHN0cmluZyxcblx0XHRcdFx0XHRcdFx0dlBhcmFtRGVmYXVsdFZhbHVlPzogc3RyaW5nIHwgeyAkUGF0aD86IHN0cmluZyB9XG5cdFx0XHRcdFx0XHQpOiBQcm9taXNlPHsgcGFyYW1OYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyBiTGF0ZVByb3BlcnR5RXJyb3I/OiBib29sZWFuOyBiTm9Qb3NzaWJsZVZhbHVlPzogYm9vbGVhbiB9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIENhc2UgMTogVGhlcmUgaXMgYSBQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgYW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtRGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZQYXJhbURlZmF1bHRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCB2UGFyYW1WYWx1ZSA9IGF3YWl0IENvbW1vblV0aWxzLnJlcXVlc3RTaW5nbGV0b25Qcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1WYWx1ZSA9IGF3YWl0IG9PcGVyYXRpb25CaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZ2V0UGFyYW1ldGVyQ29udGV4dCgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFByb3BlcnR5KHZQYXJhbURlZmF1bHRWYWx1ZS4kUGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRm9yIG11bHRpIHNlbGVjdCwgbmVlZCB0byBsb29wIG92ZXIgYUNvbnRleHRzIChhcyBjb250ZXh0cyBjYW5ub3QgYmUgcmV0cmlldmVkIHZpYSBiaW5kaW5nIHBhcmFtZXRlciBvZiB0aGUgb3BlcmF0aW9uIGJpbmRpbmcpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNQYXRoRm9yQ29udGV4dCA9IHZQYXJhbURlZmF1bHRWYWx1ZS4kUGF0aDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1BhdGhGb3JDb250ZXh0LmluZGV4T2YoYCR7c0JpbmRpbmdQYXJhbWV0ZXJ9L2ApID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzUGF0aEZvckNvbnRleHQgPSBzUGF0aEZvckNvbnRleHQucmVwbGFjZShgJHtzQmluZGluZ1BhcmFtZXRlcn0vYCwgXCJcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzW2ldLmdldFByb3BlcnR5KHNQYXRoRm9yQ29udGV4dCkgIT09IHZQYXJhbVZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIHRoZSB2YWx1ZXMgZnJvbSB0aGUgY29udGV4dHMgYXJlIG5vdCBhbGwgdGhlIHNhbWUsIGRvIG5vdCBwcmVmaWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Yk5vUG9zc2libGVWYWx1ZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyBwYXJhbU5hbWU6IHNQYXJhbU5hbWUsIHZhbHVlOiB2UGFyYW1WYWx1ZSB9O1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlYWRpbmcgZGVmYXVsdCBhY3Rpb24gcGFyYW1ldGVyXCIsIHNQYXJhbU5hbWUsIG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJMYXRlUHJvcGVydHlFcnJvcjogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDEuMjogUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGRlZmluZXMgYSBmaXhlZCBzdHJpbmcgdmFsdWUgKGkuZS4gdlBhcmFtRGVmYXVsdFZhbHVlID0gJ3NvbWVTdHJpbmcnKVxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdlBhcmFtRGVmYXVsdFZhbHVlIH07XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlck1vZGVsRGF0YS5oYXNPd25Qcm9wZXJ0eShzUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIENhc2UgMjogVGhlcmUgaXMgbm8gUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb24gKD0+IGxvb2sgaW50byB0aGUgRkxQIFVzZXIgRGVmYXVsdHMpXG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHBhcmFtZXRlck1vZGVsRGF0YVtzUGFyYW1OYW1lXVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdW5kZWZpbmVkIH07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGNvbnN0IGdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIChzUGFyYW1OYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB7ICRQYXRoOiBzdHJpbmcgfSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSAob0RpYWxvZy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uUGF0aCA9IENvbW1vblV0aWxzLmdldFBhcmFtZXRlclBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLCBzUGFyYW1OYW1lKSArIFwiQFwiLFxuXHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckRlZmF1bHRWYWx1ZSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgJiYgb1BhcmFtZXRlckFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlBhcmFtZXRlckRlZmF1bHRWYWx1ZVwiXTsgLy8gZWl0aGVyIHsgJFBhdGg6ICdzb21lUGF0aCcgfSBvciAnc29tZVN0cmluZydcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9QYXJhbWV0ZXJEZWZhdWx0VmFsdWUgYXMgc3RyaW5nIHwgeyAkUGF0aDogc3RyaW5nIH07XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRjb25zdCBhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlID0gW107XG5cdFx0XHRcdFx0XHRsZXQgc1BhcmFtTmFtZSwgdlBhcmFtZXRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRzUGFyYW1OYW1lID0gYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWU7XG5cdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUoc1BhcmFtTmFtZSk7XG5cdFx0XHRcdFx0XHRcdGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUucHVzaChwcmVmaWxsUGFyYW1ldGVyKHNQYXJhbU5hbWUsIHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWUpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpICYmIGFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzQm91bmRGdW5jdGlvbk5hbWUgJiYgc0JvdW5kRnVuY3Rpb25OYW1lLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHNCb3VuZEZ1bmN0aW9uTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtcy5wdXNoKGNhbGxCb3VuZEZ1bmN0aW9uKHNCb3VuZEZ1bmN0aW9uTmFtZSwgYUNvbnRleHRzW2ldLCBtUGFyYW1ldGVycy5tb2RlbCkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCBhUHJlZmlsbFBhcmFtUHJvbWlzZXMgPSBQcm9taXNlLmFsbChhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlKTtcblx0XHRcdFx0XHRcdGxldCBhRXhlY0Z1bmN0aW9uUHJvbWlzZXM6IFByb21pc2U8T0RhdGFWNENvbnRleHRbXT4gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdFx0XHRcdFx0bGV0IG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlO1xuXHRcdFx0XHRcdFx0aWYgKGFGdW5jdGlvblBhcmFtcyAmJiBhRnVuY3Rpb25QYXJhbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRhRXhlY0Z1bmN0aW9uUHJvbWlzZXMgPSBQcm9taXNlLmFsbChhRnVuY3Rpb25QYXJhbXMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzTW9kdWxlID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHQuc3Vic3RyaW5nKDAsIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpXG5cdFx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdFx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZSA9IEZQTUhlbHBlci5hY3Rpb25XcmFwcGVyKG9DbG9uZUV2ZW50LCBzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHM6IGFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYVByb21pc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuXHRcdFx0XHRcdFx0XHRcdGFQcmVmaWxsUGFyYW1Qcm9taXNlcyxcblx0XHRcdFx0XHRcdFx0XHRhRXhlY0Z1bmN0aW9uUHJvbWlzZXMsXG5cdFx0XHRcdFx0XHRcdFx0b0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2Vcblx0XHRcdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSA9IGFQcm9taXNlc1swXTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZnVuY3Rpb25QYXJhbXMgPSBhUHJvbWlzZXNbMV07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBhUHJvbWlzZXNbMl0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRcdFx0XHRcdGxldCBzRGlhbG9nUGFyYW1OYW1lOiBzdHJpbmc7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRmlsbCB0aGUgZGlhbG9nIHdpdGggdGhlIGVhcmxpZXIgZGV0ZXJtaW5lZCBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gdGhlIGRpZmZlcmVudCBzb3VyY2VzXG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdHNEaWFsb2dQYXJhbU5hbWUgPSBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0XHQvLyBQYXJhbWV0ZXIgdmFsdWVzIHByb3ZpZGVkIGluIHRoZSBjYWxsIG9mIGludm9rZUFjdGlvbiBvdmVycnVsZSBvdGhlciBzb3VyY2VzXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdlBhcmFtZXRlclByb3ZpZGVkVmFsdWUgPSBhUGFyYW1ldGVyVmFsdWVzPy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdFx0KGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpPy52YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtZXRlclByb3ZpZGVkVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSwgdlBhcmFtZXRlclByb3ZpZGVkVmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0ICYmIG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdC5oYXNPd25Qcm9wZXJ0eShzRGlhbG9nUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0W3NEaWFsb2dQYXJhbU5hbWVdXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldICYmIGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsIGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBoYWQgbm90IGJlZW4gcHJldmlvdXNseSBkZXRlcm1pbmVkIGR1ZSB0byBkaWZmZXJlbnQgY29udGV4dHMsIHdlIGRvIG5vdGhpbmcgZWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmICFjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0uYk5vUG9zc2libGVWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHdlIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNhbWUgcGFyYW0gdmFsdWUgZm9yIGFsbCB0aGUgY29udGV4dHM6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGogPCBhQ29udGV4dHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2pdICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqICsgMV0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2pdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbaiArIDFdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aisrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9wYXJhbSB2YWx1ZXMgYXJlIGFsbCB0aGUgc2FtZTpcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGogPT09IGFDb250ZXh0cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZ1bmN0aW9uUGFyYW1zWzBdICYmIGZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL09ubHkgb25lIGNvbnRleHQsIHRoZW4gdGhlIGRlZmF1bHQgcGFyYW0gdmFsdWVzIGFyZSB0byBiZSB2ZXJpZmllZCBmcm9tIHRoZSBmdW5jdGlvbjpcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbMF0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJFcnJvckZvdW5kID0gY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvVmFsdWUuYkxhdGVQcm9wZXJ0eUVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHQvLyBJZiBhdCBsZWFzdCBvbmUgRGVmYXVsdCBQcm9wZXJ0eSBpcyBhIExhdGUgUHJvcGVydHkgYW5kIGFuIGVUYWcgZXJyb3Igd2FzIHJhaXNlZC5cblx0XHRcdFx0XHRcdFx0aWYgKGJFcnJvckZvdW5kKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc1RleHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0FQUF9DT01QT05FTlRfU0FQRkVfRVRBR19MQVRFX1BST1BFUlRZXCIpO1xuXHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3gud2FybmluZyhzVGV4dCwgeyBjb250ZW50V2lkdGg6IFwiMjVlbVwiIH0gYXMgb2JqZWN0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHBhcmFtZXRlclwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGZuQXN5bmNCZWZvcmVPcGVuID0gYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpICYmIGFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJFBhcmFtZXRlclwiKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXJhbWV0ZXIgPSBhUGFyYW1ldGVyc1swXSAmJiBhUGFyYW1ldGVyc1swXS4kTmFtZTtcblxuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gYXdhaXQgYUNvbnRleHRzWzBdLnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihzQmluZGluZ1BhcmFtZXRlciwgb0NvbnRleHRPYmplY3QpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyhzQmluZGluZ1BhcmFtZXRlcik7XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHBhcmFtZXRlclwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2coKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0YXdhaXQgZm5Bc3luY0JlZm9yZU9wZW4oKTtcblxuXHRcdFx0XHRcdC8vIGFkZGluZyBkZWZhdWx0ZWQgdmFsdWVzIG9ubHkgaGVyZSBhZnRlciB0aGV5IGFyZSBub3Qgc2V0IHRvIHRoZSBmaWVsZHNcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlckluZm8gb2YgYWN0aW9uUGFyYW1ldGVySW5mb3MpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWVcblx0XHRcdFx0XHRcdFx0PyAoYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZCBhcyBNdWx0aVZhbHVlRmllbGQpLmdldEl0ZW1zKClcblx0XHRcdFx0XHRcdFx0OiAoYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZCBhcyBGaWVsZCkuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8udmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8udmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdC8vIHdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxsZWQsIG1lc3NhZ2VzIG5lZWQgdG8gYmUgcmVtb3ZlZCBpbiBjYXNlIHRoZSBzYW1lIGFjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgYWdhaW5cblx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVycy5mb3JFYWNoKF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyKTtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRidXR0b25Mb2NrID0gZmFsc2U7IC8vbmVlZGVkIGhlcmUsIG5vdCBpbiB0aGUgcHJlc3MgZXZlbnRzIGZpbmFsbHkgY2xhdXNlLiBJbiBjYXNlIHRoZSBVSSBpcyBzbHVnZ2lzaCwgYmVnaW4gYnV0dG9uIGNvdWxkIGJlIHByZXNzZWQgYWdhaW4uXG5cdFx0XHRcdFx0aWYgKGFjdGlvblJlc3VsdC5kaWFsb2dDYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRcdHJlamVjdChDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShhY3Rpb25SZXN1bHQucmVzdWx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0bVBhcmFtZXRlcnMub0RpYWxvZyA9IG9EaWFsb2c7XG5cdFx0XHRvRGlhbG9nLnNldE1vZGVsKChvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKS5vTW9kZWwpO1xuXHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvUGFyYW1ldGVyTW9kZWwsIFwicGFyYW1zTW9kZWxcIik7XG5cdFx0XHRvRGlhbG9nLmJpbmRFbGVtZW50KHtcblx0XHRcdFx0cGF0aDogXCIvXCIsXG5cdFx0XHRcdG1vZGVsOiBcInBhcmFtc01vZGVsXCJcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBlbXB0eSBtb2RlbCB0byBhZGQgZWxlbWVudHMgZHluYW1pY2FsbHkgZGVwZW5kaW5nIG9uIG51bWJlciBvZiBNVkYgZmllbGRzIGRlZmluZWQgb24gdGhlIGRpYWxvZ1xuXHRcdFx0Y29uc3Qgb01WRk1vZGVsID0gbmV3IEpTT05Nb2RlbCh7fSk7XG5cdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9NVkZNb2RlbCwgXCJtdmZ2aWV3XCIpO1xuXG5cdFx0XHQvKiBFdmVudCBuZWVkZWQgZm9yIHJlbW92aW5nIG1lc3NhZ2VzIG9mIHZhbGlkIGNoYW5nZWQgZmllbGQgKi9cblx0XHRcdGZvciAoY29uc3QgYWN0aW9uUGFyYW1ldGVySW5mbyBvZiBhY3Rpb25QYXJhbWV0ZXJJbmZvcykge1xuXHRcdFx0XHRpZiAoYWN0aW9uUGFyYW1ldGVySW5mby5pc011bHRpVmFsdWUpIHtcblx0XHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJJbmZvPy5maWVsZD8uZ2V0QmluZGluZyhcIml0ZW1zXCIpPy5hdHRhY2hDaGFuZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdFx0X3JlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW10ZXIoYWN0aW9uUGFyYW1ldGVySW5mby5wYXJhbWV0ZXIpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8/LmZpZWxkPy5nZXRCaW5kaW5nKFwidmFsdWVcIik/LmF0dGFjaENoYW5nZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlcihhY3Rpb25QYXJhbWV0ZXJJbmZvLnBhcmFtZXRlcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bGV0IHNBY3Rpb25QYXRoID0gYCR7c0FjdGlvbk5hbWV9KC4uLilgO1xuXHRcdFx0aWYgKCFhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdHNBY3Rpb25QYXRoID0gYC8ke3NBY3Rpb25QYXRofWA7XG5cdFx0XHR9XG5cdFx0XHRvRGlhbG9nLmJpbmRFbGVtZW50KHtcblx0XHRcdFx0cGF0aDogc0FjdGlvblBhdGhcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG9QYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChhQ29udGV4dHNbMF0pOyAvLyB1c2UgY29udGV4dCBvZiBmaXJzdCBzZWxlY3RlZCBsaW5lIGl0ZW1cblx0XHRcdH1cblx0XHRcdGNvbnN0IG9PcGVyYXRpb25CaW5kaW5nID0gb0RpYWxvZy5nZXRPYmplY3RCaW5kaW5nKCkgYXMgT0RhdGFDb250ZXh0QmluZGluZztcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0fVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldEFjdGlvblBhcmFtZXRlcnMob0FjdGlvbjogQ29udGV4dCk6IEFjdGlvblBhcmFtZXRlcltdIHtcblx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvQWN0aW9uLmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIikgfHwgW107XG5cdGlmIChhUGFyYW1ldGVycyAmJiBhUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRpZiAob0FjdGlvbi5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSkge1xuXHRcdFx0Ly9pbiBjYXNlIG9mIGJvdW5kIGFjdGlvbnMsIGlnbm9yZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGFuZCBjb25zaWRlciB0aGUgcmVzdFxuXHRcdFx0cmV0dXJuIGFQYXJhbWV0ZXJzLnNsaWNlKDEsIGFQYXJhbWV0ZXJzLmxlbmd0aCkgfHwgW107XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhUGFyYW1ldGVycztcbn1cblxuZnVuY3Rpb24gX2dldEFjdGlvblBhcmFtZXRlckFjdGlvbk5hbWUoXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdHNBY3Rpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRzRW50aXR5U2V0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcge1xuXHRsZXQgYm91bmRBY3Rpb25OYW1lOiBzdHJpbmcgPSBzQWN0aW9uTmFtZTtcblx0Y29uc3QgYUFjdGlvbk5hbWUgPSBib3VuZEFjdGlvbk5hbWUuc3BsaXQoXCIuXCIpO1xuXHRib3VuZEFjdGlvbk5hbWUgPSBib3VuZEFjdGlvbk5hbWUuaW5jbHVkZXMoXCIuXCIpID8gYUFjdGlvbk5hbWVbYUFjdGlvbk5hbWUubGVuZ3RoIC0gMV0gOiBib3VuZEFjdGlvbk5hbWU7XG5cdGNvbnN0IHN1ZmZpeFJlc291cmNlS2V5ID0gYm91bmRBY3Rpb25OYW1lICYmIHNFbnRpdHlTZXROYW1lID8gYCR7c0VudGl0eVNldE5hbWV9fCR7Ym91bmRBY3Rpb25OYW1lfWAgOiBcIlwiO1xuXHRjb25zdCBzS2V5ID0gXCJBQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19BQ1RJT05fTkFNRVwiO1xuXHRjb25zdCBiUmVzb3VyY2VLZXlFeGlzdHMgPSByZXNvdXJjZU1vZGVsLmNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cyhgJHtzS2V5fXwke3N1ZmZpeFJlc291cmNlS2V5fWApO1xuXHRpZiAoc0FjdGlvbkxhYmVsKSB7XG5cdFx0aWYgKGJSZXNvdXJjZUtleUV4aXN0cykge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChzS2V5LCB1bmRlZmluZWQsIHN1ZmZpeFJlc291cmNlS2V5KTtcblx0XHR9IGVsc2UgaWYgKHJlc291cmNlTW9kZWwuY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzKGAke3NLZXl9fCR7c0VudGl0eVNldE5hbWV9YCkpIHtcblx0XHRcdHJldHVybiByZXNvdXJjZU1vZGVsLmdldFRleHQoc0tleSwgdW5kZWZpbmVkLCBgJHtzRW50aXR5U2V0TmFtZX1gKTtcblx0XHR9IGVsc2UgaWYgKHJlc291cmNlTW9kZWwuY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzKGAke3NLZXl9YCkpIHtcblx0XHRcdHJldHVybiByZXNvdXJjZU1vZGVsLmdldFRleHQoc0tleSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzQWN0aW9uTGFiZWw7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfT0tcIik7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyhcblx0b0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZyxcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRiR2V0Qm91bmRDb250ZXh0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRzR3JvdXBJZDogc3RyaW5nLFxuXHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIgfCB1bmRlZmluZWQsXG5cdGlDb250ZXh0TGVuZ3RoOiBudW1iZXIgfCBudWxsLFxuXHRjdXJyZW50X2NvbnRleHRfaW5kZXg6IG51bWJlciB8IG51bGwsXG5cdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlOiBGdW5jdGlvbixcblx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdDogRnVuY3Rpb24sXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzPzogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0PiB7XG5cdGxldCBvQWN0aW9uUHJvbWlzZTogUHJvbWlzZTx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD4sXG5cdFx0YkVuYWJsZVN0cmljdEhhbmRsaW5nID0gdHJ1ZTtcblx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUgPSBpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZTtcblx0fVxuXHRpZiAoYkdldEJvdW5kQ29udGV4dCkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0FjdGlvbi5nZXRCb3VuZENvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc01ldGFQYXRoID0gb0FjdGlvbi5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRjb25zdCBvUHJvcGVydHkgPSBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KHNNZXRhUGF0aCk7XG5cdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHlbMF0/LiRraW5kICE9PSBcIkFjdGlvblwiKSB7XG5cdFx0XHQvL2RvIG5vdCBlbmFibGUgdGhlIHN0cmljdCBoYW5kbGluZyBpZiBpdHMgbm90IGFuIGFjdGlvblxuXHRcdFx0YkVuYWJsZVN0cmljdEhhbmRsaW5nID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5kaXNhYmxlU3RyaWN0SGFuZGxpbmcpIHtcblx0XHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmICghYkVuYWJsZVN0cmljdEhhbmRsaW5nKSB7XG5cdFx0b0FjdGlvblByb21pc2UgPSBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQsIGlnbm9yZUVUYWcpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUob0FjdGlvbi5nZXRCb3VuZENvbnRleHQoKSk7XG5cdFx0XHRyZXR1cm4gb0FjdGlvbi5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvQWN0aW9uUHJvbWlzZSA9IGJHZXRCb3VuZENvbnRleHRcblx0XHRcdD8gb0FjdGlvblxuXHRcdFx0XHRcdC5leGVjdXRlKFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHRpZ25vcmVFVGFnLFxuXHRcdFx0XHRcdFx0b3BlcmF0aW9uc0hlbHBlci5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0XHRcdFx0b3BlcmF0aW9ucyxcblx0XHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjdXJyZW50X2NvbnRleHRfaW5kZXgsXG5cdFx0XHRcdFx0XHRcdG9BY3Rpb24uZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRcdFx0XHRpQ29udGV4dExlbmd0aCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiAhbVBhcmFtZXRlcnMuYkdyb3VwZWQpIHtcblx0XHRcdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpc3Rpb25NZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzIGFzIFN0cmljdEhhbmRsaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZShvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpKTtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiAhbVBhcmFtZXRlcnMuYkdyb3VwZWQpIHtcblx0XHRcdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpc3Rpb25NZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzIGFzIFN0cmljdEhhbmRsaW5nUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCgpO1xuXHRcdFx0XHRcdFx0dGhyb3cgQ29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0OiBvQWN0aW9uXG5cdFx0XHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdGlnbm9yZUVUYWcsXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleCxcblx0XHRcdFx0XHRcdFx0b0FjdGlvbi5nZXRDb250ZXh0KCksXG5cdFx0XHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHJlc3VsdDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiAhbVBhcmFtZXRlcnMuYkdyb3VwZWQpIHtcblx0XHRcdFx0XHRcdFx0dXBkYXRlNDEyVHJhbnNpc3Rpb25NZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzIGFzIFN0cmljdEhhbmRsaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiYgIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHRcdFx0XHRcdHVwZGF0ZTQxMlRyYW5zaXN0aW9uTWVzc2FnZXMoXG5cdFx0XHRcdFx0XHRcdFx0b0FjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyBhcyBTdHJpY3RIYW5kbGluZ1BhcmFtZXRlcnNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QoKTtcblx0XHRcdFx0XHRcdHRocm93IENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQ7XG5cdFx0XHRcdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb0FjdGlvblByb21pc2UuY2F0Y2goKCkgPT4ge1xuXHRcdGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QoKTtcblx0XHR0aHJvdyBDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkO1xuXHR9KTtcbn1cbi8qKlxuICogVXBkYXRlcyB0aGUgc3RyaWN0SGFuZGxpbmdVdGlsaXRlcyB3aXRoIHRoZSBmYWlsZWQgYW5kIHN1Y2Nlc3NmdWwgdHJhbnNpc2l0aW9uIG1lc3NhZ2VzLlxuICpcbiAqIEBwYXJhbSBvQWN0aW9uIEFjdGlvbiBleGVjdXRlZFxuICogQHBhcmFtIHNHcm91cElkIEdyb3VwSWQgb2YgdGhlIGJhdGNoXG4gKiBAcGFyYW0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgVXRpbGl0eSBmbGFncyBhbmQgbWVzc2FnZXMgZm9yIHN0cmljdEhhbmRsaW5nXG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgU3RyaWN0IEhhbmRsaW5nIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBvbmx5U3VjY2Vzc01lc3NhZ2VzIFRvIHVwZGF0ZSBvbmx5IHN1Y2Nlc3NmdWwgdHJhbnNpdGlvbiBtZXNzYWdlc1xuICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNvbnRhaW5zIGF0dHJpYnV0ZXMgcmVsYXRlZCB0byBzdHJpY2tIYW5kbGluZ1xuICovXG5mdW5jdGlvbiB1cGRhdGU0MTJUcmFuc2lzdGlvbk1lc3NhZ2VzKFxuXHRvQWN0aW9uOiBPRGF0YUNvbnRleHRCaW5kaW5nLFxuXHRzR3JvdXBJZDogc3RyaW5nLFxuXHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllczogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdG1QYXJhbWV0ZXJzPzogU3RyaWN0SGFuZGxpbmdQYXJhbWV0ZXJzLFxuXHRvbmx5U3VjY2Vzc01lc3NhZ2VzID0gZmFsc2Vcbik6IHZvaWQge1xuXHRjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRjb25zdCB7IHByb2Nlc3NlZE1lc3NhZ2VJZHMsIGRlbGF5U3VjY2Vzc01lc3NhZ2VzLCBzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyB9ID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM7XG5cdGNvbnN0IHRyYW5zaXRpb25NZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbiAobWVzc2FnZTogTWVzc2FnZSkge1xuXHRcdC8vY2hlY2sgaWYgdGhlIHRyYW5zaXN0aW9uIG1lc3NhZ2VzIGlzIGFscmVhZHkgcHJvY2Vzc2VkXG5cdFx0Y29uc3QgaXNEdXBsaWNhdGUgPSBwcm9jZXNzZWRNZXNzYWdlSWRzLmZpbmQoZnVuY3Rpb24gKGlkOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlLmdldElkKCkgPT09IGlkO1xuXHRcdH0pO1xuXHRcdC8vIHVwZGF0ZSB0aGUgc3RyaWN0SGFuZGxpbmcgd2l0aCB0aGUgc3VjY2VzcyBtZXNzYWdlcyB3aGljaCBuZWVkcyB0byBiZSBzaG93biBsYXRlclxuXHRcdGlmICghaXNEdXBsaWNhdGUpIHtcblx0XHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHMucHVzaChtZXNzYWdlLmdldElkKCkpO1xuXHRcdFx0aWYgKG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzKSB7XG5cdFx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBtZXNzYWdlLmdldFBlcnNpc3RlbnQoKSA9PT0gdHJ1ZSAmJiBtZXNzYWdlLmdldFR5cGUoKSAhPT0gTWVzc2FnZVR5cGUuU3VjY2VzcyAmJiAhaXNEdXBsaWNhdGU7XG5cdH0pO1xuXHQvL3VwZGF0ZSB0aGUgc3RyaWN0SGFuZGxpbmdVdGlsaXRlcyB3aXRoIHRoZSBmYWlsZWQgdHJhbnNpc3Rpb24gbWVzc2FnZXMgd2hpY2ggbmVlZHMgdG8gYmUgcmV0cmlnZ2VyZWRcblx0aWYgKCFvbmx5U3VjY2Vzc01lc3NhZ2VzICYmIHRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRpZiAobVBhcmFtZXRlcnM/LmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5wdXNoKHtcblx0XHRcdFx0b0FjdGlvbjogb0FjdGlvbixcblx0XHRcdFx0Z3JvdXBJZDogc0dyb3VwSWRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uKCk6IHtcblx0b0xvY2FsQWN0aW9uUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPjtcblx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmU6IEZ1bmN0aW9uO1xuXHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0OiBGdW5jdGlvbjtcbn0ge1xuXHRsZXQgaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUhOiBGdW5jdGlvbjtcblx0bGV0IGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZWplY3QhOiBGdW5jdGlvbjtcblx0Y29uc3Qgb0xvY2FsQWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHVua25vd24+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0aW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCA9IHJlamVjdDtcblx0fSkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcikge1xuXHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyBhY3Rpb24gXCIsIG9FcnJvcik7XG5cdH0pO1xuXG5cdHJldHVybiB7IG9Mb2NhbEFjdGlvblByb21pc2UsIGludGVybmFsT3BlcmF0aW9uc1Byb21pc2VSZXNvbHZlLCBpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlUmVqZWN0IH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZXJlIGFyZSBhbnkgd2FybmluZyBvciBlcnJvciBtZXNzYWdlcyhib3VuZCBhbmQgdW5ib3VuZCkuIFByZXNlbnRseSBvbmx5IHByb3ZpZGVzIHRoZW0gZm9yIGNoYW5nZXNldCBiYXRjaCBjb25maWcuXG4gKlxuICogQHJldHVybnMgQm9vbGVhbiBpbmRpY2F0aW5nIGV4aXN0YW5jZSBvZiBtZXNzYWdlc1xuICovXG5mdW5jdGlvbiBoYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpOiBib29sZWFuIHtcblx0Y29uc3QgdW5Cb3VuZE1zZ3M6IE1lc3NhZ2VbXSA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh1bmRlZmluZWQsIHRydWUpO1xuXHRjb25zdCBib3VuZE1zZ3M6IE1lc3NhZ2VbXSA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0Y29uc3QgbWVzc2FnZXMgPSBbLi4udW5Cb3VuZE1zZ3MsIC4uLmJvdW5kTXNnc107XG5cblx0cmV0dXJuIG1lc3NhZ2VzLnNvbWUoZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcblx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIiB8fCBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJXYXJuaW5nXCI7XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUFjdGlvbihcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdG9QYXJlbnRDb250cm9sOiBWaWV3LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzPzogU3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+IHtcblx0Y29uc3QgYUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzIHx8IFtdO1xuXHRjb25zdCBvTW9kZWwgPSBtUGFyYW1ldGVycy5tb2RlbDtcblx0Y29uc3QgYUFjdGlvblBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVycyB8fCBbXTtcblx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBtUGFyYW1ldGVycy5hY3Rpb25OYW1lO1xuXHRjb25zdCBmbk9uU3VibWl0dGVkID0gbVBhcmFtZXRlcnMuZm5PblN1Ym1pdHRlZDtcblx0Y29uc3QgZm5PblJlc3BvbnNlID0gbVBhcmFtZXRlcnMuZm5PblJlc3BvbnNlO1xuXHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvUGFyZW50Q29udHJvbCk7XG5cdGxldCBvQWN0aW9uOiBPRGF0YUNvbnRleHRCaW5kaW5nO1xuXG5cdGZ1bmN0aW9uIHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpOiB2b2lkIHtcblx0XHRpZiAoYUFjdGlvblBhcmFtZXRlcnMgJiYgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGlmICghYUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGFBY3Rpb25QYXJhbWV0ZXJzW2pdLiRUeXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLlN0cmluZ1wiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5CeXRlXCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkludDE2XCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkludDMyXCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlID0gMDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHQvLyB0YmNcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvQWN0aW9uLnNldFBhcmFtZXRlcihhQWN0aW9uUGFyYW1ldGVyc1tqXS4kTmFtZSwgYUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZiAoYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdC8vIFRPRE86IHJlZmFjdG9yIHRvIGRpcmVjdCB1c2Ugb2YgUHJvbWlzZS5hbGxTZXR0bGVkXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+KGZ1bmN0aW9uIChcblx0XHRcdHJlc29sdmU6ICh2YWx1ZTogT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXSkgPT4gdm9pZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0Y29uc3QgYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5iR3JvdXBlZDtcblx0XHRcdGNvbnN0IGJHZXRCb3VuZENvbnRleHQgPSBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0O1xuXHRcdFx0Y29uc3QgYUFjdGlvblByb21pc2VzOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdID0gW107XG5cdFx0XHRsZXQgb0FjdGlvblByb21pc2U7XG5cdFx0XHRsZXQgaTtcblx0XHRcdGxldCBzR3JvdXBJZDogc3RyaW5nO1xuXHRcdFx0Y29uc3Qgb2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3QgPSBjcmVhdGVpbnRlcm5hbE9wZXJhdGlvbnNQcm9taXNlRm9yQWN0aW9uRXhlY3V0aW9uKCk7XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiAoXG5cdFx0XHRcdGFjdGlvbkNvbnRleHQ6IE9EYXRhQ29udGV4dEJpbmRpbmcsXG5cdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleDogbnVtYmVyIHwgbnVsbCxcblx0XHRcdFx0b1NpZGVFZmZlY3Q6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSAmIHsgY29udGV4dDogT0RhdGFWNENvbnRleHQgfSxcblx0XHRcdFx0aUNvbnRleHRMZW5ndGg6IG51bWJlclxuXHRcdFx0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHRjb25zdCBpbmRpdmlkdWFsQWN0aW9uUHJvbWlzZTogdW5rbm93bltdID0gW107XG5cdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBuZWVkIGJhdGNoIGdyb3VwIHBlciBhY3Rpb24gY2FsbFxuXHRcdFx0XHRzR3JvdXBJZCA9ICFiR3JvdXBlZCA/IGAkYXV0by4ke2N1cnJlbnRfY29udGV4dF9pbmRleH1gIDogYWN0aW9uQ29udGV4dC5nZXRVcGRhdGVHcm91cElkKCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IGZuUmVxdWVzdFNpZGVFZmZlY3RzLmJpbmQoXG5cdFx0XHRcdFx0b3BlcmF0aW9ucyxcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdG9TaWRlRWZmZWN0LFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdG9BY3Rpb25Qcm9taXNlID0gZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyhcblx0XHRcdFx0XHRhY3Rpb25Db250ZXh0LFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRpQ29udGV4dExlbmd0aCxcblx0XHRcdFx0XHRjdXJyZW50X2NvbnRleHRfaW5kZXgsXG5cdFx0XHRcdFx0b2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3QuaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUsXG5cdFx0XHRcdFx0b2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3QuaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCxcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRpZ25vcmVFVGFnXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFBY3Rpb25Qcm9taXNlcy5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0aW5kaXZpZHVhbEFjdGlvblByb21pc2UucHVzaChvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5vTG9jYWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0Zm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudCwgb1NpZGVFZmZlY3QsIG1QYXJhbWV0ZXJzLCBzR3JvdXBJZCwgaW5kaXZpZHVhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiAoXG5cdFx0XHRcdGFjdGlvbkNvbnRleHQ6IE9EYXRhQ29udGV4dEJpbmRpbmcsXG5cdFx0XHRcdGN1cnJlbnRfY29udGV4dF9pbmRleDogbnVtYmVyIHwgbnVsbCxcblx0XHRcdFx0b1NpZGVFZmZlY3Q6IChBY3Rpb25TaWRlRWZmZWN0c1R5cGUgJiB7IGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0IH0pIHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRpQ29udGV4dExlbmd0aDogbnVtYmVyXG5cdFx0XHQpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W10+IHtcblx0XHRcdFx0Y29uc3QgaW5kaXZpZHVhbEFjdGlvblByb21pc2U6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiIG5lZWQgYmF0Y2ggZ3JvdXAgcGVyIGFjdGlvbiBjYWxsXG5cdFx0XHRcdHNHcm91cElkID0gbVBhcmFtZXRlcnMuZ3JvdXBJZCB8fCBgYXBpTW9kZSR7Y3VycmVudF9jb250ZXh0X2luZGV4fWA7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IGZuUmVxdWVzdFNpZGVFZmZlY3RzLmJpbmQoXG5cdFx0XHRcdFx0b3BlcmF0aW9ucyxcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdG9TaWRlRWZmZWN0LFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdG9BY3Rpb25Qcm9taXNlID0gZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyhcblx0XHRcdFx0XHRhY3Rpb25Db250ZXh0LFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRpQ29udGV4dExlbmd0aCxcblx0XHRcdFx0XHRjdXJyZW50X2NvbnRleHRfaW5kZXgsXG5cdFx0XHRcdFx0b2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3QuaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlc29sdmUsXG5cdFx0XHRcdFx0b2ludGVybmFsT3BlcmF0aW9uc1Byb21pc2VPYmplY3QuaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZVJlamVjdCxcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRpZ25vcmVFVGFnXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFBY3Rpb25Qcm9taXNlcy5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0aW5kaXZpZHVhbEFjdGlvblByb21pc2UucHVzaChvaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZU9iamVjdC5vTG9jYWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0Zm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudCwgb1NpZGVFZmZlY3QsIG1QYXJhbWV0ZXJzLCBzR3JvdXBJZCwgaW5kaXZpZHVhbEFjdGlvblByb21pc2UpO1xuXHRcdFx0XHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGluZGl2aWR1YWxBY3Rpb25Qcm9taXNlKTtcblx0XHRcdH07XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIGZuRXhlY3V0ZUNoYW5nZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0Y29uc3QgYUNoYW5nZVNldExvY2FsUHJvbWlzZXM6IHVua25vd25bXSA9IFtdO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0b0FjdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtzQWN0aW9uTmFtZX0oLi4uKWAsIGFDb250ZXh0c1tpXSwgbUJpbmRpbmdQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRhQ2hhbmdlU2V0TG9jYWxQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0Zm5FeGVjdXRlQWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubGVuZ3RoIDw9IDEgPyBudWxsIDogaSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQ6IGFDb250ZXh0c1tpXSxcblx0XHRcdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnNcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0KFxuXHRcdFx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdFx0XHRmdW5jdGlvbiBub29wKCk6IHZvaWQge1xuXHRcdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KShhQWN0aW9uUHJvbWlzZXMpO1xuXG5cdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhQ2hhbmdlU2V0TG9jYWxQcm9taXNlcyk7XG5cdFx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRpZiAoIWhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzKCkpIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb3BlcmF0aW9uc0hlbHBlci5yZW5kZXJNZXNzYWdlVmlldyhcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nV2FybmluZ01lc3NhZ2VzLFxuXHRcdFx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cy5sZW5ndGggPiAxXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmZvckVhY2goZnVuY3Rpb24gKHNoUHJvbWlzZSkge1xuXHRcdFx0XHRcdFx0XHRcdHNoUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VNb2RlbCA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZXNJbk1vZGVsID0gbWVzc2FnZU1vZGVsLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZU1vZGVsLnNldERhdGEobWVzc2FnZXNJbk1vZGVsLmNvbmNhdChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlcykpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiUmV0cmlnZ2VyaW5nIG9mIHN0cmljdCBoYW5kbGluZyBhY3Rpb25zIGZhaWxlZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIGZuRXhlY3V0ZVNlcXVlbnRpYWxseShjb250ZXh0c1RvRXhlY3V0ZTogT0RhdGFWNENvbnRleHRbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHQvLyBPbmUgYWN0aW9uIGFuZCBpdHMgc2lkZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBuZXh0IGFjdGlvbiBpcyBleGVjdXRlZFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NPbmVBY3Rpb24oXG5cdFx0XHRcdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0YWN0aW9uSW5kZXg6IG51bWJlcixcblx0XHRcdFx0XHRpQ29udGV4dExlbmd0aDogbnVtYmVyXG5cdFx0XHRcdCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXT4ge1xuXHRcdFx0XHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYCR7c0FjdGlvbk5hbWV9KC4uLilgLCBjb250ZXh0LCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdC8vIEFjdGlvbiBvbiB0aGUgdGFibGUgbGV2ZWwgaXMgYm91bmQgb24gYSBjb3B5IG9mIHRoZSBvRGF0YUxpc3RCaW5kaW5nLCB0byBleGVjdXRlIHRoZSBTaWRlRWZmZWN0cyB3ZSBuZWVkXG5cdFx0XHRcdFx0Ly8gdG8gZG8gaXQgb24gdGhlIG9yaWdpbmFsIG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBpbml0aWFsVGFibGVDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLmNvbnRyb2wgYXMgVGFibGUpPy5nZXRSb3dCaW5kaW5nPy4oKT8uZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0XHRcdHJldHVybiBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24oXG5cdFx0XHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRcdFx0YWN0aW9uSW5kZXgsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQ6XG5cdFx0XHRcdFx0XHRcdFx0aW5pdGlhbFRhYmxlQ29udGV4dCAmJiBpbml0aWFsVGFibGVDb250ZXh0LmdldFBhdGgoKSA9PT0gY29udGV4dC5nZXRQYXRoKCkgPyBpbml0aWFsVGFibGVDb250ZXh0IDogY29udGV4dCxcblx0XHRcdFx0XHRcdFx0cGF0aEV4cHJlc3Npb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsXG5cdFx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGlDb250ZXh0TGVuZ3RoXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNlcmlhbGl6YXRpb246IHByb2Nlc3NPbmVBY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIGVudHJ5IGluIGNvbnRleHRzVG9FeGVjdXRlIG9ubHkgYWZ0ZXIgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBoYXMgYmVlbiByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBjb250ZXh0c1RvRXhlY3V0ZS5yZWR1Y2UoYXN5bmMgKHByb21pc2U6IFByb21pc2U8dm9pZD4sIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgcHJvbWlzZTtcblx0XHRcdFx0XHRhd2FpdCBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQsIGlkICsgMSwgYUNvbnRleHRzLmxlbmd0aCk7XG5cdFx0XHRcdH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblxuXHRcdFx0XHRpZiAoc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiYgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdQcm9taXNlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRhd2FpdCBvcGVyYXRpb25zSGVscGVyLnJlbmRlck1lc3NhZ2VWaWV3KFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlcyxcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzLmxlbmd0aCA+IDFcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWJHcm91cGVkKSB7XG5cdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiwgZW5zdXJlIHRoYXQgZWFjaCBhY3Rpb24gYW5kIG1hdGNoaW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyBhcmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgbmV4dCBzZXQgaXMgc3VibWl0dGVkLiBXb3JrYXJvdW5kIHVudGlsIEpTT04gYmF0Y2ggaXMgYXZhaWxhYmxlLlxuXHRcdFx0XHQvLyBBbGxvdyBhbHNvIGZvciBMaXN0IFJlcG9ydC5cblx0XHRcdFx0Zm5FeGVjdXRlU2VxdWVudGlhbGx5KGFDb250ZXh0cyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmbkV4ZWN1dGVDaGFuZ2VzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gZm5IYW5kbGVSZXN1bHRzKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHQvLyBQcm9taXNlLmFsbFNldHRsZWQgd2lsbCBuZXZlciBiZSByZWplY3RlZC4gSG93ZXZlciwgZXNsaW50IHJlcXVpcmVzIGVpdGhlciBjYXRjaCBvciByZXR1cm4gLSB0aHVzIHdlIHJldHVybiB0aGUgcmVzdWx0aW5nIFByb21pc2UgYWx0aG91Z2ggbm8gb25lIHdpbGwgdXNlIGl0LlxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGFBY3Rpb25Qcm9taXNlcykudGhlbihyZXNvbHZlKTtcblx0XHRcdH1cblx0XHR9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdChcblx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG5cdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHR9XG5cdFx0XHQpKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b0FjdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChgLyR7c0FjdGlvbk5hbWV9KC4uLilgKTtcblx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiYWN0aW9uSW1wb3J0XCI7XG5cdFx0Y29uc3Qgb0FjdGlvblByb21pc2U6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+ID0gb0FjdGlvbi5leGVjdXRlKFxuXHRcdFx0c0dyb3VwSWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRvcGVyYXRpb25zSGVscGVyLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKFxuXHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0eyBsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsIG1vZGVsOiBvTW9kZWwgfSxcblx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzXG5cdFx0XHQpXG5cdFx0KTtcblx0XHRjb25zdCBhbGxQcm9taXNlOiBQcm9taXNlPHVua25vd24+W10gPSBbb0FjdGlvblByb21pc2VdO1xuXHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChcIi91bkJvdW5kQWN0aW9uXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdCA9IHtcblx0XHRcdFx0Y29udGV4dDogY29udGV4dCxcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsXG5cdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0fTtcblx0XHRcdG9wZXJhdGlvbnMuZm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudCwgc2lkZUVmZmVjdCwgbVBhcmFtZXRlcnMsIHNHcm91cElkLCBhbGxQcm9taXNlKTtcblx0XHRcdGNvbnRleHQuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdC8vIHRyaWdnZXIgb25TdWJtaXR0ZWQgXCJldmVudFwiXG5cdFx0KFxuXHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0ZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcblx0XHRcdFx0LyoqL1xuXHRcdFx0fVxuXHRcdCkob0FjdGlvblByb21pc2UpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhbGxQcm9taXNlKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGN1cnJlbnRQcm9taXNlVmFsdWVzOiB1bmtub3duW10pIHtcblx0XHRcdFx0Ly8gSGVyZSB3ZSBlbnN1cmUgdGhhdCB3ZSByZXR1cm4gdGhlIHJlc3BvbnNlIHdlIGdvdCBmcm9tIGFuIHVuYm91bmQgYWN0aW9uIHRvIHRoZVxuXHRcdFx0XHQvLyBjYWxsZXIgQkNQIDogMjI3MDEzOTI3OVxuXHRcdFx0XHRjb25zdCBjdXJyZW50UHJvbWlzZVZhbHVlID0gY3VycmVudFByb21pc2VWYWx1ZXNbMF07XG5cdFx0XHRcdGlmIChjdXJyZW50UHJvbWlzZVZhbHVlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGN1cnJlbnRQcm9taXNlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0Py4oKT8uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgYWN0aW9uIFwiICsgc0FjdGlvbk5hbWUsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkoKTtcblx0XHRcdH0pO1xuXHR9XG59XG5mdW5jdGlvbiBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dDogQ29udGV4dCwgc0FjdGlvbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGxldCBzUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKTtcblx0c1BhdGggPSBvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSA/IHNQYXRoLnNwbGl0KFwiQCR1aTUub3ZlcmxvYWRcIilbMF0gOiBzUGF0aC5zcGxpdChcIi8wXCIpWzBdO1xuXHRyZXR1cm4gc1BhdGguc3BsaXQoYC8ke3NBY3Rpb25OYW1lfWApWzBdO1xufVxuXG5mdW5jdGlvbiBfdmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzKFxuXHRpc0NyZWF0ZUFjdGlvbjogYm9vbGVhbixcblx0YWN0aW9uUGFyYW1ldGVyczogeyAkTmFtZTogc3RyaW5nIH1bXSxcblx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcblx0c3RhcnR1cFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogYm9vbGVhbiB7XG5cdGlmIChwYXJhbWV0ZXJWYWx1ZXMpIHtcblx0XHQvLyBJZiBzaG93RGlhbG9nIGlzIGZhbHNlIGJ1dCB0aGVyZSBhcmUgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnZva2VBY3Rpb24gY2FsbCwgd2UgbmVlZCB0byBjaGVjayB0aGF0IHZhbHVlcyBoYXZlIGJlZW5cblx0XHQvLyBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlciBvZiBhY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFjdGlvblBhcmFtZXRlci4kTmFtZSAhPT0gXCJSZXN1bHRJc0FjdGl2ZUVudGl0eVwiICYmXG5cdFx0XHRcdCFwYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gYWN0aW9uUGFyYW1ldGVyLiROYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIEF0IGxlYXN0IGZvciBvbmUgcGFyYW1ldGVyIG5vIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkLCBzbyB3ZSBjYW4ndCBza2lwIHRoZSBkaWFsb2dcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChpc0NyZWF0ZUFjdGlvbiAmJiBzdGFydHVwUGFyYW1ldGVycykge1xuXHRcdC8vIElmIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGR1cmluZyBhcHBsaWNhdGlvbiBsYXVuY2gsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNldCBpcyBjb21wbGV0ZVxuXHRcdC8vIElmIG5vdCwgdGhlIHBhcmFtZXRlciBkaWFsb2cgc3RpbGwgbmVlZHMgdG8gYmUgc2hvd24uXG5cdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXIgb2YgYWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKCFzdGFydHVwUGFyYW1ldGVyc1thY3Rpb25QYXJhbWV0ZXIuJE5hbWVdKSB7XG5cdFx0XHRcdC8vIEF0IGxlYXN0IGZvciBvbmUgcGFyYW1ldGVyIG5vIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkLCBzbyB3ZSBjYW4ndCBza2lwIHRoZSBkaWFsb2dcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZm5SZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0b1NpZGVFZmZlY3Q6IChBY3Rpb25TaWRlRWZmZWN0c1R5cGUgJiB7IGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0IH0pIHwgdW5kZWZpbmVkLFxuXHRtUGFyYW1ldGVyczoge1xuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRzZWxlY3RlZEl0ZW1zOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHR9LFxuXHRzR3JvdXBJZDogc3RyaW5nLFxuXHRhTG9jYWxQcm9taXNlPzogdW5rbm93bltdXG4pOiB2b2lkIHtcblx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdGxldCBvTG9jYWxQcm9taXNlO1xuXHQvLyB0cmlnZ2VyIGFjdGlvbnMgZnJvbSBzaWRlIGVmZmVjdHNcblx0aWYgKG9TaWRlRWZmZWN0ICYmIG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zICYmIG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zLmxlbmd0aCkge1xuXHRcdG9TaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKHNUcmlnZ2VyQWN0aW9uOiBzdHJpbmcpIHtcblx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHRvTG9jYWxQcm9taXNlID0gb1NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uLCBvU2lkZUVmZmVjdC5jb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0XHRcdGlmIChhTG9jYWxQcm9taXNlKSB7XG5cdFx0XHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9Mb2NhbFByb21pc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gcmVxdWVzdCBzaWRlIGVmZmVjdHMgZm9yIHRoaXMgYWN0aW9uXG5cdC8vIGFzIHdlIG1vdmUgdGhlIG1lc3NhZ2VzIHJlcXVlc3QgdG8gUE9TVCAkc2VsZWN0IHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yIGFuIGVtcHR5IGFycmF5XG5cdGlmIChvU2lkZUVmZmVjdCAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLmxlbmd0aCA+IDApIHtcblx0XHRvTG9jYWxQcm9taXNlID0gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLCBvU2lkZUVmZmVjdC5jb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0aWYgKGFMb2NhbFByb21pc2UpIHtcblx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvTG9jYWxQcm9taXNlKTtcblx0XHR9XG5cdFx0b0xvY2FsUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRKU09OLnBhcnNlKG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zLFxuXHRcdFx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9KTtcblx0fVxufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTYuMFxuICovXG5jb25zdCBvcGVyYXRpb25zID0ge1xuXHRjYWxsQm91bmRBY3Rpb246IGNhbGxCb3VuZEFjdGlvbixcblx0Y2FsbEFjdGlvbkltcG9ydDogY2FsbEFjdGlvbkltcG9ydCxcblx0Y2FsbEJvdW5kRnVuY3Rpb246IGNhbGxCb3VuZEZ1bmN0aW9uLFxuXHRjYWxsRnVuY3Rpb25JbXBvcnQ6IGNhbGxGdW5jdGlvbkltcG9ydCxcblx0ZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0czogZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyxcblx0Y3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbjogY3JlYXRlaW50ZXJuYWxPcGVyYXRpb25zUHJvbWlzZUZvckFjdGlvbkV4ZWN1dGlvbixcblx0dmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzOiBfdmFsdWVzUHJvdmlkZWRGb3JBbGxQYXJhbWV0ZXJzLFxuXHRnZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lOiBfZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZSxcblx0YWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjazogYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayxcblx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uOiBhZnRlckFjdGlvblJlc29sdXRpb24sXG5cdGhhc1RyYW5zaXRpb25FcnJvcnNPcldhcm5pbmdzOiBoYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncyxcblx0Zm5SZXF1ZXN0U2lkZUVmZmVjdHM6IGZuUmVxdWVzdFNpZGVFZmZlY3RzXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcGVyYXRpb25zO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7RUFpREEsTUFBTUEsU0FBUyxHQUFHQyxTQUFTLENBQUNELFNBQVM7SUFDcENFLGtCQUFrQixHQUFHRCxTQUFTLENBQUNDLGtCQUFrQjtFQUNsRCxNQUFNQyxNQUFN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
|