@sapui5/sap.fe.core 1.136.8 → 1.136.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +28 -16
- package/src/sap/fe/core/AppComponent.ts +36 -20
- package/src/sap/fe/core/AppStateHandler.js +6 -5
- package/src/sap/fe/core/AppStateHandler.ts +5 -5
- package/src/sap/fe/core/PageController.js +4 -4
- package/src/sap/fe/core/PageController.ts +3 -3
- package/src/sap/fe/core/TemplateComponent.js +3 -3
- package/src/sap/fe/core/TemplateComponent.ts +2 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +159 -34
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +177 -39
- package/src/sap/fe/core/controllerextensions/SideEffects.js +7 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +28 -17
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +35 -18
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +5 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +3 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +13 -9
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +13 -9
- package/src/sap/fe/core/converters/annotations/DataField.js +6 -2
- package/src/sap/fe/core/converters/annotations/DataField.ts +5 -1
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +6 -5
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +5 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -2
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle_da.properties +3 -3
- package/src/sap/fe/core/messagebundle_es.properties +1 -1
- package/src/sap/fe/core/messagebundle_fr.properties +9 -9
- package/src/sap/fe/core/messagebundle_hu.properties +1 -1
- package/src/sap/fe/core/messagebundle_id.properties +1 -1
- package/src/sap/fe/core/messagebundle_ja.properties +1 -1
- package/src/sap/fe/core/messagebundle_lv.properties +1 -1
- package/src/sap/fe/core/messagebundle_uk.properties +1 -1
- package/src/sap/fe/core/messagebundle_zh_CN.properties +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +17 -17
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +24 -29
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +13 -6
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +17 -5
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
- package/src/sap/fe/core/templating/UIFormatters.js +2 -2
- package/src/sap/fe/core/templating/UIFormatters.ts +1 -1
|
@@ -65,9 +65,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
65
65
|
* @param bSkipBindingToView The optional parameter to skip the binding to the view
|
|
66
66
|
* @param context The context to be used for the draft operations
|
|
67
67
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
68
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped
|
|
68
69
|
* @returns Nothing
|
|
69
70
|
*/
|
|
70
|
-
async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context, hiddenDraft) {
|
|
71
|
+
async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context, hiddenDraft, skipBackNavigation) {
|
|
71
72
|
// There is no active entity so, we are editing either newly created data or
|
|
72
73
|
// a draft which has never been saved to active version
|
|
73
74
|
// Since we want to react differently in the two situations, we have to check the
|
|
@@ -78,7 +79,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
78
79
|
// navigation we can silently discard the draft again
|
|
79
80
|
// eslint-disable-next-line promise/no-nesting
|
|
80
81
|
try {
|
|
81
|
-
await draftDataLossPopup.discardDraft(oController, bSkipBindingToView, context, hiddenDraft);
|
|
82
|
+
await draftDataLossPopup.discardDraft(oController, bSkipBindingToView, context, hiddenDraft, skipBackNavigation);
|
|
82
83
|
processFunctionForDrafts();
|
|
83
84
|
} catch (error) {
|
|
84
85
|
Log.error("Error while canceling the document", error);
|
|
@@ -90,7 +91,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
90
91
|
} else {
|
|
91
92
|
// In this case data is being changed or a forward navigation is triggered
|
|
92
93
|
// and, we always want to show the data loss dialog on navigation
|
|
93
|
-
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context, hiddenDraft));
|
|
94
|
+
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context, hiddenDraft, skipBackNavigation));
|
|
94
95
|
}
|
|
95
96
|
} else {
|
|
96
97
|
// We are editing a draft which has been created earlier but never saved to active
|
|
@@ -171,12 +172,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
171
172
|
* @param navigationType The navigation type for which the function should be called
|
|
172
173
|
* @param hasActiveEntity Boolean value which mentions if root context has active entity or not
|
|
173
174
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
175
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped
|
|
174
176
|
* @returns Nothing
|
|
175
177
|
*/
|
|
176
178
|
async function processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, context, oController, bSkipBindingToView) {
|
|
177
179
|
let navigationType = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : NavigationType.BackNavigation;
|
|
178
180
|
let hasActiveEntity = arguments.length > 7 ? arguments[7] : undefined;
|
|
179
181
|
let hiddenDraft = arguments.length > 8 ? arguments[8] : undefined;
|
|
182
|
+
let skipBackNavigation = arguments.length > 9 ? arguments[9] : undefined;
|
|
180
183
|
const collaborationConnected = oController.collaborativeDraft.isConnected();
|
|
181
184
|
const processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
|
|
182
185
|
oController.collaborativeDraft.disconnect();
|
|
@@ -190,7 +193,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
190
193
|
if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
|
|
191
194
|
await processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, context, hiddenDraft);
|
|
192
195
|
} else if (!hasActiveEntity) {
|
|
193
|
-
processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, undefined, hiddenDraft);
|
|
196
|
+
processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, undefined, hiddenDraft, skipBackNavigation);
|
|
194
197
|
} else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime && (!hiddenDraft || hiddenDraft && !oController.editFlow.isDocumentModified())) {
|
|
195
198
|
processEditingDraftForExistingEntity(oController, context, processFunctionForDrafts, navigationType);
|
|
196
199
|
} else if (EditState.isEditStateDirty()) {
|
|
@@ -208,17 +211,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
208
211
|
|
|
209
212
|
/**
|
|
210
213
|
* The general handler in which the individual steps are called.
|
|
211
|
-
* @param fnProcessFunction
|
|
212
|
-
* @param fnCancelFunction
|
|
213
|
-
* @param oContext
|
|
214
|
-
* @param oController
|
|
215
|
-
* @param bSkipBindingToView
|
|
216
|
-
* @param navigationType
|
|
217
|
-
* @param alwaysShowInHiddenDraft
|
|
214
|
+
* @param fnProcessFunction Function to process after confirmation.
|
|
215
|
+
* @param fnCancelFunction Function to process on cancel.
|
|
216
|
+
* @param oContext Context for the operation.
|
|
217
|
+
* @param oController Controller of the current view.
|
|
218
|
+
* @param bSkipBindingToView Optional parameter to skip binding to the view.
|
|
219
|
+
* @param navigationType Navigation type for the operation.
|
|
220
|
+
* @param alwaysShowInHiddenDraft Whether to always show dialog in hidden draft mode.
|
|
221
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped.
|
|
218
222
|
*/
|
|
219
223
|
async function processDataLossOrDraftDiscardConfirmation(fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
|
|
220
224
|
let navigationType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : NavigationType.BackNavigation;
|
|
221
225
|
let alwaysShowInHiddenDraft = arguments.length > 6 ? arguments[6] : undefined;
|
|
226
|
+
let skipBackNavigation = arguments.length > 7 ? arguments[7] : undefined;
|
|
222
227
|
const oView = oController.getView();
|
|
223
228
|
const oModel = oView.getBindingContext().getModel();
|
|
224
229
|
const oMetaModel = oModel.getMetaModel();
|
|
@@ -245,7 +250,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
245
250
|
// The following 3 properties are needed to determine the state of the draft, so we ensure they are loaded
|
|
246
251
|
await oContext.requestProperty(["DraftAdministrativeData/CreationDateTime", "DraftAdministrativeData/LastChangeDateTime", "HasActiveEntity"]);
|
|
247
252
|
const draftAdminData = oContext.getObject("DraftAdministrativeData");
|
|
248
|
-
await processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, hiddenDraft ? originalContext : oContext, oController, bSkipBindingToView, navigationType, oContext.getProperty("HasActiveEntity"), hiddenDraft);
|
|
253
|
+
await processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, hiddenDraft ? originalContext : oContext, oController, bSkipBindingToView, navigationType, oContext.getProperty("HasActiveEntity"), hiddenDraft, skipBackNavigation);
|
|
249
254
|
} catch (oError) {
|
|
250
255
|
Log.error("Cannot retrieve draftDataContext information", oError);
|
|
251
256
|
fnProcessFunction();
|
|
@@ -279,12 +284,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
279
284
|
* @param skipBindingToView The parameter to skip the binding to the view
|
|
280
285
|
* @param context The context to be used for the draft operations
|
|
281
286
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
287
|
+
* @param skipBackNavigation Boolean value which determines if back navigation should be skipped
|
|
282
288
|
* @returns A promise resolved if cancelDocument was successful
|
|
283
289
|
*/
|
|
284
|
-
async function discardDraft(controller, skipBindingToView, context, hiddenDraft) {
|
|
290
|
+
async function discardDraft(controller, skipBindingToView, context, hiddenDraft, skipBackNavigation) {
|
|
285
291
|
context = context ?? controller.getView().getBindingContext();
|
|
292
|
+
let skipBackNavigationValue = skipBackNavigation;
|
|
293
|
+
if (!skipBackNavigation) {
|
|
294
|
+
skipBackNavigationValue = hiddenDraft === true && !context.getProperty("HasActiveEntity") ? false : true;
|
|
295
|
+
}
|
|
286
296
|
const params = {
|
|
287
|
-
skipBackNavigation:
|
|
297
|
+
skipBackNavigation: skipBackNavigationValue,
|
|
288
298
|
skipDiscardPopover: true,
|
|
289
299
|
skipBindingToView: skipBindingToView !== undefined ? skipBindingToView : true
|
|
290
300
|
};
|
|
@@ -300,8 +310,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
300
310
|
* @param skipBindingToView The parameter to skip the binding to the view
|
|
301
311
|
* @param context The context to be used for the binding
|
|
302
312
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
313
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped
|
|
303
314
|
*/
|
|
304
|
-
function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView, context, hiddenDraft) {
|
|
315
|
+
function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView, context, hiddenDraft, skipBackNavigation) {
|
|
305
316
|
switch (selectedKey) {
|
|
306
317
|
case DraftDataLossOptions.Save:
|
|
307
318
|
draftDataLossPopup.saveDocument(controller, context, skipBindingToView).then(savedContext => processFunctionForDrafts(savedContext)).catch(function (error) {
|
|
@@ -317,7 +328,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
317
328
|
dataLossDialog.close();
|
|
318
329
|
break;
|
|
319
330
|
case DraftDataLossOptions.Discard:
|
|
320
|
-
draftDataLossPopup.discardDraft(controller, skipBindingToView, context, hiddenDraft).then(discardedDraft => processFunctionForDrafts(discardedDraft)).catch(function (error) {
|
|
331
|
+
draftDataLossPopup.discardDraft(controller, skipBindingToView, context, hiddenDraft, skipBackNavigation).then(discardedDraft => processFunctionForDrafts(discardedDraft)).catch(function (error) {
|
|
321
332
|
Log.error("Error while discarding draft", error);
|
|
322
333
|
});
|
|
323
334
|
dataLossDialog.close();
|
|
@@ -341,4 +352,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
|
|
|
341
352
|
};
|
|
342
353
|
return draftDataLossPopup;
|
|
343
354
|
}, false);
|
|
344
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwicGFnZUNvbnRyb2xsZXIiLCJvTWFuaWZlc3QiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRNYW5pZmVzdEVudHJ5IiwiYXBwIiwicHJvY2Vzc0ZjbE1vZGUiLCJkcmFmdEFkbWluRGF0YSIsImZuQ2FuY2VsRnVuY3Rpb24iLCJvQ29udHJvbGxlciIsInByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyIsImJTa2lwQmluZGluZ1RvVmlldyIsImNvbnRleHQiLCJoaWRkZW5EcmFmdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJlZGl0RmxvdyIsImlzRG9jdW1lbnRNb2RpZmllZCIsIm9wZW4iLCJ0aGVuIiwic2VsZWN0ZWRLZXkiLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJoYW5kbGVEaWFsb2dTZWxlY3Rpb24iLCJwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlIiwibmF2aWdhdGlvblR5cGUiLCJiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIkJhY2tOYXZpZ2F0aW9uIiwiZGlzY2FyZERyYWZ0IiwiZXJyb3IiLCJMb2ciLCJGb3J3YXJkTmF2aWdhdGlvbiIsInByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJza2lwQmluZGluZ1RvVmlldyIsImNhbmNlbERvY3VtZW50IiwicHJvY2Vzc0VkaXRTdGF0ZURpcnR5IiwicHJvY2Vzc0RyYWZ0QWRtaW5EYXRhIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJoYXNBY3RpdmVFbnRpdHkiLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJhcHBseSIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiYWx3YXlzU2hvd0luSGlkZGVuRHJhZnQiLCJvVmlldyIsImdldFZpZXciLCJvTW9kZWwiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsImlzRHJhZnRSb290IiwiZ2V0T2JqZWN0IiwiYklzRWRpdGFibGUiLCJDb21tb25VdGlscyIsImdldElzRWRpdGFibGUiLCJvcmlnaW5hbENvbnRleHQiLCJkcmFmdFJvb3RQYXRoIiwiZ2V0UGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0RHJhZnRSb290UGF0aCIsImJpbmRDb250ZXh0IiwiJGV4cGFuZCIsImdldEJvdW5kQ29udGV4dCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJlbmFibGVkIiwiYmFja05hdlNob3dzRGlhbG9nIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0V4aXRzQXBwIiwiaXNEZWxldGVkIiwicmVxdWVzdFByb3BlcnR5IiwiZ2V0UHJvcGVydHkiLCJvRXJyb3IiLCJzYXZlRG9jdW1lbnQiLCJjb250cm9sbGVyIiwiaGFzSW5pdGlhbENvbnRleHQiLCJpc0EiLCJfc2F2ZURvY3VtZW50IiwicGFyYW1zIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwiU2F2ZSIsInNhdmVkQ29udGV4dCIsImNhdGNoIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiY2xvc2UiLCJLZWVwIiwiRGlzY2FyZCIsImRpc2NhcmRlZERyYWZ0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJkcmFmdERhdGFMb3NzUG9wdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL09iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IERyYWZ0RGF0YUxvc3NEaWFsb2cgZnJvbSBcIi4uLy4uL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRHJhZnREYXRhTG9zc0RpYWxvZ1wiO1xuaW1wb3J0IHsgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi8uLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSB7IEhpZGRlbkRyYWZ0IH0gZnJvbSBcIi4uLy4uL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuXG4vKiBFbnVtIGZvciBuYXZpZ2F0aW9uIHR5cGVzICovXG5lbnVtIE5hdmlnYXRpb25UeXBlIHtcblx0QmFja05hdmlnYXRpb24gPSBcIkJhY2tOYXZpZ2F0aW9uXCIsXG5cdEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXG59XG5cbi8qIEVudW0gdHlwZXMgZm9yIHRoZSBkYXRhIGxvc3MgZGlhbG9nIG9wdGlvbnMgKi9cbmVudW0gRHJhZnREYXRhTG9zc09wdGlvbnMge1xuXHRTYXZlID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uU2F2ZVwiLFxuXHRLZWVwID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uS2VlcFwiLFxuXHREaXNjYXJkID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uRGlzY2FyZFwiXG59XG5cbnR5cGUgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgPSB7XG5cdENyZWF0aW9uRGF0ZVRpbWU6IERhdGU7XG5cdExhc3RDaGFuZ2VEYXRlVGltZTogRGF0ZTtcbn07XG5cbi8qQ3JlYXRlIHRoZSBkYXRhIGxvc3MgZGlhbG9nKi9cbmNvbnN0IGRhdGFMb3NzRGlhbG9nID0gbmV3IERyYWZ0RGF0YUxvc3NEaWFsb2coXCJmZTo6RHJhZnREYXRhTG9zc1BvcHVwXCIpO1xuXG4vKipcbiAqIFRoZSBtZXRob2QgY2hlY2tzIHdoZXRoZXIgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGluIHRoZSBtYW5pZmVzdCBpcyBzZXQgdG8gc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgaW4gY2FzZSBhIGZvcndhcmQgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0gcGFnZUNvbnRyb2xsZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBQYWdlQ29udHJvbGxlciBpbnN0YW5jZVxuICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSB3aXRoIHRydWUgb3IgZmFsc2UgdG8gc2lsZW50bHkga2VlcCB0aGUgZHJhZnRcbiAqL1xuZnVuY3Rpb24gc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKHBhZ2VDb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcik6IGJvb2xlYW4ge1xuXHRjb25zdCBvTWFuaWZlc3QgPSBwYWdlQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmZlXCIpO1xuXHRyZXR1cm4gb01hbmlmZXN0Py5hcHA/LnNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBGQ0wgbW9kZS5cbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICogQHBhcmFtIGhpZGRlbkRyYWZ0IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgaGlkZGVuIGRyYWZ0IGlzIGVuYWJsZWQgb3Igbm90XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGY2xNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCxcblx0aGlkZGVuRHJhZnQ/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gVGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gRkNMIG1vZGUgc28gaW4gdGhpcyBjYXNlIHdlIGZhbGwgYmFjayB0b1xuXHQvLyB0aGUgb2xkIGxvZ2ljIHNpbmNlIHRoZSBkaXJ0eSBzdGF0ZSBoYW5kbGluZyBpcyBub3QgcHJvcGVybHkgd29ya2luZ1xuXHQvLyBmb3IgRkNMLlxuXHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmICFvQ29udHJvbGxlci5lZGl0Rmxvdy5pc0RvY3VtZW50TW9kaWZpZWQoKSkge1xuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdGhpZGRlbkRyYWZ0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBtb2RlIHdpdGggbm8gYWN0aXZlIGVudGl0eS5cbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEBwYXJhbSBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIFRoZSBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2tpcCB0aGUgcG9wdXAgYXBwZWFyYW5jZSBpbiBmb3J3YXJkIGNhc2VcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uc1xuICogQHBhcmFtIGhpZGRlbkRyYWZ0IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgaGlkZGVuIGRyYWZ0IGlzIGVuYWJsZWQgb3Igbm90XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUoXG5cdGRyYWZ0QWRtaW5EYXRhOiBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSxcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBGdW5jdGlvbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBib29sZWFuLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHQsXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFRoZXJlIGlzIG5vIGFjdGl2ZSBlbnRpdHkgc28sIHdlIGFyZSBlZGl0aW5nIGVpdGhlciBuZXdseSBjcmVhdGVkIGRhdGEgb3Jcblx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHQvLyBTaW5jZSB3ZSB3YW50IHRvIHJlYWN0IGRpZmZlcmVudGx5IGluIHRoZSB0d28gc2l0dWF0aW9ucywgd2UgaGF2ZSB0byBjaGVjayB0aGVcblx0Ly8gZGlydHkgc3RhdGVcblx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRpZiAoXG5cdFx0XHRkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUgJiZcblx0XHRcdCFvQ29udHJvbGxlci5lZGl0Rmxvdy5pc0RvY3VtZW50TW9kaWZpZWQoKSAmJlxuXHRcdFx0bmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0KSB7XG5cdFx0XHQvLyBpbiBjYXNlIHdlIGhhdmUgdW50b3VjaGVkIGNoYW5nZXMgZm9yIHRoZSBkcmFmdCBhbmQgYSBcImJhY2tcIlxuXHRcdFx0Ly8gbmF2aWdhdGlvbiB3ZSBjYW4gc2lsZW50bHkgZGlzY2FyZCB0aGUgZHJhZnQgYWdhaW5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL25vLW5lc3Rpbmdcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0RGF0YUxvc3NQb3B1cC5kaXNjYXJkRHJhZnQob0NvbnRyb2xsZXIsIGJTa2lwQmluZGluZ1RvVmlldywgY29udGV4dCwgaGlkZGVuRHJhZnQpO1xuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0XHQvLyBJbiBjYXNlIHdlIGhhdmUgYSBcImZvcndhcmQgbmF2aWdhdGlvblwiIGFuZCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgZGF0YSBpcyBiZWluZyBjaGFuZ2VkIG9yIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHRcdFx0Ly8gYW5kLCB3ZSBhbHdheXMgd2FudCB0byBzaG93IHRoZSBkYXRhIGxvc3MgZGlhbG9nIG9uIG5hdmlnYXRpb25cblx0XHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0XHQub3BlbihvQ29udHJvbGxlcilcblx0XHRcdFx0LnRoZW4oKHNlbGVjdGVkS2V5KSA9PlxuXHRcdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0XHRzZWxlY3RlZEtleSBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdFx0aGlkZGVuRHJhZnRcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFdlIGFyZSBlZGl0aW5nIGEgZHJhZnQgd2hpY2ggaGFzIGJlZW4gY3JlYXRlZCBlYXJsaWVyIGJ1dCBuZXZlciBzYXZlZCB0byBhY3RpdmVcblx0XHQvLyB2ZXJzaW9uIGFuZCBzaW5jZSB0aGUgZWRpdCBzdGF0ZSBpcyBub3QgZGlydHksIHRoZXJlIGhhdmUgYmVlbiBubyB1c2VyIGNoYW5nZXNcblx0XHQvLyBzbyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBzaWxlbnRseSBuYXZpZ2F0ZSBhbmQgZG8gbm90aGluZ1xuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgZHJhZnQgZWRpdGluZyBmb3IgZXhpc3RpbmcgZW50aXR5LlxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBjYWxsXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5KFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBGdW5jdGlvbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHQvLyBUaGUgQ3JlYXRpb25EYXRlVGltZSBhbmQgTGFzdENoYW5nZURhdGVUaW1lIGFyZSBlcXVhbCwgc28gdGhpcyBkcmFmdCB3YXNcblx0Ly8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXG5cdC8vIGFuIGV4aXN0aW5nIGFjdGl2ZSBlbnRpdHkgZm9yIHRoZSBmaXJzdCB0aW1lLlxuXHQvLyBBbHNvLCB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0Ly8gY2FzZSB3ZSB3YW50IHRvIHNpbGVudGx5IG5hdmlnYXRlIGFuZCBkZWxldGUgdGhlIGRyYWZ0IGluIGNhc2Ugb2YgYSBiYWNrXG5cdC8vIG5hdmlnYXRpb24gYnV0IGluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugd2FudCB0byBzaWxlbnRseSBrZWVwIGl0IVxuXHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWUsXG5cdFx0XHRza2lwQmluZGluZ1RvVmlldzogdHJ1ZVxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgb0NvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIEVycm9yKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBhbmQgb25seVxuXHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgY29udGV4dCB3aGVuIHRoZSBlZGl0IHN0YXRlIGlzIGluIGRpcnR5IG1vZGUuXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKiBAcGFyYW0gYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiBUaGUgcGFyYW1ldGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNraXAgdGhlIHBvcHVwIGFwcGVhcmFuY2UgaW4gZm9yd2FyZCBjYXNlXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlldy5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0VkaXRTdGF0ZURpcnR5KFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCxcblx0aGlkZGVuRHJhZnQ/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0Ly8gSW4gY2FzZSB3ZSBoYXZlIGEgXCJmb3J3YXJkIG5hdmlnYXRpb25cIiBhbmQgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgc2V0IGluIHRoZSBtYW5pZmVzdFxuXHRcdC8vIHdlIFwic2lsZW50bHlcIiBrZWVwIHRoZSBkcmFmdFxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdC8vIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyB3ZSB3YW50XG5cdFx0Ly8gdG8gc2hvdyB0aGUgZGF0YSBsb3NzIGRpYWxvZyBhbmQgbGV0IHRoZSB1c2VyIGRlY2lkZVxuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdGhpZGRlbkRyYWZ0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBhZG1pbiBkYXRhLlxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZFxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGhhc0FjdGl2ZUVudGl0eSBCb29sZWFuIHZhbHVlIHdoaWNoIG1lbnRpb25zIGlmIHJvb3QgY29udGV4dCBoYXMgYWN0aXZlIGVudGl0eSBvciBub3RcbiAqIEBwYXJhbSBoaWRkZW5EcmFmdCBCb29sZWFuIHZhbHVlIHdoaWNoIG1lbnRpb25zIGlmIGhpZGRlbiBkcmFmdCBpcyBlbmFibGVkIG9yIG5vdFxuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRHJhZnRBZG1pbkRhdGEoXG5cdGRyYWZ0QWRtaW5EYXRhOiBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSxcblx0Zm5Qcm9jZXNzRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24sXG5cdGhhc0FjdGl2ZUVudGl0eT86IGJvb2xlYW4sXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBvQ29udHJvbGxlci5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0XHRcdG9Db250cm9sbGVyLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLmFwcGx5KG51bGwsIC4uLmFyZ3MpO1xuXHRcdCAgfTtcblxuXHRjb25zdCBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uID0gc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKG9Db250cm9sbGVyKTtcblx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0aWYgKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRhd2FpdCBwcm9jZXNzRmNsTW9kZShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0aGlkZGVuRHJhZnRcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmICghaGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlKFxuXHRcdFx0XHRkcmFmdEFkbWluRGF0YSxcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGUsXG5cdFx0XHRcdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRoaWRkZW5EcmFmdFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0ZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmXG5cdFx0XHQoIWhpZGRlbkRyYWZ0IHx8IChoaWRkZW5EcmFmdCAmJiAhb0NvbnRyb2xsZXIuZWRpdEZsb3cuaXNEb2N1bWVudE1vZGlmaWVkKCkpKVxuXHRcdCkge1xuXHRcdFx0cHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5KG9Db250cm9sbGVyLCBjb250ZXh0LCBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsIG5hdmlnYXRpb25UeXBlKTtcblx0XHR9IGVsc2UgaWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHByb2Nlc3NFZGl0U3RhdGVEaXJ0eShcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGUsXG5cdFx0XHRcdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0aGlkZGVuRHJhZnRcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRoZSB1c2VyIHN0YXJ0ZWQgZWRpdGluZyB0aGUgZXhpc3RpbmcgZHJhZnQgYnV0IGRpZCBub3QgbWFrZSBhbnkgY2hhbmdlc1xuXHRcdFx0Ly8gaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnRcblx0XHRcdC8vIHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGdlbmVyYWwgaGFuZGxlciBpbiB3aGljaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyBhcmUgY2FsbGVkLlxuICogQHBhcmFtIGZuUHJvY2Vzc0Z1bmN0aW9uXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0XG4gKiBAcGFyYW0gb0NvbnRyb2xsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXdcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZVxuICogQHBhcmFtIGFsd2F5c1Nob3dJbkhpZGRlbkRyYWZ0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRmblByb2Nlc3NGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24sXG5cdGFsd2F5c1Nob3dJbkhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBvTW9kZWwgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE1vZGVsKCk7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IHZpZXdEYXRhID0gb1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyB7IGVudGl0eVNldD86IHN0cmluZzsgY29udGV4dFBhdGg/OiBzdHJpbmcgfTtcblx0Y29uc3QgY29udGV4dFBhdGggPSB2aWV3RGF0YS5jb250ZXh0UGF0aCB8fCAodmlld0RhdGEuZW50aXR5U2V0ID8gYC8ke3ZpZXdEYXRhLmVudGl0eVNldH1gIDogdW5kZWZpbmVkKTtcblx0Y29uc3QgaXNEcmFmdFJvb3QgPSBjb250ZXh0UGF0aCA/ICEhb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7Y29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKSA6IGZhbHNlO1xuXHRjb25zdCBiSXNFZGl0YWJsZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUob1ZpZXcpO1xuXHRjb25zdCBvcmlnaW5hbENvbnRleHQgPSBvQ29udGV4dDtcblx0bGV0IGRyYWZ0Um9vdFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdGlmICghaXNEcmFmdFJvb3QpIHtcblx0XHRkcmFmdFJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290UGF0aChvQ29udGV4dCkgPz8gZHJhZnRSb290UGF0aDtcblx0XHRvQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChkcmFmdFJvb3RQYXRoLCB1bmRlZmluZWQsIHsgJGV4cGFuZDogXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiIH0pLmdldEJvdW5kQ29udGV4dCgpO1xuXHR9XG5cdGNvbnN0IGhpZGRlbkRyYWZ0ID0gKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpPy5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdClcblx0XHQ/LmVuYWJsZWQ7XG5cdC8vIFNob3VsZG4ndCBkaXNwbGF5IGRhdGEgbG9zcyBwb3BvdmVyIG9uIHNoZWxsIGJhY2sgbmF2aWdhdGlvbiBmcm9tIHN1Yi1vYmplY3QgcGFnZXMgKHVubGVzcyB0aGVyZSdzIG5vIHBhZ2UgYmVmb3JlIGluIHRoZSBoaXN0b3J5IGJlY2F1c2Ugb2YgZGVlcCBsaW5raW5nKVxuXHQvLyBvciB3aGVuIG9iamVjdCBwYWdlIGlzIGluIGRpc3BsYXkgbW9kZSwgb3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWRcblx0Y29uc3QgYmFja05hdlNob3dzRGlhbG9nID1cblx0XHRpc0RyYWZ0Um9vdCB8fCBvQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSWZCYWNrRXhpdHNBcHAoKSB8fCAoaGlkZGVuRHJhZnQgJiYgYWx3YXlzU2hvd0luSGlkZGVuRHJhZnQpO1xuXHRpZiAob3JpZ2luYWxDb250ZXh0LmlzRGVsZXRlZCgpIHx8ICghYmFja05hdlNob3dzRGlhbG9nICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikgfHwgIWJJc0VkaXRhYmxlKSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gVGhlIGZvbGxvd2luZyAzIHByb3BlcnRpZXMgYXJlIG5lZWRlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXRlIG9mIHRoZSBkcmFmdCwgc28gd2UgZW5zdXJlIHRoZXkgYXJlIGxvYWRlZFxuXHRcdFx0YXdhaXQgb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcblx0XHRcdFx0XCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9DcmVhdGlvbkRhdGVUaW1lXCIsXG5cdFx0XHRcdFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsXG5cdFx0XHRcdFwiSGFzQWN0aXZlRW50aXR5XCJcblx0XHRcdF0pO1xuXHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdGF3YWl0IHByb2Nlc3NEcmFmdEFkbWluRGF0YShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRoaWRkZW5EcmFmdCA/IG9yaWdpbmFsQ29udGV4dCA6IG9Db250ZXh0LFxuXHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3LFxuXHRcdFx0XHRuYXZpZ2F0aW9uVHlwZSxcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIiksXG5cdFx0XHRcdGhpZGRlbkRyYWZ0XG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIGRyYWZ0RGF0YUNvbnRleHQgaW5mb3JtYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBkb2N1bWVudC4gSWYgdGhlIGNvbnRyb2xsZXIgaXMgb2YgdHlwZSBPYmplY3RQYWdlLCB0aGVuIGludGVybmFsIF9zYXZlRG9jdW1lbnQgaXMgY2FsbGVkLCBvdGhlcndpc2Ugc2F2ZURvY3VtZW50XG4gKiBmcm9tIEVkaXRGbG93IGlzIGNhbGxlZC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiB0aGUgc2F2ZSB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlRG9jdW1lbnQoY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCwgc2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdGNvbnN0IGhhc0luaXRpYWxDb250ZXh0ID0gY29udGV4dCAhPT0gdW5kZWZpbmVkO1xuXHRjb250ZXh0ID0gY29udGV4dCA/PyBjb250cm9sbGVyLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRpZiAoIWhhc0luaXRpYWxDb250ZXh0ICYmIGNvbnRyb2xsZXIuaXNBPE9iamVjdFBhZ2VDb250cm9sbGVyQ29udHJvbGxlcj4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIikpIHtcblx0XHRyZXR1cm4gY29udHJvbGxlci5fc2F2ZURvY3VtZW50KHNraXBCaW5kaW5nVG9WaWV3KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5zYXZlRG9jdW1lbnQoY29udGV4dCwgeyBza2lwQmluZGluZ1RvVmlldyB9KTtcblx0fVxufVxuXG4vKipcbiAqIERpc2NhcmRzIHRoZSBkcmFmdC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBoaWRkZW5EcmFmdCBCb29sZWFuIHZhbHVlIHdoaWNoIG1lbnRpb25zIGlmIGhpZGRlbiBkcmFmdCBpcyBlbmFibGVkIG9yIG5vdFxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmVkIGlmIGNhbmNlbERvY3VtZW50IHdhcyBzdWNjZXNzZnVsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc2NhcmREcmFmdChcblx0Y29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHQsXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdGNvbnRleHQgPSBjb250ZXh0ID8/IGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRza2lwQmFja05hdmlnYXRpb246IGhpZGRlbkRyYWZ0ICYmICFjb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID8gZmFsc2UgOiB0cnVlLFxuXHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZSxcblx0XHRza2lwQmluZGluZ1RvVmlldzogc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHVuZGVmaW5lZCA/IHNraXBCaW5kaW5nVG9WaWV3IDogdHJ1ZVxuXHR9O1xuXHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChjb250ZXh0LCBwYXJhbXMpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBmb2xsb3ctdXAgZnVuY3Rpb25zIGFmdGVyIGFuIG9wdGlvbiB3YXMgc2VsZWN0ZWQgaW4gdGhlIGRhdGEgbG9zcyBkaWFsb2cuXG4gKiBAcGFyYW0gc2VsZWN0ZWRLZXkgVGhlIGtleSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZyb20gdGhlIGRhdGEgbG9zcyBkaWFsb2dcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBiaW5kaW5nXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqL1xuZnVuY3Rpb24gaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRzZWxlY3RlZEtleTogc3RyaW5nLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0Y29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHQsXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogdm9pZCB7XG5cdHN3aXRjaCAoc2VsZWN0ZWRLZXkpIHtcblx0XHRjYXNlIERyYWZ0RGF0YUxvc3NPcHRpb25zLlNhdmU6XG5cdFx0XHRkcmFmdERhdGFMb3NzUG9wdXBcblx0XHRcdFx0LnNhdmVEb2N1bWVudChjb250cm9sbGVyLCBjb250ZXh0LCBza2lwQmluZGluZ1RvVmlldylcblx0XHRcdFx0LnRoZW4oKHNhdmVkQ29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhzYXZlZENvbnRleHQpKVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoZXJyb3IgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuS2VlcDpcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3LCBjb250ZXh0LCBoaWRkZW5EcmFmdClcblx0XHRcdFx0LnRoZW4oKGRpc2NhcmRlZERyYWZ0PykgPT4gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKGRpc2NhcmRlZERyYWZ0KSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0RGF0YUxvc3NQb3B1cCA9IHtcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRwcm9jZXNzRmNsTW9kZTogcHJvY2Vzc0ZjbE1vZGUsXG5cdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGU6IHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUsXG5cdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eTogcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5LFxuXHRwcm9jZXNzRWRpdFN0YXRlRGlydHk6IHByb2Nlc3NFZGl0U3RhdGVEaXJ0eSxcblx0aGFuZGxlRGlhbG9nU2VsZWN0aW9uOiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24sXG5cdHNhdmVEb2N1bWVudDogc2F2ZURvY3VtZW50LFxuXHRkaXNjYXJkRHJhZnQ6IGRpc2NhcmREcmFmdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnREYXRhTG9zc1BvcHVwO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQVdBO0VBQUEsSUFDS0EsY0FBYywwQkFBZEEsY0FBYztJQUFkQSxjQUFjO0lBQWRBLGNBQWM7SUFBQSxPQUFkQSxjQUFjO0VBQUEsRUFBZEEsY0FBYztFQUtuQjtFQUFBLElBQ0tDLG9CQUFvQiwwQkFBcEJBLG9CQUFvQjtJQUFwQkEsb0JBQW9CO0lBQXBCQSxvQkFBb0I7SUFBcEJBLG9CQUFvQjtJQUFBLE9BQXBCQSxvQkFBb0I7RUFBQSxFQUFwQkEsb0JBQW9CO0VBV3pCO0VBQ0EsTUFBTUMsY0FBYyxHQUFHLElBQUlDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDOztFQUV4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0Msb0NBQW9DQSxDQUFDQyxjQUE4QixFQUFXO0lBQ3RGLE1BQU1DLFNBQVMsR0FBR0QsY0FBYyxDQUFDRSxlQUFlLENBQUMsQ0FBQyxDQUFDQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDN0UsT0FBT0YsU0FBUyxFQUFFRyxHQUFHLEVBQUVMLG9DQUFvQyxJQUFJLEtBQUs7RUFDckU7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVNLGNBQWNBLENBQzVCQyxjQUF1QyxFQUN2Q0MsZ0JBQTBCLEVBQzFCQyxXQUEyQixFQUMzQkMsd0JBQWtDLEVBQ2xDQyxrQkFBNEIsRUFDNUJDLE9BQXdCLEVBQ3hCQyxXQUFxQixFQUNMO0lBQ2hCO0lBQ0E7SUFDQTtJQUNBLElBQUlOLGNBQWMsQ0FBQ08sZ0JBQWdCLEtBQUtQLGNBQWMsQ0FBQ1Esa0JBQWtCLElBQUksQ0FBQ04sV0FBVyxDQUFDTyxRQUFRLENBQUNDLGtCQUFrQixDQUFDLENBQUMsRUFBRTtNQUN4SFAsd0JBQXdCLENBQUMsQ0FBQztJQUMzQixDQUFDLE1BQU07TUFDTixPQUFPWixjQUFjLENBQ25Cb0IsSUFBSSxDQUFDVCxXQUFXLENBQUMsQ0FDakJVLElBQUksQ0FBRUMsV0FBVyxJQUNqQkMsa0JBQWtCLENBQUNDLHFCQUFxQixDQUN2Q0YsV0FBVyxFQUNYVix3QkFBd0IsRUFDeEJGLGdCQUFnQixFQUNoQkMsV0FBVyxFQUNYRSxrQkFBa0IsRUFDbEJDLE9BQU8sRUFDUEMsV0FDRCxDQUNELENBQUM7SUFDSDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZVUseUJBQXlCQSxDQUN2Q2hCLGNBQXVDLEVBQ3ZDQyxnQkFBMEIsRUFDMUJDLFdBQTJCLEVBQzNCQyx3QkFBa0MsRUFDbENjLGNBQThCLEVBQzlCQyxxQ0FBOEMsRUFDOUNkLGtCQUE0QixFQUM1QkMsT0FBd0IsRUFDeEJDLFdBQXFCLEVBQ0w7SUFDaEI7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJYSxTQUFTLENBQUNDLGdCQUFnQixDQUFDLENBQUMsRUFBRTtNQUNqQyxJQUNDcEIsY0FBYyxDQUFDTyxnQkFBZ0IsS0FBS1AsY0FBYyxDQUFDUSxrQkFBa0IsSUFDckUsQ0FBQ04sV0FBVyxDQUFDTyxRQUFRLENBQUNDLGtCQUFrQixDQUFDLENBQUMsSUFDMUNPLGNBQWMsS0FBSzVCLGNBQWMsQ0FBQ2dDLGNBQWMsRUFDL0M7UUFDRDtRQUNBO1FBQ0E7UUFDQSxJQUFJO1VBQ0gsTUFBTVAsa0JBQWtCLENBQUNRLFlBQVksQ0FBQ3BCLFdBQVcsRUFBRUUsa0JBQWtCLEVBQUVDLE9BQU8sRUFBRUMsV0FBVyxDQUFDO1VBQzVGSCx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxPQUFPb0IsS0FBYyxFQUFFO1VBQ3hCQyxHQUFHLENBQUNELEtBQUssQ0FBQyxvQ0FBb0MsRUFBRUEsS0FBZSxDQUFDO1FBQ2pFO01BQ0QsQ0FBQyxNQUFNLElBQUlOLGNBQWMsS0FBSzVCLGNBQWMsQ0FBQ29DLGlCQUFpQixJQUFJUCxxQ0FBcUMsRUFBRTtRQUN4RztRQUNBO1FBQ0FmLHdCQUF3QixDQUFDLENBQUM7TUFDM0IsQ0FBQyxNQUFNO1FBQ047UUFDQTtRQUNBLE9BQU9aLGNBQWMsQ0FDbkJvQixJQUFJLENBQUNULFdBQVcsQ0FBQyxDQUNqQlUsSUFBSSxDQUFFQyxXQUFXLElBQ2pCQyxrQkFBa0IsQ0FBQ0MscUJBQXFCLENBQ3ZDRixXQUFXLEVBQ1hWLHdCQUF3QixFQUN4QkYsZ0JBQWdCLEVBQ2hCQyxXQUFXLEVBQ1hFLGtCQUFrQixFQUNsQkMsT0FBTyxFQUNQQyxXQUNELENBQ0QsQ0FBQztNQUNIO0lBQ0QsQ0FBQyxNQUFNO01BQ047TUFDQTtNQUNBO01BQ0FILHdCQUF3QixDQUFDLENBQUM7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWV1QixvQ0FBb0NBLENBQ2xEeEIsV0FBMkIsRUFDM0J5QixRQUF3QixFQUN4QnhCLHdCQUFrQyxFQUNsQ2MsY0FBOEIsRUFDZDtJQUNoQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUlBLGNBQWMsS0FBSzVCLGNBQWMsQ0FBQ2dDLGNBQWMsRUFBRTtNQUNyRCxNQUFNTyxXQUFXLEdBQUc7UUFDbkJDLGtCQUFrQixFQUFFLElBQUk7UUFDeEJDLGlCQUFpQixFQUFFO01BQ3BCLENBQUM7TUFFRCxJQUFJO1FBQ0gsTUFBTTVCLFdBQVcsQ0FBQ08sUUFBUSxDQUFDc0IsY0FBYyxDQUFDSixRQUFRLEVBQUVDLFdBQVcsQ0FBQztRQUNoRXpCLHdCQUF3QixDQUFDLENBQUM7TUFDM0IsQ0FBQyxDQUFDLE9BQU9vQixLQUFLLEVBQUU7UUFDZkMsR0FBRyxDQUFDRCxLQUFLLENBQUMsb0NBQW9DLEVBQUVBLEtBQWMsQ0FBQztNQUNoRTtJQUNELENBQUMsTUFBTTtNQUNOO01BQ0E7TUFDQXBCLHdCQUF3QixDQUFDLENBQUM7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlNkIscUJBQXFCQSxDQUNuQzlCLFdBQTJCLEVBQzNCRCxnQkFBMEIsRUFDMUJFLHdCQUFrQyxFQUNsQ2MsY0FBOEIsRUFDOUJDLHFDQUE4QyxFQUM5Q2Qsa0JBQTRCLEVBQzVCQyxPQUF3QixFQUN4QkMsV0FBcUIsRUFDTDtJQUNoQixJQUFJVyxjQUFjLEtBQUs1QixjQUFjLENBQUNvQyxpQkFBaUIsSUFBSVAscUNBQXFDLEVBQUU7TUFDakc7TUFDQTtNQUNBZix3QkFBd0IsQ0FBQyxDQUFDO0lBQzNCLENBQUMsTUFBTTtNQUNOO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxPQUFPWixjQUFjLENBQ25Cb0IsSUFBSSxDQUFDVCxXQUFXLENBQUMsQ0FDakJVLElBQUksQ0FBRUMsV0FBVyxJQUNqQkMsa0JBQWtCLENBQUNDLHFCQUFxQixDQUN2Q0YsV0FBVyxFQUNYVix3QkFBd0IsRUFDeEJGLGdCQUFnQixFQUNoQkMsV0FBVyxFQUNYRSxrQkFBa0IsRUFDbEJDLE9BQU8sRUFDUEMsV0FDRCxDQUNELENBQUM7SUFDSDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZTJCLHFCQUFxQkEsQ0FDbkNqQyxjQUF1QyxFQUN2Q2tDLGlCQUEyQixFQUMzQmpDLGdCQUEwQixFQUMxQkksT0FBdUIsRUFDdkJILFdBQTJCLEVBQzNCRSxrQkFBNEIsRUFJWjtJQUFBLElBSGhCYSxjQUE4QixHQUFBa0IsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUc5QyxjQUFjLENBQUNnQyxjQUFjO0lBQUEsSUFDOURpQixlQUF5QixHQUFBSCxTQUFBLENBQUFDLE1BQUEsT0FBQUQsU0FBQSxNQUFBRSxTQUFBO0lBQUEsSUFDekIvQixXQUFxQixHQUFBNkIsU0FBQSxDQUFBQyxNQUFBLE9BQUFELFNBQUEsTUFBQUUsU0FBQTtJQUVyQixNQUFNRSxzQkFBc0IsR0FBR3JDLFdBQVcsQ0FBQ3NDLGtCQUFrQixDQUFDQyxXQUFXLENBQUMsQ0FBQztJQUMzRSxNQUFNdEMsd0JBQXdCLEdBQUcsQ0FBQ29DLHNCQUFzQixHQUNyREwsaUJBQWlCLEdBQ2pCLFlBQW9DO01BQ3BDaEMsV0FBVyxDQUFDc0Msa0JBQWtCLENBQUNFLFVBQVUsQ0FBQyxDQUFDO01BQUMsU0FBQUMsSUFBQSxHQUFBUixTQUFBLENBQUFDLE1BQUEsRUFEL0JRLElBQUksT0FBQUMsS0FBQSxDQUFBRixJQUFBLEdBQUFHLElBQUEsTUFBQUEsSUFBQSxHQUFBSCxJQUFBLEVBQUFHLElBQUE7UUFBSkYsSUFBSSxDQUFBRSxJQUFBLElBQUFYLFNBQUEsQ0FBQVcsSUFBQTtNQUFBO01BRWpCWixpQkFBaUIsQ0FBQ2EsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHSCxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVKLE1BQU0xQixxQ0FBcUMsR0FBR3pCLG9DQUFvQyxDQUFDUyxXQUFXLENBQUM7SUFDL0YsSUFBSUYsY0FBYyxFQUFFO01BQ25CLElBQUlFLFdBQVcsQ0FBQ04sZUFBZSxDQUFDLENBQUMsQ0FBQ29ELHFCQUFxQixDQUFDLENBQUMsQ0FBQ0MsWUFBWSxDQUFDLENBQUMsRUFBRTtRQUN6RSxNQUFNbEQsY0FBYyxDQUNuQkMsY0FBYyxFQUNkQyxnQkFBZ0IsRUFDaEJDLFdBQVcsRUFDWEMsd0JBQXdCLEVBQ3hCQyxrQkFBa0IsRUFDbEJDLE9BQU8sRUFDUEMsV0FDRCxDQUFDO01BQ0YsQ0FBQyxNQUFNLElBQUksQ0FBQ2dDLGVBQWUsRUFBRTtRQUM1QnRCLHlCQUF5QixDQUN4QmhCLGNBQWMsRUFDZEMsZ0JBQWdCLEVBQ2hCQyxXQUFXLEVBQ1hDLHdCQUF3QixFQUN4QmMsY0FBYyxFQUNkQyxxQ0FBcUMsRUFDckNkLGtCQUFrQixFQUNsQmlDLFNBQVMsRUFDVC9CLFdBQ0QsQ0FBQztNQUNGLENBQUMsTUFBTSxJQUNOTixjQUFjLENBQUNPLGdCQUFnQixLQUFLUCxjQUFjLENBQUNRLGtCQUFrQixLQUNwRSxDQUFDRixXQUFXLElBQUtBLFdBQVcsSUFBSSxDQUFDSixXQUFXLENBQUNPLFFBQVEsQ0FBQ0Msa0JBQWtCLENBQUMsQ0FBRSxDQUFDLEVBQzVFO1FBQ0RnQixvQ0FBb0MsQ0FBQ3hCLFdBQVcsRUFBRUcsT0FBTyxFQUFFRix3QkFBd0IsRUFBRWMsY0FBYyxDQUFDO01BQ3JHLENBQUMsTUFBTSxJQUFJRSxTQUFTLENBQUNDLGdCQUFnQixDQUFDLENBQUMsRUFBRTtRQUN4Q1kscUJBQXFCLENBQ3BCOUIsV0FBVyxFQUNYRCxnQkFBZ0IsRUFDaEJFLHdCQUF3QixFQUN4QmMsY0FBYyxFQUNkQyxxQ0FBcUMsRUFDckNkLGtCQUFrQixFQUNsQkMsT0FBTyxFQUNQQyxXQUNELENBQUM7TUFDRixDQUFDLE1BQU07UUFDTjtRQUNBO1FBQ0E7UUFDQUgsd0JBQXdCLENBQUMsQ0FBQztNQUMzQjtJQUNELENBQUMsTUFBTTtNQUNOK0IsaUJBQWlCLENBQUMsQ0FBQztJQUNwQjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZWdCLHlDQUF5Q0EsQ0FDdkRoQixpQkFBMkIsRUFDM0JqQyxnQkFBMEIsRUFDMUIwQixRQUF3QixFQUN4QnpCLFdBQTJCLEVBQzNCRSxrQkFBNEIsRUFHWjtJQUFBLElBRmhCYSxjQUE4QixHQUFBa0IsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUc5QyxjQUFjLENBQUNnQyxjQUFjO0lBQUEsSUFDOUQ4Qix1QkFBaUMsR0FBQWhCLFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFFLFNBQUE7SUFFakMsTUFBTWUsS0FBSyxHQUFHbEQsV0FBVyxDQUFDbUQsT0FBTyxDQUFDLENBQUM7SUFDbkMsTUFBTUMsTUFBTSxHQUFHRixLQUFLLENBQUNHLGlCQUFpQixDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUM7SUFDbkQsTUFBTUMsVUFBVSxHQUFHSCxNQUFNLENBQUNJLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLE1BQU1DLFFBQVEsR0FBR1AsS0FBSyxDQUFDUSxXQUFXLENBQUMsQ0FBaUQ7SUFDcEYsTUFBTUMsV0FBVyxHQUFHRixRQUFRLENBQUNFLFdBQVcsS0FBS0YsUUFBUSxDQUFDRyxTQUFTLEdBQUcsSUFBSUgsUUFBUSxDQUFDRyxTQUFTLEVBQUUsR0FBR3pCLFNBQVMsQ0FBQztJQUN2RyxNQUFNMEIsV0FBVyxHQUFHRixXQUFXLEdBQUcsQ0FBQyxDQUFDSixVQUFVLENBQUNPLFNBQVMsQ0FBQyxHQUFHSCxXQUFXLDJDQUEyQyxDQUFDLEdBQUcsS0FBSztJQUMzSCxNQUFNSSxXQUFXLEdBQUdDLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDZixLQUFLLENBQUM7SUFDcEQsTUFBTWdCLGVBQWUsR0FBR3pDLFFBQVE7SUFDaEMsSUFBSTBDLGFBQWEsR0FBRzFDLFFBQVEsQ0FBQzJDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQ1AsV0FBVyxFQUFFO01BQ2pCTSxhQUFhLEdBQUdFLFdBQVcsQ0FBQ0MsZ0JBQWdCLENBQUM3QyxRQUFRLENBQUMsSUFBSTBDLGFBQWE7TUFDdkUxQyxRQUFRLEdBQUcyQixNQUFNLENBQUNtQixXQUFXLENBQUNKLGFBQWEsRUFBRWhDLFNBQVMsRUFBRTtRQUFFcUMsT0FBTyxFQUFFO01BQTBCLENBQUMsQ0FBQyxDQUFDQyxlQUFlLENBQUMsQ0FBQztJQUNsSDtJQUNBLE1BQU1yRSxXQUFXLEdBQUlKLFdBQVcsQ0FBQ04sZUFBZSxDQUFDLENBQUMsQ0FBQ2dGLDBCQUEwQixDQUFDLENBQUMsRUFBRUMsZUFBZSxDQUFDLENBQUMsRUFBRUMsV0FBVyxFQUM1R0MsT0FBTztJQUNWO0lBQ0E7SUFDQSxNQUFNQyxrQkFBa0IsR0FDdkJqQixXQUFXLElBQUk3RCxXQUFXLENBQUNOLGVBQWUsQ0FBQyxDQUFDLENBQUNxRixjQUFjLENBQUMsQ0FBQyxDQUFDQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUs1RSxXQUFXLElBQUk2Qyx1QkFBd0I7SUFDaEksSUFBSWlCLGVBQWUsQ0FBQ2UsU0FBUyxDQUFDLENBQUMsSUFBSyxDQUFDSCxrQkFBa0IsSUFBSS9ELGNBQWMsS0FBSzVCLGNBQWMsQ0FBQ2dDLGNBQWUsSUFBSSxDQUFDNEMsV0FBVyxFQUFFO01BQzdIL0IsaUJBQWlCLENBQUMsQ0FBQztJQUNwQixDQUFDLE1BQU07TUFDTixJQUFJO1FBQ0g7UUFDQSxNQUFNUCxRQUFRLENBQUN5RCxlQUFlLENBQUMsQ0FDOUIsMENBQTBDLEVBQzFDLDRDQUE0QyxFQUM1QyxpQkFBaUIsQ0FDakIsQ0FBQztRQUNGLE1BQU1wRixjQUFjLEdBQUcyQixRQUFRLENBQUNxQyxTQUFTLENBQUMseUJBQXlCLENBQUM7UUFDcEUsTUFBTS9CLHFCQUFxQixDQUMxQmpDLGNBQWMsRUFDZGtDLGlCQUFpQixFQUNqQmpDLGdCQUFnQixFQUNoQkssV0FBVyxHQUFHOEQsZUFBZSxHQUFHekMsUUFBUSxFQUN4Q3pCLFdBQVcsRUFDWEUsa0JBQWtCLEVBQ2xCYSxjQUFjLEVBQ2RVLFFBQVEsQ0FBQzBELFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUN2Qy9FLFdBQ0QsQ0FBQztNQUNGLENBQUMsQ0FBQyxPQUFPZ0YsTUFBZSxFQUFFO1FBQ3pCOUQsR0FBRyxDQUFDRCxLQUFLLENBQUMsOENBQThDLEVBQUUrRCxNQUFnQixDQUFDO1FBQzNFcEQsaUJBQWlCLENBQUMsQ0FBQztNQUNwQjtJQUNEO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVxRCxZQUFZQSxDQUFDQyxVQUEwQixFQUFFbkYsT0FBd0IsRUFBRXlCLGlCQUEyQixFQUFvQjtJQUNoSSxNQUFNMkQsaUJBQWlCLEdBQUdwRixPQUFPLEtBQUtnQyxTQUFTO0lBQy9DaEMsT0FBTyxHQUFHQSxPQUFPLElBQUltRixVQUFVLENBQUNuQyxPQUFPLENBQUMsQ0FBQyxDQUFDRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQ2tDLGlCQUFpQixJQUFJRCxVQUFVLENBQUNFLEdBQUcsQ0FBaUMsa0RBQWtELENBQUMsRUFBRTtNQUM3SCxPQUFPRixVQUFVLENBQUNHLGFBQWEsQ0FBQzdELGlCQUFpQixDQUFDO0lBQ25ELENBQUMsTUFBTTtNQUNOLE9BQU8wRCxVQUFVLENBQUMvRSxRQUFRLENBQUM4RSxZQUFZLENBQUNsRixPQUFPLEVBQUU7UUFBRXlCO01BQWtCLENBQUMsQ0FBQztJQUN4RTtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlUixZQUFZQSxDQUMxQmtFLFVBQTBCLEVBQzFCMUQsaUJBQXNDLEVBQ3RDekIsT0FBd0IsRUFDeEJDLFdBQXFCLEVBQ0Y7SUFDbkJELE9BQU8sR0FBR0EsT0FBTyxJQUFJbUYsVUFBVSxDQUFDbkMsT0FBTyxDQUFDLENBQUMsQ0FBQ0UsaUJBQWlCLENBQUMsQ0FBQztJQUM3RCxNQUFNcUMsTUFBTSxHQUFHO01BQ2RDLGtCQUFrQixFQUFFdkYsV0FBVyxJQUFJLENBQUNELE9BQU8sQ0FBQ2dGLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJO01BQ3pGeEQsa0JBQWtCLEVBQUUsSUFBSTtNQUN4QkMsaUJBQWlCLEVBQUVBLGlCQUFpQixLQUFLTyxTQUFTLEdBQUdQLGlCQUFpQixHQUFHO0lBQzFFLENBQUM7SUFDRCxPQUFPMEQsVUFBVSxDQUFDL0UsUUFBUSxDQUFDc0IsY0FBYyxDQUFDMUIsT0FBTyxFQUFFdUYsTUFBTSxDQUFDO0VBQzNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUzdFLHFCQUFxQkEsQ0FDN0JGLFdBQW1CLEVBQ25CVix3QkFBa0MsRUFDbENGLGdCQUEwQixFQUMxQnVGLFVBQTBCLEVBQzFCMUQsaUJBQXNDLEVBQ3RDekIsT0FBd0IsRUFDeEJDLFdBQXFCLEVBQ2Q7SUFDUCxRQUFRTyxXQUFXO01BQ2xCLEtBQUt2QixvQkFBb0IsQ0FBQ3dHLElBQUk7UUFDN0JoRixrQkFBa0IsQ0FDaEJ5RSxZQUFZLENBQUNDLFVBQVUsRUFBRW5GLE9BQU8sRUFBRXlCLGlCQUFpQixDQUFDLENBQ3BEbEIsSUFBSSxDQUFFbUYsWUFBYSxJQUFLNUYsd0JBQXdCLENBQUM0RixZQUFZLENBQUMsQ0FBQyxDQUMvREMsS0FBSyxDQUFDLFVBQVV6RSxLQUF5QixFQUFFO1VBQzNDLElBQUlBLEtBQUssS0FBSzBFLDRCQUE0QixDQUFDQyxRQUFRLEVBQUU7WUFDcEQsT0FBT2pHLGdCQUFnQixDQUFDLENBQUM7VUFDMUI7VUFDQXVCLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLDZCQUE2QixFQUFFQSxLQUFLLENBQUM7UUFDaEQsQ0FBQyxDQUFDO1FBQ0hoQyxjQUFjLENBQUM0RyxLQUFLLENBQUMsQ0FBQztRQUN0QjtNQUNELEtBQUs3RyxvQkFBb0IsQ0FBQzhHLElBQUk7UUFDN0JqRyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzFCWixjQUFjLENBQUM0RyxLQUFLLENBQUMsQ0FBQztRQUN0QjtNQUNELEtBQUs3RyxvQkFBb0IsQ0FBQytHLE9BQU87UUFDaEN2RixrQkFBa0IsQ0FDaEJRLFlBQVksQ0FBQ2tFLFVBQVUsRUFBRTFELGlCQUFpQixFQUFFekIsT0FBTyxFQUFFQyxXQUFXLENBQUMsQ0FDakVNLElBQUksQ0FBRTBGLGNBQWUsSUFBS25HLHdCQUF3QixDQUFDbUcsY0FBYyxDQUFDLENBQUMsQ0FDbkVOLEtBQUssQ0FBQyxVQUFVekUsS0FBeUIsRUFBRTtVQUMzQ0MsR0FBRyxDQUFDRCxLQUFLLENBQUMsOEJBQThCLEVBQUVBLEtBQUssQ0FBQztRQUNqRCxDQUFDLENBQUM7UUFDSGhDLGNBQWMsQ0FBQzRHLEtBQUssQ0FBQyxDQUFDO1FBQ3RCO01BQ0Q7UUFDQ2xHLGdCQUFnQixDQUFDLENBQUM7UUFDbEJWLGNBQWMsQ0FBQzRHLEtBQUssQ0FBQyxDQUFDO0lBQ3hCO0VBQ0Q7RUFFQSxNQUFNckYsa0JBQWtCLEdBQUc7SUFDMUJvQyx5Q0FBeUMsRUFBRUEseUNBQXlDO0lBQ3BGekQsb0NBQW9DLEVBQUVBLG9DQUFvQztJQUMxRUosY0FBYyxFQUFFQSxjQUFjO0lBQzlCVSxjQUFjLEVBQUVBLGNBQWM7SUFDOUJpQix5QkFBeUIsRUFBRUEseUJBQXlCO0lBQ3BEVSxvQ0FBb0MsRUFBRUEsb0NBQW9DO0lBQzFFTSxxQkFBcUIsRUFBRUEscUJBQXFCO0lBQzVDakIscUJBQXFCLEVBQUVBLHFCQUFxQjtJQUM1Q3dFLFlBQVksRUFBRUEsWUFBWTtJQUMxQmpFLFlBQVksRUFBRUE7RUFDZixDQUFDO0VBQUMsT0FFYVIsa0JBQWtCO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
355
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwicGFnZUNvbnRyb2xsZXIiLCJvTWFuaWZlc3QiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRNYW5pZmVzdEVudHJ5IiwiYXBwIiwicHJvY2Vzc0ZjbE1vZGUiLCJkcmFmdEFkbWluRGF0YSIsImZuQ2FuY2VsRnVuY3Rpb24iLCJvQ29udHJvbGxlciIsInByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyIsImJTa2lwQmluZGluZ1RvVmlldyIsImNvbnRleHQiLCJoaWRkZW5EcmFmdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJlZGl0RmxvdyIsImlzRG9jdW1lbnRNb2RpZmllZCIsIm9wZW4iLCJ0aGVuIiwic2VsZWN0ZWRLZXkiLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJoYW5kbGVEaWFsb2dTZWxlY3Rpb24iLCJwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlIiwibmF2aWdhdGlvblR5cGUiLCJiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIkJhY2tOYXZpZ2F0aW9uIiwiZGlzY2FyZERyYWZ0IiwiZXJyb3IiLCJMb2ciLCJGb3J3YXJkTmF2aWdhdGlvbiIsInByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJza2lwQmluZGluZ1RvVmlldyIsImNhbmNlbERvY3VtZW50IiwicHJvY2Vzc0VkaXRTdGF0ZURpcnR5IiwicHJvY2Vzc0RyYWZ0QWRtaW5EYXRhIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJoYXNBY3RpdmVFbnRpdHkiLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJhcHBseSIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiYWx3YXlzU2hvd0luSGlkZGVuRHJhZnQiLCJvVmlldyIsImdldFZpZXciLCJvTW9kZWwiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsImlzRHJhZnRSb290IiwiZ2V0T2JqZWN0IiwiYklzRWRpdGFibGUiLCJDb21tb25VdGlscyIsImdldElzRWRpdGFibGUiLCJvcmlnaW5hbENvbnRleHQiLCJkcmFmdFJvb3RQYXRoIiwiZ2V0UGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0RHJhZnRSb290UGF0aCIsImJpbmRDb250ZXh0IiwiJGV4cGFuZCIsImdldEJvdW5kQ29udGV4dCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJlbmFibGVkIiwiYmFja05hdlNob3dzRGlhbG9nIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0V4aXRzQXBwIiwiaXNEZWxldGVkIiwicmVxdWVzdFByb3BlcnR5IiwiZ2V0UHJvcGVydHkiLCJvRXJyb3IiLCJzYXZlRG9jdW1lbnQiLCJjb250cm9sbGVyIiwiaGFzSW5pdGlhbENvbnRleHQiLCJpc0EiLCJfc2F2ZURvY3VtZW50Iiwic2tpcEJhY2tOYXZpZ2F0aW9uVmFsdWUiLCJwYXJhbXMiLCJTYXZlIiwic2F2ZWRDb250ZXh0IiwiY2F0Y2giLCJSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIiwiQ29udGludWUiLCJjbG9zZSIsIktlZXAiLCJEaXNjYXJkIiwiZGlzY2FyZGVkRHJhZnQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImRyYWZ0RGF0YUxvc3NQb3B1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUNvbnRyb2xsZXJDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgRHJhZnREYXRhTG9zc0RpYWxvZyBmcm9tIFwiLi4vLi4vY29udHJvbHMvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZC9EcmFmdERhdGFMb3NzRGlhbG9nXCI7XG5pbXBvcnQgeyBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIH0gZnJvbSBcIi4uLy4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwiLi4vLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5cbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cblxuLyogRW51bSB0eXBlcyBmb3IgdGhlIGRhdGEgbG9zcyBkaWFsb2cgb3B0aW9ucyAqL1xuZW51bSBEcmFmdERhdGFMb3NzT3B0aW9ucyB7XG5cdFNhdmUgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25TYXZlXCIsXG5cdEtlZXAgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25LZWVwXCIsXG5cdERpc2NhcmQgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25EaXNjYXJkXCJcbn1cblxudHlwZSBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSA9IHtcblx0Q3JlYXRpb25EYXRlVGltZTogRGF0ZTtcblx0TGFzdENoYW5nZURhdGVUaW1lOiBEYXRlO1xufTtcblxuLypDcmVhdGUgdGhlIGRhdGEgbG9zcyBkaWFsb2cqL1xuY29uc3QgZGF0YUxvc3NEaWFsb2cgPSBuZXcgRHJhZnREYXRhTG9zc0RpYWxvZyhcImZlOjpEcmFmdERhdGFMb3NzUG9wdXBcIik7XG5cbi8qKlxuICogVGhlIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gdGhlIG1hbmlmZXN0IGlzIHNldCB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBpbiBjYXNlIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBwYWdlQ29udHJvbGxlciBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFBhZ2VDb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdpdGggdHJ1ZSBvciBmYWxzZSB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdFxuICovXG5mdW5jdGlvbiBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24ocGFnZUNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKTogYm9vbGVhbiB7XG5cdGNvbnN0IG9NYW5pZmVzdCA9IHBhZ2VDb250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuZmVcIik7XG5cdHJldHVybiBvTWFuaWZlc3Q/LmFwcD8uc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIEZDTCBtb2RlLlxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZjbE1vZGUoXG5cdGRyYWZ0QWRtaW5EYXRhOiBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSxcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBGdW5jdGlvbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0LFxuXHRoaWRkZW5EcmFmdD86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBUaGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBGQ0wgbW9kZSBzbyBpbiB0aGlzIGNhc2Ugd2UgZmFsbCBiYWNrIHRvXG5cdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdC8vIGZvciBGQ0wuXG5cdGlmIChkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUgJiYgIW9Db250cm9sbGVyLmVkaXRGbG93LmlzRG9jdW1lbnRNb2RpZmllZCgpKSB7XG5cdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGRhdGFMb3NzRGlhbG9nXG5cdFx0XHQub3BlbihvQ29udHJvbGxlcilcblx0XHRcdC50aGVuKChzZWxlY3RlZEtleSkgPT5cblx0XHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwLmhhbmRsZURpYWxvZ1NlbGVjdGlvbihcblx0XHRcdFx0XHRzZWxlY3RlZEtleSBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3LFxuXHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0aGlkZGVuRHJhZnRcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIG1vZGUgd2l0aCBubyBhY3RpdmUgZW50aXR5LlxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gVGhlIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBza2lwIHRoZSBwb3B1cCBhcHBlYXJhbmNlIGluIGZvcndhcmQgY2FzZVxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqIEBwYXJhbSBza2lwQmFja05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBiYWNrIG5hdmlnYXRpb24gc2hvdWxkIGJlIHNraXBwZWRcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCxcblx0aGlkZGVuRHJhZnQ/OiBib29sZWFuLFxuXHRza2lwQmFja05hdmlnYXRpb24/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gVGhlcmUgaXMgbm8gYWN0aXZlIGVudGl0eSBzbywgd2UgYXJlIGVkaXRpbmcgZWl0aGVyIG5ld2x5IGNyZWF0ZWQgZGF0YSBvclxuXHQvLyBhIGRyYWZ0IHdoaWNoIGhhcyBuZXZlciBiZWVuIHNhdmVkIHRvIGFjdGl2ZSB2ZXJzaW9uXG5cdC8vIFNpbmNlIHdlIHdhbnQgdG8gcmVhY3QgZGlmZmVyZW50bHkgaW4gdGhlIHR3byBzaXR1YXRpb25zLCB3ZSBoYXZlIHRvIGNoZWNrIHRoZVxuXHQvLyBkaXJ0eSBzdGF0ZVxuXHRpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdGlmIChcblx0XHRcdGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSAmJlxuXHRcdFx0IW9Db250cm9sbGVyLmVkaXRGbG93LmlzRG9jdW1lbnRNb2RpZmllZCgpICYmXG5cdFx0XHRuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHQpIHtcblx0XHRcdC8vIGluIGNhc2Ugd2UgaGF2ZSB1bnRvdWNoZWQgY2hhbmdlcyBmb3IgdGhlIGRyYWZ0IGFuZCBhIFwiYmFja1wiXG5cdFx0XHQvLyBuYXZpZ2F0aW9uIHdlIGNhbiBzaWxlbnRseSBkaXNjYXJkIHRoZSBkcmFmdCBhZ2FpblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2Uvbm8tbmVzdGluZ1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgZHJhZnREYXRhTG9zc1BvcHVwLmRpc2NhcmREcmFmdChvQ29udHJvbGxlciwgYlNraXBCaW5kaW5nVG9WaWV3LCBjb250ZXh0LCBoaWRkZW5EcmFmdCwgc2tpcEJhY2tOYXZpZ2F0aW9uKTtcblx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb24gJiYgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbikge1xuXHRcdFx0Ly8gSW4gY2FzZSB3ZSBoYXZlIGEgXCJmb3J3YXJkIG5hdmlnYXRpb25cIiBhbmQgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgc2V0IGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0Ly8gd2UgXCJzaWxlbnRseVwiIGtlZXAgdGhlIGRyYWZ0XG5cdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlIGRhdGEgaXMgYmVpbmcgY2hhbmdlZCBvciBhIGZvcndhcmQgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0XHRcdC8vIGFuZCwgd2UgYWx3YXlzIHdhbnQgdG8gc2hvdyB0aGUgZGF0YSBsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRyZXR1cm4gZGF0YUxvc3NEaWFsb2dcblx0XHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHRcdC50aGVuKChzZWxlY3RlZEtleSkgPT5cblx0XHRcdFx0XHRkcmFmdERhdGFMb3NzUG9wdXAuaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3LFxuXHRcdFx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0XHRcdGhpZGRlbkRyYWZ0LFxuXHRcdFx0XHRcdFx0c2tpcEJhY2tOYXZpZ2F0aW9uXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGRyYWZ0IGVkaXRpbmcgZm9yIGV4aXN0aW5nIGVudGl0eS5cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWQuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgY2FsbFxuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eShcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFdlIGFyZSBlZGl0aW5nIGEgZHJhZnQgZm9yIGFuIGV4aXN0aW5nIGFjdGl2ZSBlbnRpdHlcblx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdC8vIG5ldmVyIHNhdmVkIGJlZm9yZSwgaGVuY2Ugd2UncmUgY3VycmVudGx5IGVkaXRpbmcgYSBuZXdseSBjcmVhdGVkIGRyYWZ0IGZvclxuXHQvLyBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5IGZvciB0aGUgZmlyc3QgdGltZS5cblx0Ly8gQWxzbywgdGhlcmUgaGF2ZSBzbyBmYXIgYmVlbiBubyBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRyYWZ0IGFuZCBpbiB0aGlzXG5cdC8vIGNhc2Ugd2Ugd2FudCB0byBzaWxlbnRseSBuYXZpZ2F0ZSBhbmQgZGVsZXRlIHRoZSBkcmFmdCBpbiBjYXNlIG9mIGEgYmFja1xuXHQvLyBuYXZpZ2F0aW9uIGJ1dCBpbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gc2lsZW50bHkga2VlcCBpdCFcblx0aWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikge1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlLFxuXHRcdFx0c2tpcEJpbmRpbmdUb1ZpZXc6IHRydWVcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IG9Db250cm9sbGVyLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY2FuY2VsaW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBFcnJvcik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHQvLyBleGVjdXRlIHRoZSBmb2xsb3d1cCBmdW5jdGlvbi5cblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGNvbnRleHQgd2hlbiB0aGUgZWRpdCBzdGF0ZSBpcyBpbiBkaXJ0eSBtb2RlLlxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gVGhlIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBza2lwIHRoZSBwb3B1cCBhcHBlYXJhbmNlIGluIGZvcndhcmQgY2FzZVxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcuXG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uc1xuICogQHBhcmFtIGhpZGRlbkRyYWZ0IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgaGlkZGVuIGRyYWZ0IGlzIGVuYWJsZWQgb3Igbm90XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFZGl0U3RhdGVEaXJ0eShcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBGdW5jdGlvbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBib29sZWFuLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHQsXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb24gJiYgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbikge1xuXHRcdC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fSBlbHNlIHtcblx0XHQvLyBUaGUgQ3JlYXRpb25EYXRlVGltZSBhbmQgTGFzdENoYW5nZURhdGVUaW1lIGFyZSBOT1QgZXF1YWwsIHNvIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZ1xuXHRcdC8vIGFuIGV4aXN0aW5nIGRyYWZ0IGFuZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIGRlcGVuZGluZyBvbiBpZiBhbnkgY2hhbmdlc1xuXHRcdC8vIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBvciBub3Rcblx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gd2Ugd2FudFxuXHRcdC8vIHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgYW5kIGxldCB0aGUgdXNlciBkZWNpZGVcblx0XHRyZXR1cm4gZGF0YUxvc3NEaWFsb2dcblx0XHRcdC5vcGVuKG9Db250cm9sbGVyKVxuXHRcdFx0LnRoZW4oKHNlbGVjdGVkS2V5KSA9PlxuXHRcdFx0XHRkcmFmdERhdGFMb3NzUG9wdXAuaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRcdFx0XHRcdHNlbGVjdGVkS2V5IGFzIHN0cmluZyxcblx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0XHRoaWRkZW5EcmFmdFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgYWRtaW4gZGF0YS5cbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5Qcm9jZXNzRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEBwYXJhbSBoYXNBY3RpdmVFbnRpdHkgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiByb290IGNvbnRleHQgaGFzIGFjdGl2ZSBlbnRpdHkgb3Igbm90XG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqIEBwYXJhbSBza2lwQmFja05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBiYWNrIG5hdmlnYXRpb24gc2hvdWxkIGJlIHNraXBwZWRcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RyYWZ0QWRtaW5EYXRhKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSA9IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uLFxuXHRoYXNBY3RpdmVFbnRpdHk/OiBib29sZWFuLFxuXHRoaWRkZW5EcmFmdD86IGJvb2xlYW4sXG5cdHNraXBCYWNrTmF2aWdhdGlvbj86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBjb2xsYWJvcmF0aW9uQ29ubmVjdGVkID0gb0NvbnRyb2xsZXIuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCk7XG5cdGNvbnN0IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyA9ICFjb2xsYWJvcmF0aW9uQ29ubmVjdGVkXG5cdFx0PyBmblByb2Nlc3NGdW5jdGlvblxuXHRcdDogZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0XHRvQ29udHJvbGxlci5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbi5hcHBseShudWxsLCAuLi5hcmdzKTtcblx0XHQgIH07XG5cblx0Y29uc3QgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiA9IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbihvQ29udHJvbGxlcik7XG5cdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdGlmIChvQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0YXdhaXQgcHJvY2Vzc0ZjbE1vZGUoXG5cdFx0XHRcdGRyYWZ0QWRtaW5EYXRhLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdGhpZGRlbkRyYWZ0XG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAoIWhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0cHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlLFxuXHRcdFx0XHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0aGlkZGVuRHJhZnQsXG5cdFx0XHRcdHNraXBCYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0ZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmXG5cdFx0XHQoIWhpZGRlbkRyYWZ0IHx8IChoaWRkZW5EcmFmdCAmJiAhb0NvbnRyb2xsZXIuZWRpdEZsb3cuaXNEb2N1bWVudE1vZGlmaWVkKCkpKVxuXHRcdCkge1xuXHRcdFx0cHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5KG9Db250cm9sbGVyLCBjb250ZXh0LCBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsIG5hdmlnYXRpb25UeXBlKTtcblx0XHR9IGVsc2UgaWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHByb2Nlc3NFZGl0U3RhdGVEaXJ0eShcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGUsXG5cdFx0XHRcdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0aGlkZGVuRHJhZnRcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRoZSB1c2VyIHN0YXJ0ZWQgZWRpdGluZyB0aGUgZXhpc3RpbmcgZHJhZnQgYnV0IGRpZCBub3QgbWFrZSBhbnkgY2hhbmdlc1xuXHRcdFx0Ly8gaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnRcblx0XHRcdC8vIHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGdlbmVyYWwgaGFuZGxlciBpbiB3aGljaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyBhcmUgY2FsbGVkLlxuICogQHBhcmFtIGZuUHJvY2Vzc0Z1bmN0aW9uIEZ1bmN0aW9uIHRvIHByb2Nlc3MgYWZ0ZXIgY29uZmlybWF0aW9uLlxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gRnVuY3Rpb24gdG8gcHJvY2VzcyBvbiBjYW5jZWwuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3IgdGhlIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXcuXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IE9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIGJpbmRpbmcgdG8gdGhlIHZpZXcuXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgTmF2aWdhdGlvbiB0eXBlIGZvciB0aGUgb3BlcmF0aW9uLlxuICogQHBhcmFtIGFsd2F5c1Nob3dJbkhpZGRlbkRyYWZ0IFdoZXRoZXIgdG8gYWx3YXlzIHNob3cgZGlhbG9nIGluIGhpZGRlbiBkcmFmdCBtb2RlLlxuICogQHBhcmFtIHNraXBCYWNrTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIHdoaWNoIG1lbnRpb25zIGlmIGJhY2sgbmF2aWdhdGlvbiBzaG91bGQgYmUgc2tpcHBlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbixcblx0YWx3YXlzU2hvd0luSGlkZGVuRHJhZnQ/OiBib29sZWFuLFxuXHRza2lwQmFja05hdmlnYXRpb24/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgb1ZpZXcgPSBvQ29udHJvbGxlci5nZXRWaWV3KCk7XG5cdGNvbnN0IG9Nb2RlbCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0TW9kZWwoKTtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0Y29uc3Qgdmlld0RhdGEgPSBvVmlldy5nZXRWaWV3RGF0YSgpIGFzIHsgZW50aXR5U2V0Pzogc3RyaW5nOyBjb250ZXh0UGF0aD86IHN0cmluZyB9O1xuXHRjb25zdCBjb250ZXh0UGF0aCA9IHZpZXdEYXRhLmNvbnRleHRQYXRoIHx8ICh2aWV3RGF0YS5lbnRpdHlTZXQgPyBgLyR7dmlld0RhdGEuZW50aXR5U2V0fWAgOiB1bmRlZmluZWQpO1xuXHRjb25zdCBpc0RyYWZ0Um9vdCA9IGNvbnRleHRQYXRoID8gISFvTWV0YU1vZGVsLmdldE9iamVjdChgJHtjb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApIDogZmFsc2U7XG5cdGNvbnN0IGJJc0VkaXRhYmxlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShvVmlldyk7XG5cdGNvbnN0IG9yaWdpbmFsQ29udGV4dCA9IG9Db250ZXh0O1xuXHRsZXQgZHJhZnRSb290UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0aWYgKCFpc0RyYWZ0Um9vdCkge1xuXHRcdGRyYWZ0Um9vdFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KSA/PyBkcmFmdFJvb3RQYXRoO1xuXHRcdG9Db250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGRyYWZ0Um9vdFBhdGgsIHVuZGVmaW5lZCwgeyAkZXhwYW5kOiBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIgfSkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdH1cblx0Y29uc3QgaGlkZGVuRHJhZnQgPSAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKT8uZ2V0Q2FwYWJpbGl0aWVzKCk/LkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0KVxuXHRcdD8uZW5hYmxlZDtcblx0Ly8gU2hvdWxkbid0IGRpc3BsYXkgZGF0YSBsb3NzIHBvcG92ZXIgb24gc2hlbGwgYmFjayBuYXZpZ2F0aW9uIGZyb20gc3ViLW9iamVjdCBwYWdlcyAodW5sZXNzIHRoZXJlJ3Mgbm8gcGFnZSBiZWZvcmUgaW4gdGhlIGhpc3RvcnkgYmVjYXVzZSBvZiBkZWVwIGxpbmtpbmcpXG5cdC8vIG9yIHdoZW4gb2JqZWN0IHBhZ2UgaXMgaW4gZGlzcGxheSBtb2RlLCBvciB3aGVuIHRoZSBvYmplY3QgaXMgZGVsZXRlZFxuXHRjb25zdCBiYWNrTmF2U2hvd3NEaWFsb2cgPVxuXHRcdGlzRHJhZnRSb290IHx8IG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tFeGl0c0FwcCgpIHx8IChoaWRkZW5EcmFmdCAmJiBhbHdheXNTaG93SW5IaWRkZW5EcmFmdCk7XG5cdGlmIChvcmlnaW5hbENvbnRleHQuaXNEZWxldGVkKCkgfHwgKCFiYWNrTmF2U2hvd3NEaWFsb2cgJiYgbmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB8fCAhYklzRWRpdGFibGUpIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9IGVsc2Uge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBUaGUgZm9sbG93aW5nIDMgcHJvcGVydGllcyBhcmUgbmVlZGVkIHRvIGRldGVybWluZSB0aGUgc3RhdGUgb2YgdGhlIGRyYWZ0LCBzbyB3ZSBlbnN1cmUgdGhleSBhcmUgbG9hZGVkXG5cdFx0XHRhd2FpdCBvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1xuXHRcdFx0XHRcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0NyZWF0aW9uRGF0ZVRpbWVcIixcblx0XHRcdFx0XCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9MYXN0Q2hhbmdlRGF0ZVRpbWVcIixcblx0XHRcdFx0XCJIYXNBY3RpdmVFbnRpdHlcIlxuXHRcdFx0XSk7XG5cdFx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IG9Db250ZXh0LmdldE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpO1xuXHRcdFx0YXdhaXQgcHJvY2Vzc0RyYWZ0QWRtaW5EYXRhKFxuXHRcdFx0XHRkcmFmdEFkbWluRGF0YSxcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24sXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdGhpZGRlbkRyYWZ0ID8gb3JpZ2luYWxDb250ZXh0IDogb0NvbnRleHQsXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlLFxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSxcblx0XHRcdFx0aGlkZGVuRHJhZnQsXG5cdFx0XHRcdHNraXBCYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSBkcmFmdERhdGFDb250ZXh0IGluZm9ybWF0aW9uXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBTYXZlcyB0aGUgZG9jdW1lbnQuIElmIHRoZSBjb250cm9sbGVyIGlzIG9mIHR5cGUgT2JqZWN0UGFnZSwgdGhlbiBpbnRlcm5hbCBfc2F2ZURvY3VtZW50IGlzIGNhbGxlZCwgb3RoZXJ3aXNlIHNhdmVEb2N1bWVudFxuICogZnJvbSBFZGl0RmxvdyBpcyBjYWxsZWQuXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcGFyYW0gc2tpcEJpbmRpbmdUb1ZpZXcgVGhlIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2ZWQgaWYgdGhlIHNhdmUgd2FzIHN1Y2Nlc3NmdWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZURvY3VtZW50KGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLCBjb250ZXh0PzogT0RhdGFWNENvbnRleHQsIHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbik6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCBoYXNJbml0aWFsQ29udGV4dCA9IGNvbnRleHQgIT09IHVuZGVmaW5lZDtcblx0Y29udGV4dCA9IGNvbnRleHQgPz8gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0aWYgKCFoYXNJbml0aWFsQ29udGV4dCAmJiBjb250cm9sbGVyLmlzQTxPYmplY3RQYWdlQ29udHJvbGxlckNvbnRyb2xsZXI+KFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuX3NhdmVEb2N1bWVudChza2lwQmluZGluZ1RvVmlldyk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZWRpdEZsb3cuc2F2ZURvY3VtZW50KGNvbnRleHQsIHsgc2tpcEJpbmRpbmdUb1ZpZXcgfSk7XG5cdH1cbn1cblxuLyoqXG4gKiBEaXNjYXJkcyB0aGUgZHJhZnQuXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqIEBwYXJhbSBza2lwQmFja05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSB3aGljaCBkZXRlcm1pbmVzIGlmIGJhY2sgbmF2aWdhdGlvbiBzaG91bGQgYmUgc2tpcHBlZFxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmVkIGlmIGNhbmNlbERvY3VtZW50IHdhcyBzdWNjZXNzZnVsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc2NhcmREcmFmdChcblx0Y29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHQsXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhbixcblx0c2tpcEJhY2tOYXZpZ2F0aW9uPzogYm9vbGVhblxuKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdGNvbnRleHQgPSBjb250ZXh0ID8/IGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdGxldCBza2lwQmFja05hdmlnYXRpb25WYWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHNraXBCYWNrTmF2aWdhdGlvbjtcblx0aWYgKCFza2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRza2lwQmFja05hdmlnYXRpb25WYWx1ZSA9IGhpZGRlbkRyYWZ0ID09PSB0cnVlICYmICFjb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID8gZmFsc2UgOiB0cnVlO1xuXHR9XG5cdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRza2lwQmFja05hdmlnYXRpb246IHNraXBCYWNrTmF2aWdhdGlvblZhbHVlLFxuXHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZSxcblx0XHRza2lwQmluZGluZ1RvVmlldzogc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHVuZGVmaW5lZCA/IHNraXBCaW5kaW5nVG9WaWV3IDogdHJ1ZVxuXHR9O1xuXHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChjb250ZXh0LCBwYXJhbXMpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBmb2xsb3ctdXAgZnVuY3Rpb25zIGFmdGVyIGFuIG9wdGlvbiB3YXMgc2VsZWN0ZWQgaW4gdGhlIGRhdGEgbG9zcyBkaWFsb2cuXG4gKiBAcGFyYW0gc2VsZWN0ZWRLZXkgVGhlIGtleSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZyb20gdGhlIGRhdGEgbG9zcyBkaWFsb2dcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBiaW5kaW5nXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqIEBwYXJhbSBza2lwQmFja05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBiYWNrIG5hdmlnYXRpb24gc2hvdWxkIGJlIHNraXBwZWRcbiAqL1xuZnVuY3Rpb24gaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRzZWxlY3RlZEtleTogc3RyaW5nLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0Y29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHQsXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhbixcblx0c2tpcEJhY2tOYXZpZ2F0aW9uPzogYm9vbGVhblxuKTogdm9pZCB7XG5cdHN3aXRjaCAoc2VsZWN0ZWRLZXkpIHtcblx0XHRjYXNlIERyYWZ0RGF0YUxvc3NPcHRpb25zLlNhdmU6XG5cdFx0XHRkcmFmdERhdGFMb3NzUG9wdXBcblx0XHRcdFx0LnNhdmVEb2N1bWVudChjb250cm9sbGVyLCBjb250ZXh0LCBza2lwQmluZGluZ1RvVmlldylcblx0XHRcdFx0LnRoZW4oKHNhdmVkQ29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhzYXZlZENvbnRleHQpKVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoZXJyb3IgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuS2VlcDpcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3LCBjb250ZXh0LCBoaWRkZW5EcmFmdCwgc2tpcEJhY2tOYXZpZ2F0aW9uKVxuXHRcdFx0XHQudGhlbigoZGlzY2FyZGVkRHJhZnQ/KSA9PiBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoZGlzY2FyZGVkRHJhZnQpKVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIGRyYWZ0XCIsIGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24oKTtcblx0XHRcdGRhdGFMb3NzRGlhbG9nLmNsb3NlKCk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnREYXRhTG9zc1BvcHVwID0ge1xuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdHByb2Nlc3NGY2xNb2RlOiBwcm9jZXNzRmNsTW9kZSxcblx0cHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZTogcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZSxcblx0cHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5OiBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHksXG5cdHByb2Nlc3NFZGl0U3RhdGVEaXJ0eTogcHJvY2Vzc0VkaXRTdGF0ZURpcnR5LFxuXHRoYW5kbGVEaWFsb2dTZWxlY3Rpb246IGhhbmRsZURpYWxvZ1NlbGVjdGlvbixcblx0c2F2ZURvY3VtZW50OiBzYXZlRG9jdW1lbnQsXG5cdGRpc2NhcmREcmFmdDogZGlzY2FyZERyYWZ0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdERhdGFMb3NzUG9wdXA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0VBV0E7RUFBQSxJQUNLQSxjQUFjLDBCQUFkQSxjQUFjO0lBQWRBLGNBQWM7SUFBZEEsY0FBYztJQUFBLE9BQWRBLGNBQWM7RUFBQSxFQUFkQSxjQUFjO0VBS25CO0VBQUEsSUFDS0Msb0JBQW9CLDBCQUFwQkEsb0JBQW9CO0lBQXBCQSxvQkFBb0I7SUFBcEJBLG9CQUFvQjtJQUFwQkEsb0JBQW9CO0lBQUEsT0FBcEJBLG9CQUFvQjtFQUFBLEVBQXBCQSxvQkFBb0I7RUFXekI7RUFDQSxNQUFNQyxjQUFjLEdBQUcsSUFBSUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUM7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
|
|
@@ -93,6 +93,7 @@ async function processFclMode(
|
|
|
93
93
|
* @param bSkipBindingToView The optional parameter to skip the binding to the view
|
|
94
94
|
* @param context The context to be used for the draft operations
|
|
95
95
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
96
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped
|
|
96
97
|
* @returns Nothing
|
|
97
98
|
*/
|
|
98
99
|
async function processNoActiveEntityMode(
|
|
@@ -104,7 +105,8 @@ async function processNoActiveEntityMode(
|
|
|
104
105
|
bSilentlyKeepDraftOnForwardNavigation: boolean,
|
|
105
106
|
bSkipBindingToView?: boolean,
|
|
106
107
|
context?: ODataV4Context,
|
|
107
|
-
hiddenDraft?: boolean
|
|
108
|
+
hiddenDraft?: boolean,
|
|
109
|
+
skipBackNavigation?: boolean
|
|
108
110
|
): Promise<void> {
|
|
109
111
|
// There is no active entity so, we are editing either newly created data or
|
|
110
112
|
// a draft which has never been saved to active version
|
|
@@ -120,7 +122,7 @@ async function processNoActiveEntityMode(
|
|
|
120
122
|
// navigation we can silently discard the draft again
|
|
121
123
|
// eslint-disable-next-line promise/no-nesting
|
|
122
124
|
try {
|
|
123
|
-
await draftDataLossPopup.discardDraft(oController, bSkipBindingToView, context, hiddenDraft);
|
|
125
|
+
await draftDataLossPopup.discardDraft(oController, bSkipBindingToView, context, hiddenDraft, skipBackNavigation);
|
|
124
126
|
processFunctionForDrafts();
|
|
125
127
|
} catch (error: unknown) {
|
|
126
128
|
Log.error("Error while canceling the document", error as string);
|
|
@@ -142,7 +144,8 @@ async function processNoActiveEntityMode(
|
|
|
142
144
|
oController,
|
|
143
145
|
bSkipBindingToView,
|
|
144
146
|
context,
|
|
145
|
-
hiddenDraft
|
|
147
|
+
hiddenDraft,
|
|
148
|
+
skipBackNavigation
|
|
146
149
|
)
|
|
147
150
|
);
|
|
148
151
|
}
|
|
@@ -252,6 +255,7 @@ async function processEditStateDirty(
|
|
|
252
255
|
* @param navigationType The navigation type for which the function should be called
|
|
253
256
|
* @param hasActiveEntity Boolean value which mentions if root context has active entity or not
|
|
254
257
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
258
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped
|
|
255
259
|
* @returns Nothing
|
|
256
260
|
*/
|
|
257
261
|
async function processDraftAdminData(
|
|
@@ -263,7 +267,8 @@ async function processDraftAdminData(
|
|
|
263
267
|
bSkipBindingToView?: boolean,
|
|
264
268
|
navigationType: NavigationType = NavigationType.BackNavigation,
|
|
265
269
|
hasActiveEntity?: boolean,
|
|
266
|
-
hiddenDraft?: boolean
|
|
270
|
+
hiddenDraft?: boolean,
|
|
271
|
+
skipBackNavigation?: boolean
|
|
267
272
|
): Promise<void> {
|
|
268
273
|
const collaborationConnected = oController.collaborativeDraft.isConnected();
|
|
269
274
|
const processFunctionForDrafts = !collaborationConnected
|
|
@@ -295,7 +300,8 @@ async function processDraftAdminData(
|
|
|
295
300
|
bSilentlyKeepDraftOnForwardNavigation,
|
|
296
301
|
bSkipBindingToView,
|
|
297
302
|
undefined,
|
|
298
|
-
hiddenDraft
|
|
303
|
+
hiddenDraft,
|
|
304
|
+
skipBackNavigation
|
|
299
305
|
);
|
|
300
306
|
} else if (
|
|
301
307
|
draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime &&
|
|
@@ -326,13 +332,14 @@ async function processDraftAdminData(
|
|
|
326
332
|
|
|
327
333
|
/**
|
|
328
334
|
* The general handler in which the individual steps are called.
|
|
329
|
-
* @param fnProcessFunction
|
|
330
|
-
* @param fnCancelFunction
|
|
331
|
-
* @param oContext
|
|
332
|
-
* @param oController
|
|
333
|
-
* @param bSkipBindingToView
|
|
334
|
-
* @param navigationType
|
|
335
|
-
* @param alwaysShowInHiddenDraft
|
|
335
|
+
* @param fnProcessFunction Function to process after confirmation.
|
|
336
|
+
* @param fnCancelFunction Function to process on cancel.
|
|
337
|
+
* @param oContext Context for the operation.
|
|
338
|
+
* @param oController Controller of the current view.
|
|
339
|
+
* @param bSkipBindingToView Optional parameter to skip binding to the view.
|
|
340
|
+
* @param navigationType Navigation type for the operation.
|
|
341
|
+
* @param alwaysShowInHiddenDraft Whether to always show dialog in hidden draft mode.
|
|
342
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped.
|
|
336
343
|
*/
|
|
337
344
|
async function processDataLossOrDraftDiscardConfirmation(
|
|
338
345
|
fnProcessFunction: Function,
|
|
@@ -341,7 +348,8 @@ async function processDataLossOrDraftDiscardConfirmation(
|
|
|
341
348
|
oController: PageController,
|
|
342
349
|
bSkipBindingToView?: boolean,
|
|
343
350
|
navigationType: NavigationType = NavigationType.BackNavigation,
|
|
344
|
-
alwaysShowInHiddenDraft?: boolean
|
|
351
|
+
alwaysShowInHiddenDraft?: boolean,
|
|
352
|
+
skipBackNavigation?: boolean
|
|
345
353
|
): Promise<void> {
|
|
346
354
|
const oView = oController.getView();
|
|
347
355
|
const oModel = oView.getBindingContext().getModel();
|
|
@@ -382,7 +390,8 @@ async function processDataLossOrDraftDiscardConfirmation(
|
|
|
382
390
|
bSkipBindingToView,
|
|
383
391
|
navigationType,
|
|
384
392
|
oContext.getProperty("HasActiveEntity"),
|
|
385
|
-
hiddenDraft
|
|
393
|
+
hiddenDraft,
|
|
394
|
+
skipBackNavigation
|
|
386
395
|
);
|
|
387
396
|
} catch (oError: unknown) {
|
|
388
397
|
Log.error("Cannot retrieve draftDataContext information", oError as string);
|
|
@@ -415,17 +424,23 @@ async function saveDocument(controller: PageController, context?: ODataV4Context
|
|
|
415
424
|
* @param skipBindingToView The parameter to skip the binding to the view
|
|
416
425
|
* @param context The context to be used for the draft operations
|
|
417
426
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
427
|
+
* @param skipBackNavigation Boolean value which determines if back navigation should be skipped
|
|
418
428
|
* @returns A promise resolved if cancelDocument was successful
|
|
419
429
|
*/
|
|
420
430
|
async function discardDraft(
|
|
421
431
|
controller: PageController,
|
|
422
432
|
skipBindingToView: boolean | undefined,
|
|
423
433
|
context?: ODataV4Context,
|
|
424
|
-
hiddenDraft?: boolean
|
|
434
|
+
hiddenDraft?: boolean,
|
|
435
|
+
skipBackNavigation?: boolean
|
|
425
436
|
): Promise<unknown> {
|
|
426
437
|
context = context ?? controller.getView().getBindingContext();
|
|
438
|
+
let skipBackNavigationValue: boolean | undefined = skipBackNavigation;
|
|
439
|
+
if (!skipBackNavigation) {
|
|
440
|
+
skipBackNavigationValue = hiddenDraft === true && !context.getProperty("HasActiveEntity") ? false : true;
|
|
441
|
+
}
|
|
427
442
|
const params = {
|
|
428
|
-
skipBackNavigation:
|
|
443
|
+
skipBackNavigation: skipBackNavigationValue,
|
|
429
444
|
skipDiscardPopover: true,
|
|
430
445
|
skipBindingToView: skipBindingToView !== undefined ? skipBindingToView : true
|
|
431
446
|
};
|
|
@@ -441,6 +456,7 @@ async function discardDraft(
|
|
|
441
456
|
* @param skipBindingToView The parameter to skip the binding to the view
|
|
442
457
|
* @param context The context to be used for the binding
|
|
443
458
|
* @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
|
|
459
|
+
* @param skipBackNavigation Boolean value which mentions if back navigation should be skipped
|
|
444
460
|
*/
|
|
445
461
|
function handleDialogSelection(
|
|
446
462
|
selectedKey: string,
|
|
@@ -449,7 +465,8 @@ function handleDialogSelection(
|
|
|
449
465
|
controller: PageController,
|
|
450
466
|
skipBindingToView: boolean | undefined,
|
|
451
467
|
context?: ODataV4Context,
|
|
452
|
-
hiddenDraft?: boolean
|
|
468
|
+
hiddenDraft?: boolean,
|
|
469
|
+
skipBackNavigation?: boolean
|
|
453
470
|
): void {
|
|
454
471
|
switch (selectedKey) {
|
|
455
472
|
case DraftDataLossOptions.Save:
|
|
@@ -470,7 +487,7 @@ function handleDialogSelection(
|
|
|
470
487
|
break;
|
|
471
488
|
case DraftDataLossOptions.Discard:
|
|
472
489
|
draftDataLossPopup
|
|
473
|
-
.discardDraft(controller, skipBindingToView, context, hiddenDraft)
|
|
490
|
+
.discardDraft(controller, skipBindingToView, context, hiddenDraft, skipBackNavigation)
|
|
474
491
|
.then((discardedDraft?) => processFunctionForDrafts(discardedDraft))
|
|
475
492
|
.catch(function (error: string | undefined) {
|
|
476
493
|
Log.error("Error while discarding draft", error);
|