@sapui5/sap.fe.core 1.93.3 → 1.97.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +8 -40
- package/src/sap/fe/core/BusyLocker.js +12 -0
- package/src/sap/fe/core/CommonUtils.js +224 -48
- package/src/sap/fe/core/ExtensionAPI.js +1 -1
- package/src/sap/fe/core/PageController.js +13 -2
- package/src/sap/fe/core/RouterProxy.js +52 -64
- package/src/sap/fe/core/TemplateComponent.js +8 -2
- package/src/sap/fe/core/TransactionHelper.js +210 -180
- package/src/sap/fe/core/actions/draft.js +13 -1
- package/src/sap/fe/core/actions/messageHandling.js +80 -4
- package/src/sap/fe/core/actions/operations.js +207 -68
- package/src/sap/fe/core/controllerextensions/EditFlow.js +82 -55
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +13 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +132 -23
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +203 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +834 -170
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +890 -189
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -102
- package/src/sap/fe/core/controllerextensions/PageReady.js +48 -33
- package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -14
- package/src/sap/fe/core/controllerextensions/Paginator.js +150 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +133 -270
- package/src/sap/fe/core/controllerextensions/Share.js +12 -9
- package/src/sap/fe/core/controllerextensions/SideEffects.js +5 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -12
- package/src/sap/fe/core/controllerextensions/ViewState.js +202 -8
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +39 -34
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +109 -108
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +15 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +250 -94
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +129 -135
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +325 -0
- package/src/sap/fe/core/controls/filterbar.d.js +8 -0
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
- package/src/sap/fe/core/converters/ConverterContext.js +19 -5
- package/src/sap/fe/core/converters/ConverterContext.ts +13 -3
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +13 -3
- package/src/sap/fe/core/converters/ManifestWrapper.js +9 -9
- package/src/sap/fe/core/converters/MetaModelConverter.js +867 -871
- package/src/sap/fe/core/converters/MetaModelConverter.ts +772 -827
- package/src/sap/fe/core/converters/TemplateConverter.js +4 -4
- package/src/sap/fe/core/converters/annotations/DataField.js +57 -7
- package/src/sap/fe/core/converters/annotations/DataField.ts +52 -2
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +146 -85
- package/src/sap/fe/core/converters/controls/Common/Action.js +61 -56
- package/src/sap/fe/core/converters/controls/Common/Action.ts +54 -39
- package/src/sap/fe/core/converters/controls/Common/Chart.js +101 -9
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +100 -5
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -16
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +16 -30
- package/src/sap/fe/core/converters/controls/Common/Form.js +77 -29
- package/src/sap/fe/core/converters/controls/Common/Form.ts +79 -21
- package/src/sap/fe/core/converters/controls/Common/KPI.js +287 -109
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +314 -139
- package/src/sap/fe/core/converters/controls/Common/Table.js +521 -166
- package/src/sap/fe/core/converters/controls/Common/Table.ts +519 -115
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +487 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +541 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +364 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +338 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +74 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +50 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +11 -11
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +47 -35
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +45 -29
- package/src/sap/fe/core/converters/helpers/Aggregation.js +31 -32
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +26 -27
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +27 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +22 -2
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +9 -3
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +5 -4
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +4 -3
- package/src/sap/fe/core/converters/helpers/Key.js +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +11 -6
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +9 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +14 -14
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +91 -20
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +77 -5
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +87 -714
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +85 -812
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -17
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +121 -16
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +2 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
- package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/fpm/Component.js +1 -1
- package/src/sap/fe/core/helpers/AnnotationEnum.js +3 -3
- package/src/sap/fe/core/helpers/BindingExpression.js +6 -6
- package/src/sap/fe/core/helpers/ClassSupport.js +4 -4
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +0 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +78 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +6 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +2 -2
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -2
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +45 -2
- package/src/sap/fe/core/messagebundle_ar.properties +53 -1
- package/src/sap/fe/core/messagebundle_bg.properties +52 -0
- package/src/sap/fe/core/messagebundle_ca.properties +54 -2
- package/src/sap/fe/core/messagebundle_cs.properties +52 -0
- package/src/sap/fe/core/messagebundle_cy.properties +52 -0
- package/src/sap/fe/core/messagebundle_da.properties +53 -1
- package/src/sap/fe/core/messagebundle_de.properties +55 -3
- package/src/sap/fe/core/messagebundle_el.properties +53 -1
- package/src/sap/fe/core/messagebundle_en.properties +52 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +53 -1
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +49 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +53 -1
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +53 -1
- package/src/sap/fe/core/messagebundle_es.properties +60 -8
- package/src/sap/fe/core/messagebundle_es_MX.properties +55 -3
- package/src/sap/fe/core/messagebundle_et.properties +52 -0
- package/src/sap/fe/core/messagebundle_fi.properties +52 -0
- package/src/sap/fe/core/messagebundle_fr.properties +61 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +52 -0
- package/src/sap/fe/core/messagebundle_hi.properties +53 -1
- package/src/sap/fe/core/messagebundle_hr.properties +53 -1
- package/src/sap/fe/core/messagebundle_hu.properties +52 -0
- package/src/sap/fe/core/messagebundle_id.properties +54 -2
- package/src/sap/fe/core/messagebundle_it.properties +53 -1
- package/src/sap/fe/core/messagebundle_iw.properties +54 -2
- package/src/sap/fe/core/messagebundle_ja.properties +62 -10
- package/src/sap/fe/core/messagebundle_kk.properties +53 -1
- package/src/sap/fe/core/messagebundle_ko.properties +53 -1
- package/src/sap/fe/core/messagebundle_lt.properties +53 -1
- package/src/sap/fe/core/messagebundle_lv.properties +53 -1
- package/src/sap/fe/core/messagebundle_ms.properties +53 -1
- package/src/sap/fe/core/messagebundle_nl.properties +57 -5
- package/src/sap/fe/core/messagebundle_no.properties +54 -2
- package/src/sap/fe/core/messagebundle_pl.properties +53 -1
- package/src/sap/fe/core/messagebundle_pt.properties +54 -2
- package/src/sap/fe/core/messagebundle_pt_PT.properties +53 -1
- package/src/sap/fe/core/messagebundle_ro.properties +53 -1
- package/src/sap/fe/core/messagebundle_ru.properties +53 -1
- package/src/sap/fe/core/messagebundle_sh.properties +53 -1
- package/src/sap/fe/core/messagebundle_sk.properties +52 -0
- package/src/sap/fe/core/messagebundle_sl.properties +53 -1
- package/src/sap/fe/core/messagebundle_sv.properties +53 -1
- package/src/sap/fe/core/messagebundle_th.properties +52 -0
- package/src/sap/fe/core/messagebundle_tr.properties +52 -0
- package/src/sap/fe/core/messagebundle_uk.properties +52 -0
- package/src/sap/fe/core/messagebundle_vi.properties +53 -1
- package/src/sap/fe/core/messagebundle_zh_CN.properties +53 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +53 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +5 -5
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +5 -5
- package/src/sap/fe/core/services/RoutingServiceFactory.js +154 -78
- package/src/sap/fe/core/services/ShellServicesFactory.js +9 -9
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +11 -12
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +12 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +2 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +2 -4
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -4
- package/src/sap/fe/core/support/CommonHelper.js +2 -4
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -4
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +54 -6
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +54 -4
- package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
- package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +23 -5
- package/src/sap/fe/core/templating/FilterHelper.ts +15 -1
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.js +8 -8
- package/src/sap/fe/core/templating/UIFormatters.js +72 -4
- package/src/sap/fe/core/templating/UIFormatters.ts +98 -3
- package/src/sap/fe/core/type/Email.js +1 -1
|
@@ -3,113 +3,233 @@
|
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
sap.ui.define(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
sap.ui.define(
|
|
7
|
+
[
|
|
8
|
+
"sap/ui/core/mvc/ControllerExtension",
|
|
9
|
+
"sap/ui/core/mvc/OverrideExecution",
|
|
10
|
+
"sap/fe/core/actions/messageHandling",
|
|
11
|
+
"sap/fe/core/CommonUtils",
|
|
12
|
+
"sap/fe/core/controllerextensions/ControllerExtensionMetadata"
|
|
13
|
+
],
|
|
14
|
+
function(ControllerExtension, OverrideExecution, messageHandling, CommonUtils, ControllerExtensionMetadata) {
|
|
15
|
+
"use strict";
|
|
12
16
|
|
|
13
|
-
/**
|
|
14
|
-
* @class A controller extension offering message handling.
|
|
15
|
-
*
|
|
16
|
-
* @name sap.fe.core.controllerextensions.MessageHandler
|
|
17
|
-
* @hideconstructor
|
|
18
|
-
* @public
|
|
19
|
-
* @experimental As of version 1.90.0
|
|
20
|
-
* @since 1.90.0
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
var MessageHandler = ControllerExtension.extend("sap.fe.core.controllerextensions.MessageHandler", {
|
|
24
|
-
metadata: {
|
|
25
|
-
methods: {
|
|
26
|
-
showMessageDialog: { "public": true, "final": true },
|
|
27
|
-
getShowBoundMessagesInMessageDialog: { "public": false, "final": false, overrideExecution: OverrideExecution.Instead }
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @private
|
|
33
|
-
* @name sap.fe.core.controllerextensions.MessageHandler.getMetadata
|
|
34
|
-
* @function
|
|
35
|
-
*/
|
|
36
|
-
/**
|
|
37
|
-
* @private
|
|
38
|
-
* @name sap.fe.core.controllerextensions.MessageHandler.extend
|
|
39
|
-
* @function
|
|
40
|
-
*/
|
|
41
17
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
45
|
-
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
|
|
46
|
-
*
|
|
47
|
-
* If the bound messages are shown to the user with a different control like the (TODO:Link) MessageButton
|
|
48
|
-
* this method has to be overridden.
|
|
18
|
+
* @class A controller extension offering message handling.
|
|
49
19
|
*
|
|
50
|
-
* @
|
|
51
|
-
* @
|
|
52
|
-
*/
|
|
53
|
-
getShowBoundMessagesInMessageDialog: function() {
|
|
54
|
-
return true;
|
|
55
|
-
},
|
|
56
|
-
// eslint-disable-next-line jsdoc/require-param
|
|
57
|
-
/**
|
|
58
|
-
* Shows a message dialog with transition messages if there are any.
|
|
59
|
-
* The message dialog is shown as a modal dialog. Once the user confirms the dialog, all transition messages
|
|
60
|
-
* are removed from the message model. If there is more than one message, a list of messages is shown. The user
|
|
61
|
-
* can filter on message types and can display details as well as the long text. If there is one message,
|
|
62
|
-
* the dialog immediately shows the details of the message. If there is just one success message, a message
|
|
63
|
-
* toast is shown instead.
|
|
64
|
-
* @returns {Promise} A promise that is resolved once the user closes the dialog. If there are no messages
|
|
65
|
-
* to be shown, the promise is resolved immediately
|
|
66
|
-
* @alias sap.fe.core.controllerextensions.MessageHandler#showMessageDialog
|
|
20
|
+
* @name sap.fe.core.controllerextensions.MessageHandler
|
|
21
|
+
* @hideconstructor
|
|
67
22
|
* @public
|
|
68
23
|
* @experimental As of version 1.90.0
|
|
69
24
|
* @since 1.90.0
|
|
70
25
|
*/
|
|
71
|
-
showMessageDialog: function(mParameters) {
|
|
72
|
-
var customMessages = mParameters && mParameters.customMessages ? mParameters.customMessages : undefined,
|
|
73
|
-
oOPInternalBindingContext = this.base.getView().getBindingContext("internal");
|
|
74
|
-
// set isActionParameterDialog open so that it can be used in the controller extension to decide whether message dialog should open or not
|
|
75
|
-
if (mParameters && mParameters.isActionParameterDialogOpen && oOPInternalBindingContext) {
|
|
76
|
-
oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", true);
|
|
77
|
-
}
|
|
78
|
-
var bShowBoundMessages = this.getShowBoundMessagesInMessageDialog();
|
|
79
|
-
var oBindingContext = mParameters && mParameters.context ? mParameters.context : this.getView().getBindingContext();
|
|
80
|
-
var bEtagMessage = mParameters && mParameters.bHasEtagMessage;
|
|
81
|
-
// reset isActionParameterDialogOpen
|
|
82
|
-
// cannot do this operations.js since it is not aware of the view
|
|
83
|
-
if (oOPInternalBindingContext) {
|
|
84
|
-
oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", false);
|
|
85
|
-
}
|
|
86
|
-
return new Promise(function(resolve, reject) {
|
|
87
|
-
// we have to set a timeout to be able to access the most recent messages
|
|
88
|
-
setTimeout(function() {
|
|
89
|
-
// TODO: great API - will be changed later
|
|
90
|
-
messageHandling
|
|
91
|
-
.showUnboundMessages(customMessages, oBindingContext, bEtagMessage, bShowBoundMessages)
|
|
92
|
-
.then(resolve)
|
|
93
|
-
.catch(reject);
|
|
94
|
-
}, 0);
|
|
95
|
-
});
|
|
96
|
-
},
|
|
97
26
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
27
|
+
return ControllerExtension.extend(
|
|
28
|
+
"sap.fe.core.controllerextensions.MessageHandler",
|
|
29
|
+
{
|
|
30
|
+
metadata: {
|
|
31
|
+
methods: {
|
|
32
|
+
showMessageDialog: { "public": true, "final": true },
|
|
33
|
+
getShowBoundMessagesInMessageDialog: {
|
|
34
|
+
"public": false,
|
|
35
|
+
"final": false,
|
|
36
|
+
overrideExecution: OverrideExecution.Instead
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @private
|
|
43
|
+
* @name sap.fe.core.controllerextensions.MessageHandler.getMetadata
|
|
44
|
+
* @function
|
|
45
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* @private
|
|
48
|
+
* @name sap.fe.core.controllerextensions.MessageHandler.extend
|
|
49
|
+
* @function
|
|
50
|
+
*/
|
|
51
|
+
/**
|
|
52
|
+
* Determines whether or not bound messages are shown in the message dialog.
|
|
53
|
+
*
|
|
54
|
+
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
55
|
+
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
|
|
56
|
+
*
|
|
57
|
+
* If the bound messages are shown to the user with a different control like the (TODO:Link) MessageButton
|
|
58
|
+
* this method has to be overridden.
|
|
59
|
+
*
|
|
60
|
+
* @returns {boolean} Determines whether or not bound messages are shown in the message dialog.
|
|
61
|
+
* @private
|
|
62
|
+
*/
|
|
63
|
+
getShowBoundMessagesInMessageDialog: function() {
|
|
64
|
+
return true;
|
|
65
|
+
},
|
|
66
|
+
// eslint-disable-next-line jsdoc/require-param
|
|
67
|
+
/**
|
|
68
|
+
* Shows a message dialog with transition messages if there are any.
|
|
69
|
+
* The message dialog is shown as a modal dialog. Once the user confirms the dialog, all transition messages
|
|
70
|
+
* are removed from the message model. If there is more than one message, a list of messages is shown. The user
|
|
71
|
+
* can filter on message types and can display details as well as the long text. If there is one message,
|
|
72
|
+
* the dialog immediately shows the details of the message. If there is just one success message, a message
|
|
73
|
+
* toast is shown instead.
|
|
74
|
+
* @returns {Promise} A promise that is resolved once the user closes the dialog. If there are no messages
|
|
75
|
+
* to be shown, the promise is resolved immediately
|
|
76
|
+
* @alias sap.fe.core.controllerextensions.MessageHandler#showMessageDialog
|
|
77
|
+
* @public
|
|
78
|
+
* @experimental As of version 1.90.0
|
|
79
|
+
* @since 1.90.0
|
|
80
|
+
*/
|
|
81
|
+
showMessageDialog: function(mParameters) {
|
|
82
|
+
var customMessages = mParameters && mParameters.customMessages ? mParameters.customMessages : undefined,
|
|
83
|
+
oOPInternalBindingContext = this.base.getView().getBindingContext("internal");
|
|
84
|
+
// set isActionParameterDialog open so that it can be used in the controller extension to decide whether message dialog should open or not
|
|
85
|
+
if (mParameters && mParameters.isActionParameterDialogOpen && oOPInternalBindingContext) {
|
|
86
|
+
oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", true);
|
|
87
|
+
}
|
|
88
|
+
var bShowBoundMessages = this.getShowBoundMessagesInMessageDialog();
|
|
89
|
+
var oBindingContext = mParameters && mParameters.context ? mParameters.context : this.getView().getBindingContext();
|
|
90
|
+
var bEtagMessage = mParameters && mParameters.bHasEtagMessage;
|
|
91
|
+
// reset isActionParameterDialogOpen
|
|
92
|
+
// cannot do this operations.js since it is not aware of the view
|
|
93
|
+
if (oOPInternalBindingContext) {
|
|
94
|
+
oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", false);
|
|
95
|
+
}
|
|
96
|
+
return new Promise(function(resolve, reject) {
|
|
97
|
+
// we have to set a timeout to be able to access the most recent messages
|
|
98
|
+
setTimeout(function() {
|
|
99
|
+
// TODO: great API - will be changed later
|
|
100
|
+
messageHandling
|
|
101
|
+
.showUnboundMessages(customMessages, oBindingContext, bEtagMessage, bShowBoundMessages)
|
|
102
|
+
.then(resolve)
|
|
103
|
+
.catch(reject);
|
|
104
|
+
}, 0);
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* You can remove the existing transition message from the message model with this method.
|
|
110
|
+
* With every user interaction that causes server communication (like clicking on an action, changing data),
|
|
111
|
+
* this method removes the existing transition messages from the message model.
|
|
112
|
+
* @param {boolean} keepBoundMessage Checks if the bound transition messages are not to be removed
|
|
113
|
+
*
|
|
114
|
+
* @alias sap.fe.core.controllerextensions.MessageHandler#removesTransitionMessages
|
|
115
|
+
* @private
|
|
116
|
+
*/
|
|
117
|
+
removeTransitionMessages: function(keepBoundMessage) {
|
|
118
|
+
if (!keepBoundMessage) {
|
|
119
|
+
messageHandling.removeBoundTransitionMessages();
|
|
120
|
+
}
|
|
121
|
+
messageHandling.removeUnboundTransitionMessages();
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
_checkNavigationToMessagePage: function(mParameters) {
|
|
125
|
+
var aUnboundMessages = messageHandling.getMessages(),
|
|
126
|
+
bShowBoundTransitionMessages = this.getShowBoundMessagesInMessageDialog(),
|
|
127
|
+
aBoundTransitionMessages = bShowBoundTransitionMessages ? messageHandling.getMessages(true, true) : [],
|
|
128
|
+
aCustomMessages = mParameters && mParameters.customMessages ? mParameters.customMessages : [],
|
|
129
|
+
bIsStickyEditMode = CommonUtils.isStickyEditMode(this.base.getView()),
|
|
130
|
+
mMessagePageParameters;
|
|
131
|
+
|
|
132
|
+
// TODO: Stick mode check is okay as long as the controller extension is used with sap.fe.core and sap.fe.core.AppComponent.
|
|
133
|
+
// It might be better to provide an extension to the consumer of the controller extension to provide this value.
|
|
134
|
+
|
|
135
|
+
// The message page can only show 1 message today, so we navigate to it when :
|
|
136
|
+
// 1. There are no bound transition messages to show,
|
|
137
|
+
// 2. There are no custom messages to show, &
|
|
138
|
+
// 3. There is exactly 1 unbound message in the message model with statusCode=503 and retry-After available
|
|
139
|
+
// 4. retryAfter is greater than 120 seconds
|
|
140
|
+
//
|
|
141
|
+
// In Addition, navigating away from a sticky session will destroy the session so we do not navigate to message page for now.
|
|
142
|
+
// TODO: check if navigation should be done in sticky edit mode.
|
|
143
|
+
if (
|
|
144
|
+
!bIsStickyEditMode &&
|
|
145
|
+
!aBoundTransitionMessages.length &&
|
|
146
|
+
!aCustomMessages.length &&
|
|
147
|
+
aUnboundMessages.length === 1
|
|
148
|
+
) {
|
|
149
|
+
var oMessage = aUnboundMessages[0],
|
|
150
|
+
oTechnicalDetails = oMessage.getTechnicalDetails();
|
|
151
|
+
var sRetryAfterMessage;
|
|
152
|
+
if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503) {
|
|
153
|
+
if (oTechnicalDetails.retryAfter) {
|
|
154
|
+
var iSecondsBeforeRetry = this._getSecondsBeforeRetryAfter(oTechnicalDetails.retryAfter);
|
|
155
|
+
if (iSecondsBeforeRetry > 120) {
|
|
156
|
+
// TODO: For now let's keep getRetryAfterMessage in messageHandling because it is needed also by the dialog.
|
|
157
|
+
// We can plan to move this and the dialog logic both to messageHandler controller extension if required.
|
|
158
|
+
sRetryAfterMessage = messageHandling.getRetryAfterMessage(oMessage);
|
|
159
|
+
mMessagePageParameters = {
|
|
160
|
+
description: sRetryAfterMessage
|
|
161
|
+
? sRetryAfterMessage + " " + oMessage.getMessage()
|
|
162
|
+
: oMessage.getMessage(),
|
|
163
|
+
navigateBackToOrigin: true
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
sRetryAfterMessage = messageHandling.getRetryAfterMessage(oMessage);
|
|
168
|
+
mMessagePageParameters = {
|
|
169
|
+
description: sRetryAfterMessage
|
|
170
|
+
? sRetryAfterMessage + " " + oMessage.getMessage()
|
|
171
|
+
: oMessage.getMessage(),
|
|
172
|
+
navigateBackToOrigin: true
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return mMessagePageParameters;
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
_getSecondsBeforeRetryAfter: function(dRetryAfter) {
|
|
181
|
+
var dCurrentDateTime = new Date(),
|
|
182
|
+
iCurrentDateTimeInMilliSeconds = dCurrentDateTime.getTime(),
|
|
183
|
+
iRetryAfterDateTimeInMilliSeconds = dRetryAfter.getTime(),
|
|
184
|
+
iSecondsBeforeRetry = (iRetryAfterDateTimeInMilliSeconds - iCurrentDateTimeInMilliSeconds) / 1000;
|
|
185
|
+
return iSecondsBeforeRetry;
|
|
186
|
+
},
|
|
187
|
+
/**
|
|
188
|
+
* Shows a message page or a message dialog based on the messages in the message dialog.
|
|
189
|
+
* @param mParameters
|
|
190
|
+
* @returns {Promise} A promise that is resolved once the user closes the message dialog or when navigation to the message page is complete. If there are no messages
|
|
191
|
+
* to be shown, the promise is resolved immediately
|
|
192
|
+
* @private
|
|
193
|
+
*/
|
|
194
|
+
showMessages: function(mParameters) {
|
|
195
|
+
var mMessagePageParameters = this._checkNavigationToMessagePage(mParameters);
|
|
196
|
+
if (mMessagePageParameters) {
|
|
197
|
+
// navigate to message page.
|
|
198
|
+
// handler before page navigation is triggered, for example to close the action parameter dialog
|
|
199
|
+
mParameters && mParameters.messagePageNavigationCallback && mParameters.messagePageNavigationCallback();
|
|
200
|
+
|
|
201
|
+
mMessagePageParameters.handleShellBack = true;
|
|
202
|
+
// TODO: Use Illustrated message instead of normal message page
|
|
203
|
+
// TODO: Return value needs to provided but since this function is private for now hence we can skip this.
|
|
204
|
+
this.removeTransitionMessages();
|
|
205
|
+
var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
|
|
206
|
+
if (this.base._routing) {
|
|
207
|
+
return new Promise(
|
|
208
|
+
function(resolve, reject) {
|
|
209
|
+
// we have to set a timeout to be able to access the most recent messages
|
|
210
|
+
setTimeout(
|
|
211
|
+
function() {
|
|
212
|
+
// TODO: great API - will be changed later
|
|
213
|
+
this.base._routing
|
|
214
|
+
.navigateToMessagePage(
|
|
215
|
+
oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE"),
|
|
216
|
+
mMessagePageParameters
|
|
217
|
+
)
|
|
218
|
+
.then(resolve)
|
|
219
|
+
.catch(reject);
|
|
220
|
+
}.bind(this),
|
|
221
|
+
0
|
|
222
|
+
);
|
|
223
|
+
}.bind(this)
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
// navigate to message dialog
|
|
228
|
+
return this.showMessageDialog(mParameters);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
ControllerExtensionMetadata
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "sap/ui/core/Component", "sap/fe/core/CommonUtils", "sap/ui/base/EventProvider", "sap/base/Log", "../helpers/ClassSupport"], function (ControllerExtension, OverrideExecution, ControllerExtensionMetadata, Component, CommonUtils, EventProvider, Log, ClassSupport) {
|
|
5
|
+
sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "sap/ui/core/Component", "sap/fe/core/CommonUtils", "sap/ui/base/EventProvider", "sap/base/Log", "../helpers/ClassSupport", "sap/fe/core/services/TemplatedViewServiceFactory"], function (ControllerExtension, OverrideExecution, ControllerExtensionMetadata, Component, CommonUtils, EventProvider, Log, ClassSupport, TemplatedViewServiceFactory) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _class, _class2;
|
|
@@ -24,13 +24,13 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
|
|
|
24
24
|
|
|
25
25
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
26
26
|
|
|
27
|
-
function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (
|
|
27
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
28
28
|
|
|
29
29
|
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
|
30
30
|
|
|
31
31
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
32
32
|
|
|
33
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try {
|
|
33
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
34
34
|
|
|
35
35
|
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
36
36
|
|
|
@@ -53,7 +53,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
|
|
|
53
53
|
var _this = this;
|
|
54
54
|
|
|
55
55
|
this._nbWaits = 0;
|
|
56
|
-
this.
|
|
56
|
+
this._bSeachTriggered = false;
|
|
57
|
+
this._oEventProvider = this._oEventProvider ? this._oEventProvider : new EventProvider();
|
|
57
58
|
this._oView = this.base.getView();
|
|
58
59
|
this._oAppComponent = CommonUtils.getAppComponent(this._oView);
|
|
59
60
|
this._oPageComponent = Component.getOwnerComponentFor(this._oView);
|
|
@@ -65,6 +66,17 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
|
|
|
65
66
|
} else {
|
|
66
67
|
this.registerContainer(this._oView);
|
|
67
68
|
}
|
|
69
|
+
|
|
70
|
+
var oPlaceholder = this._oAppComponent.getRootControl().getController().getPlaceholder();
|
|
71
|
+
|
|
72
|
+
if (oPlaceholder.isPlaceholderDebugEnabled()) {
|
|
73
|
+
this.attachEvent("pageReady", null, function () {
|
|
74
|
+
oPlaceholder.getPlaceholderDebugStats().iPageReadyEventTimestamp = Date.now();
|
|
75
|
+
}, this);
|
|
76
|
+
this.attachEvent("heroesBatchReceived", null, function () {
|
|
77
|
+
oPlaceholder.getPlaceholderDebugStats().iHeroesBatchReceivedEventTimestamp = Date.now();
|
|
78
|
+
}, this);
|
|
79
|
+
}
|
|
68
80
|
}
|
|
69
81
|
}, {
|
|
70
82
|
key: "onExit",
|
|
@@ -132,7 +144,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
|
|
|
132
144
|
oEvent.getSource().detachDataReceived(fnReceived);
|
|
133
145
|
iReceived++;
|
|
134
146
|
|
|
135
|
-
if (iReceived
|
|
147
|
+
if (iReceived >= iRequested && iRequested !== 0) {
|
|
136
148
|
iRequested = 0;
|
|
137
149
|
iReceived = 0;
|
|
138
150
|
_this3.bDataReceived = true;
|
|
@@ -143,33 +155,36 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
|
|
|
143
155
|
|
|
144
156
|
var fnSearch = function (oEvent) {
|
|
145
157
|
var aMDCTables = aNotBoundMDCTables.filter(function (oElem) {
|
|
146
|
-
if (oEvent.getSource().sId === oElem.getFilter()) {
|
|
158
|
+
if (oEvent.getSource().sId === oElem.getFilter() && oElem.getVisible()) {
|
|
147
159
|
return true;
|
|
148
160
|
}
|
|
149
161
|
|
|
150
162
|
return false;
|
|
151
163
|
});
|
|
164
|
+
|
|
165
|
+
if (aMDCTables.length > 0) {
|
|
166
|
+
_this3._bSeachTriggered = true;
|
|
167
|
+
}
|
|
168
|
+
|
|
152
169
|
aMDCTables.forEach(function (oMDCTable) {
|
|
153
170
|
var oRowBinding = oMDCTable.getRowBinding();
|
|
154
171
|
|
|
155
172
|
var fnAttachDataEvents = function () {
|
|
156
173
|
oRowBinding.attachDataRequested(fnRequested);
|
|
157
|
-
oRowBinding.attachDataReceived(
|
|
174
|
+
oRowBinding.attachDataReceived(function (oEvent) {
|
|
175
|
+
fnReceived(oEvent);
|
|
176
|
+
_this3._bSeachTriggered = false;
|
|
177
|
+
});
|
|
158
178
|
aBoundElements.push(oRowBinding);
|
|
159
179
|
};
|
|
160
180
|
|
|
161
181
|
if (oRowBinding) {
|
|
162
182
|
fnAttachDataEvents();
|
|
163
183
|
} else {
|
|
164
|
-
|
|
184
|
+
oMDCTable.attachEventOnce("bindingUpdated", null, function () {
|
|
165
185
|
oRowBinding = oMDCTable.getRowBinding();
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
fnAttachDataEvents();
|
|
169
|
-
} else {
|
|
170
|
-
Log.error("Cannot attach events to unbound table");
|
|
171
|
-
}
|
|
172
|
-
}, 0);
|
|
186
|
+
fnAttachDataEvents();
|
|
187
|
+
}, null);
|
|
173
188
|
}
|
|
174
189
|
});
|
|
175
190
|
};
|
|
@@ -374,24 +389,24 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
|
|
|
374
389
|
|
|
375
390
|
if (this.bShown && this.bDataReceived !== false && this.bTablesLoaded !== false && (!this.isContextExpected() || this.bHasContext) // Either no context is expected or there is one
|
|
376
391
|
) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
}
|
|
392
|
+
if (this.bDataReceived === true && !bFromNav && !this._bWaitingForRefresh && sap.ui.getCore().getUIDirty()) {
|
|
393
|
+
// If we requested data we get notified as soon as the data arrived, so before the next rendering tick
|
|
394
|
+
this.bDataReceived = undefined;
|
|
395
|
+
this._bWaitingForRefresh = true;
|
|
396
|
+
sap.ui.getCore().attachEvent("UIUpdated", fnUIUpdated);
|
|
397
|
+
setTimeout(checkUIUpdated, 500);
|
|
398
|
+
} else if (!this._bWaitingForRefresh && sap.ui.getCore().getUIDirty() || this._nbWaits !== 0 || TemplatedViewServiceFactory.getNumberOfViewsInCreationState() > 0 || this._bSeachTriggered) {
|
|
399
|
+
this._bWaitingForRefresh = true;
|
|
400
|
+
sap.ui.getCore().attachEvent("UIUpdated", fnUIUpdated);
|
|
401
|
+
setTimeout(checkUIUpdated, 500);
|
|
402
|
+
} else if (!this._bWaitingForRefresh) {
|
|
403
|
+
// In the case we're not waiting for any data (navigating back to a page we already have loaded)
|
|
404
|
+
// just wait for a frame to fire the event.
|
|
405
|
+
this._bIsPageReady = true;
|
|
406
|
+
|
|
407
|
+
this._oEventProvider.fireEvent("pageReady");
|
|
394
408
|
}
|
|
409
|
+
}
|
|
395
410
|
}
|
|
396
411
|
}]);
|
|
397
412
|
|
|
@@ -399,4 +414,4 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
|
|
|
399
414
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitFor", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "waitFor"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isPageReady", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "isPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitPageReady", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "waitPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEventOnce", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEventOnce"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEvent", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "detachEvent", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "detachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isContextExpected", [Private, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "isContextExpected"), _class2.prototype)), _class2)) || _class);
|
|
400
415
|
return PageReadyControllerExtension;
|
|
401
416
|
}, false);
|
|
402
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhZ2VSZWFkeS50cyJdLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJfbmJXYWl0cyIsIl9vRXZlbnRQcm92aWRlciIsIkV2ZW50UHJvdmlkZXIiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsImF0dGFjaENvbnRhaW5lckRlZmluZWQiLCJvRXZlbnQiLCJyZWdpc3RlckNvbnRhaW5lciIsImdldFBhcmFtZXRlciIsIl9vQ29udGFpbmVyIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9mbkNvbnRhaW5lckRlbGVnYXRlIiwib1Byb21pc2UiLCJmaW5hbGx5Iiwic2V0VGltZW91dCIsImNhdGNoIiwiX2JJc1BhZ2VSZWFkeSIsImNoZWNrUGFnZVJlYWR5RGVib3VuY2VkIiwib0JpbmRpbmdDb250ZXh0IiwiX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCIsImFCb3VuZEVsZW1lbnRzIiwiYU5vdEJvdW5kTURDVGFibGVzIiwiaVJlcXVlc3RlZCIsImlSZWNlaXZlZCIsImZuUmVxdWVzdGVkIiwiZ2V0U291cmNlIiwiZGV0YWNoRGF0YVJlcXVlc3RlZCIsImJEYXRhUmVjZWl2ZWQiLCJmblJlY2VpdmVkIiwic0dyb3VwSWQiLCJmaXJlRXZlbnQiLCJkZXRhY2hEYXRhUmVjZWl2ZWQiLCJmblNlYXJjaCIsImFNRENUYWJsZXMiLCJmaWx0ZXIiLCJvRWxlbSIsInNJZCIsImdldEZpbHRlciIsImZvckVhY2giLCJvTURDVGFibGUiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJmbkF0dGFjaERhdGFFdmVudHMiLCJhdHRhY2hEYXRhUmVxdWVzdGVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwicHVzaCIsIkxvZyIsImVycm9yIiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJ1bmRlZmluZWQiLCJiSGFzQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIm9FbGVtZW50IiwiZGV0YWNoRXZlbnQiLCJtYWluT2JqZWN0QmluZGluZyIsImdldEJpbmRpbmciLCJhVGFibGVJbml0aWFsaXplZFByb21pc2VzIiwiZmluZEFnZ3JlZ2F0ZWRPYmplY3RzIiwib09iamVjdEJpbmRpbmciLCJnZXRPYmplY3RCaW5kaW5nIiwiYUJpbmRpbmdLZXlzIiwiT2JqZWN0Iiwia2V5cyIsIm1CaW5kaW5nSW5mb3MiLCJsZW5ndGgiLCJzUHJvcGVydHlOYW1lIiwib0xpc3RCaW5kaW5nIiwiYmluZGluZyIsImlzQSIsImJUYWJsZXNMb2FkZWQiLCJpbml0aWFsaXplZCIsInRoZW4iLCJvRXJyb3IiLCJhdHRhY2hFdmVudCIsIlByb21pc2UiLCJhbGwiLCJpbmZvIiwicmVzb2x2ZSIsImlzUGFnZVJlYWR5Iiwic0V2ZW50SWQiLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJvQ29udGFpbmVyIiwib25CZWZvcmVTaG93IiwiYlNob3duIiwib25CZWZvcmVIaWRlIiwib25BZnRlclNob3ciLCJfY2hlY2tQYWdlUmVhZHkiLCJhZGRFdmVudERlbGVnYXRlIiwicGFnZVJlYWR5VGltZXIiLCJjbGVhclRpbWVvdXQiLCJiRnJvbU5hdiIsImZuVUlVcGRhdGVkIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0VUlEaXJ0eSIsIl9iV2FpdGluZ0ZvclJlZnJlc2giLCJjaGVja1VJVXBkYXRlZCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiLCJGaW5hbCIsIlByaXZhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BVU1BLDRCLFdBRExD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QTlCLElBQWdFLEtBQUt4RyxRQUFMLEtBQWtCLENBQXRGLEVBQXlGO0FBQy9GLG1CQUFLeUcsbUJBQUwsR0FBMkIsSUFBM0I7QUFDQUosY0FBQUEsR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUJ2QixXQUFqQixDQUE2QixXQUE3QixFQUEwQ29CLFdBQTFDO0FBQ0EvRSxjQUFBQSxVQUFVLENBQUNxRixjQUFELEVBQWlCLEdBQWpCLENBQVY7QUFDQSxhQUpNLE1BSUEsSUFBSSxDQUFDLEtBQUtELG1CQUFWLEVBQStCO0FBQ3JDO0FBQ0E7QUFDQSxtQkFBS2xGLGFBQUwsR0FBcUIsSUFBckI7O0FBQ0EsbUJBQUt0QixlQUFMLENBQXFCb0MsU0FBckIsQ0FBK0IsV0FBL0I7QUFDQTtBQUNEO0FBQ0Q7Ozs7SUFoVnlDc0UsbUIsaVdBd0N6Q0MsTSxFQUNBQyxLLHlvQkE0S0FELE0sRUFDQUMsSyx5SkFLQUQsTSxFQUNBQyxLLDZKQWtCQUQsTSxFQUNBQyxLLDJKQUtBRCxNLEVBQ0FDLEssdUpBS0FELE0sRUFDQUMsSyw2SkF3QkFDLE87U0FnRWFySCw0QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiwgT3ZlcnJpZGVFeGVjdXRpb24gfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50LCBDb21tb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgTWFuYWdlZE9iamVjdCwgRXZlbnRQcm92aWRlciB9IGZyb20gXCJzYXAvdWkvYmFzZVwiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbFwiO1xuaW1wb3J0IHsgVUk1Q2xhc3MsIE92ZXJyaWRlLCBQdWJsaWMsIEZpbmFsLCBFeHRlbnNpYmxlLCBQcml2YXRlIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5cbkBVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlBhZ2VSZWFkeVwiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX29FdmVudFByb3ZpZGVyITogRXZlbnRQcm92aWRlcjtcblx0cHJpdmF0ZSBfb1ZpZXc6IGFueTtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBhbnk7XG5cdHByaXZhdGUgX29Db250YWluZXIhOiBhbnk7XG5cdHByaXZhdGUgX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2ZuQ29udGFpbmVyRGVsZWdhdGU6IGFueTtcblx0cHJpdmF0ZSBfbmJXYWl0cyE6IG51bWJlcjtcblx0cHJpdmF0ZSBfYklzUGFnZVJlYWR5ITogYm9vbGVhbjtcblx0cHJpdmF0ZSBfYldhaXRpbmdGb3JSZWZyZXNoITogYm9vbGVhbjtcblx0cHJpdmF0ZSBiU2hvd24hOiBib29sZWFuO1xuXHRwcml2YXRlIGJIYXNDb250ZXh0ITogYm9vbGVhbjtcblx0cHJpdmF0ZSBiRGF0YVJlY2VpdmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIGJUYWJsZXNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgcGFnZVJlYWR5VGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fbmJXYWl0cyA9IDA7XG5cdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIgPSBuZXcgRXZlbnRQcm92aWRlcigpO1xuXHRcdHRoaXMuX29WaWV3ID0gKHRoaXMgYXMgYW55KS5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldyk7XG5cblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCgob0V2ZW50OiBVSTVFdmVudCkgPT4gdGhpcy5yZWdpc3RlckNvbnRhaW5lcihvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGFpbmVyXCIpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVnaXN0ZXJDb250YWluZXIodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRkZWxldGUgdGhpcy5fb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLl9vQ29udGFpbmVyICYmIHRoaXMuX29Db250YWluZXIucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0Rm9yKG9Qcm9taXNlOiBhbnkpIHtcblx0XHR0aGlzLl9uYldhaXRzKys7XG5cdFx0b1Byb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fbmJXYWl0cy0tO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gobnVsbCk7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdH1cblxuXHRAT3ZlcnJpZGUoXCJfcm91dGluZ1wiKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIXRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCkge1xuXHRcdFx0dGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkID0gdHJ1ZTtcblx0XHRcdGxldCBhQm91bmRFbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IGFOb3RCb3VuZE1EQ1RhYmxlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBpUmVxdWVzdGVkID0gMDtcblx0XHRcdGxldCBpUmVjZWl2ZWQgPSAwO1xuXHRcdFx0Y29uc3QgZm5SZXF1ZXN0ZWQgPSAob0V2ZW50OiBVSTVFdmVudCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuZGV0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdGlSZXF1ZXN0ZWQrKztcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5SZWNlaXZlZCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdHN3aXRjaCAob0V2ZW50LmdldFNvdXJjZSgpLnNHcm91cElkKSB7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLldvcmtlcnNcIjpcblx0XHRcdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcIndvcmtlcnNCYXRjaFJlY2VpdmVkXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLkhlcm9lc1wiOlxuXHRcdFx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdH1cblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmRldGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0aVJlY2VpdmVkKys7XG5cdFx0XHRcdGlmIChpUmVjZWl2ZWQgPT09IGlSZXF1ZXN0ZWQgJiYgaVJlcXVlc3RlZCAhPT0gMCkge1xuXHRcdFx0XHRcdGlSZXF1ZXN0ZWQgPSAwO1xuXHRcdFx0XHRcdGlSZWNlaXZlZCA9IDA7XG5cdFx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBmblNlYXJjaCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFNRENUYWJsZXMgPSBhTm90Qm91bmRNRENUYWJsZXMuZmlsdGVyKG9FbGVtID0+IHtcblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLnNJZCA9PT0gb0VsZW0uZ2V0RmlsdGVyKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhTURDVGFibGVzLmZvckVhY2goKG9NRENUYWJsZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBmbkF0dGFjaERhdGFFdmVudHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzLnB1c2gob1Jvd0JpbmRpbmcpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRmbkF0dGFjaERhdGFFdmVudHMoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGF0dGFjaCBldmVudHMgdG8gdW5ib3VuZCB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpICYmIG9CaW5kaW5nQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIEZvcmNlIHRvIG1lbnRpb24gd2UgYXJlIGV4cGVjdGluZyBkYXRhXG5cdFx0XHRcdHRoaXMuYkhhc0NvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcInBhZ2VSZWFkeVwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVxdWVzdGVkXCIsIGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9FbGVtZW50LmRldGFjaEV2ZW50KFwiZGF0YVJlY2VpdmVkXCIsIGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzID0gW107XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG1haW5PYmplY3RCaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdG1haW5PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChtYWluT2JqZWN0QmluZGluZyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cdFx0XHR0aGlzLl9vVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKG9FbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb09iamVjdEJpbmRpbmcgPSBvRWxlbWVudC5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvT2JqZWN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBvYmplY3QgYmluZGluZyAobW9zdGx5IHVzZWQgb24gb2JqZWN0IHBhZ2VzKVxuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9PYmplY3RCaW5kaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBhQmluZGluZ0tleXMgPSBPYmplY3Qua2V5cyhvRWxlbWVudC5tQmluZGluZ0luZm9zKTtcblx0XHRcdFx0XHRpZiAoYUJpbmRpbmdLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFCaW5kaW5nS2V5cy5mb3JFYWNoKHNQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvRWxlbWVudC5tQmluZGluZ0luZm9zW3NQcm9wZXJ0eU5hbWVdLmJpbmRpbmc7XG5cdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBsaXN0IGJpbmRpbmcsIGdvb2QgZm9yIGJhc2ljIHRhYmxlcywgcHJvYmxlbWF0aWMgZm9yIE1EQywgc2VlIGFib3ZlXG5cdFx0XHRcdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhpcyBpcyBkaXJ0eSBidXQgTURDIFRhYmxlIGhhcyBhIHdlaXJkIGxvYWRpbmcgbGlmZWN5Y2xlXG5cdFx0XHRcdGlmIChvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRcdGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdG9FbGVtZW50XG5cdFx0XHRcdFx0XHRcdC5pbml0aWFsaXplZCgpXG5cdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9FbGVtZW50LmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvUm93QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFOb3RCb3VuZE1EQ1RhYmxlcy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGZpbmQgYSBib3VuZCB0YWJsZVwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9FbGVtZW50LmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkZpbHRlckJhclwiKSkge1xuXHRcdFx0XHRcdG9FbGVtZW50LmF0dGFjaEV2ZW50KFwic2VhcmNoXCIsIGZuU2VhcmNoKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFByb21pc2UuYWxsKGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmluZm8oXCJUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCBvbmUgb3IgbXVsdGlwbGUgdGFibGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGlzUGFnZVJlYWR5KCkge1xuXHRcdHJldHVybiB0aGlzLl9iSXNQYWdlUmVhZHk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgd2FpdFBhZ2VSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pc1BhZ2VSZWFkeSgpKSB7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkOiBzdHJpbmcsIG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IEZ1bmN0aW9uLCBvTGlzdGVuZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblx0XHRyZXR1cm4gdGhpcy5fb0V2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnQoc0V2ZW50SWQ6IHN0cmluZywgb0RhdGE6IGFueSwgZm5GdW5jdGlvbjogRnVuY3Rpb24sIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChzRXZlbnRJZCwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGRldGFjaEV2ZW50KHNFdmVudElkOiBzdHJpbmcsIGZuRnVuY3Rpb246IEZ1bmN0aW9uKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChzRXZlbnRJZCwgZm5GdW5jdGlvbik7XG5cdH1cblx0cHJpdmF0ZSByZWdpc3RlckNvbnRhaW5lcihvQ29udGFpbmVyOiBNYW5hZ2VkT2JqZWN0KSB7XG5cdFx0dGhpcy5fb0NvbnRhaW5lciA9IG9Db250YWluZXI7XG5cdFx0dGhpcy5fZm5Db250YWluZXJEZWxlZ2F0ZSA9IHtcblx0XHRcdG9uQmVmb3JlU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkJlZm9yZUhpZGU6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0b25BZnRlclNob3c6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSh0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRoaXMuX29Db250YWluZXIuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQcml2YXRlXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdHB1YmxpYyBpc0NvbnRleHRFeHBlY3RlZCgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKSB7XG5cdFx0aWYgKHRoaXMucGFnZVJlYWR5VGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnBhZ2VSZWFkeVRpbWVyKTtcblx0XHR9XG5cdFx0dGhpcy5wYWdlUmVhZHlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHR9LCAyMDApO1xuXHR9XG5cblx0cHVibGljIF9jaGVja1BhZ2VSZWFkeShiRnJvbU5hdjogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgZm5VSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHQvLyBXYWl0IHVudGlsIHRoZSBVSSBpcyBubyBsb25nZXIgZGlydHlcblx0XHRcdGlmICghc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5kZXRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0XHR9LCAyMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIEluIGNhc2UgVUlVcGRhdGUgZG9lcyBub3QgZ2V0IGNhbGxlZCwgY2hlY2sgaWYgVUkgaXMgbm90IGRpcnR5IGFuZCB0aGVuIGNhbGwgX2NoZWNrUGFnZVJlYWR5XG5cdFx0Y29uc3QgY2hlY2tVSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHRpZiAoc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoKSB7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5iU2hvd24gJiZcblx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCAhPT0gZmFsc2UgJiZcblx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCAhPT0gZmFsc2UgJiZcblx0XHRcdCghdGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpIHx8IHRoaXMuYkhhc0NvbnRleHQpIC8vIEVpdGhlciBubyBjb250ZXh0IGlzIGV4cGVjdGVkIG9yIHRoZXJlIGlzIG9uZVxuXHRcdCkge1xuXHRcdFx0aWYgKHRoaXMuYkRhdGFSZWNlaXZlZCA9PT0gdHJ1ZSAmJiAhYkZyb21OYXYgJiYgIXRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCAmJiBzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHQvLyBJZiB3ZSByZXF1ZXN0ZWQgZGF0YSB3ZSBnZXQgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgZGF0YSBhcnJpdmVkLCBzbyBiZWZvcmUgdGhlIG5leHQgcmVuZGVyaW5nIHRpY2tcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggPSB0cnVlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmF0dGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAoKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggJiYgc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHx8IHRoaXMuX25iV2FpdHMgIT09IDApIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gdHJ1ZTtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5hdHRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHNldFRpbWVvdXQoY2hlY2tVSVVwZGF0ZWQsIDUwMCk7XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugd2UncmUgbm90IHdhaXRpbmcgZm9yIGFueSBkYXRhIChuYXZpZ2F0aW5nIGJhY2sgdG8gYSBwYWdlIHdlIGFscmVhZHkgaGF2ZSBsb2FkZWQpXG5cdFx0XHRcdC8vIGp1c3Qgd2FpdCBmb3IgYSBmcmFtZSB0byBmaXJlIHRoZSBldmVudC5cblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicGFnZVJlYWR5XCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
|
|
417
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhZ2VSZWFkeS50cyJdLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJfbmJXYWl0cyIsIl9iU2VhY2hUcmlnZ2VyZWQiLCJfb0V2ZW50UHJvdmlkZXIiLCJFdmVudFByb3ZpZGVyIiwiX29WaWV3IiwiYmFzZSIsImdldFZpZXciLCJfb0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29QYWdlQ29tcG9uZW50IiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJhdHRhY2hDb250YWluZXJEZWZpbmVkIiwib0V2ZW50IiwicmVnaXN0ZXJDb250YWluZXIiLCJnZXRQYXJhbWV0ZXIiLCJvUGxhY2Vob2xkZXIiLCJnZXRSb290Q29udHJvbCIsImdldENvbnRyb2xsZXIiLCJnZXRQbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJEZWJ1Z0VuYWJsZWQiLCJhdHRhY2hFdmVudCIsImdldFBsYWNlaG9sZGVyRGVidWdTdGF0cyIsImlQYWdlUmVhZHlFdmVudFRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJpSGVyb2VzQmF0Y2hSZWNlaXZlZEV2ZW50VGltZXN0YW1wIiwiX29Db250YWluZXIiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiX2ZuQ29udGFpbmVyRGVsZWdhdGUiLCJvUHJvbWlzZSIsImZpbmFsbHkiLCJzZXRUaW1lb3V0IiwiY2F0Y2giLCJfYklzUGFnZVJlYWR5IiwiY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQiLCJvQmluZGluZ0NvbnRleHQiLCJfYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkIiwiYUJvdW5kRWxlbWVudHMiLCJhTm90Qm91bmRNRENUYWJsZXMiLCJpUmVxdWVzdGVkIiwiaVJlY2VpdmVkIiwiZm5SZXF1ZXN0ZWQiLCJnZXRTb3VyY2UiLCJkZXRhY2hEYXRhUmVxdWVzdGVkIiwiYkRhdGFSZWNlaXZlZCIsImZuUmVjZWl2ZWQiLCJzR3JvdXBJZCIsImZpcmVFdmVudCIsImRldGFjaERhdGFSZWNlaXZlZCIsImZuU2VhcmNoIiwiYU1EQ1RhYmxlcyIsImZpbHRlciIsIm9FbGVtIiwic0lkIiwiZ2V0RmlsdGVyIiwiZ2V0VmlzaWJsZSIsImxlbmd0aCIsImZvckVhY2giLCJvTURDVGFibGUiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJmbkF0dGFjaERhdGFFdmVudHMiLCJhdHRhY2hEYXRhUmVxdWVzdGVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwicHVzaCIsImF0dGFjaEV2ZW50T25jZSIsImlzQ29udGV4dEV4cGVjdGVkIiwidW5kZWZpbmVkIiwiYkhhc0NvbnRleHQiLCJvRWxlbWVudCIsImRldGFjaEV2ZW50IiwibWFpbk9iamVjdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcyIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsIm9PYmplY3RCaW5kaW5nIiwiZ2V0T2JqZWN0QmluZGluZyIsImFCaW5kaW5nS2V5cyIsIk9iamVjdCIsImtleXMiLCJtQmluZGluZ0luZm9zIiwic1Byb3BlcnR5TmFtZSIsIm9MaXN0QmluZGluZyIsImJpbmRpbmciLCJpc0EiLCJiVGFibGVzTG9hZGVkIiwiaW5pdGlhbGl6ZWQiLCJ0aGVuIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJQcm9taXNlIiwiYWxsIiwiaW5mbyIsInJlc29sdmUiLCJpc1BhZ2VSZWFkeSIsInNFdmVudElkIiwib0RhdGEiLCJmbkZ1bmN0aW9uIiwib0xpc3RlbmVyIiwib0NvbnRhaW5lciIsIm9uQmVmb3JlU2hvdyIsImJTaG93biIsIm9uQmVmb3JlSGlkZSIsIm9uQWZ0ZXJTaG93IiwiX2NoZWNrUGFnZVJlYWR5IiwiYWRkRXZlbnREZWxlZ2F0ZSIsInBhZ2VSZWFkeVRpbWVyIiwiY2xlYXJUaW1lb3V0IiwiYkZyb21OYXYiLCJmblVJVXBkYXRlZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldFVJRGlydHkiLCJfYldhaXRpbmdGb3JSZWZyZXNoIiwiY2hlY2tVSVVwZGF0ZWQiLCJUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkiLCJnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlIiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIlB1YmxpYyIsIkZpbmFsIiwiUHJpdmF0ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFTTUEsNEIsV0FETEMsUUFBUSxDQUFDLDRDQUFELEVBQStDQywyQkFBL0MsQyxVQW1CUEMsUUFBUSxFLFVBb0NSQSxRQUFRLEUsVUFvQlJBLFFBQVEsQ0FBQyxVQUFELEMsVUFJUkEsUUFBUSxDQUFDLFVBQUQsQyxVQUtSQSxRQUFRLENBQUMsVUFBRCxDLFVBOE5SQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxPQUFuQixDOzs7Ozs7Ozs7Ozs7O2FBL1JYLGtCQUNnQjtBQUFBOztBQUNmLGFBQUtDLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDQSxhQUFLQyxnQkFBTCxHQUF3QixLQUF4QjtBQUNBLGFBQUtDLGVBQUwsR0FBdUIsS0FBS0EsZUFBTCxHQUF1QixLQUFLQSxlQUE1QixHQUE4QyxJQUFJQyxhQUFKLEVBQXJFO0FBQ0EsYUFBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtBQUNBLGFBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtBQUNBLGFBQUtNLGVBQUwsR0FBdUJDLFNBQVMsQ0FBQ0Msb0JBQVYsQ0FBK0IsS0FBS1IsTUFBcEMsQ0FBdkI7O0FBRUEsWUFBSSxLQUFLTSxlQUFMLElBQXdCLEtBQUtBLGVBQUwsQ0FBcUJHLHNCQUFqRCxFQUF5RTtBQUN4RSxlQUFLSCxlQUFMLENBQXFC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QWlCN0YsV0FBakIsQ0FBNkIsV0FBN0IsRUFBMEMwRixXQUExQztBQUNBL0UsWUFBQUEsVUFBVSxDQUFDcUYsY0FBRCxFQUFpQixHQUFqQixDQUFWO0FBQ0EsV0FORCxNQU1PLElBQ0wsQ0FBQyxLQUFLRCxtQkFBTixJQUE2QkosR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUJDLFVBQWpCLEVBQTlCLElBQ0EsS0FBS3BILFFBQUwsS0FBa0IsQ0FEbEIsSUFFQXVILDJCQUEyQixDQUFDQywrQkFBNUIsS0FBZ0UsQ0FGaEUsSUFHQSxLQUFLdkgsZ0JBSkMsRUFLTDtBQUNELGlCQUFLb0gsbUJBQUwsR0FBMkIsSUFBM0I7QUFDQUosWUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUI3RixXQUFqQixDQUE2QixXQUE3QixFQUEwQzBGLFdBQTFDO0FBQ0EvRSxZQUFBQSxVQUFVLENBQUNxRixjQUFELEVBQWlCLEdBQWpCLENBQVY7QUFDQSxXQVRNLE1BU0EsSUFBSSxDQUFDLEtBQUtELG1CQUFWLEVBQStCO0FBQ3JDO0FBQ0E7QUFDQSxpQkFBS2xGLGFBQUwsR0FBcUIsSUFBckI7O0FBQ0EsaUJBQUtqQyxlQUFMLENBQXFCK0MsU0FBckIsQ0FBK0IsV0FBL0I7QUFDQTtBQUNEO0FBQ0Q7Ozs7SUFsWHlDd0UsbUIsaVdBOER6Q0MsTSxFQUNBQyxLLHlvQkFtTEFELE0sRUFDQUMsSyx5SkFLQUQsTSxFQUNBQyxLLDZKQWtCQUQsTSxFQUNBQyxLLDJKQUtBRCxNLEVBQ0FDLEssdUpBS0FELE0sRUFDQUMsSyw2SkF3QkFDLE87U0FxRWFuSSw0QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiwgT3ZlcnJpZGVFeGVjdXRpb24sIFZpZXcgfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50LCBDb21tb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgTWFuYWdlZE9iamVjdCwgRXZlbnRQcm92aWRlciB9IGZyb20gXCJzYXAvdWkvYmFzZVwiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbFwiO1xuaW1wb3J0IHsgVUk1Q2xhc3MsIE92ZXJyaWRlLCBQdWJsaWMsIEZpbmFsLCBFeHRlbnNpYmxlLCBQcml2YXRlIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXNcIjtcblxuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuUGFnZVJlYWR5XCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFBhZ2VSZWFkeUNvbnRyb2xsZXJFeHRlbnNpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBfb0V2ZW50UHJvdmlkZXIhOiBFdmVudFByb3ZpZGVyO1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IGFueTtcblx0cHJpdmF0ZSBfb0NvbnRhaW5lciE6IGFueTtcblx0cHJpdmF0ZSBfYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkITogYm9vbGVhbjtcblx0cHJpdmF0ZSBfZm5Db250YWluZXJEZWxlZ2F0ZTogYW55O1xuXHRwcml2YXRlIF9uYldhaXRzITogbnVtYmVyO1xuXHRwcml2YXRlIF9iU2VhY2hUcmlnZ2VyZWQhOiBib29sZWFuO1xuXHRwcml2YXRlIF9iSXNQYWdlUmVhZHkhOiBib29sZWFuO1xuXHRwcml2YXRlIF9iV2FpdGluZ0ZvclJlZnJlc2ghOiBib29sZWFuO1xuXHRwcml2YXRlIGJTaG93biE6IGJvb2xlYW47XG5cdHByaXZhdGUgYkhhc0NvbnRleHQhOiBib29sZWFuO1xuXHRwcml2YXRlIGJEYXRhUmVjZWl2ZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgYlRhYmxlc0xvYWRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBwYWdlUmVhZHlUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpIHtcblx0XHR0aGlzLl9uYldhaXRzID0gMDtcblx0XHR0aGlzLl9iU2VhY2hUcmlnZ2VyZWQgPSBmYWxzZTtcblx0XHR0aGlzLl9vRXZlbnRQcm92aWRlciA9IHRoaXMuX29FdmVudFByb3ZpZGVyID8gdGhpcy5fb0V2ZW50UHJvdmlkZXIgOiBuZXcgRXZlbnRQcm92aWRlcigpO1xuXHRcdHRoaXMuX29WaWV3ID0gKHRoaXMgYXMgYW55KS5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldyk7XG5cblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCgob0V2ZW50OiBVSTVFdmVudCkgPT4gdGhpcy5yZWdpc3RlckNvbnRhaW5lcihvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGFpbmVyXCIpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVnaXN0ZXJDb250YWluZXIodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9QbGFjZWhvbGRlciA9ICgodGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpIGFzIFZpZXcpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLmdldFBsYWNlaG9sZGVyKCk7XG5cdFx0aWYgKG9QbGFjZWhvbGRlci5pc1BsYWNlaG9sZGVyRGVidWdFbmFibGVkKCkpIHtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRvUGxhY2Vob2xkZXIuZ2V0UGxhY2Vob2xkZXJEZWJ1Z1N0YXRzKCkuaVBhZ2VSZWFkeUV2ZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpc1xuXHRcdFx0KTtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0b1BsYWNlaG9sZGVyLmdldFBsYWNlaG9sZGVyRGVidWdTdGF0cygpLmlIZXJvZXNCYXRjaFJlY2VpdmVkRXZlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRkZWxldGUgdGhpcy5fb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLl9vQ29udGFpbmVyICYmIHRoaXMuX29Db250YWluZXIucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0Rm9yKG9Qcm9taXNlOiBhbnkpIHtcblx0XHR0aGlzLl9uYldhaXRzKys7XG5cdFx0b1Byb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fbmJXYWl0cy0tO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gobnVsbCk7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdH1cblxuXHRAT3ZlcnJpZGUoXCJfcm91dGluZ1wiKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IENvbnRleHQ8YW55Pikge1xuXHRcdGlmICghdGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkKSB7XG5cdFx0XHR0aGlzLl9iQWZ0ZXJCaW5kaW5nQWxyZWFkeUFwcGxpZWQgPSB0cnVlO1xuXHRcdFx0bGV0IGFCb3VuZEVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgYU5vdEJvdW5kTURDVGFibGVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0bGV0IGlSZXF1ZXN0ZWQgPSAwO1xuXHRcdFx0bGV0IGlSZWNlaXZlZCA9IDA7XG5cdFx0XHRjb25zdCBmblJlcXVlc3RlZCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5kZXRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0aVJlcXVlc3RlZCsrO1xuXHRcdFx0XHR0aGlzLmJEYXRhUmVjZWl2ZWQgPSBmYWxzZTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBmblJlY2VpdmVkID0gKG9FdmVudDogVUk1RXZlbnQpID0+IHtcblx0XHRcdFx0c3dpdGNoIChvRXZlbnQuZ2V0U291cmNlKCkuc0dyb3VwSWQpIHtcblx0XHRcdFx0XHRjYXNlIFwiJGF1dG8uV29ya2Vyc1wiOlxuXHRcdFx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwid29ya2Vyc0JhdGNoUmVjZWl2ZWRcIik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiJGF1dG8uSGVyb2VzXCI6XG5cdFx0XHRcdFx0XHR0aGlzLl9vRXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJoZXJvZXNCYXRjaFJlY2VpdmVkXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0fVxuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuZGV0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRpUmVjZWl2ZWQrKztcblx0XHRcdFx0aWYgKGlSZWNlaXZlZCA+PSBpUmVxdWVzdGVkICYmIGlSZXF1ZXN0ZWQgIT09IDApIHtcblx0XHRcdFx0XHRpUmVxdWVzdGVkID0gMDtcblx0XHRcdFx0XHRpUmVjZWl2ZWQgPSAwO1xuXHRcdFx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCA9IHRydWU7XG5cdFx0XHRcdFx0dGhpcy5jaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5TZWFyY2ggPSAob0V2ZW50OiBVSTVFdmVudCkgPT4ge1xuXHRcdFx0XHRjb25zdCBhTURDVGFibGVzID0gYU5vdEJvdW5kTURDVGFibGVzLmZpbHRlcihvRWxlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5zSWQgPT09IG9FbGVtLmdldEZpbHRlcigpICYmIG9FbGVtLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChhTURDVGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR0aGlzLl9iU2VhY2hUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFNRENUYWJsZXMuZm9yRWFjaCgob01EQ1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRsZXQgb1Jvd0JpbmRpbmcgPSBvTURDVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGZuQXR0YWNoRGF0YUV2ZW50cyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRmblJlY2VpdmVkKG9FdmVudCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2JTZWFjaFRyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9Sb3dCaW5kaW5nKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9NRENUYWJsZS5hdHRhY2hFdmVudE9uY2UoXG5cdFx0XHRcdFx0XHRcdFwiYmluZGluZ1VwZGF0ZWRcIixcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRmbkF0dGFjaERhdGFFdmVudHMoKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0bnVsbFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHRcdGlmICh0aGlzLmlzQ29udGV4dEV4cGVjdGVkKCkgJiYgb0JpbmRpbmdDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gRm9yY2UgdG8gbWVudGlvbiB3ZSBhcmUgZXhwZWN0aW5nIGRhdGFcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmJIYXNDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hdHRhY2hFdmVudE9uY2UoXG5cdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5mb3JFYWNoKChvRWxlbWVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRvRWxlbWVudC5kZXRhY2hFdmVudChcImRhdGFSZXF1ZXN0ZWRcIiwgZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVjZWl2ZWRcIiwgZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRvRWxlbWVudC5kZXRhY2hFdmVudChcInNlYXJjaFwiLCBmblNlYXJjaCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkID0gZmFsc2U7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMgPSBbXTtcblx0XHRcdFx0fSxcblx0XHRcdFx0bnVsbFxuXHRcdFx0KTtcblx0XHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgbWFpbk9iamVjdEJpbmRpbmcgPSAob0JpbmRpbmdDb250ZXh0IGFzIGFueSkuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRtYWluT2JqZWN0QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG1haW5PYmplY3RCaW5kaW5nKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcblx0XHRcdHRoaXMuX29WaWV3LmZpbmRBZ2dyZWdhdGVkT2JqZWN0cyh0cnVlLCAob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvT2JqZWN0QmluZGluZyA9IG9FbGVtZW50LmdldE9iamVjdEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9PYmplY3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgb24gYWxsIG9iamVjdCBiaW5kaW5nIChtb3N0bHkgdXNlZCBvbiBvYmplY3QgcGFnZXMpXG5cdFx0XHRcdFx0b09iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0b09iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzLnB1c2gob09iamVjdEJpbmRpbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGFCaW5kaW5nS2V5cyA9IE9iamVjdC5rZXlzKG9FbGVtZW50Lm1CaW5kaW5nSW5mb3MpO1xuXHRcdFx0XHRcdGlmIChhQmluZGluZ0tleXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0YUJpbmRpbmdLZXlzLmZvckVhY2goc1Byb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9FbGVtZW50Lm1CaW5kaW5nSW5mb3Nbc1Byb3BlcnR5TmFtZV0uYmluZGluZztcblx0XHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgb24gYWxsIGxpc3QgYmluZGluZywgZ29vZCBmb3IgYmFzaWMgdGFibGVzLCBwcm9ibGVtYXRpYyBmb3IgTURDLCBzZWUgYWJvdmVcblx0XHRcdFx0XHRcdFx0aWYgKG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBUaGlzIGlzIGRpcnR5IGJ1dCBNREMgVGFibGUgaGFzIGEgd2VpcmQgbG9hZGluZyBsaWZlY3ljbGVcblx0XHRcdFx0aWYgKG9FbGVtZW50LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHR0aGlzLmJUYWJsZXNMb2FkZWQgPSBmYWxzZTtcblx0XHRcdFx0XHQvLyBhY2Nlc3MgYmluZGluZyBvbmx5IGFmdGVyIHRhYmxlIGlzIGJvdW5kXG5cdFx0XHRcdFx0YVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0b0VsZW1lbnRcblx0XHRcdFx0XHRcdFx0LmluaXRpYWxpemVkKClcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb0VsZW1lbnQuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9Sb3dCaW5kaW5nKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YU5vdEJvdW5kTURDVGFibGVzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgZmluZCBhIGJvdW5kIHRhYmxlXCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0VsZW1lbnQuaXNBKFwic2FwLmZlLmNvcmUuY29udHJvbHMuRmlsdGVyQmFyXCIpKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQuYXR0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhVGFibGVJbml0aWFsaXplZFByb21pc2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0UHJvbWlzZS5hbGwoYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcylcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJUYWJsZXNMb2FkZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0dGhpcy5jaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuaW5mbyhcIlRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIG9uZSBvciBtdWx0aXBsZSB0YWJsZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaXNQYWdlUmVhZHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2JJc1BhZ2VSZWFkeTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0UGFnZVJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdGlmICh0aGlzLmlzUGFnZVJlYWR5KCkpIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hdHRhY2hFdmVudE9uY2UoXG5cdFx0XHRcdFx0XCJwYWdlUmVhZHlcIixcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRoaXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBhdHRhY2hFdmVudE9uY2Uoc0V2ZW50SWQ6IHN0cmluZywgb0RhdGE6IGFueSwgZm5GdW5jdGlvbjogRnVuY3Rpb24sIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5hdHRhY2hFdmVudE9uY2Uoc0V2ZW50SWQsIG9EYXRhLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBhdHRhY2hFdmVudChzRXZlbnRJZDogc3RyaW5nLCBvRGF0YTogYW55LCBmbkZ1bmN0aW9uOiBGdW5jdGlvbiwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG5cdFx0cmV0dXJuIHRoaXMuX29FdmVudFByb3ZpZGVyLmF0dGFjaEV2ZW50KHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgZGV0YWNoRXZlbnQoc0V2ZW50SWQ6IHN0cmluZywgZm5GdW5jdGlvbjogRnVuY3Rpb24pIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG5cdFx0cmV0dXJuIHRoaXMuX29FdmVudFByb3ZpZGVyLmRldGFjaEV2ZW50KHNFdmVudElkLCBmbkZ1bmN0aW9uKTtcblx0fVxuXHRwcml2YXRlIHJlZ2lzdGVyQ29udGFpbmVyKG9Db250YWluZXI6IE1hbmFnZWRPYmplY3QpIHtcblx0XHR0aGlzLl9vQ29udGFpbmVyID0gb0NvbnRhaW5lcjtcblx0XHR0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlID0ge1xuXHRcdFx0b25CZWZvcmVTaG93OiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuYlNob3duID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMuX2JJc1BhZ2VSZWFkeSA9IGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdG9uQmVmb3JlSGlkZTogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkFmdGVyU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX2NoZWNrUGFnZVJlYWR5KHRydWUpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dGhpcy5fb0NvbnRhaW5lci5hZGRFdmVudERlbGVnYXRlKHRoaXMuX2ZuQ29udGFpbmVyRGVsZWdhdGUpO1xuXHR9XG5cblx0QFByaXZhdGVcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0cHVibGljIGlzQ29udGV4dEV4cGVjdGVkKCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBjaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpIHtcblx0XHRpZiAodGhpcy5wYWdlUmVhZHlUaW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMucGFnZVJlYWR5VGltZXIpO1xuXHRcdH1cblx0XHR0aGlzLnBhZ2VSZWFkeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdH0sIDIwMCk7XG5cdH1cblxuXHRwdWJsaWMgX2NoZWNrUGFnZVJlYWR5KGJGcm9tTmF2OiBib29sZWFuID0gZmFsc2UpIHtcblx0XHRjb25zdCBmblVJVXBkYXRlZCA9ICgpID0+IHtcblx0XHRcdC8vIFdhaXQgdW50aWwgdGhlIFVJIGlzIG5vIGxvbmdlciBkaXJ0eVxuXHRcdFx0aWYgKCFzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gZmFsc2U7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2NoZWNrUGFnZVJlYWR5KCk7XG5cdFx0XHRcdH0sIDIwKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gSW4gY2FzZSBVSVVwZGF0ZSBkb2VzIG5vdCBnZXQgY2FsbGVkLCBjaGVjayBpZiBVSSBpcyBub3QgZGlydHkgYW5kIHRoZW4gY2FsbCBfY2hlY2tQYWdlUmVhZHlcblx0XHRjb25zdCBjaGVja1VJVXBkYXRlZCA9ICgpID0+IHtcblx0XHRcdGlmIChzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gZmFsc2U7XG5cdFx0XHRcdHNhcC51aS5nZXRDb3JlKCkuZGV0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmJTaG93biAmJlxuXHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkICE9PSBmYWxzZSAmJlxuXHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkICE9PSBmYWxzZSAmJlxuXHRcdFx0KCF0aGlzLmlzQ29udGV4dEV4cGVjdGVkKCkgfHwgdGhpcy5iSGFzQ29udGV4dCkgLy8gRWl0aGVyIG5vIGNvbnRleHQgaXMgZXhwZWN0ZWQgb3IgdGhlcmUgaXMgb25lXG5cdFx0KSB7XG5cdFx0XHRpZiAodGhpcy5iRGF0YVJlY2VpdmVkID09PSB0cnVlICYmICFiRnJvbU5hdiAmJiAhdGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoICYmIHNhcC51aS5nZXRDb3JlKCkuZ2V0VUlEaXJ0eSgpKSB7XG5cdFx0XHRcdC8vIElmIHdlIHJlcXVlc3RlZCBkYXRhIHdlIGdldCBub3RpZmllZCBhcyBzb29uIGFzIHRoZSBkYXRhIGFycml2ZWQsIHNvIGJlZm9yZSB0aGUgbmV4dCByZW5kZXJpbmcgdGlja1xuXHRcdFx0XHR0aGlzLmJEYXRhUmVjZWl2ZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IHRydWU7XG5cdFx0XHRcdHNhcC51aS5nZXRDb3JlKCkuYXR0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggJiYgc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHx8XG5cdFx0XHRcdHRoaXMuX25iV2FpdHMgIT09IDAgfHxcblx0XHRcdFx0VGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUoKSA+IDAgfHxcblx0XHRcdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gdHJ1ZTtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5hdHRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHNldFRpbWVvdXQoY2hlY2tVSVVwZGF0ZWQsIDUwMCk7XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugd2UncmUgbm90IHdhaXRpbmcgZm9yIGFueSBkYXRhIChuYXZpZ2F0aW5nIGJhY2sgdG8gYSBwYWdlIHdlIGFscmVhZHkgaGF2ZSBsb2FkZWQpXG5cdFx0XHRcdC8vIGp1c3Qgd2FpdCBmb3IgYSBmcmFtZSB0byBmaXJlIHRoZSBldmVudC5cblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicGFnZVJlYWR5XCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
|