@sapui5/sap.fe.core 1.136.1 → 1.138.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 +76 -28
- package/src/sap/fe/core/ActionRuntime.ts +106 -30
- package/src/sap/fe/core/AppComponent.js +11 -1
- package/src/sap/fe/core/AppComponent.ts +10 -0
- package/src/sap/fe/core/AppStateHandler.js +9 -2
- package/src/sap/fe/core/AppStateHandler.ts +8 -2
- package/src/sap/fe/core/CommonUtils.js +15 -3
- package/src/sap/fe/core/CommonUtils.ts +13 -2
- package/src/sap/fe/core/PageController.controller.js +10 -0
- package/src/sap/fe/core/PageController.controller.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -4
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +3 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +2 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -12
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -16
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +20 -5
- package/src/sap/fe/core/controllerextensions/Paginator.ts +19 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +4 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -2
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +178 -125
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +222 -174
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +5 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +39 -5
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +51 -11
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +16 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +17 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +88 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +106 -7
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +16 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +15 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +25 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +24 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +11 -8
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +13 -10
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -4
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +7 -3
- package/src/sap/fe/core/controls/DataWatcher.js +2 -2
- package/src/sap/fe/core/controls/DataWatcher.tsx +1 -1
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +11 -6
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +13 -9
- package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
- package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +3 -2
- package/src/sap/fe/core/converters/MetaModelConverter.ts +12 -4
- package/src/sap/fe/core/converters/controls/Common/Action.js +42 -5
- package/src/sap/fe/core/converters/controls/Common/Action.ts +42 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +4 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +2 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +46 -13
- package/src/sap/fe/core/converters/controls/Common/Table.ts +50 -11
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +11 -10
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +13 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +2 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +9 -9
- package/src/sap/fe/core/helpers/DeleteHelper.ts +8 -9
- package/src/sap/fe/core/helpers/FPMHelper.js +2 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js +4 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +8 -4
- package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
- package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
- package/src/sap/fe/core/library.js +33 -4
- package/src/sap/fe/core/library.ts +33 -2
- package/src/sap/fe/core/messagebundle.properties +18 -2
- package/src/sap/fe/core/messagebundle_ar.properties +3 -2
- package/src/sap/fe/core/messagebundle_bg.properties +2 -1
- package/src/sap/fe/core/messagebundle_ca.properties +2 -1
- package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
- package/src/sap/fe/core/messagebundle_cs.properties +4 -3
- package/src/sap/fe/core/messagebundle_cy.properties +2 -1
- package/src/sap/fe/core/messagebundle_da.properties +2 -1
- package/src/sap/fe/core/messagebundle_de.properties +8 -7
- package/src/sap/fe/core/messagebundle_el.properties +2 -1
- package/src/sap/fe/core/messagebundle_en.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -1
- package/src/sap/fe/core/messagebundle_es.properties +5 -4
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
- package/src/sap/fe/core/messagebundle_et.properties +2 -1
- package/src/sap/fe/core/messagebundle_fi.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -1
- package/src/sap/fe/core/messagebundle_hr.properties +2 -1
- package/src/sap/fe/core/messagebundle_hu.properties +2 -1
- package/src/sap/fe/core/messagebundle_id.properties +2 -1
- package/src/sap/fe/core/messagebundle_it.properties +2 -1
- package/src/sap/fe/core/messagebundle_iw.properties +2 -1
- package/src/sap/fe/core/messagebundle_ja.properties +3 -2
- package/src/sap/fe/core/messagebundle_kk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ko.properties +2 -1
- package/src/sap/fe/core/messagebundle_lt.properties +2 -1
- package/src/sap/fe/core/messagebundle_lv.properties +2 -1
- package/src/sap/fe/core/messagebundle_mk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ms.properties +2 -1
- package/src/sap/fe/core/messagebundle_nl.properties +2 -1
- package/src/sap/fe/core/messagebundle_no.properties +3 -2
- package/src/sap/fe/core/messagebundle_pl.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
- package/src/sap/fe/core/messagebundle_ro.properties +2 -1
- package/src/sap/fe/core/messagebundle_ru.properties +2 -1
- package/src/sap/fe/core/messagebundle_sh.properties +2 -1
- package/src/sap/fe/core/messagebundle_sk.properties +2 -1
- package/src/sap/fe/core/messagebundle_sl.properties +2 -1
- package/src/sap/fe/core/messagebundle_sr.properties +2 -1
- package/src/sap/fe/core/messagebundle_sv.properties +2 -1
- package/src/sap/fe/core/messagebundle_th.properties +2 -1
- package/src/sap/fe/core/messagebundle_tr.properties +2 -1
- package/src/sap/fe/core/messagebundle_uk.properties +2 -1
- package/src/sap/fe/core/messagebundle_vi.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +6 -6
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +5 -5
- package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
- package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
- package/src/sap/fe/core/templating/UIFormatters.js +3 -3
- package/src/sap/fe/core/templating/UIFormatters.ts +1 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +0 -81
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +0 -126
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +0 -10
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +0 -2
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2025 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvider", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/editFlow/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvider", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/MetaModelFunction", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/PromiseKeeper", "sap/fe/core/helpers/ToES6Promise", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/MessageType", "../../ActionRuntime", "./operations/ODataOperation", "./operations/Operation", "./operations/actionHelper"], function (Log, CommonUtils, UIProvider, BusyLocker, draft, UiModelConstants, sticky, messageHandling, MetaModelConverter, DataField, deleteHelper, FPMHelper, MetaModelFunction, ModelHelper, PromiseKeeper, toES6Promise, TypeGuards, FELibrary, Button, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Library, Messaging, MessageType, ActionRuntime, ODataOperation, Operation, actionHelper) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var isNavigationProperty = TypeGuards.isNavigationProperty;
|
|
9
|
+
var isFulfilled = TypeGuards.isFulfilled;
|
|
10
|
+
var isAction = TypeGuards.isAction;
|
|
9
11
|
var getCreatePopupFields = MetaModelFunction.getCreatePopupFields;
|
|
10
12
|
var isDataFieldForAction = DataField.isDataFieldForAction;
|
|
11
|
-
var convertTypes = MetaModelConverter.convertTypes;
|
|
12
13
|
var getCoreUIFactory = UIProvider.getCoreUIFactory;
|
|
13
14
|
const CreationMode = FELibrary.CreationMode;
|
|
14
15
|
const ProgrammingModel = FELibrary.ProgrammingModel;
|
|
@@ -73,31 +74,66 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
/**
|
|
76
|
-
* Retrieves
|
|
77
|
+
* Retrieves default values from the DefaultValue function.
|
|
77
78
|
* @param listBinding The list binding to be used for creation
|
|
79
|
+
* @param appComponent The app component
|
|
78
80
|
* @returns A promise with an object containing the default values (or undefined if there's no default value function)
|
|
79
81
|
*/;
|
|
80
|
-
_proto.getDataFromDefaultValueFunction = async function getDataFromDefaultValueFunction(listBinding) {
|
|
82
|
+
_proto.getDataFromDefaultValueFunction = async function getDataFromDefaultValueFunction(listBinding, appComponent) {
|
|
81
83
|
const model = listBinding.getModel();
|
|
82
84
|
const metaModel = model.getMetaModel();
|
|
83
85
|
const metaContext = metaModel.getMetaContext(listBinding.getResolvedPath());
|
|
84
86
|
const listBindingObjectPath = MetaModelConverter.getInvolvedDataModelObjects(metaContext);
|
|
85
87
|
const defaultFuncOnTargetObject = listBindingObjectPath.targetObject.annotations.Common?.DefaultValuesFunction;
|
|
86
88
|
const defaultFuncOnTargetEntitySet = listBindingObjectPath.targetEntitySet?.annotations.Common?.DefaultValuesFunction;
|
|
87
|
-
const defaultFunctionName = defaultFuncOnTargetObject ?? defaultFuncOnTargetEntitySet;
|
|
89
|
+
const defaultFunctionName = (defaultFuncOnTargetObject ?? defaultFuncOnTargetEntitySet)?.toString();
|
|
88
90
|
if (!defaultFunctionName) {
|
|
89
91
|
// No default value function
|
|
90
92
|
return undefined;
|
|
91
93
|
}
|
|
92
94
|
const functionOnNavProp = isNavigationProperty(listBindingObjectPath.targetObject) && defaultFuncOnTargetObject !== undefined;
|
|
93
|
-
|
|
95
|
+
let defaultFunctionContext;
|
|
96
|
+
if (functionOnNavProp) {
|
|
97
|
+
// If the path is a deep navigation, derive the correct parent context
|
|
98
|
+
const bindingPath = listBinding.getPath();
|
|
99
|
+
const context = listBinding.getContext();
|
|
100
|
+
if (bindingPath?.startsWith("/")) {
|
|
101
|
+
defaultFunctionContext = context;
|
|
102
|
+
} else if (bindingPath && context && bindingPath.includes("/")) {
|
|
103
|
+
// Extract the first part of the navigation path (e.g., _ToHeader/_ToItems → _ToHeader)
|
|
104
|
+
const firstNav = bindingPath.split("/")[0];
|
|
105
|
+
|
|
106
|
+
// Build the full path to the correct context for the function call
|
|
107
|
+
const parentPath = `${context.getPath()}/${firstNav}`;
|
|
108
|
+
|
|
109
|
+
// Create a new binding context for this path
|
|
110
|
+
defaultFunctionContext = model.bindContext(parentPath).getBoundContext();
|
|
111
|
+
} else {
|
|
112
|
+
// Fallback to the current context if no navigation found
|
|
113
|
+
defaultFunctionContext = context;
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
// If not a navigation property, use the header context (root object page context)
|
|
117
|
+
defaultFunctionContext = listBinding.getHeaderContext();
|
|
118
|
+
}
|
|
119
|
+
//const defaultFunctionContext = functionOnNavProp ? listBinding.getContext() : listBinding.getHeaderContext();
|
|
94
120
|
if (!defaultFunctionContext) {
|
|
95
121
|
return undefined;
|
|
96
122
|
}
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
123
|
+
const operation = Operation.getOperationFromName(defaultFunctionName, model, defaultFunctionContext) ?? Operation.getOperationFromName(defaultFunctionName, model);
|
|
124
|
+
if (!operation) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
const isAnAction = isAction(operation);
|
|
128
|
+
const result = await new ODataOperation(operation, {
|
|
129
|
+
appComponent,
|
|
130
|
+
model,
|
|
131
|
+
contexts: isAnAction ? [defaultFunctionContext] : []
|
|
132
|
+
}, {
|
|
133
|
+
enhance$select: false,
|
|
134
|
+
groupId: isAnAction ? "functionGroup" : "functionImport"
|
|
135
|
+
}).execute();
|
|
136
|
+
return result.filter(isFulfilled)[0]?.value.boundContext.getObject();
|
|
101
137
|
}
|
|
102
138
|
|
|
103
139
|
/**
|
|
@@ -403,7 +439,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
403
439
|
let newDocumentContext;
|
|
404
440
|
const initialData = parameters.data;
|
|
405
441
|
if (!fromCopyPaste) {
|
|
406
|
-
const defaultValueFunctionData = await this.getDataFromDefaultValueFunction(mainListBinding);
|
|
442
|
+
const defaultValueFunctionData = await this.getDataFromDefaultValueFunction(mainListBinding, appComponent);
|
|
407
443
|
parameters.data = Object.assign({}, defaultValueFunctionData, parameters.data);
|
|
408
444
|
}
|
|
409
445
|
if (parameters.data) {
|
|
@@ -454,122 +490,141 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
454
490
|
* @param appComponent The appComponent
|
|
455
491
|
* @param resourceModel The resource model to load text resources
|
|
456
492
|
* @param messageHandler The message handler extension
|
|
457
|
-
* @returns A
|
|
493
|
+
* @returns A promise resolved to true once the documents are deleted, or to false if the deletion was canceled by the user.
|
|
458
494
|
*/;
|
|
459
495
|
_proto.deleteDocument = async function deleteDocument(contexts, mParameters, appComponent, resourceModel, messageHandler) {
|
|
460
496
|
// delete document lock
|
|
461
497
|
this.busyLock(appComponent);
|
|
462
498
|
const contextsToDelete = Array.isArray(contexts) ? [...contexts] : [contexts];
|
|
463
499
|
const firstContext = (mParameters.selectedContexts ?? contextsToDelete)[0];
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
if
|
|
477
|
-
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
500
|
+
try {
|
|
501
|
+
const draftEnabled = this._isDraftEnabled(mParameters.selectedContexts || contextsToDelete);
|
|
502
|
+
const items = [];
|
|
503
|
+
let options = [];
|
|
504
|
+
let unSavedContext;
|
|
505
|
+
// items(texts) and options(checkBoxes and single default option) for confirm dialog.
|
|
506
|
+
if (mParameters) {
|
|
507
|
+
mParameters = getParameters(mParameters);
|
|
508
|
+
mParameters.entitySetName = this.getCollectionNameFromContext(firstContext);
|
|
509
|
+
if (!mParameters.numberOfSelectedContexts) {
|
|
510
|
+
// non-Table
|
|
511
|
+
if (draftEnabled) {
|
|
512
|
+
// Check if 1 of the drafts is locked by another user
|
|
513
|
+
const lockedContext = contextsToDelete.find(context => {
|
|
514
|
+
const contextData = context.getObject();
|
|
515
|
+
return contextData.IsActiveEntity === true && contextData.HasDraftEntity === true && contextData.DraftAdministrativeData && contextData.DraftAdministrativeData.InProcessByUser && !contextData.DraftAdministrativeData.DraftIsCreatedByMe;
|
|
516
|
+
});
|
|
517
|
+
if (lockedContext) {
|
|
518
|
+
// Show message box with the name of the locking user and return
|
|
519
|
+
await this.showDeleMessageLockedObjet(lockedContext, resourceModel);
|
|
520
|
+
return false; // No deletion happened
|
|
521
|
+
} else {
|
|
522
|
+
unSavedContext = contextsToDelete.find(context => {
|
|
523
|
+
const {
|
|
524
|
+
IsActiveEntity,
|
|
525
|
+
HasDraftEntity,
|
|
526
|
+
DraftAdministrativeData
|
|
527
|
+
} = context.getObject() || {};
|
|
528
|
+
return IsActiveEntity === true && HasDraftEntity === true && !!DraftAdministrativeData?.InProcessByUser;
|
|
481
529
|
});
|
|
482
|
-
if (lockedContext) {
|
|
483
|
-
// Show message box with the name of the locking user and return
|
|
484
|
-
const lockingUserName = lockedContext.getObject().DraftAdministrativeData.InProcessByUser;
|
|
485
|
-
MessageBox.show(resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", [lockingUserName]), {
|
|
486
|
-
title: resourceModel.getText("C_COMMON_DELETE"),
|
|
487
|
-
onClose: reject
|
|
488
|
-
});
|
|
489
|
-
return;
|
|
490
|
-
} else {
|
|
491
|
-
unSavedContext = contextsToDelete.find(context => {
|
|
492
|
-
const {
|
|
493
|
-
IsActiveEntity,
|
|
494
|
-
HasDraftEntity,
|
|
495
|
-
DraftAdministrativeData
|
|
496
|
-
} = context.getObject() || {};
|
|
497
|
-
return IsActiveEntity === true && HasDraftEntity === true && !!DraftAdministrativeData?.InProcessByUser;
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
530
|
}
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
nonTableTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_ONLY", [mParameters.title], mParameters.entitySetName);
|
|
510
|
-
}
|
|
531
|
+
}
|
|
532
|
+
let nonTableTxt = "";
|
|
533
|
+
if (unSavedContext) {
|
|
534
|
+
const unSavedContextUser = unSavedContext.getObject().DraftAdministrativeData.InProcessByUser;
|
|
535
|
+
nonTableTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", [unSavedContextUser], mParameters.entitySetName);
|
|
536
|
+
} else if (mParameters.title) {
|
|
537
|
+
if (mParameters.description) {
|
|
538
|
+
nonTableTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", [mParameters.title, mParameters.description], mParameters.entitySetName);
|
|
511
539
|
} else {
|
|
512
|
-
nonTableTxt = resourceModel.getText("
|
|
540
|
+
nonTableTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_ONLY", [mParameters.title], mParameters.entitySetName);
|
|
513
541
|
}
|
|
514
|
-
options.push({
|
|
515
|
-
type: DeleteOptionTypes.deletableContexts,
|
|
516
|
-
contexts: contextsToDelete,
|
|
517
|
-
text: nonTableTxt,
|
|
518
|
-
selected: true,
|
|
519
|
-
control: DeleteDialogContentControl.TEXT
|
|
520
|
-
});
|
|
521
542
|
} else {
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
543
|
+
nonTableTxt = resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", undefined, mParameters.entitySetName);
|
|
544
|
+
}
|
|
545
|
+
options.push({
|
|
546
|
+
type: DeleteOptionTypes.deletableContexts,
|
|
547
|
+
contexts: contextsToDelete,
|
|
548
|
+
text: nonTableTxt,
|
|
549
|
+
selected: true,
|
|
550
|
+
control: DeleteDialogContentControl.TEXT
|
|
551
|
+
});
|
|
552
|
+
} else {
|
|
553
|
+
// Table
|
|
554
|
+
let totalDeletable = contextsToDelete.length;
|
|
555
|
+
if (draftEnabled) {
|
|
556
|
+
totalDeletable += (mParameters.draftsWithNonDeletableActive?.length ?? 0) + (mParameters.draftsWithDeletableActive?.length ?? 0) + (mParameters.unSavedContexts?.length ?? 0);
|
|
557
|
+
deleteHelper.updateDraftOptionsForDeletableTexts(mParameters, contextsToDelete, totalDeletable, resourceModel, items, options);
|
|
558
|
+
} else {
|
|
559
|
+
const nonDeletableText = deleteHelper.getNonDeletableText(mParameters, totalDeletable, resourceModel);
|
|
560
|
+
if (nonDeletableText) {
|
|
561
|
+
items.push(nonDeletableText);
|
|
532
562
|
}
|
|
533
|
-
const optionsDeletableTexts = deleteHelper.getOptionsForDeletableTexts(mParameters, contextsToDelete, resourceModel);
|
|
534
|
-
options = [...options, ...optionsDeletableTexts];
|
|
535
563
|
}
|
|
564
|
+
const optionsDeletableTexts = deleteHelper.getOptionsForDeletableTexts(mParameters, contextsToDelete, resourceModel);
|
|
565
|
+
options = [...options, ...optionsDeletableTexts];
|
|
536
566
|
}
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
567
|
+
}
|
|
568
|
+
const commonBinding = firstContext.getBinding();
|
|
569
|
+
let bindingType;
|
|
570
|
+
if (commonBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
|
|
571
|
+
if (this.isListBindingHierarchical(commonBinding)) {
|
|
572
|
+
bindingType = "Tree";
|
|
573
|
+
} else if (this.isListBindingAnalytical(commonBinding)) {
|
|
574
|
+
bindingType = "Analytical";
|
|
545
575
|
}
|
|
576
|
+
}
|
|
546
577
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
await deleteHelper.deleteConfirmHandler(options, mParameters, messageHandler, resourceModel, appComponent, draftEnabled, bindingType);
|
|
554
|
-
resolve();
|
|
555
|
-
} catch (oError) {
|
|
556
|
-
reject();
|
|
557
|
-
} finally {
|
|
558
|
-
this.busyUnlock(appComponent);
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
const dialog = this.createDeleteDialog(items, mParameters, resourceModel, fnConfirm, reject);
|
|
562
|
-
if (mParameters.noDialog === true || mParameters.silentMode === true) {
|
|
563
|
-
fnConfirm();
|
|
564
|
-
} else {
|
|
565
|
-
dialog.addStyleClass("sapUiContentPadding");
|
|
566
|
-
dialog.open();
|
|
578
|
+
// Confirm the deletion if needed
|
|
579
|
+
deleteHelper.updateContentForDeleteDialog(options, items);
|
|
580
|
+
if (mParameters.noDialog !== true && mParameters.silentMode !== true) {
|
|
581
|
+
const confirmed = await this.showDeleteConfirmationDialog(items, mParameters, resourceModel);
|
|
582
|
+
if (!confirmed) {
|
|
583
|
+
return false;
|
|
567
584
|
}
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// Proceed with the deletion
|
|
588
|
+
messageHandling.removeBoundTransitionMessages();
|
|
589
|
+
await deleteHelper.deleteConfirmHandler(options, mParameters, messageHandler, resourceModel, appComponent, draftEnabled, bindingType);
|
|
590
|
+
return true;
|
|
591
|
+
} finally {
|
|
592
|
+
// delete document unlock
|
|
593
|
+
this.busyUnlock(appComponent);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Shows an error message when trying to delee a locked object.
|
|
599
|
+
* @param lockedContext
|
|
600
|
+
* @param resourceModel
|
|
601
|
+
* @returns A promise that resolves when the message box is closed
|
|
602
|
+
*/;
|
|
603
|
+
_proto.showDeleMessageLockedObjet = async function showDeleMessageLockedObjet(lockedContext, resourceModel) {
|
|
604
|
+
const lockingUserName = lockedContext.getObject().DraftAdministrativeData.InProcessByUser;
|
|
605
|
+
const promiseKeeper = new PromiseKeeper();
|
|
606
|
+
MessageBox.show(resourceModel.getText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", [lockingUserName]), {
|
|
607
|
+
title: resourceModel.getText("C_COMMON_DELETE"),
|
|
608
|
+
onClose: () => {
|
|
609
|
+
promiseKeeper.resolve();
|
|
571
610
|
}
|
|
572
611
|
});
|
|
612
|
+
return promiseKeeper.promise;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* Shows the dialog to confirm the object deletion.
|
|
617
|
+
* @param items
|
|
618
|
+
* @param parameters
|
|
619
|
+
* @param resourceModel
|
|
620
|
+
* @returns True if the user accepted the deletion, false otherwise
|
|
621
|
+
*/;
|
|
622
|
+
_proto.showDeleteConfirmationDialog = async function showDeleteConfirmationDialog(items, parameters, resourceModel) {
|
|
623
|
+
const promiseKeeper = new PromiseKeeper();
|
|
624
|
+
const dialog = this.createDeleteDialog(items, parameters, resourceModel, promiseKeeper);
|
|
625
|
+
dialog.addStyleClass("sapUiContentPadding");
|
|
626
|
+
dialog.open();
|
|
627
|
+
return promiseKeeper.promise;
|
|
573
628
|
}
|
|
574
629
|
|
|
575
630
|
/**
|
|
@@ -579,11 +634,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
579
634
|
* @param parameters.parentControl Parent control of the delete button if any
|
|
580
635
|
* @param parameters.entitySetName Name of the current entitySet
|
|
581
636
|
* @param resourceModel The resource model to load text resources
|
|
582
|
-
* @param
|
|
583
|
-
* @param fnReject Function executed if the dialog is closed via Cancel or Escape button
|
|
637
|
+
* @param promiseKeeper
|
|
584
638
|
* @returns The created delete confirmation dialog
|
|
585
639
|
*/;
|
|
586
|
-
_proto.createDeleteDialog = function createDeleteDialog(items, parameters, resourceModel,
|
|
640
|
+
_proto.createDeleteDialog = function createDeleteDialog(items, parameters, resourceModel, promiseKeeper) {
|
|
587
641
|
let dialogConfirmed = false;
|
|
588
642
|
const vBox = new VBox({
|
|
589
643
|
items: items
|
|
@@ -606,7 +660,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
606
660
|
press: function () {
|
|
607
661
|
dialogConfirmed = true;
|
|
608
662
|
dialog.close();
|
|
609
|
-
fnConfirm();
|
|
610
663
|
}
|
|
611
664
|
}),
|
|
612
665
|
endButton: new Button({
|
|
@@ -618,9 +671,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
618
671
|
afterClose: function () {
|
|
619
672
|
dialog.destroy();
|
|
620
673
|
// if dialog is closed unconfirmed (e.g. via "Cancel" or Escape button), ensure to reject promise
|
|
621
|
-
|
|
622
|
-
fnReject();
|
|
623
|
-
}
|
|
674
|
+
promiseKeeper.resolve(dialogConfirmed);
|
|
624
675
|
}
|
|
625
676
|
});
|
|
626
677
|
return dialog;
|
|
@@ -860,13 +911,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
860
911
|
let oResult;
|
|
861
912
|
if (contextToProcess && mParameters.contexts) {
|
|
862
913
|
const contexts = Array.isArray(mParameters.contexts) ? mParameters.contexts : [mParameters.contexts]; // Ensure that contexts is an array (for static actions it's not an we need to fix it)
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
actionPath = `${metaModel.getMetaPath(contexts[0].getPath())}/${sActionName}`,
|
|
866
|
-
boundAction = metaModel.createBindingContext(`${actionPath}/@$ui5.overload/0`);
|
|
867
|
-
const convertedTypes = convertTypes(oModel.getMetaModel());
|
|
868
|
-
const convertedAction = convertedTypes.resolvePath(boundAction.getPath()).target;
|
|
869
|
-
if (!convertedAction) {
|
|
914
|
+
const convertedAction = Operation.getOperationFromName(sActionName, oModel, contexts[0]);
|
|
915
|
+
if (!isAction(convertedAction)) {
|
|
870
916
|
throw new Error("Unknown bound action");
|
|
871
917
|
}
|
|
872
918
|
oResult = await new Operation(appComponent, oModel, convertedAction, {
|
|
@@ -907,7 +953,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
907
953
|
defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
|
|
908
954
|
}).execute();
|
|
909
955
|
} else {
|
|
910
|
-
|
|
956
|
+
const convertedActionImport = Operation.getOperationFromName(sActionName, oModel);
|
|
957
|
+
if (!convertedActionImport || isAction(convertedActionImport)) {
|
|
958
|
+
throw new Error("Unknown action import");
|
|
959
|
+
}
|
|
960
|
+
oResult = await new Operation(appComponent, oModel, convertedActionImport.action, {
|
|
911
961
|
parameterValues: mParameters.parameterValues,
|
|
912
962
|
label: mParameters.label,
|
|
913
963
|
skipParameterDialog: mParameters.skipParameterDialog,
|
|
@@ -926,7 +976,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
926
976
|
},
|
|
927
977
|
messageHandler: messageHandler,
|
|
928
978
|
view: mParameters.view
|
|
929
|
-
});
|
|
979
|
+
}).execute();
|
|
930
980
|
}
|
|
931
981
|
if (messageHandler) {
|
|
932
982
|
this._handleActionResponse(mParameters, sActionName);
|
|
@@ -1015,6 +1065,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
1015
1065
|
|
|
1016
1066
|
// Create the content of the popover
|
|
1017
1067
|
const title = new Text({
|
|
1068
|
+
id: "DraftDiscardMessage",
|
|
1018
1069
|
text: resourceModel.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_MESSAGE")
|
|
1019
1070
|
});
|
|
1020
1071
|
const confirmButton = new Button({
|
|
@@ -1026,6 +1077,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
1026
1077
|
confirmationPopover.close();
|
|
1027
1078
|
}
|
|
1028
1079
|
});
|
|
1080
|
+
confirmButton.addAriaLabelledBy(title);
|
|
1029
1081
|
confirmationPopover.addContent(new VBox({
|
|
1030
1082
|
items: [title, confirmButton]
|
|
1031
1083
|
}));
|
|
@@ -1035,6 +1087,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
1035
1087
|
confirmationPopover.setInitialFocus(confirmButton);
|
|
1036
1088
|
});
|
|
1037
1089
|
confirmationPopover.attachAfterClose(() => {
|
|
1090
|
+
confirmationPopover.destroyContent();
|
|
1038
1091
|
cancelButton.setEnabled(true);
|
|
1039
1092
|
if (confirmationPopover.data("continueDiscard")) {
|
|
1040
1093
|
resolve();
|
|
@@ -1275,4 +1328,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
1275
1328
|
const singleton = new TransactionHelper();
|
|
1276
1329
|
return singleton;
|
|
1277
1330
|
}, false);
|
|
1278
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJkZWZhdWx0RnVuY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uUmVzdWx0IiwiaXNCb3VuZCIsIm9wZXJhdGlvbnMiLCJjYWxsQm91bmRGdW5jdGlvbiIsInRvU3RyaW5nIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiaXNMaXN0QmluZGluZ0FuYWx5dGljYWwiLCJhZ2dyZWdhdGlvbiIsImNyZWF0ZUNvbnRleHQiLCJpbml0aWFsRGF0YSIsIm9wdGlvbnMiLCJkYXRhRm9yQ3JlYXRpb24iLCJsaXN0QmluZGluZ0ZvckNyZWF0aW9uIiwicGFyZW50Q29udGV4dCIsImlzRXhwYW5kZWQiLCJleHBhbmQiLCJPYmplY3QiLCJhc3NpZ24iLCJiaW5kTGlzdCIsIiQkZ3JvdXBJZCIsImdldEdyb3VwSWQiLCIkJHVwZGF0ZUdyb3VwSWQiLCJnZXRVcGRhdGVHcm91cElkIiwib2JqZWN0UGF0aCIsInBhcmVudE5hdmlnYXRpb24iLCJ0YXJnZXRFbnRpdHlUeXBlIiwiQWdncmVnYXRpb24iLCJQYXJlbnROYXZpZ2F0aW9uUHJvcGVydHkiLCJ2YWx1ZSIsIkVycm9yIiwicGFyZW50QmluZGluZ0RhdGEiLCJjcmVhdGUiLCJjcmVhdGVBdEVuZCIsImNyZWF0ZUluYWN0aXZlIiwiZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzIiwiY3JlYXRlRGF0YSIsIm1ldGFQYXRoIiwibm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiZ2V0Q3JlYXRlUG9wdXBGaWVsZHMiLCJmaWx0ZXIiLCJmaWVsZE5hbWUiLCJjcmVhdGVEb2N1bWVudCIsIm1haW5MaXN0QmluZGluZyIsImluUGFyYW1ldGVycyIsInJlc291cmNlTW9kZWwiLCJtZXNzYWdlSGFuZGxlciIsImZyb21Db3B5UGFzdGUiLCJuZXdEb2N1bWVudENvbnRleHQiLCJwYXJhbWV0ZXJzIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldEJ1c3lQYXRoIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJpbmFjdGl2ZSIsIm1lc3NhZ2VIYW5kbGluZ0tleSIsInJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMiLCJwZXJmb3JtQ3JlYXRpb24iLCJzaG93TWVzc2FnZURpYWxvZyIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwidW5Ib2xkS2V5IiwiZXJyb3IiLCJDb25zdGFudHMiLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJpc1RyYW5zaWVudCIsImRlbGV0ZSIsImJ1c3lNb2RlIiwiYnVzeUlkIiwiY3JlYXRlRG9jdW1lbnRDb250ZXh0IiwiY3JlYXRlUGFyYW1ldGVycyIsImVudHJpZXMiLCJtYXAiLCJfcmVmIiwia2V5IiwidG9FUzZQcm9taXNlIiwiY29udGV4dFBhdGgiLCJMb2ciLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsInJlZHVjZSIsInJlc3VsdCIsImN1cnJlbnRPYmplY3QiLCJjcmVhdGVQcm9taXNlIiwiQ29tbW9uVXRpbHMiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJzdWJtaXRCYXRjaCIsImNyZWF0ZUhhc2giLCJnZXRSb3V0ZXJQcm94eSIsImdldEhhc2giLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwibmV3QWN0aW9uIiwiX2dldE5ld0FjdGlvbiIsInBlcmZvcm1DcmVhdGlvbldpdGhBY3Rpb24iLCJzdGF0dXMiLCJyZWFzb24iLCJyZXR1cm5lZENvbnRleHQiLCJwZXJmb3JtQ3JlYXRpb25XaXRoUE9TVCIsImFjdGlvbk5hbWUiLCJoZWFkZXJDb250ZXh0UGF0aCIsIm1lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsInNlbGVjdGVkUHJvcGVydGllcyIsInB1c2giLCJqb2luIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJ2aWV3IiwiaXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhIiwiY2FuSGF2ZURpYWxvZyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJDcmVhdGlvbkRpYWxvZyIsImZvckVhY2giLCJpbmNsdWRlcyIsImNyZWF0ZVdpdGhEaWFsb2ciLCJ3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbiIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJtc2ciLCJtZXNzYWdlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwiY29udGV4dHNUb0RlbGV0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpcnN0Q29udGV4dCIsInNlbGVjdGVkQ29udGV4dHMiLCJyZWplY3QiLCJkcmFmdEVuYWJsZWQiLCJpdGVtcyIsInVuU2F2ZWRDb250ZXh0IiwiZW50aXR5U2V0TmFtZSIsImdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0IiwiZmluZCIsImNvbnRleHQiLCJjb250ZXh0RGF0YSIsIklzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsIkluUHJvY2Vzc0J5VXNlciIsIkRyYWZ0SXNDcmVhdGVkQnlNZSIsImxvY2tpbmdVc2VyTmFtZSIsIk1lc3NhZ2VCb3giLCJzaG93IiwiZ2V0VGV4dCIsInRpdGxlIiwib25DbG9zZSIsIm5vblRhYmxlVHh0IiwidW5TYXZlZENvbnRleHRVc2VyIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ0ZXh0Iiwic2VsZWN0ZWQiLCJURVhUIiwidG90YWxEZWxldGFibGUiLCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsInVuU2F2ZWRDb250ZXh0cyIsInVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImdldE5vbkRlbGV0YWJsZVRleHQiLCJvcHRpb25zRGVsZXRhYmxlVGV4dHMiLCJnZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMiLCJjb21tb25CaW5kaW5nIiwiZ2V0QmluZGluZyIsImJpbmRpbmdUeXBlIiwidXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyIsImZuQ29uZmlybSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJvRXJyb3IiLCJkaWFsb2ciLCJjcmVhdGVEZWxldGVEaWFsb2ciLCJub0RpYWxvZyIsInNpbGVudE1vZGUiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImZuUmVqZWN0IiwiZGlhbG9nQ29uZmlybWVkIiwidkJveCIsIlZCb3giLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJhcmlhTGFiZWxsZWRCeSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZWRpdERvY3VtZW50IiwiZ3JvdXBJZCIsInRyYW5zYWN0aW9uRGV0YWlscyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9OZXdDb250ZXh0IiwiZHJhZnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJlcnIiLCJzaG93TWVzc2FnZXMiLCJjb25jdXJyZW50RWRpdEZsYWciLCJjYW5jZWxEb2N1bWVudCIsIm1JblBhcmFtZXRlcnMiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJvTW9kZWwiLCJyZXR1cm5lZFZhbHVlIiwic2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoIiwiZHJhZnRBZG1pbkRhdGEiLCJzaWJsaW5nQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnREYXRhQ29udGV4dCIsImFsbCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwicmVxdWVzdE9iamVjdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfY29uZmlybURpc2NhcmQiLCJjYW5jZWxCdXR0b24iLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJkZWxldGVEcmFmdCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJza2lwQ29uZmlybWF0aW9uTXNnIiwiYXJndW1lbnRzIiwib0FjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsIm1lc3NhZ2VzUmVjZWl2ZWQiLCJnZXRNZXNzYWdlcyIsImNvbmNhdCIsImdldFR5cGUiLCJNZXNzYWdlVHlwZSIsIlN1Y2Nlc3MiLCJNZXNzYWdlVG9hc3QiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJjb250ZXh0VG9Qcm9jZXNzIiwic05hbWUiLCJzcGxpdCIsImNvbnRyb2xJZCIsImJ5SWQiLCJvUmVzdWx0IiwiYWN0aW9uUGF0aCIsImJvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbiIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiT3BlcmF0aW9uIiwicGFyYW1ldGVyVmFsdWVzIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwib0RhdGFQcm9wZXJ0aWVzIiwiZ2hvc3RDb250ZXh0QmluZGluZ1Byb3RlY3Rpb24iLCJlbmhhbmNlJHNlbGVjdCIsImlnbm9yZUVUYWciLCJvRGF0YUV2ZW50cyIsIm9uT0RhdGFTdWJtaXQiLCJvbk9EYXRhUmVzcG9uc2UiLCJvblJlcXVlc3RTaWRlRWZmZWN0cyIsImhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbiIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZXhlY3V0ZSIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJuYW1lIiwiYWN0aW9uSGVscGVyIiwiaXNTdGF0aWNBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwic2V0UHJvcGVydHkiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJlcnJvclRvUmVtb3ZlIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJpc1Jvb3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlcXVlc3RSZWZyZXNoIiwiZmllbGROYW1lcyIsImxpc3RNZXRhUGF0aCIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwicmVmcmVzaEludGVybmFsIiwidHJhbnNpZW50Q29udGV4dCIsImZpZWxkTWV0YUNvbnRleHRzIiwiY3JlYXRlRGlhbG9nIiwiZ2V0Q29yZVVJRmFjdG9yeSIsIm5ld0NyZWF0ZURpYWxvZyIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsIm9wZW5EaWFsb2ciLCJlIiwicmVzdWx0UHJvbWlzZUtlZXBlciIsIlByb21pc2VLZWVwZXIiLCJvbkV4aXREaWFsb2ciLCJldmVudCIsImdldFBhcmFtZXRlciIsImNsb3NlRGlhbG9nIiwic2V0QnVzeSIsImJJc0NyZWF0ZURpYWxvZyIsInRyYW5zaWVudERhdGEiLCJrZXlzIiwicHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJzdGFydHNXaXRoIiwiY3JlYXRlRGF0YUFzQXJyYXkiLCJfcmVmMiIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwibmV3Q29udGV4dCIsImNyZWF0aW9uU3VjY2VzcyIsImFmdGVyQ3JlYXRlQ2FsbEJhY2siLCJkaXNwbGF5RXJyb3JNZXNzYWdlcyIsInNob3dCb3VuZFN0YXRlTWVzc2FnZXMiLCJDcmVhdGlvbkZhaWxlZCIsImlzT3BlcmF0aW9uRGlhbG9nT3BlbiIsImlzT3BlbiIsImF0dGFjaEV4aXREaWFsb2ciLCJwcm9taXNlIiwicHJvbWlzZUtlZXBlciIsInBhcmVudExpc3RCaW5kaW5nIiwib25DcmVhdGVDb21wbGV0ZWQiLCJjcmVhdGVkQ29udGV4dCIsInN1Y2Nlc3MiLCJkZXRhY2hDcmVhdGVDb21wbGV0ZWQiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJjcmVhdGlvblN1Y2Nlc3NmdWwiLCJjcmVhdGVkIiwiY2F0Y2giLCJjb250ZXh0RXJyb3IiLCJ0cmFjZSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInNDcmVhdGVIYXNoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsInNOZXdBY3Rpb24iLCJwcmVmZXJyZWRNb2RlIiwidG9VcHBlckNhc2UiLCJzUHJlZmVycmVkTW9kZSIsImxpbmVJdGVtcyIsImxpbmVJdGVtIiwiaXNEYXRhRmllbGRGb3JBY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCIsInNpbmdsZXRvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVHJhbnNhY3Rpb25IZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24sIEFjdGlvbiBhcyBFZG1BY3Rpb24sIEVudGl0eVNldCwgTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IExpbmVJdGVtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXhpdERpYWxvZ0V2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB7IGdldENvcmVVSUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzRGF0YUZpZWxkRm9yQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZU9wdGlvbiwgRGVsZXRlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IGRlbGV0ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRDcmVhdGVQb3B1cEZpZWxkcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IHRvRVM2UHJvbWlzZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Ub0VTNlByb21pc2VcIjtcbmltcG9ydCB7IGlzTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCB0eXBlIHsgJFBvcG92ZXJTZXR0aW5ncyB9IGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFMaXN0QmluZGluZyRDcmVhdGVDb21wbGV0ZWRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCIuLi8uLi9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL29wZXJhdGlvbnMvT0RhdGFPcGVyYXRpb25cIjtcbmltcG9ydCBPcGVyYXRpb24gZnJvbSBcIi4vb3BlcmF0aW9ucy9PcGVyYXRpb25cIjtcbmltcG9ydCBhY3Rpb25IZWxwZXIgZnJvbSBcIi4vb3BlcmF0aW9ucy9hY3Rpb25IZWxwZXJcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblxuLy9FbnVtcyBmb3IgZGVsZXRlIHRleHQgY2FsY3VsYXRpb25zIGZvciBkZWxldGUgY29uZmlybSBkaWFsb2cuXG5jb25zdCBEZWxldGVPcHRpb25UeXBlcyA9IGRlbGV0ZUhlbHBlci5EZWxldGVPcHRpb25UeXBlcztcbmNvbnN0IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sID0gZGVsZXRlSGVscGVyLkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sO1xuXG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnM8VD4obVBhcmFtZXRlcnM/OiBFdmVudCB8IFQpOiBUIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIChtUGFyYW1ldGVycyBhcyBFdmVudCkuZ2V0TWV0YWRhdGEgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkuYmFzZS5FdmVudFwiKSB7XG5cdFx0bVBhcmFtZXRlcnMgPSB7fSBhcyBUO1xuXHR9XG5cdHJldHVybiAobVBhcmFtZXRlcnMgYXMgVCkgfHwgKHt9IGFzIFQpO1xufVxuXG5leHBvcnQgdHlwZSBDcmVhdGVQYXJhbWV0ZXJzID0ge1xuXHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRidXN5SWQ/OiBzdHJpbmc7XG5cdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250cm9sOiBWaWV3O1xuXHRpbmFjdGl2ZT86IGJvb2xlYW47XG5cdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdGFmdGVyQ3JlYXRlQ2FsbEJhY2s/OiAoY29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IFByb21pc2U8dm9pZD47XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU/OiBzdHJpbmc7XG5cdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2FuY2VsUGFyYW1ldGVycyA9IHsgY2FuY2VsQnV0dG9uOiBCdXR0b247IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbjsgYmVmb3JlQ2FuY2VsQ2FsbEJhY2s/OiBGdW5jdGlvbiB9O1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25EZWxldGVQYXJhbWV0ZXJzID0gRGVsZXRlUGFyYW1ldGVycyAmIHtcblx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdHRpdGxlPzogc3RyaW5nO1xuXHRub0RpYWxvZz86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgRWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlscyA9IHtcblx0ZXhpc3RpbmdEcmFmdFJldXNlZD86IGJvb2xlYW47IC8vIHRydWUgaWYgYW4gZXhpc3RpbmcgZHJhZnQgd2FzIHJldHVybmVkLCBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG5ldyBvbmVcbn07XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0YnVzeUxvY2soYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGJ1c3lQYXRoPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRidXN5VW5sb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogT0RhdGFWNENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGxldCBwYXRoOiBzdHJpbmc7XG5cdFx0aWYgKHNvdXJjZS5pc0E8T0RhdGFWNENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdHBhdGggPSBzb3VyY2UuZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoID0gKHNvdXJjZS5pc1JlbGF0aXZlKCkgPyBzb3VyY2UuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBzb3VyY2UuZ2V0UGF0aCgpKSA/PyBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBwYXRoKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0fSBlbHNlIGlmIChtZXRhTW9kZWwgJiYgTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG1ldGFNb2RlbCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyB2YWxpZGF0ZURvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtUGFyYW1ldGVyczogeyBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24/OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG5cdFx0b1ZpZXc6IFZpZXdcblx0KTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGRlZmF0dWwgdmFsdWVzIGZyb20gdGhlIERlZmF1bHRWYWx1ZSBmdW5jdGlvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdG8gYmUgdXNlZCBmb3IgY3JlYXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIChvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTxvYmplY3QgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgYXMgc3RyaW5nKTtcblx0XHRjb25zdCBsaXN0QmluZGluZ09iamVjdFBhdGggPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jT25UYXJnZXRPYmplY3QgPSAobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldE9iamVjdCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkgfCBFbnRpdHlTZXQpLmFubm90YXRpb25zLkNvbW1vblxuXHRcdFx0Py5EZWZhdWx0VmFsdWVzRnVuY3Rpb247XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmNPblRhcmdldEVudGl0eVNldCA9IChsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCB8IHVuZGVmaW5lZCk/LmFubm90YXRpb25zLkNvbW1vblxuXHRcdFx0Py5EZWZhdWx0VmFsdWVzRnVuY3Rpb247XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uTmFtZSA9IGRlZmF1bHRGdW5jT25UYXJnZXRPYmplY3QgPz8gZGVmYXVsdEZ1bmNPblRhcmdldEVudGl0eVNldDtcblxuXHRcdGlmICghZGVmYXVsdEZ1bmN0aW9uTmFtZSkge1xuXHRcdFx0Ly8gTm8gZGVmYXVsdCB2YWx1ZSBmdW5jdGlvblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBmdW5jdGlvbk9uTmF2UHJvcCA9IGlzTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpICYmIGRlZmF1bHRGdW5jT25UYXJnZXRPYmplY3QgIT09IHVuZGVmaW5lZDtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25Db250ZXh0ID0gZnVuY3Rpb25Pbk5hdlByb3AgPyBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkgOiBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0aWYgKCFkZWZhdWx0RnVuY3Rpb25Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25QYXRoID0gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGRlZmF1bHRGdW5jdGlvbkNvbnRleHQuZ2V0UGF0aCgpKX0vJHtkZWZhdWx0RnVuY3Rpb25OYW1lfWA7XG5cblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoZGVmYXVsdEZ1bmN0aW9uUGF0aCkpO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvblJlc3VsdCA9IChkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoLnRhcmdldE9iamVjdCBhcyBBY3Rpb24pPy5pc0JvdW5kXG5cdFx0XHQ/IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEJvdW5kRnVuY3Rpb24oZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBkZWZhdWx0RnVuY3Rpb25Db250ZXh0LCBtb2RlbClcblx0XHRcdDogKChhd2FpdCBvcGVyYXRpb25zLmNhbGxGdW5jdGlvbkltcG9ydChkZWZhdWx0RnVuY3Rpb25OYW1lLnRvU3RyaW5nKCksIG1vZGVsKSkgYXMgT0RhdGFWNENvbnRleHQpO1xuXG5cdFx0cmV0dXJuIGRlZmF1bHRGdW5jdGlvblJlc3VsdC5nZXRPYmplY3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBsaXN0IGJpbmRpbmcgY29ycmVzcG9uZHMgdG8gYSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBsaXN0IGJpbmRpbmcgaXMgaGllcmFyY2hpY2FsLlxuXHQgKi9cblx0aXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAobGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8uaGllcmFyY2h5UXVhbGlmaWVyID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbGlzdCBiaW5kaW5nIGlzIGFuYWx5dGljYWwuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIGxpc3QgYmluZGluZyBpcyBhbmFseXRpY2FsLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYWdncmVnYXRpb24gPSBsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgaGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uLmhpZXJhcmNoeVF1YWxpZmllcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW4gYSBsaXN0IGJpbmRpbmcuIEhhbmRsZXMgYm90aCBmbGF0IGFuZCBoaWVyYXJjaGljYWwgY2FzZXMuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gaW5pdGlhbERhdGEgSW5pdGlhbCBkYXRhIHRvIGNyZWF0ZSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wdGlvbnMgQ3JlYXRpb24gb3B0aW9ucy5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYVx0IGNoaWxkIG9mIHRoaXMgY29udGV4dCAob255IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5pdGlhbERhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCxcblx0XHRvcHRpb25zOiB7IGNyZWF0ZUF0RW5kPzogYm9vbGVhbjsgY3JlYXRlSW5hY3RpdmU/OiBib29sZWFuOyBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQgfVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgZGF0YUZvckNyZWF0aW9uID0gaW5pdGlhbERhdGEgPz8ge307XG5cblx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0bGV0IGxpc3RCaW5kaW5nRm9yQ3JlYXRpb246IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0Py5pc0V4cGFuZGVkKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCBhbHJlYWR5IGhhcyBjaGlsZHJlbiBhbmQgaXMgY29sbGFwc2VkLCB3ZSBleHBhbmQgaXQgZmlyc3Rcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcuZXhwYW5kKG9wdGlvbnMucGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHsgXCJAJHVpNS5ub2RlLnBhcmVudFwiOiBvcHRpb25zLnBhcmVudENvbnRleHQgfSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBsaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFic29sdXRlIGJpbmRpbmc6IGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnRcblx0XHRcdFx0Ly8gV2UgdXNlIGEgdGVtcG9yYXJ5IGZsYXQgbGlzdEJpbmRpbmcgZm9yIHRoZSBjcmVhdGlvbiwgdG8gYXZvaWQgYWRkaW5nIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgdGFibGUgKHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBpdCB1bnRpbCBpdCdzIHNhdmVkKVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIHRoZSBwYXJlbnQgcGF0aCBpbiB0aGUgaW5pdGlhbCBkYXRhIGlmIGEgcGFyZW50IGlzIHByb3ZpZGVkXG5cdFx0XHRcdGlmIChvcHRpb25zLnBhcmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdFx0Y29uc3QgaGllcmFyY2h5UXVhbGlmaWVyID0gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI6IHN0cmluZyB9KS5oaWVyYXJjaHlRdWFsaWZpZXI7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50TmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0XHRvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LltgUmVjdXJzaXZlSGllcmFyY2h5IyR7aGllcmFyY2h5UXVhbGlmaWVyfWBdXG5cdFx0XHRcdFx0XHRcdD8uUGFyZW50TmF2aWdhdGlvblByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHRcdGlmICghcGFyZW50TmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBwYXJlbnQgbmF2aWdhdGlvbiBwcm9wZXJ0eSBmb3IgJHtsaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEJpbmRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRcdFx0cGFyZW50QmluZGluZ0RhdGFbYCR7cGFyZW50TmF2aWdhdGlvbn1Ab2RhdGEuYmluZGBdID0gb3B0aW9ucy5wYXJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKC9eXFwvLywgXCJcIik7IC8vIFJlbW92ZSBsZWFkaW5nIFwiL1wiIGZyb20gdGhlIHBhdGhcblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKGRhdGFGb3JDcmVhdGlvbiwgcGFyZW50QmluZGluZ0RhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsaXN0QmluZGluZ0ZvckNyZWF0aW9uLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ3JlYXRpbmcgYSBuZXcgZG9jdW1lbnQgaW4gYSBhbmFseXRpY2FsIHRhYmxlIGlzIHN1cHBvcnRlZCBvbmx5IGluIGEgTGlzdFJlcG9ydFwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIHVzZSBhIHRlbXBvcmFyeSBmbGF0IGxpc3RCaW5kaW5nIGZvciB0aGUgY3JlYXRpb24sIHRvIGF2b2lkIGFkZGluZyB0aGUgbmV3IGNvbnRleHQgaW4gdGhlIHRhYmxlICh3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgaXQgdW50aWwgaXQncyBzYXZlZClcblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBsaXN0QmluZGluZ0ZvckNyZWF0aW9uLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmcuY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSwgb3B0aW9ucy5jcmVhdGVBdEVuZCwgb3B0aW9ucy5jcmVhdGVJbmFjdGl2ZSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpO1xuXG5cdFx0Y29uc3Qgbm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzID0gZ2V0Q3JlYXRlUG9wdXBGaWVsZHMobWV0YU1vZGVsLCBtZXRhUGF0aCwgYXBwQ29tcG9uZW50KTtcblx0XHQvLyBEbyBub3QgY29uc2lkZXIgZmllbGRzIGZvciB3aGljaCB3ZSBwcm92aWRlIHNvbWUgaW5pdGlhbCBkYXRhXG5cdFx0cmV0dXJuIG5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcy5maWx0ZXIoKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gIShmaWVsZE5hbWUgaW4gKGNyZWF0ZURhdGEgPz8ge30pKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5TW9kZV0gR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmUgVE9ETzogdG8gYmUgcmVmYWN0b3JlZFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5SWRdIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmluYWN0aXZlXSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXSBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRpblBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0bGV0IG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW1haW5MaXN0QmluZGluZykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG1haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgcHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNyZWF0ZSBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0Y29uc3QgYnVzeVBhdGggPSB0aGlzLmdldEJ1c3lQYXRoKHBhcmFtZXRlcnMpO1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBmcm9tQ29weVBhc3RlID8gdW5kZWZpbmVkIDogcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRpZiAoIWluUGFyYW1ldGVycz8uaW5hY3RpdmUpIHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50LCBidXN5UGF0aCk7XG5cdFx0fVxuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGVyLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHR0cnkge1xuXHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQ3JlYXRpb24oXG5cdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0ZnJvbUNvcHlQYXN0ZVxuXHRcdFx0KTtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sLCB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQhO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCwgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQgfHwgZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSAmJlxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQ/LmlzVHJhbnNpZW50KClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgdGhlICRkaXJlY3Qgb25jZSBtb2RlbCByZXNvbHZlcyB0aGlzIGlzc3VlXG5cdFx0XHRcdC8vIHRoaXMgbGluZSBzaG93cyB0aGUgZXhwZWN0ZWQgY29uc29sZSBlcnJvciBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IFJlcXVlc3QgY2FuY2VsZWQ6IFBPU1QgVHJhdmVsOyBncm91cDogc3VibWl0TGF0ZXJcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKCFpblBhcmFtZXRlcnM/LmluYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQsIGJ1c3lQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEJ1c3lQYXRoKG1QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gbVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIiA/IGAvYnVzeUxvY2FsLyR7bVBhcmFtZXRlcnMuYnVzeUlkfWAgOiBcIi9idXN5XCI7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3QuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVEb2N1bWVudENvbnRleHQobWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5kYXRhID8gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycy5kYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKSA6IFtdO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG1haW5MaXN0QmluZGluZyAmJiBtYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVyczogY3JlYXRlUGFyYW1ldGVyc1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZDtcblx0XHRcdH1cblx0XHRcdHBhcmFtZXRlcnMuZGF0YSA9IGNyZWF0ZVBhcmFtZXRlcnMucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4ucmVzdWx0LCAuLi5jdXJyZW50T2JqZWN0IH07XG5cdFx0XHR9LCB7fSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0ZVByb21pc2UgPSB0aGlzLmNyZWF0ZUNvbnRleHQobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLmRhdGEsIHtcblx0XHRcdGNyZWF0ZUF0RW5kOiAhIXBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRjcmVhdGVJbmFjdGl2ZTogISFwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdFx0fSk7XG5cdFx0aWYgKG1haW5MaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkgPT09IENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCkge1xuXHRcdFx0bWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCkuc3VibWl0QmF0Y2goQ29tbW9uVXRpbHMuSU5MSU5FRURJVF9VUERBVEVHUk9VUElEKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNyZWF0ZVByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBlaXRoZXIgdmlhIG5ldyBBY3Rpb24gb3Igc3RhbmRhcmQgUE9TVCBjcmVhdGUuXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUNyZWF0aW9uKFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cdFx0Y29uc3QgY3JlYXRlSGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRjb25zdCBjb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRjb25zdCBzdGFydHVwUGFyYW1ldGVycyA9IGNvbXBvbmVudERhdGE/LnN0YXJ0dXBQYXJhbWV0ZXJzID8/IHt9O1xuXHRcdGNvbnN0IG5ld0FjdGlvbiA9ICFtYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpXG5cdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihzdGFydHVwUGFyYW1ldGVycywgY3JlYXRlSGFzaCwgbWV0YU1vZGVsLCBtZXRhUGF0aClcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKG5ld0FjdGlvbikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQ3JlYXRpb25XaXRoQWN0aW9uKFxuXHRcdFx0XHRuZXdBY3Rpb24sXG5cdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0dGhyb3cgcmVzdWx0LnJlYXNvbjtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQudmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wZXJmb3JtQ3JlYXRpb25XaXRoUE9TVChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMsIGFwcENvbXBvbmVudCwgcmVzb3VyY2VNb2RlbCwgbWVzc2FnZUhhbmRsZXIsIGZyb21Db3B5UGFzdGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZG9jdW1lbnQgd2l0aCBhbiBhY3Rpb24uXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUNyZWF0aW9uV2l0aEFjdGlvbihcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+PiB7XG5cdFx0Y29uc3QgaGVhZGVyQ29udGV4dFBhdGggPSBtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoaGVhZGVyQ29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChtZXRhTW9kZWwsIG1ldGFQYXRoKTtcblx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyczogQmluZENvbnRleHRQYXJhbWV0ZXJzID0geyAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlLCAkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIiB9O1xuXG5cdFx0Y29uc3Qgc2VsZWN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmIChtZXNzYWdlc1BhdGgpIHtcblx0XHRcdHNlbGVjdGVkUHJvcGVydGllcy5wdXNoKG1lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobWFpbkxpc3RCaW5kaW5nKSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0c2VsZWN0ZWRQcm9wZXJ0aWVzLnB1c2goXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSGFzQWN0aXZlRW50aXR5XCIpOyAvLyBOZWVkZWQgZm9yIG91ciBpbnRlcm5hbCBsb2dpYyAoZS5nLiBuYXZpZ2F0aW9uKVxuXHRcdH1cblx0XHRpZiAoc2VsZWN0ZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IHNlbGVjdGVkUHJvcGVydGllcy5qb2luKFwiLFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0YWN0aW9uTmFtZSxcblx0XHRcdHtcblx0XHRcdFx0Y29udGV4dHM6IG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCksXG5cdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG1ldGFNb2RlbCwgbWV0YVBhdGgsIGFjdGlvbk5hbWUsIHJlc291cmNlTW9kZWwpLFxuXHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdHZpZXc6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0aXNDcmVhdGVBY3Rpb246IHRydWUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ1xuXHRcdFx0fSxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0KTtcblx0XHRyZXR1cm4gcmVzdWx0WzBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkb2N1ZW1udCB3aXRoIGEgc3RhbmRhcmQgUE9TVCByZXF1ZXN0LlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1DcmVhdGlvbldpdGhQT1NUKFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgbmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGluaXRpYWxEYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0aWYgKCFmcm9tQ29weVBhc3RlKSB7XG5cdFx0XHRcdGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21EZWZhdWx0VmFsdWVGdW5jdGlvbihtYWluTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0VmFsdWVGdW5jdGlvbkRhdGEsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1ldGVycy5kYXRhKSB7XG5cdFx0XHRcdGRlbGV0ZSBwYXJhbWV0ZXJzLmRhdGFbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuSGF2ZURpYWxvZyA9IHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRjb25zdCBjcmVhdGlvbkRpYWxvZ0ZpZWxkcyA9IGNhbkhhdmVEaWFsb2cgPyB0aGlzLmdldENyZWF0aW9uUGFyYW1ldGVycyhtYWluTGlzdEJpbmRpbmcsIGluaXRpYWxEYXRhLCBhcHBDb21wb25lbnQpIDogW107XG5cdFx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZykge1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzPy5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcblx0XHRcdFx0XHRpZiAoIWNyZWF0aW9uRGlhbG9nRmllbGRzLmluY2x1ZGVzKGZpZWxkTmFtZSkpIHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzLnB1c2goZmllbGROYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHQvLyBJbiBDcmVhdGlvbkRpYWxvZyBtb2RlLCB0aGUgZGlhbG9nIGlzIG1hbmRhdG9yeVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIGZpZWxkcyBhdmFpbGFibGUgZm9yIHRoZSBjcmVhdGlvbiBkaWFsb2dcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGNyZWF0aW9uRGlhbG9nRmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVXaXRoRGlhbG9nKFxuXHRcdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcyxcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZURvY3VtZW50Q29udGV4dChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoIXBhcmFtZXRlcnMuaW5hY3RpdmUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0RvY3VtZW50Q29udGV4dCwgcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID09PSB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Y29uc3QgbXNnID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID8/IGVycm9yO1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBtc2cpO1xuXHRcdFx0dGhyb3cgbXNnO1xuXHRcdH1cblx0fVxuXG5cdF9pc0RyYWZ0RW5hYmxlZCh2Q29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10pOiBib29sZWFuIHtcblx0XHRjb25zdCBjb250ZXh0Rm9yRHJhZnRNb2RlbCA9IHZDb250ZXh0c1swXTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0Rm9yRHJhZnRNb2RlbCk7XG5cdFx0cmV0dXJuIHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KFxuXHRcdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10sXG5cdFx0bVBhcmFtZXRlcnM6IFRyYW5zYWN0aW9uRGVsZXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBkZWxldGUgZG9jdW1lbnQgbG9ja1xuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblxuXHRcdGNvbnN0IGNvbnRleHRzVG9EZWxldGUgPSBBcnJheS5pc0FycmF5KGNvbnRleHRzKSA/IFsuLi5jb250ZXh0c10gOiBbY29udGV4dHNdO1xuXHRcdGNvbnN0IGZpcnN0Q29udGV4dCA9IChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzID8/IGNvbnRleHRzVG9EZWxldGUpWzBdO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RW5hYmxlZCA9IHRoaXMuX2lzRHJhZnRFbmFibGVkKG1QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgfHwgY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdGNvbnN0IGl0ZW1zOiBDb250cm9sW10gPSBbXTtcblx0XHRcdFx0bGV0IG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdID0gW107XG5cdFx0XHRcdGxldCB1blNhdmVkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Ly8gaXRlbXModGV4dHMpIGFuZCBvcHRpb25zKGNoZWNrQm94ZXMgYW5kIHNpbmdsZSBkZWZhdWx0IG9wdGlvbikgZm9yIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgPSB0aGlzLmdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoZmlyc3RDb250ZXh0KTtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0Ly8gbm9uLVRhYmxlXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIDEgb2YgdGhlIGRyYWZ0cyBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0RGF0YSA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IWNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkRyYWZ0SXNDcmVhdGVkQnlNZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAobG9ja2VkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNob3cgbWVzc2FnZSBib3ggd2l0aCB0aGUgbmFtZSBvZiB0aGUgbG9ja2luZyB1c2VyIGFuZCByZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBsb2NraW5nVXNlck5hbWUgPSBsb2NrZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3coXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bG9ja2luZ1VzZXJOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogcmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5TYXZlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHsgSXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB9ID0gY29udGV4dC5nZXRPYmplY3QoKSB8fCB7fTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBJc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJiBIYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJiAhIURyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhPy5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGxldCBub25UYWJsZVR4dCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRpZiAodW5TYXZlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdW5TYXZlZENvbnRleHRVc2VyID0gdW5TYXZlZENvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0W3VuU2F2ZWRDb250ZXh0VXNlcl0sXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVzY3JpcHRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGUsIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX09OTFlcIixcblx0XHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy50aXRsZV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0dGV4dDogbm9uVGFibGVUeHQsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGFibGVcblx0XHRcdFx0XHRcdGxldCB0b3RhbERlbGV0YWJsZSA9IGNvbnRleHRzVG9EZWxldGUubGVuZ3RoO1xuXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlICs9XG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmU/Lmxlbmd0aCA/PyAwKSArXG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/Lmxlbmd0aCA/PyAwKSArXG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cz8ubGVuZ3RoID8/IDApO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSxcblx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5vbkRlbGV0YWJsZVRleHQgPSBkZWxldGVIZWxwZXIuZ2V0Tm9uRGVsZXRhYmxlVGV4dChtUGFyYW1ldGVycywgdG90YWxEZWxldGFibGUsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHRcdFx0XHRpZiAobm9uRGVsZXRhYmxlVGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLnB1c2gobm9uRGVsZXRhYmxlVGV4dCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3Qgb3B0aW9uc0RlbGV0YWJsZVRleHRzID0gZGVsZXRlSGVscGVyLmdldE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvcHRpb25zID0gWy4uLm9wdGlvbnMsIC4uLm9wdGlvbnNEZWxldGFibGVUZXh0c107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgY29tbW9uQmluZGluZyA9IGZpcnN0Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgQmluZGluZztcblx0XHRcdFx0bGV0IGJpbmRpbmdUeXBlOiBcIlRyZWVcIiB8IFwiQW5hbHl0aWNhbFwiIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoY29tbW9uQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwoY29tbW9uQmluZGluZykpIHtcblx0XHRcdFx0XHRcdGJpbmRpbmdUeXBlID0gXCJUcmVlXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLmlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGNvbW1vbkJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRiaW5kaW5nVHlwZSA9IFwiQW5hbHl0aWNhbFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvbnRlbnQgb2YgRGVsZXRlIERpYWxvZ1xuXHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyhvcHRpb25zLCBpdGVtcyk7XG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZGVsZXRlSGVscGVyLmRlbGV0ZUNvbmZpcm1IYW5kbGVyKFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0ZHJhZnRFbmFibGVkLFxuXHRcdFx0XHRcdFx0XHRiaW5kaW5nVHlwZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgZGlhbG9nID0gdGhpcy5jcmVhdGVEZWxldGVEaWFsb2coaXRlbXMsIG1QYXJhbWV0ZXJzLCByZXNvdXJjZU1vZGVsLCBmbkNvbmZpcm0sIHJlamVjdCk7XG5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vRGlhbG9nID09PSB0cnVlIHx8IG1QYXJhbWV0ZXJzLnNpbGVudE1vZGUgPT09IHRydWUpIHtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0ZGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Ly8gZGVsZXRlIGRvY3VtZW50IHVubG9ja1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgZm8gdGhlIGRlbGV0aW9uLlxuXHQgKiBAcGFyYW0gaXRlbXMgQW4gYXJyYXkgb2YgY29udHJvbHMgdXNlZCBmb3IgdGhlIGRpYWxvZyBjb250ZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCBQYXJlbnQgY29udHJvbCBvZiB0aGUgZGVsZXRlIGJ1dHRvbiBpZiBhbnlcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBjdXJyZW50IGVudGl0eVNldFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZm5Db25maXJtIEZ1bmN0aW9uIGV4ZWN1dGVkIHVwb24gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRlbGV0aW9uXG5cdCAqIEBwYXJhbSBmblJlamVjdCBGdW5jdGlvbiBleGVjdXRlZCBpZiB0aGUgZGlhbG9nIGlzIGNsb3NlZCB2aWEgQ2FuY2VsIG9yIEVzY2FwZSBidXR0b25cblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgZGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICovXG5cdGNyZWF0ZURlbGV0ZURpYWxvZyhcblx0XHRpdGVtczogQ29udHJvbFtdLFxuXHRcdHBhcmFtZXRlcnM6IFBhcnRpYWw8eyBwYXJlbnRDb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkOyBlbnRpdHlTZXROYW1lOiBzdHJpbmcgfT4sXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRmbkNvbmZpcm06IEZ1bmN0aW9uLFxuXHRcdGZuUmVqZWN0OiBGdW5jdGlvblxuXHQpOiBEaWFsb2cge1xuXHRcdGxldCBkaWFsb2dDb25maXJtZWQgPSBmYWxzZTtcblx0XHRjb25zdCB2Qm94ID0gbmV3IFZCb3goeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGVDb3JlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRsZXQgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy5wYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aXRsZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIk1fQ09NTU9OX1RBQkxFX0RFTEVURVwiLCB1bmRlZmluZWQsIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRpdGxlID0gcmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGRpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IHRpdGxlLFxuXHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0Y29udGVudDogW3ZCb3hdLFxuXHRcdFx0YXJpYUxhYmVsbGVkQnk6IGl0ZW1zLFxuXHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiB0aXRsZSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0ZGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdGRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0ZGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdGlmICghZGlhbG9nQ29uZmlybWVkKSB7XG5cdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBkaWFsb2c7XG5cdH1cblxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuXHQgKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzIE9wdGlvbmFsIG9iamVjdCB0byByZXR1cm4gYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IGhvdyB0aGUgdHJhbnNhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IGRyYWZ0IGNvbnRleHQgaW4gY2FzZSBvZiBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGVkaXREb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0b1ZpZXc6IEZFVmlldyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0Z3JvdXBJZDogc3RyaW5nLFxuXHRcdHRyYW5zYWN0aW9uRGV0YWlscz86IEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHNcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0Ly8gYmVmb3JlIHRyaWdnZXJpbmcgdGhlIGVkaXQgYWN0aW9uIHdlJ2xsIGhhdmUgdG8gcmVtb3ZlIGFsbCBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gbWVzc2FnZUhhbmRsZXIucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9OZXdDb250ZXh0ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlsc1xuXHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdDogYXdhaXQgc3RpY2t5LmVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbihvQ29udGV4dCwgYXBwQ29tcG9uZW50LCBtZXNzYWdlSGFuZGxlcik7XG5cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBjb25jdXJyZW50RWRpdEZsYWc6IHRydWUsIHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FuY2VsICdlZGl0JyBtb2RlIG9mIGEgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgaW5jYXNlIG9mIGRyYWZ0IGFwcGxpY2F0aW9ucyB3aGlsZSBuYXZpZ2F0aW5nIG91dCBvZiBPUFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcGFyYW0gaXNPYmplY3RNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhlIHVzZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtSW5QYXJhbWV0ZXJzOiBDYW5jZWxQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuLFxuXHRcdGlzT2JqZWN0TW9kaWZpZWQ6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vY29udGV4dCBtdXN0IGFsd2F5cyBiZSBwYXNzZWQgLSBtYW5kYXRvcnkgcGFyYW1ldGVyXG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gY29udGV4dCBleGlzdHMuIFBhc3MgYSBtZWFuaW5nZnVsIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgcmV0dXJuZWRWYWx1ZTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgc2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoLCBkcmFmdEFkbWluRGF0YTtcblx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmICFpc09iamVjdE1vZGlmaWVkKSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRbc2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoLCBkcmFmdEFkbWluRGF0YV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRcdFx0aXNOZXdPYmplY3QgPyB1bmRlZmluZWQgOiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpLFxuXHRcdFx0XHRcdGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHRcdF0pO1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpc09iamVjdE1vZGlmaWVkID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSAhPT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3Zlcikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9jb25maXJtRGlzY2FyZChtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24sIGlzT2JqZWN0TW9kaWZpZWQsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9Db250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIGNvbnRleHQgaXMga2VwdCBhbGl2ZSB3ZSBzZXQgaXQgYWdhaW4gdG8gZGV0YWNoIHRoZSBvbkJlZm9yZURlc3Ryb3kgY2FsbGJhY2sgYW5kIGhhbmRsZSBuYXZpZ2F0aW9uIGhlcmVcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgbmVlZHMgdG8gc3RpbGwgYmUga2VwdCBhbGl2ZSB0byBiZSBhYmxlIHRvIHJlc2V0IGNoYW5nZXMgcHJvcGVybHlcblx0XHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKHRydWUsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRpZiAoaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBvTW9kZWxcblx0XHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KFxuXHRcdFx0XHRcdFx0XHRcdHNpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCA/IHNpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCA6IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKClcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KTtcblx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQpIHtcblx0XHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gZGlzY2FyZGVkQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVtb3ZlIGV4aXN0aW5nIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Ly8gc2hvdyB1bmJvdW5kIG1lc3NhZ2VzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHJldHVybiByZXR1cm5lZFZhbHVlO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBUcnVlIGlmIHdlIHNob3VsZCBleGVjdXRlIHNpZGUgZWZmZWN0cyBpbiBjYXNlIG9mIGFuIGVycm9yXG5cdCAqIEBwYXJhbSBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzIFRoZSBsaXN0QmluZGluZ3MgdG8gYmUgdXNlZCBmb3IgZXhlY3V0aW5nIHNpZGUgZWZmZWN0cyBvbiBlcnJvclxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBza2lwQ29uZmlybWF0aW9uTXNnXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBzYXZlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yOiBib29sZWFuLFxuXHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM6IE9EYXRhTGlzdEJpbmRpbmdbXSxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW4sXG5cdFx0c2tpcENvbmZpcm1hdGlvbk1zZyA9IGZhbHNlXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gdGhpcy5nZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGNvbnRleHQpO1xuXHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQoY29udGV4dCwgYXBwQ29tcG9uZW50LCB7fSwgbWVzc2FnZUhhbmRsZXIpXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyKTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXNSZWNlaXZlZCA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpOyAvLyBnZXQgdW5ib3VuZCBhbmQgYm91bmQgbWVzc2FnZXMgcHJlc2VudCBpbiB0aGUgbW9kZWxcblx0XHRcdGlmICghc2tpcENvbmZpcm1hdGlvbk1zZyAmJiAhKG1lc3NhZ2VzUmVjZWl2ZWQubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzUmVjZWl2ZWRbMF0uZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzKSkge1xuXHRcdFx0XHQvLyBzaG93IG91ciBvYmplY3QgY3JlYXRpb24gdG9hc3Qgb25seSBpZiBpdCBpcyBub3QgY29taW5nIGZyb20gYmFja2VuZFxuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRpc05ld09iamVjdFxuXHRcdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpXG5cdFx0XHRcdFx0XHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAoZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciAmJiBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMuZm9yRWFjaCgobGlzdEJpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb246IEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy52aWV3XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXBcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ncm91cElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWcgSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYWxsQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHR2aWV3OiBWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdGxldCBjb250ZXh0VG9Qcm9jZXNzO1xuXHRcdGxldCBvTW9kZWw6IE9EYXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cblx0XHRjb250ZXh0VG9Qcm9jZXNzID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgKChBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpICYmIGNvbnRleHRUb1Byb2Nlc3MubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSkpIHtcblx0XHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpID8gY29udGV4dFRvUHJvY2Vzc1swXSA6IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0XHRvTW9kZWwgPSBjb250ZXh0VG9Qcm9jZXNzLmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udHJvbCA9IChtUGFyYW1ldGVycy5jb250cm9sSWQgPyBtUGFyYW1ldGVycy52aWV3LmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSA6IG1QYXJhbWV0ZXJzLnZpZXcpIGFzXG5cdFx0XHRcdHwgQ29udHJvbFxuXHRcdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRcdGxldCBvUmVzdWx0OiBQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W107XG5cdFx0XHRpZiAoY29udGV4dFRvUHJvY2VzcyAmJiBtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0cyA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHMgOiBbbVBhcmFtZXRlcnMuY29udGV4dHNdOyAvLyBFbnN1cmUgdGhhdCBjb250ZXh0cyBpcyBhbiBhcnJheSAoZm9yIHN0YXRpYyBhY3Rpb25zIGl0J3Mgbm90IGFuIHdlIG5lZWQgdG8gZml4IGl0KVxuXG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRhY3Rpb25QYXRoID0gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHRzWzBdLmdldFBhdGgoKSl9LyR7c0FjdGlvbk5hbWV9YCxcblx0XHRcdFx0XHRib3VuZEFjdGlvbiA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHthY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZC8wYCkhO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoPEVkbUFjdGlvbiB8IHVuZGVmaW5lZD4oYm91bmRBY3Rpb24uZ2V0UGF0aCgpKS50YXJnZXQ7XG5cdFx0XHRcdGlmICghY29udmVydGVkQWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBib3VuZCBhY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG5ldyBPcGVyYXRpb24oYXBwQ29tcG9uZW50LCBvTW9kZWwsIGNvbnZlcnRlZEFjdGlvbiwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0Y29udGV4dHMsXG5cdFx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRleHRCaW5kaW5nUHJvdGVjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRcdGVuaGFuY2Ukc2VsZWN0OiB0cnVlLFxuXHRcdFx0XHRcdFx0Z3JvdXBJZDogbVBhcmFtZXRlcnMuZ3JvdXBJZCxcblx0XHRcdFx0XHRcdGlnbm9yZUVUYWc6IG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhRXZlbnRzOiB7XG5cdFx0XHRcdFx0XHRvbk9EYXRhU3VibWl0OiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyPy5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uT0RhdGFSZXNwb25zZTogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvblJlcXVlc3RTaWRlRWZmZWN0czogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbih7XG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRyb2w6IGNvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVkQWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dmlldzogbVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXcsXG5cdFx0XHRcdFx0aXNDcmVhdGVBY3Rpb246IG1QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHR9KS5leGVjdXRlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0KHNBY3Rpb25OYW1lLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0b0RhdGFFdmVudHM6IHtcblx0XHRcdFx0XHRcdG9uT0RhdGFTdWJtaXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uT0RhdGFSZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdFx0aWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdHZpZXc6IG1QYXJhbWV0ZXJzLnZpZXcgYXMgRkVWaWV3XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0dGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGNvbGxlY3Rpb24gbmFtZSBmcm9tIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgY29sbGVjdGlvbiBuYW1lXG5cdCAqL1xuXHRnZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIChNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRPYmplY3QgYXMgRW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkKVxuXHRcdFx0Py5uYW1lO1xuXHR9XG5cblx0aGFuZGxlQWN0aW9uRW5hYmxlbWVudE9uT3BlcmF0aW9uKHBhcmFtZXRlcnM6IHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0Y29udHJvbD86IENvbnRyb2w7XG5cdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uO1xuXHR9KTogdm9pZCB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgcGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdFx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdFx0aWYgKCFhY3Rpb25IZWxwZXIuaXNTdGF0aWNBY3Rpb24ocGFyYW1ldGVycy5jb252ZXJ0ZWRBY3Rpb24pKSB7XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0SlNPTi5wYXJzZShwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5jb250cm9sKSB7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5jb250cm9sLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRKU09OLnBhcnNlKHBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvL3VwZGF0ZSBkZWxldGUgYnV0dG9uXG5cdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMocGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH0sXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpOiB2b2lkIHtcblx0XHRjb25zdCBlcnJvclRvUmVtb3ZlID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChlcnJvcjogTWVzc2FnZSkgPT4gZXJyb3IudmFsaWRhdGlvbik7IC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBQb3BvdmVyLiBGYWN0b3J5IG1ldGhvZCB0byBtYWtlIHVuaXQgdGVzdHMgZWFzaWVyLlxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgSW5pdGlhbCBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3ZlclxuXHQgKiBAcmV0dXJucyBBIG5ldyBQb3BvdmVyXG5cdCAqL1xuXHRfY3JlYXRlUG9wb3ZlcihzZXR0aW5ncz86ICRQb3BvdmVyU2V0dGluZ3MpOiBQb3BvdmVyIHtcblx0XHRyZXR1cm4gbmV3IFBvcG92ZXIoc2V0dGluZ3MpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciB0byBjb25maXJtIGRpc2NhcmQgaWYgbmVlZGVkLlxuXHQgKiBAcGFyYW0gY2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gaXNNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYW5kIGEgY29uZmlybWF0aW9uIHBvcG92ZXIgbXVzdCBiZSBzaG93blxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX2NvbmZpcm1EaXNjYXJkKGNhbmNlbEJ1dHRvbjogQnV0dG9uLCBpc01vZGlmaWVkOiBib29sZWFuLCByZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gSWYgdGhlIGRhdGEgaXNuJ3QgbW9kaWZpZWQsIGRvIG5vdCBzaG93IGFueSBjb25maXJtYXRpb24gcG9wb3ZlclxuXHRcdGlmICghaXNNb2RpZmllZCkge1xuXHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cblx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IGNvbmZpcm1hdGlvblBvcG92ZXIgPSB0aGlzLl9jcmVhdGVQb3BvdmVyKHtcblx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJUb3BcIlxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcG92ZXJcblx0XHRcdGNvbnN0IHRpdGxlID0gbmV3IFRleHQoe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX01FU1NBR0VcIilcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgY29uZmlybUJ1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSxcblx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5kYXRhKFwiY29udGludWVEaXNjYXJkXCIsIHRydWUpO1xuXHRcdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZENvbnRlbnQobmV3IFZCb3goeyBpdGVtczogW3RpdGxlLCBjb25maXJtQnV0dG9uXSB9KSk7XG5cblx0XHRcdC8vIEF0dGFjaCBoYW5kbGVyXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEJlZm9yZU9wZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhjb25maXJtQnV0dG9uKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKCgpID0+IHtcblx0XHRcdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdGlmIChjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIikpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLm9wZW5CeShjYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWxvYWRzIGRhdGEgZm9yIGFuIE9EYXRhTGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdGJpbmRpbmcgdG8gcmVmcmVzaFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIHJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gV2UgdXNlIGEgc2lkZS1lZmZlY3QgcmVmcmVzaCBmb3IgYSBUcmVlVGFibGUsIHRvIHByZXNlcnZlIGV4cGFuc2lvbiBzdGF0ZXNcblx0XHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpISk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdFJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXdhaXQgYXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH1dLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHJlZnJlc2hpbmcgbGlzdCBiaW5kaW5nICR7bGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWAsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlV2l0aERpYWxvZyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRmaWVsZE5hbWVzOiBzdHJpbmdbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdGJJc0NyZWF0ZURpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0YWZ0ZXJDcmVhdGVDYWxsQmFjaz86IChuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGxpc3RNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSEpO1xuXG5cdFx0Ly8gQ3JlYXRlIGEgZmFrZSAodHJhbnNpZW50KSBsaXN0QmluZGluZyBhbmQgY29udGV4dCwganVzdCBmb3IgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgZGlhbG9nXG5cdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0fSk7XG5cdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdGNvbnN0IHRyYW5zaWVudENvbnRleHQgPSB0cmFuc2llbnRMaXN0QmluZGluZy5jcmVhdGUocGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblx0XHRjb25zdCBmaWVsZE1ldGFDb250ZXh0cyA9IGZpZWxkTmFtZXMubWFwKChuYW1lKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke2xpc3RNZXRhUGF0aH0vJHtuYW1lfWApIGFzIENvbnRleHQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjcmVhdGVEaWFsb2cgPSBnZXRDb3JlVUlGYWN0b3J5KCkubmV3Q3JlYXRlRGlhbG9nKFxuXHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdGZpZWxkTmFtZXMsXG5cdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nID8gXCJTdGFuZGFsb25lXCIgOiBcIldpdGhOYXZpZ2F0aW9uXCIsXG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0XHQpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRmaWVsZE1ldGFDb250ZXh0cyxcblx0XHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdCk7XG5cdFx0XHRjcmVhdGVEaWFsb2cub3BlbkRpYWxvZygpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHRQcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8T0RhdGFWNENvbnRleHQ+KCk7XG5cblx0XHRjb25zdCBvbkV4aXREaWFsb2cgPSBhc3luYyAoZXZlbnQ6IEV4aXREaWFsb2dFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0aWYgKCFldmVudC5nZXRQYXJhbWV0ZXIoXCJhY2NlcHRcIikpIHtcblx0XHRcdFx0Ly8gVXNlciBoYXMgY2FuY2VsbGVkIGNyZWF0aW9uOiBkZXN0cm95IHRoZSB0cmFuc2llbnQgbGlzdCBiaW5kaW5nIGFuZCBjbG9zZSB0aGUgZGlhbG9nXG5cdFx0XHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjcmVhdGVEaWFsb2cuc2V0QnVzeSh0cnVlKTtcblx0XHRcdHBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHRyYW5zaWVudERhdGEgPSB0cmFuc2llbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgY3JlYXRlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0T2JqZWN0LmtleXModHJhbnNpZW50RGF0YSkuZm9yRWFjaCgocHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtsaXN0TWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdC8vIEVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBhcyBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0Ly8gQW5kIHJlbW92ZSBhbnkgcHJvcGVydHkgc3RhcnRpbmcgYnkgQCR1aTUgYXMgdGhleSBhcmUgbm90IHByb3BlcnR5IGNyZWF0ZWQgYnkgZmlsbGluZyB0aGUgZm9ybVxuXHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmICFwcm9wZXJ0eVBhdGg/LnN0YXJ0c1dpdGgoXCJAJHVpNVwiKSkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlRGF0YVtwcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtwcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRcdFx0Y29uc3QgY3JlYXRlRGF0YUFzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjcmVhdGVEYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGNyZWF0ZURhdGFBc0FycmF5XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjcmVhdGVEYXRhID0gY3JlYXRlRGF0YUFzQXJyYXkucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7IC4uLnJlc3VsdCwgLi4uY3VycmVudE9iamVjdCB9O1xuXHRcdFx0XHRcdH0sIHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMoY3JlYXRlRGF0YSkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChsaXN0QmluZGluZywgY3JlYXRlRGF0YSwge1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0ZUluYWN0aXZlOiBwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3MgPSBhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0NvbnRleHQsIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9PT0gdHJ1ZSk7XG5cdFx0XHRcdGlmIChjcmVhdGlvblN1Y2Nlc3MpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcGFyYW1ldGVycy5hZnRlckNyZWF0ZUNhbGxCYWNrPy4obmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5kaXNwbGF5RXJyb3JNZXNzYWdlcyhNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpKTtcblx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgc2hvd0JvdW5kU3RhdGVNZXNzYWdlczogdHJ1ZSB9KTtcblxuXHRcdFx0XHRcdFx0Ly8gRGVsZXRlIHRoZSBjcmVhdGVkIGRvY3VtZW50IGFuZCByZWZyZXNoIGl0cyBsaXN0IGJpbmRpbmcgKG90aGVyd2lzZSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzdGlsbCB2aXNpYmxlIGluIHRoZSBsaXN0KVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudChuZXdDb250ZXh0LCB7IHNpbGVudE1vZGU6IHRydWUgfSwgYXBwQ29tcG9uZW50LCByZXNvdXJjZU1vZGVsLCBtZXNzYWdlSGFuZGxlcik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcvc2F2aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVzb2x2ZShuZXdDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjcmVhdGlvbiBmYWlsZWQsIGRpYWxvZyBzaG91bGQgc3RheSBvcGVuIC0gdG8gYWNoaWV2ZSB0aGUgc2FtZSwgbm90aGluZyBoYXMgdG8gYmUgZG9uZSAobGlrZSBpbiBjYXNlIG9mIHN1Y2Nlc3Mgd2l0aCBiS2VlcERpYWxvZ09wZW4pXG5cdFx0XHRcdGlmICghW0ZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQsIEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWRdLmluY2x1ZGVzKGVycm9yKSkge1xuXHRcdFx0XHRcdC8vIG90aGVyIGVycm9ycyBhcmUgbm90IGV4cGVjdGVkXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KGVycm9yIGFzIHN0cmluZyB8IEVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3koZmFsc2UpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBpc09wZXJhdGlvbkRpYWxvZ09wZW46IGNyZWF0ZURpYWxvZy5pc09wZW4oKSB9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y3JlYXRlRGlhbG9nLmF0dGFjaEV4aXREaWFsb2coe30sIG9uRXhpdERpYWxvZyk7XG5cblx0XHRyZXR1cm4gcmVzdWx0UHJvbWlzZUtlZXBlci5wcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXRzIGZvciB0aGUgY3JlYXRpb24gb2YgYSBjb250ZXh0IHRvIGJlIGZpbmlzaGVkLlxuXHQgKiBAcGFyYW0gbmV3Q29udGV4dCBUaGUgY29udGV4dCBiZWluZyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxib29sZWFuPigpO1xuXHRcdGNvbnN0IHBhcmVudExpc3RCaW5kaW5nID0gbmV3Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblxuXHRcdGNvbnN0IG9uQ3JlYXRlQ29tcGxldGVkID0gKGV2ZW50OiBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChjcmVhdGVkQ29udGV4dCA9PT0gbmV3Q29udGV4dCkge1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQob25DcmVhdGVDb21wbGV0ZWQpO1xuXHRcdFx0XHRwcm9taXNlS2VlcGVyLnJlc29sdmUoc3VjY2VzcyA9PT0gdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHBhcmVudExpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cblx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3NmdWwgPSBhd2FpdCBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdFx0aWYgKCFjcmVhdGlvblN1Y2Nlc3NmdWwpIHtcblx0XHRcdGlmICgha2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHBlbmRpbmcgUE9TVCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHQobmV3Q29udGV4dC5jcmVhdGVkKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCkpLmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhwYXJlbnRMaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIE5ld0FjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBTdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uXG5cdCAqIEBwYXJhbSBbb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVdXG5cdCAqIEBwYXJhbSBzQ3JlYXRlSGFzaCBIYXNoIHRvIGJlIGNoZWNrZWQgZm9yIGFjdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldE5ld0FjdGlvbihcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IHtcblx0XHRcdHByZWZlcnJlZE1vZGU/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdHNDcmVhdGVIYXNoOiBzdHJpbmcsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmdcblx0KTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0FjdGlvbjtcblxuXHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgc0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkktQUNUSU9OPUNSRUFURVdJVEhcIikpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkNSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmXG5cdFx0XHRzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049QVVUT0NSRUFURVdJVEhcIilcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkFVVE9DUkVBVEVXSVRIOlwiKVxuXHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cmluZyhzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCkgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEBwYXJhbSBzTmV3QWN0aW9uIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgUmVzb3VyY2VCdW5kbGUgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IENyZWF0ZSBsYWJlbFxuXHQgKiBAcmV0dXJucyBUaGUgbGFiZWwgZm9yIHRoZSBDcmVhdGUgQWN0aW9uIERpYWxvZ1xuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkXG5cdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbGluZUl0ZW1zID0gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkgYXMgTGluZUl0ZW0gfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBsYWJlbCA9IGxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGlzRGF0YUZpZWxkRm9yQWN0aW9uKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIsIDEpWzBdID09PSBzTmV3QWN0aW9uKVxuXHRcdFx0Py5MYWJlbDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRsYWJlbCB8fFxuXHRcdFx0b01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSB8fFxuXHRcdFx0cmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIilcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IHNpbmdsZXRvbiA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcigpO1xuZXhwb3J0IGRlZmF1bHQgc2luZ2xldG9uO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7RUEyREEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0MsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCOztFQUVuRDtFQUNBLE1BQU1DLGlCQUFpQixHQUFHQyxZQUFZLENBQUNELGlCQUFpQjtFQUN4RCxNQUFNRSwwQkFBMEIsR0FBR0QsWUFBWSxDQUFDQywwQkFBMEI7O0VBRTFFO0VBQ0EsU0FBU0MsYUFBYUEsQ0FBSUMsV0FBdUIsRUFBSztJQUNyRCxJQUFJQSxXQUFXLElBQUtBLFdBQVcsQ0FBV0MsV0FBVyxJQUFLRCxXQUFXLENBQVdDLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDLEtBQUssbUJBQW1CLEVBQUU7TUFDaElGLFdBQVcsR0FBRyxDQUFDLENBQU07SUFDdEI7SUFDQSxPQUFRQSxXQUFXLElBQVcsQ0FBQyxD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
|
|
1331
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInRvU3RyaW5nIiwidW5kZWZpbmVkIiwiZnVuY3Rpb25Pbk5hdlByb3AiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsImRlZmF1bHRGdW5jdGlvbkNvbnRleHQiLCJiaW5kaW5nUGF0aCIsImNvbnRleHQiLCJnZXRDb250ZXh0Iiwic3RhcnRzV2l0aCIsImluY2x1ZGVzIiwiZmlyc3ROYXYiLCJzcGxpdCIsInBhcmVudFBhdGgiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJvcGVyYXRpb24iLCJPcGVyYXRpb24iLCJnZXRPcGVyYXRpb25Gcm9tTmFtZSIsImlzQW5BY3Rpb24iLCJpc0FjdGlvbiIsInJlc3VsdCIsIk9EYXRhT3BlcmF0aW9uIiwiY29udGV4dHMiLCJlbmhhbmNlJHNlbGVjdCIsImdyb3VwSWQiLCJleGVjdXRlIiwiZmlsdGVyIiwiaXNGdWxmaWxsZWQiLCJ2YWx1ZSIsImJvdW5kQ29udGV4dCIsImdldE9iamVjdCIsImlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwiLCJnZXRBZ2dyZWdhdGlvbiIsImhpZXJhcmNoeVF1YWxpZmllciIsImlzTGlzdEJpbmRpbmdBbmFseXRpY2FsIiwiYWdncmVnYXRpb24iLCJjcmVhdGVDb250ZXh0IiwiaW5pdGlhbERhdGEiLCJvcHRpb25zIiwiZGF0YUZvckNyZWF0aW9uIiwibGlzdEJpbmRpbmdGb3JDcmVhdGlvbiIsInBhcmVudENvbnRleHQiLCJpc0V4cGFuZGVkIiwiZXhwYW5kIiwiT2JqZWN0IiwiYXNzaWduIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJnZXRHcm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm9iamVjdFBhdGgiLCJwYXJlbnROYXZpZ2F0aW9uIiwidGFyZ2V0RW50aXR5VHlwZSIsIkFnZ3JlZ2F0aW9uIiwiUGFyZW50TmF2aWdhdGlvblByb3BlcnR5IiwiRXJyb3IiLCJwYXJlbnRCaW5kaW5nRGF0YSIsImNyZWF0ZSIsImNyZWF0ZUF0RW5kIiwiY3JlYXRlSW5hY3RpdmUiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJjcmVhdGVEYXRhIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsIm5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsImdldENyZWF0ZVBvcHVwRmllbGRzIiwiZmllbGROYW1lIiwiY3JlYXRlRG9jdW1lbnQiLCJtYWluTGlzdEJpbmRpbmciLCJpblBhcmFtZXRlcnMiLCJyZXNvdXJjZU1vZGVsIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwibmV3RG9jdW1lbnRDb250ZXh0IiwicGFyYW1ldGVycyIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRCdXN5UGF0aCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiaW5hY3RpdmUiLCJtZXNzYWdlSGFuZGxpbmdLZXkiLCJyZWdpc3RlclRvSG9sZE1lc3NhZ2VzIiwicGVyZm9ybUNyZWF0aW9uIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsInVuSG9sZEtleSIsImVycm9yIiwiQ29uc3RhbnRzIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJidXN5TW9kZSIsImJ1c3lJZCIsImNyZWF0ZURvY3VtZW50Q29udGV4dCIsImNyZWF0ZVBhcmFtZXRlcnMiLCJlbnRyaWVzIiwibWFwIiwiX3JlZiIsImtleSIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiTG9nIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJyZWR1Y2UiLCJjdXJyZW50T2JqZWN0IiwiY3JlYXRlUHJvbWlzZSIsIkNvbW1vblV0aWxzIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwic3VibWl0QmF0Y2giLCJjcmVhdGVIYXNoIiwiZ2V0Um91dGVyUHJveHkiLCJnZXRIYXNoIiwiY29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJzdGFydHVwUGFyYW1ldGVycyIsIm5ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJwZXJmb3JtQ3JlYXRpb25XaXRoQWN0aW9uIiwic3RhdHVzIiwicmVhc29uIiwicmV0dXJuZWRDb250ZXh0IiwicGVyZm9ybUNyZWF0aW9uV2l0aFBPU1QiLCJhY3Rpb25OYW1lIiwiaGVhZGVyQ29udGV4dFBhdGgiLCJtZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJzZWxlY3RlZFByb3BlcnRpZXMiLCJwdXNoIiwiam9pbiIsImNhbGxBY3Rpb24iLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibGFiZWwiLCJfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbCIsInZpZXciLCJpc0NyZWF0ZUFjdGlvbiIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJkZWZhdWx0VmFsdWVGdW5jdGlvbkRhdGEiLCJjYW5IYXZlRGlhbG9nIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJJbmxpbmUiLCJjcmVhdGlvbkRpYWxvZ0ZpZWxkcyIsIkNyZWF0aW9uRGlhbG9nIiwiZm9yRWFjaCIsImNyZWF0ZVdpdGhEaWFsb2ciLCJ3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbiIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJtc2ciLCJtZXNzYWdlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwiY29udGV4dHNUb0RlbGV0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpcnN0Q29udGV4dCIsInNlbGVjdGVkQ29udGV4dHMiLCJkcmFmdEVuYWJsZWQiLCJpdGVtcyIsInVuU2F2ZWRDb250ZXh0IiwiZW50aXR5U2V0TmFtZSIsImdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJsb2NrZWRDb250ZXh0IiwiZmluZCIsImNvbnRleHREYXRhIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwic2hvd0RlbGVNZXNzYWdlTG9ja2VkT2JqZXQiLCJub25UYWJsZVR4dCIsInVuU2F2ZWRDb250ZXh0VXNlciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImRlbGV0YWJsZUNvbnRleHRzIiwidGV4dCIsInNlbGVjdGVkIiwiVEVYVCIsInRvdGFsRGVsZXRhYmxlIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJ1blNhdmVkQ29udGV4dHMiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJnZXROb25EZWxldGFibGVUZXh0Iiwib3B0aW9uc0RlbGV0YWJsZVRleHRzIiwiZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwiY29tbW9uQmluZGluZyIsImdldEJpbmRpbmciLCJiaW5kaW5nVHlwZSIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJub0RpYWxvZyIsInNpbGVudE1vZGUiLCJjb25maXJtZWQiLCJzaG93RGVsZXRlQ29uZmlybWF0aW9uRGlhbG9nIiwibWVzc2FnZUhhbmRsaW5nIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJkZWxldGVDb25maXJtSGFuZGxlciIsImxvY2tpbmdVc2VyTmFtZSIsInByb21pc2VLZWVwZXIiLCJQcm9taXNlS2VlcGVyIiwiTWVzc2FnZUJveCIsInNob3ciLCJvbkNsb3NlIiwicHJvbWlzZSIsImRpYWxvZyIsImNyZWF0ZURlbGV0ZURpYWxvZyIsImFkZFN0eWxlQ2xhc3MiLCJvcGVuIiwiZGlhbG9nQ29uZmlybWVkIiwidkJveCIsIlZCb3giLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJhcmlhTGFiZWxsZWRCeSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZWRpdERvY3VtZW50IiwidHJhbnNhY3Rpb25EZXRhaWxzIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwib05ld0NvbnRleHQiLCJkcmFmdCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXNlcnZlQ2hhbmdlcyIsInN0aWNreSIsImVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbiIsImVyciIsInNob3dNZXNzYWdlcyIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImNhbmNlbERvY3VtZW50IiwibUluUGFyYW1ldGVycyIsImlzTmV3T2JqZWN0IiwiaXNPYmplY3RNb2RpZmllZCIsIm9Nb2RlbCIsInJldHVybmVkVmFsdWUiLCJzaWJsaW5nQ29udGV4dENhbm9uaWNhbFBhdGgiLCJkcmFmdEFkbWluRGF0YSIsInNpYmxpbmdDb250ZXh0IiwiZHJhZnREYXRhQ29udGV4dCIsImFsbCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwicmVxdWVzdE9iamVjdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfY29uZmlybURpc2NhcmQiLCJjYW5jZWxCdXR0b24iLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJkZWxldGVEcmFmdCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJza2lwQ29uZmlybWF0aW9uTXNnIiwiYXJndW1lbnRzIiwib0FjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsIm1lc3NhZ2VzUmVjZWl2ZWQiLCJnZXRNZXNzYWdlcyIsImNvbmNhdCIsImdldFR5cGUiLCJNZXNzYWdlVHlwZSIsIlN1Y2Nlc3MiLCJNZXNzYWdlVG9hc3QiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJjb250ZXh0VG9Qcm9jZXNzIiwic05hbWUiLCJjb250cm9sSWQiLCJieUlkIiwib1Jlc3VsdCIsImNvbnZlcnRlZEFjdGlvbiIsInBhcmFtZXRlclZhbHVlcyIsImludm9jYXRpb25Hcm91cGluZyIsIm9EYXRhUHJvcGVydGllcyIsImdob3N0Q29udGV4dEJpbmRpbmdQcm90ZWN0aW9uIiwiaWdub3JlRVRhZyIsIm9EYXRhRXZlbnRzIiwib25PRGF0YVN1Ym1pdCIsIm9uT0RhdGFSZXNwb25zZSIsIm9uUmVxdWVzdFNpZGVFZmZlY3RzIiwiaGFuZGxlQWN0aW9uRW5hYmxlbWVudE9uT3BlcmF0aW9uIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjb252ZXJ0ZWRBY3Rpb25JbXBvcnQiLCJhY3Rpb24iLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJuYW1lIiwiYWN0aW9uSGVscGVyIiwiaXNTdGF0aWNBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwic2V0UHJvcGVydHkiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJlcnJvclRvUmVtb3ZlIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJyZWplY3QiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJpZCIsImNvbmZpcm1CdXR0b24iLCJ3aWR0aCIsImFkZEFyaWFMYWJlbGxlZEJ5IiwiYWRkQ29udGVudCIsImF0dGFjaEJlZm9yZU9wZW4iLCJzZXRJbml0aWFsRm9jdXMiLCJhdHRhY2hBZnRlckNsb3NlIiwiZGVzdHJveUNvbnRlbnQiLCJvcGVuQnkiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJpc1Jvb3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlcXVlc3RSZWZyZXNoIiwiZmllbGROYW1lcyIsImxpc3RNZXRhUGF0aCIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwicmVmcmVzaEludGVybmFsIiwidHJhbnNpZW50Q29udGV4dCIsImZpZWxkTWV0YUNvbnRleHRzIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJjcmVhdGVEaWFsb2ciLCJnZXRDb3JlVUlGYWN0b3J5IiwibmV3Q3JlYXRlRGlhbG9nIiwic2V0VXNlckRlZmF1bHRzIiwiY3JlYXRlQWN0aW9uIiwib3BlbkRpYWxvZyIsImUiLCJyZXN1bHRQcm9taXNlS2VlcGVyIiwib25FeGl0RGlhbG9nIiwiZXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJjbG9zZURpYWxvZyIsInNldEJ1c3kiLCJiSXNDcmVhdGVEaWFsb2ciLCJ0cmFuc2llbnREYXRhIiwia2V5cyIsInByb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwiY3JlYXRlRGF0YUFzQXJyYXkiLCJfcmVmMiIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwibmV3Q29udGV4dCIsImNyZWF0aW9uU3VjY2VzcyIsImFmdGVyQ3JlYXRlQ2FsbEJhY2siLCJkaXNwbGF5RXJyb3JNZXNzYWdlcyIsInNob3dCb3VuZFN0YXRlTWVzc2FnZXMiLCJDcmVhdGlvbkZhaWxlZCIsImlzT3BlcmF0aW9uRGlhbG9nT3BlbiIsImlzT3BlbiIsImF0dGFjaEV4aXREaWFsb2ciLCJwYXJlbnRMaXN0QmluZGluZyIsIm9uQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRlZENvbnRleHQiLCJzdWNjZXNzIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwiYXR0YWNoQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRpb25TdWNjZXNzZnVsIiwiY3JlYXRlZCIsImNhdGNoIiwiY29udGV4dEVycm9yIiwidHJhY2UiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzQ3JlYXRlSGFzaCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJzTmV3QWN0aW9uIiwicHJlZmVycmVkTW9kZSIsInRvVXBwZXJDYXNlIiwic1ByZWZlcnJlZE1vZGUiLCJsaW5lSXRlbXMiLCJsaW5lSXRlbSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiLCJzaW5nbGV0b24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uIGFzIEVkbUFjdGlvbiwgRW50aXR5U2V0LCBOYXZpZ2F0aW9uUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgTGluZUl0ZW0gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBFeGl0RGlhbG9nRXZlbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IHsgZ2V0Q29yZVVJRmFjdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS9VSVByb3ZpZGVyXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgaXNEYXRhRmllbGRGb3JBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlT3B0aW9uLCBEZWxldGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB7IGdldENyZWF0ZVBvcHVwRmllbGRzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTWV0YU1vZGVsRnVuY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUHJvbWlzZUtlZXBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Qcm9taXNlS2VlcGVyXCI7XG5pbXBvcnQgdG9FUzZQcm9taXNlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1RvRVM2UHJvbWlzZVwiO1xuaW1wb3J0IHsgaXNBY3Rpb24sIGlzRnVsZmlsbGVkLCBpc05hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgdHlwZSB7ICRQb3BvdmVyU2V0dGluZ3MgfSBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZEl0ZW0gZnJvbSBcInNhcC91aS9tZGMvZmllbGQvTXVsdGlWYWx1ZUZpZWxkSXRlbVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhTGlzdEJpbmRpbmckQ3JlYXRlQ29tcGxldGVkRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25SZXN1bHQgfSBmcm9tIFwiLi9vcGVyYXRpb25zL09EYXRhT3BlcmF0aW9uXCI7XG5pbXBvcnQgT0RhdGFPcGVyYXRpb24gZnJvbSBcIi4vb3BlcmF0aW9ucy9PRGF0YU9wZXJhdGlvblwiO1xuaW1wb3J0IE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb25zL09wZXJhdGlvblwiO1xuaW1wb3J0IGFjdGlvbkhlbHBlciBmcm9tIFwiLi9vcGVyYXRpb25zL2FjdGlvbkhlbHBlclwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuXG4vL0VudW1zIGZvciBkZWxldGUgdGV4dCBjYWxjdWxhdGlvbnMgZm9yIGRlbGV0ZSBjb25maXJtIGRpYWxvZy5cbmNvbnN0IERlbGV0ZU9wdGlvblR5cGVzID0gZGVsZXRlSGVscGVyLkRlbGV0ZU9wdGlvblR5cGVzO1xuY29uc3QgRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wgPSBkZWxldGVIZWxwZXIuRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2w7XG5cbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVyczxUPihtUGFyYW1ldGVycz86IEV2ZW50IHwgVCk6IFQge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSAmJiAobVBhcmFtZXRlcnMgYXMgRXZlbnQpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9IGFzIFQ7XG5cdH1cblx0cmV0dXJuIChtUGFyYW1ldGVycyBhcyBUKSB8fCAoe30gYXMgVCk7XG59XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdGJ1c3lJZD86IHN0cmluZztcblx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGluYWN0aXZlPzogYm9vbGVhbjtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YWZ0ZXJDcmVhdGVDYWxsQmFjaz86IChjb250ZXh0OiBPRGF0YVY0Q29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZT86IHN0cmluZztcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBDYW5jZWxQYXJhbWV0ZXJzID0geyBjYW5jZWxCdXR0b246IEJ1dHRvbjsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuOyBiZWZvcmVDYW5jZWxDYWxsQmFjaz86IEZ1bmN0aW9uIH07XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMgPSBEZWxldGVQYXJhbWV0ZXJzICYge1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdG5vRGlhbG9nPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHMgPSB7XG5cdGV4aXN0aW5nRHJhZnRSZXVzZWQ/OiBib29sZWFuOyAvLyB0cnVlIGlmIGFuIGV4aXN0aW5nIGRyYWZ0IHdhcyByZXR1cm5lZCwgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBuZXcgb25lXG59O1xuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdGJ1c3lMb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0YnVzeVVubG9jayhhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgYnVzeVBhdGg/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IE9EYXRhVjRDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRsZXQgcGF0aDogc3RyaW5nO1xuXHRcdGlmIChzb3VyY2UuaXNBPE9EYXRhVjRDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRwYXRoID0gc291cmNlLmdldFBhdGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGF0aCA9IChzb3VyY2UuaXNSZWxhdGl2ZSgpID8gc291cmNlLmdldFJlc29sdmVkUGF0aCgpIDogc291cmNlLmdldFBhdGgoKSkgPz8gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1ldGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgcGF0aCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdH0gZWxzZSBpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLk5vbkRyYWZ0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25dIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuXHRcdG9WaWV3OiBWaWV3XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBEZWZhdWx0VmFsdWUgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIChvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IFByb21pc2U8b2JqZWN0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpIGFzIHN0cmluZyk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdPYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgTmF2aWdhdGlvblByb3BlcnR5IHwgRW50aXR5U2V0KS5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jT25UYXJnZXRFbnRpdHlTZXQgPSAobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQpPy5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk5hbWUgPSAoZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA/PyBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0KT8udG9TdHJpbmcoKTtcblxuXHRcdGlmICghZGVmYXVsdEZ1bmN0aW9uTmFtZSkge1xuXHRcdFx0Ly8gTm8gZGVmYXVsdCB2YWx1ZSBmdW5jdGlvblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgZnVuY3Rpb25Pbk5hdlByb3AgPSBpc05hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWQ7XG5cdFx0bGV0IGRlZmF1bHRGdW5jdGlvbkNvbnRleHQ7XG5cblx0XHRpZiAoZnVuY3Rpb25Pbk5hdlByb3ApIHtcblx0XHRcdC8vIElmIHRoZSBwYXRoIGlzIGEgZGVlcCBuYXZpZ2F0aW9uLCBkZXJpdmUgdGhlIGNvcnJlY3QgcGFyZW50IGNvbnRleHRcblx0XHRcdGNvbnN0IGJpbmRpbmdQYXRoID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IGxpc3RCaW5kaW5nLmdldENvbnRleHQoKTtcblx0XHRcdGlmIChiaW5kaW5nUGF0aD8uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0ZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHR9IGVsc2UgaWYgKGJpbmRpbmdQYXRoICYmIGNvbnRleHQgJiYgYmluZGluZ1BhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdC8vIEV4dHJhY3QgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIG5hdmlnYXRpb24gcGF0aCAoZS5nLiwgX1RvSGVhZGVyL19Ub0l0ZW1zIOKGkiBfVG9IZWFkZXIpXG5cdFx0XHRcdGNvbnN0IGZpcnN0TmF2ID0gYmluZGluZ1BhdGguc3BsaXQoXCIvXCIpWzBdO1xuXG5cdFx0XHRcdC8vIEJ1aWxkIHRoZSBmdWxsIHBhdGggdG8gdGhlIGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcblx0XHRcdFx0Y29uc3QgcGFyZW50UGF0aCA9IGAke2NvbnRleHQuZ2V0UGF0aCgpfS8ke2ZpcnN0TmF2fWA7XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IGJpbmRpbmcgY29udGV4dCBmb3IgdGhpcyBwYXRoXG5cdFx0XHRcdGRlZmF1bHRGdW5jdGlvbkNvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXJlbnRQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHRoZSBjdXJyZW50IGNvbnRleHQgaWYgbm8gbmF2aWdhdGlvbiBmb3VuZFxuXHRcdFx0XHRkZWZhdWx0RnVuY3Rpb25Db250ZXh0ID0gY29udGV4dDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSwgdXNlIHRoZSBoZWFkZXIgY29udGV4dCAocm9vdCBvYmplY3QgcGFnZSBjb250ZXh0KVxuXHRcdFx0ZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCA9IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHR9XG5cdFx0Ly9jb25zdCBkZWZhdWx0RnVuY3Rpb25Db250ZXh0ID0gZnVuY3Rpb25Pbk5hdlByb3AgPyBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkgOiBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0aWYgKCFkZWZhdWx0RnVuY3Rpb25Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9wZXJhdGlvbiA9XG5cdFx0XHRPcGVyYXRpb24uZ2V0T3BlcmF0aW9uRnJvbU5hbWUoZGVmYXVsdEZ1bmN0aW9uTmFtZSwgbW9kZWwsIGRlZmF1bHRGdW5jdGlvbkNvbnRleHQpID8/XG5cdFx0XHRPcGVyYXRpb24uZ2V0T3BlcmF0aW9uRnJvbU5hbWUoZGVmYXVsdEZ1bmN0aW9uTmFtZSwgbW9kZWwpO1xuXHRcdGlmICghb3BlcmF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzQW5BY3Rpb24gPSBpc0FjdGlvbihvcGVyYXRpb24pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBPRGF0YU9wZXJhdGlvbihcblx0XHRcdG9wZXJhdGlvbixcblx0XHRcdHtcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRtb2RlbCxcblx0XHRcdFx0Y29udGV4dHM6IGlzQW5BY3Rpb24gPyBbZGVmYXVsdEZ1bmN0aW9uQ29udGV4dF0gOiBbXVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZW5oYW5jZSRzZWxlY3Q6IGZhbHNlLFxuXHRcdFx0XHRncm91cElkOiBpc0FuQWN0aW9uID8gXCJmdW5jdGlvbkdyb3VwXCIgOiBcImZ1bmN0aW9uSW1wb3J0XCJcblx0XHRcdH1cblx0XHQpLmV4ZWN1dGUoKTtcblx0XHRyZXR1cm4gcmVzdWx0LmZpbHRlcihpc0Z1bGZpbGxlZClbMF0/LnZhbHVlLmJvdW5kQ29udGV4dC5nZXRPYmplY3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBsaXN0IGJpbmRpbmcgY29ycmVzcG9uZHMgdG8gYSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBsaXN0IGJpbmRpbmcgaXMgaGllcmFyY2hpY2FsLlxuXHQgKi9cblx0aXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAobGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8uaGllcmFyY2h5UXVhbGlmaWVyID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbGlzdCBiaW5kaW5nIGlzIGFuYWx5dGljYWwuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIGxpc3QgYmluZGluZyBpcyBhbmFseXRpY2FsLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYWdncmVnYXRpb24gPSBsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgaGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uLmhpZXJhcmNoeVF1YWxpZmllcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW4gYSBsaXN0IGJpbmRpbmcuIEhhbmRsZXMgYm90aCBmbGF0IGFuZCBoaWVyYXJjaGljYWwgY2FzZXMuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gaW5pdGlhbERhdGEgSW5pdGlhbCBkYXRhIHRvIGNyZWF0ZSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wdGlvbnMgQ3JlYXRpb24gb3B0aW9ucy5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYVx0IGNoaWxkIG9mIHRoaXMgY29udGV4dCAob255IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5pdGlhbERhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCxcblx0XHRvcHRpb25zOiB7IGNyZWF0ZUF0RW5kPzogYm9vbGVhbjsgY3JlYXRlSW5hY3RpdmU/OiBib29sZWFuOyBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQgfVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgZGF0YUZvckNyZWF0aW9uID0gaW5pdGlhbERhdGEgPz8ge307XG5cblx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0bGV0IGxpc3RCaW5kaW5nRm9yQ3JlYXRpb246IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0Py5pc0V4cGFuZGVkKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCBhbHJlYWR5IGhhcyBjaGlsZHJlbiBhbmQgaXMgY29sbGFwc2VkLCB3ZSBleHBhbmQgaXQgZmlyc3Rcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcuZXhwYW5kKG9wdGlvbnMucGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHsgXCJAJHVpNS5ub2RlLnBhcmVudFwiOiBvcHRpb25zLnBhcmVudENvbnRleHQgfSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBsaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFic29sdXRlIGJpbmRpbmc6IGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnRcblx0XHRcdFx0Ly8gV2UgdXNlIGEgdGVtcG9yYXJ5IGZsYXQgbGlzdEJpbmRpbmcgZm9yIHRoZSBjcmVhdGlvbiwgdG8gYXZvaWQgYWRkaW5nIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgdGFibGUgKHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBpdCB1bnRpbCBpdCdzIHNhdmVkKVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIHRoZSBwYXJlbnQgcGF0aCBpbiB0aGUgaW5pdGlhbCBkYXRhIGlmIGEgcGFyZW50IGlzIHByb3ZpZGVkXG5cdFx0XHRcdGlmIChvcHRpb25zLnBhcmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdFx0Y29uc3QgaGllcmFyY2h5UXVhbGlmaWVyID0gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI6IHN0cmluZyB9KS5oaWVyYXJjaHlRdWFsaWZpZXI7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50TmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0XHRvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LltgUmVjdXJzaXZlSGllcmFyY2h5IyR7aGllcmFyY2h5UXVhbGlmaWVyfWBdXG5cdFx0XHRcdFx0XHRcdD8uUGFyZW50TmF2aWdhdGlvblByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHRcdGlmICghcGFyZW50TmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBwYXJlbnQgbmF2aWdhdGlvbiBwcm9wZXJ0eSBmb3IgJHtsaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEJpbmRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRcdFx0cGFyZW50QmluZGluZ0RhdGFbYCR7cGFyZW50TmF2aWdhdGlvbn1Ab2RhdGEuYmluZGBdID0gb3B0aW9ucy5wYXJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKC9eXFwvLywgXCJcIik7IC8vIFJlbW92ZSBsZWFkaW5nIFwiL1wiIGZyb20gdGhlIHBhdGhcblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKGRhdGFGb3JDcmVhdGlvbiwgcGFyZW50QmluZGluZ0RhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsaXN0QmluZGluZ0ZvckNyZWF0aW9uLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ3JlYXRpbmcgYSBuZXcgZG9jdW1lbnQgaW4gYSBhbmFseXRpY2FsIHRhYmxlIGlzIHN1cHBvcnRlZCBvbmx5IGluIGEgTGlzdFJlcG9ydFwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIHVzZSBhIHRlbXBvcmFyeSBmbGF0IGxpc3RCaW5kaW5nIGZvciB0aGUgY3JlYXRpb24sIHRvIGF2b2lkIGFkZGluZyB0aGUgbmV3IGNvbnRleHQgaW4gdGhlIHRhYmxlICh3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgaXQgdW50aWwgaXQncyBzYXZlZClcblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBsaXN0QmluZGluZ0ZvckNyZWF0aW9uLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmcuY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSwgb3B0aW9ucy5jcmVhdGVBdEVuZCwgb3B0aW9ucy5jcmVhdGVJbmFjdGl2ZSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpO1xuXG5cdFx0Y29uc3Qgbm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzID0gZ2V0Q3JlYXRlUG9wdXBGaWVsZHMobWV0YU1vZGVsLCBtZXRhUGF0aCwgYXBwQ29tcG9uZW50KTtcblx0XHQvLyBEbyBub3QgY29uc2lkZXIgZmllbGRzIGZvciB3aGljaCB3ZSBwcm92aWRlIHNvbWUgaW5pdGlhbCBkYXRhXG5cdFx0cmV0dXJuIG5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcy5maWx0ZXIoKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gIShmaWVsZE5hbWUgaW4gKGNyZWF0ZURhdGEgPz8ge30pKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5TW9kZV0gR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmUgVE9ETzogdG8gYmUgcmVmYWN0b3JlZFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5SWRdIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmluYWN0aXZlXSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXSBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRpblBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0bGV0IG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW1haW5MaXN0QmluZGluZykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG1haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgcHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNyZWF0ZSBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0Y29uc3QgYnVzeVBhdGggPSB0aGlzLmdldEJ1c3lQYXRoKHBhcmFtZXRlcnMpO1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBmcm9tQ29weVBhc3RlID8gdW5kZWZpbmVkIDogcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRpZiAoIWluUGFyYW1ldGVycz8uaW5hY3RpdmUpIHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50LCBidXN5UGF0aCk7XG5cdFx0fVxuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGVyLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHR0cnkge1xuXHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQ3JlYXRpb24oXG5cdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0ZnJvbUNvcHlQYXN0ZVxuXHRcdFx0KTtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sLCB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQhO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCwgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQgfHwgZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSAmJlxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQ/LmlzVHJhbnNpZW50KClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgdGhlICRkaXJlY3Qgb25jZSBtb2RlbCByZXNvbHZlcyB0aGlzIGlzc3VlXG5cdFx0XHRcdC8vIHRoaXMgbGluZSBzaG93cyB0aGUgZXhwZWN0ZWQgY29uc29sZSBlcnJvciBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IFJlcXVlc3QgY2FuY2VsZWQ6IFBPU1QgVHJhdmVsOyBncm91cDogc3VibWl0TGF0ZXJcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKCFpblBhcmFtZXRlcnM/LmluYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQsIGJ1c3lQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEJ1c3lQYXRoKG1QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gbVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIiA/IGAvYnVzeUxvY2FsLyR7bVBhcmFtZXRlcnMuYnVzeUlkfWAgOiBcIi9idXN5XCI7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3QuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVEb2N1bWVudENvbnRleHQobWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5kYXRhID8gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycy5kYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKSA6IFtdO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG1haW5MaXN0QmluZGluZyAmJiBtYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVyczogY3JlYXRlUGFyYW1ldGVyc1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZDtcblx0XHRcdH1cblx0XHRcdHBhcmFtZXRlcnMuZGF0YSA9IGNyZWF0ZVBhcmFtZXRlcnMucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4ucmVzdWx0LCAuLi5jdXJyZW50T2JqZWN0IH07XG5cdFx0XHR9LCB7fSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0ZVByb21pc2UgPSB0aGlzLmNyZWF0ZUNvbnRleHQobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLmRhdGEsIHtcblx0XHRcdGNyZWF0ZUF0RW5kOiAhIXBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRjcmVhdGVJbmFjdGl2ZTogISFwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdFx0fSk7XG5cdFx0aWYgKG1haW5MaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkgPT09IENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCkge1xuXHRcdFx0bWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCkuc3VibWl0QmF0Y2goQ29tbW9uVXRpbHMuSU5MSU5FRURJVF9VUERBVEVHUk9VUElEKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNyZWF0ZVByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBlaXRoZXIgdmlhIG5ldyBBY3Rpb24gb3Igc3RhbmRhcmQgUE9TVCBjcmVhdGUuXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUNyZWF0aW9uKFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cdFx0Y29uc3QgY3JlYXRlSGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRjb25zdCBjb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHRjb25zdCBzdGFydHVwUGFyYW1ldGVycyA9IGNvbXBvbmVudERhdGE/LnN0YXJ0dXBQYXJhbWV0ZXJzID8/IHt9O1xuXHRcdGNvbnN0IG5ld0FjdGlvbiA9ICFtYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpXG5cdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihzdGFydHVwUGFyYW1ldGVycywgY3JlYXRlSGFzaCwgbWV0YU1vZGVsLCBtZXRhUGF0aClcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKG5ld0FjdGlvbikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQ3JlYXRpb25XaXRoQWN0aW9uKFxuXHRcdFx0XHRuZXdBY3Rpb24sXG5cdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0dGhyb3cgcmVzdWx0LnJlYXNvbjtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQudmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wZXJmb3JtQ3JlYXRpb25XaXRoUE9TVChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMsIGFwcENvbXBvbmVudCwgcmVzb3VyY2VNb2RlbCwgbWVzc2FnZUhhbmRsZXIsIGZyb21Db3B5UGFzdGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZG9jdW1lbnQgd2l0aCBhbiBhY3Rpb24uXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUNyZWF0aW9uV2l0aEFjdGlvbihcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+PiB7XG5cdFx0Y29uc3QgaGVhZGVyQ29udGV4dFBhdGggPSBtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoaGVhZGVyQ29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChtZXRhTW9kZWwsIG1ldGFQYXRoKTtcblx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyczogQmluZENvbnRleHRQYXJhbWV0ZXJzID0geyAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlLCAkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIiB9O1xuXG5cdFx0Y29uc3Qgc2VsZWN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmIChtZXNzYWdlc1BhdGgpIHtcblx0XHRcdHNlbGVjdGVkUHJvcGVydGllcy5wdXNoKG1lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobWFpbkxpc3RCaW5kaW5nKSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0c2VsZWN0ZWRQcm9wZXJ0aWVzLnB1c2goXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSGFzQWN0aXZlRW50aXR5XCIpOyAvLyBOZWVkZWQgZm9yIG91ciBpbnRlcm5hbCBsb2dpYyAoZS5nLiBuYXZpZ2F0aW9uKVxuXHRcdH1cblx0XHRpZiAoc2VsZWN0ZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IHNlbGVjdGVkUHJvcGVydGllcy5qb2luKFwiLFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0YWN0aW9uTmFtZSxcblx0XHRcdHtcblx0XHRcdFx0Y29udGV4dHM6IG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCksXG5cdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG1ldGFNb2RlbCwgbWV0YVBhdGgsIGFjdGlvbk5hbWUsIHJlc291cmNlTW9kZWwpLFxuXHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdHZpZXc6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0aXNDcmVhdGVBY3Rpb246IHRydWUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ1xuXHRcdFx0fSxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0KTtcblx0XHRyZXR1cm4gcmVzdWx0WzBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkb2N1ZW1udCB3aXRoIGEgc3RhbmRhcmQgUE9TVCByZXF1ZXN0LlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1DcmVhdGlvbldpdGhQT1NUKFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgbmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGluaXRpYWxEYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0aWYgKCFmcm9tQ29weVBhc3RlKSB7XG5cdFx0XHRcdGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21EZWZhdWx0VmFsdWVGdW5jdGlvbihtYWluTGlzdEJpbmRpbmcsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdHBhcmFtZXRlcnMuZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSwgcGFyYW1ldGVycy5kYXRhKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0ZGVsZXRlIHBhcmFtZXRlcnMuZGF0YVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5IYXZlRGlhbG9nID0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdGNvbnN0IGNyZWF0aW9uRGlhbG9nRmllbGRzID0gY2FuSGF2ZURpYWxvZyA/IHRoaXMuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKG1haW5MaXN0QmluZGluZywgaW5pdGlhbERhdGEsIGFwcENvbXBvbmVudCkgOiBbXTtcblx0XHRcdGlmIChwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHM/LmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGlmICghY3JlYXRpb25EaWFsb2dGaWVsZHMuaW5jbHVkZXMoZmllbGROYW1lKSkge1xuXHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHMucHVzaChmaWVsZE5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGNyZWF0aW9uRGlhbG9nRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIEluIENyZWF0aW9uRGlhbG9nIG1vZGUsIHRoZSBkaWFsb2cgaXMgbWFuZGF0b3J5XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gZmllbGRzIGF2YWlsYWJsZSBmb3IgdGhlIGNyZWF0aW9uIGRpYWxvZ1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY3JlYXRpb25EaWFsb2dGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVdpdGhEaWFsb2coXG5cdFx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzLFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlRG9jdW1lbnRDb250ZXh0KG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmICghcGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMud2FpdEZvckNyZWF0ZUNvbXBsZXRpb24obmV3RG9jdW1lbnRDb250ZXh0LCBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPT09IHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRjb25zdCBtc2cgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPz8gZXJyb3I7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIG1zZyk7XG5cdFx0XHR0aHJvdyBtc2c7XG5cdFx0fVxuXHR9XG5cblx0X2lzRHJhZnRFbmFibGVkKHZDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHRGb3JEcmFmdE1vZGVsID0gdkNvbnRleHRzWzBdO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHRGb3JEcmFmdE1vZGVsKTtcblx0XHRyZXR1cm4gc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlIG9uZSBvciBtdWx0aXBsZSBkb2N1bWVudChzKS5cblx0ICogQHBhcmFtIGNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIE51bWJlciBvZiBvYmplY3RzIHNlbGVjdGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ub0RpYWxvZyBUbyBkaXNhYmxlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmVkIHRvIHRydWUgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkLCBvciB0byBmYWxzZSBpZiB0aGUgZGVsZXRpb24gd2FzIGNhbmNlbGVkIGJ5IHRoZSB1c2VyLlxuXHQgKi9cblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSxcblx0XHRtUGFyYW1ldGVyczogVHJhbnNhY3Rpb25EZWxldGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIGRlbGV0ZSBkb2N1bWVudCBsb2NrXG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXG5cdFx0Y29uc3QgY29udGV4dHNUb0RlbGV0ZSA9IEFycmF5LmlzQXJyYXkoY29udGV4dHMpID8gWy4uLmNvbnRleHRzXSA6IFtjb250ZXh0c107XG5cdFx0Y29uc3QgZmlyc3RDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgPz8gY29udGV4dHNUb0RlbGV0ZSlbMF07XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZHJhZnRFbmFibGVkID0gdGhpcy5faXNEcmFmdEVuYWJsZWQobVBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyB8fCBjb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdGNvbnN0IGl0ZW1zOiBDb250cm9sW10gPSBbXTtcblx0XHRcdGxldCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSA9IFtdO1xuXHRcdFx0bGV0IHVuU2F2ZWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdFx0Ly8gaXRlbXModGV4dHMpIGFuZCBvcHRpb25zKGNoZWNrQm94ZXMgYW5kIHNpbmdsZSBkZWZhdWx0IG9wdGlvbikgZm9yIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgPSB0aGlzLmdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoZmlyc3RDb250ZXh0KTtcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0XHQvLyBub24tVGFibGVcblx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHQvLyBDaGVjayBpZiAxIG9mIHRoZSBkcmFmdHMgaXMgbG9ja2VkIGJ5IGFub3RoZXIgdXNlclxuXHRcdFx0XHRcdFx0Y29uc3QgbG9ja2VkQ29udGV4dCA9IGNvbnRleHRzVG9EZWxldGUuZmluZCgoY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0RGF0YSA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhICYmXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyICYmXG5cdFx0XHRcdFx0XHRcdFx0IWNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkRyYWZ0SXNDcmVhdGVkQnlNZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAobG9ja2VkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHQvLyBTaG93IG1lc3NhZ2UgYm94IHdpdGggdGhlIG5hbWUgb2YgdGhlIGxvY2tpbmcgdXNlciBhbmQgcmV0dXJuXG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuc2hvd0RlbGVNZXNzYWdlTG9ja2VkT2JqZXQobG9ja2VkQ29udGV4dCwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTsgLy8gTm8gZGVsZXRpb24gaGFwcGVuZWRcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHVuU2F2ZWRDb250ZXh0ID0gY29udGV4dHNUb0RlbGV0ZS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgeyBJc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIH0gPSBjb250ZXh0LmdldE9iamVjdCgpIHx8IHt9O1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBJc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJiBIYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJiAhIURyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhPy5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsZXQgbm9uVGFibGVUeHQgPSBcIlwiO1xuXHRcdFx0XHRcdGlmICh1blNhdmVkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdW5TYXZlZENvbnRleHRVc2VyID0gdW5TYXZlZENvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0W3VuU2F2ZWRDb250ZXh0VXNlcl0sXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLnRpdGxlLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl0sXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX09OTFlcIixcblx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGVdLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0XHRcdGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0dGV4dDogbm9uVGFibGVUeHQsXG5cdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUYWJsZVxuXHRcdFx0XHRcdGxldCB0b3RhbERlbGV0YWJsZSA9IGNvbnRleHRzVG9EZWxldGUubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUgKz1cblx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmU/Lmxlbmd0aCA/PyAwKSArXG5cdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzPy5sZW5ndGggPz8gMCk7XG5cdFx0XHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0aXRlbXMsXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnNcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IG5vbkRlbGV0YWJsZVRleHQgPSBkZWxldGVIZWxwZXIuZ2V0Tm9uRGVsZXRhYmxlVGV4dChtUGFyYW1ldGVycywgdG90YWxEZWxldGFibGUsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHRcdFx0aWYgKG5vbkRlbGV0YWJsZVRleHQpIHtcblx0XHRcdFx0XHRcdFx0aXRlbXMucHVzaChub25EZWxldGFibGVUZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBvcHRpb25zRGVsZXRhYmxlVGV4dHMgPSBkZWxldGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKG1QYXJhbWV0ZXJzLCBjb250ZXh0c1RvRGVsZXRlLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0XHRvcHRpb25zID0gWy4uLm9wdGlvbnMsIC4uLm9wdGlvbnNEZWxldGFibGVUZXh0c107XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29tbW9uQmluZGluZyA9IGZpcnN0Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgQmluZGluZztcblx0XHRcdGxldCBiaW5kaW5nVHlwZTogXCJUcmVlXCIgfCBcIkFuYWx5dGljYWxcIiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChjb21tb25CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwoY29tbW9uQmluZGluZykpIHtcblx0XHRcdFx0XHRiaW5kaW5nVHlwZSA9IFwiVHJlZVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXNMaXN0QmluZGluZ0FuYWx5dGljYWwoY29tbW9uQmluZGluZykpIHtcblx0XHRcdFx0XHRiaW5kaW5nVHlwZSA9IFwiQW5hbHl0aWNhbFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbmZpcm0gdGhlIGRlbGV0aW9uIGlmIG5lZWRlZFxuXHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2cob3B0aW9ucywgaXRlbXMpO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vRGlhbG9nICE9PSB0cnVlICYmIG1QYXJhbWV0ZXJzLnNpbGVudE1vZGUgIT09IHRydWUpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5zaG93RGVsZXRlQ29uZmlybWF0aW9uRGlhbG9nKGl0ZW1zLCBtUGFyYW1ldGVycywgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdGlmICghY29uZmlybWVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFByb2NlZWQgd2l0aCB0aGUgZGVsZXRpb25cblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0YXdhaXQgZGVsZXRlSGVscGVyLmRlbGV0ZUNvbmZpcm1IYW5kbGVyKFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0ZHJhZnRFbmFibGVkLFxuXHRcdFx0XHRiaW5kaW5nVHlwZVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdC8vIGRlbGV0ZSBkb2N1bWVudCB1bmxvY2tcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93cyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIGRlbGVlIGEgbG9ja2VkIG9iamVjdC5cblx0ICogQHBhcmFtIGxvY2tlZENvbnRleHRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWVzc2FnZSBib3ggaXMgY2xvc2VkXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHNob3dEZWxlTWVzc2FnZUxvY2tlZE9iamV0KGxvY2tlZENvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCByZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbG9ja2luZ1VzZXJOYW1lID0gbG9ja2VkQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0Y29uc3QgcHJvbWlzZUtlZXBlciA9IG5ldyBQcm9taXNlS2VlcGVyPHZvaWQ+KCk7XG5cdFx0TWVzc2FnZUJveC5zaG93KHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX09CSkVDVF9MT0NLRURcIiwgW2xvY2tpbmdVc2VyTmFtZV0pLCB7XG5cdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpLFxuXHRcdFx0b25DbG9zZTogKCkgPT4ge1xuXHRcdFx0XHRwcm9taXNlS2VlcGVyLnJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogU2hvd3MgdGhlIGRpYWxvZyB0byBjb25maXJtIHRoZSBvYmplY3QgZGVsZXRpb24uXG5cdCAqIEBwYXJhbSBpdGVtc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB1c2VyIGFjY2VwdGVkIHRoZSBkZWxldGlvbiwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHNob3dEZWxldGVDb25maXJtYXRpb25EaWFsb2coXG5cdFx0aXRlbXM6IENvbnRyb2xbXSxcblx0XHRwYXJhbWV0ZXJzOiBQYXJ0aWFsPHsgcGFyZW50Q29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDsgZW50aXR5U2V0TmFtZTogc3RyaW5nIH0+LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWxcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgcHJvbWlzZUtlZXBlciA9IG5ldyBQcm9taXNlS2VlcGVyPGJvb2xlYW4+KCk7XG5cdFx0Y29uc3QgZGlhbG9nID0gdGhpcy5jcmVhdGVEZWxldGVEaWFsb2coaXRlbXMsIHBhcmFtZXRlcnMsIHJlc291cmNlTW9kZWwsIHByb21pc2VLZWVwZXIpO1xuXHRcdGRpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRkaWFsb2cub3BlbigpO1xuXHRcdHJldHVybiBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZvIHRoZSBkZWxldGlvbi5cblx0ICogQHBhcmFtIGl0ZW1zIEFuIGFycmF5IG9mIGNvbnRyb2xzIHVzZWQgZm9yIHRoZSBkaWFsb2cgY29udGVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgUGFyZW50IGNvbnRyb2wgb2YgdGhlIGRlbGV0ZSBidXR0b24gaWYgYW55XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgY3VycmVudCBlbnRpdHlTZXRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIHByb21pc2VLZWVwZXJcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgZGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICovXG5cdGNyZWF0ZURlbGV0ZURpYWxvZyhcblx0XHRpdGVtczogQ29udHJvbFtdLFxuXHRcdHBhcmFtZXRlcnM6IFBhcnRpYWw8eyBwYXJlbnRDb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkOyBlbnRpdHlTZXROYW1lOiBzdHJpbmcgfT4sXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRwcm9taXNlS2VlcGVyOiBQcm9taXNlS2VlcGVyPGJvb2xlYW4+XG5cdCk6IERpYWxvZyB7XG5cdFx0bGV0IGRpYWxvZ0NvbmZpcm1lZCA9IGZhbHNlO1xuXHRcdGNvbnN0IHZCb3ggPSBuZXcgVkJveCh7IGl0ZW1zOiBpdGVtcyB9KTtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZUNvcmUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdGxldCB0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w/LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRpdGxlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiTV9DT01NT05fVEFCTEVfREVMRVRFXCIsIHVuZGVmaW5lZCwgcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGl0bGUgPSByZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKTtcblx0XHR9XG5cdFx0Y29uc3QgZGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHR0aXRsZTogdGl0bGUsXG5cdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRjb250ZW50OiBbdkJveF0sXG5cdFx0XHRhcmlhTGFiZWxsZWRCeTogaXRlbXMsXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHRpdGxlLFxuXHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRkaWFsb2dDb25maXJtZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxcIiksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRkaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0cHJvbWlzZUtlZXBlci5yZXNvbHZlKGRpYWxvZ0NvbmZpcm1lZCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRpYWxvZztcblx0fVxuXG5cdC8qKlxuXHQgKiBFZGl0cyBhIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBvVmlldyBDdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc2FjdGlvbkRldGFpbHMgT3B0aW9uYWwgb2JqZWN0IHRvIHJldHVybiBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgaG93IHRoZSB0cmFuc2FjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgZWRpdERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRvVmlldzogRkVWaWV3LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRncm91cElkOiBzdHJpbmcsXG5cdFx0dHJhbnNhY3Rpb25EZXRhaWxzPzogRWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlsc1xuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdFx0fVxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxlci5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb05ld0NvbnRleHQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdG9WaWV3OiBvVmlld1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRncm91cElkLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzXG5cdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uKG9Db250ZXh0LCBhcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyKTtcblxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdHJldHVybiBvTmV3Q29udGV4dDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IGNvbmN1cnJlbnRFZGl0RmxhZzogdHJ1ZSwgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYW5jZWwgJ2VkaXQnIG1vZGUgb2YgYSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGNhbmNlbGVkIG9yIGRlbGV0ZWRcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gQ2FuY2VsIEJ1dHRvbiBvZiB0aGUgZGlzY2FyZCBwb3BvdmVyIChtYW5kYXRvcnkgZm9yIG5vdylcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBpbmNhc2Ugb2YgZHJhZnQgYXBwbGljYXRpb25zIHdoaWxlIG5hdmlnYXRpbmcgb3V0IG9mIE9QXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBpc09iamVjdE1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgdXNlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG1JblBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW4sXG5cdFx0aXNPYmplY3RNb2RpZmllZDogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2FuY2VsIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCByZXR1cm5lZFZhbHVlOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdGxldCBzaWJsaW5nQ29udGV4dENhbm9uaWNhbFBhdGgsIGRyYWZ0QWRtaW5EYXRhO1xuXHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIWlzT2JqZWN0TW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFtzaWJsaW5nQ29udGV4dENhbm9uaWNhbFBhdGgsIGRyYWZ0QWRtaW5EYXRhXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdFx0XHRpc05ld09iamVjdCA/IHVuZGVmaW5lZCA6IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCksXG5cdFx0XHRcdFx0ZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0XSk7XG5cdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdGlzT2JqZWN0TW9kaWZpZWQgPSBkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lICE9PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2NvbmZpcm1EaXNjYXJkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiwgaXNPYmplY3RNb2RpZmllZCwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgY29udGV4dCBpcyBrZXB0IGFsaXZlIHdlIHNldCBpdCBhZ2FpbiB0byBkZXRhY2ggdGhlIG9uQmVmb3JlRGVzdHJveSBjYWxsYmFjayBhbmQgaGFuZGxlIG5hdmlnYXRpb24gaGVyZVxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBuZWVkcyB0byBzdGlsbCBiZSBrZXB0IGFsaXZlIHRvIGJlIGFibGUgdG8gcmVzZXQgY2hhbmdlcyBwcm9wZXJseVxuXHRcdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUodHJ1ZSwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdGlmIChpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IG9Nb2RlbFxuXHRcdFx0XHRcdFx0XHQuYmluZENvbnRleHQoXG5cdFx0XHRcdFx0XHRcdFx0c2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoID8gc2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoIDogYXdhaXQgc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIG1lc3NhZ2VIYW5kbGVyLCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIWlzTmV3T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBkaXNjYXJkZWRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1vdmUgZXhpc3RpbmcgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0cmV0dXJuIHJldHVybmVkVmFsdWU7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgc2F2ZWRcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIFRydWUgaWYgd2Ugc2hvdWxkIGV4ZWN1dGUgc2lkZSBlZmZlY3RzIGluIGNhc2Ugb2YgYW4gZXJyb3Jcblx0ICogQHBhcmFtIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMgVGhlIGxpc3RCaW5kaW5ncyB0byBiZSB1c2VkIGZvciBleGVjdXRpbmcgc2lkZSBlZmZlY3RzIG9uIGVycm9yXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIHNraXBDb25maXJtYXRpb25Nc2dcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIHNhdmVEb2N1bWVudChcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGJvb2xlYW4sXG5cdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0czogT0RhdGFMaXN0QmluZGluZ1tdLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhbixcblx0XHRza2lwQ29uZmlybWF0aW9uTXNnID0gZmFsc2Vcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlNhdmUgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSB0aGlzLmdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIHt9LCBtZXNzYWdlSGFuZGxlcilcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIpO1xuXG5cdFx0XHRjb25zdCBtZXNzYWdlc1JlY2VpdmVkID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCkuY29uY2F0KG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7IC8vIGdldCB1bmJvdW5kIGFuZCBib3VuZCBtZXNzYWdlcyBwcmVzZW50IGluIHRoZSBtb2RlbFxuXHRcdFx0aWYgKCFza2lwQ29uZmlybWF0aW9uTXNnICYmICEobWVzc2FnZXNSZWNlaXZlZC5sZW5ndGggPT09IDEgJiYgbWVzc2FnZXNSZWNlaXZlZFswXS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MpKSB7XG5cdFx0XHRcdC8vIHNob3cgb3VyIG9iamVjdCBjcmVhdGlvbiB0b2FzdCBvbmx5IGlmIGl0IGlzIG5vdCBjb21pbmcgZnJvbSBiYWNrZW5kXG5cdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRcdGlzTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9DUkVBVEVEXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yICYmIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0cy5mb3JFYWNoKChsaXN0QmluZGluZykgPT4ge1xuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBjb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnNcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2dcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnZpZXdcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaXNDcmVhdGVBY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmdyb3VwSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaWdub3JlRVRhZyBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbGxBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHZpZXc6IFZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0XHR9LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0bGV0IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblxuXHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBzTmFtZSA/IHVuZGVmaW5lZCA6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdC8vY2hlY2tpbmcgd2hldGhlciB0aGUgY29udGV4dCBpcyBhbiBhcnJheSB3aXRoIG1vcmUgdGhhbiAwIGxlbmd0aCBvciBub3QgYW4gYXJyYXkoY3JlYXRlIGFjdGlvbilcblx0XHRpZiAoY29udGV4dFRvUHJvY2VzcyAmJiAoKEFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykgJiYgY29udGV4dFRvUHJvY2Vzcy5sZW5ndGgpIHx8ICFBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpKSkge1xuXHRcdFx0Y29udGV4dFRvUHJvY2VzcyA9IEFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykgPyBjb250ZXh0VG9Qcm9jZXNzWzBdIDogY29udGV4dFRvUHJvY2Vzcztcblx0XHRcdG9Nb2RlbCA9IGNvbnRleHRUb1Byb2Nlc3MuZ2V0TW9kZWwoKTtcblx0XHR9XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRvTW9kZWwgPSBtUGFyYW1ldGVycy5tb2RlbDtcblx0XHR9XG5cdFx0aWYgKCFvTW9kZWwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlBhc3MgYSBjb250ZXh0IGZvciBhIGJvdW5kIGFjdGlvbiBvciBwYXNzIHRoZSBtb2RlbCBmb3IgYW4gdW5ib3VuZCBhY3Rpb25cIik7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250cm9sID0gKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCA/IG1QYXJhbWV0ZXJzLnZpZXcuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIDogbVBhcmFtZXRlcnMudmlldykgYXNcblx0XHRcdFx0fCBDb250cm9sXG5cdFx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdFx0bGV0IG9SZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXTtcblx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRzID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgPyBtUGFyYW1ldGVycy5jb250ZXh0cyA6IFttUGFyYW1ldGVycy5jb250ZXh0c107IC8vIEVuc3VyZSB0aGF0IGNvbnRleHRzIGlzIGFuIGFycmF5IChmb3Igc3RhdGljIGFjdGlvbnMgaXQncyBub3QgYW4gd2UgbmVlZCB0byBmaXggaXQpXG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IE9wZXJhdGlvbi5nZXRPcGVyYXRpb25Gcm9tTmFtZShzQWN0aW9uTmFtZSwgb01vZGVsLCBjb250ZXh0c1swXSk7XG5cdFx0XHRcdGlmICghaXNBY3Rpb24oY29udmVydGVkQWN0aW9uKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYm91bmQgYWN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCBuZXcgT3BlcmF0aW9uKGFwcENvbXBvbmVudCwgb01vZGVsLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM6IG1QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdLFxuXHRcdFx0XHRcdGNvbnRleHRzLFxuXHRcdFx0XHRcdGludm9jYXRpb25Hcm91cGluZzogbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nLFxuXHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdFx0Z2hvc3RDb250ZXh0QmluZGluZ1Byb3RlY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0XHRlbmhhbmNlJHNlbGVjdDogdHJ1ZSxcblx0XHRcdFx0XHRcdGdyb3VwSWQ6IG1QYXJhbWV0ZXJzLmdyb3VwSWQsXG5cdFx0XHRcdFx0XHRpZ25vcmVFVGFnOiBtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUV2ZW50czoge1xuXHRcdFx0XHRcdFx0b25PRGF0YVN1Ym1pdDogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcj8ucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvbk9EYXRhUmVzcG9uc2U6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25SZXF1ZXN0U2lkZUVmZmVjdHM6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVBY3Rpb25FbmFibGVtZW50T25PcGVyYXRpb24oe1xuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRcdFx0XHRjb250cm9sOiBjb250cm9sLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvblxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHZpZXc6IG1QYXJhbWV0ZXJzLnZpZXcgYXMgRkVWaWV3LFxuXHRcdFx0XHRcdGlzQ3JlYXRlQWN0aW9uOiBtUGFyYW1ldGVycy5pc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0fSkuZXhlY3V0ZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY29udmVydGVkQWN0aW9uSW1wb3J0ID0gT3BlcmF0aW9uLmdldE9wZXJhdGlvbkZyb21OYW1lKHNBY3Rpb25OYW1lLCBvTW9kZWwpO1xuXHRcdFx0XHRpZiAoIWNvbnZlcnRlZEFjdGlvbkltcG9ydCB8fCBpc0FjdGlvbihjb252ZXJ0ZWRBY3Rpb25JbXBvcnQpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBhY3Rpb24gaW1wb3J0XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCBuZXcgT3BlcmF0aW9uKGFwcENvbXBvbmVudCwgb01vZGVsLCBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQuYWN0aW9uLCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXSxcblx0XHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRvRGF0YUV2ZW50czoge1xuXHRcdFx0XHRcdFx0b25PRGF0YVN1Ym1pdDogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25PRGF0YVJlc3BvbnNlOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRpZ25vcmVFVGFnOiBtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0dmlldzogbVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXdcblx0XHRcdFx0fSkuZXhlY3V0ZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0dGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGNvbGxlY3Rpb24gbmFtZSBmcm9tIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgY29sbGVjdGlvbiBuYW1lXG5cdCAqL1xuXHRnZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIChNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRPYmplY3QgYXMgRW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkKVxuXHRcdFx0Py5uYW1lO1xuXHR9XG5cblx0aGFuZGxlQWN0aW9uRW5hYmxlbWVudE9uT3BlcmF0aW9uKHBhcmFtZXRlcnM6IHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0Y29udHJvbD86IENvbnRyb2w7XG5cdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uO1xuXHR9KTogdm9pZCB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgcGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdFx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdFx0aWYgKCFhY3Rpb25IZWxwZXIuaXNTdGF0aWNBY3Rpb24ocGFyYW1ldGVycy5jb252ZXJ0ZWRBY3Rpb24pKSB7XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0SlNPTi5wYXJzZShwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5jb250cm9sKSB7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5jb250cm9sLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRKU09OLnBhcnNlKHBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvL3VwZGF0ZSBkZWxldGUgYnV0dG9uXG5cdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMocGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH0sXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpOiB2b2lkIHtcblx0XHRjb25zdCBlcnJvclRvUmVtb3ZlID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChlcnJvcjogTWVzc2FnZSkgPT4gZXJyb3IudmFsaWRhdGlvbik7IC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBQb3BvdmVyLiBGYWN0b3J5IG1ldGhvZCB0byBtYWtlIHVuaXQgdGVzdHMgZWFzaWVyLlxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgSW5pdGlhbCBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3ZlclxuXHQgKiBAcmV0dXJucyBBIG5ldyBQb3BvdmVyXG5cdCAqL1xuXHRfY3JlYXRlUG9wb3ZlcihzZXR0aW5ncz86ICRQb3BvdmVyU2V0dGluZ3MpOiBQb3BvdmVyIHtcblx0XHRyZXR1cm4gbmV3IFBvcG92ZXIoc2V0dGluZ3MpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciB0byBjb25maXJtIGRpc2NhcmQgaWYgbmVlZGVkLlxuXHQgKiBAcGFyYW0gY2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gaXNNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYW5kIGEgY29uZmlybWF0aW9uIHBvcG92ZXIgbXVzdCBiZSBzaG93blxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX2NvbmZpcm1EaXNjYXJkKGNhbmNlbEJ1dHRvbjogQnV0dG9uLCBpc01vZGlmaWVkOiBib29sZWFuLCByZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gSWYgdGhlIGRhdGEgaXNuJ3QgbW9kaWZpZWQsIGRvIG5vdCBzaG93IGFueSBjb25maXJtYXRpb24gcG9wb3ZlclxuXHRcdGlmICghaXNNb2RpZmllZCkge1xuXHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cblx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IGNvbmZpcm1hdGlvblBvcG92ZXIgPSB0aGlzLl9jcmVhdGVQb3BvdmVyKHtcblx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJUb3BcIlxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcG92ZXJcblx0XHRcdGNvbnN0IHRpdGxlID0gbmV3IFRleHQoe1xuXHRcdFx0XHRpZDogXCJEcmFmdERpc2NhcmRNZXNzYWdlXCIsXG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiKVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjb25maXJtQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpLFxuXHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1CdXR0b24uYWRkQXJpYUxhYmVsbGVkQnkodGl0bGUpO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hZGRDb250ZW50KG5ldyBWQm94KHsgaXRlbXM6IFt0aXRsZSwgY29uZmlybUJ1dHRvbl0gfSkpO1xuXG5cdFx0XHQvLyBBdHRhY2ggaGFuZGxlclxuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hdHRhY2hCZWZvcmVPcGVuKCgpID0+IHtcblx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMoY29uZmlybUJ1dHRvbik7XG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYXR0YWNoQWZ0ZXJDbG9zZSgoKSA9PiB7XG5cdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuZGVzdHJveUNvbnRlbnQoKTtcblx0XHRcdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdGlmIChjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIikpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLm9wZW5CeShjYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWxvYWRzIGRhdGEgZm9yIGFuIE9EYXRhTGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdGJpbmRpbmcgdG8gcmVmcmVzaFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIHJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gV2UgdXNlIGEgc2lkZS1lZmZlY3QgcmVmcmVzaCBmb3IgYSBUcmVlVGFibGUsIHRvIHByZXNlcnZlIGV4cGFuc2lvbiBzdGF0ZXNcblx0XHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpISk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdFJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXdhaXQgYXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH1dLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHJlZnJlc2hpbmcgbGlzdCBiaW5kaW5nICR7bGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWAsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlV2l0aERpYWxvZyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRmaWVsZE5hbWVzOiBzdHJpbmdbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdGJJc0NyZWF0ZURpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0YWZ0ZXJDcmVhdGVDYWxsQmFjaz86IChuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGxpc3RNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSEpO1xuXG5cdFx0Ly8gQ3JlYXRlIGEgZmFrZSAodHJhbnNpZW50KSBsaXN0QmluZGluZyBhbmQgY29udGV4dCwganVzdCBmb3IgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgZGlhbG9nXG5cdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0fSk7XG5cdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdGNvbnN0IHRyYW5zaWVudENvbnRleHQgPSB0cmFuc2llbnRMaXN0QmluZGluZy5jcmVhdGUocGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblx0XHRjb25zdCBmaWVsZE1ldGFDb250ZXh0cyA9IGZpZWxkTmFtZXMubWFwKChuYW1lKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke2xpc3RNZXRhUGF0aH0vJHtuYW1lfWApIGFzIENvbnRleHQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjcmVhdGVEaWFsb2cgPSBnZXRDb3JlVUlGYWN0b3J5KCkubmV3Q3JlYXRlRGlhbG9nKFxuXHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdGZpZWxkTmFtZXMsXG5cdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nID8gXCJTdGFuZGFsb25lXCIgOiBcIldpdGhOYXZpZ2F0aW9uXCIsXG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0XHQpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRmaWVsZE1ldGFDb250ZXh0cyxcblx0XHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdCk7XG5cdFx0XHRjcmVhdGVEaWFsb2cub3BlbkRpYWxvZygpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHRQcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8T0RhdGFWNENvbnRleHQ+KCk7XG5cblx0XHRjb25zdCBvbkV4aXREaWFsb2cgPSBhc3luYyAoZXZlbnQ6IEV4aXREaWFsb2dFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0aWYgKCFldmVudC5nZXRQYXJhbWV0ZXIoXCJhY2NlcHRcIikpIHtcblx0XHRcdFx0Ly8gVXNlciBoYXMgY2FuY2VsbGVkIGNyZWF0aW9uOiBkZXN0cm95IHRoZSB0cmFuc2llbnQgbGlzdCBiaW5kaW5nIGFuZCBjbG9zZSB0aGUgZGlhbG9nXG5cdFx0XHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjcmVhdGVEaWFsb2cuc2V0QnVzeSh0cnVlKTtcblx0XHRcdHBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHRyYW5zaWVudERhdGEgPSB0cmFuc2llbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgY3JlYXRlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0T2JqZWN0LmtleXModHJhbnNpZW50RGF0YSkuZm9yRWFjaCgocHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtsaXN0TWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdC8vIEVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBhcyBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0Ly8gQW5kIHJlbW92ZSBhbnkgcHJvcGVydHkgc3RhcnRpbmcgYnkgQCR1aTUgYXMgdGhleSBhcmUgbm90IHByb3BlcnR5IGNyZWF0ZWQgYnkgZmlsbGluZyB0aGUgZm9ybVxuXHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmICFwcm9wZXJ0eVBhdGg/LnN0YXJ0c1dpdGgoXCJAJHVpNVwiKSkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlRGF0YVtwcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtwcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRcdFx0Y29uc3QgY3JlYXRlRGF0YUFzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjcmVhdGVEYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGNyZWF0ZURhdGFBc0FycmF5XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjcmVhdGVEYXRhID0gY3JlYXRlRGF0YUFzQXJyYXkucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7IC4uLnJlc3VsdCwgLi4uY3VycmVudE9iamVjdCB9O1xuXHRcdFx0XHRcdH0sIHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMoY3JlYXRlRGF0YSkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChsaXN0QmluZGluZywgY3JlYXRlRGF0YSwge1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0ZUluYWN0aXZlOiBwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3MgPSBhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0NvbnRleHQsIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9PT0gdHJ1ZSk7XG5cdFx0XHRcdGlmIChjcmVhdGlvblN1Y2Nlc3MpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcGFyYW1ldGVycy5hZnRlckNyZWF0ZUNhbGxCYWNrPy4obmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5kaXNwbGF5RXJyb3JNZXNzYWdlcyhNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpKTtcblx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgc2hvd0JvdW5kU3RhdGVNZXNzYWdlczogdHJ1ZSB9KTtcblxuXHRcdFx0XHRcdFx0Ly8gRGVsZXRlIHRoZSBjcmVhdGVkIGRvY3VtZW50IGFuZCByZWZyZXNoIGl0cyBsaXN0IGJpbmRpbmcgKG90aGVyd2lzZSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzdGlsbCB2aXNpYmxlIGluIHRoZSBsaXN0KVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudChuZXdDb250ZXh0LCB7IHNpbGVudE1vZGU6IHRydWUgfSwgYXBwQ29tcG9uZW50LCByZXNvdXJjZU1vZGVsLCBtZXNzYWdlSGFuZGxlcik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcvc2F2aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVzb2x2ZShuZXdDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjcmVhdGlvbiBmYWlsZWQsIGRpYWxvZyBzaG91bGQgc3RheSBvcGVuIC0gdG8gYWNoaWV2ZSB0aGUgc2FtZSwgbm90aGluZyBoYXMgdG8gYmUgZG9uZSAobGlrZSBpbiBjYXNlIG9mIHN1Y2Nlc3Mgd2l0aCBiS2VlcERpYWxvZ09wZW4pXG5cdFx0XHRcdGlmICghW0ZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQsIEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWRdLmluY2x1ZGVzKGVycm9yKSkge1xuXHRcdFx0XHRcdC8vIG90aGVyIGVycm9ycyBhcmUgbm90IGV4cGVjdGVkXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KGVycm9yIGFzIHN0cmluZyB8IEVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3koZmFsc2UpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBpc09wZXJhdGlvbkRpYWxvZ09wZW46IGNyZWF0ZURpYWxvZy5pc09wZW4oKSB9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y3JlYXRlRGlhbG9nLmF0dGFjaEV4aXREaWFsb2coe30sIG9uRXhpdERpYWxvZyk7XG5cblx0XHRyZXR1cm4gcmVzdWx0UHJvbWlzZUtlZXBlci5wcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXRzIGZvciB0aGUgY3JlYXRpb24gb2YgYSBjb250ZXh0IHRvIGJlIGZpbmlzaGVkLlxuXHQgKiBAcGFyYW0gbmV3Q29udGV4dCBUaGUgY29udGV4dCBiZWluZyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxib29sZWFuPigpO1xuXHRcdGNvbnN0IHBhcmVudExpc3RCaW5kaW5nID0gbmV3Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblxuXHRcdGNvbnN0IG9uQ3JlYXRlQ29tcGxldGVkID0gKGV2ZW50OiBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChjcmVhdGVkQ29udGV4dCA9PT0gbmV3Q29udGV4dCkge1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQob25DcmVhdGVDb21wbGV0ZWQpO1xuXHRcdFx0XHRwcm9taXNlS2VlcGVyLnJlc29sdmUoc3VjY2VzcyA9PT0gdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHBhcmVudExpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cblx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3NmdWwgPSBhd2FpdCBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdFx0aWYgKCFjcmVhdGlvblN1Y2Nlc3NmdWwpIHtcblx0XHRcdGlmICgha2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHBlbmRpbmcgUE9TVCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHQobmV3Q29udGV4dC5jcmVhdGVkKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCkpLmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhwYXJlbnRMaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIE5ld0FjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBTdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uXG5cdCAqIEBwYXJhbSBbb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVdXG5cdCAqIEBwYXJhbSBzQ3JlYXRlSGFzaCBIYXNoIHRvIGJlIGNoZWNrZWQgZm9yIGFjdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldE5ld0FjdGlvbihcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IHtcblx0XHRcdHByZWZlcnJlZE1vZGU/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdHNDcmVhdGVIYXNoOiBzdHJpbmcsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmdcblx0KTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0FjdGlvbjtcblxuXHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgc0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkktQUNUSU9OPUNSRUFURVdJVEhcIikpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkNSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmXG5cdFx0XHRzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049QVVUT0NSRUFURVdJVEhcIilcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkFVVE9DUkVBVEVXSVRIOlwiKVxuXHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cmluZyhzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCkgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEBwYXJhbSBzTmV3QWN0aW9uIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgUmVzb3VyY2VCdW5kbGUgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IENyZWF0ZSBsYWJlbFxuXHQgKiBAcmV0dXJucyBUaGUgbGFiZWwgZm9yIHRoZSBDcmVhdGUgQWN0aW9uIERpYWxvZ1xuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkXG5cdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbGluZUl0ZW1zID0gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkgYXMgTGluZUl0ZW0gfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBsYWJlbCA9IGxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGlzRGF0YUZpZWxkRm9yQWN0aW9uKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIsIDEpWzBdID09PSBzTmV3QWN0aW9uKVxuXHRcdFx0Py5MYWJlbDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRsYWJlbCB8fFxuXHRcdFx0b01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSB8fFxuXHRcdFx0cmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIilcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IHNpbmdsZXRvbiA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcigpO1xuZXhwb3J0IGRlZmF1bHQgc2luZ2xldG9uO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0VBMERBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0VBQzNDLE1BQU1FLGdCQUFnQixHQUFHRCxTQUFTLENBQUNDLGdCQUFnQjs7RUFFbkQ7RUFDQSxNQUFNQyxpQkFBaUIsR0FBR0MsWUFBWSxDQUFDRCxpQkFBaUI7RUFDeEQsTUFBTUUsMEJBQTBCLEdBQUdELFlBQVksQ0FBQ0MsMEJBQTBCOztFQUUxRTtFQUNBLFNBQVNDLGFBQWFBLENBQUlDLFdBQXVCLEVBQUs7SUFDckQsSUFBSUEsV0FBVyxJQUFLQSxXQUFXLENBQVdDLFdBQVcsSUFBS0QsV0FBVyxDQUFXQyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxLQUFLLG1CQUFtQixFQUFFO01BQ2hJRixXQUFXLEdBQUcsQ0FBQyxDQUFNO0lBQ3RCO0lBQ0EsT0FBUUEsV0FBVyxJQUFXLENBQUMsQ0FBTztFQUN2QztFQUFDLElBNkJLRyxpQkFBaUI7SUFBQSxTQUFBQSxrQkFBQTtJQUFBLElBQUFDLE1BQUEsR0FBQUQsaUJBQUEsQ0FBQUUsU0FBQTtJQUFBRCxNQUFBLENBQ3RCRSxRQUFRLEdBQVIsU0FBQUEsUUFBUUEsQ0FBQ0MsWUFBMEIsRUFBRUMsUUFBaUIsRUFBUTtNQUM3REMsVUFBVSxDQUFD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
|