@sapui5/sap.fe.test 1.120.4 → 1.121.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/test/.library +1 -1
- package/src/sap/fe/test/CollaborationClient.js +1 -1
- package/src/sap/fe/test/FeMocks.js +1 -1
- package/src/sap/fe/test/Flexibility.js +19 -0
- package/src/sap/fe/test/JestFlexibilityHelper.js +1 -1
- package/src/sap/fe/test/JestTemplatingHelper.js +33 -14
- package/src/sap/fe/test/JestTemplatingHelper.ts +42 -15
- package/src/sap/fe/test/ListReport.js +5 -3
- package/src/sap/fe/test/ObjectPage.js +5 -4
- package/src/sap/fe/test/TemplatingTestUtils.js +7 -3
- package/src/sap/fe/test/UI5MockHelper.js +16 -5
- package/src/sap/fe/test/UI5MockHelper.ts +22 -6
- package/src/sap/fe/test/Utils.js +4 -0
- package/src/sap/fe/test/api/ChartAssertions.js +3 -2
- package/src/sap/fe/test/api/CollaborationAPI.js +9 -5
- package/src/sap/fe/test/api/CollaborationAPI.ts +7 -6
- package/src/sap/fe/test/api/DialogMassEditAssertions.js +3 -3
- package/src/sap/fe/test/api/TableAPI.js +4 -2
- package/src/sap/fe/test/api/TableActions.js +4 -2
- package/src/sap/fe/test/api/TableAssertions.js +4 -2
- package/src/sap/fe/test/builder/FEBuilder.js +2 -2
- package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +2 -2
- package/src/sap/fe/test/builder/MdcTableBuilder.js +9 -8
- package/src/sap/fe/test/internal/ConsoleErrorChecker.js +1 -1
- package/src/sap/fe/test/internal/FEArrangements.js +3 -2
- package/src/sap/fe/test/library.js +5 -5
- package/src/sap/fe/test/library.ts +2 -2
|
@@ -9,11 +9,12 @@ import LoaderExtensions from "sap/base/util/LoaderExtensions";
|
|
|
9
9
|
import merge from "sap/base/util/merge";
|
|
10
10
|
import AppComponent from "sap/fe/core/AppComponent";
|
|
11
11
|
import TemplateModel from "sap/fe/core/TemplateModel";
|
|
12
|
-
import { parseXMLString } from "sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor";
|
|
12
|
+
import { parseXMLString } from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor";
|
|
13
13
|
import ConverterContext from "sap/fe/core/converters/ConverterContext";
|
|
14
14
|
import type { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
|
|
15
15
|
import type { IDiagnostics } from "sap/fe/core/converters/TemplateConverter";
|
|
16
16
|
import type { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
|
|
17
|
+
import jsx from "sap/fe/core/jsx-runtime/jsx";
|
|
17
18
|
import type { SideEffectsService } from "sap/fe/core/services/SideEffectsServiceFactory";
|
|
18
19
|
import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
|
|
19
20
|
import type { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
|
|
@@ -64,13 +65,13 @@ type JestTemplatedView = {
|
|
|
64
65
|
Log.setLevel(1 as any, "sap.ui.core.util.XMLPreprocessor");
|
|
65
66
|
jest.setTimeout(40000);
|
|
66
67
|
|
|
67
|
-
const nameSpaceMap = {
|
|
68
|
-
macros: "sap.fe.macros",
|
|
68
|
+
const nameSpaceMap: Record<string, string> = {
|
|
69
69
|
macro: "sap.fe.macros",
|
|
70
|
+
macros: "sap.fe.macros",
|
|
71
|
+
feBB: "sap.fe.core.buildingBlocks.templating",
|
|
70
72
|
macroField: "sap.fe.macros.field",
|
|
71
73
|
macrodata: "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
|
|
72
74
|
log: "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
|
|
73
|
-
unittest: "http://schemas.sap.com/sapui5/preprocessorextension/sap.fe.unittesting/1",
|
|
74
75
|
control: "sap.fe.core.controls",
|
|
75
76
|
controls: "sap.fe.macros.controls",
|
|
76
77
|
core: "sap.ui.core",
|
|
@@ -88,6 +89,10 @@ const nameSpaceMap = {
|
|
|
88
89
|
microChart: "sap.suite.ui.microchart",
|
|
89
90
|
macroTable: "sap.fe.macros.table"
|
|
90
91
|
};
|
|
92
|
+
const reveseNamespaceMap = Object.keys(nameSpaceMap).reduce((reverseMap: Record<string, string>, currentName) => {
|
|
93
|
+
reverseMap[nameSpaceMap[currentName]] = currentName;
|
|
94
|
+
return reverseMap;
|
|
95
|
+
}, {});
|
|
91
96
|
const select = xpath.useNamespaces(nameSpaceMap);
|
|
92
97
|
|
|
93
98
|
const defaultFakeSideEffectService = { computeFieldGroupIds: () => [] };
|
|
@@ -180,7 +185,7 @@ expect.extend({
|
|
|
180
185
|
* an XML node.
|
|
181
186
|
*
|
|
182
187
|
* This function checkes for the xml errors created by the
|
|
183
|
-
* function [BuildingBlockTemplateProcessor.createErrorXML]{@link sap.fe.core.buildingBlocks.BuildingBlockTemplateProcessor#createErrorXML}.
|
|
188
|
+
* function [BuildingBlockTemplateProcessor.createErrorXML]{@link sap.fe.core.buildingBlocks.templating.BuildingBlockTemplateProcessor#createErrorXML}.
|
|
184
189
|
*
|
|
185
190
|
* @param xml XML String or XML Node to be tested for errors
|
|
186
191
|
* @returns Jest Matcher result object
|
|
@@ -270,8 +275,21 @@ export const formatXML = function (xmlString: string): string {
|
|
|
270
275
|
|
|
271
276
|
function appendAttributes() {
|
|
272
277
|
if (attributes.length > 0) {
|
|
273
|
-
|
|
274
|
-
|
|
278
|
+
attributes = attributes.sort((a, b) => {
|
|
279
|
+
if (a.name.startsWith("xmlns") && !b.name.startsWith("xmlns")) {
|
|
280
|
+
return -1;
|
|
281
|
+
} else if (!a.name.startsWith("xmlns") && b.name.startsWith("xmlns")) {
|
|
282
|
+
return 1;
|
|
283
|
+
} else if (a.name.startsWith("xmlns") && b.name.startsWith("xmlns")) {
|
|
284
|
+
return a.name.localeCompare(b.name);
|
|
285
|
+
} else if (a.name.includes(":") && !b.name.includes(":")) {
|
|
286
|
+
return -1;
|
|
287
|
+
} else if (!a.name.includes(":") && b.name.includes(":")) {
|
|
288
|
+
return 1;
|
|
289
|
+
} else {
|
|
290
|
+
return a.name.localeCompare(b.name);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
275
293
|
|
|
276
294
|
level++;
|
|
277
295
|
for (const attribute of attributes) {
|
|
@@ -400,7 +418,8 @@ export const getFakeSideEffectsService = async function (
|
|
|
400
418
|
isA: () => classNameODataModel === "sap.ui.model.odata.v4.ODataModel",
|
|
401
419
|
getMetaModel: () => {
|
|
402
420
|
return metaModel;
|
|
403
|
-
}
|
|
421
|
+
},
|
|
422
|
+
getServiceUrl: () => undefined
|
|
404
423
|
};
|
|
405
424
|
},
|
|
406
425
|
getService: () => {
|
|
@@ -547,7 +566,6 @@ const applyFlexChanges = async function (flexChanges: { [x: string]: object[] },
|
|
|
547
566
|
jest.spyOn(AppStorage, "loadFlexData").mockReturnValue(Promise.resolve(changes));
|
|
548
567
|
jest.spyOn(Loader, "loadFlexData").mockReturnValue(Promise.resolve(changes));
|
|
549
568
|
|
|
550
|
-
jest.spyOn(Component, "get").mockReturnValue(oAppComponent);
|
|
551
569
|
jest.spyOn(Component as unknown as { getComponentById: () => AppComponent }, "getComponentById").mockReturnValue(oAppComponent);
|
|
552
570
|
jest.spyOn(Utils, "getAppComponentForControl").mockReturnValue(oAppComponent);
|
|
553
571
|
await FlexState.initialize({
|
|
@@ -608,11 +626,20 @@ export const getTemplatedXML = async function (
|
|
|
608
626
|
mModels: { [x: string]: any },
|
|
609
627
|
flexChanges?: { [x: string]: object[] },
|
|
610
628
|
fakeSideEffectService?: unknown
|
|
611
|
-
) {
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
629
|
+
): Promise<string> {
|
|
630
|
+
return jsx.defineXMLNamespaceMap(reveseNamespaceMap, async () => {
|
|
631
|
+
const templatedXML = await getTemplatingResult(
|
|
632
|
+
xmlInput,
|
|
633
|
+
sMetadataUrl,
|
|
634
|
+
mBindingContexts,
|
|
635
|
+
mModels,
|
|
636
|
+
flexChanges,
|
|
637
|
+
fakeSideEffectService
|
|
638
|
+
);
|
|
639
|
+
const serialiedXML = serializeXML(templatedXML, undefined);
|
|
640
|
+
expect(serialiedXML).not.toHaveTemplatingErrors();
|
|
641
|
+
return serialiedXML;
|
|
642
|
+
}) as unknown as Promise<string>;
|
|
616
643
|
};
|
|
617
644
|
|
|
618
645
|
/**
|
|
@@ -688,7 +715,7 @@ export async function processFragment(name: string, testData: { [model: string]:
|
|
|
688
715
|
return formatXML(xmlResult);
|
|
689
716
|
}
|
|
690
717
|
|
|
691
|
-
export function serializeControl(controlToSerialize
|
|
718
|
+
export function serializeControl(controlToSerialize?: UI5Element | UI5Element[]) {
|
|
692
719
|
let tabCount = 0;
|
|
693
720
|
function getTab(toAdd: number = 0) {
|
|
694
721
|
let tab = "";
|
|
@@ -20,7 +20,8 @@ sap.ui.define(
|
|
|
20
20
|
"sap/fe/test/api/HeaderActionsLR",
|
|
21
21
|
"sap/fe/test/api/HeaderAssertionsLR",
|
|
22
22
|
"sap/fe/test/api/KPICardAssertions",
|
|
23
|
-
"sap/fe/test/api/KPICardActions"
|
|
23
|
+
"sap/fe/test/api/KPICardActions",
|
|
24
|
+
"sap/ui/core/Lib"
|
|
24
25
|
],
|
|
25
26
|
function (
|
|
26
27
|
Utils,
|
|
@@ -37,7 +38,8 @@ sap.ui.define(
|
|
|
37
38
|
HeaderActionsLR,
|
|
38
39
|
HeaderAssertionsLR,
|
|
39
40
|
KPICardAssertions,
|
|
40
|
-
KPICardActions
|
|
41
|
+
KPICardActions,
|
|
42
|
+
Lib
|
|
41
43
|
) {
|
|
42
44
|
"use strict";
|
|
43
45
|
|
|
@@ -83,7 +85,7 @@ sap.ui.define(
|
|
|
83
85
|
SingleChartId = "fe::Chart::" + sEntityPath + "::Chart",
|
|
84
86
|
FilterBarId = "fe::FilterBar::" + sEntityPath,
|
|
85
87
|
FilterBarVHDId = FilterBarId + "::FilterFieldValueHelp::",
|
|
86
|
-
oResourceBundleCore =
|
|
88
|
+
oResourceBundleCore = Lib.getResourceBundleFor("sap.fe.core"),
|
|
87
89
|
IconTabBarId = "fe::TabMultipleMode",
|
|
88
90
|
PageId = "fe::ListReport",
|
|
89
91
|
aAdditionalPageDefinitions = Array.isArray(arguments[1]) ? arguments[1] : Array.prototype.slice.call(arguments, 1);
|
|
@@ -19,7 +19,8 @@ sap.ui.define(
|
|
|
19
19
|
"sap/fe/test/api/HeaderActions",
|
|
20
20
|
"sap/fe/test/api/HeaderAssertions",
|
|
21
21
|
"sap/fe/test/api/FormActions",
|
|
22
|
-
"sap/fe/test/api/FormAssertions"
|
|
22
|
+
"sap/fe/test/api/FormAssertions",
|
|
23
|
+
"sap/ui/core/Lib"
|
|
23
24
|
],
|
|
24
25
|
function (
|
|
25
26
|
mergeObjects,
|
|
@@ -35,7 +36,8 @@ sap.ui.define(
|
|
|
35
36
|
HeaderActions,
|
|
36
37
|
HeaderAssertions,
|
|
37
38
|
FormActions,
|
|
38
|
-
FormAssertions
|
|
39
|
+
FormAssertions,
|
|
40
|
+
Lib
|
|
39
41
|
) {
|
|
40
42
|
"use strict";
|
|
41
43
|
|
|
@@ -187,7 +189,7 @@ sap.ui.define(
|
|
|
187
189
|
DISPLAY: "Display",
|
|
188
190
|
EDITABLE: "Editable"
|
|
189
191
|
},
|
|
190
|
-
oResourceBundleCore =
|
|
192
|
+
oResourceBundleCore = Lib.getResourceBundleFor("sap.fe.core"),
|
|
191
193
|
aAdditionalPages = Array.prototype.slice.call(arguments, 1);
|
|
192
194
|
|
|
193
195
|
return TemplatePage.apply(
|
|
@@ -639,7 +641,6 @@ sap.ui.define(
|
|
|
639
641
|
.description("Messagebutton is visible with " + message[messageType]["type"] + " button type")
|
|
640
642
|
.execute();
|
|
641
643
|
},
|
|
642
|
-
|
|
643
644
|
iSeeLinkWithText: function (sText) {
|
|
644
645
|
return OpaBuilder.create(this)
|
|
645
646
|
.hasType("sap.m.Link")
|
|
@@ -10,9 +10,10 @@ sap.ui.define(
|
|
|
10
10
|
"sap/ui/core/util/XMLPreprocessor",
|
|
11
11
|
"sap/ui/core/XMLTemplateProcessor",
|
|
12
12
|
"sap/fe/macros/macroLibrary",
|
|
13
|
-
"sap/fe/core/TemplateModel"
|
|
13
|
+
"sap/fe/core/TemplateModel",
|
|
14
|
+
"sap/ui/base/Object"
|
|
14
15
|
],
|
|
15
|
-
function (ODataMetaModel, XMLPreprocessor, XMLTemplateProcessor, macroLibrary, TemplateModel) {
|
|
16
|
+
function (ODataMetaModel, XMLPreprocessor, XMLTemplateProcessor, macroLibrary, TemplateModel, BaseObject) {
|
|
16
17
|
"use strict";
|
|
17
18
|
/**
|
|
18
19
|
* Unit Test parts of XML fragments for mocked metadata against expected results.
|
|
@@ -78,7 +79,10 @@ sap.ui.define(
|
|
|
78
79
|
//Inject models and bindingContexts
|
|
79
80
|
Object.keys(mBindingContexts).forEach(function (sKey) {
|
|
80
81
|
var oModel = mModels[sKey] || oMetaModel;
|
|
81
|
-
if (
|
|
82
|
+
if (
|
|
83
|
+
!BaseObject.isObjectA(oModel, "sap.ui.model.Model") &&
|
|
84
|
+
!BaseObject.isObjectA(oModel, "sap.ui.model.odata.v4.ODataMetaModel")
|
|
85
|
+
) {
|
|
82
86
|
oModel = new TemplateModel(oModel, oMetaModel);
|
|
83
87
|
}
|
|
84
88
|
/* Assert to make sure the annotations are in the test metadata -> avoid misleading tests */
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
* (c) Copyright 2009-
|
|
3
|
+
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent", "sap/fe/core/controllerextensions/
|
|
5
|
+
sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent", "sap/fe/core/ResourceModel", "sap/fe/core/controllerextensions/CollaborativeDraft", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/Recommendations", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/ui/base/Event", "sap/ui/core/mvc/Controller", "sap/ui/core/mvc/View", "sap/ui/model/CompositeBinding", "sap/ui/model/odata/v4/Context", "sap/ui/model/odata/v4/ODataContextBinding", "sap/ui/model/odata/v4/ODataListBinding", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/ODataModel", "sap/ui/model/odata/v4/ODataPropertyBinding"], function (generic, AppComponent, ResourceModel, CollaborativeDraft, EditFlow, InternalRouting, Recommendations, Share, SideEffects, Event, Controller, View, CompositeBinding, Context, ODataContextBinding, ODataListBinding, ODataMetaModel, ODataModel, ODataPropertyBinding) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
@@ -37,7 +37,7 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
|
|
|
37
37
|
return Promise.resolve(mocked._contextData[keyOrKeys]);
|
|
38
38
|
});
|
|
39
39
|
mocked.mock.requestObject.mockImplementation(key => {
|
|
40
|
-
return Promise.resolve(mocked._contextData[key]);
|
|
40
|
+
return key ? Promise.resolve(mocked._contextData[key]) : mocked._contextData;
|
|
41
41
|
});
|
|
42
42
|
mocked.mock.setProperty.mockImplementation((key, value) => {
|
|
43
43
|
mocked._contextData[key] = value;
|
|
@@ -83,9 +83,12 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
|
|
|
83
83
|
* @param params The parameters of the event
|
|
84
84
|
* @returns A new MockEvent
|
|
85
85
|
*/
|
|
86
|
-
function createMockEvent(params) {
|
|
86
|
+
function createMockEvent(params, source) {
|
|
87
87
|
const mocked = mock(Event);
|
|
88
88
|
mocked._params = params || {};
|
|
89
|
+
if (source) {
|
|
90
|
+
mocked.mock.getSource.mockReturnValue(source);
|
|
91
|
+
}
|
|
89
92
|
|
|
90
93
|
// Default behavior
|
|
91
94
|
mocked.mock.getParameter.mockImplementation(name => mocked._params[name]);
|
|
@@ -298,6 +301,9 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
|
|
|
298
301
|
const metamodel = new ODataMetaModel();
|
|
299
302
|
return sPath ? metamodel.getMetaPath(sPath) : sPath;
|
|
300
303
|
});
|
|
304
|
+
mocked.mock.isA.mockImplementation(sClassName => {
|
|
305
|
+
return sClassName === "sap.ui.model.odata.v4.ODataMetaModel";
|
|
306
|
+
});
|
|
301
307
|
return mocked;
|
|
302
308
|
}
|
|
303
309
|
/**
|
|
@@ -319,6 +325,7 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
|
|
|
319
325
|
*/
|
|
320
326
|
function createMockModel(oMockListBinding, oMockContextBinding) {
|
|
321
327
|
const mocked = mock(ODataModel);
|
|
328
|
+
mocked.fnOptimisticBatchEnabler = null;
|
|
322
329
|
mocked.mockListBinding = oMockListBinding;
|
|
323
330
|
mocked.mockContextBinding = oMockContextBinding;
|
|
324
331
|
if (oMockListBinding) {
|
|
@@ -343,6 +350,9 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
|
|
|
343
350
|
mocked.mock.getMetaModel.mockImplementation(() => {
|
|
344
351
|
return mocked.oMetaModel;
|
|
345
352
|
});
|
|
353
|
+
mocked.mock.isA.mockImplementation(sClassName => {
|
|
354
|
+
return sClassName === "sap.ui.model.odata.v4.ODataModel";
|
|
355
|
+
});
|
|
346
356
|
return mocked;
|
|
347
357
|
}
|
|
348
358
|
/**
|
|
@@ -410,6 +420,7 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
|
|
|
410
420
|
mocked._sideEffects = mock(SideEffects);
|
|
411
421
|
mocked.editFlow = mock(EditFlow);
|
|
412
422
|
mocked.share = mock(Share);
|
|
423
|
+
mocked.collaborativeDraft = mock(CollaborativeDraft);
|
|
413
424
|
mocked.recommendations = mock(Recommendations);
|
|
414
425
|
mocked.getAppComponent = jest.fn().mockReturnValue(mock(AppComponent));
|
|
415
426
|
// Default Behavior
|
|
@@ -482,4 +493,4 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
|
|
|
482
493
|
_exports.createMockResourceModel = createMockResourceModel;
|
|
483
494
|
return _exports;
|
|
484
495
|
}, false);
|
|
485
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVNb2NrQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsIm9CaW5kaW5nIiwiaXNJbmFjdGl2ZSIsIm1vY2tlZCIsIm1vY2siLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIkNvbnRleHQiLCJjcmVhdGVOZXdDb250ZXh0IiwiX2lzS2VwdEFsaXZlIiwiX2NvbnRleHREYXRhIiwiX29CaW5kaW5nIiwiX2lzSW5hY3RpdmUiLCJpc0EiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJzQ2xhc3NOYW1lIiwiZ2V0UHJvcGVydHkiLCJrZXkiLCJyZXF1ZXN0UHJvcGVydHkiLCJrZXlPcktleXMiLCJBcnJheSIsImlzQXJyYXkiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1hcCIsInJlcXVlc3RPYmplY3QiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJzZXRLZWVwQWxpdmUiLCJib29sIiwiX2ZuT25CZWZvcmVEZXN0cm95IiwiX2JSZXF1ZXN0TWVzc2FnZXMiLCJpc0tlZXBBbGl2ZSIsIk1vY2tDb250ZXh0IiwiY3JlYXRlTW9ja0V2ZW50IiwicGFyYW1zIiwiRXZlbnQiLCJfcGFyYW1zIiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsImdldFBhcmFtZXRlcnMiLCJNb2NrRXZlbnQiLCJjcmVhdGVNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dERhdGEiLCJvTW9ja01vZGVsIiwiT0RhdGFMaXN0QmluZGluZyIsIl9hTW9ja0NvbnRleHRzIiwiY29udGV4dERhdGEiLCJfbW9ja01vZGVsIiwic2V0TW9kZWwiLCJtb2RlbCIsInJlcXVlc3RDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImdldENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm1vY2tSZXR1cm5WYWx1ZSIsIk1vY2tMaXN0QmluZGluZyIsImNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmciLCJPRGF0YVByb3BlcnR5QmluZGluZyIsIl92YWx1ZSIsIl9wYXRoIiwiZ2V0VmFsdWUiLCJNb2NrUHJvcGVydHlCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmciLCJhQmluZGluZ3MiLCJDb21wb3NpdGVCaW5kaW5nIiwiX2FCaW5kaW5ncyIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJPRGF0YUNvbnRleHRCaW5kaW5nIiwibW9ja01vZGVsIiwib01vY2tDb250ZXh0IiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIm9Nb2RlbCIsImdldEJvdW5kQ29udGV4dCIsImV4ZWN1dGUiLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsIk1vY2tDb250ZXh0QmluZGluZyIsImNyZWF0ZU1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJPRGF0YU1ldGFNb2RlbCIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0Iiwic1BhdGgiLCIkcGF0aCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJtZXRhbW9kZWwiLCJNb2NrTWV0YU1vZGVsIiwiY3JlYXRlTW9ja01vZGVsIiwib01vY2tMaXN0QmluZGluZyIsIm9Nb2NrQ29udGV4dEJpbmRpbmciLCJPRGF0YU1vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwic2V0TWV0YU1vZGVsIiwib01ldGFNb2RlbCIsImJpbmRMaXN0IiwiYmluZENvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJNb2NrTW9kZWwiLCJjcmVhdGVNb2NrTW9kZWxGcm9tTGlzdEJpbmRpbmciLCJjcmVhdGVNb2NrTW9kZWxGcm9tQ29udGV4dEJpbmRpbmciLCJ1bmRlZmluZWQiLCJjcmVhdGVNb2NrVmlldyIsIlZpZXciLCJNb2NrVmlldyIsImNyZWF0ZU1vY2tDb250cm9sbGVyIiwiQ29udHJvbGxlciIsIl9yb3V0aW5nIiwiSW50ZXJuYWxSb3V0aW5nIiwiX3NpZGVFZmZlY3RzIiwiU2lkZUVmZmVjdHMiLCJlZGl0RmxvdyIsIkVkaXRGbG93Iiwic2hhcmUiLCJTaGFyZSIsInJlY29tbWVuZGF0aW9ucyIsIlJlY29tbWVuZGF0aW9ucyIsImdldEFwcENvbXBvbmVudCIsImplc3QiLCJmbiIsIkFwcENvbXBvbmVudCIsImdldFZpZXciLCJNb2NrQ29udHJvbGxlciIsIm1vY2tNVkMiLCJleGlzdGluZyIsInZpZXciLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImdldFRleHQiLCJ0ZXh0SUQiLCJwYXJhbWV0ZXJzIiwibWV0YVBhdGgiLCJyZXNvdXJjZU1vZGVsIiwiUmVzb3VyY2VNb2RlbCIsImJ1bmRsZU5hbWUiLCJlbmhhbmNlV2l0aCIsImFzeW5jIiwiY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXaXRoTW9jayB9IGZyb20gXCJAc2FwLXV4L2plc3QtbW9jay11aTUvZGlzdC9nZW5lcmljXCI7XG5pbXBvcnQgeyBtb2NrIH0gZnJvbSBcIkBzYXAtdXgvamVzdC1tb2NrLXVpNS9kaXN0L2dlbmVyaWNcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9FZGl0Rmxvd1wiO1xuaW1wb3J0IEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgUmVjb21tZW5kYXRpb25zIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9SZWNvbW1lbmRhdGlvbnNcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBTaWRlRWZmZWN0cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbXBvc2l0ZUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Db21wb3NpdGVCaW5kaW5nXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbnRleHQgPSBXaXRoTW9jazxDb250ZXh0PiAmIHtcblx0X2lzS2VwdEFsaXZlOiBib29sZWFuO1xuXHRfY29udGV4dERhdGE6IGFueTtcblx0X29CaW5kaW5nOiBhbnk7XG5cdF9pc0luYWN0aXZlOiBib29sZWFuO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0NvbnRleHQuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0RGF0YSBBIG1hcCBvZiB0aGUgZGlmZmVyZW50IHByb3BlcnRpZXMgb2YgdGhlIGNvbnRleHQuIFRoZSB2YWx1ZSBmb3IgdGhlIGtleSAnJHBhdGgnIHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlICdnZXRQYXRoJyBtZXRob2RcbiAqIEBwYXJhbSBvQmluZGluZyBUaGUgYmluZGluZyBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIGlzSW5hY3RpdmUgSXMgdGhlIGNvbnRleHQgaW5pYWN0aXZlIG9yIG5vdFxuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb250ZXh0KG9Db250ZXh0RGF0YT86IGFueSwgb0JpbmRpbmc/OiBhbnksIGlzSW5hY3RpdmU/OiBib29sZWFuKTogTW9ja0NvbnRleHQge1xuXHQvLyBVZ2x5IHdvcmthcm91bmQgdG8gZ2V0IGEgcHJvcGVyIG1vY2sgcGJqZWN0LCBhcyBDb250ZXh0IGlzbid0IHByb3Blcmx5IGV4cG9ydGVkIGZyb20gVUk1XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT2JqZWN0LmdldFByb3RvdHlwZU9mKChDb250ZXh0IGFzIGFueSkuY3JlYXRlTmV3Q29udGV4dChudWxsLCBudWxsLCBcIi9lXCIpKSkgYXMgTW9ja0NvbnRleHQ7XG5cdG1vY2tlZC5faXNLZXB0QWxpdmUgPSBmYWxzZTtcblx0bW9ja2VkLl9jb250ZXh0RGF0YSA9IG9Db250ZXh0RGF0YSB8fCB7fTtcblx0bW9ja2VkLl9vQmluZGluZyA9IG9CaW5kaW5nO1xuXHRtb2NrZWQuX2lzSW5hY3RpdmUgPSAhIWlzSW5hY3RpdmU7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0UHJvcGVydHkubW9ja0ltcGxlbWVudGF0aW9uKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2NvbnRleHREYXRhW2tleV07XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0UHJvcGVydHkubW9ja0ltcGxlbWVudGF0aW9uKChrZXlPcktleXM6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoa2V5T3JLZXlzKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXlPcktleXMubWFwKChrZXkpID0+IG1vY2tlZC5fY29udGV4dERhdGFba2V5XSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5T3JLZXlzXSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5XSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5zZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0bW9ja2VkLl9jb250ZXh0RGF0YVtrZXldID0gdmFsdWU7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigocGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0bGV0IHJlc3VsdCA9IHBhdGggPyBtb2NrZWQuX2NvbnRleHREYXRhW3BhdGhdIDogbW9ja2VkLl9jb250ZXh0RGF0YTtcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgbW9ja2VkLl9jb250ZXh0RGF0YSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0UGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtcIiRwYXRoXCJdKTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9vQmluZGluZyk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX29CaW5kaW5nPy5nZXRNb2RlbCgpKTtcblx0bW9ja2VkLm1vY2suc2V0S2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoYm9vbDogYm9vbGVhbiwgX2ZuT25CZWZvcmVEZXN0cm95PzogYW55LCBfYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pID0+IHtcblx0XHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gYm9vbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzS2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX2lzS2VwdEFsaXZlKTtcblx0bW9ja2VkLm1vY2suaXNJbmFjdGl2ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9pc0luYWN0aXZlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0OiBuZXcgKG9WYWx1ZXM/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbikgPT4gTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuYmFzZS5FdmVudFxuICovXG5leHBvcnQgdHlwZSBNb2NrRXZlbnQgPSBXaXRoTW9jazxFdmVudD4gJiB7XG5cdF9wYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrRXZlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnRcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tFdmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50KHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBNb2NrRXZlbnQge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKEV2ZW50KSBhcyBNb2NrRXZlbnQ7XG5cdG1vY2tlZC5fcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0UGFyYW1ldGVyLm1vY2tJbXBsZW1lbnRhdGlvbigobmFtZSkgPT4gbW9ja2VkLl9wYXJhbXNbbmFtZV0pO1xuXHRtb2NrZWQubW9jay5nZXRQYXJhbWV0ZXJzLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fcGFyYW1zO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrRXZlbnQ6IG5ldyAocGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT4gTW9ja0V2ZW50ID0gY3JlYXRlTW9ja0V2ZW50IGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tMaXN0QmluZGluZyA9IFdpdGhNb2NrPE9EYXRhTGlzdEJpbmRpbmc+ICYge1xuXHRfYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblx0X21vY2tNb2RlbD86IE1vY2tNb2RlbDtcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtb2RlbCBvZiB0aGUgTGlzdEJpbmRpbmdcblx0ICovXG5cdHNldE1vZGVsOiAobW9kZWw6IE1vY2tNb2RlbCkgPT4gdm9pZDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tMaXN0QmluZGluZy5cbiAqXG4gKiBAcGFyYW0gYUNvbnRleHREYXRhIEFuIGFycmF5IG9mIG9iamVjdHMgaG9sZGluZyB0aGUgZGlmZmVyZW50IHByb3BlcnRpZXMgb2YgdGhlIGNvbnRleHRzIHJlZmVyZW5jZWQgYnkgdGhlIExpc3RCaW5kaW5nXG4gKiBAcGFyYW0gb01vY2tNb2RlbCBUaGUgbW9kZWwgb2YgdGhlIExpc3RCaW5kaW5nXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tMaXN0QmluZGluZyhhQ29udGV4dERhdGE/OiBhbnlbXSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCk6IE1vY2tMaXN0QmluZGluZyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFMaXN0QmluZGluZykgYXMgTW9ja0xpc3RCaW5kaW5nO1xuXHRhQ29udGV4dERhdGEgPSBhQ29udGV4dERhdGEgfHwgW107XG5cdG1vY2tlZC5fYU1vY2tDb250ZXh0cyA9IGFDb250ZXh0RGF0YS5tYXAoKGNvbnRleHREYXRhKSA9PiB7XG5cdFx0cmV0dXJuIGNyZWF0ZU1vY2tDb250ZXh0KGNvbnRleHREYXRhLCBtb2NrZWQpO1xuXHR9KTtcblx0bW9ja2VkLl9tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXG5cdC8vIFV0aWxpdHkgQVBJXG5cdG1vY2tlZC5zZXRNb2RlbCA9IChtb2RlbDogTW9ja01vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLl9tb2NrTW9kZWwgPSBtb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fYU1vY2tDb250ZXh0cyk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRDdXJyZW50Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0QWxsQ3VycmVudENvbnRleHRzLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYU1vY2tDb250ZXh0cztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldENvbnRleHRzLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYU1vY2tDb250ZXh0cztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fbW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0VXBkYXRlR3JvdXBJZC5tb2NrUmV0dXJuVmFsdWUoXCJhdXRvXCIpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrTGlzdEJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tMaXN0QmluZGluZzogbmV3IChhQ29udGV4dHM/OiBhbnlbXSwgbW9ja01vZGVsPzogTW9ja01vZGVsKSA9PiBNb2NrTGlzdEJpbmRpbmcgPSBjcmVhdGVNb2NrTGlzdEJpbmRpbmcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tQcm9wZXJ0eUJpbmRpbmcgPSBXaXRoTW9jazxPRGF0YVByb3BlcnR5QmluZGluZz4gJiB7XG5cdF92YWx1ZT86IGFueTtcblx0X3BhdGg/OiBzdHJpbmc7XG5cdF9tb2NrTW9kZWw/OiBNb2NrTW9kZWw7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrUHJvcGVydHlCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgcmV0dXJuZCBieSB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcGFyYW0gb01vY2tNb2RlbCBUaGUgbW9kZWwgb2YgdGhlIFByb3BlcnR5QmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja1Byb3BlcnR5QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyh2YWx1ZTogYW55LCBwYXRoPzogc3RyaW5nLCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja1Byb3BlcnR5QmluZGluZyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFQcm9wZXJ0eUJpbmRpbmcpIGFzIE1vY2tQcm9wZXJ0eUJpbmRpbmc7XG5cdG1vY2tlZC5fbW9ja01vZGVsID0gb01vY2tNb2RlbDtcblx0bW9ja2VkLl92YWx1ZSA9IHZhbHVlO1xuXHRtb2NrZWQuX3BhdGggPSBwYXRoO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNb2RlbC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX21vY2tNb2RlbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFZhbHVlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fdmFsdWU7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRQYXRoLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fcGF0aDtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tQcm9wZXJ0eUJpbmRpbmc6IG5ldyAodmFsdWU6IGFueSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCkgPT4gTW9ja1Byb3BlcnR5QmluZGluZyA9IGNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbXBvc2l0ZUJpbmRpbmcgPSBXaXRoTW9jazxDb21wb3NpdGVCaW5kaW5nPiAmIHtcblx0X2FCaW5kaW5nczogTW9ja1Byb3BlcnR5QmluZGluZ1tdO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0NvbXBvc2l0ZUJpbmRpbmcuXG4gKlxuICogQHBhcmFtIGFCaW5kaW5ncyBUaGUgYmluZGluZ3Mgb2YgdGhlIENvbXBvc2l0ZUJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb21wb3NpdGVCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyhhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXSk6IE1vY2tDb21wb3NpdGVCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhDb21wb3NpdGVCaW5kaW5nKSBhcyBNb2NrQ29tcG9zaXRlQmluZGluZztcblx0bW9ja2VkLl9hQmluZGluZ3MgPSBhQmluZGluZ3M7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1wiO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZ3MubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hQmluZGluZ3M7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRWYWx1ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FCaW5kaW5ncy5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcuZ2V0VmFsdWUoKSk7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0NvbXBvc2l0ZUJpbmRpbmc6IG5ldyAoYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW10pID0+IE1vY2tDb21wb3NpdGVCaW5kaW5nID0gY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbnRleHRCaW5kaW5nID0gV2l0aE1vY2s8T0RhdGFDb250ZXh0QmluZGluZz4gJiB7XG5cdG9Nb2NrQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cdGlzS2VwdEFsaXZlOiBib29sZWFuO1xuXHRtb2NrTW9kZWw/OiBNb2NrTW9kZWw7XG5cblx0LyoqXG5cdCAqIFV0aWxpdHkgbWV0aG9kIHRvIGFjY2VzcyB0aGUgaW50ZXJuYWwgTW9ja0NvbnRleHQgb2YgdGhlIENvbnRleHRCaW5kaW5nXG5cdCAqL1xuXHRnZXRJbnRlcm5hbE1vY2tDb250ZXh0OiAoKSA9PiBNb2NrQ29udGV4dDtcblx0LyoqXG5cdCAqIFV0aWxpdHkgbWV0aG9kIHRvIHNldCB0aGUgbW9kZWwgb2YgdGhlIENvbnRleHRCaW5kaW5nXG5cdCAqL1xuXHRzZXRNb2RlbDogKG9Nb2RlbDogTW9ja01vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0NvbnRleHRCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb250ZXh0QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nKG9Db250ZXh0PzogYW55LCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja0NvbnRleHRCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YUNvbnRleHRCaW5kaW5nKSBhcyBNb2NrQ29udGV4dEJpbmRpbmc7XG5cdG1vY2tlZC5tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXHRtb2NrZWQub01vY2tDb250ZXh0ID0gY3JlYXRlTW9ja0NvbnRleHQob0NvbnRleHQgfHwge30sIG1vY2tlZCk7XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLmdldEludGVybmFsTW9ja0NvbnRleHQgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5vTW9ja0NvbnRleHQ7XG5cdH07XG5cdG1vY2tlZC5zZXRNb2RlbCA9IChvTW9kZWw6IE1vY2tNb2RlbCkgPT4ge1xuXHRcdG1vY2tlZC5tb2NrTW9kZWwgPSBvTW9kZWw7XG5cdH07XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0Qm91bmRDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5vTW9ja0NvbnRleHQ7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNb2RlbC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQubW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZXhlY3V0ZS5tb2NrUmVzb2x2ZWRWYWx1ZSh0cnVlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrQ29udGV4dEJpbmRpbmc6IG5ldyAob0NvbnRleHQ/OiBhbnksIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpID0+IE1vY2tDb250ZXh0QmluZGluZyA9IGNyZWF0ZU1vY2tDb250ZXh0QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja01ldGFNb2RlbCA9IFdpdGhNb2NrPE9EYXRhTWV0YU1vZGVsPiAmIHtcblx0b01ldGFDb250ZXh0OiBNb2NrQ29udGV4dDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tNZXRhTW9kZWwuXG4gKlxuICogQHBhcmFtIG9NZXRhRGF0YSBBIG1hcCBvZiB0aGUgZGlmZmVyZW50IG1ldGFkYXRhIHByb3BlcnRpZXMgb2YgdGhlIE1ldGFNb2RlbCAocGF0aCAtPiB2YWx1ZSkuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTWV0YU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrTWV0YU1vZGVsKG9NZXRhRGF0YT86IGFueSk6IE1vY2tNZXRhTW9kZWwge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhTWV0YU1vZGVsKSBhcyBNb2NrTWV0YU1vZGVsO1xuXHRtb2NrZWQub01ldGFDb250ZXh0ID0gY3JlYXRlTW9ja0NvbnRleHQob01ldGFEYXRhIHx8IHt9KTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmdldE1ldGFDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBjcmVhdGVNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE9iamVjdC5tb2NrSW1wbGVtZW50YXRpb24oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5jcmVhdGVCaW5kaW5nQ29udGV4dC5tb2NrSW1wbGVtZW50YXRpb24oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gY3JlYXRlTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNZXRhUGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCBtZXRhbW9kZWwgPSBuZXcgT0RhdGFNZXRhTW9kZWwoKTtcblx0XHRyZXR1cm4gc1BhdGggPyBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpIDogc1BhdGg7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrTWV0YU1vZGVsIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrTWV0YU1vZGVsOiBuZXcgKG9NZXRhRGF0YT86IGFueSkgPT4gTW9ja01ldGFNb2RlbCA9IGNyZWF0ZU1vY2tNZXRhTW9kZWwgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja01vZGVsID0gV2l0aE1vY2s8T0RhdGFNb2RlbD4gJiB7XG5cdG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXHRtb2NrTGlzdEJpbmRpbmc/OiBNb2NrTGlzdEJpbmRpbmc7XG5cdG1vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZztcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtZXRhbW9kZWwgb2YgdGhlIE1vY2tNb2RlbFxuXHQgKi9cblx0c2V0TWV0YU1vZGVsOiAob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkgPT4gdm9pZDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tNb2RlbC5cbiAqXG4gKiBAcGFyYW0gb01vY2tMaXN0QmluZGluZyBBIGxpc3QgYmluZGluZyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgd2hlbiBjYWxsaW5nIGJpbmRMaXN0LlxuICogQHBhcmFtIG9Nb2NrQ29udGV4dEJpbmRpbmcgQSBjb250ZXh0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kQ29udGV4dC5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsKG9Nb2NrTGlzdEJpbmRpbmc/OiBNb2NrTGlzdEJpbmRpbmcsIG9Nb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhTW9kZWwpIGFzIE1vY2tNb2RlbDtcblx0bW9ja2VkLm1vY2tMaXN0QmluZGluZyA9IG9Nb2NrTGlzdEJpbmRpbmc7XG5cdG1vY2tlZC5tb2NrQ29udGV4dEJpbmRpbmcgPSBvTW9ja0NvbnRleHRCaW5kaW5nO1xuXHRpZiAob01vY2tMaXN0QmluZGluZykge1xuXHRcdG9Nb2NrTGlzdEJpbmRpbmcuc2V0TW9kZWwobW9ja2VkKTtcblx0fVxuXHRpZiAob01vY2tDb250ZXh0QmluZGluZykge1xuXHRcdG9Nb2NrQ29udGV4dEJpbmRpbmcuc2V0TW9kZWwobW9ja2VkKTtcblx0fVxuXG5cdC8vIFV0aWxpdHkgQVBJXG5cdG1vY2tlZC5zZXRNZXRhTW9kZWwgPSAob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkgPT4ge1xuXHRcdG1vY2tlZC5vTWV0YU1vZGVsID0gb01ldGFNb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmJpbmRMaXN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrTGlzdEJpbmRpbmc7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5iaW5kQ29udGV4dC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQubW9ja0NvbnRleHRCaW5kaW5nO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0TWV0YU1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5vTWV0YU1vZGVsO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrTW9kZWw6IG5ldyAob01vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgb01vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykgPT4gTW9ja01vZGVsID1cblx0Y3JlYXRlTW9ja01vZGVsIGFzIGFueTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGxpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0xpc3RCaW5kaW5nIEEgbGlzdCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZExpc3QuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21MaXN0QmluZGluZyhvTW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKG9Nb2NrTGlzdEJpbmRpbmcpO1xufVxuLyoqXG4gKiAgRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGNvbnRleHRCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0NvbnRleHRCaW5kaW5nIEEgY29udGV4dCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZENvbnRleHQuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21Db250ZXh0QmluZGluZyhvTW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKHVuZGVmaW5lZCwgb01vY2tDb250ZXh0QmluZGluZyk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuY29yZS5tdmMuVmlld1xuICovXG5leHBvcnQgdHlwZSBNb2NrVmlldyA9IFdpdGhNb2NrPFZpZXc+O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrVmlldy5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrVmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja1ZpZXcoKTogTW9ja1ZpZXcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKFZpZXcpO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tWaWV3IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrVmlldzogbmV3ICgpID0+IE1vY2tWaWV3ID0gY3JlYXRlTW9ja1ZpZXcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLmZlLmNvcmUuUGFnZUNvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbnRyb2xsZXIgPSBXaXRoTW9jazxDb250cm9sbGVyPiAmIHtcblx0X3JvdXRpbmc6IFdpdGhNb2NrPEludGVybmFsUm91dGluZz47XG5cdF9zaWRlRWZmZWN0czogV2l0aE1vY2s8U2lkZUVmZmVjdHM+O1xuXHRlZGl0RmxvdzogV2l0aE1vY2s8RWRpdEZsb3c+O1xuXHRzaGFyZTogV2l0aE1vY2s8U2hhcmU+O1xuXHRyZWNvbW1lbmRhdGlvbnM6IFdpdGhNb2NrPFJlY29tbWVuZGF0aW9ucz47XG5cdGdldEFwcENvbXBvbmVudDogKCkgPT4gV2l0aE1vY2s8QXBwQ29tcG9uZW50Pjtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tDb250cm9sbGVyLlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb250cm9sbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udHJvbGxlcigpOiBNb2NrQ29udHJvbGxlciB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soQ29udHJvbGxlcikgYXMgTW9ja0NvbnRyb2xsZXI7XG5cdG1vY2tlZC5fcm91dGluZyA9IG1vY2soSW50ZXJuYWxSb3V0aW5nKTtcblx0bW9ja2VkLl9zaWRlRWZmZWN0cyA9IG1vY2soU2lkZUVmZmVjdHMpO1xuXHRtb2NrZWQuZWRpdEZsb3cgPSBtb2NrKEVkaXRGbG93KTtcblx0bW9ja2VkLnNoYXJlID0gbW9jayhTaGFyZSk7XG5cdG1vY2tlZC5yZWNvbW1lbmRhdGlvbnMgPSBtb2NrKFJlY29tbWVuZGF0aW9ucyk7XG5cdG1vY2tlZC5nZXRBcHBDb21wb25lbnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG1vY2soQXBwQ29tcG9uZW50KSk7XG5cdC8vIERlZmF1bHQgQmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUoY3JlYXRlTW9ja1ZpZXcoKSk7XG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBtb2NrQ29udHJvbGxlciBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0NvbnRyb2xsZXI6IG5ldyAoKSA9PiBNb2NrQ29udHJvbGxlciA9IGNyZWF0ZU1vY2tDb250cm9sbGVyIGFzIGFueTtcblxuZXhwb3J0IGludGVyZmFjZSBNVkNNb2NrIHtcblx0bW9kZWw6IE1vY2tNb2RlbDtcblx0dmlldzogTW9ja1ZpZXc7XG5cdGNvbnRyb2xsZXI6IE1vY2tDb250cm9sbGVyO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBtb2NrcyB0aGF0IHJlZmVyIHRvIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nIE9wdGlvbmFsIGV4aXN0aW5nIG1vY2tlZCBpbnN0YW5jZXMgdGhhdCBzaG91bGQgYmUgdXNlZFxuICogQHJldHVybnMgTW9ja2VkIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIGluc3RhbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja01WQyhleGlzdGluZz86IFBhcnRpYWw8TVZDTW9jaz4pOiBNVkNNb2NrIHtcblx0Y29uc3QgbW9kZWwgPSBleGlzdGluZz8ubW9kZWwgfHwgY3JlYXRlTW9ja01vZGVsKCk7XG5cdGNvbnN0IHZpZXcgPSBleGlzdGluZz8udmlldyB8fCBjcmVhdGVNb2NrVmlldygpO1xuXHRjb25zdCBjb250cm9sbGVyID0gZXhpc3Rpbmc/LmNvbnRyb2xsZXIgfHwgY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTtcblxuXHR2aWV3Lm1vY2suZ2V0Q29udHJvbGxlci5tb2NrUmV0dXJuVmFsdWUoY29udHJvbGxlcik7XG5cdHZpZXcubW9jay5nZXRNb2RlbC5tb2NrUmV0dXJuVmFsdWUobW9kZWwpO1xuXHRjb250cm9sbGVyLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUodmlldyk7XG5cblx0cmV0dXJuIHsgbW9kZWwsIHZpZXcsIGNvbnRyb2xsZXIgfTtcbn1cblxuLyoqXG4gKiBUbyBiZSB1c2VkIHRvIGxvYWQgbWVzc2FnZXMgYnVuZGxlcyBmb3IgdGVzdHMgd2l0aG91dCBhcHAvcGFnZSBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHRleHRJRCBJRCBvZiB0aGUgVGV4dFxuICogQHBhcmFtIHBhcmFtZXRlcnMgQXJyYXkgb2YgcGFyYW1ldGVycyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdGV4dFxuICogQHBhcmFtIG1ldGFQYXRoIEVudGl0eSBzZXQgbmFtZSBvciBhY3Rpb24gbmFtZSB0byBvdmVybG9hZCBhIHRleHRcbiAqIEByZXR1cm5zIERldGVybWluZWQgdGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dCh0ZXh0SUQ6IHN0cmluZywgcGFyYW1ldGVycz86IGFueVtdLCBtZXRhUGF0aD86IHN0cmluZykge1xuXHRjb25zdCByZXNvdXJjZU1vZGVsID0gbmV3IFJlc291cmNlTW9kZWwoe1xuXHRcdGJ1bmRsZU5hbWU6IFwic2FwLmZlLmNvcmUubWVzc2FnZWJ1bmRsZVwiLFxuXHRcdGVuaGFuY2VXaXRoOiBbeyBidW5kbGVOYW1lOiBcInNhcC5mZS5tYWNyb3MubWVzc2FnZWJ1bmRsZVwiIH0sIHsgYnVuZGxlTmFtZTogXCJzYXAuZmUudGVtcGxhdGVzLm1lc3NhZ2VidW5kbGVcIiB9XSxcblx0XHRhc3luYzogZmFsc2Vcblx0fSk7XG5cdHJldHVybiByZXNvdXJjZU1vZGVsLmdldFRleHQodGV4dElELCBwYXJhbWV0ZXJzLCBtZXRhUGF0aCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgUmVzb3VyY2VNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrUmVzb3VyY2VNb2RlbCA9IFdpdGhNb2NrPFJlc291cmNlTW9kZWw+O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrVmlldy5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrVmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwoKTogTW9ja1Jlc291cmNlTW9kZWwge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKFJlc291cmNlTW9kZWwpO1xuXHRtb2NrZWQuZ2V0VGV4dCA9IGplc3QuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oZ2V0VGV4dCk7XG5cdHJldHVybiBtb2NrZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7OztFQTZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsaUJBQWlCLENBQUNDLFlBQWtCLEVBQUVDLFFBQWMsRUFBRUMsVUFBb0IsRUFBZTtJQUN4RztJQUNBLE1BQU1DLE1BQU0sR0FBR0MsSUFBSSxDQUFDQyxNQUFNLENBQUNDLGNBQWMsQ0FBRUMsT0FBTyxDQUFTQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQWdCO0lBQzlHTCxNQUFNLENBQUNNLFlBQVksR0FBRyxLQUFLO0lBQzNCTixNQUFNLENBQUNPLFlBQVksR0FBR1YsWUFBWSxJQUFJLENBQUMsQ0FBQztJQUN4Q0csTUFBTSxDQUFDUSxTQUFTLEdBQUdWLFFBQVE7SUFDM0JFLE1BQU0sQ0FBQ1MsV0FBVyxHQUFHLENBQUMsQ0FBQ1YsVUFBVTs7SUFFakM7SUFDQUMsTUFBTSxDQUFDQyxJQUFJLENBQUNTLEdBQUcsQ0FBQ0Msa0JBQWtCLENBQUVDLFVBQWtCLElBQUs7TUFDMUQsT0FBT0EsVUFBVSxLQUFLLCtCQUErQjtJQUN0RCxDQUFDLENBQUM7SUFDRlosTUFBTSxDQUFDQyxJQUFJLENBQUNZLFdBQVcsQ0FBQ0Ysa0JBQWtCLENBQUVHLEdBQVcsSUFBSztNQUMzRCxPQUFPZCxNQUFNLENBQUNPLFlBQVksQ0FBQ08sR0FBRyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztJQUNGZCxNQUFNLENBQUNDLElBQUksQ0FBQ2MsZUFBZSxDQUFDSixrQkFBa0IsQ0FBRUssU0FBNEIsSUFBSztNQUNoRixJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsU0FBUyxDQUFDLEVBQUU7UUFDN0IsT0FBT0csT0FBTyxDQUFDQyxPQUFPLENBQUNKLFNBQVMsQ0FB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
|
|
496
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVNb2NrQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsIm9CaW5kaW5nIiwiaXNJbmFjdGl2ZSIsIm1vY2tlZCIsIm1vY2siLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIkNvbnRleHQiLCJjcmVhdGVOZXdDb250ZXh0IiwiX2lzS2VwdEFsaXZlIiwiX2NvbnRleHREYXRhIiwiX29CaW5kaW5nIiwiX2lzSW5hY3RpdmUiLCJpc0EiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJzQ2xhc3NOYW1lIiwiZ2V0UHJvcGVydHkiLCJrZXkiLCJyZXF1ZXN0UHJvcGVydHkiLCJrZXlPcktleXMiLCJBcnJheSIsImlzQXJyYXkiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1hcCIsInJlcXVlc3RPYmplY3QiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJzZXRLZWVwQWxpdmUiLCJib29sIiwiX2ZuT25CZWZvcmVEZXN0cm95IiwiX2JSZXF1ZXN0TWVzc2FnZXMiLCJpc0tlZXBBbGl2ZSIsIk1vY2tDb250ZXh0IiwiY3JlYXRlTW9ja0V2ZW50IiwicGFyYW1zIiwic291cmNlIiwiRXZlbnQiLCJfcGFyYW1zIiwiZ2V0U291cmNlIiwibW9ja1JldHVyblZhbHVlIiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsImdldFBhcmFtZXRlcnMiLCJNb2NrRXZlbnQiLCJjcmVhdGVNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dERhdGEiLCJvTW9ja01vZGVsIiwiT0RhdGFMaXN0QmluZGluZyIsIl9hTW9ja0NvbnRleHRzIiwiY29udGV4dERhdGEiLCJfbW9ja01vZGVsIiwic2V0TW9kZWwiLCJtb2RlbCIsInJlcXVlc3RDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImdldENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIk1vY2tMaXN0QmluZGluZyIsImNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmciLCJPRGF0YVByb3BlcnR5QmluZGluZyIsIl92YWx1ZSIsIl9wYXRoIiwiZ2V0VmFsdWUiLCJNb2NrUHJvcGVydHlCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmciLCJhQmluZGluZ3MiLCJDb21wb3NpdGVCaW5kaW5nIiwiX2FCaW5kaW5ncyIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJPRGF0YUNvbnRleHRCaW5kaW5nIiwibW9ja01vZGVsIiwib01vY2tDb250ZXh0IiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIm9Nb2RlbCIsImdldEJvdW5kQ29udGV4dCIsImV4ZWN1dGUiLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsIk1vY2tDb250ZXh0QmluZGluZyIsImNyZWF0ZU1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJPRGF0YU1ldGFNb2RlbCIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0Iiwic1BhdGgiLCIkcGF0aCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJtZXRhbW9kZWwiLCJNb2NrTWV0YU1vZGVsIiwiY3JlYXRlTW9ja01vZGVsIiwib01vY2tMaXN0QmluZGluZyIsIm9Nb2NrQ29udGV4dEJpbmRpbmciLCJPRGF0YU1vZGVsIiwiZm5PcHRpbWlzdGljQmF0Y2hFbmFibGVyIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwic2V0TWV0YU1vZGVsIiwib01ldGFNb2RlbCIsImJpbmRMaXN0IiwiYmluZENvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJNb2NrTW9kZWwiLCJjcmVhdGVNb2NrTW9kZWxGcm9tTGlzdEJpbmRpbmciLCJjcmVhdGVNb2NrTW9kZWxGcm9tQ29udGV4dEJpbmRpbmciLCJ1bmRlZmluZWQiLCJjcmVhdGVNb2NrVmlldyIsIlZpZXciLCJNb2NrVmlldyIsImNyZWF0ZU1vY2tDb250cm9sbGVyIiwiQ29udHJvbGxlciIsIl9yb3V0aW5nIiwiSW50ZXJuYWxSb3V0aW5nIiwiX3NpZGVFZmZlY3RzIiwiU2lkZUVmZmVjdHMiLCJlZGl0RmxvdyIsIkVkaXRGbG93Iiwic2hhcmUiLCJTaGFyZSIsImNvbGxhYm9yYXRpdmVEcmFmdCIsIkNvbGxhYm9yYXRpdmVEcmFmdCIsInJlY29tbWVuZGF0aW9ucyIsIlJlY29tbWVuZGF0aW9ucyIsImdldEFwcENvbXBvbmVudCIsImplc3QiLCJmbiIsIkFwcENvbXBvbmVudCIsImdldFZpZXciLCJNb2NrQ29udHJvbGxlciIsIm1vY2tNVkMiLCJleGlzdGluZyIsInZpZXciLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImdldFRleHQiLCJ0ZXh0SUQiLCJwYXJhbWV0ZXJzIiwibWV0YVBhdGgiLCJyZXNvdXJjZU1vZGVsIiwiUmVzb3VyY2VNb2RlbCIsImJ1bmRsZU5hbWUiLCJlbmhhbmNlV2l0aCIsImFzeW5jIiwiY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXaXRoTW9jayB9IGZyb20gXCJAc2FwLXV4L2plc3QtbW9jay11aTUvZGlzdC9nZW5lcmljXCI7XG5pbXBvcnQgeyBtb2NrIH0gZnJvbSBcIkBzYXAtdXgvamVzdC1tb2NrLXVpNS9kaXN0L2dlbmVyaWNcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQ29sbGFib3JhdGl2ZURyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db2xsYWJvcmF0aXZlRHJhZnRcIjtcbmltcG9ydCBFZGl0RmxvdyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRWRpdEZsb3dcIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IFJlY29tbWVuZGF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUmVjb21tZW5kYXRpb25zXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NpZGVFZmZlY3RzXCI7XG5pbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL21kYy9Db250cm9sXCI7XG5pbXBvcnQgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YVByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFxuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udGV4dCA9IFdpdGhNb2NrPENvbnRleHQ+ICYge1xuXHRfaXNLZXB0QWxpdmU6IGJvb2xlYW47XG5cdF9jb250ZXh0RGF0YTogYW55O1xuXHRfb0JpbmRpbmc6IGFueTtcblx0X2lzSW5hY3RpdmU6IGJvb2xlYW47XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHREYXRhIEEgbWFwIG9mIHRoZSBkaWZmZXJlbnQgcHJvcGVydGllcyBvZiB0aGUgY29udGV4dC4gVGhlIHZhbHVlIGZvciB0aGUga2V5ICckcGF0aCcgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgJ2dldFBhdGgnIG1ldGhvZFxuICogQHBhcmFtIG9CaW5kaW5nIFRoZSBiaW5kaW5nIG9mIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gaXNJbmFjdGl2ZSBJcyB0aGUgY29udGV4dCBpbmlhY3RpdmUgb3Igbm90XG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrQ29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQob0NvbnRleHREYXRhPzogYW55LCBvQmluZGluZz86IGFueSwgaXNJbmFjdGl2ZT86IGJvb2xlYW4pOiBNb2NrQ29udGV4dCB7XG5cdC8vIFVnbHkgd29ya2Fyb3VuZCB0byBnZXQgYSBwcm9wZXIgbW9jayBwYmplY3QsIGFzIENvbnRleHQgaXNuJ3QgcHJvcGVybHkgZXhwb3J0ZWQgZnJvbSBVSTVcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPYmplY3QuZ2V0UHJvdG90eXBlT2YoKENvbnRleHQgYXMgYW55KS5jcmVhdGVOZXdDb250ZXh0KG51bGwsIG51bGwsIFwiL2VcIikpKSBhcyBNb2NrQ29udGV4dDtcblx0bW9ja2VkLl9pc0tlcHRBbGl2ZSA9IGZhbHNlO1xuXHRtb2NrZWQuX2NvbnRleHREYXRhID0gb0NvbnRleHREYXRhIHx8IHt9O1xuXHRtb2NrZWQuX29CaW5kaW5nID0gb0JpbmRpbmc7XG5cdG1vY2tlZC5faXNJbmFjdGl2ZSA9ICEhaXNJbmFjdGl2ZTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleU9yS2V5czogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShrZXlPcktleXMpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleU9yS2V5cy5tYXAoKGtleSkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtrZXldKSk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9jb250ZXh0RGF0YVtrZXlPcktleXNdKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RPYmplY3QubW9ja0ltcGxlbWVudGF0aW9uKChrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuXHRcdHJldHVybiBrZXkgPyBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9jb250ZXh0RGF0YVtrZXldKSA6IG1vY2tlZC5fY29udGV4dERhdGE7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5zZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0bW9ja2VkLl9jb250ZXh0RGF0YVtrZXldID0gdmFsdWU7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigocGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0bGV0IHJlc3VsdCA9IHBhdGggPyBtb2NrZWQuX2NvbnRleHREYXRhW3BhdGhdIDogbW9ja2VkLl9jb250ZXh0RGF0YTtcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgbW9ja2VkLl9jb250ZXh0RGF0YSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0UGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtcIiRwYXRoXCJdKTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9vQmluZGluZyk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX29CaW5kaW5nPy5nZXRNb2RlbCgpKTtcblx0bW9ja2VkLm1vY2suc2V0S2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoYm9vbDogYm9vbGVhbiwgX2ZuT25CZWZvcmVEZXN0cm95PzogYW55LCBfYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pID0+IHtcblx0XHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gYm9vbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzS2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX2lzS2VwdEFsaXZlKTtcblx0bW9ja2VkLm1vY2suaXNJbmFjdGl2ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9pc0luYWN0aXZlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0OiBuZXcgKG9WYWx1ZXM/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbikgPT4gTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuYmFzZS5FdmVudFxuICovXG5leHBvcnQgdHlwZSBNb2NrRXZlbnQgPSBXaXRoTW9jazxFdmVudD4gJiB7XG5cdF9wYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrRXZlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnRcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tFdmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50KHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LCBzb3VyY2U/OiBDb250cm9sKTogTW9ja0V2ZW50IHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhFdmVudCkgYXMgTW9ja0V2ZW50O1xuXHRtb2NrZWQuX3BhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuXHRpZiAoc291cmNlKSB7XG5cdFx0bW9ja2VkLm1vY2suZ2V0U291cmNlLm1vY2tSZXR1cm5WYWx1ZShzb3VyY2UpO1xuXHR9XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5nZXRQYXJhbWV0ZXIubW9ja0ltcGxlbWVudGF0aW9uKChuYW1lKSA9PiBtb2NrZWQuX3BhcmFtc1tuYW1lXSk7XG5cdG1vY2tlZC5tb2NrLmdldFBhcmFtZXRlcnMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9wYXJhbXM7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrRXZlbnQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tFdmVudDogbmV3IChwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBNb2NrRXZlbnQgPSBjcmVhdGVNb2NrRXZlbnQgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0xpc3RCaW5kaW5nID0gV2l0aE1vY2s8T0RhdGFMaXN0QmluZGluZz4gJiB7XG5cdF9hTW9ja0NvbnRleHRzOiBNb2NrQ29udGV4dFtdO1xuXHRfbW9ja01vZGVsPzogTW9ja01vZGVsO1xuXG5cdC8qKlxuXHQgKiBVdGlsaXR5IG1ldGhvZCB0byBzZXQgdGhlIG1vZGVsIG9mIHRoZSBMaXN0QmluZGluZ1xuXHQgKi9cblx0c2V0TW9kZWw6IChtb2RlbDogTW9ja01vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0xpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBhQ29udGV4dERhdGEgQW4gYXJyYXkgb2Ygb2JqZWN0cyBob2xkaW5nIHRoZSBkaWZmZXJlbnQgcHJvcGVydGllcyBvZiB0aGUgY29udGV4dHMgcmVmZXJlbmNlZCBieSB0aGUgTGlzdEJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgTGlzdEJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tMaXN0QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0xpc3RCaW5kaW5nKGFDb250ZXh0RGF0YT86IGFueVtdLCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja0xpc3RCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YUxpc3RCaW5kaW5nKSBhcyBNb2NrTGlzdEJpbmRpbmc7XG5cdGFDb250ZXh0RGF0YSA9IGFDb250ZXh0RGF0YSB8fCBbXTtcblx0bW9ja2VkLl9hTW9ja0NvbnRleHRzID0gYUNvbnRleHREYXRhLm1hcCgoY29udGV4dERhdGEpID0+IHtcblx0XHRyZXR1cm4gY3JlYXRlTW9ja0NvbnRleHQoY29udGV4dERhdGEsIG1vY2tlZCk7XG5cdH0pO1xuXHRtb2NrZWQuX21vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1vZGVsID0gKG1vZGVsOiBNb2NrTW9kZWwpID0+IHtcblx0XHRtb2NrZWQuX21vY2tNb2RlbCA9IG1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9hTW9ja0NvbnRleHRzKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldEN1cnJlbnRDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FNb2NrQ29udGV4dHM7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRBbGxDdXJyZW50Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0TW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRVcGRhdGVHcm91cElkLm1vY2tSZXR1cm5WYWx1ZShcImF1dG9cIik7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tMaXN0QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0xpc3RCaW5kaW5nOiBuZXcgKGFDb250ZXh0cz86IGFueVtdLCBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpID0+IE1vY2tMaXN0QmluZGluZyA9IGNyZWF0ZU1vY2tMaXN0QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja1Byb3BlcnR5QmluZGluZyA9IFdpdGhNb2NrPE9EYXRhUHJvcGVydHlCaW5kaW5nPiAmIHtcblx0X3ZhbHVlPzogYW55O1xuXHRfcGF0aD86IHN0cmluZztcblx0X21vY2tNb2RlbD86IE1vY2tNb2RlbDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tQcm9wZXJ0eUJpbmRpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSByZXR1cm5kIGJ5IHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrUHJvcGVydHlCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrUHJvcGVydHlCaW5kaW5nKHZhbHVlOiBhbnksIHBhdGg/OiBzdHJpbmcsIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrUHJvcGVydHlCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YVByb3BlcnR5QmluZGluZykgYXMgTW9ja1Byb3BlcnR5QmluZGluZztcblx0bW9ja2VkLl9tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXHRtb2NrZWQuX3ZhbHVlID0gdmFsdWU7XG5cdG1vY2tlZC5fcGF0aCA9IHBhdGg7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fbW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0VmFsdWUubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl92YWx1ZTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFBhdGgubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9wYXRoO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja1Byb3BlcnR5QmluZGluZzogbmV3ICh2YWx1ZTogYW55LCBvTW9ja01vZGVsPzogTW9ja01vZGVsKSA9PiBNb2NrUHJvcGVydHlCaW5kaW5nID0gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29tcG9zaXRlQmluZGluZyA9IFdpdGhNb2NrPENvbXBvc2l0ZUJpbmRpbmc+ICYge1xuXHRfYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW107XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29tcG9zaXRlQmluZGluZy5cbiAqXG4gKiBAcGFyYW0gYUJpbmRpbmdzIFRoZSBiaW5kaW5ncyBvZiB0aGUgQ29tcG9zaXRlQmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbXBvc2l0ZUJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nKGFCaW5kaW5nczogTW9ja1Byb3BlcnR5QmluZGluZ1tdKTogTW9ja0NvbXBvc2l0ZUJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbXBvc2l0ZUJpbmRpbmcpIGFzIE1vY2tDb21wb3NpdGVCaW5kaW5nO1xuXHRtb2NrZWQuX2FCaW5kaW5ncyA9IGFCaW5kaW5ncztcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCaW5kaW5ncy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FCaW5kaW5ncztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFZhbHVlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5nZXRWYWx1ZSgpKTtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrQ29tcG9zaXRlQmluZGluZzogbmV3IChhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXSkgPT4gTW9ja0NvbXBvc2l0ZUJpbmRpbmcgPSBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udGV4dEJpbmRpbmcgPSBXaXRoTW9jazxPRGF0YUNvbnRleHRCaW5kaW5nPiAmIHtcblx0b01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblx0aXNLZXB0QWxpdmU6IGJvb2xlYW47XG5cdG1vY2tNb2RlbD86IE1vY2tNb2RlbDtcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbCBNb2NrQ29udGV4dCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdGdldEludGVybmFsTW9ja0NvbnRleHQ6ICgpID0+IE1vY2tDb250ZXh0O1xuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtb2RlbCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdHNldE1vZGVsOiAob01vZGVsOiBNb2NrTW9kZWwpID0+IHZvaWQ7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udGV4dEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHBhcmFtIG9Nb2NrTW9kZWwgVGhlIG1vZGVsIG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbnRleHRCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcob0NvbnRleHQ/OiBhbnksIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhQ29udGV4dEJpbmRpbmcpIGFzIE1vY2tDb250ZXh0QmluZGluZztcblx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cdG1vY2tlZC5vTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgbW9ja2VkKTtcblxuXHQvLyBVdGlsaXR5IEFQSVxuXHRtb2NrZWQuZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fTtcblx0bW9ja2VkLnNldE1vZGVsID0gKG9Nb2RlbDogTW9ja01vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCb3VuZENvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5leGVjdXRlLm1vY2tSZXNvbHZlZFZhbHVlKHRydWUpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0QmluZGluZzogbmV3IChvQ29udGV4dD86IGFueSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCkgPT4gTW9ja0NvbnRleHRCaW5kaW5nID0gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrTWV0YU1vZGVsID0gV2l0aE1vY2s8T0RhdGFNZXRhTW9kZWw+ICYge1xuXHRvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01ldGFNb2RlbC5cbiAqXG4gKiBAcGFyYW0gb01ldGFEYXRhIEEgbWFwIG9mIHRoZSBkaWZmZXJlbnQgbWV0YWRhdGEgcHJvcGVydGllcyBvZiB0aGUgTWV0YU1vZGVsIChwYXRoIC0+IHZhbHVlKS5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNZXRhTW9kZWwob01ldGFEYXRhPzogYW55KTogTW9ja01ldGFNb2RlbCB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFNZXRhTW9kZWwpIGFzIE1vY2tNZXRhTW9kZWw7XG5cdG1vY2tlZC5vTWV0YUNvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0TWV0YUNvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIGNyZWF0ZU1vY2tDb250ZXh0KHsgJHBhdGg6IHNQYXRoIH0pO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQub01ldGFDb250ZXh0LmdldFByb3BlcnR5KHNQYXRoKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmNyZWF0ZUJpbmRpbmdDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBjcmVhdGVNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1ldGFQYXRoLm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IG1ldGFtb2RlbCA9IG5ldyBPRGF0YU1ldGFNb2RlbCgpO1xuXHRcdHJldHVybiBzUGF0aCA/IG1ldGFtb2RlbC5nZXRNZXRhUGF0aChzUGF0aCkgOiBzUGF0aDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFwiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja01ldGFNb2RlbCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja01ldGFNb2RlbDogbmV3IChvTWV0YURhdGE/OiBhbnkpID0+IE1vY2tNZXRhTW9kZWwgPSBjcmVhdGVNb2NrTWV0YU1vZGVsIGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tNb2RlbCA9IFdpdGhNb2NrPE9EYXRhTW9kZWw+ICYge1xuXHRvTWV0YU1vZGVsPzogTW9ja01ldGFNb2RlbDtcblx0bW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nO1xuXHRtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmc7XG5cblx0LyoqXG5cdCAqIFV0aWxpdHkgbWV0aG9kIHRvIHNldCB0aGUgbWV0YW1vZGVsIG9mIHRoZSBNb2NrTW9kZWxcblx0ICovXG5cdHNldE1ldGFNb2RlbDogKG9NZXRhTW9kZWw6IE1vY2tNZXRhTW9kZWwpID0+IHZvaWQ7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrTW9kZWwuXG4gKlxuICogQHBhcmFtIG9Nb2NrTGlzdEJpbmRpbmcgQSBsaXN0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kTGlzdC5cbiAqIEBwYXJhbSBvTW9ja0NvbnRleHRCaW5kaW5nIEEgY29udGV4dCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZENvbnRleHQuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbChvTW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBvTW9ja0NvbnRleHRCaW5kaW5nPzogTW9ja0NvbnRleHRCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YU1vZGVsKSBhcyBNb2NrTW9kZWw7XG5cdG1vY2tlZC5mbk9wdGltaXN0aWNCYXRjaEVuYWJsZXIgPSBudWxsO1xuXHRtb2NrZWQubW9ja0xpc3RCaW5kaW5nID0gb01vY2tMaXN0QmluZGluZztcblx0bW9ja2VkLm1vY2tDb250ZXh0QmluZGluZyA9IG9Nb2NrQ29udGV4dEJpbmRpbmc7XG5cdGlmIChvTW9ja0xpc3RCaW5kaW5nKSB7XG5cdFx0b01vY2tMaXN0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cdGlmIChvTW9ja0NvbnRleHRCaW5kaW5nKSB7XG5cdFx0b01vY2tDb250ZXh0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1ldGFNb2RlbCA9IChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suYmluZExpc3QubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm1vY2tMaXN0QmluZGluZztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmJpbmRDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNZXRhTW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9NZXRhTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrTW9kZWw6IG5ldyAob01vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgb01vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykgPT4gTW9ja01vZGVsID1cblx0Y3JlYXRlTW9ja01vZGVsIGFzIGFueTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGxpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0xpc3RCaW5kaW5nIEEgbGlzdCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZExpc3QuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21MaXN0QmluZGluZyhvTW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKG9Nb2NrTGlzdEJpbmRpbmcpO1xufVxuLyoqXG4gKiAgRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGNvbnRleHRCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0NvbnRleHRCaW5kaW5nIEEgY29udGV4dCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZENvbnRleHQuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21Db250ZXh0QmluZGluZyhvTW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKHVuZGVmaW5lZCwgb01vY2tDb250ZXh0QmluZGluZyk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuY29yZS5tdmMuVmlld1xuICovXG5leHBvcnQgdHlwZSBNb2NrVmlldyA9IFdpdGhNb2NrPEZFVmlldz47XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tWaWV3LlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tWaWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrVmlldygpOiBNb2NrVmlldyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soVmlldyk7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkuY29yZS5tdmMuVmlld1wiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkIGFzIE1vY2tWaWV3O1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1ZpZXcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tWaWV3OiBuZXcgKCkgPT4gTW9ja1ZpZXcgPSBjcmVhdGVNb2NrVmlldyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAuZmUuY29yZS5QYWdlQ29udHJvbGxlclxuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udHJvbGxlciA9IFdpdGhNb2NrPENvbnRyb2xsZXI+ICYge1xuXHRfcm91dGluZzogV2l0aE1vY2s8SW50ZXJuYWxSb3V0aW5nPjtcblx0X3NpZGVFZmZlY3RzOiBXaXRoTW9jazxTaWRlRWZmZWN0cz47XG5cdGVkaXRGbG93OiBXaXRoTW9jazxFZGl0Rmxvdz47XG5cdHNoYXJlOiBXaXRoTW9jazxTaGFyZT47XG5cdHJlY29tbWVuZGF0aW9uczogV2l0aE1vY2s8UmVjb21tZW5kYXRpb25zPjtcblx0Y29sbGFib3JhdGl2ZURyYWZ0OiBXaXRoTW9jazxDb2xsYWJvcmF0aXZlRHJhZnQ+O1xuXHRnZXRBcHBDb21wb25lbnQ6ICgpID0+IFdpdGhNb2NrPEFwcENvbXBvbmVudD47XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udHJvbGxlci5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrQ29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTogTW9ja0NvbnRyb2xsZXIge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbnRyb2xsZXIpIGFzIE1vY2tDb250cm9sbGVyO1xuXHRtb2NrZWQuX3JvdXRpbmcgPSBtb2NrKEludGVybmFsUm91dGluZyk7XG5cdG1vY2tlZC5fc2lkZUVmZmVjdHMgPSBtb2NrKFNpZGVFZmZlY3RzKTtcblx0bW9ja2VkLmVkaXRGbG93ID0gbW9jayhFZGl0Rmxvdyk7XG5cdG1vY2tlZC5zaGFyZSA9IG1vY2soU2hhcmUpO1xuXHRtb2NrZWQuY29sbGFib3JhdGl2ZURyYWZ0ID0gbW9jayhDb2xsYWJvcmF0aXZlRHJhZnQpO1xuXHRtb2NrZWQucmVjb21tZW5kYXRpb25zID0gbW9jayhSZWNvbW1lbmRhdGlvbnMpO1xuXHRtb2NrZWQuZ2V0QXBwQ29tcG9uZW50ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShtb2NrKEFwcENvbXBvbmVudCkpO1xuXHQvLyBEZWZhdWx0IEJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmdldFZpZXcubW9ja1JldHVyblZhbHVlKGNyZWF0ZU1vY2tWaWV3KCkpO1xuXHRtb2NrZWQubW9jay5pc0EubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gbW9ja0NvbnRyb2xsZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250cm9sbGVyOiBuZXcgKCkgPT4gTW9ja0NvbnRyb2xsZXIgPSBjcmVhdGVNb2NrQ29udHJvbGxlciBhcyBhbnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVZDTW9jayB7XG5cdG1vZGVsOiBNb2NrTW9kZWw7XG5cdHZpZXc6IE1vY2tWaWV3O1xuXHRjb250cm9sbGVyOiBNb2NrQ29udHJvbGxlcjtcbn1cbi8qKlxuICogR2VuZXJhdGUgbW9kZWwsIHZpZXcgYW5kIGNvbnRyb2xsZXIgbW9ja3MgdGhhdCByZWZlciB0byBlYWNoIG90aGVyLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZyBPcHRpb25hbCBleGlzdGluZyBtb2NrZWQgaW5zdGFuY2VzIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAqIEByZXR1cm5zIE1vY2tlZCBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBpbnN0YW5jZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tNVkMoZXhpc3Rpbmc/OiBQYXJ0aWFsPE1WQ01vY2s+KTogTVZDTW9jayB7XG5cdGNvbnN0IG1vZGVsID0gZXhpc3Rpbmc/Lm1vZGVsIHx8IGNyZWF0ZU1vY2tNb2RlbCgpO1xuXHRjb25zdCB2aWV3ID0gZXhpc3Rpbmc/LnZpZXcgfHwgY3JlYXRlTW9ja1ZpZXcoKTtcblx0Y29uc3QgY29udHJvbGxlciA9IGV4aXN0aW5nPy5jb250cm9sbGVyIHx8IGNyZWF0ZU1vY2tDb250cm9sbGVyKCk7XG5cblx0dmlldy5tb2NrLmdldENvbnRyb2xsZXIubW9ja1JldHVyblZhbHVlKGNvbnRyb2xsZXIpO1xuXHR2aWV3Lm1vY2suZ2V0TW9kZWwubW9ja1JldHVyblZhbHVlKG1vZGVsKTtcblx0Y29udHJvbGxlci5tb2NrLmdldFZpZXcubW9ja1JldHVyblZhbHVlKHZpZXcpO1xuXG5cdHJldHVybiB7IG1vZGVsLCB2aWV3LCBjb250cm9sbGVyIH07XG59XG5cbi8qKlxuICogVG8gYmUgdXNlZCB0byBsb2FkIG1lc3NhZ2VzIGJ1bmRsZXMgZm9yIHRlc3RzIHdpdGhvdXQgYXBwL3BhZ2UgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB0ZXh0SUQgSUQgb2YgdGhlIFRleHRcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFycmF5IG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIHRleHRcbiAqIEBwYXJhbSBtZXRhUGF0aCBFbnRpdHkgc2V0IG5hbWUgb3IgYWN0aW9uIG5hbWUgdG8gb3ZlcmxvYWQgYSB0ZXh0XG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHQodGV4dElEOiBzdHJpbmcsIHBhcmFtZXRlcnM/OiBhbnlbXSwgbWV0YVBhdGg/OiBzdHJpbmcpIHtcblx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IG5ldyBSZXNvdXJjZU1vZGVsKHtcblx0XHRidW5kbGVOYW1lOiBcInNhcC5mZS5jb3JlLm1lc3NhZ2VidW5kbGVcIixcblx0XHRlbmhhbmNlV2l0aDogW3sgYnVuZGxlTmFtZTogXCJzYXAuZmUubWFjcm9zLm1lc3NhZ2VidW5kbGVcIiB9LCB7IGJ1bmRsZU5hbWU6IFwic2FwLmZlLnRlbXBsYXRlcy5tZXNzYWdlYnVuZGxlXCIgfV0sXG5cdFx0YXN5bmM6IGZhbHNlXG5cdH0pO1xuXHRyZXR1cm4gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KHRleHRJRCwgcGFyYW1ldGVycywgbWV0YVBhdGgpO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIFJlc291cmNlTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja1Jlc291cmNlTW9kZWwgPSBXaXRoTW9jazxSZXNvdXJjZU1vZGVsPjtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja1ZpZXcuXG4gKlxuICogQHJldHVybnMgQSBuZXcgTW9ja1ZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsKCk6IE1vY2tSZXNvdXJjZU1vZGVsIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhSZXNvdXJjZU1vZGVsKTtcblx0bW9ja2VkLmdldFRleHQgPSBqZXN0LmZuKCkubW9ja0ltcGxlbWVudGF0aW9uKGdldFRleHQpO1xuXHRyZXR1cm4gbW9ja2VkO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7RUFnQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNBLGlCQUFpQixDQUFDQyxZQUFrQixFQUFFQyxRQUFjLEVBQUVDLFVBQW9CLEVBQWU7SUFDeEc7SUFDQSxNQUFNQyxNQUFNLEdBQUdDLElBQUksQ0FBQ0MsTUFBTSxDQUFDQyxjQUFjLENBQUVDLE9BQU8sQ0FBU0MsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFnQjtJQUM5R0wsTUFBTSxDQUFDTSxZQUFZLEdBQUcsS0FBSztJQUMzQk4sTUFBTSxDQUFDTyxZQUFZLEdBQUdWLFlBQVksSUFBSSxDQUFDLENBQUM7SUFDeENHLE1BQU0sQ0FBQ1EsU0FBUyxHQUFHVixRQUFRO0lBQzNCRSxNQUFNLENBQUNTLFdBQVcsR0FBRyxDQUFDLENBQUNWLFVBQVU7O0lBRWpDO0lBQ0FDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUyxHQUFHLENBQUNDLGtCQUFrQixDQUFFQyxVQUFrQixJQUFLO01BQzFELE9BQU9BLFVBQVUsS0FBSywrQkFBK0I7SUFDdEQsQ0FBQyxDQUFDO0lBQ0ZaLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDWSxXQUFXLENBQUNGLGtCQUFrQixDQUFFRyxHQUFXLElBQUs7TUFDM0QsT0FBT2QsTUFBTSxDQUFDTyxZQUFZLENBQUNPLEdBQUcsQ0FBQztJQUNoQyxDQUFDLENBQUM7SUFDRmQsTUFBTSxDQUFDQyxJQUFJLENBQUNjLGVBQWUsQ0FBQ0osa0JBQWtCLENBQUVLLFNBQTRCLElBQUs7TUFDaEYsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLFNBQVMsQ0FBQyxFQUFFO1FBQzdCLE9BQU9HLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDSixTQUFTLENBQUNLLEdBQUcsQ0FBRVAsR0FBRyxJQUFLZCxNQUFNLENBQUNPLFlBQVksQ0FBQ08sR0FBRyxDQUFDLENBQUMsQ0FBQztNQUN6RTtNQUNBLE9BQU9LLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDcEIsTUFBTSxDQUFDTyxZQUFZLENBQUNTLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztJQUNGaEIsTUFBTSxDQUFDQyxJQUFJLENBQUNxQixhQUFhLENBQUNYLGtCQUFrQixDQUFFRyxHQUF1QixJQUFLO01BQ3pFLE9BQU9BLEdBQUcsR0FBR0ssT0FBTyxDQUFDQyxPQUFPLENBQUNwQixNQUFNLENBQUNPLFlBQVksQ0FBQ08sR0FBRyxDQUFDLENBQUMsR0FBR2QsTUFBTSxDQUFDTyxZQUFZO0lBQzdFLENBQUMsQ0FBQztJQUNGUCxNQUFNLENBQUNDLElBQUksQ0FBQ3NCLFdBQVcsQ0FBQ1osa0JBQWtCLENBQUMsQ0FBQ0csR0FBVyxFQUFFVSxLQUFVLEtBQUs7TUFDdkV4QixNQUFNLENBQUNPLFlBQVksQ0FBQ08sR0FBRyxDQUFDLEdBQUdVLEtBQUs7TUFDaEMsT0FBT3hCLE1BQU0sQ0FBQ08sWUFBWSxDQUFDTyxHQUFHLENBQUM7SUFDaEMsQ0FBQyxDQUFDO0lBRUZkLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDd0IsU0FBUyxDQUFDZCxrQkFBa0IsQ0FBRWUsSUFBWSxJQUFLO01BQzFELElBQUlDLE1BQU0sR0FBR0QsSUFBSSxHQUFHMUIsTUFBTSxDQUFDTyxZQUFZLENBQUNtQixJQUFJLENBQUMsR0FBRzFCLE1BQU0sQ0FBQ08sWUFBWTtNQUVuRSxJQUFJLENBQUNvQixNQUFNLElBQUlELElBQUksSUFBSUEsSUFBSSxDQUFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDOUMsTUFBTUMsS0FBSyxHQUFHSCxJQUFJLENBQUNJLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDN0JILE1BQU0sR0FBR0UsS0FBSyxDQUFDRSxNQUFNLENBQUMsQ0FBQ0MsR0FBRyxFQUFFQyxJQUFTLEtBQUs7VUFDekNELEdBQUcsR0FBR0MsSUFBSSxHQUFHRCxHQUFHLENBQUNDLElBQUksQ0FBQyxHQUFHRCxHQUFHO1VBQzVCLE9BQU9BLEdBQUc7UUFDWCxDQUFDLEVBQUVoQyxNQUFNLENBQUNPLFlBQVksQ0FBQztNQUN4QjtNQUVBLE9BQU9vQixNQUFNO0lBQ2QsQ0FBQyxDQUFDO0lBRUYzQixNQUFNLENBQUNDLElBQUksQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLGtCQUFrQixDQUFDLE1BQU1YLE1BQU0sQ0FBQ08sWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFFUCxNQUFNLENBQUNDLElBQUksQ0FBQ2tDLFVBQVUsQ0FBQ3hCLGtCQUFrQixDQUFDLE1BQU1YLE1BQU0sQ0FBQ1EsU0FBUyxDQUFDO0lBQ2pFUixNQUFNLENBQUNDLElBQUksQ0FBQ21DLFFBQVEsQ0FBQ3pCLGtCQUFrQixDQUFDO01BQUE7TUFBQSw0QkFBTVgsTUFBTSxDQUFDUSxTQUFTLHNEQUFoQixrQkFBa0I0QixRQUFRLEVBQUU7SUFBQSxFQUFDO0lBQzNFcEMsTUFBTSxDQUFDQyxJQUFJLENBQUNvQyxZQUFZLENBQUMxQixrQkFBa0IsQ0FBQyxDQUFDMkIsSUFBYSxFQUFFQyxrQkFBd0IsRUFBRUMsaUJBQTJCLEtBQUs7TUFDckh4QyxNQUFNLENBQUNNLFlBQVksR0FBR2dDLElBQUk7SUFDM0IsQ0FBQyxDQUFDO0lBQ0Z0QyxNQUFNLENBQUNDLElBQUksQ0FBQ3dDLFdBQVcsQ0FBQzlCLGtCQUFrQixDQUFDLE1BQU1YLE1BQU0sQ0FBQ00sWUFBWSxDQUFDO0lBQ3JFTixNQUFNLENBQUNDLElBQUksQ0FBQ0YsVUFBVSxDQUFDWSxrQkFBa0IsQ0FBQyxNQUFNWCxNQUFNLENBQUNTLFdBQVcsQ0FBQztJQUVuRSxPQUFPVCxNQUFNO0VBQ2Q7RUFDQTtBQUNBO0FBQ0E7RUFGQTtFQUdPLE1BQU0wQyxXQUFxRixHQUFHOUMsaUJBQXdCOztFQUU3SDtBQUNBO0FBQ0E7RUFGQTtFQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVMrQyxlQUFlLENBQUNDLE1BQW1DLEVBQUVDLE1BQWdCLEVBQWE7SUFDakcsTUFBTTdDLE1BQU0sR0FBR0MsSUFBSSxDQUFDNkMsS0FBSyxDQUFjO0lBQ3ZDOUMsTUFBTSxDQUFDK0MsT0FBTyxHQUFHSCxNQUFNLElBQUksQ0FBQyxDQUFDO0lBRTdCLElBQUlDLE1BQU0sRUFBRTtNQUNYN0MsTUFBTSxDQUFDQyxJQUFJLENBQUMrQyxTQUFTLENBQUNDLGVBQWUsQ0FBQ0osTUFBTSxDQUFDO0lBQzlDOztJQUVBO0lBQ0E3QyxNQUFNLENBQUNDLElBQUksQ0FBQ2lELFlBQVksQ0FBQ3ZDLGtCQUFrQixDQUFFd0MsSUFBSSxJQUFLbkQsTUFBTSxDQUFDK0MsT0FBTyxDQUFDSSxJQUFJLENBQUMsQ0FBQztJQUMzRW5ELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbUQsYUFBYSxDQUFDekMsa0JBQWtCLENBQUMsTUFBTTtNQUNsRCxPQUFPWCxNQUFNLENBQUMrQyxPQUFPO0lBQ3RCLENBQUMsQ0FBQztJQUVGLE9BQU8vQyxNQUFNO0VBQ2Q7RUFDQTtBQUNBO0FBQ0E7RUFGQTtFQUdPLE1BQU1xRCxTQUE2RCxHQUFHVixlQUFzQjs7RUFFbkc7QUFDQTtBQUNBO0VBRkE7RUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNXLHFCQUFxQixDQUFDQyxZQUFvQixFQUFFQyxVQUFzQixFQUFtQjtJQUNwRyxNQUFNeEQsTUFBTSxHQUFHQyxJQUFJLENBQUN3RCxnQkFBZ0IsQ0FBb0I7SUFDeERGLFlBQVksR0FBR0EsWUFBWSxJQUFJLEVBQUU7SUFDakN2RCxNQUFNLENBQUMwRCxjQUFjLEdBQUdILFlBQVksQ0FBQ2xDLEdBQUcsQ0FBRXNDLFdBQVcsSUFBSztNQUN6RCxPQUFPL0QsaUJBQWlCLENBQUMrRCxXQUFXLEVBQUUzRCxNQUFNLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0lBQ0ZBLE1BQU0sQ0FBQzRELFVBQVUsR0FBR0osVUFBVTs7SUFFOUI7SUFDQXhELE1BQU0sQ0FBQzZELFFBQVEsR0FBSUMsS0FBZ0IsSUFBSztNQUN2QzlELE1BQU0sQ0FBQzRELFVBQVUsR0FBR0UsS0FBSztJQUMxQixDQUFDOztJQUVEO0lBQ0E5RCxNQUFNLENBQUNDLElBQUksQ0FBQ1MsR0FBRyxDQUFDQyxrQkFBa0IsQ0FBRUMsVUFBa0IsSUFBSztNQUMxRCxPQUFPQSxVQUFVLEtBQUssd0NBQXdDO0lBQy9ELENBQUMsQ0FBQztJQUNGWixNQUFNLENBQUNDLElBQUksQ0FBQzhELGVBQWUsQ0FBQ3BELGtCQUFrQixDQUFDLE1BQU07TUFDcEQsT0FBT1EsT0FBTyxDQUFDQyxPQUFPLENBQUNwQixNQUFNLENBQUMwRCxjQUFjLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0lBQ0YxRCxNQUFNLENBQUNDLElBQUksQ0FBQytELGtCQUFrQixDQUFDckQsa0JBQWtCLENBQUMsTUFBTTtNQUN2RCxPQUFPWCxNQUFNLENBQUMwRCxjQUFjO0lBQzdCLENBQUMsQ0FBQztJQUNGMUQsTUFBTSxDQUFDQyxJQUFJLENBQUNnRSxxQkFBcUIsQ0FBQ3RELGtCQUFrQixDQUFDLE1BQU07TUFDMUQsT0FBT1gsTUFBTSxDQUFDMEQsY0FBYztJQUM3QixDQUFDLENBQUM7SUFDRjFELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDaUUsV0FBVyxDQUFDdkQsa0JBQWtCLENBQUMsTUFBTTtNQUNoRCxPQUFPWCxNQUFNLENBQUMwRCxjQUFjO0lBQzdCLENBQUMsQ0FBQztJQUNGMUQsTUFBTSxDQUFDQyxJQUFJLENBQUNtQyxRQUFRLENBQUN6QixrQkFBa0IsQ0FBQyxNQUFNO01BQzdDLE9BQU9YLE1BQU0sQ0FBQzRELFVBQVU7SUFDekIsQ0FBQyxDQUFDO0lBQ0Y1RCxNQUFNLENBQUNDLElBQUksQ0FBQ2tFLGdCQUFnQixDQUFDbEIsZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUVwRCxPQUFPakQsTUFBTTtFQUNkO0VBQ0E7QUFDQTtBQUNBO0VBRkE7RUFHTyxNQUFNb0UsZUFBa0YsR0FBR2QscUJBQTRCOztFQUU5SDtBQUNBO0FBQ0E7RUFGQTtFQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTZSx5QkFBeUIsQ0FBQzdDLEtBQVUsRUFBRUUsSUFBYSxFQUFFOEIsVUFBc0IsRUFBdUI7SUFDakgsTUFBTXhELE1BQU0sR0FBR0MsSUFBSSxDQUFDcUUsb0JBQW9CLENBQXdCO0lBQ2hFdEUsTUFBTSxDQUFDNEQsVUFBVSxHQUFHSixVQUFVO0lBQzlCeEQsTUFBTSxDQUFDdUUsTUFBTSxHQUFHL0MsS0FBSztJQUNyQnhCLE1BQU0sQ0FBQ3dFLEtBQUssR0FBRzlDLElBQUk7O0lBRW5CO0lBQ0ExQixNQUFNLENBQUNDLElBQUksQ0FBQ1MsR0FBRyxDQUFDQyxrQkFBa0IsQ0FBRUMsVUFBa0IsSUFBSztNQUMxRCxPQUFPQSxVQUFVLEtBQUssNENBQTRDO0lBQ25FLENBQUMsQ0FBQztJQUNGWixNQUFNLENBQUNDLElBQUksQ0FBQ21DLFFBQVEsQ0FBQ3pCLGtCQUFrQixDQUFDLE1BQU07TUFDN0MsT0FBT1gsTUFBTSxDQUFDNEQsVUFBVTtJQUN6QixDQUFDLENBQUM7SUFDRjVELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDd0UsUUFBUSxDQUFDOUQsa0JBQWtCLENBQUMsTUFBTTtNQUM3QyxPQUFPWCxNQUFNLENBQUN1RSxNQUFNO0lBQ3JCLENBQUMsQ0FBQztJQUNGdkUsTUFBTSxDQUFDQyxJQUFJLENBQUNpQyxPQUFPLENBQUN2QixrQkFBa0IsQ0FBQyxNQUFNO01BQzVDLE9BQU9YLE1BQU0sQ0FBQ3dFLEtBQUs7SUFDcEIsQ0FBQyxDQUFDO0lBRUYsT0FBT3hFLE1BQU07RUFDZDtFQUNBO0FBQ0E7QUFDQTtFQUZBO0VBR08sTUFBTTBFLG1CQUFvRixHQUFHTCx5QkFBZ0M7O0VBRXBJO0FBQ0E7QUFDQTtFQUZBO0VBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU00sMEJBQTBCLENBQUNDLFNBQWdDLEVBQXdCO0lBQ2xHLE1BQU01RSxNQUFNLEdBQUdDLElBQUksQ0FBQzRFLGdCQUFnQixDQUF5QjtJQUM3RDdFLE1BQU0sQ0FBQzhFLFVBQVUsR0FBR0YsU0FBUzs7SUFFN0I7SUFDQTVFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUyxHQUFHLENBQUNDLGtCQUFrQixDQUFFQyxVQUFrQixJQUFLO01BQzFELE9BQU9BLFVBQVUsS0FBSywrQkFBK0I7SUFDdEQsQ0FBQyxDQUFDO0lBQ0ZaLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDOEUsV0FBVyxDQUFDcEUsa0JBQWtCLENBQUMsTUFBTTtNQUNoRCxPQUFPWCxNQUFNLENBQUM4RSxVQUFVO0lBQ3pCLENBQUMsQ0FBQztJQUNGOUUsTUFBTSxDQUFDQyxJQUFJLENBQUN3RSxRQUFRLENBQUM5RCxrQkFBa0IsQ0FBQyxNQUFNO01BQzdDLE9BQU9YLE1BQU0sQ0FBQzhFLFVBQVUsQ0FBQ3pELEdBQUcsQ0FBRTJELE9BQU8sSUFBS0EsT0FBTyxDQUFDUCxRQUFRLEVBQUUsQ0FBQztJQUM5RCxDQUFDLENBQUM7SUFFRixPQUFPekUsTUFBTTtFQUNkO0VBQ0E7QUFDQTtBQUNBO0VBRkE7RUFHTyxNQUFNaUYsb0JBQW9GLEdBQUdOLDBCQUFpQzs7RUFFckk7QUFDQTtBQUNBO0VBRkE7RUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTTyx3QkFBd0IsQ0FBQ0MsUUFBYyxFQUFFM0IsVUFBc0IsRUFBc0I7SUFDcEcsTUFBTXhELE1BQU0sR0FBR0MsSUFBSSxDQUFDbUYsbUJBQW1CLENBQXVCO0lBQzlEcEYsTUFBTSxDQUFDcUYsU0FBUyxHQUFHN0IsVUFBVTtJQUM3QnhELE1BQU0sQ0FBQ3NGLFlBQVksR0FBRzFGLGlCQUFpQixDQUFDdUYsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFbkYsTUFBTSxDQUFDOztJQUUvRDtJQUNBQSxNQUFNLENBQUN1RixzQkFBc0IsR0FBRyxNQUFNO01BQ3JDLE9BQU92RixNQUFNLENBQUNzRixZQUFZO0lBQzNCLENBQUM7SUFDRHRGLE1BQU0sQ0FBQzZELFFBQVEsR0FBSTJCLE1BQWlCLElBQUs7TUFDeEN4RixNQUFNLENBQUNxRixTQUFTLEdBQUdHLE1BQU07SUFDMUIsQ0FBQzs7SUFFRDtJQUNBeEYsTUFBTSxDQUFDQyxJQUFJLENBQUNTLEdBQUcsQ0FBQ0Msa0JBQWtCLENBQUVDLFVBQWtCLElBQUs7TUFDMUQsT0FBT0EsVUFBVSxLQUFLLDJDQUEyQztJQUNsRSxDQUFDLENBQUM7SUFDRlosTUFBTSxDQUFDQyxJQUFJLENBQUN3RixlQUFlLENBQUM5RSxrQkFBa0IsQ0FBQyxNQUFNO01BQ3BELE9BQU9YLE1BQU0sQ0FBQ3NGLFlBQVk7SUFDM0IsQ0FBQyxDQUFDO0lBQ0Z0RixNQUFNLENBQUNDLElBQUksQ0FBQ21DLFFBQVEsQ0FBQ3pCLGtCQUFrQixDQUFDLE1BQU07TUFDN0MsT0FBT1gsTUFBTSxDQUFDcUYsU0FBUztJQUN4QixDQUFDLENBQUM7SUFDRnJGLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDeUYsT0FBTyxDQUFDQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFFM0MsT0FBTzNGLE1BQU07RUFDZDtFQUNBO0FBQ0E7QUFDQTtFQUZBO0VBR08sTUFBTTRGLGtCQUFzRixHQUFHVix3QkFBK0I7O0VBRXJJO0FBQ0E7QUFDQTtFQUZBO0VBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU1csbUJBQW1CLENBQUNDLFNBQWUsRUFBaUI7SUFDbkUsTUFBTTlGLE1BQU0sR0FBR0MsSUFBSSxDQUFDOEYsY0FBYyxDQUFrQjtJQUNwRC9GLE1BQU0sQ0FBQ2dHLFlBQVksR0FBR3BHLGlCQUFpQixDQUFDa0csU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDOztJQUV4RDtJQUNBOUYsTUFBTSxDQUFDQyxJQUFJLENBQUNnRyxjQUFjLENBQUN0RixrQkFBa0IsQ0FBRXVGLEtBQWEsSUFBSztNQUNoRSxPQUFPdEcsaUJBQWlCLENBQUM7UUFBRXVHLEtBQUssRUFBRUQ7TUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDO0lBQ0ZsRyxNQUFNLENBQUNDLElBQUksQ0FBQ3dCLFNBQVMsQ0FBQ2Qsa0JBQWtCLENBQUV1RixLQUFhLElBQUs7TUFDM0QsT0FBT2xHLE1BQU0sQ0FBQ2dHLFlBQVksQ0FBQ25GLFdBQVcsQ0FBQ3FGLEtBQUssQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFDRmxHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbUcsb0JBQW9CLENBQUN6RixrQkFBa0IsQ0FBRXVGLEtBQWEsSUFBSztNQUN0RSxPQUFPdEcsaUJBQWlCLENBQUM7UUFBRXVHLEtBQUssRUFBRUQ7TUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDO0lBQ0ZsRyxNQUFNLENBQUNDLElBQUksQ0FBQ29HLFdBQVcsQ0FBQzFGLGtCQUFrQixDQUFFdUYsS0FBYSxJQUFLO01BQzdELE1BQU1JLFNBQVMsR0FBRyxJQUFJUCxjQUFjLEVBQUU7TUFDdEMsT0FBT0csS0FBSyxHQUFHSSxTQUFTLENBQUNELFdBQVcsQ0FBQ0gsS0FBSyxDQUFDLEdBQUdBLEtBQUs7SUFDcEQsQ0FBQyxDQUFDO0lBQ0ZsRyxNQUFNLENBQUNDLElBQUksQ0FBQ1MsR0FBRyxDQUFDQyxrQkFBa0IsQ0FBRUMsVUFBa0IsSUFBSztNQUMxRCxPQUFPQSxVQUFVLEtBQUssc0NBQXNDO0lBQzdELENBQUMsQ0FBQztJQUVGLE9BQU9aLE1BQU07RUFDZDtFQUNBO0FBQ0E7QUFDQTtFQUZBO0VBR08sTUFBTXVHLGFBQXFELEdBQUdWLG1CQUEwQjs7RUFFL0Y7QUFDQTtBQUNBO0VBRkE7RUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNXLGVBQWUsQ0FBQ0MsZ0JBQWtDLEVBQUVDLG1CQUF3QyxFQUFhO0lBQ3hILE1BQU0xRyxNQUFNLEdBQUdDLElBQUksQ0FBQzBHLFVBQVUsQ0FBYztJQUM1QzNHLE1BQU0sQ0FBQzRHLHdCQUF3QixHQUFHLElBQUk7SUFDdEM1RyxNQUFNLENBQUM2RyxlQUFlLEdBQUdKLGdCQUFnQjtJQUN6Q3pHLE1BQU0sQ0FBQzhHLGtCQUFrQixHQUFHSixtQkFBbUI7SUFDL0MsSUFBSUQsZ0JBQWdCLEVBQUU7TUFDckJBLGdCQUFnQixDQUFDNUMsUUFBUSxDQUFDN0QsTUFBTSxDQUFDO0lBQ2xDO0lBQ0EsSUFBSTBHLG1CQUFtQixFQUFFO01BQ3hCQSxtQkFBbUIsQ0FBQzdDLFFBQVEsQ0FBQzdELE1BQU0sQ0FBQztJQUNyQzs7SUFFQTtJQUNBQSxNQUFNLENBQUMrRyxZQUFZLEdBQUlDLFVBQXlCLElBQUs7TUFDcERoSCxNQUFNLENBQUNnSCxVQUFVLEdBQUdBLFVBQVU7SUFDL0IsQ0FBQzs7SUFFRDtJQUNBaEgsTUFBTSxDQUFDQyxJQUFJLENBQUNnSCxRQUFRLENBQUN0RyxrQkFBa0IsQ0FBQyxNQUFNO01BQzdDLE9BQU9YLE1BQU0sQ0FBQzZHLGVBQWU7SUFDOUIsQ0FBQyxDQUFDO0lBQ0Y3RyxNQUFNLENBQUNDLElBQUksQ0FBQ2lILFdBQVcsQ0FBQ3ZHLGtCQUFrQixDQUFDLE1BQU07TUFDaEQsT0FBT1gsTUFBTSxDQUFDOEcsa0JBQWtCO0lBQ2pDLENBQUMsQ0FBQztJQUNGOUcsTUFBTSxDQUFDQyxJQUFJLENBQUNrSCxZQUFZLENBQUN4RyxrQkFBa0IsQ0FBQyxNQUFNO01BQ2pELE9BQU9YLE1BQU0sQ0FBQ2dILFVBQVU7SUFDekIsQ0FBQyxDQUFDO0lBQ0ZoSCxNQUFNLENBQUNDLElBQUksQ0FBQ1MsR0FBRyxDQUFDQyxrQkFBa0IsQ0FBRUMsVUFBa0IsSUFBSztNQUMxRCxPQUFPQSxVQUFVLEtBQUssa0NBQWtDO0lBQ3pELENBQUMsQ0FBQztJQUVGLE9BQU9aLE1BQU07RUFDZDtFQUNBO0FBQ0E7QUFDQTtFQUZBO0VBR08sTUFBTW9ILFNBQTBHLEdBQ3RIWixlQUFzQjtFQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQTtFQU1PLFNBQVNhLDhCQUE4QixDQUFDWixnQkFBaUMsRUFBYTtJQUM1RixPQUFPRCxlQUFlLENBQUNDLGdCQUFnQixDQUFDO0VBQ3pDO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFNTyxTQUFTYSxpQ0FBaUMsQ0FBQ1osbUJBQXVDLEVBQWE7SUFDckcsT0FBT0YsZUFBZSxDQUFDZSxTQUFTLEVBQUViLG1CQUFtQixDQUFDO0VBQ3ZEOztFQUVBO0FBQ0E7QUFDQTtFQUZBO0VBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNjLGNBQWMsR0FBYTtJQUMxQyxNQUFNeEgsTUFBTSxHQUFHQyxJQUFJLENBQUN3SCxJQUFJLENBQUM7O0lBRXpCO0lBQ0F6SCxNQUFNLENBQUNDLElBQUksQ0FBQ1MsR0FBRyxDQUFDQyxrQkFBa0IsQ0FBRUMsVUFBa0IsSUFBSztNQUMxRCxPQUFPQSxVQUFVLEtBQUssc0JBQXNCO0lBQzdDLENBQUMsQ0FBQztJQUVGLE9BQU9aLE1BQU07RUFDZDtFQUNBO0FBQ0E7QUFDQTtFQUZBO0VBR08sTUFBTTBILFFBQTRCLEdBQUdGLGNBQXFCOztFQUVqRTtBQUNBO0FBQ0E7RUFGQTtFQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTRyxvQkFBb0IsR0FBbUI7SUFDdEQsTUFBTTNILE1BQU0sR0FBR0MsSUFBSSxDQUFDMkgsVUFBVSxDQUFtQjtJQUNqRDVILE1BQU0sQ0FBQzZILFFBQVEsR0FBRzVILElBQUksQ0FBQzZILGVBQWUsQ0FBQztJQUN2QzlILE1BQU0sQ0FBQytILFlBQVksR0FBRzlILElBQUksQ0FBQytILFdBQVcsQ0FBQztJQUN2Q2hJLE1BQU0sQ0FBQ2lJLFFBQVEsR0FBR2hJLElBQUksQ0FBQ2lJLFFBQVEsQ0FBQztJQUNoQ2xJLE1BQU0sQ0FBQ21JLEtBQUssR0FBR2xJLElBQUksQ0FBQ21JLEtBQUssQ0FBQztJQUMxQnBJLE1BQU0sQ0FBQ3FJLGtCQUFrQixHQUFHcEksSUFBSSxDQUFDcUksa0JBQWtCLENBQUM7SUFDcER0SSxNQUFNLENBQUN1SSxlQUFlLEdBQUd0SSxJQUFJLENBQUN1SSxlQUFlLENBQUM7SUFDOUN4SSxNQUFNLENBQUN5SSxlQUFlLEdBQUdDLElBQUksQ0FBQ0MsRUFBRSxFQUFFLENBQUMxRixlQUFlLENBQUNoRCxJQUFJLENBQUMySSxZQUFZLENBQUMsQ0FBQztJQUN0RTtJQUNBNUksTUFBTSxDQUFDQyxJQUFJLENBQUM0SSxPQUFPLENBQUM1RixlQUFlLENBQUN1RSxjQUFjLEVBQUUsQ0FBQztJQUNyRHhILE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUyxHQUFHLENBQUN1QyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBRXRDLE9BQU9qRCxNQUFNO0VBQ2Q7RUFDQTtBQUNBO0FBQ0E7RUFGQTtFQUdPLE1BQU04SSxjQUF3QyxHQUFHbkIsb0JBQTJCO0VBQUM7RUFPcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU29CLE9BQU8sQ0FBQ0MsUUFBMkIsRUFBVztJQUM3RCxNQUFNbEYsS0FBSyxHQUFHLENBQUFrRixRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRWxGLEtBQUssS0FBSTBDLGVBQWUsRUFBRTtJQUNsRCxNQUFNeUMsSUFBSSxHQUFHLENBQUFELFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFQyxJQUFJLEtBQUl6QixjQUFjLEVBQUU7SUFDL0MsTUFBTTBCLFVBQVUsR0FBRyxDQUFBRixRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRUUsVUFBVSxLQUFJdkIsb0JBQW9CLEVBQUU7SUFFakVzQixJQUFJLENBQUNoSixJQUFJLENBQUNrSixhQUFhLENBQUNsRyxlQUFlLENBQUNpRyxVQUFVLENBQUM7SUFDbkRELElBQUksQ0FBQ2hKLElBQUksQ0FBQ21DLFFBQVEsQ0FBQ2EsZUFBZSxDQUFDYSxLQUFLLENBQUM7SUFDekNvRixVQUFVLENBQUNqSixJQUFJLENBQUM0SSxPQUFPLENBQUM1RixlQUFlLENBQUNnRyxJQUFJLENBQUM7SUFFN0MsT0FBTztNQUFFbkYsS0FBSztNQUFFbUYsSUFBSTtNQUFFQztJQUFXLENBQUM7RUFDbkM7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBO0VBUU8sU0FBU0UsT0FBTyxDQUFDQyxNQUFjLEVBQUVDLFVBQWtCLEVBQUVDLFFBQWlCLEVBQUU7SUFDOUUsTUFBTUMsYUFBYSxHQUFHLElBQUlDLGFBQWEsQ0FBQztNQUN2Q0MsVUFBVSxFQUFFLDJCQUEyQjtNQUN2Q0MsV0FBVyxFQUFFLENBQUM7UUFBRUQsVUFBVSxFQUFFO01BQThCLENBQUMsRUFBRTtRQUFFQSxVQUFVLEVBQUU7TUFBaUMsQ0FBQyxDQUFDO01BQzlHRSxLQUFLLEVBQUU7SUFDUixDQUFDLENBQUM7SUFDRixPQUFPSixhQUFhLENBQUNKLE9BQU8sQ0FBQ0MsTUFBTSxFQUFFQyxVQUFVLEVBQUVDLFFBQVEsQ0FBQztFQUMzRDs7RUFFQTtBQUNBO0FBQ0E7RUFGQTtFQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTTSx1QkFBdUIsR0FBc0I7SUFDNUQsTUFBTTdKLE1BQU0sR0FBR0MsSUFBSSxDQUFDd0osYUFBYSxDQUFDO0lBQ2xDekosTUFBTSxDQUFDb0osT0FBTyxHQUFHVixJQUFJLENBQUNDLEVBQUUsRUFBRSxDQUFDaEksa0JBQWtCLENBQUN5SSxPQUFPLENBQUM7SUFDdEQsT0FBT3BKLE1BQU07RUFDZDtFQUFDO0VBQUE7QUFBQSJ9
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import type { WithMock } from "@sap-ux/jest-mock-ui5/dist/generic";
|
|
2
2
|
import { mock } from "@sap-ux/jest-mock-ui5/dist/generic";
|
|
3
3
|
import AppComponent from "sap/fe/core/AppComponent";
|
|
4
|
+
import type { FEView } from "sap/fe/core/BaseController";
|
|
5
|
+
import ResourceModel from "sap/fe/core/ResourceModel";
|
|
6
|
+
import CollaborativeDraft from "sap/fe/core/controllerextensions/CollaborativeDraft";
|
|
4
7
|
import EditFlow from "sap/fe/core/controllerextensions/EditFlow";
|
|
5
8
|
import InternalRouting from "sap/fe/core/controllerextensions/InternalRouting";
|
|
6
9
|
import Recommendations from "sap/fe/core/controllerextensions/Recommendations";
|
|
7
10
|
import Share from "sap/fe/core/controllerextensions/Share";
|
|
8
11
|
import SideEffects from "sap/fe/core/controllerextensions/SideEffects";
|
|
9
|
-
import ResourceModel from "sap/fe/core/ResourceModel";
|
|
10
12
|
import Event from "sap/ui/base/Event";
|
|
11
13
|
import Controller from "sap/ui/core/mvc/Controller";
|
|
12
14
|
import View from "sap/ui/core/mvc/View";
|
|
15
|
+
import type Control from "sap/ui/mdc/Control";
|
|
13
16
|
import CompositeBinding from "sap/ui/model/CompositeBinding";
|
|
14
17
|
import Context from "sap/ui/model/odata/v4/Context";
|
|
15
18
|
import ODataContextBinding from "sap/ui/model/odata/v4/ODataContextBinding";
|
|
@@ -56,8 +59,8 @@ export function createMockContext(oContextData?: any, oBinding?: any, isInactive
|
|
|
56
59
|
}
|
|
57
60
|
return Promise.resolve(mocked._contextData[keyOrKeys]);
|
|
58
61
|
});
|
|
59
|
-
mocked.mock.requestObject.mockImplementation((key: string) => {
|
|
60
|
-
return Promise.resolve(mocked._contextData[key]);
|
|
62
|
+
mocked.mock.requestObject.mockImplementation((key: string | undefined) => {
|
|
63
|
+
return key ? Promise.resolve(mocked._contextData[key]) : mocked._contextData;
|
|
61
64
|
});
|
|
62
65
|
mocked.mock.setProperty.mockImplementation((key: string, value: any) => {
|
|
63
66
|
mocked._contextData[key] = value;
|
|
@@ -106,10 +109,14 @@ export type MockEvent = WithMock<Event> & {
|
|
|
106
109
|
* @param params The parameters of the event
|
|
107
110
|
* @returns A new MockEvent
|
|
108
111
|
*/
|
|
109
|
-
export function createMockEvent(params?: { [key: string]:
|
|
112
|
+
export function createMockEvent(params?: { [key: string]: unknown }, source?: Control): MockEvent {
|
|
110
113
|
const mocked = mock(Event) as MockEvent;
|
|
111
114
|
mocked._params = params || {};
|
|
112
115
|
|
|
116
|
+
if (source) {
|
|
117
|
+
mocked.mock.getSource.mockReturnValue(source);
|
|
118
|
+
}
|
|
119
|
+
|
|
113
120
|
// Default behavior
|
|
114
121
|
mocked.mock.getParameter.mockImplementation((name) => mocked._params[name]);
|
|
115
122
|
mocked.mock.getParameters.mockImplementation(() => {
|
|
@@ -346,6 +353,9 @@ export function createMockMetaModel(oMetaData?: any): MockMetaModel {
|
|
|
346
353
|
const metamodel = new ODataMetaModel();
|
|
347
354
|
return sPath ? metamodel.getMetaPath(sPath) : sPath;
|
|
348
355
|
});
|
|
356
|
+
mocked.mock.isA.mockImplementation((sClassName: string) => {
|
|
357
|
+
return sClassName === "sap.ui.model.odata.v4.ODataMetaModel";
|
|
358
|
+
});
|
|
349
359
|
|
|
350
360
|
return mocked;
|
|
351
361
|
}
|
|
@@ -376,6 +386,7 @@ export type MockModel = WithMock<ODataModel> & {
|
|
|
376
386
|
*/
|
|
377
387
|
export function createMockModel(oMockListBinding?: MockListBinding, oMockContextBinding?: MockContextBinding): MockModel {
|
|
378
388
|
const mocked = mock(ODataModel) as MockModel;
|
|
389
|
+
mocked.fnOptimisticBatchEnabler = null;
|
|
379
390
|
mocked.mockListBinding = oMockListBinding;
|
|
380
391
|
mocked.mockContextBinding = oMockContextBinding;
|
|
381
392
|
if (oMockListBinding) {
|
|
@@ -400,6 +411,9 @@ export function createMockModel(oMockListBinding?: MockListBinding, oMockContext
|
|
|
400
411
|
mocked.mock.getMetaModel.mockImplementation(() => {
|
|
401
412
|
return mocked.oMetaModel;
|
|
402
413
|
});
|
|
414
|
+
mocked.mock.isA.mockImplementation((sClassName: string) => {
|
|
415
|
+
return sClassName === "sap.ui.model.odata.v4.ODataModel";
|
|
416
|
+
});
|
|
403
417
|
|
|
404
418
|
return mocked;
|
|
405
419
|
}
|
|
@@ -430,7 +444,7 @@ export function createMockModelFromContextBinding(oMockContextBinding: MockConte
|
|
|
430
444
|
/**
|
|
431
445
|
* Utility type to mock a sap.ui.core.mvc.View
|
|
432
446
|
*/
|
|
433
|
-
export type MockView = WithMock<
|
|
447
|
+
export type MockView = WithMock<FEView>;
|
|
434
448
|
/**
|
|
435
449
|
* Factory function to create a new MockView.
|
|
436
450
|
*
|
|
@@ -444,7 +458,7 @@ export function createMockView(): MockView {
|
|
|
444
458
|
return sClassName === "sap.ui.core.mvc.View";
|
|
445
459
|
});
|
|
446
460
|
|
|
447
|
-
return mocked;
|
|
461
|
+
return mocked as MockView;
|
|
448
462
|
}
|
|
449
463
|
/**
|
|
450
464
|
* For compatibility reasons, we keep a new operator. Use the factory function createMockView instead.
|
|
@@ -460,6 +474,7 @@ export type MockController = WithMock<Controller> & {
|
|
|
460
474
|
editFlow: WithMock<EditFlow>;
|
|
461
475
|
share: WithMock<Share>;
|
|
462
476
|
recommendations: WithMock<Recommendations>;
|
|
477
|
+
collaborativeDraft: WithMock<CollaborativeDraft>;
|
|
463
478
|
getAppComponent: () => WithMock<AppComponent>;
|
|
464
479
|
};
|
|
465
480
|
/**
|
|
@@ -473,6 +488,7 @@ export function createMockController(): MockController {
|
|
|
473
488
|
mocked._sideEffects = mock(SideEffects);
|
|
474
489
|
mocked.editFlow = mock(EditFlow);
|
|
475
490
|
mocked.share = mock(Share);
|
|
491
|
+
mocked.collaborativeDraft = mock(CollaborativeDraft);
|
|
476
492
|
mocked.recommendations = mock(Recommendations);
|
|
477
493
|
mocked.getAppComponent = jest.fn().mockReturnValue(mock(AppComponent));
|
|
478
494
|
// Default Behavior
|
package/src/sap/fe/test/Utils.js
CHANGED
|
@@ -142,6 +142,10 @@ sap.ui.define(
|
|
|
142
142
|
SalesOrder: {
|
|
143
143
|
appName: "SalesOrder",
|
|
144
144
|
appPath: "/apps/salesorder/webapp"
|
|
145
|
+
},
|
|
146
|
+
"Cinema-manage": {
|
|
147
|
+
appName: "CollaborationDraft",
|
|
148
|
+
appPath: "/apps/collaborationDraft/webapp"
|
|
145
149
|
}
|
|
146
150
|
};
|
|
147
151
|
return oApps[sApp];
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
*/
|
|
7
7
|
sap.ui.define(
|
|
8
|
-
["./BaseAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/ui/core/
|
|
9
|
-
function (BaseAPI, Utils, OpaBuilder, FEBuilder,
|
|
8
|
+
["./BaseAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/ui/core/library"],
|
|
9
|
+
function (BaseAPI, Utils, OpaBuilder, FEBuilder, library) {
|
|
10
10
|
"use strict";
|
|
11
11
|
|
|
12
|
+
var SortOrder = library.SortOrder;
|
|
12
13
|
/**
|
|
13
14
|
* Constructs a new ChartAssertions instance.
|
|
14
15
|
*
|