@sapui5/sap.fe.test 1.104.1 → 1.105.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 +3 -3
- 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 -3
- package/src/sap/fe/test/FeMocks.ts +0 -4
- package/src/sap/fe/test/JestTemplatingHelper.js +99 -9
- package/src/sap/fe/test/JestTemplatingHelper.ts +82 -4
- package/src/sap/fe/test/ListReport.js +21 -0
- package/src/sap/fe/test/ObjectPage.js +8 -0
- package/src/sap/fe/test/UI5MockHelper.js +373 -326
- package/src/sap/fe/test/UI5MockHelper.ts +395 -258
- package/src/sap/fe/test/api/CollaborationAPI.js +1 -1
- package/src/sap/fe/test/api/FormActions.js +9 -0
- package/src/sap/fe/test/api/HeaderAssertions.js +16 -7
- package/src/sap/fe/test/internal/ConsoleErrorChecker.js +1 -1
- package/src/sap/fe/test/library.js +2 -2
|
@@ -2,414 +2,461 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/ui/model/odata/v4/ODataMetaModel"], function (ODataMetaModel) {
|
|
5
|
+
sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/InternalEditFlow", "sap/fe/core/controllerextensions/InternalRouting", "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, EditFlow, InternalEditFlow, InternalRouting, SideEffects, Event, Controller, View, CompositeBinding, Context, ODataContextBinding, ODataListBinding, ODataMetaModel, ODataModel, ODataPropertyBinding) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
|
+
var mock = generic.mock;
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Factory function to create a new MockContext.
|
|
13
|
+
*
|
|
14
|
+
* @param oContextData A map of the different properties of the context. The value for the key '$path' will be returned by the 'getPath' method
|
|
15
|
+
* @param oBinding The binding of the context
|
|
16
|
+
* @param isInactive Is the context iniactive or not
|
|
17
|
+
* @returns A new MockContext
|
|
18
|
+
*/
|
|
19
|
+
function createMockContext(oContextData, oBinding, isInactive) {
|
|
20
|
+
// Ugly workaround to get a proper mock pbject, as Context isn't properly exported from UI5
|
|
21
|
+
var mocked = mock(Object.getPrototypeOf(Context.createNewContext(null, null, "/e")));
|
|
22
|
+
mocked._isKeptAlive = false;
|
|
23
|
+
mocked._contextData = oContextData || {};
|
|
24
|
+
mocked._oBinding = oBinding;
|
|
25
|
+
mocked._isInactive = !!isInactive; // Default behavior
|
|
26
|
+
|
|
27
|
+
mocked.mock.isA.mockImplementation(function (sClassName) {
|
|
28
|
+
return sClassName === "sap.ui.model.odata.v4.Context";
|
|
29
|
+
});
|
|
30
|
+
mocked.mock.getProperty.mockImplementation(function (key) {
|
|
31
|
+
return mocked._contextData[key];
|
|
32
|
+
});
|
|
33
|
+
mocked.mock.requestProperty.mockImplementation(function (key) {
|
|
34
|
+
return Promise.resolve(mocked._contextData[key]);
|
|
35
|
+
});
|
|
36
|
+
mocked.mock.requestObject.mockImplementation(function (key) {
|
|
37
|
+
return Promise.resolve(mocked._contextData[key]);
|
|
38
|
+
});
|
|
39
|
+
mocked.mock.setProperty.mockImplementation(function (key, value) {
|
|
40
|
+
mocked._contextData[key] = value;
|
|
41
|
+
return mocked._contextData[key];
|
|
42
|
+
});
|
|
43
|
+
mocked.mock.getObject.mockImplementation(function (path) {
|
|
44
|
+
var result = path ? mocked._contextData[path] : mocked._contextData;
|
|
45
|
+
|
|
46
|
+
if (!result && path && path.indexOf("/") > -1) {
|
|
47
|
+
var parts = path.split("/");
|
|
48
|
+
result = parts.reduce(function (sum, part) {
|
|
49
|
+
sum = part ? sum[part] : sum;
|
|
50
|
+
return sum;
|
|
51
|
+
}, mocked._contextData);
|
|
52
|
+
}
|
|
50
53
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
this.requestObject = jest.fn();
|
|
62
|
-
this.oValues = oValues;
|
|
63
|
-
this.oBinding = oBinding;
|
|
64
|
-
}
|
|
54
|
+
return result;
|
|
55
|
+
});
|
|
56
|
+
mocked.mock.getPath.mockImplementation(function () {
|
|
57
|
+
return mocked._contextData["$path"];
|
|
58
|
+
});
|
|
59
|
+
mocked.mock.getBinding.mockImplementation(function () {
|
|
60
|
+
return mocked._oBinding;
|
|
61
|
+
});
|
|
62
|
+
mocked.mock.getModel.mockImplementation(function () {
|
|
63
|
+
var _mocked$_oBinding;
|
|
65
64
|
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
return (_mocked$_oBinding = mocked._oBinding) === null || _mocked$_oBinding === void 0 ? void 0 : _mocked$_oBinding.getModel();
|
|
66
|
+
});
|
|
67
|
+
mocked.mock.setKeepAlive.mockImplementation(function (bool, _fnOnBeforeDestroy, _bRequestMessages) {
|
|
68
|
+
mocked._isKeptAlive = bool;
|
|
69
|
+
});
|
|
70
|
+
mocked.mock.isKeepAlive.mockImplementation(function () {
|
|
71
|
+
return mocked._isKeptAlive;
|
|
72
|
+
});
|
|
73
|
+
mocked.mock.isInactive.mockImplementation(function () {
|
|
74
|
+
return mocked._isInactive;
|
|
75
|
+
});
|
|
76
|
+
return mocked;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockContext instead.
|
|
80
|
+
*/
|
|
68
81
|
|
|
69
|
-
_proto.isA = function isA(sClassName) {
|
|
70
|
-
return sClassName === "sap.ui.model.odata.v4.Context";
|
|
71
|
-
};
|
|
72
82
|
|
|
73
|
-
|
|
74
|
-
|
|
83
|
+
_exports.createMockContext = createMockContext;
|
|
84
|
+
var MockContext = createMockContext;
|
|
85
|
+
/**
|
|
86
|
+
* Utility type to mock a sap.ui.base.Event
|
|
87
|
+
*/
|
|
75
88
|
|
|
76
89
|
_exports.MockContext = MockContext;
|
|
77
90
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
_exports.MockUI5Element = MockUI5Element;
|
|
91
|
+
/**
|
|
92
|
+
* Factory function to create a new MockEvent.
|
|
93
|
+
*
|
|
94
|
+
* @param params The parameters of the event
|
|
95
|
+
* @returns A new MockEvent
|
|
96
|
+
*/
|
|
97
|
+
function createMockEvent(params) {
|
|
98
|
+
var mocked = mock(Event);
|
|
99
|
+
mocked._params = params || {}; // Default behavior
|
|
89
100
|
|
|
90
|
-
|
|
91
|
-
|
|
101
|
+
mocked.mock.getParameter.mockImplementation(function (name) {
|
|
102
|
+
return mocked._params[name];
|
|
103
|
+
});
|
|
104
|
+
return mocked;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockEvent instead.
|
|
108
|
+
*/
|
|
92
109
|
|
|
93
|
-
function MockControl() {
|
|
94
|
-
var _this2;
|
|
95
110
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
111
|
+
_exports.createMockEvent = createMockEvent;
|
|
112
|
+
var MockEvent = createMockEvent;
|
|
113
|
+
/**
|
|
114
|
+
* Utility type to mock a sap.ui.model.odata.v4.ODataListBinding
|
|
115
|
+
*/
|
|
99
116
|
|
|
100
|
-
|
|
101
|
-
_this2.getBindingContext = jest.fn();
|
|
102
|
-
_this2.getModel = jest.fn();
|
|
103
|
-
return _this2;
|
|
104
|
-
}
|
|
117
|
+
_exports.MockEvent = MockEvent;
|
|
105
118
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Factory function to create a new MockListBinding.
|
|
121
|
+
*
|
|
122
|
+
* @param aContextData An array of objects holding the different properties of the contexts referenced by the ListBinding
|
|
123
|
+
* @param oMockModel The model of the ListBinding
|
|
124
|
+
* @returns A new MockListBinding
|
|
125
|
+
*/
|
|
126
|
+
function createMockListBinding(aContextData, oMockModel) {
|
|
127
|
+
var mocked = mock(ODataListBinding);
|
|
128
|
+
aContextData = aContextData || [];
|
|
129
|
+
mocked._aMockContexts = aContextData.map(function (contextData) {
|
|
130
|
+
return createMockContext(contextData, mocked);
|
|
131
|
+
});
|
|
132
|
+
mocked._mockModel = oMockModel; // Utility API
|
|
109
133
|
|
|
110
|
-
|
|
134
|
+
mocked.setModel = function (model) {
|
|
135
|
+
mocked._mockModel = model;
|
|
136
|
+
}; // Default behavior
|
|
111
137
|
|
|
112
|
-
var MockEvent = function MockEvent() {
|
|
113
|
-
var _this3 = this;
|
|
114
138
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
139
|
+
mocked.mock.isA.mockImplementation(function (sClassName) {
|
|
140
|
+
return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
|
|
141
|
+
});
|
|
142
|
+
mocked.mock.requestContexts.mockImplementation(function () {
|
|
143
|
+
return Promise.resolve(mocked._aMockContexts);
|
|
119
144
|
});
|
|
120
|
-
|
|
121
|
-
return
|
|
145
|
+
mocked.mock.getCurrentContexts.mockImplementation(function () {
|
|
146
|
+
return mocked._aMockContexts;
|
|
122
147
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
148
|
+
mocked.mock.getAllCurrentContexts.mockImplementation(function () {
|
|
149
|
+
return mocked._aMockContexts;
|
|
150
|
+
});
|
|
151
|
+
mocked.mock.getModel.mockImplementation(function () {
|
|
152
|
+
return mocked._mockModel;
|
|
153
|
+
});
|
|
154
|
+
mocked.mock.getUpdateGroupId.mockReturnValue("auto");
|
|
155
|
+
return mocked;
|
|
156
|
+
}
|
|
126
157
|
/**
|
|
127
|
-
*
|
|
158
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockListBinding instead.
|
|
128
159
|
*/
|
|
129
160
|
|
|
130
161
|
|
|
131
|
-
_exports.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
this.setAggregation = jest.fn();
|
|
138
|
-
this.filter = jest.fn();
|
|
139
|
-
this.sort = jest.fn();
|
|
140
|
-
this.getQueryOptionsFromParameters = jest.fn();
|
|
141
|
-
this.getPath = jest.fn();
|
|
142
|
-
this.isSuspended = jest.fn();
|
|
143
|
-
this.resume = jest.fn();
|
|
144
|
-
this.refresh = jest.fn();
|
|
145
|
-
this.suspend = jest.fn();
|
|
146
|
-
this.requestContexts = jest.fn(function () {
|
|
147
|
-
return Promise.resolve(_this4.aMockContexts);
|
|
148
|
-
});
|
|
149
|
-
this.getCurrentContexts = jest.fn(function () {
|
|
150
|
-
return _this4.aMockContexts;
|
|
151
|
-
});
|
|
152
|
-
this.getModel = jest.fn(function () {
|
|
153
|
-
return _this4.mockModel;
|
|
154
|
-
});
|
|
155
|
-
this.getUpdateGroupId = jest.fn(function () {
|
|
156
|
-
return "auto";
|
|
157
|
-
});
|
|
158
|
-
this.mockModel = mockModel;
|
|
159
|
-
aContexts = aContexts || [];
|
|
160
|
-
this.aMockContexts = aContexts.map(function (context) {
|
|
161
|
-
return new MockContext(context, _this4);
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
_exports.MockListBinding = MockListBinding;
|
|
166
|
-
var _proto2 = MockListBinding.prototype;
|
|
167
|
-
|
|
168
|
-
_proto2.isA = function isA(sClassName) {
|
|
169
|
-
return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
_proto2.setModel = function setModel(oModel) {
|
|
173
|
-
this.mockModel = oModel;
|
|
174
|
-
} // Mocked API
|
|
175
|
-
;
|
|
176
|
-
|
|
177
|
-
return MockListBinding;
|
|
178
|
-
}();
|
|
162
|
+
_exports.createMockListBinding = createMockListBinding;
|
|
163
|
+
var MockListBinding = createMockListBinding;
|
|
164
|
+
/**
|
|
165
|
+
* Utility type to mock a sap.ui.model.odata.v4.ODataPropertyBinding
|
|
166
|
+
*/
|
|
179
167
|
|
|
180
168
|
_exports.MockListBinding = MockListBinding;
|
|
181
169
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return _this5 === null || _this5 === void 0 ? void 0 : (_this5$mockModel = _this5.mockModel) === null || _this5$mockModel === void 0 ? void 0 : _this5$mockModel.getProperty("/".concat(_this5.mockPath));
|
|
196
|
-
});
|
|
197
|
-
this.setModel(mockModel);
|
|
198
|
-
this.setPath(mockPath);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
_exports.MockPropertyBinding = MockPropertyBinding;
|
|
202
|
-
var _proto3 = MockPropertyBinding.prototype;
|
|
170
|
+
/**
|
|
171
|
+
* Factory function to create a new MockPropertyBinding.
|
|
172
|
+
*
|
|
173
|
+
* @param value The value returnd by the PropertyBinding
|
|
174
|
+
* @param path The path of the PropertyBinding
|
|
175
|
+
* @param oMockModel The model of the PropertyBinding
|
|
176
|
+
* @returns A new MockPropertyBinding
|
|
177
|
+
*/
|
|
178
|
+
function createMockPropertyBinding(value, path, oMockModel) {
|
|
179
|
+
var mocked = mock(ODataPropertyBinding);
|
|
180
|
+
mocked._mockModel = oMockModel;
|
|
181
|
+
mocked._value = value;
|
|
182
|
+
mocked._path = path; // Default behavior
|
|
203
183
|
|
|
204
|
-
|
|
184
|
+
mocked.mock.isA.mockImplementation(function (sClassName) {
|
|
205
185
|
return sClassName === "sap/ui/model/odata/v4/ODataPropertyBinding";
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
186
|
+
});
|
|
187
|
+
mocked.mock.getModel.mockImplementation(function () {
|
|
188
|
+
return mocked._mockModel;
|
|
189
|
+
});
|
|
190
|
+
mocked.mock.getValue.mockImplementation(function () {
|
|
191
|
+
return mocked._value;
|
|
192
|
+
});
|
|
193
|
+
mocked.mock.getPath.mockImplementation(function () {
|
|
194
|
+
return mocked._path;
|
|
195
|
+
});
|
|
196
|
+
return mocked;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockPropertyBinding instead.
|
|
200
|
+
*/
|
|
211
201
|
|
|
212
|
-
_proto3.setPath = function setPath(path) {
|
|
213
|
-
this.mockPath = path ? path : "";
|
|
214
|
-
};
|
|
215
202
|
|
|
216
|
-
|
|
217
|
-
|
|
203
|
+
_exports.createMockPropertyBinding = createMockPropertyBinding;
|
|
204
|
+
var MockPropertyBinding = createMockPropertyBinding;
|
|
205
|
+
/**
|
|
206
|
+
* Utility type to mock a sap.ui.model.CompositeBinding
|
|
207
|
+
*/
|
|
218
208
|
|
|
219
209
|
_exports.MockPropertyBinding = MockPropertyBinding;
|
|
220
210
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Factory function to create a new MockCompositeBinding.
|
|
213
|
+
*
|
|
214
|
+
* @param aBindings The bindings of the CompositeBinding
|
|
215
|
+
* @returns A new MockCompositeBinding
|
|
216
|
+
*/
|
|
217
|
+
function createMockCompositeBinding(aBindings) {
|
|
218
|
+
var mocked = mock(CompositeBinding);
|
|
219
|
+
mocked._aBindings = aBindings; // Default behavior
|
|
224
220
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
221
|
+
mocked.mock.isA.mockImplementation(function (sClassName) {
|
|
222
|
+
return sClassName === "sap.ui.model.CompositeBinding";
|
|
223
|
+
});
|
|
224
|
+
mocked.mock.getBindings.mockImplementation(function () {
|
|
225
|
+
return mocked._aBindings;
|
|
226
|
+
});
|
|
227
|
+
mocked.mock.getValue.mockImplementation(function () {
|
|
228
|
+
return mocked._aBindings.map(function (binding) {
|
|
229
|
+
return binding.getValue();
|
|
232
230
|
});
|
|
233
|
-
|
|
234
|
-
|
|
231
|
+
});
|
|
232
|
+
return mocked;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockCompositeBinding instead.
|
|
236
|
+
*/
|
|
235
237
|
|
|
236
|
-
_exports.MockCompositeBinding = MockCompositeBinding;
|
|
237
|
-
var _proto4 = MockCompositeBinding.prototype;
|
|
238
238
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}();
|
|
239
|
+
_exports.createMockCompositeBinding = createMockCompositeBinding;
|
|
240
|
+
var MockCompositeBinding = createMockCompositeBinding;
|
|
241
|
+
/**
|
|
242
|
+
* Utility type to mock a sap.ui.model.odata.v4.ODataContextBinding
|
|
243
|
+
*/
|
|
245
244
|
|
|
246
245
|
_exports.MockCompositeBinding = MockCompositeBinding;
|
|
247
246
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
});
|
|
260
|
-
this.setParameter = jest.fn();
|
|
261
|
-
this.execute = jest.fn().mockResolvedValue(true);
|
|
262
|
-
this.getGroupId = jest.fn();
|
|
263
|
-
this.mockModel = mockModel;
|
|
264
|
-
this.oMockContext = new MockContext(oContext || {}, this);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
_exports.MockContextBinding = MockContextBinding;
|
|
268
|
-
var _proto5 = MockContextBinding.prototype;
|
|
247
|
+
/**
|
|
248
|
+
* Factory function to create a new MockContextBinding.
|
|
249
|
+
*
|
|
250
|
+
* @param oContext The context of the ContextBinding
|
|
251
|
+
* @param oMockModel The model of the ContextBinding
|
|
252
|
+
* @returns A new MockContextBinding
|
|
253
|
+
*/
|
|
254
|
+
function createMockContextBinding(oContext, oMockModel) {
|
|
255
|
+
var mocked = mock(ODataContextBinding);
|
|
256
|
+
mocked.mockModel = oMockModel;
|
|
257
|
+
mocked.oMockContext = createMockContext(oContext || {}, mocked); // Utility API
|
|
269
258
|
|
|
270
|
-
|
|
271
|
-
return
|
|
259
|
+
mocked.getInternalMockContext = function () {
|
|
260
|
+
return mocked.oMockContext;
|
|
272
261
|
};
|
|
273
262
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
};
|
|
263
|
+
mocked.setModel = function (oModel) {
|
|
264
|
+
mocked.mockModel = oModel;
|
|
265
|
+
}; // Default behavior
|
|
277
266
|
|
|
278
|
-
_proto5.setModel = function setModel(oModel) {
|
|
279
|
-
this.mockModel = oModel;
|
|
280
|
-
} // Mocked API
|
|
281
|
-
;
|
|
282
267
|
|
|
283
|
-
|
|
284
|
-
|
|
268
|
+
mocked.mock.isA.mockImplementation(function (sClassName) {
|
|
269
|
+
return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
|
|
270
|
+
});
|
|
271
|
+
mocked.mock.getBoundContext.mockImplementation(function () {
|
|
272
|
+
return mocked.oMockContext;
|
|
273
|
+
});
|
|
274
|
+
mocked.mock.getModel.mockImplementation(function () {
|
|
275
|
+
return mocked.mockModel;
|
|
276
|
+
});
|
|
277
|
+
mocked.mock.execute.mockResolvedValue(true);
|
|
278
|
+
return mocked;
|
|
279
|
+
}
|
|
285
280
|
/**
|
|
286
|
-
*
|
|
281
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockContextBinding instead.
|
|
287
282
|
*/
|
|
288
283
|
|
|
289
284
|
|
|
285
|
+
_exports.createMockContextBinding = createMockContextBinding;
|
|
286
|
+
var MockContextBinding = createMockContextBinding;
|
|
287
|
+
/**
|
|
288
|
+
* Utility type to mock a sap.ui.model.odata.v4.ODataMetaModel
|
|
289
|
+
*/
|
|
290
|
+
|
|
290
291
|
_exports.MockContextBinding = MockContextBinding;
|
|
291
292
|
|
|
292
|
-
|
|
293
|
-
|
|
293
|
+
/**
|
|
294
|
+
* Factory function to create a new MockMetaModel.
|
|
295
|
+
*
|
|
296
|
+
* @param oMetaData A map of the different metadata properties of the MetaModel (path -> value).
|
|
297
|
+
* @returns A new MockMetaModel
|
|
298
|
+
*/
|
|
299
|
+
function createMockMetaModel(oMetaData) {
|
|
300
|
+
var mocked = mock(ODataMetaModel);
|
|
301
|
+
mocked.oMetaContext = createMockContext(oMetaData || {}); // Default behavior
|
|
294
302
|
|
|
295
|
-
|
|
296
|
-
return
|
|
303
|
+
mocked.mock.getMetaContext.mockImplementation(function (sPath) {
|
|
304
|
+
return createMockContext({
|
|
297
305
|
$path: sPath
|
|
298
306
|
});
|
|
299
307
|
});
|
|
300
|
-
|
|
301
|
-
return
|
|
308
|
+
mocked.mock.getObject.mockImplementation(function (sPath) {
|
|
309
|
+
return mocked.oMetaContext.getProperty(sPath);
|
|
302
310
|
});
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
return new MockContext({
|
|
311
|
+
mocked.mock.createBindingContext.mockImplementation(function (sPath) {
|
|
312
|
+
return createMockContext({
|
|
306
313
|
$path: sPath
|
|
307
314
|
});
|
|
308
315
|
});
|
|
309
|
-
|
|
316
|
+
mocked.mock.getMetaPath.mockImplementation(function (sPath) {
|
|
310
317
|
var metamodel = new ODataMetaModel();
|
|
311
318
|
return sPath ? metamodel.getMetaPath(sPath) : sPath;
|
|
312
319
|
});
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
} // Mocked API
|
|
316
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
317
|
-
;
|
|
320
|
+
return mocked;
|
|
321
|
+
}
|
|
318
322
|
/**
|
|
319
|
-
*
|
|
323
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockMetaModel instead.
|
|
320
324
|
*/
|
|
321
325
|
|
|
322
326
|
|
|
323
|
-
_exports.
|
|
327
|
+
_exports.createMockMetaModel = createMockMetaModel;
|
|
328
|
+
var MockMetaModel = createMockMetaModel;
|
|
329
|
+
/**
|
|
330
|
+
* Utility type to mock a sap.ui.model.odata.v4.ODataModel
|
|
331
|
+
*/
|
|
324
332
|
|
|
325
|
-
|
|
326
|
-
function MockModel(mockListBinding, mockContextBinding) {
|
|
327
|
-
var _this9 = this;
|
|
333
|
+
_exports.MockMetaModel = MockMetaModel;
|
|
328
334
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
this.requestObject = jest.fn();
|
|
341
|
-
this.getKeepAliveContext = jest.fn();
|
|
342
|
-
this.mockListBinding = mockListBinding;
|
|
343
|
-
this.mockContextBinding = mockContextBinding;
|
|
344
|
-
|
|
345
|
-
if (mockListBinding) {
|
|
346
|
-
mockListBinding.setModel(this);
|
|
347
|
-
}
|
|
335
|
+
/**
|
|
336
|
+
* Factory function to create a new MockModel.
|
|
337
|
+
*
|
|
338
|
+
* @param oMockListBinding A list binding that will be returned when calling bindList.
|
|
339
|
+
* @param oMockContextBinding A context binding that will be returned when calling bindContext.
|
|
340
|
+
* @returns A new MockModel
|
|
341
|
+
*/
|
|
342
|
+
function createMockModel(oMockListBinding, oMockContextBinding) {
|
|
343
|
+
var mocked = mock(ODataModel);
|
|
344
|
+
mocked.mockListBinding = oMockListBinding;
|
|
345
|
+
mocked.mockContextBinding = oMockContextBinding;
|
|
348
346
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
} // Factories
|
|
347
|
+
if (oMockListBinding) {
|
|
348
|
+
oMockListBinding.setModel(mocked);
|
|
349
|
+
}
|
|
353
350
|
|
|
351
|
+
if (oMockContextBinding) {
|
|
352
|
+
oMockContextBinding.setModel(mocked);
|
|
353
|
+
} // Utility API
|
|
354
354
|
|
|
355
|
-
_exports.MockModel = MockModel;
|
|
356
355
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
};
|
|
356
|
+
mocked.setMetaModel = function (oMetaModel) {
|
|
357
|
+
mocked.oMetaModel = oMetaModel;
|
|
358
|
+
}; // Default behavior
|
|
360
359
|
|
|
361
|
-
MockModel.modelFromContextBinding = function modelFromContextBinding(mockContextBinding) {
|
|
362
|
-
return new MockModel(undefined, mockContextBinding);
|
|
363
|
-
};
|
|
364
360
|
|
|
365
|
-
|
|
361
|
+
mocked.mock.bindList.mockImplementation(function () {
|
|
362
|
+
return mocked.mockListBinding;
|
|
363
|
+
});
|
|
364
|
+
mocked.mock.bindContext.mockImplementation(function () {
|
|
365
|
+
return mocked.mockContextBinding;
|
|
366
|
+
});
|
|
367
|
+
mocked.mock.getMetaModel.mockImplementation(function () {
|
|
368
|
+
return mocked.oMetaModel;
|
|
369
|
+
});
|
|
370
|
+
return mocked;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockModel instead.
|
|
374
|
+
*/
|
|
366
375
|
|
|
367
|
-
_proto6.setMetaModel = function setMetaModel(oMetaModel) {
|
|
368
|
-
this.oMetaModel = oMetaModel;
|
|
369
|
-
} // Mocked API
|
|
370
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
371
|
-
;
|
|
372
376
|
|
|
373
|
-
|
|
374
|
-
|
|
377
|
+
_exports.createMockModel = createMockModel;
|
|
378
|
+
var MockModel = createMockModel;
|
|
379
|
+
/**
|
|
380
|
+
* Factory function to create a new MockModel used with a listBinding.
|
|
381
|
+
*
|
|
382
|
+
* @param oMockListBinding A list binding that will be returned when calling bindList.
|
|
383
|
+
* @returns A new MockModel
|
|
384
|
+
*/
|
|
375
385
|
|
|
376
386
|
_exports.MockModel = MockModel;
|
|
377
387
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
388
|
+
function createMockModelFromListBinding(oMockListBinding) {
|
|
389
|
+
return createMockModel(oMockListBinding);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Factory function to create a new MockModel used with a contextBinding.
|
|
393
|
+
*
|
|
394
|
+
* @param oMockContextBinding A context binding that will be returned when calling bindContext.
|
|
395
|
+
* @returns A new MockModel
|
|
396
|
+
*/
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
_exports.createMockModelFromListBinding = createMockModelFromListBinding;
|
|
400
|
+
|
|
401
|
+
function createMockModelFromContextBinding(oMockContextBinding) {
|
|
402
|
+
return createMockModel(undefined, oMockContextBinding);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Utility type to mock a sap.ui.core.mvc.View
|
|
406
|
+
*/
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
_exports.createMockModelFromContextBinding = createMockModelFromContextBinding;
|
|
386
410
|
|
|
387
|
-
|
|
388
|
-
|
|
411
|
+
/**
|
|
412
|
+
* Factory function to create a new MockView.
|
|
413
|
+
*
|
|
414
|
+
* @returns A new MockView
|
|
415
|
+
*/
|
|
416
|
+
function createMockView() {
|
|
417
|
+
var mocked = mock(View); // Default behavior
|
|
389
418
|
|
|
390
|
-
|
|
419
|
+
mocked.mock.isA.mockImplementation(function (sClassName) {
|
|
391
420
|
return sClassName === "sap.ui.core.mvc.View";
|
|
392
|
-
};
|
|
421
|
+
});
|
|
422
|
+
return mocked;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* For compatibility reasons, we keep a new operator. Use the factory function createMockView instead.
|
|
426
|
+
*/
|
|
427
|
+
|
|
393
428
|
|
|
394
|
-
|
|
395
|
-
|
|
429
|
+
_exports.createMockView = createMockView;
|
|
430
|
+
var MockView = createMockView;
|
|
431
|
+
/**
|
|
432
|
+
* Utility type to mock a sap.fe.core.PageController
|
|
433
|
+
*/
|
|
396
434
|
|
|
397
435
|
_exports.MockView = MockView;
|
|
398
436
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
437
|
+
/**
|
|
438
|
+
* Factory function to create a new MockController.
|
|
439
|
+
*
|
|
440
|
+
* @returns A new MockController
|
|
441
|
+
*/
|
|
442
|
+
function createMockController() {
|
|
443
|
+
var mocked = mock(Controller);
|
|
444
|
+
mocked._routing = mock(InternalRouting);
|
|
445
|
+
mocked._editFlow = mock(InternalEditFlow);
|
|
446
|
+
mocked._sideEffects = mock(SideEffects);
|
|
447
|
+
mocked.editFlow = mock(EditFlow); // Default Behavior
|
|
448
|
+
|
|
449
|
+
mocked.mock.getView.mockReturnValue(createMockView());
|
|
450
|
+
mocked.mock.isA.mockReturnValue(false);
|
|
451
|
+
return mocked;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* For compatibility reasons, we keep a new operator. Use the factory function mockController instead.
|
|
455
|
+
*/
|
|
456
|
+
|
|
412
457
|
|
|
458
|
+
_exports.createMockController = createMockController;
|
|
459
|
+
var MockController = createMockController;
|
|
413
460
|
_exports.MockController = MockController;
|
|
414
461
|
|
|
415
462
|
/**
|
|
@@ -419,12 +466,12 @@ sap.ui.define(["sap/ui/model/odata/v4/ODataMetaModel"], function (ODataMetaModel
|
|
|
419
466
|
* @returns Mocked model, view and controller instances
|
|
420
467
|
*/
|
|
421
468
|
function mockMVC(existing) {
|
|
422
|
-
var model = (existing === null || existing === void 0 ? void 0 : existing.model) ||
|
|
423
|
-
var view = (existing === null || existing === void 0 ? void 0 : existing.view) ||
|
|
424
|
-
var controller = (existing === null || existing === void 0 ? void 0 : existing.controller) ||
|
|
425
|
-
view.getController.mockReturnValue(controller);
|
|
426
|
-
view.getModel.mockReturnValue(model);
|
|
427
|
-
controller.getView.mockReturnValue(view);
|
|
469
|
+
var model = (existing === null || existing === void 0 ? void 0 : existing.model) || createMockModel();
|
|
470
|
+
var view = (existing === null || existing === void 0 ? void 0 : existing.view) || createMockView();
|
|
471
|
+
var controller = (existing === null || existing === void 0 ? void 0 : existing.controller) || createMockController();
|
|
472
|
+
view.mock.getController.mockReturnValue(controller);
|
|
473
|
+
view.mock.getModel.mockReturnValue(model);
|
|
474
|
+
controller.mock.getView.mockReturnValue(view);
|
|
428
475
|
return {
|
|
429
476
|
model: model,
|
|
430
477
|
view: view,
|
|
@@ -435,4 +482,4 @@ sap.ui.define(["sap/ui/model/odata/v4/ODataMetaModel"], function (ODataMetaModel
|
|
|
435
482
|
_exports.mockMVC = mockMVC;
|
|
436
483
|
return _exports;
|
|
437
484
|
}, false);
|
|
438
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJpc0tlcHRBbGl2ZSIsImdldFByb3BlcnR5IiwiamVzdCIsImZuIiwia2V5IiwicmVxdWVzdFByb3BlcnR5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJpc1RyYW5zaWVudCIsInNldEtlZXBBbGl2ZSIsImJvb2wiLCJfZm5PbkJlZm9yZURlc3Ryb3kiLCJfYlJlcXVlc3RNZXNzYWdlcyIsImlzS2VlcEFsaXZlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwicmVxdWVzdE9iamVjdCIsImlzQSIsInNDbGFzc05hbWUiLCJNb2NrVUk1RWxlbWVudCIsImJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJtb2NrUmV0dXJuVmFsdWUiLCJnZXRCaW5kaW5nSW5mbyIsImRhdGEiLCJnZXRQYXJlbnQiLCJNb2NrQ29udHJvbCIsIk1vY2tFdmVudCIsInBhcmFtcyIsInNvdXJjZSIsImdldFBhcmFtZXRlciIsIm5hbWUiLCJnZXRTb3VyY2UiLCJNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dHMiLCJtb2NrTW9kZWwiLCJzZXRBZ2dyZWdhdGlvbiIsImZpbHRlciIsInNvcnQiLCJnZXRRdWVyeU9wdGlvbnNGcm9tUGFyYW1ldGVycyIsImlzU3VzcGVuZGVkIiwicmVzdW1lIiwicmVmcmVzaCIsInN1c3BlbmQiLCJyZXF1ZXN0Q29udGV4dHMiLCJhTW9ja0NvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm1hcCIsImNvbnRleHQiLCJzZXRNb2RlbCIsIm9Nb2RlbCIsIk1vY2tQcm9wZXJ0eUJpbmRpbmciLCJtb2NrUGF0aCIsImdldFZhbHVlIiwic2V0UGF0aCIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiYUJpbmRpbmdzIiwiZ2V0QmluZGluZ3MiLCJiaW5kaW5nIiwiTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJvTW9ja0NvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJzZXRQYXJhbWV0ZXIiLCJleGVjdXRlIiwibW9ja1Jlc29sdmVkVmFsdWUiLCJnZXRHcm91cElkIiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIk1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJnZXRNZXRhQ29udGV4dCIsInNQYXRoIiwiJHBhdGgiLCJvTWV0YUNvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImdldE1ldGFQYXRoIiwibWV0YW1vZGVsIiwiT0RhdGFNZXRhTW9kZWwiLCJnZXRDb250ZXh0IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwiYmluZExpc3QiLCJiaW5kQ29udGV4dCIsImdldE1ldGFNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwibW9kZWxGcm9tTGlzdEJpbmRpbmciLCJtb2RlbEZyb21Db250ZXh0QmluZGluZyIsInVuZGVmaW5lZCIsInNldE1ldGFNb2RlbCIsIk1vY2tWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFZpZXdEYXRhIiwiZ2V0SWQiLCJNb2NrQ29udHJvbGxlciIsImdldFZpZXciLCJfcm91dGluZyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJfZWRpdEZsb3ciLCJzeW5jVGFzayIsIl9zaWRlRWZmZWN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwibW9ja01WQyIsImV4aXN0aW5nIiwibW9kZWwiLCJ2aWV3IiwiY29udHJvbGxlciJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztNQWVhQSxXO0FBRVoseUJB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Q2QsYUFBTCxDQUFtQnhFLGVBQW5CLENBQW1DdUYsVUFBbkM7QUFDQUQsSUFBQUEsSUFBSSxDQUFDcEcsUUFBTCxDQUFjYyxlQUFkLENBQThCcUYsS0FBOUI7QUFDQUUsSUFBQUEsVUFBVSxDQUFDWCxPQUFYLENBQW1CNUUsZUFBbkIsQ0FBbUNzRixJQUFuQztBQUVBLFdBQU87QUFBRUQsTUFBQUEsS0FBSyxFQUFMQSxLQUFGO0FBQVNDLE1BQUFBLElBQUksRUFBSkEsSUFBVDtBQUFlQyxNQUFBQSxVQUFVLEVBQVZBO0FBQWYsS0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vY2sgY2xhc3MgZm9yIGEgVjQgQ29udGV4dFxuICovXG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHByaXZhdGUgaXNLZXB0QWxpdmUgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlcz86IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyByZXF1ZXN0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vVmFsdWVzW2tleV0pO1xuXHR9KTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcblx0XHR0aGlzLm9WYWx1ZXNba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHBhdGg6IHN0cmluZykgPT4ge1xuXHRcdGxldCByZXN1bHQgPSBwYXRoID8gdGhpcy5vVmFsdWVzW3BhdGhdIDogdGhpcy5vVmFsdWVzO1xuXG5cdFx0aWYgKCFyZXN1bHQgJiYgcGF0aCAmJiBwYXRoLmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRyZXN1bHQgPSBwYXJ0cy5yZWR1Y2UoKHN1bSwgcGFydDogYW55KSA9PiB7XG5cdFx0XHRcdHN1bSA9IHBhcnQgPyBzdW1bcGFydF0gOiBzdW07XG5cdFx0XHRcdHJldHVybiBzdW07XG5cdFx0XHR9LCB0aGlzLm9WYWx1ZXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0UGF0aCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNbXCIkcGF0aFwiXTtcblx0fSk7XG5cblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vQmluZGluZztcblx0fSk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nPy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdH0pO1xuXHRwdWJsaWMgaXNUcmFuc2llbnQgPSBqZXN0LmZuKCk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIHNldEtlZXBBbGl2ZSA9IGplc3QuZm4oKGJvb2w6IGJvb2xlYW4sIF9mbk9uQmVmb3JlRGVzdHJveT86IGFueSwgX2JSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuKSA9PiB7XG5cdFx0dGhpcy5pc0tlcHRBbGl2ZSA9IGJvb2w7XG5cdH0pO1xuXHRwdWJsaWMgaXNLZWVwQWxpdmUgPSBqZXN0LmZuKCgpID0+IHRoaXMuaXNLZXB0QWxpdmUpO1xuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tVSTVFbGVtZW50IGltcGxlbWVudHMgUGFydGlhbDxVSTVFbGVtZW50PiB7XG5cdFtrZXk6IHN0cmluZ106IGFueTtcblx0cHVibGljIGJpbmRpbmdDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KHt9KTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodGhpcy5iaW5kaW5nQ29udGV4dCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGRhdGEgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldFBhcmVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIGV4dGVuZHMgTW9ja1VJNUVsZW1lbnQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRyb2w+IHtcblx0cHVibGljIGdldEJpbmRpbmdDb250ZXh0OiBqZXN0Lk1vY2s8YW55LCBhbnk+ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWw6IGplc3QuTW9jazxhbnksIGFueT4gPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrRXZlbnQgaW1wbGVtZW50cyBQYXJ0aWFsPEV2ZW50PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sIHB1YmxpYyBzb3VyY2U6IE1vY2tVSTVFbGVtZW50ID0gbmV3IE1vY2tVSTVFbGVtZW50KCkpIHt9XG5cblx0cHVibGljIGdldFBhcmFtZXRlciA9IGplc3QuZm4oKG5hbWUpID0+IHRoaXMucGFyYW1zW25hbWVdKTtcblxuXHRwdWJsaWMgZ2V0U291cmNlID0gamVzdC5mbigoKSA9PiB0aGlzLnNvdXJjZSBhcyBhbnkpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IExpc3RCaW5kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2NrTGlzdEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhTGlzdEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBhTW9ja0NvbnRleHRzOiBNb2NrQ29udGV4dFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihhQ29udGV4dHM/OiBhbnlbXSwgcHJpdmF0ZSBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpIHtcblx0XHRhQ29udGV4dHMgPSBhQ29udGV4dHMgfHwgW107XG5cblx0XHR0aGlzLmFNb2NrQ29udGV4dHMgPSBhQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IE1vY2tDb250ZXh0KGNvbnRleHQsIHRoaXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGlzQShzQ2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiO1xuXHR9XG5cblx0cHVibGljIHNldE1vZGVsKG9Nb2RlbDogTW9ja01vZGVsKSB7XG5cdFx0dGhpcy5tb2NrTW9kZWwgPSBvTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdHB1YmxpYyBzZXRBZ2dyZWdhdGlvbiA9IGplc3QuZm4oKTtcblx0cHVibGljIGZpbHRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIHNvcnQgPSBqZXN0LmZuKCk7XG5cblx0cHVibGljIGdldFF1ZXJ5T3B0aW9uc0Zyb21QYXJhbWV0ZXJzID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0UGF0aCA9IGplc3QuZm4oKTtcblx0cHVibGljIGlzU3VzcGVuZGVkID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVzdW1lID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVmcmVzaCA9IGplc3QuZm4oKTtcblx0cHVibGljIHN1c3BlbmQgPSBqZXN0LmZuKCk7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgcmVxdWVzdENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSBhcyBDb250ZXh0W10pO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgZ2V0Q3VycmVudENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiB0aGlzLmFNb2NrQ29udGV4dHMgYXMgYW55IGFzIENvbnRleHRbXTtcblx0fSk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm1vY2tNb2RlbCBhcyBhbnkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG5cdHB1YmxpYyBnZXRVcGRhdGVHcm91cElkID0gamVzdC5mbigoKSA9PiBcImF1dG9cIik7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrUHJvcGVydHlCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YVByb3BlcnR5QmluZGluZz4ge1xuXHRwcml2YXRlIG1vY2tNb2RlbCE6IEpTT05Nb2RlbDtcblx0cHJpdmF0ZSBtb2NrUGF0aCE6IHN0cmluZztcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobW9ja01vZGVsOiBKU09OTW9kZWwsIG1vY2tQYXRoOiBzdHJpbmcpIHtcblx0XHR0aGlzLnNldE1vZGVsKG1vY2tNb2RlbCk7XG5cdFx0dGhpcy5zZXRQYXRoKG1vY2tQYXRoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5cdH1cblxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBKU09OTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrTW9kZWwgYXMgYW55IGFzIE9EYXRhTW9kZWw7XG5cdH0pO1xuXG5cdHB1YmxpYyBzZXRQYXRoKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdHRoaXMubW9ja1BhdGggPSBwYXRoID8gcGF0aCA6IFwiXCI7XG5cdH1cblx0cHVibGljIGdldFBhdGggPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrUGF0aDtcblx0fSk7XG5cblx0cHVibGljIGdldFZhbHVlID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXM/Lm1vY2tNb2RlbD8uZ2V0UHJvcGVydHkoYC8ke3RoaXMubW9ja1BhdGh9YCk7XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbXBvc2l0ZUJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPENvbXBvc2l0ZUJpbmRpbmc+IHtcblx0cHJpdmF0ZSBhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW10pIHtcblx0XHR0aGlzLmFCaW5kaW5ncyA9IGFCaW5kaW5ncztcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIjtcblx0fVxuXG5cdHB1YmxpYyBnZXRCaW5kaW5ncyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLmFCaW5kaW5ncztcblx0fSk7XG5cblx0cHVibGljIGdldFZhbHVlID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMuYUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5nZXRWYWx1ZSgpKTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udGV4dEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBvTW9ja0NvbnRleHQ6IE1vY2tDb250ZXh0O1xuXHRwcml2YXRlIGlzS2VwdEFsaXZlOiBib29sZWFuID0gZmFsc2U7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9Db250ZXh0PzogYW55LCBwcml2YXRlIG1vY2tNb2RlbD86IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cdHB1YmxpYyBzZXRNb2RlbChvTW9kZWw6IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMubW9ja01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0IGFzIGFueSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGF0dGFjaEV2ZW50T25jZSA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMubW9ja01vZGVsIGFzIGFueSBhcyBPRGF0YU1vZGVsO1xuXHR9KTtcblx0cHVibGljIHNldFBhcmFtZXRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIGV4ZWN1dGUgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodHJ1ZSk7XG5cdHB1YmxpYyBnZXRHcm91cElkID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1ldGFNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9ja01ldGFNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNZXRhTW9kZWw+IHtcblx0cHJpdmF0ZSBvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xuXHRyZXF1ZXN0VmFsdWVMaXN0SW5mbyE6IGplc3QuTW9jazxhbnksIGFueT47XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9NZXRhRGF0YT86IGFueSkge1xuXHRcdHRoaXMub01ldGFDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9NZXRhRGF0YSB8fCB7fSk7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldE1ldGFDb250ZXh0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55IGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0T2JqZWN0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcblx0cHVibGljIGNyZWF0ZUJpbmRpbmdDb250ZXh0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55IGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YVBhdGggPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgbWV0YW1vZGVsID0gbmV3IE9EYXRhTWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIHNQYXRoID8gbWV0YW1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKSA6IHNQYXRoO1xuXHR9KTtcblx0cHVibGljIGdldENvbnRleHQgPSBqZXN0LmZuKCk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTW9kZWxcbiAqL1xuXG5leHBvcnQgY2xhc3MgTW9ja01vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1vZGVsPiB7XG5cdHByaXZhdGUgb01ldGFNb2RlbD86IE1vY2tNZXRhTW9kZWw7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBwcml2YXRlIG1vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdGlmIChtb2NrTGlzdEJpbmRpbmcpIHtcblx0XHRcdG1vY2tMaXN0QmluZGluZy5zZXRNb2RlbCh0aGlzKTtcblx0XHR9XG5cdFx0aWYgKG1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdFx0bW9ja0NvbnRleHRCaW5kaW5nLnNldE1vZGVsKHRoaXMpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEZhY3Rvcmllc1xuXHRzdGF0aWMgbW9kZWxGcm9tTGlzdEJpbmRpbmcobW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKG1vY2tMaXN0QmluZGluZyk7XG5cdH1cblx0c3RhdGljIG1vZGVsRnJvbUNvbnRleHRCaW5kaW5nKG1vY2tDb250ZXh0QmluZGluZzogTW9ja0NvbnRleHRCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0XHRyZXR1cm4gbmV3IE1vY2tNb2RlbCh1bmRlZmluZWQsIG1vY2tDb250ZXh0QmluZGluZyk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TWV0YU1vZGVsKG9NZXRhTW9kZWw6IE1vY2tNZXRhTW9kZWwpIHtcblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kTGlzdCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55IGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kQ29udGV4dCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5tb2NrQ29udGV4dEJpbmRpbmcgYXMgYW55IGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub01ldGFNb2RlbCBhcyBhbnkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRQcm9wZXJ0eSA9IGplc3QuZm4oKTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldEtlZXBBbGl2ZUNvbnRleHQgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrVmlldyBpbXBsZW1lbnRzIFBhcnRpYWw8Vmlldz4ge1xuXHRwdWJsaWMgZ2V0Q29udHJvbGxlciA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZ0NvbnRleHQgPSBqZXN0LmZuKCk7XG5cblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBnZXRWaWV3RGF0YSA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5jb3JlLm12Yy5WaWV3XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SWQgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udHJvbGxlciBpbXBsZW1lbnRzIFBhcnRpYWw8Q29udHJvbGxlcj4ge1xuXHRwdWJsaWMgZ2V0VmlldyA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUobmV3IE1vY2tWaWV3KCkpO1xuXG5cdHB1YmxpYyBfcm91dGluZyA9IHtcblx0XHRuYXZpZ2F0ZVRvVGFyZ2V0OiBqZXN0LmZuKClcblx0fTtcblxuXHRwdWJsaWMgX2VkaXRGbG93ID0ge1xuXHRcdHN5bmNUYXNrOiBqZXN0LmZuKClcblx0fTtcblxuXHRwdWJsaWMgX3NpZGVFZmZlY3RzID0ge1xuXHRcdGhhbmRsZUZpZWxkQ2hhbmdlOiBqZXN0LmZuKClcblx0fTtcblxuXHRpc0EgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNVkNNb2NrIHtcblx0bW9kZWw6IE1vY2tNb2RlbDtcblx0dmlldzogTW9ja1ZpZXc7XG5cdGNvbnRyb2xsZXI6IE1vY2tDb250cm9sbGVyO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIG1vY2tzIHRoYXQgcmVmZXIgdG8gZWFjaCBvdGhlci5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmcgT3B0aW9uYWwgZXhpc3RpbmcgbW9ja2VkIGluc3RhbmNlcyB0aGF0IHNob3VsZCBiZSB1c2VkXG4gKiBAcmV0dXJucyBNb2NrZWQgbW9kZWwsIHZpZXcgYW5kIGNvbnRyb2xsZXIgaW5zdGFuY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrTVZDKGV4aXN0aW5nPzogUGFydGlhbDxNVkNNb2NrPik6IE1WQ01vY2sge1xuXHRjb25zdCBtb2RlbCA9IGV4aXN0aW5nPy5tb2RlbCB8fCBuZXcgTW9ja01vZGVsKCk7XG5cdGNvbnN0IHZpZXcgPSBleGlzdGluZz8udmlldyB8fCBuZXcgTW9ja1ZpZXcoKTtcblx0Y29uc3QgY29udHJvbGxlciA9IGV4aXN0aW5nPy5jb250cm9sbGVyIHx8IG5ldyBNb2NrQ29udHJvbGxlcigpO1xuXG5cdHZpZXcuZ2V0Q29udHJvbGxlci5tb2NrUmV0dXJuVmFsdWUoY29udHJvbGxlcik7XG5cdHZpZXcuZ2V0TW9kZWwubW9ja1JldHVyblZhbHVlKG1vZGVsKTtcblx0Y29udHJvbGxlci5nZXRWaWV3Lm1vY2tSZXR1cm5WYWx1ZSh2aWV3KTtcblxuXHRyZXR1cm4geyBtb2RlbCwgdmlldywgY29udHJvbGxlciB9O1xufVxuIl19
|
|
485
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVNb2NrQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsIm9CaW5kaW5nIiwiaXNJbmFjdGl2ZSIsIm1vY2tlZCIsIm1vY2siLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIkNvbnRleHQiLCJjcmVhdGVOZXdDb250ZXh0IiwiX2lzS2VwdEFsaXZlIiwiX2NvbnRleHREYXRhIiwiX29CaW5kaW5nIiwiX2lzSW5hY3RpdmUiLCJpc0EiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJzQ2xhc3NOYW1lIiwiZ2V0UHJvcGVydHkiLCJrZXkiLCJyZXF1ZXN0UHJvcGVydHkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlcXVlc3RPYmplY3QiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJzZXRLZWVwQWxpdmUiLCJib29sIiwiX2ZuT25CZWZvcmVEZXN0cm95IiwiX2JSZXF1ZXN0TWVzc2FnZXMiLCJpc0tlZXBBbGl2ZSIsIk1vY2tDb250ZXh0IiwiY3JlYXRlTW9ja0V2ZW50IiwicGFyYW1zIiwiRXZlbnQiLCJfcGFyYW1zIiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsIk1vY2tFdmVudCIsImNyZWF0ZU1vY2tMaXN0QmluZGluZyIsImFDb250ZXh0RGF0YSIsIm9Nb2NrTW9kZWwiLCJPRGF0YUxpc3RCaW5kaW5nIiwiX2FNb2NrQ29udGV4dHMiLCJtYXAiLCJjb250ZXh0RGF0YSIsIl9tb2NrTW9kZWwiLCJzZXRNb2RlbCIsIm1vZGVsIiwicmVxdWVzdENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm1vY2tSZXR1cm5WYWx1ZSIsIk1vY2tMaXN0QmluZGluZyIsImNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmciLCJPRGF0YVByb3BlcnR5QmluZGluZyIsIl92YWx1ZSIsIl9wYXRoIiwiZ2V0VmFsdWUiLCJNb2NrUHJvcGVydHlCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmciLCJhQmluZGluZ3MiLCJDb21wb3NpdGVCaW5kaW5nIiwiX2FCaW5kaW5ncyIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJPRGF0YUNvbnRleHRCaW5kaW5nIiwibW9ja01vZGVsIiwib01vY2tDb250ZXh0IiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIm9Nb2RlbCIsImdldEJvdW5kQ29udGV4dCIsImV4ZWN1dGUiLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsIk1vY2tDb250ZXh0QmluZGluZyIsImNyZWF0ZU1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJPRGF0YU1ldGFNb2RlbCIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0Iiwic1BhdGgiLCIkcGF0aCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJtZXRhbW9kZWwiLCJNb2NrTWV0YU1vZGVsIiwiY3JlYXRlTW9ja01vZGVsIiwib01vY2tMaXN0QmluZGluZyIsIm9Nb2NrQ29udGV4dEJpbmRpbmciLCJPRGF0YU1vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwic2V0TWV0YU1vZGVsIiwib01ldGFNb2RlbCIsImJpbmRMaXN0IiwiYmluZENvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJNb2NrTW9kZWwiLCJjcmVhdGVNb2NrTW9kZWxGcm9tTGlzdEJpbmRpbmciLCJjcmVhdGVNb2NrTW9kZWxGcm9tQ29udGV4dEJpbmRpbmciLCJ1bmRlZmluZWQiLCJjcmVhdGVNb2NrVmlldyIsIlZpZXciLCJNb2NrVmlldyIsImNyZWF0ZU1vY2tDb250cm9sbGVyIiwiQ29udHJvbGxlciIsIl9yb3V0aW5nIiwiSW50ZXJuYWxSb3V0aW5nIiwiX2VkaXRGbG93IiwiSW50ZXJuYWxFZGl0RmxvdyIsIl9zaWRlRWZmZWN0cyIsIlNpZGVFZmZlY3RzIiwiZWRpdEZsb3ciLCJFZGl0RmxvdyIsImdldFZpZXciLCJNb2NrQ29udHJvbGxlciIsIm1vY2tNVkMiLCJleGlzdGluZyIsInZpZXciLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVUk1TW9ja0hlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFdpdGhNb2NrIH0gZnJvbSBcIkBzYXAtdXgvamVzdC1tb2NrLXVpNS9kaXN0L2dlbmVyaWNcIjtcbmltcG9ydCB7IG1vY2sgfSBmcm9tIFwiQHNhcC11eC9qZXN0LW1vY2stdWk1L2Rpc3QvZ2VuZXJpY1wiO1xuaW1wb3J0IEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9FZGl0Rmxvd1wiO1xuaW1wb3J0IEludGVybmFsRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsRWRpdEZsb3dcIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IFNpZGVFZmZlY3RzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9TaWRlRWZmZWN0c1wiO1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBDb21wb3NpdGVCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQ29tcG9zaXRlQmluZGluZ1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tDb250ZXh0ID0gV2l0aE1vY2s8Q29udGV4dD4gJiB7XG5cdF9pc0tlcHRBbGl2ZTogYm9vbGVhbjtcblx0X2NvbnRleHREYXRhOiBhbnk7XG5cdF9vQmluZGluZzogYW55O1xuXHRfaXNJbmFjdGl2ZTogYm9vbGVhbjtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tDb250ZXh0LlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dERhdGEgQSBtYXAgb2YgdGhlIGRpZmZlcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBjb250ZXh0LiBUaGUgdmFsdWUgZm9yIHRoZSBrZXkgJyRwYXRoJyB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSAnZ2V0UGF0aCcgbWV0aG9kXG4gKiBAcGFyYW0gb0JpbmRpbmcgVGhlIGJpbmRpbmcgb2YgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBpc0luYWN0aXZlIElzIHRoZSBjb250ZXh0IGluaWFjdGl2ZSBvciBub3RcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dChvQ29udGV4dERhdGE/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbik6IE1vY2tDb250ZXh0IHtcblx0Ly8gVWdseSB3b3JrYXJvdW5kIHRvIGdldCBhIHByb3BlciBtb2NrIHBiamVjdCwgYXMgQ29udGV4dCBpc24ndCBwcm9wZXJseSBleHBvcnRlZCBmcm9tIFVJNVxuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9iamVjdC5nZXRQcm90b3R5cGVPZigoQ29udGV4dCBhcyBhbnkpLmNyZWF0ZU5ld0NvbnRleHQobnVsbCwgbnVsbCwgXCIvZVwiKSkpIGFzIE1vY2tDb250ZXh0O1xuXHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gZmFsc2U7XG5cdG1vY2tlZC5fY29udGV4dERhdGEgPSBvQ29udGV4dERhdGEgfHwge307XG5cdG1vY2tlZC5fb0JpbmRpbmcgPSBvQmluZGluZztcblx0bW9ja2VkLl9pc0luYWN0aXZlID0gISFpc0luYWN0aXZlO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFByb3BlcnR5Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9jb250ZXh0RGF0YVtrZXldO1xuXHR9KTtcblx0bW9ja2VkLm1vY2sucmVxdWVzdFByb3BlcnR5Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5XSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5XSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5zZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0bW9ja2VkLl9jb250ZXh0RGF0YVtrZXldID0gdmFsdWU7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigocGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0bGV0IHJlc3VsdCA9IHBhdGggPyBtb2NrZWQuX2NvbnRleHREYXRhW3BhdGhdIDogbW9ja2VkLl9jb250ZXh0RGF0YTtcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgbW9ja2VkLl9jb250ZXh0RGF0YSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0UGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtcIiRwYXRoXCJdKTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9vQmluZGluZyk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX29CaW5kaW5nPy5nZXRNb2RlbCgpKTtcblx0bW9ja2VkLm1vY2suc2V0S2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoYm9vbDogYm9vbGVhbiwgX2ZuT25CZWZvcmVEZXN0cm95PzogYW55LCBfYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pID0+IHtcblx0XHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gYm9vbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzS2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX2lzS2VwdEFsaXZlKTtcblx0bW9ja2VkLm1vY2suaXNJbmFjdGl2ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9pc0luYWN0aXZlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0OiBuZXcgKG9WYWx1ZXM/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbikgPT4gTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuYmFzZS5FdmVudFxuICovXG5leHBvcnQgdHlwZSBNb2NrRXZlbnQgPSBXaXRoTW9jazxFdmVudD4gJiB7XG5cdF9wYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrRXZlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnRcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tFdmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50KHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBNb2NrRXZlbnQge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKEV2ZW50KSBhcyBNb2NrRXZlbnQ7XG5cdG1vY2tlZC5fcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0UGFyYW1ldGVyLm1vY2tJbXBsZW1lbnRhdGlvbigobmFtZSkgPT4gbW9ja2VkLl9wYXJhbXNbbmFtZV0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrRXZlbnQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tFdmVudDogbmV3IChwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBNb2NrRXZlbnQgPSBjcmVhdGVNb2NrRXZlbnQgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0xpc3RCaW5kaW5nID0gV2l0aE1vY2s8T0RhdGFMaXN0QmluZGluZz4gJiB7XG5cdF9hTW9ja0NvbnRleHRzOiBNb2NrQ29udGV4dFtdO1xuXHRfbW9ja01vZGVsPzogTW9ja01vZGVsO1xuXG5cdC8qKlxuXHQgKiBVdGlsaXR5IG1ldGhvZCB0byBzZXQgdGhlIG1vZGVsIG9mIHRoZSBMaXN0QmluZGluZ1xuXHQgKi9cblx0c2V0TW9kZWw6IChtb2RlbDogTW9ja01vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0xpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBhQ29udGV4dERhdGEgQW4gYXJyYXkgb2Ygb2JqZWN0cyBob2xkaW5nIHRoZSBkaWZmZXJlbnQgcHJvcGVydGllcyBvZiB0aGUgY29udGV4dHMgcmVmZXJlbmNlZCBieSB0aGUgTGlzdEJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgTGlzdEJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tMaXN0QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0xpc3RCaW5kaW5nKGFDb250ZXh0RGF0YT86IGFueVtdLCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja0xpc3RCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YUxpc3RCaW5kaW5nKSBhcyBNb2NrTGlzdEJpbmRpbmc7XG5cdGFDb250ZXh0RGF0YSA9IGFDb250ZXh0RGF0YSB8fCBbXTtcblx0bW9ja2VkLl9hTW9ja0NvbnRleHRzID0gYUNvbnRleHREYXRhLm1hcCgoY29udGV4dERhdGEpID0+IHtcblx0XHRyZXR1cm4gY3JlYXRlTW9ja0NvbnRleHQoY29udGV4dERhdGEsIG1vY2tlZCk7XG5cdH0pO1xuXHRtb2NrZWQuX21vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1vZGVsID0gKG1vZGVsOiBNb2NrTW9kZWwpID0+IHtcblx0XHRtb2NrZWQuX21vY2tNb2RlbCA9IG1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9hTW9ja0NvbnRleHRzKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldEN1cnJlbnRDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FNb2NrQ29udGV4dHM7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRBbGxDdXJyZW50Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0TW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRVcGRhdGVHcm91cElkLm1vY2tSZXR1cm5WYWx1ZShcImF1dG9cIik7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tMaXN0QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0xpc3RCaW5kaW5nOiBuZXcgKGFDb250ZXh0cz86IGFueVtdLCBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpID0+IE1vY2tMaXN0QmluZGluZyA9IGNyZWF0ZU1vY2tMaXN0QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja1Byb3BlcnR5QmluZGluZyA9IFdpdGhNb2NrPE9EYXRhUHJvcGVydHlCaW5kaW5nPiAmIHtcblx0X3ZhbHVlPzogYW55O1xuXHRfcGF0aD86IHN0cmluZztcblx0X21vY2tNb2RlbD86IE1vY2tNb2RlbDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tQcm9wZXJ0eUJpbmRpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSByZXR1cm5kIGJ5IHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrUHJvcGVydHlCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrUHJvcGVydHlCaW5kaW5nKHZhbHVlOiBhbnksIHBhdGg/OiBzdHJpbmcsIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrUHJvcGVydHlCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YVByb3BlcnR5QmluZGluZykgYXMgTW9ja1Byb3BlcnR5QmluZGluZztcblx0bW9ja2VkLl9tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXHRtb2NrZWQuX3ZhbHVlID0gdmFsdWU7XG5cdG1vY2tlZC5fcGF0aCA9IHBhdGg7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fbW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0VmFsdWUubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl92YWx1ZTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFBhdGgubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9wYXRoO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja1Byb3BlcnR5QmluZGluZzogbmV3ICh2YWx1ZTogYW55LCBvTW9ja01vZGVsPzogTW9ja01vZGVsKSA9PiBNb2NrUHJvcGVydHlCaW5kaW5nID0gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29tcG9zaXRlQmluZGluZyA9IFdpdGhNb2NrPENvbXBvc2l0ZUJpbmRpbmc+ICYge1xuXHRfYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW107XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29tcG9zaXRlQmluZGluZy5cbiAqXG4gKiBAcGFyYW0gYUJpbmRpbmdzIFRoZSBiaW5kaW5ncyBvZiB0aGUgQ29tcG9zaXRlQmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbXBvc2l0ZUJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nKGFCaW5kaW5nczogTW9ja1Byb3BlcnR5QmluZGluZ1tdKTogTW9ja0NvbXBvc2l0ZUJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbXBvc2l0ZUJpbmRpbmcpIGFzIE1vY2tDb21wb3NpdGVCaW5kaW5nO1xuXHRtb2NrZWQuX2FCaW5kaW5ncyA9IGFCaW5kaW5ncztcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCaW5kaW5ncy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FCaW5kaW5ncztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFZhbHVlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5nZXRWYWx1ZSgpKTtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrQ29tcG9zaXRlQmluZGluZzogbmV3IChhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXSkgPT4gTW9ja0NvbXBvc2l0ZUJpbmRpbmcgPSBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udGV4dEJpbmRpbmcgPSBXaXRoTW9jazxPRGF0YUNvbnRleHRCaW5kaW5nPiAmIHtcblx0b01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblx0aXNLZXB0QWxpdmU6IGJvb2xlYW47XG5cdG1vY2tNb2RlbD86IE1vY2tNb2RlbDtcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbCBNb2NrQ29udGV4dCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdGdldEludGVybmFsTW9ja0NvbnRleHQ6ICgpID0+IE1vY2tDb250ZXh0O1xuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtb2RlbCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdHNldE1vZGVsOiAob01vZGVsOiBNb2NrTW9kZWwpID0+IHZvaWQ7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udGV4dEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHBhcmFtIG9Nb2NrTW9kZWwgVGhlIG1vZGVsIG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbnRleHRCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcob0NvbnRleHQ/OiBhbnksIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhQ29udGV4dEJpbmRpbmcpIGFzIE1vY2tDb250ZXh0QmluZGluZztcblx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cdG1vY2tlZC5vTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgbW9ja2VkKTtcblxuXHQvLyBVdGlsaXR5IEFQSVxuXHRtb2NrZWQuZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fTtcblx0bW9ja2VkLnNldE1vZGVsID0gKG9Nb2RlbDogTW9ja01vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCb3VuZENvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5leGVjdXRlLm1vY2tSZXNvbHZlZFZhbHVlKHRydWUpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0QmluZGluZzogbmV3IChvQ29udGV4dD86IGFueSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCkgPT4gTW9ja0NvbnRleHRCaW5kaW5nID0gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrTWV0YU1vZGVsID0gV2l0aE1vY2s8T0RhdGFNZXRhTW9kZWw+ICYge1xuXHRvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01ldGFNb2RlbC5cbiAqXG4gKiBAcGFyYW0gb01ldGFEYXRhIEEgbWFwIG9mIHRoZSBkaWZmZXJlbnQgbWV0YWRhdGEgcHJvcGVydGllcyBvZiB0aGUgTWV0YU1vZGVsIChwYXRoIC0+IHZhbHVlKS5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNZXRhTW9kZWwob01ldGFEYXRhPzogYW55KTogTW9ja01ldGFNb2RlbCB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFNZXRhTW9kZWwpIGFzIE1vY2tNZXRhTW9kZWw7XG5cdG1vY2tlZC5vTWV0YUNvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0TWV0YUNvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIGNyZWF0ZU1vY2tDb250ZXh0KHsgJHBhdGg6IHNQYXRoIH0pO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQub01ldGFDb250ZXh0LmdldFByb3BlcnR5KHNQYXRoKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmNyZWF0ZUJpbmRpbmdDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBjcmVhdGVNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1ldGFQYXRoLm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IG1ldGFtb2RlbCA9IG5ldyBPRGF0YU1ldGFNb2RlbCgpO1xuXHRcdHJldHVybiBzUGF0aCA/IG1ldGFtb2RlbC5nZXRNZXRhUGF0aChzUGF0aCkgOiBzUGF0aDtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNZXRhTW9kZWwgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tNZXRhTW9kZWw6IG5ldyAob01ldGFEYXRhPzogYW55KSA9PiBNb2NrTWV0YU1vZGVsID0gY3JlYXRlTW9ja01ldGFNb2RlbCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrTW9kZWwgPSBXaXRoTW9jazxPRGF0YU1vZGVsPiAmIHtcblx0b01ldGFNb2RlbD86IE1vY2tNZXRhTW9kZWw7XG5cdG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZztcblx0bW9ja0NvbnRleHRCaW5kaW5nPzogTW9ja0NvbnRleHRCaW5kaW5nO1xuXG5cdC8qKlxuXHQgKiBVdGlsaXR5IG1ldGhvZCB0byBzZXQgdGhlIG1ldGFtb2RlbCBvZiB0aGUgTW9ja01vZGVsXG5cdCAqL1xuXHRzZXRNZXRhTW9kZWw6IChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsLlxuICpcbiAqIEBwYXJhbSBvTW9ja0xpc3RCaW5kaW5nIEEgbGlzdCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZExpc3QuXG4gKiBAcGFyYW0gb01vY2tDb250ZXh0QmluZGluZyBBIGNvbnRleHQgYmluZGluZyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgd2hlbiBjYWxsaW5nIGJpbmRDb250ZXh0LlxuICogQHJldHVybnMgQSBuZXcgTW9ja01vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrTW9kZWwob01vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgb01vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFNb2RlbCkgYXMgTW9ja01vZGVsO1xuXHRtb2NrZWQubW9ja0xpc3RCaW5kaW5nID0gb01vY2tMaXN0QmluZGluZztcblx0bW9ja2VkLm1vY2tDb250ZXh0QmluZGluZyA9IG9Nb2NrQ29udGV4dEJpbmRpbmc7XG5cdGlmIChvTW9ja0xpc3RCaW5kaW5nKSB7XG5cdFx0b01vY2tMaXN0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cdGlmIChvTW9ja0NvbnRleHRCaW5kaW5nKSB7XG5cdFx0b01vY2tDb250ZXh0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1ldGFNb2RlbCA9IChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suYmluZExpc3QubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm1vY2tMaXN0QmluZGluZztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmJpbmRDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNZXRhTW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9NZXRhTW9kZWw7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrTW9kZWwgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tNb2RlbDogbmV3IChvTW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBvTW9ja0NvbnRleHRCaW5kaW5nPzogTW9ja0NvbnRleHRCaW5kaW5nKSA9PiBNb2NrTW9kZWwgPVxuXHRjcmVhdGVNb2NrTW9kZWwgYXMgYW55O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrTW9kZWwgdXNlZCB3aXRoIGEgbGlzdEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Nb2NrTGlzdEJpbmRpbmcgQSBsaXN0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kTGlzdC5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsRnJvbUxpc3RCaW5kaW5nKG9Nb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdHJldHVybiBjcmVhdGVNb2NrTW9kZWwob01vY2tMaXN0QmluZGluZyk7XG59XG4vKipcbiAqICBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrTW9kZWwgdXNlZCB3aXRoIGEgY29udGV4dEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Nb2NrQ29udGV4dEJpbmRpbmcgQSBjb250ZXh0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kQ29udGV4dC5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsRnJvbUNvbnRleHRCaW5kaW5nKG9Nb2NrQ29udGV4dEJpbmRpbmc6IE1vY2tDb250ZXh0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdHJldHVybiBjcmVhdGVNb2NrTW9kZWwodW5kZWZpbmVkLCBvTW9ja0NvbnRleHRCaW5kaW5nKTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5jb3JlLm12Yy5WaWV3XG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tWaWV3ID0gV2l0aE1vY2s8Vmlldz47XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tWaWV3LlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tWaWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrVmlldygpOiBNb2NrVmlldyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soVmlldyk7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkuY29yZS5tdmMuVmlld1wiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1ZpZXcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tWaWV3OiBuZXcgKCkgPT4gTW9ja1ZpZXcgPSBjcmVhdGVNb2NrVmlldyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAuZmUuY29yZS5QYWdlQ29udHJvbGxlclxuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udHJvbGxlciA9IFdpdGhNb2NrPENvbnRyb2xsZXI+ICYge1xuXHRfcm91dGluZzogV2l0aE1vY2s8SW50ZXJuYWxSb3V0aW5nPjtcblx0X2VkaXRGbG93OiBXaXRoTW9jazxJbnRlcm5hbEVkaXRGbG93Pjtcblx0X3NpZGVFZmZlY3RzOiBXaXRoTW9jazxTaWRlRWZmZWN0cz47XG5cdGVkaXRGbG93OiBXaXRoTW9jazxFZGl0Rmxvdz47XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udHJvbGxlci5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrQ29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTogTW9ja0NvbnRyb2xsZXIge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbnRyb2xsZXIpIGFzIE1vY2tDb250cm9sbGVyO1xuXHRtb2NrZWQuX3JvdXRpbmcgPSBtb2NrKEludGVybmFsUm91dGluZyk7XG5cdG1vY2tlZC5fZWRpdEZsb3cgPSBtb2NrKEludGVybmFsRWRpdEZsb3cpO1xuXHRtb2NrZWQuX3NpZGVFZmZlY3RzID0gbW9jayhTaWRlRWZmZWN0cyk7XG5cdG1vY2tlZC5lZGl0RmxvdyA9IG1vY2soRWRpdEZsb3cpO1xuXG5cdC8vIERlZmF1bHQgQmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUoY3JlYXRlTW9ja1ZpZXcoKSk7XG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBtb2NrQ29udHJvbGxlciBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0NvbnRyb2xsZXI6IG5ldyAoKSA9PiBNb2NrQ29udHJvbGxlciA9IGNyZWF0ZU1vY2tDb250cm9sbGVyIGFzIGFueTtcblxuZXhwb3J0IGludGVyZmFjZSBNVkNNb2NrIHtcblx0bW9kZWw6IE1vY2tNb2RlbDtcblx0dmlldzogTW9ja1ZpZXc7XG5cdGNvbnRyb2xsZXI6IE1vY2tDb250cm9sbGVyO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBtb2NrcyB0aGF0IHJlZmVyIHRvIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nIE9wdGlvbmFsIGV4aXN0aW5nIG1vY2tlZCBpbnN0YW5jZXMgdGhhdCBzaG91bGQgYmUgdXNlZFxuICogQHJldHVybnMgTW9ja2VkIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIGluc3RhbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja01WQyhleGlzdGluZz86IFBhcnRpYWw8TVZDTW9jaz4pOiBNVkNNb2NrIHtcblx0Y29uc3QgbW9kZWwgPSBleGlzdGluZz8ubW9kZWwgfHwgY3JlYXRlTW9ja01vZGVsKCk7XG5cdGNvbnN0IHZpZXcgPSBleGlzdGluZz8udmlldyB8fCBjcmVhdGVNb2NrVmlldygpO1xuXHRjb25zdCBjb250cm9sbGVyID0gZXhpc3Rpbmc/LmNvbnRyb2xsZXIgfHwgY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTtcblxuXHR2aWV3Lm1vY2suZ2V0Q29udHJvbGxlci5tb2NrUmV0dXJuVmFsdWUoY29udHJvbGxlcik7XG5cdHZpZXcubW9jay5nZXRNb2RlbC5tb2NrUmV0dXJuVmFsdWUobW9kZWwpO1xuXHRjb250cm9sbGVyLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUodmlldyk7XG5cblx0cmV0dXJuIHsgbW9kZWwsIHZpZXcsIGNvbnRyb2xsZXIgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7OztFQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsaUJBQVQsQ0FBMkJDLFlBQTNCLEVBQStDQyxRQUEvQyxFQUErREMsVUFBL0QsRUFBa0c7SUFD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
|