@sapui5/sap.fe.templates 1.100.0 → 1.101.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.
Files changed (132) hide show
  1. package/package.json +4 -5
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +24 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +30 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +156 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +82 -53
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +123 -112
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +2 -1
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1111 -1081
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +54 -53
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +134 -137
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +443 -428
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -0
  24. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +25 -25
  25. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  27. package/src/sap/fe/templates/ListReport/view/fragments/{MultipleMode.fragment.xml → MultipleModeOld.fragment.xml} +24 -23
  28. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +478 -514
  29. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
  30. package/src/sap/fe/templates/ObjectPage/Component.js +169 -138
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +140 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +3 -9
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1530 -1447
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -0
  37. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +136 -101
  38. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +24 -21
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +98 -53
  42. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  43. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +20 -19
  44. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +50 -47
  46. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +34 -34
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +15 -15
  50. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +11 -11
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  53. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +55 -52
  54. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +15 -17
  56. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +13 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +23 -21
  60. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +310 -317
  62. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +66 -57
  64. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  65. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +1 -1
  66. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +1 -1
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +18 -24
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -9
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +4 -4
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  71. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +851 -817
  72. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -0
  73. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +205 -189
  74. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  75. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +484 -459
  76. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  77. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +16 -14
  78. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  79. package/src/sap/fe/templates/TableScroller.js +45 -53
  80. package/src/sap/fe/templates/TableScroller.ts +48 -0
  81. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  82. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +22 -0
  83. package/src/sap/fe/templates/library.js +49 -63
  84. package/src/sap/fe/templates/library.ts +57 -0
  85. package/src/sap/fe/templates/messagebundle.properties +19 -7
  86. package/src/sap/fe/templates/messagebundle_ar.properties +6 -2
  87. package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
  88. package/src/sap/fe/templates/messagebundle_ca.properties +6 -2
  89. package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
  90. package/src/sap/fe/templates/messagebundle_cy.properties +6 -2
  91. package/src/sap/fe/templates/messagebundle_da.properties +6 -2
  92. package/src/sap/fe/templates/messagebundle_de.properties +6 -2
  93. package/src/sap/fe/templates/messagebundle_el.properties +6 -2
  94. package/src/sap/fe/templates/messagebundle_en.properties +6 -2
  95. package/src/sap/fe/templates/messagebundle_en_GB.properties +6 -2
  96. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +6 -2
  97. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +6 -2
  98. package/src/sap/fe/templates/messagebundle_es.properties +6 -2
  99. package/src/sap/fe/templates/messagebundle_es_MX.properties +6 -2
  100. package/src/sap/fe/templates/messagebundle_et.properties +6 -2
  101. package/src/sap/fe/templates/messagebundle_fi.properties +6 -2
  102. package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
  103. package/src/sap/fe/templates/messagebundle_fr_CA.properties +6 -2
  104. package/src/sap/fe/templates/messagebundle_hi.properties +6 -2
  105. package/src/sap/fe/templates/messagebundle_hr.properties +6 -2
  106. package/src/sap/fe/templates/messagebundle_hu.properties +6 -2
  107. package/src/sap/fe/templates/messagebundle_id.properties +6 -2
  108. package/src/sap/fe/templates/messagebundle_it.properties +6 -2
  109. package/src/sap/fe/templates/messagebundle_iw.properties +6 -2
  110. package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
  111. package/src/sap/fe/templates/messagebundle_kk.properties +6 -2
  112. package/src/sap/fe/templates/messagebundle_ko.properties +6 -2
  113. package/src/sap/fe/templates/messagebundle_lt.properties +6 -2
  114. package/src/sap/fe/templates/messagebundle_lv.properties +6 -2
  115. package/src/sap/fe/templates/messagebundle_ms.properties +6 -2
  116. package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
  117. package/src/sap/fe/templates/messagebundle_no.properties +6 -2
  118. package/src/sap/fe/templates/messagebundle_pl.properties +6 -2
  119. package/src/sap/fe/templates/messagebundle_pt.properties +6 -2
  120. package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -2
  121. package/src/sap/fe/templates/messagebundle_ro.properties +6 -2
  122. package/src/sap/fe/templates/messagebundle_ru.properties +6 -2
  123. package/src/sap/fe/templates/messagebundle_sh.properties +6 -2
  124. package/src/sap/fe/templates/messagebundle_sk.properties +6 -2
  125. package/src/sap/fe/templates/messagebundle_sl.properties +6 -2
  126. package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
  127. package/src/sap/fe/templates/messagebundle_th.properties +6 -2
  128. package/src/sap/fe/templates/messagebundle_tr.properties +6 -2
  129. package/src/sap/fe/templates/messagebundle_uk.properties +6 -2
  130. package/src/sap/fe/templates/messagebundle_vi.properties +6 -2
  131. package/src/sap/fe/templates/messagebundle_zh_CN.properties +6 -2
  132. package/src/sap/fe/templates/messagebundle_zh_TW.properties +6 -2
@@ -1,1085 +1,1115 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/table/Utils", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/ui/core/Core", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/fl/write/api/ControlPersonalizationWriteAPI", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, CommonUtils, EditFlow, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, TableUtils, ExtensionAPI, EditFlowOverrides, TableScroller, Core, OverrideExecution, Device, ControlPersonalizationWriteAPI, StateUtil, hasher, IntentBasedNavigationOverride, ShareOverrides, ViewStateOverrides) {
6
+ "use strict";
6
7
 
7
- sap.ui.define(
8
- [
9
- "sap/fe/core/PageController",
10
- "sap/fe/core/controllerextensions/SideEffects",
11
- "sap/fe/core/controllerextensions/EditFlow",
12
- "sap/base/Log",
13
- "sap/base/util/ObjectPath",
14
- "sap/fe/core/CommonUtils",
15
- "sap/ui/mdc/p13n/StateUtil",
16
- "sap/fe/macros/table/Utils",
17
- "sap/fe/core/controllerextensions/InternalRouting",
18
- "sap/ui/Device",
19
- "sap/fe/core/controllerextensions/IntentBasedNavigation",
20
- "./overrides/IntentBasedNavigation",
21
- "sap/fe/core/controllerextensions/InternalIntentBasedNavigation",
22
- "sap/fe/macros/chart/ChartRuntime",
23
- "sap/fe/templates/ListReport/ExtensionAPI",
24
- "sap/fe/macros/filter/FilterUtils",
25
- "sap/fe/macros/chart/ChartUtils",
26
- "sap/fe/macros/DelegateUtil",
27
- "sap/ui/core/mvc/OverrideExecution",
28
- "sap/fe/core/controllerextensions/ViewState",
29
- "./overrides/ViewState",
30
- "sap/fe/templates/RootContainer/overrides/EditFlow",
31
- "sap/fe/core/helpers/EditState",
32
- "sap/fe/core/library",
33
- "sap/fe/core/controllerextensions/Share",
34
- "./overrides/Share",
35
- "sap/fe/macros/CommonHelper",
36
- "sap/fe/core/controllerextensions/KPIManagement",
37
- "sap/fe/templates/TableScroller",
38
- "sap/fe/core/controllerextensions/Placeholder",
39
- "sap/ui/fl/write/api/ControlPersonalizationWriteAPI",
40
- "sap/fe/core/controllerextensions/MassEdit"
41
- ],
42
- function(
43
- PageController,
44
- SideEffects,
45
- EditFlow,
46
- Log,
47
- ObjectPath,
48
- CommonUtils,
49
- StateUtil,
50
- TableUtils,
51
- InternalRouting,
52
- Device,
53
- IntentBasedNavigation,
54
- IntentBasedNavigationOverride,
55
- InternalIntentBasedNavigation,
56
- ChartRuntime,
57
- ExtensionAPI,
58
- FilterUtils,
59
- ChartUtils,
60
- DelegateUtil,
61
- OverrideExecution,
62
- ViewState,
63
- ViewStateOverrides,
64
- EditFlowOverrides,
65
- EditState,
66
- CoreLibrary,
67
- Share,
68
- ShareOverrides,
69
- CommonHelper,
70
- KPIManagement,
71
- TableScroller,
72
- Placeholder,
73
- ControlPersonalizationWriteAPI,
74
- MassEdit
75
- ) {
76
- "use strict";
77
- var TemplateContentView = CoreLibrary.TemplateContentView,
78
- InitialLoadMode = CoreLibrary.InitialLoadMode;
79
-
80
- return PageController.extend("sap.fe.templates.ListReport.ListReportController", {
81
- metadata: {
82
- methods: {
83
- getExtensionAPI: {
84
- "public": true,
85
- "final": true
86
- },
87
- onPageReady: {
88
- "public": false,
89
- "final": false,
90
- overrideExecution: OverrideExecution.After
91
- },
92
- onViewNeedsRefresh: {
93
- "public": true,
94
- "final": false,
95
- overrideExecution: OverrideExecution.After
96
- },
97
- onPendingFilters: {
98
- "public": true,
99
- "final": false,
100
- overrideExecution: OverrideExecution.After
101
- }
102
- }
103
- },
104
- _routing: InternalRouting.override({
105
- onAfterBinding: function(oContext, mParameters) {
106
- this.getView()
107
- .getController()
108
- ._onAfterBinding(oContext, mParameters);
109
- }
110
- }),
111
- _intentBasedNavigation: InternalIntentBasedNavigation.override({
112
- getEntitySet: function() {
113
- return this.base.getCurrentEntitySet();
114
- }
115
- }),
116
- sideEffects: SideEffects,
117
-
118
- intentBasedNavigation: IntentBasedNavigation.override(IntentBasedNavigationOverride),
119
- share: Share.override(ShareOverrides),
120
- editFlow: EditFlow.override(EditFlowOverrides),
121
- viewState: ViewState.override(ViewStateOverrides),
122
- kpiManagement: KPIManagement,
123
- placeholder: Placeholder,
124
- massEdit: MassEdit,
125
-
126
- getExtensionAPI: function() {
127
- if (!this.extensionAPI) {
128
- this.extensionAPI = new ExtensionAPI(this);
129
- }
130
- return this.extensionAPI;
131
- },
132
-
133
- onInit: function() {
134
- PageController.prototype.onInit.apply(this);
135
- var that = this;
136
- var aControls = this._getControls();
137
- var oInternalModelContext = this.getView().getBindingContext("internal");
138
- if (that._isMultiMode()) {
139
- var oMultiModeTab = that._getMultiModeControl();
140
- oInternalModelContext.setProperty("tabs", {
141
- selected: oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey()
142
- });
143
- aControls.forEach(function(oControl) {
144
- var oUpdateCounts = function() {
145
- that._updateCounts();
146
- };
147
- CommonUtils.addEventToBindingInfo(oControl, "dataRequested", oUpdateCounts);
148
- });
149
- }
150
- //TODO: This is only a temporary approach and will be removed once app state behaviour is finalized.
151
-
152
- oInternalModelContext.setProperty("hasPendingFilters", true);
153
- oInternalModelContext.setProperty("appliedFilters", "");
154
- oInternalModelContext.setProperty("hideDraftInfo", false);
155
- oInternalModelContext.setProperty("uom", {});
156
- oInternalModelContext.setProperty("scalefactor", {});
157
- oInternalModelContext.setProperty("scalefactorNumber", {});
158
- oInternalModelContext.setProperty("currency", {});
159
-
160
- if (this._hasMultiVisualizations()) {
161
- var alpContentView = this._getDefaultPath();
162
- if (!Device.system.desktop && alpContentView === TemplateContentView.Hybrid) {
163
- alpContentView = TemplateContentView.Chart;
164
- }
165
- oInternalModelContext.setProperty("alpContentView", alpContentView);
166
- }
167
-
168
- // Store conditions from filter bar
169
- // this is later used before navigation to get conditions applied on the filter bar
170
- this.filterBarConditions = {};
171
-
172
- // As AppStateHandler.applyAppState triggers a navigation we want to make sure it will
173
- // happen after the routeMatch event has been processed (otherwise the router gets broken)
174
- this.getAppComponent()
175
- .getRouterProxy()
176
- .waitForRouteMatchBeforeNavigation();
177
-
178
- this._isMultiMode() && this._updateMultiControlHiddenStatus();
179
- },
180
- onExit: function() {
181
- delete this._sEntitySet;
182
- delete this.filterBarConditions;
183
- delete this._oListReportControl;
184
- delete this._bMultiMode;
185
- this.extensionAPI && this.extensionAPI.destroy();
186
- delete this.extensionAPI;
187
- },
188
-
189
- _onAfterBinding: function() {
190
- var aTables = this._getControls("table");
191
- var that = this;
192
- if (EditState.isEditStateDirty()) {
193
- var oTableBinding = this._getTableBinding();
194
- if (oTableBinding) {
195
- if (!this.sUpdateTimer) {
196
- this.sUpdateTimer = setTimeout(function() {
197
- oTableBinding.refresh();
198
- if (that._isMultiMode()) {
199
- that._setCountsOutDated();
200
- that._updateCounts();
201
- }
202
- delete that.sUpdateTimer;
203
- }, 0);
204
- }
205
-
206
- // Update action enablement and visibility upon table data update.
207
- var fnUpdateTableActions = function() {
208
- that._updateTableActions(aTables);
209
- oTableBinding.detachDataReceived(fnUpdateTableActions);
210
- };
211
- oTableBinding.attachDataReceived(fnUpdateTableActions);
212
- }
213
- EditState.setEditStateProcessed();
214
- }
215
-
216
- if (!this.sUpdateTimer) {
217
- this._updateTableActions(aTables);
218
- }
219
-
220
- this.pageReady.waitFor(
221
- this.getAppComponent()
222
- .getAppStateHandler()
223
- .applyAppState()
224
- );
225
- },
226
-
227
- onBeforeRendering: function() {
228
- PageController.prototype.onBeforeRendering.apply(this);
229
- },
230
-
231
- onAfterRendering: function(oEvent) {
232
- var that = this;
233
- this.getView()
234
- .getModel("sap.fe.i18n")
235
- .getResourceBundle()
236
- .then(function(response) {
237
- that.oResourceBundle = response;
238
- var aControls = that._getControls();
239
- var sEntitySet = that.getView().getViewData().entitySet;
240
- var sText = CommonUtils.getTranslatedText(
241
- "T_OP_TABLE_AND_CHART_NO_DATA_TEXT",
242
- that.oResourceBundle,
243
- undefined,
244
- sEntitySet
245
- );
246
- aControls.forEach(function(oControl) {
247
- oControl.setNoDataText(sText);
248
- });
249
- })
250
- .catch(function(oError) {
251
- Log.error("Error while retrieving the resource bundle", oError);
252
- });
253
- },
254
- onPageReady: function(mParameters) {
255
- // Enabling mandatory filter fields message dialog and focusing on them
256
- if (mParameters.forceFocus) {
257
- var oFilterBar = this._getFilterBarControl();
258
-
259
- if (oFilterBar && !oFilterBar.getShowMessages()) {
260
- oFilterBar.setShowMessages(true);
261
- oFilterBar.setFocusOnFirstErroneousField();
262
- }
263
- }
264
-
265
- // Remove the handler on back navigation that displays Draft confirmation
266
- this.getAppComponent()
267
- .getShellServices()
268
- .setBackNavigation(undefined);
269
- },
270
-
271
- /**
272
- * Method called when the content of a list report view needs to be refreshed.
273
- * This happens either when there is a change on the FilterBar and the search is triggered,
274
- * or when a tab with custom content is selected.
275
- * This method can be overwritten by the controller extension in case of customization.
276
- *
277
- * @param {map} mParameters Map containing the filter conditions of the FilterBar, the currentTabID
278
- * and the view refresh cause (tabChanged or search).
279
- * The map looks like this:
280
- * <code><pre>
281
- * {
282
- * filterConditions: {
283
- * Country: [
284
- * {
285
- * operator: "EQ"
286
- * validated: "NotValidated"
287
- * values: ["Germany", ...]
288
- * },
289
- * ...
290
- * ]
291
- * ...
292
- * },
293
- * currentTabId: "fe::CustomTab::tab1",
294
- * refreshCause: "tabChanged" | "search"
295
- * }
296
- * </pre></code>
297
- *
298
- * @public
299
- */
300
- onViewNeedsRefresh: function(mParameters) {},
301
-
302
- /**
303
- * Method called when a filter or search value has been changed in the FilterBar,
304
- * but has not been validated yet by the end user (with the 'Go' or 'Search' button).
305
- * Typically, the content of the current tab is greyed out until the filters are validated.
306
- * This method can be overwritten by the controller extension in case of customization.
307
- *
308
- * @public
309
- */
310
- onPendingFilters: function() {},
311
- getCurrentEntitySet: function() {
312
- if (!this._sEntitySet) {
313
- var oDisplayedControl = (this._isMultiMode() && this._getCurrentControl()) || this._getTable();
314
- this._sEntitySet = oDisplayedControl.data("targetCollectionPath").slice(1);
315
- }
316
- return this._sEntitySet;
317
- },
318
-
319
- /**
320
- * This method initiates the update of the enabled state of the DataFieldForAction and the visible state of the DataFieldForIBN buttons.
321
- * @param aTables Array of tables in the list report
322
- * @private
323
- */
324
- _updateTableActions: function(aTables) {
325
- var aIBNActions = [];
326
- aTables.forEach(function(oTable) {
327
- aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
328
- // Update 'enabled' property of DataFieldForAction buttons on table toolbar
329
- // The same is also performed on Table selectionChange event
330
- var oInternalModelContext = oTable.getBindingContext("internal"),
331
- oActionOperationAvailableMap = JSON.parse(
332
- CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))
333
- ),
334
- aSelectedContexts = oTable.getSelectedContexts();
335
-
336
- CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
337
- });
338
- CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
339
- },
340
-
341
- /**
342
- * This method scrolls to a specific row on all the available tables.
343
- *
344
- * @function
345
- * @name sap.fe.templates.ListReport.ListReportController.controller#_scrollTablesToRow
346
- * @param {string} sRowPath The path of the table row context to be scrolled to
347
- */
348
- _scrollTablesToRow: function(sRowPath) {
349
- this._getControls("table").forEach(function(oTable) {
350
- TableScroller.scrollTableToRow(oTable, sRowPath);
351
- });
352
- },
353
- _getPageTitleInformation: function() {
354
- var oTitleInfo = { title: "", subtitle: "", intent: "", icon: "" };
355
- oTitleInfo.title = this.getView()
356
- .getContent()[0]
357
- .data().ListReportTitle;
358
- oTitleInfo.subtitle = this.getView()
359
- .getContent()[0]
360
- .data().ListReportSubtitle;
361
- return oTitleInfo;
362
- },
363
- _getFilterBarControl: function() {
364
- return this.getView().byId(this._getFilterBarControlId());
365
- },
366
- _getSegmentedButton: function(sControl) {
367
- return this.getView().byId(this._getSegmentedButtonId(sControl));
368
- },
369
- _getSegmentedButtonId: function(sControl) {
370
- if (sControl === "Chart") {
371
- return this._getChart().data("segmentedButtonId");
372
- } else {
373
- return this._getTable().data("segmentedButtonId");
374
- }
375
- },
376
- _getFilterBarControlId: function() {
377
- return this.getView()
378
- .getContent()[0]
379
- .data("filterBarId");
380
- },
381
- _getChartControlId: function() {
382
- return this.getView()
383
- .getContent()[0]
384
- .data("singleChartId");
385
- },
386
-
387
- getChartControl: function() {
388
- return this.getView().byId(this._getChartControlId());
389
- },
390
- _getVisualFilterBarControl: function() {
391
- return this.getView().byId(this._getVisualFilterBarControlId());
392
- },
393
- _getVisualFilterBarControlId: function() {
394
- return this.getView()
395
- .getContent()[0]
396
- .data("visualFilterBarId");
397
- },
398
- _getMultiModeControl: function() {
399
- return this.getView().byId("fe::TabMultipleMode");
400
- },
401
- _getTableControlId: function() {
402
- return this.getView()
403
- .getContent()[0]
404
- .data("singleTableId");
405
- },
406
- _getCurrentControl: function() {
407
- if (!this._oListReportControl) {
408
- var oMultiModeTab = this._getMultiModeControl();
409
- this._oListReportControl = this.getView().byId(oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey());
410
- }
411
- return this._oListReportControl;
412
- },
413
- _getTable: function() {
414
- if (this._isMultiMode()) {
415
- var oControl = this._getCurrentControl();
416
- return oControl && oControl.isA("sap.ui.mdc.Table") ? oControl : undefined;
417
- }
418
- return this.getView().byId(this._getTableControlId());
419
- },
420
- _getChart: function() {
421
- return this.getView().byId(this._getChartControlId());
422
- },
423
- _getTableBinding: function(sTableId) {
424
- var oTableControl = sTableId ? this.getView().byId(sTableId) : this._getTable(),
425
- oBinding = oTableControl && oTableControl._getRowBinding();
426
-
427
- return oBinding;
428
- },
429
- _getControls: function(sKey) {
430
- var that = this;
431
- if (this._isMultiMode()) {
432
- var aControls = [];
433
- var oTabMultiMode = this._getMultiModeControl();
434
- oTabMultiMode.getItems().forEach(function(oItem) {
435
- var oControl = that.getView().byId(oItem.getKey());
436
- if (sKey) {
437
- if (oItem.getKey().indexOf("fe::" + sKey) > -1) {
438
- oControl && aControls.push(oControl);
439
- }
440
- } else {
441
- oControl && aControls.push(oControl);
442
- }
443
- });
444
- return aControls;
445
- } else if (sKey === "Chart") {
446
- var oChart = this._getChart();
447
- return oChart ? [oChart] : [];
448
- } else {
449
- var oTable = this._getTable();
450
- return oTable ? [oTable] : [];
451
- }
452
- },
453
- _getDefaultPath: function() {
454
- var defaultPath = this.getView()
455
- .getContent()[0]
456
- .data("defaultPath");
457
- switch (defaultPath) {
458
- case "primary":
459
- return TemplateContentView.Chart;
460
- case "secondary":
461
- return TemplateContentView.Table;
462
- case "both":
463
- default:
464
- return TemplateContentView.Hybrid;
465
- }
466
- },
467
- /**
468
- * Method to know if ListReport is configured with Multiple Table mode.
469
- *
470
- * @function
471
- * @name _isMultiMode
472
- * @returns {boolean} Is Multiple Table mode set?
473
- */
474
- _isMultiMode: function() {
475
- if (!this._oListReportControl) {
476
- this._bMultiMode = !!this._getMultiModeControl();
477
- }
478
- return this._bMultiMode;
479
- },
480
- /**
481
- * Method to know if ListReport is configured with Multiple EntitySets.
482
- *
483
- * @function
484
- * @name _isMultiEntitySets
485
- * @returns {boolean} Is Multiple EntitySets configuration?
486
- */
487
- _isMultiEntitySets: function() {
488
- return (
489
- this.getView()
490
- .getContent()[0]
491
- .data("isMultiEntitySets") === "true"
492
- );
493
- },
494
- _hasMultiVisualizations: function() {
495
- return (
496
- this.getView()
497
- .getContent()[0]
498
- .data("hasMultiVisualizations") === "true"
499
- );
500
- },
501
- _setShareModel: function() {
502
- // TODO: deactivated for now - currently there is no _templPriv anymore, to be discussed
503
- // this method is currently not called anymore from the init method
504
-
505
- var fnGetUser = ObjectPath.get("sap.ushell.Container.getUser");
506
- //var oManifest = this.getOwnerComponent().getAppComponent().getMetadata().getManifestEntry("sap.ui");
507
- //var sBookmarkIcon = (oManifest && oManifest.icons && oManifest.icons.icon) || "";
508
-
509
- //shareModel: Holds all the sharing relevant information and info used in XML view
510
- var oShareInfo = {
511
- bookmarkTitle: document.title, //To name the bookmark according to the app title.
512
- bookmarkCustomUrl: function() {
513
- var sHash = window.hasher.getHash();
514
- return sHash ? "#" + sHash : window.location.href;
515
- },
516
- /*
517
- To be activated once the FLP shows the count - see comment above
518
- bookmarkServiceUrl: function() {
519
- //var oTable = oTable.getInnerTable(); oTable is already the sap.fe table (but not the inner one)
520
- // we should use table.getListBindingInfo instead of the binding
521
- var oBinding = oTable.getBinding("rows") || oTable.getBinding("items");
522
- return oBinding ? fnGetDownloadUrl(oBinding) : "";
523
- },*/
524
- isShareInJamActive: !!fnGetUser && fnGetUser().isJamActive()
525
- };
526
-
527
- var oTemplatePrivateModel = this.getOwnerComponent().getModel("_templPriv");
528
- oTemplatePrivateModel.setProperty("/listReport/share", oShareInfo);
529
- },
530
-
531
- /**
532
- * Hidden tables must be marked as hidden to avoid sending
533
- * requests when FilterBar is changed or LR is initialized
534
- * Best workflow would be to suspend table binding but
535
- * if the user switch quickly between tabs the batch response of previous
536
- * is received when previous tab is already disabled (binding is suspended) and
537
- * generates error.
538
- * A temporary solution (if we find better workflow) is to set a customData and don't trigger
539
- * rebindTable if this customData is set to true.
540
- */
541
- _updateMultiControlHiddenStatus: function() {
542
- var oDisplayedControl = this._getCurrentControl();
543
- if (this._isMultiMode() && oDisplayedControl) {
544
- var sDisplayControlId = oDisplayedControl.getId();
545
- var aControls = this._getControls();
546
- aControls.forEach(function(oControl) {
547
- var sControlId = oControl.getId();
548
- oControl.data("controlHidden", sControlId !== sDisplayControlId);
549
- });
550
- }
551
- },
552
- /**
553
- * Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the multiple table scenario).
554
- *
555
- * @param {sap.ui.model.context} oInternalModelContext The internal model context
556
- * @param {sap.ui.mdc.FilterBar} oFilterBar MDC filter bar
557
- */
558
- _updateMultiTabNotApplicableFields: function(oInternalModelContext, oFilterBar) {
559
- var that = this;
560
- var mCache = {};
561
- var ignoredFields = {},
562
- ignoredFieldsTitle = {},
563
- aTables = this._getControls("table"),
564
- aCharts = this._getControls("Chart");
565
- aTables.forEach(function(oTable) {
566
- var sTableEntityPath = oTable.data("targetCollectionPath"),
567
- sTableEntitySet = sTableEntityPath.slice(1),
568
- sTabId = oTable
569
- .getParent()
570
- .getParent()
571
- .getKey(),
572
- sTabTitle = oTable
573
- .getParent()
574
- .getParent()
575
- .getText(),
576
- sCacheKey = sTableEntitySet + (oTable.data("enableAnalytics") === "true" ? "Analytical" : "Regular");
577
- if (!mCache[sCacheKey]) {
578
- mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oTable);
579
- }
580
- ignoredFields[sTabId] = mCache[sCacheKey];
581
- ignoredFieldsTitle[sTabId] = that.formatters.setTabMessageStrip.call(that, mCache[sCacheKey], sTabTitle);
582
- });
583
- aCharts.forEach(function(oChart) {
584
- var sChartEntityPath = oChart.data("targetCollectionPath"),
585
- sChartEntitySet = sChartEntityPath.slice(1),
586
- sTabId = oChart
587
- .getParent()
588
- .getParent()
589
- .getKey(),
590
- sTabTitle = oChart
591
- .getParent()
592
- .getParent()
593
- .getText(),
594
- sCacheKey = sChartEntitySet + "Chart";
595
- if (!mCache[sCacheKey]) {
596
- mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
597
- }
598
- ignoredFields[sTabId] = mCache[sCacheKey];
599
- ignoredFieldsTitle[sTabId] = that.formatters.setTabMessageStrip.call(that, mCache[sCacheKey], sTabTitle);
600
- });
601
- oInternalModelContext.setProperty("tabs/ignoredFields", ignoredFields);
602
- oInternalModelContext.setProperty("tabs/ignoredFieldsTitle", ignoredFieldsTitle);
603
- },
604
- /**
605
- * Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the ALP scenario).
606
- *
607
- * @param {sap.ui.model.context} oInternalModelContext The internal model context
608
- * @param {sap.ui.mdc.FilterBar} oFilterBar MDC filter bar
609
- */
610
- _updateALPNotApplicableFields: function(oInternalModelContext, oFilterBar) {
611
- var mCache = {};
612
- var ignoredFields = {},
613
- aTables = this._getControls("table"),
614
- aCharts = this._getControls("Chart");
615
-
616
- if (!aTables.length || !aCharts.length) {
617
- // If there's not a table and a chart, we're not in the ALP case
618
- return;
619
- }
620
-
621
- // For the moment, there's nothing for tables...
622
- aCharts.forEach(function(oChart) {
623
- var sChartEntityPath = oChart.data("targetCollectionPath"),
624
- sChartEntitySet = sChartEntityPath.slice(1),
625
- sCacheKey = sChartEntitySet + "Chart";
626
- if (!mCache[sCacheKey]) {
627
- mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
628
- }
629
- ignoredFields[sCacheKey] = mCache[sCacheKey];
630
- });
631
- oInternalModelContext.setProperty("controls/ignoredFields", ignoredFields);
632
- },
633
- _updateMultiModeSelectedControl: function() {
634
- this._sEntitySet = undefined;
635
- this._oListReportControl = undefined;
636
- this._getCurrentControl();
637
- },
638
- _updateCounts: function() {
639
- this._updateMultiModeCounts();
640
- },
641
- /**
642
- * Method to determine if a tab from the list report is a custom tab.
643
- *
644
- * @function
645
- * @name _isCustomTab
646
- * @returns {boolean} Determines if the tab is a custom tab.
647
- */
648
- _isCustomTab: function() {
649
- var oMultiModeControl = this._getMultiModeControl();
650
- return oMultiModeControl && oMultiModeControl.getSelectedKey().indexOf("::CustomTab::") > -1;
651
- },
652
- _setCountsOutDated: function() {
653
- var oMultiModeControl = this._getMultiModeControl();
654
- if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true") {
655
- var aItems = oMultiModeControl.getItems();
656
- aItems.forEach(function(oItem) {
657
- if (!oItem.getKey().indexOf("fe::Chart") > -1) {
658
- oItem.data("outdatedCounts", true);
659
- }
660
- });
661
- }
662
- },
663
- _updateMultiModeCounts: function() {
664
- var that = this;
665
- var aBindingPromises = [];
666
- var oMultiModeControl = this._getMultiModeControl();
667
- if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true" && !this._isCustomTab()) {
668
- var oDisplayedControl = this._getCurrentControl();
669
- var sDisplayedControlId = oDisplayedControl.getId();
670
- var aCompliantTabs = [];
671
- var aItems = oMultiModeControl.getItems();
672
- aItems.forEach(function(oItem) {
673
- var oControl = that.getView().byId(oItem.getKey());
674
- if (
675
- oControl &&
676
- !oControl.isA("sap.ui.mdc.Chart") &&
677
- (oItem.data("outdatedCounts") || oControl.getId() === sDisplayedControlId)
678
- ) {
679
- aCompliantTabs.push({
680
- control: oControl,
681
- item: oItem
682
- });
683
- }
684
- });
685
-
686
- aBindingPromises = aCompliantTabs.map(function(mTab) {
687
- mTab.item.setCount("...");
688
- var oControl = mTab.control;
689
- var oFilterInfos = TableUtils.getFiltersInfoForSV(oControl, mTab.item.data("selectionVariant"));
690
- return TableUtils.getListBindingForCount(oControl, that.getView().getBindingContext(), {
691
- batchGroupId: oControl.getId() === sDisplayedControlId ? oControl.data("batchGroupId") : "$auto",
692
- additionalFilters: oFilterInfos.filters
693
- });
694
- });
695
-
696
- Promise.all(aBindingPromises)
697
- .then(function(aCounts) {
698
- for (var k in aCounts) {
699
- var oItem = aCompliantTabs[k].item;
700
- oItem.setCount(TableUtils.getCountFormatted(aCounts[k]));
701
- oItem.data("outdatedCounts", false);
702
- }
703
- })
704
- .catch(function(oError) {
705
- Log.error("Error while retrieving the values for the icon tab bar", oError);
706
- });
707
- }
708
- },
709
- _isFilterBarHidden: function() {
710
- return this.getView().getViewData().hideFilterBar;
711
- },
712
- _shouldAutoTriggerSearch: function(oVM) {
713
- if (
714
- this.getView().getViewData().initialLoad === InitialLoadMode.Auto &&
715
- (!oVM || oVM.getStandardVariantKey() === oVM.getCurrentVariantKey())
716
- ) {
717
- var oFilterBar = this._getFilterBarControl();
718
- if (oFilterBar) {
719
- var oConditions = oFilterBar.getConditions();
720
- for (var sKey in oConditions) {
721
- // ignore filters starting with $ (e.g. $search, $editState)
722
- if (!sKey.startsWith("$") && Array.isArray(oConditions[sKey]) && oConditions[sKey].length) {
723
- return true;
724
- }
725
- }
726
- }
727
- }
728
-
729
- return false;
730
- },
731
- _updateTable: function(oTable) {
732
- if (!oTable.isTableBound() || this.hasPendingChartChanges) {
733
- oTable.rebind();
734
- this.hasPendingChartChanges = false;
735
- }
736
- },
737
- _updateChart: function(oChart) {
738
- var oInnerChart = oChart.getControlDelegate()._getChart(oChart);
739
- if (!(oInnerChart && oInnerChart.isBound("data")) || this.hasPendingTableChanges) {
740
- oChart.getControlDelegate().rebind(oChart, oInnerChart.getBindingInfo("data"));
741
- this.hasPendingTableChanges = false;
742
- }
743
- },
744
- handlers: {
745
- onTabMultiModeChange: function(oEvent) {
746
- this._updateMultiModeSelectedControl();
747
- this._updateMultiControlHiddenStatus();
748
-
749
- var oFilterBar = this._getFilterBarControl();
750
- var oInternalModelContext = this.getView().getBindingContext("internal");
751
- var oDisplayedControl = this._getCurrentControl();
752
- var oMultiModeControl = this._getMultiModeControl();
753
- var sSelectedKey = oMultiModeControl.getSelectedKey();
754
- var sPreviousSelectedKey = oEvent && oEvent.mParameters ? oEvent.mParameters.previousKey : undefined;
755
-
756
- oInternalModelContext.setProperty("tabs/selected", sSelectedKey);
757
- if (oInternalModelContext.getProperty("hasPendingFilters") !== true) {
758
- // No pending filters into FilterBar
759
- if (oFilterBar && this._isCustomTab()) {
760
- var oFilterConditions = oFilterBar.getFilterConditions();
761
- this.onViewNeedsRefresh({
762
- filterConditions: oFilterConditions,
763
- currentTabId: sSelectedKey,
764
- refreshCause: "tabChanged"
765
- });
766
- } else if (
767
- !oDisplayedControl.isA("sap.ui.mdc.Chart") &&
768
- (!oDisplayedControl.getRowBinding() || // first time the tab/table is displayed
769
- oDisplayedControl.data("outdatedRows") === true)
770
- ) {
771
- // Search has been triggered on a different tab {}
772
- oDisplayedControl.rebind();
773
- oDisplayedControl.data("outdatedRows", false);
774
- } else if (
775
- oDisplayedControl.isA("sap.ui.mdc.Chart") &&
776
- (!oDisplayedControl
777
- .getControlDelegate()
778
- ._getChart(oDisplayedControl)
779
- .getBinding("data") || // first time the tab/chart is displayed
780
- oDisplayedControl.data("outdatedRows") === true)
781
- ) {
782
- var oInnerChart = oDisplayedControl.getControlDelegate()._getChart(oDisplayedControl);
783
- oDisplayedControl.getControlDelegate().rebind(oDisplayedControl, oInnerChart.getBindingInfo("data"));
784
- oDisplayedControl.data("outdatedRows", false);
785
- }
786
- }
787
-
788
- if (oEvent && oEvent.mParameters && sPreviousSelectedKey !== oEvent.mParameters.selectedKey) {
789
- ControlPersonalizationWriteAPI.add({
790
- changes: [
791
- {
792
- changeSpecificData: {
793
- changeType: "selectIconTabBarFilter",
794
- content: {
795
- selectedKey: sSelectedKey,
796
- previousSelectedKey: sPreviousSelectedKey
797
- }
798
- },
799
- selectorElement: oMultiModeControl
800
- }
801
- ]
802
- });
803
- }
804
- this.getExtensionAPI().updateAppState();
805
- },
806
- onFiltersChanged: function(oEvent) {
807
- var oFilterBar = this._getFilterBarControl();
808
- if (oFilterBar) {
809
- var oInternalModelContext = this.getView().getBindingContext("internal");
810
- // Pending filters into FilterBar to be used for custom views
811
- this.onPendingFilters();
812
- oInternalModelContext.setProperty("appliedFilters", oFilterBar.getAssignedFiltersText().filtersText);
813
- if (oEvent.getParameter("conditionsBased")) {
814
- oInternalModelContext.setProperty("hasPendingFilters", true);
815
- }
816
- }
817
- },
818
- onVariantSelected: function(oEvent) {
819
- var that = this,
820
- oVM = oEvent.getSource();
821
- // setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
822
- setTimeout(function() {
823
- if (that._isMultiMode()) {
824
- that.handlers.onTabMultiModeChange.apply(that);
825
- }
826
- if (that._shouldAutoTriggerSearch(oVM)) {
827
- // the app state will be updated via onSearch handler
828
- return that._getFilterBarControl().triggerSearch();
829
- } else {
830
- that.getExtensionAPI().updateAppState();
831
- }
832
- }, 0);
833
- },
834
- onVariantSaved: function(oEvent) {
835
- var that = this;
836
- //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save!!!
837
- setTimeout(function() {
838
- that.getExtensionAPI().updateAppState();
839
- }, 1000);
840
- },
841
- onSearch: function(oEvent) {
842
- var that = this;
843
- var oFilterBar = this._getFilterBarControl();
844
- var oInternalModelContext = this.getView().getBindingContext("internal");
845
- var oMdcChart = this.getChartControl();
846
- var bHideDraft = FilterUtils.getEditStateIsHideDraft(oFilterBar.getConditions());
847
- oInternalModelContext.setProperty("hasPendingFilters", false);
848
- oInternalModelContext.setProperty("hideDraftInfo", bHideDraft);
849
- if (this._isMultiMode()) {
850
- var aControls = this._getControls(),
851
- oMultiModeControl = this._getMultiModeControl();
852
- this._setCountsOutDated();
853
- if (!this._isCustomTab()) {
854
- var sDisplayedControlId = this._getCurrentControl().getId();
855
- this._updateMultiTabNotApplicableFields(oInternalModelContext, oFilterBar);
856
- // This should be done outside the search event handler of the filter bar.
857
- // The same logic is required when filter bar is hidden and multiple tables exist on the LR.
858
- // This is currently done in ListReport/overrides/ViewState.js#onAfterStateApplied()
859
- aControls.forEach(function(oControl) {
860
- oControl.data("outdatedRows", oControl.getId() !== sDisplayedControlId);
861
- });
862
- } else {
863
- var oFilterConditions = oFilterBar.getFilterConditions();
864
- this.onViewNeedsRefresh({
865
- filterConditions: oFilterConditions,
866
- currentTabId: oMultiModeControl.getSelectedKey(),
867
- refreshCause: "search"
868
- });
869
- }
870
- } else {
871
- this._updateALPNotApplicableFields(oInternalModelContext, oFilterBar);
872
- }
873
- if (oMdcChart) {
874
- // disable bound actions TODO: this clears everything for the chart?
875
- oMdcChart.getBindingContext("internal").setProperty("", {});
876
-
877
- var oPageInternalModelContext = oMdcChart.getBindingContext("pageInternal");
878
- var sTemplateContentView = oPageInternalModelContext.getProperty(
879
- oPageInternalModelContext.getPath() + "/alpContentView"
880
- );
881
- if (sTemplateContentView === TemplateContentView.Chart) {
882
- this.hasPendingChartChanges = true;
883
- }
884
- if (sTemplateContentView === TemplateContentView.Table) {
885
- this.hasPendingTableChanges = true;
886
- }
887
- }
888
- // store filter bar conditions to use later while navigation
889
- StateUtil.retrieveExternalState(oFilterBar)
890
- .then(function(oExternalState) {
891
- that.filterBarConditions = oExternalState.filter;
892
- })
893
- .catch(function(oError) {
894
- Log.error("Error while retrieving the external state", oError);
895
- });
896
- if (this.getView().getViewData().liveMode === false) {
897
- this.getExtensionAPI().updateAppState();
898
- }
899
-
900
- if (Device.system.phone) {
901
- var oDynamicPage = this.getView().byId("fe::ListReport");
902
- oDynamicPage.setHeaderExpanded(false);
903
- }
904
- },
905
- /**
906
- * Triggers an outbound navigation when a user chooses the chevron.
907
- *
908
- * @param {object} oController
909
- * @param {string} sOutboundTarget Name of the outbound target (needs to be defined in the manifest)
910
- * @param {sap.ui.model.odata.v4.Context} oContext The context that contains the data for the target app
911
- * @param {string} sCreatePath Create path when the chevron is created.
912
- * @returns {Promise} Promise which is resolved once the navigation is triggered
913
- * @ui5-restricted
914
- * @final
915
- */
916
- onChevronPressNavigateOutBound: function(oController, sOutboundTarget, oContext, sCreatePath) {
917
- return oController._intentBasedNavigation.onChevronPressNavigateOutBound(
918
- oController,
919
- sOutboundTarget,
920
- oContext,
921
- sCreatePath
922
- );
923
- },
924
- onChartSelectionChanged: function(oEvent) {
925
- var oMdcChart = oEvent.getSource().getContent(),
926
- oTable = this._getTable(),
927
- aData = oEvent.getParameter("data"),
928
- oInternalModelContext = this.getView().getBindingContext("internal");
929
- if (aData) {
930
- // update action buttons enablement / disablement
931
- ChartRuntime.fnUpdateChart(oEvent);
932
- // update selections on selection or deselection
933
- ChartUtils.setChartFilters(oMdcChart);
934
- }
935
- var sTemplateContentView = oInternalModelContext.getProperty(oInternalModelContext.getPath() + "/alpContentView");
936
- if (sTemplateContentView === TemplateContentView.Chart) {
937
- this.hasPendingChartChanges = true;
938
- } else {
939
- oTable && oTable.rebind();
940
- this.hasPendingChartChanges = false;
941
- }
942
- },
943
- onSegmentedButtonPressed: function(oEvent) {
944
- var sSelectedKey = oEvent.mParameters.key ? oEvent.mParameters.key : null;
945
- var oInternalModelContext = this.getView().getBindingContext("internal");
946
- oInternalModelContext.setProperty("alpContentView", sSelectedKey);
947
- var oSegmentedButton;
948
- var oChart = this._getChart();
949
- var oTable = this._getTable();
950
- var oSegmentedButtonDelegate = {
951
- onAfterRendering: function() {
952
- var aItems = oSegmentedButton.getItems();
953
- aItems.forEach(function(oItem) {
954
- if (oItem.getKey() === sSelectedKey) {
955
- oItem.focus();
956
- }
957
- });
958
- oSegmentedButton.removeEventDelegate(oSegmentedButtonDelegate);
959
- }
960
- };
961
- oSegmentedButton =
962
- sSelectedKey === TemplateContentView.Table ? this._getSegmentedButton("Table") : this._getSegmentedButton("Chart");
963
- if (oSegmentedButton !== oEvent.getSource()) {
964
- oSegmentedButton.addEventDelegate(oSegmentedButtonDelegate);
965
- }
966
- switch (sSelectedKey) {
967
- case TemplateContentView.Table:
968
- this._updateTable(oTable);
969
- break;
970
- case TemplateContentView.Chart:
971
- this._updateChart(oChart);
972
- break;
973
- case TemplateContentView.Hybrid:
974
- this._updateTable(oTable);
975
- this._updateChart(oChart);
976
- break;
977
- default:
978
- break;
979
- }
980
- this.getExtensionAPI().updateAppState();
981
- },
982
- onFiltersSegmentedButtonPressed: function(oEvent) {
983
- if (oEvent.getParameter("key") === "Compact") {
984
- this._getFilterBarControl().setVisible(true);
985
- this.getView()
986
- .byId(
987
- this.getView()
988
- .getContent()[0]
989
- .data("visualFilterBarId")
990
- )
991
- .setVisible(false);
992
- } else {
993
- this._getFilterBarControl().setVisible(false);
994
- this.getView()
995
- .byId(
996
- this.getView()
997
- .getContent()[0]
998
- .data("visualFilterBarId")
999
- )
1000
- .setVisible(true);
1001
- }
1002
- },
1003
- onStateChanged: function(oEvent) {
1004
- this.getExtensionAPI().updateAppState();
1005
- }
1006
- },
1007
- formatters: {
1008
- /**
1009
- * Method to set the message text for the multiple entity sets when fields in the FilterBar need to be ignored.
1010
- *
1011
- * @param {Array} aIgnoredFields Array of ignored fields in the FilterBar for the current tab (multiple entity sets)
1012
- * @param {string} sTabTitle Tab title
1013
- * @returns {string} Message text
1014
- */
1015
- setTabMessageStrip: function(aIgnoredFields, sTabTitle) {
1016
- var sText = "",
1017
- oFilterBar = this._getFilterBarControl();
1018
- if (oFilterBar && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && sTabTitle) {
1019
- var sFilterBarEntityPath = oFilterBar.data("entityType"),
1020
- oMetaModel = this.getView()
1021
- .getModel()
1022
- .getMetaModel(),
1023
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.templates"),
1024
- aIgnoredLabels = aIgnoredFields.map(function(sProperty) {
1025
- if (sProperty === "$search") {
1026
- var oMacroResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.macros");
1027
- return oMacroResourceBundle ? oMacroResourceBundle.getText("M_FILTERBAR_SEARCH") : "";
1028
- }
1029
- var sLabel = oMetaModel.getObject(
1030
- sFilterBarEntityPath + sProperty + "@com.sap.vocabularies.Common.v1.Label"
1031
- );
1032
- return DelegateUtil.getLocalizedText(sLabel, oFilterBar);
1033
- });
1034
- if (oResourceBundle) {
1035
- var sResource =
1036
- "C_LR_MULTITABLES_" +
1037
- (aIgnoredLabels.length === 1 ? "SINGLE" : "MULTI") +
1038
- "_IGNORED_FILTER_" +
1039
- (Device.system.desktop ? "LARGE" : "SMALL"),
1040
- sLocalizedTableTitle = DelegateUtil.getLocalizedText(sTabTitle, oFilterBar);
1041
- sText = oResourceBundle.getText(sResource, [aIgnoredLabels.join(", "), sLocalizedTableTitle]);
1042
- }
1043
- }
1044
- return sText;
1045
- },
1046
- /**
1047
- * Formatter for the message text for the chart when fields in the FilterBar need to be ignored.
1048
- *
1049
- * @param {Array} aIgnoredFields Array of ignored fields in the FilterBar for the current tab (multiple entity sets)
1050
- * @returns {string} Message text
1051
- */
1052
- setChartMessageStrip: function(aIgnoredFields) {
1053
- var sText = "";
1054
- if (Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0) {
1055
- var oFilterBar = this._getFilterBarControl(),
1056
- sFilterBarEntityPath = oFilterBar.data("entityType"),
1057
- oMetaModel = this.getView()
1058
- .getModel()
1059
- .getMetaModel(),
1060
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.templates"),
1061
- aIgnoredLabels = aIgnoredFields.map(function(sProperty) {
1062
- if (sProperty === "$search") {
1063
- var oMacroResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.macros");
1064
- return oMacroResourceBundle ? oMacroResourceBundle.getText("M_FILTERBAR_SEARCH") : "";
1065
- }
1066
- var sLabel = oMetaModel.getObject(
1067
- sFilterBarEntityPath + sProperty + "@com.sap.vocabularies.Common.v1.Label"
1068
- );
1069
- return DelegateUtil.getLocalizedText(sLabel, oFilterBar);
1070
- });
1071
- if (oResourceBundle) {
1072
- var sResource =
1073
- "C_LR_MULTIVIZ_CHART_" +
1074
- (aIgnoredLabels.length === 1 ? "SINGLE" : "MULTI") +
1075
- "_IGNORED_FILTER_" +
1076
- (Device.system.desktop ? "LARGE" : "SMALL");
1077
- sText = oResourceBundle.getText(sResource, [aIgnoredLabels.join(", ")]);
1078
- }
1079
- }
1080
- return sText;
1081
- }
1082
- }
1083
- });
1084
- }
1085
- );
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
9
+
10
+ var system = Device.system;
11
+ var usingExtension = ClassSupport.usingExtension;
12
+ var publicExtension = ClassSupport.publicExtension;
13
+ var privateExtension = ClassSupport.privateExtension;
14
+ var finalExtension = ClassSupport.finalExtension;
15
+ var extensible = ClassSupport.extensible;
16
+ var defineUI5Class = ClassSupport.defineUI5Class;
17
+
18
+ function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
19
+
20
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
21
+
22
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
23
+
24
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
+
26
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
27
+
28
+ function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
29
+
30
+ var TemplateContentView = CoreLibrary.TemplateContentView,
31
+ InitialLoadMode = CoreLibrary.InitialLoadMode;
32
+ var ListReportController = (_dec = defineUI5Class("sap.fe.templates.ListReport.ListReportController"), _dec2 = usingExtension(InternalRouting.override({
33
+ onAfterBinding: function () {
34
+ this.getView().getController()._onAfterBinding();
35
+ }
36
+ })), _dec3 = usingExtension(InternalIntentBasedNavigation.override({
37
+ getEntitySet: function () {
38
+ return this.base.getCurrentEntitySet();
39
+ }
40
+ })), _dec4 = usingExtension(SideEffects), _dec5 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec6 = usingExtension(Share.override(ShareOverrides)), _dec7 = usingExtension(EditFlow.override(EditFlowOverrides)), _dec8 = usingExtension(ViewState.override(ViewStateOverrides)), _dec9 = usingExtension(KPIManagement), _dec10 = usingExtension(Placeholder), _dec11 = usingExtension(MassEdit), _dec12 = publicExtension(), _dec13 = finalExtension(), _dec14 = privateExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
41
+ _inheritsLoose(ListReportController, _PageController);
42
+
43
+ function ListReportController() {
44
+ var _this;
45
+
46
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
47
+ args[_key] = arguments[_key];
48
+ }
49
+
50
+ _this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
51
+
52
+ _initializerDefineProperty(_this, "_routing", _descriptor, _assertThisInitialized(_this));
53
+
54
+ _initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor2, _assertThisInitialized(_this));
55
+
56
+ _initializerDefineProperty(_this, "sideEffects", _descriptor3, _assertThisInitialized(_this));
57
+
58
+ _initializerDefineProperty(_this, "intentBasedNavigation", _descriptor4, _assertThisInitialized(_this));
59
+
60
+ _initializerDefineProperty(_this, "share", _descriptor5, _assertThisInitialized(_this));
61
+
62
+ _initializerDefineProperty(_this, "editFlow", _descriptor6, _assertThisInitialized(_this));
63
+
64
+ _initializerDefineProperty(_this, "viewState", _descriptor7, _assertThisInitialized(_this));
65
+
66
+ _initializerDefineProperty(_this, "kpiManagement", _descriptor8, _assertThisInitialized(_this));
67
+
68
+ _initializerDefineProperty(_this, "placeholder", _descriptor9, _assertThisInitialized(_this));
69
+
70
+ _initializerDefineProperty(_this, "massEdit", _descriptor10, _assertThisInitialized(_this));
71
+
72
+ _this.handlers = {
73
+ onTabMultiModeChange: function (oEvent) {
74
+ this._updateMultiModeSelectedControl();
75
+
76
+ this._updateMultiControlHiddenStatus();
77
+
78
+ var oFilterBar = this._getFilterBarControl();
79
+
80
+ var oInternalModelContext = this.getView().getBindingContext("internal");
81
+
82
+ var oDisplayedControl = this._getCurrentControl();
83
+
84
+ var oMultiModeControl = this._getMultiModeControl();
85
+
86
+ var sSelectedKey = oMultiModeControl.getSelectedKey();
87
+ var sPreviousSelectedKey = oEvent && oEvent.mParameters ? oEvent.mParameters.previousKey : undefined;
88
+ oInternalModelContext.setProperty("tabs/selected", sSelectedKey);
89
+
90
+ if (oInternalModelContext.getProperty("hasPendingFilters") !== true) {
91
+ // No pending filters into FilterBar
92
+ if (oFilterBar && this._isCustomTab()) {
93
+ var oFilterConditions = oFilterBar.getFilterConditions();
94
+ this.onViewNeedsRefresh({
95
+ filterConditions: oFilterConditions,
96
+ currentTabId: sSelectedKey,
97
+ refreshCause: "tabChanged"
98
+ });
99
+ } else if (!oDisplayedControl.isA("sap.ui.mdc.Chart") && (!oDisplayedControl.getRowBinding() || // first time the tab/table is displayed
100
+ oDisplayedControl.data("outdatedRows") === true)) {
101
+ // Search has been triggered on a different tab {}
102
+ oDisplayedControl.rebind();
103
+ oDisplayedControl.data("outdatedRows", false);
104
+ } else if (oDisplayedControl.isA("sap.ui.mdc.Chart") && (!oDisplayedControl.getControlDelegate()._getChart(oDisplayedControl).getBinding("data") || // first time the tab/chart is displayed
105
+ oDisplayedControl.data("outdatedRows") === true)) {
106
+ var oInnerChart = oDisplayedControl.getControlDelegate()._getChart(oDisplayedControl);
107
+
108
+ oDisplayedControl.getControlDelegate().rebind(oDisplayedControl, oInnerChart.getBindingInfo("data"));
109
+ oDisplayedControl.data("outdatedRows", false);
110
+ }
111
+ }
112
+
113
+ if (oEvent && oEvent.mParameters && sPreviousSelectedKey !== oEvent.mParameters.selectedKey) {
114
+ ControlPersonalizationWriteAPI.add({
115
+ changes: [{
116
+ changeSpecificData: {
117
+ changeType: "selectIconTabBarFilter",
118
+ content: {
119
+ selectedKey: sSelectedKey,
120
+ previousSelectedKey: sPreviousSelectedKey
121
+ }
122
+ },
123
+ selectorElement: oMultiModeControl
124
+ }]
125
+ });
126
+ }
127
+
128
+ this.getExtensionAPI().updateAppState();
129
+ },
130
+ onFiltersChanged: function (oEvent) {
131
+ var oFilterBar = this._getFilterBarControl();
132
+
133
+ if (oFilterBar) {
134
+ var oInternalModelContext = this.getView().getBindingContext("internal"); // Pending filters into FilterBar to be used for custom views
135
+
136
+ this.onPendingFilters();
137
+ oInternalModelContext.setProperty("appliedFilters", oFilterBar.getAssignedFiltersText().filtersText);
138
+
139
+ if (oEvent.getParameter("conditionsBased")) {
140
+ oInternalModelContext.setProperty("hasPendingFilters", true);
141
+ }
142
+ }
143
+ },
144
+ onVariantSelected: function (oEvent) {
145
+ var _this2 = this;
146
+
147
+ var oVM = oEvent.getSource(); // setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
148
+
149
+ setTimeout(function () {
150
+ if (_this2._isMultiMode()) {
151
+ _this2.handlers.onTabMultiModeChange.apply(_this2, [oEvent]);
152
+ }
153
+
154
+ if (_this2._shouldAutoTriggerSearch(oVM)) {
155
+ // the app state will be updated via onSearch handler
156
+ return _this2._getFilterBarControl().triggerSearch();
157
+ } else {
158
+ _this2.getExtensionAPI().updateAppState();
159
+ }
160
+ }, 0);
161
+ },
162
+ onVariantSaved: function () {
163
+ var _this3 = this;
164
+
165
+ //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save!!!
166
+ setTimeout(function () {
167
+ _this3.getExtensionAPI().updateAppState();
168
+ }, 1000);
169
+ },
170
+ onSearch: function () {
171
+ var _this4 = this;
172
+
173
+ var oFilterBar = this._getFilterBarControl();
174
+
175
+ var oInternalModelContext = this.getView().getBindingContext("internal");
176
+ var oMdcChart = this.getChartControl();
177
+ var bHideDraft = FilterUtils.getEditStateIsHideDraft(oFilterBar.getConditions());
178
+ oInternalModelContext.setProperty("hasPendingFilters", false);
179
+ oInternalModelContext.setProperty("hideDraftInfo", bHideDraft);
180
+
181
+ if (this._isMultiMode()) {
182
+ var aControls = this._getControls(),
183
+ oMultiModeControl = this._getMultiModeControl();
184
+
185
+ this._setCountsOutDated();
186
+
187
+ if (!this._isCustomTab()) {
188
+ var sDisplayedControlId = this._getCurrentControl().getId();
189
+
190
+ this._updateMultiTabNotApplicableFields(oInternalModelContext, oFilterBar); // This should be done outside the search event handler of the filter bar.
191
+ // The same logic is required when filter bar is hidden and multiple tables exist on the LR.
192
+ // This is currently done in ListReport/overrides/ViewState.js#onAfterStateApplied()
193
+
194
+
195
+ aControls.forEach(function (oControl) {
196
+ oControl.data("outdatedRows", oControl.getId() !== sDisplayedControlId);
197
+ });
198
+ } else {
199
+ var oFilterConditions = oFilterBar.getFilterConditions();
200
+ this.onViewNeedsRefresh({
201
+ filterConditions: oFilterConditions,
202
+ currentTabId: oMultiModeControl.getSelectedKey(),
203
+ refreshCause: "search"
204
+ });
205
+ }
206
+ } else {
207
+ this._updateALPNotApplicableFields(oInternalModelContext, oFilterBar);
208
+ }
209
+
210
+ if (oMdcChart) {
211
+ // disable bound actions TODO: this clears everything for the chart?
212
+ oMdcChart.getBindingContext("internal").setProperty("", {});
213
+ var oPageInternalModelContext = oMdcChart.getBindingContext("pageInternal");
214
+ var sTemplateContentView = oPageInternalModelContext.getProperty(oPageInternalModelContext.getPath() + "/alpContentView");
215
+
216
+ if (sTemplateContentView === TemplateContentView.Chart) {
217
+ this.hasPendingChartChanges = true;
218
+ }
219
+
220
+ if (sTemplateContentView === TemplateContentView.Table) {
221
+ this.hasPendingTableChanges = true;
222
+ }
223
+ } // store filter bar conditions to use later while navigation
224
+
225
+
226
+ StateUtil.retrieveExternalState(oFilterBar).then(function (oExternalState) {
227
+ _this4.filterBarConditions = oExternalState.filter;
228
+ }).catch(function (oError) {
229
+ Log.error("Error while retrieving the external state", oError);
230
+ });
231
+
232
+ if (this.getView().getViewData().liveMode === false) {
233
+ this.getExtensionAPI().updateAppState();
234
+ }
235
+
236
+ if (system.phone) {
237
+ var oDynamicPage = this.getView().byId("fe::ListReport");
238
+ oDynamicPage.setHeaderExpanded(false);
239
+ }
240
+ },
241
+
242
+ /**
243
+ * Triggers an outbound navigation when a user chooses the chevron.
244
+ *
245
+ * @param {object} oController
246
+ * @param {string} sOutboundTarget Name of the outbound target (needs to be defined in the manifest)
247
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that contains the data for the target app
248
+ * @param {string} sCreatePath Create path when the chevron is created.
249
+ * @returns {Promise} Promise which is resolved once the navigation is triggered
250
+ * @ui5-restricted
251
+ * @final
252
+ */
253
+ onChevronPressNavigateOutBound: function (oController, sOutboundTarget, oContext, sCreatePath) {
254
+ return oController._intentBasedNavigation.onChevronPressNavigateOutBound(oController, sOutboundTarget, oContext, sCreatePath);
255
+ },
256
+ onChartSelectionChanged: function (oEvent) {
257
+ var oMdcChart = oEvent.getSource().getContent(),
258
+ oTable = this._getTable(),
259
+ aData = oEvent.getParameter("data"),
260
+ oInternalModelContext = this.getView().getBindingContext("internal");
261
+
262
+ if (aData) {
263
+ // update action buttons enablement / disablement
264
+ ChartRuntime.fnUpdateChart(oEvent); // update selections on selection or deselection
265
+
266
+ ChartUtils.setChartFilters(oMdcChart);
267
+ }
268
+
269
+ var sTemplateContentView = oInternalModelContext.getProperty(oInternalModelContext.getPath() + "/alpContentView");
270
+
271
+ if (sTemplateContentView === TemplateContentView.Chart) {
272
+ this.hasPendingChartChanges = true;
273
+ } else {
274
+ oTable && oTable.rebind();
275
+ this.hasPendingChartChanges = false;
276
+ }
277
+ },
278
+ onSegmentedButtonPressed: function (oEvent) {
279
+ var sSelectedKey = oEvent.mParameters.key ? oEvent.mParameters.key : null;
280
+ var oInternalModelContext = this.getView().getBindingContext("internal");
281
+ oInternalModelContext.setProperty("alpContentView", sSelectedKey);
282
+
283
+ var oChart = this._getChart();
284
+
285
+ var oTable = this._getTable();
286
+
287
+ var oSegmentedButtonDelegate = {
288
+ onAfterRendering: function () {
289
+ var aItems = oSegmentedButton.getItems();
290
+ aItems.forEach(function (oItem) {
291
+ if (oItem.getKey() === sSelectedKey) {
292
+ oItem.focus();
293
+ }
294
+ });
295
+ oSegmentedButton.removeEventDelegate(oSegmentedButtonDelegate);
296
+ }
297
+ };
298
+ var oSegmentedButton = sSelectedKey === TemplateContentView.Table ? this._getSegmentedButton("Table") : this._getSegmentedButton("Chart");
299
+
300
+ if (oSegmentedButton !== oEvent.getSource()) {
301
+ oSegmentedButton.addEventDelegate(oSegmentedButtonDelegate);
302
+ }
303
+
304
+ switch (sSelectedKey) {
305
+ case TemplateContentView.Table:
306
+ this._updateTable(oTable);
307
+
308
+ break;
309
+
310
+ case TemplateContentView.Chart:
311
+ this._updateChart(oChart);
312
+
313
+ break;
314
+
315
+ case TemplateContentView.Hybrid:
316
+ this._updateTable(oTable);
317
+
318
+ this._updateChart(oChart);
319
+
320
+ break;
321
+
322
+ default:
323
+ break;
324
+ }
325
+
326
+ this.getExtensionAPI().updateAppState();
327
+ },
328
+ onFiltersSegmentedButtonPressed: function (oEvent) {
329
+ if (oEvent.getParameter("key") === "Compact") {
330
+ this._getFilterBarControl().setVisible(true);
331
+
332
+ this.getView().byId(this.getView().getContent()[0].data("visualFilterBarId")).setVisible(false);
333
+ } else {
334
+ this._getFilterBarControl().setVisible(false);
335
+
336
+ this.getView().byId(this.getView().getContent()[0].data("visualFilterBarId")).setVisible(true);
337
+ }
338
+ },
339
+ onStateChanged: function () {
340
+ this.getExtensionAPI().updateAppState();
341
+ }
342
+ };
343
+ _this.formatters = {
344
+ /**
345
+ * Method to set the message text for the multiple entity sets when fields in the FilterBar need to be ignored.
346
+ *
347
+ * @param this
348
+ * @param {Array} aIgnoredFields Array of ignored fields in the FilterBar for the current tab (multiple entity sets)
349
+ * @param {string} sTabTitle Tab title
350
+ * @param {boolean} bIsChart Flag that indicates whether the control is a chart or not
351
+ * @param {object} oApplySupported ApplySupported for the control
352
+ * @returns {string} Message text
353
+ */
354
+ setTabMessageStrip: function (aIgnoredFields, sTabTitle, bIsChart, oApplySupported) {
355
+ var sText = "";
356
+ bIsChart = bIsChart === "true" || bIsChart === true;
357
+
358
+ var oFilterBar = this._getFilterBarControl();
359
+
360
+ if (oFilterBar && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && (sTabTitle || bIsChart)) {
361
+ var sFilterBarEntityPath = oFilterBar.data("entityType"),
362
+ oMetaModel = this.getView().getModel().getMetaModel(),
363
+ oResourceBundle = Core.getLibraryResourceBundle("sap.fe.templates"),
364
+ aIgnoredLabels = aIgnoredFields.map(function (sProperty) {
365
+ var oMacroResourceBundle = Core.getLibraryResourceBundle("sap.fe.macros");
366
+
367
+ if (sProperty === "$search") {
368
+ return oMacroResourceBundle ? oMacroResourceBundle.getText("M_FILTERBAR_SEARCH") : "";
369
+ }
370
+
371
+ if (sProperty === "$editState") {
372
+ return oMacroResourceBundle ? oMacroResourceBundle.getText("M_COMMON_FILTERBAR_EDITING_STATUS") : "";
373
+ }
374
+
375
+ var sLabel = oMetaModel.getObject(sFilterBarEntityPath + sProperty + "@com.sap.vocabularies.Common.v1.Label");
376
+ return DelegateUtil.getLocalizedText(sLabel, oFilterBar);
377
+ });
378
+ var bIsSearchIgnored = !oApplySupported.enableSearch;
379
+
380
+ if (oResourceBundle) {
381
+ sText = CommonUtils.getMessageStripText(this.getView(), aIgnoredLabels, oFilterBar, bIsChart, bIsSearchIgnored, sTabTitle, oResourceBundle, DelegateUtil.getLocalizedText);
382
+ }
383
+ }
384
+
385
+ return sText;
386
+ }
387
+ };
388
+ return _this;
389
+ }
390
+
391
+ var _proto = ListReportController.prototype;
392
+
393
+ _proto.getExtensionAPI = function getExtensionAPI() {
394
+ if (!this.extensionAPI) {
395
+ this.extensionAPI = new ExtensionAPI(this);
396
+ }
397
+
398
+ return this.extensionAPI;
399
+ };
400
+
401
+ _proto.onInit = function onInit() {
402
+ var _this5 = this;
403
+
404
+ PageController.prototype.onInit.apply(this);
405
+
406
+ var aControls = this._getControls();
407
+
408
+ var oInternalModelContext = this.getView().getBindingContext("internal");
409
+
410
+ if (this._isMultiMode()) {
411
+ var oMultiModeTab = this._getMultiModeControl();
412
+
413
+ oInternalModelContext.setProperty("tabs", {
414
+ selected: oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey()
415
+ });
416
+ aControls.forEach(function (oControl) {
417
+ var oUpdateCounts = function () {
418
+ _this5._updateCounts();
419
+ };
420
+
421
+ CommonUtils.addEventToBindingInfo(oControl, "dataRequested", oUpdateCounts);
422
+ });
423
+ } //TODO: This is only a temporary approach and will be removed once app state behaviour is finalized.
424
+
425
+
426
+ oInternalModelContext.setProperty("hasPendingFilters", true);
427
+ oInternalModelContext.setProperty("appliedFilters", "");
428
+ oInternalModelContext.setProperty("hideDraftInfo", false);
429
+ oInternalModelContext.setProperty("uom", {});
430
+ oInternalModelContext.setProperty("scalefactor", {});
431
+ oInternalModelContext.setProperty("scalefactorNumber", {});
432
+ oInternalModelContext.setProperty("currency", {});
433
+
434
+ if (this._hasMultiVisualizations()) {
435
+ var alpContentView = this._getDefaultPath();
436
+
437
+ if (!system.desktop && alpContentView === TemplateContentView.Hybrid) {
438
+ alpContentView = TemplateContentView.Chart;
439
+ }
440
+
441
+ oInternalModelContext.setProperty("alpContentView", alpContentView);
442
+ } // Store conditions from filter bar
443
+ // this is later used before navigation to get conditions applied on the filter bar
444
+
445
+
446
+ this.filterBarConditions = {}; // As AppStateHandler.applyAppState triggers a navigation we want to make sure it will
447
+ // happen after the routeMatch event has been processed (otherwise the router gets broken)
448
+
449
+ this.getAppComponent().getRouterProxy().waitForRouteMatchBeforeNavigation();
450
+ this._isMultiMode() && this._updateMultiControlHiddenStatus();
451
+ };
452
+
453
+ _proto.onExit = function onExit() {
454
+ delete this.filterBarConditions;
455
+ delete this._oListReportControl;
456
+ this.extensionAPI && this.extensionAPI.destroy();
457
+ delete this.extensionAPI;
458
+ };
459
+
460
+ _proto._onAfterBinding = function _onAfterBinding() {
461
+ var _this6 = this;
462
+
463
+ var aTables = this._getControls("table");
464
+
465
+ if (EditState.isEditStateDirty()) {
466
+ var oTableBinding = this._getTableBinding();
467
+
468
+ if (oTableBinding) {
469
+ if (!this.sUpdateTimer) {
470
+ this.sUpdateTimer = setTimeout(function () {
471
+ oTableBinding.refresh();
472
+
473
+ if (_this6._isMultiMode()) {
474
+ _this6._setCountsOutDated();
475
+
476
+ _this6._updateCounts();
477
+ }
478
+
479
+ delete _this6.sUpdateTimer;
480
+ }, 0);
481
+ } // Update action enablement and visibility upon table data update.
482
+
483
+
484
+ var fnUpdateTableActions = function () {
485
+ _this6._updateTableActions(aTables);
486
+
487
+ oTableBinding.detachDataReceived(fnUpdateTableActions);
488
+ };
489
+
490
+ oTableBinding.attachDataReceived(fnUpdateTableActions);
491
+ }
492
+
493
+ EditState.setEditStateProcessed();
494
+ }
495
+
496
+ if (!this.sUpdateTimer) {
497
+ this._updateTableActions(aTables);
498
+ }
499
+
500
+ this.pageReady.waitFor(this.getAppComponent().getAppStateHandler().applyAppState());
501
+ };
502
+
503
+ _proto.onBeforeRendering = function onBeforeRendering() {
504
+ PageController.prototype.onBeforeRendering.apply(this);
505
+ };
506
+
507
+ _proto.onAfterRendering = function onAfterRendering() {
508
+ var _this7 = this;
509
+
510
+ this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
511
+ _this7.oResourceBundle = response;
512
+
513
+ var aControls = _this7._getControls();
514
+
515
+ var sEntitySet = _this7.getView().getViewData().entitySet;
516
+
517
+ var sText = CommonUtils.getTranslatedText("T_TABLE_AND_CHART_NO_DATA_TEXT", _this7.oResourceBundle, undefined, sEntitySet);
518
+ aControls.forEach(function (oControl) {
519
+ oControl.setNoDataText(sText);
520
+ });
521
+ }).catch(function (oError) {
522
+ Log.error("Error while retrieving the resource bundle", oError);
523
+ });
524
+ };
525
+
526
+ _proto.onPageReady = function onPageReady(mParameters) {
527
+ // Enabling mandatory filter fields message dialog and focusing on them
528
+ if (mParameters.forceFocus) {
529
+ var oFilterBar = this._getFilterBarControl();
530
+
531
+ if (oFilterBar && !oFilterBar.getShowMessages()) {
532
+ oFilterBar.setShowMessages(true);
533
+ oFilterBar.setFocusOnFirstErroneousField();
534
+ }
535
+ } // Remove the handler on back navigation that displays Draft confirmation
536
+
537
+
538
+ this.getAppComponent().getShellServices().setBackNavigation(undefined);
539
+ }
540
+ /**
541
+ * Method called when the content of a list report view needs to be refreshed.
542
+ * This happens either when there is a change on the FilterBar and the search is triggered,
543
+ * or when a tab with custom content is selected.
544
+ * This method can be overwritten by the controller extension in case of customization.
545
+ *
546
+ * @param {map} mParameters Map containing the filter conditions of the FilterBar, the currentTabID
547
+ * and the view refresh cause (tabChanged or search).
548
+ * The map looks like this:
549
+ * <code><pre>
550
+ * {
551
+ * filterConditions: {
552
+ * Country: [
553
+ * {
554
+ * operator: "EQ"
555
+ * validated: "NotValidated"
556
+ * values: ["Germany", ...]
557
+ * },
558
+ * ...
559
+ * ]
560
+ * ...
561
+ * },
562
+ * currentTabId: "fe::CustomTab::tab1",
563
+ * refreshCause: "tabChanged" | "search"
564
+ * }
565
+ * </pre></code>
566
+ *
567
+ * @public
568
+ */
569
+ ;
570
+
571
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
572
+ onViewNeedsRefresh = function onViewNeedsRefresh(mParameters) {
573
+ /* To be overriden */
574
+ }
575
+ /**
576
+ * Method called when a filter or search value has been changed in the FilterBar,
577
+ * but has not been validated yet by the end user (with the 'Go' or 'Search' button).
578
+ * Typically, the content of the current tab is greyed out until the filters are validated.
579
+ * This method can be overwritten by the controller extension in case of customization.
580
+ *
581
+ * @public
582
+ */
583
+ ;
584
+
585
+ _proto.onPendingFilters = function onPendingFilters() {
586
+ /* To be overriden */
587
+ };
588
+
589
+ _proto.getCurrentEntitySet = function getCurrentEntitySet() {
590
+ if (!this._sEntitySet) {
591
+ var oDisplayedControl = this._isMultiMode() && this._getCurrentControl() || this._getTable();
592
+
593
+ this._sEntitySet = oDisplayedControl === null || oDisplayedControl === void 0 ? void 0 : oDisplayedControl.data("targetCollectionPath").slice(1);
594
+ }
595
+
596
+ return this._sEntitySet;
597
+ }
598
+ /**
599
+ * This method initiates the update of the enabled state of the DataFieldForAction and the visible state of the DataFieldForIBN buttons.
600
+ * @param aTables Array of tables in the list report
601
+ * @private
602
+ */
603
+ ;
604
+
605
+ _proto._updateTableActions = function _updateTableActions(aTables) {
606
+ var aIBNActions = [];
607
+ aTables.forEach(function (oTable) {
608
+ aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions); // Update 'enabled' property of DataFieldForAction buttons on table toolbar
609
+ // The same is also performed on Table selectionChange event
610
+
611
+ var oInternalModelContext = oTable.getBindingContext("internal"),
612
+ oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
613
+ aSelectedContexts = oTable.getSelectedContexts();
614
+ CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
615
+ });
616
+ CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
617
+ }
618
+ /**
619
+ * This method scrolls to a specific row on all the available tables.
620
+ *
621
+ * @function
622
+ * @name sap.fe.templates.ListReport.ListReportController.controller#_scrollTablesToRow
623
+ * @param {string} sRowPath The path of the table row context to be scrolled to
624
+ */
625
+ ;
626
+
627
+ _proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
628
+ this._getControls("table").forEach(function (oTable) {
629
+ TableScroller.scrollTableToRow(oTable, sRowPath);
630
+ });
631
+ };
632
+
633
+ _proto._getPageTitleInformation = function _getPageTitleInformation() {
634
+ var oTitleInfo = {
635
+ title: "",
636
+ subtitle: "",
637
+ intent: "",
638
+ icon: ""
639
+ };
640
+ oTitleInfo.title = this.getView().getContent()[0].data().ListReportTitle;
641
+ oTitleInfo.subtitle = this.getView().getContent()[0].data().ListReportSubtitle;
642
+ return oTitleInfo;
643
+ };
644
+
645
+ _proto._getFilterBarControl = function _getFilterBarControl() {
646
+ return this.getView().byId(this._getFilterBarControlId());
647
+ };
648
+
649
+ _proto._getSegmentedButton = function _getSegmentedButton(sControl) {
650
+ return this.getView().byId(this._getSegmentedButtonId(sControl));
651
+ };
652
+
653
+ _proto._getSegmentedButtonId = function _getSegmentedButtonId(sControl) {
654
+ if (sControl === "Chart") {
655
+ return this._getChart().data("segmentedButtonId");
656
+ } else {
657
+ var _this$_getTable;
658
+
659
+ return (_this$_getTable = this._getTable()) === null || _this$_getTable === void 0 ? void 0 : _this$_getTable.data("segmentedButtonId");
660
+ }
661
+ };
662
+
663
+ _proto._getFilterBarControlId = function _getFilterBarControlId() {
664
+ return this.getView().getContent()[0].data("filterBarId");
665
+ };
666
+
667
+ _proto._getChartControlId = function _getChartControlId() {
668
+ return this.getView().getContent()[0].data("singleChartId");
669
+ };
670
+
671
+ _proto.getChartControl = function getChartControl() {
672
+ return this.getView().byId(this._getChartControlId());
673
+ };
674
+
675
+ _proto._getVisualFilterBarControl = function _getVisualFilterBarControl() {
676
+ return this.getView().byId(this._getVisualFilterBarControlId());
677
+ };
678
+
679
+ _proto._getVisualFilterBarControlId = function _getVisualFilterBarControlId() {
680
+ return this.getView().getContent()[0].data("visualFilterBarId");
681
+ };
682
+
683
+ _proto._getMultiModeControl = function _getMultiModeControl() {
684
+ return this.getView().byId("fe::TabMultipleMode");
685
+ };
686
+
687
+ _proto._getTableControlId = function _getTableControlId() {
688
+ return this.getView().getContent()[0].data("singleTableId");
689
+ };
690
+
691
+ _proto._getCurrentControl = function _getCurrentControl() {
692
+ if (!this._oListReportControl) {
693
+ var oMultiModeTab = this._getMultiModeControl();
694
+
695
+ this._oListReportControl = this.getView().byId(oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey());
696
+ }
697
+
698
+ return this._oListReportControl;
699
+ };
700
+
701
+ _proto._getTable = function _getTable() {
702
+ if (this._isMultiMode()) {
703
+ var oControl = this._getCurrentControl();
704
+
705
+ return oControl && oControl.isA("sap.ui.mdc.Table") ? oControl : undefined;
706
+ }
707
+
708
+ return this.getView().byId(this._getTableControlId());
709
+ };
710
+
711
+ _proto._getChart = function _getChart() {
712
+ return this.getView().byId(this._getChartControlId());
713
+ };
714
+
715
+ _proto._getTableBinding = function _getTableBinding(sTableId) {
716
+ var oTableControl = sTableId ? this.getView().byId(sTableId) : this._getTable();
717
+
718
+ var oBinding = oTableControl && oTableControl._getRowBinding();
719
+
720
+ return oBinding;
721
+ };
722
+
723
+ _proto._getControls = function _getControls(sKey) {
724
+ var _this8 = this;
725
+
726
+ if (this._isMultiMode()) {
727
+ var aControls = [];
728
+
729
+ var oTabMultiMode = this._getMultiModeControl();
730
+
731
+ oTabMultiMode.getItems().forEach(function (oItem) {
732
+ var oControl = _this8.getView().byId(oItem.getKey());
733
+
734
+ if (sKey) {
735
+ if (oItem.getKey().indexOf("fe::" + sKey) > -1) {
736
+ oControl && aControls.push(oControl);
737
+ }
738
+ } else {
739
+ oControl && aControls.push(oControl);
740
+ }
741
+ });
742
+ return aControls;
743
+ } else if (sKey === "Chart") {
744
+ var oChart = this._getChart();
745
+
746
+ return oChart ? [oChart] : [];
747
+ } else {
748
+ var oTable = this._getTable();
749
+
750
+ return oTable ? [oTable] : [];
751
+ }
752
+ };
753
+
754
+ _proto._getDefaultPath = function _getDefaultPath() {
755
+ var defaultPath = this.getView().getContent()[0].data("defaultPath");
756
+
757
+ switch (defaultPath) {
758
+ case "primary":
759
+ return TemplateContentView.Chart;
760
+
761
+ case "secondary":
762
+ return TemplateContentView.Table;
763
+
764
+ case "both":
765
+ default:
766
+ return TemplateContentView.Hybrid;
767
+ }
768
+ }
769
+ /**
770
+ * Method to know if ListReport is configured with Multiple Table mode.
771
+ *
772
+ * @function
773
+ * @name _isMultiMode
774
+ * @returns {boolean} Is Multiple Table mode set?
775
+ */
776
+ ;
777
+
778
+ _proto._isMultiMode = function _isMultiMode() {
779
+ if (!this._oListReportControl) {
780
+ this._bMultiMode = !!this._getMultiModeControl();
781
+ }
782
+
783
+ return this._bMultiMode;
784
+ }
785
+ /**
786
+ * Method to know if ListReport is configured with Multiple EntitySets.
787
+ *
788
+ * @function
789
+ * @name _isMultiEntitySets
790
+ * @returns {boolean} Is Multiple EntitySets configuration?
791
+ */
792
+ ;
793
+
794
+ _proto._isMultiEntitySets = function _isMultiEntitySets() {
795
+ return this.getView().getContent()[0].data("isMultiEntitySets") === "true";
796
+ };
797
+
798
+ _proto._hasMultiVisualizations = function _hasMultiVisualizations() {
799
+ return this.getView().getContent()[0].data("hasMultiVisualizations") === "true";
800
+ };
801
+
802
+ _proto._setShareModel = function _setShareModel() {
803
+ // TODO: deactivated for now - currently there is no _templPriv anymore, to be discussed
804
+ // this method is currently not called anymore from the init method
805
+ var fnGetUser = ObjectPath.get("sap.ushell.Container.getUser"); //var oManifest = this.getOwnerComponent().getAppComponent().getMetadata().getManifestEntry("sap.ui");
806
+ //var sBookmarkIcon = (oManifest && oManifest.icons && oManifest.icons.icon) || "";
807
+ //shareModel: Holds all the sharing relevant information and info used in XML view
808
+
809
+ var oShareInfo = {
810
+ bookmarkTitle: document.title,
811
+ //To name the bookmark according to the app title.
812
+ bookmarkCustomUrl: function () {
813
+ var sHash = hasher.getHash();
814
+ return sHash ? "#" + sHash : window.location.href;
815
+ },
816
+
817
+ /*
818
+ To be activated once the FLP shows the count - see comment above
819
+ bookmarkServiceUrl: function() {
820
+ //var oTable = oTable.getInnerTable(); oTable is already the sap.fe table (but not the inner one)
821
+ // we should use table.getListBindingInfo instead of the binding
822
+ var oBinding = oTable.getBinding("rows") || oTable.getBinding("items");
823
+ return oBinding ? fnGetDownloadUrl(oBinding) : "";
824
+ },*/
825
+ isShareInJamActive: !!fnGetUser && fnGetUser().isJamActive()
826
+ };
827
+ var oTemplatePrivateModel = this.getOwnerComponent().getModel("_templPriv");
828
+ oTemplatePrivateModel.setProperty("/listReport/share", oShareInfo);
829
+ }
830
+ /**
831
+ * Hidden tables must be marked as hidden to avoid sending
832
+ * requests when FilterBar is changed or LR is initialized
833
+ * Best workflow would be to suspend table binding but
834
+ * if the user switch quickly between tabs the batch response of previous
835
+ * is received when previous tab is already disabled (binding is suspended) and
836
+ * generates error.
837
+ * A temporary solution (if we find better workflow) is to set a customData and don't trigger
838
+ * rebindTable if this customData is set to true.
839
+ */
840
+ ;
841
+
842
+ _proto._updateMultiControlHiddenStatus = function _updateMultiControlHiddenStatus() {
843
+ var oDisplayedControl = this._getCurrentControl();
844
+
845
+ if (this._isMultiMode() && oDisplayedControl) {
846
+ var sDisplayControlId = oDisplayedControl.getId();
847
+
848
+ var aControls = this._getControls();
849
+
850
+ aControls.forEach(function (oControl) {
851
+ var sControlId = oControl.getId();
852
+ oControl.data("controlHidden", sControlId !== sDisplayControlId);
853
+ });
854
+ }
855
+ }
856
+ /**
857
+ * Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the multiple table scenario).
858
+ *
859
+ * @param {sap.ui.model.context} oInternalModelContext The internal model context
860
+ * @param {sap.ui.mdc.FilterBar} oFilterBar MDC filter bar
861
+ */
862
+ ;
863
+
864
+ _proto._updateMultiTabNotApplicableFields = function _updateMultiTabNotApplicableFields(oInternalModelContext, oFilterBar) {
865
+ var _this9 = this;
866
+
867
+ var mCache = {};
868
+
869
+ var ignoredFields = {},
870
+ ignoredFieldsTitle = {},
871
+ aTables = this._getControls("table"),
872
+ aCharts = this._getControls("Chart");
873
+
874
+ aTables.forEach(function (oTable) {
875
+ var sTableEntityPath = oTable.data("targetCollectionPath"),
876
+ sTableEntitySet = sTableEntityPath.slice(1),
877
+ sTabId = oTable.getParent().getParent().getKey(),
878
+ sTabTitle = oTable.getParent().getParent().getText(),
879
+ sCacheKey = sTableEntitySet + (oTable.data("enableAnalytics") === "true" ? "Analytical" : "Regular");
880
+
881
+ if (!mCache[sCacheKey]) {
882
+ mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oTable);
883
+ }
884
+
885
+ ignoredFields[sTabId] = mCache[sCacheKey];
886
+ ignoredFieldsTitle[sTabId] = _this9.formatters.setTabMessageStrip.call(_this9, mCache[sCacheKey], sTabTitle, "false", {});
887
+ });
888
+ aCharts.forEach(function (oChart) {
889
+ var sChartEntityPath = oChart.data("targetCollectionPath"),
890
+ sChartEntitySet = sChartEntityPath.slice(1),
891
+ sTabId = oChart.getParent().getParent().getKey(),
892
+ sTabTitle = oChart.getParent().getParent().getText(),
893
+ sCacheKey = sChartEntitySet + "Chart";
894
+
895
+ if (!mCache[sCacheKey]) {
896
+ mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
897
+ }
898
+
899
+ ignoredFields[sTabId] = mCache[sCacheKey];
900
+ ignoredFieldsTitle[sTabId] = _this9.formatters.setTabMessageStrip.call(_this9, mCache[sCacheKey], sTabTitle, "false", {});
901
+ });
902
+ oInternalModelContext.setProperty("tabs/ignoredFields", ignoredFields);
903
+ oInternalModelContext.setProperty("tabs/ignoredFieldsTitle", ignoredFieldsTitle);
904
+ }
905
+ /**
906
+ * Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the ALP scenario).
907
+ *
908
+ * @param {sap.ui.model.context} oInternalModelContext The internal model context
909
+ * @param {sap.ui.mdc.FilterBar} oFilterBar MDC filter bar
910
+ */
911
+ ;
912
+
913
+ _proto._updateALPNotApplicableFields = function _updateALPNotApplicableFields(oInternalModelContext, oFilterBar) {
914
+ var mCache = {};
915
+
916
+ var ignoredFields = {},
917
+ aTables = this._getControls("table"),
918
+ aCharts = this._getControls("Chart");
919
+
920
+ if (!aTables.length || !aCharts.length) {
921
+ // If there's not a table and a chart, we're not in the ALP case
922
+ return;
923
+ } // For the moment, there's nothing for tables...
924
+
925
+
926
+ aCharts.forEach(function (oChart) {
927
+ var sChartEntityPath = oChart.data("targetCollectionPath"),
928
+ sChartEntitySet = sChartEntityPath.slice(1),
929
+ sCacheKey = sChartEntitySet + "Chart";
930
+
931
+ if (!mCache[sCacheKey]) {
932
+ mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
933
+ }
934
+
935
+ ignoredFields[sCacheKey] = mCache[sCacheKey];
936
+ });
937
+ oInternalModelContext.setProperty("controls/ignoredFields", ignoredFields);
938
+ };
939
+
940
+ _proto._updateMultiModeSelectedControl = function _updateMultiModeSelectedControl() {
941
+ this._sEntitySet = undefined;
942
+ this._oListReportControl = undefined;
943
+
944
+ this._getCurrentControl();
945
+ };
946
+
947
+ _proto._updateCounts = function _updateCounts() {
948
+ this._updateMultiModeCounts();
949
+ }
950
+ /**
951
+ * Method to determine if a tab from the list report is a custom tab.
952
+ *
953
+ * @function
954
+ * @name _isCustomTab
955
+ * @returns {boolean} Determines if the tab is a custom tab.
956
+ */
957
+ ;
958
+
959
+ _proto._isCustomTab = function _isCustomTab() {
960
+ var oMultiModeControl = this._getMultiModeControl();
961
+
962
+ return oMultiModeControl && oMultiModeControl.getSelectedKey().indexOf("::CustomTab::") > -1;
963
+ };
964
+
965
+ _proto._setCountsOutDated = function _setCountsOutDated() {
966
+ var oMultiModeControl = this._getMultiModeControl();
967
+
968
+ if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true") {
969
+ var aItems = oMultiModeControl.getItems();
970
+ aItems.forEach(function (oItem) {
971
+ if (oItem.getKey().indexOf("fe::Chart") === -1) {
972
+ oItem.data("outdatedCounts", true);
973
+ }
974
+ });
975
+ }
976
+ };
977
+
978
+ _proto._updateMultiModeCounts = function _updateMultiModeCounts() {
979
+ var _this10 = this;
980
+
981
+ var aBindingPromises = [];
982
+
983
+ var oMultiModeControl = this._getMultiModeControl();
984
+
985
+ if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true" && !this._isCustomTab()) {
986
+ var oDisplayedControl = this._getCurrentControl();
987
+
988
+ var sDisplayedControlId = oDisplayedControl.getId();
989
+ var aCompliantTabs = [];
990
+ var aItems = oMultiModeControl.getItems();
991
+ aItems.forEach(function (oItem) {
992
+ var oControl = _this10.getView().byId(oItem.getKey());
993
+
994
+ if (oControl && !oControl.isA("sap.ui.mdc.Chart") && (oItem.data("outdatedCounts") || oControl.getId() === sDisplayedControlId)) {
995
+ aCompliantTabs.push({
996
+ control: oControl,
997
+ item: oItem
998
+ });
999
+ }
1000
+ });
1001
+ aBindingPromises = aCompliantTabs.map(function (mTab) {
1002
+ mTab.item.setCount("...");
1003
+ var oControl = mTab.control;
1004
+ var oFilterInfos = TableUtils.getFiltersInfoForSV(oControl, mTab.item.data("selectionVariant"));
1005
+ return TableUtils.getListBindingForCount(oControl, _this10.getView().getBindingContext(), {
1006
+ batchGroupId: oControl.getId() === sDisplayedControlId ? oControl.data("batchGroupId") : "$auto",
1007
+ additionalFilters: oFilterInfos.filters
1008
+ });
1009
+ });
1010
+ Promise.all(aBindingPromises).then(function (aCounts) {
1011
+ for (var k in aCounts) {
1012
+ var oItem = aCompliantTabs[k].item;
1013
+ oItem.setCount(TableUtils.getCountFormatted(aCounts[k]));
1014
+ oItem.data("outdatedCounts", false);
1015
+ }
1016
+ }).catch(function (oError) {
1017
+ Log.error("Error while retrieving the values for the icon tab bar", oError);
1018
+ });
1019
+ }
1020
+ };
1021
+
1022
+ _proto._isFilterBarHidden = function _isFilterBarHidden() {
1023
+ return this.getView().getViewData().hideFilterBar;
1024
+ };
1025
+
1026
+ _proto._shouldAutoTriggerSearch = function _shouldAutoTriggerSearch(oVM) {
1027
+ if (this.getView().getViewData().initialLoad === InitialLoadMode.Auto && (!oVM || oVM.getStandardVariantKey() === oVM.getCurrentVariantKey())) {
1028
+ var oFilterBar = this._getFilterBarControl();
1029
+
1030
+ if (oFilterBar) {
1031
+ var oConditions = oFilterBar.getConditions();
1032
+
1033
+ for (var sKey in oConditions) {
1034
+ // ignore filters starting with $ (e.g. $search, $editState)
1035
+ if (!sKey.startsWith("$") && Array.isArray(oConditions[sKey]) && oConditions[sKey].length) {
1036
+ return true;
1037
+ }
1038
+ }
1039
+ }
1040
+ }
1041
+
1042
+ return false;
1043
+ };
1044
+
1045
+ _proto._updateTable = function _updateTable(oTable) {
1046
+ if (!oTable.isTableBound() || this.hasPendingChartChanges) {
1047
+ oTable.rebind();
1048
+ this.hasPendingChartChanges = false;
1049
+ }
1050
+ };
1051
+
1052
+ _proto._updateChart = function _updateChart(oChart) {
1053
+ var oInnerChart = oChart.getControlDelegate()._getChart(oChart);
1054
+
1055
+ if (!(oInnerChart && oInnerChart.isBound("data")) || this.hasPendingTableChanges) {
1056
+ oChart.getControlDelegate().rebind(oChart, oInnerChart.getBindingInfo("data"));
1057
+ this.hasPendingTableChanges = false;
1058
+ }
1059
+ };
1060
+
1061
+ return ListReportController;
1062
+ }(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "_routing", [_dec2], {
1063
+ configurable: true,
1064
+ enumerable: true,
1065
+ writable: true,
1066
+ initializer: null
1067
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "_intentBasedNavigation", [_dec3], {
1068
+ configurable: true,
1069
+ enumerable: true,
1070
+ writable: true,
1071
+ initializer: null
1072
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "sideEffects", [_dec4], {
1073
+ configurable: true,
1074
+ enumerable: true,
1075
+ writable: true,
1076
+ initializer: null
1077
+ }), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "intentBasedNavigation", [_dec5], {
1078
+ configurable: true,
1079
+ enumerable: true,
1080
+ writable: true,
1081
+ initializer: null
1082
+ }), _descriptor5 = _applyDecoratedDescriptor(_class2.prototype, "share", [_dec6], {
1083
+ configurable: true,
1084
+ enumerable: true,
1085
+ writable: true,
1086
+ initializer: null
1087
+ }), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "editFlow", [_dec7], {
1088
+ configurable: true,
1089
+ enumerable: true,
1090
+ writable: true,
1091
+ initializer: null
1092
+ }), _descriptor7 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec8], {
1093
+ configurable: true,
1094
+ enumerable: true,
1095
+ writable: true,
1096
+ initializer: null
1097
+ }), _descriptor8 = _applyDecoratedDescriptor(_class2.prototype, "kpiManagement", [_dec9], {
1098
+ configurable: true,
1099
+ enumerable: true,
1100
+ writable: true,
1101
+ initializer: null
1102
+ }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec10], {
1103
+ configurable: true,
1104
+ enumerable: true,
1105
+ writable: true,
1106
+ initializer: null
1107
+ }), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "massEdit", [_dec11], {
1108
+ configurable: true,
1109
+ enumerable: true,
1110
+ writable: true,
1111
+ initializer: null
1112
+ }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onViewNeedsRefresh", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onViewNeedsRefresh"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPendingFilters", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onPendingFilters"), _class2.prototype)), _class2)) || _class);
1113
+ return ListReportController;
1114
+ }, false);
1115
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiVGVtcGxhdGVDb250ZW50VmlldyIsIkNvcmVMaWJyYXJ5IiwiSW5pdGlhbExvYWRNb2RlIiwiTGlzdFJlcG9ydENvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiSW50ZXJuYWxSb3V0aW5nIiwib3ZlcnJpZGUiLCJvbkFmdGVyQmluZGluZyIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiX29uQWZ0ZXJCaW5kaW5nIiwiSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXRFbnRpdHlTZXQiLCJiYXNlIiwiZ2V0Q3VycmVudEVudGl0eVNldCIsIlNpZGVFZmZlY3RzIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUiLCJTaGFyZSIsIlNoYXJlT3ZlcnJpZGVzIiwiRWRpdEZsb3ciLCJFZGl0Rmxvd092ZXJyaWRlcyIsIlZpZXdTdGF0ZSIsIlZpZXdTdGF0ZU92ZXJyaWRlcyIsIktQSU1hbmFnZW1lbnQiLCJQbGFjZWhvbGRlciIsIk1hc3NFZGl0IiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJwcml2YXRlRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJoYW5kbGVycyIsIm9uVGFiTXVsdGlNb2RlQ2hhbmdlIiwib0V2ZW50IiwiX3VwZGF0ZU11bHRpTW9kZVNlbGVjdGVkQ29udHJvbCIsIl91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMiLCJvRmlsdGVyQmFyIiwiX2dldEZpbHRlckJhckNvbnRyb2wiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9EaXNwbGF5ZWRDb250cm9sIiwiX2dldEN1cnJlbnRDb250cm9sIiwib011bHRpTW9kZUNvbnRyb2wiLCJfZ2V0TXVsdGlNb2RlQ29udHJvbCIsInNTZWxlY3RlZEtleSIsImdldFNlbGVjdGVkS2V5Iiwic1ByZXZpb3VzU2VsZWN0ZWRLZXkiLCJtUGFyYW1ldGVycyIsInByZXZpb3VzS2V5IiwidW5kZWZpbmVkIiwic2V0UHJvcGVydHkiLCJnZXRQcm9wZXJ0eSIsIl9pc0N1c3RvbVRhYiIsIm9GaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVyQ29uZGl0aW9ucyIsIm9uVmlld05lZWRzUmVmcmVzaCIsImZpbHRlckNvbmRpdGlvbnMiLCJjdXJyZW50VGFiSWQiLCJyZWZyZXNoQ2F1c2UiLCJpc0EiLCJnZXRSb3dCaW5kaW5nIiwiZGF0YSIsInJlYmluZCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsIl9nZXRDaGFydCIsImdldEJpbmRpbmciLCJvSW5uZXJDaGFydCIsImdldEJpbmRpbmdJbmZvIiwic2VsZWN0ZWRLZXkiLCJDb250cm9sUGVyc29uYWxpemF0aW9uV3JpdGVBUEkiLCJhZGQiLCJjaGFuZ2VzIiwiY2hhbmdlU3BlY2lmaWNEYXRhIiwiY2hhbmdlVHlwZSIsImNvbnRlbnQiLCJwcmV2aW91c1NlbGVjdGVkS2V5Iiwic2VsZWN0b3JFbGVtZW50IiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJvbkZpbHRlcnNDaGFuZ2VkIiwib25QZW5kaW5nRmlsdGVycyIsImdldEFzc2lnbmVkRmlsdGVyc1RleHQiLCJmaWx0ZXJzVGV4dCIsImdldFBhcmFtZXRlciIsIm9uVmFyaWFudFNlbGVjdGVkIiwib1ZNIiwiZ2V0U291cmNlIiwic2V0VGltZW91dCIsIl9pc011bHRpTW9kZSIsImFwcGx5IiwiX3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoIiwidHJpZ2dlclNlYXJjaCIsIm9uVmFyaWFudFNhdmVkIiwib25TZWFyY2giLCJvTWRjQ2hhcnQiLCJnZXRDaGFydENvbnRyb2wiLCJiSGlkZURyYWZ0IiwiRmlsdGVyVXRpbHMiLCJnZXRFZGl0U3RhdGVJc0hpZGVEcmFmdCIsImdldENvbmRpdGlvbnMiLCJhQ29udHJvbHMiLCJfZ2V0Q29udHJvbHMiLCJfc2V0Q291bnRzT3V0RGF0ZWQiLCJzRGlzcGxheWVkQ29udHJvbElkIiwiZ2V0SWQiLCJfdXBkYXRlTXVsdGlUYWJOb3RBcHBsaWNhYmxlRmllbGRzIiwiZm9yRWFjaCIsIm9Db250cm9sIiwiX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMiLCJvUGFnZUludGVybmFsTW9kZWxDb250ZXh0Iiwic1RlbXBsYXRlQ29udGVudFZpZXciLCJnZXRQYXRoIiwiQ2hhcnQiLCJoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzIiwiVGFibGUiLCJoYXNQZW5kaW5nVGFibGVDaGFuZ2VzIiwiU3RhdGVVdGlsIiwicmV0cmlldmVFeHRlcm5hbFN0YXRlIiwidGhlbiIsIm9FeHRlcm5hbFN0YXRlIiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImZpbHRlciIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJnZXRWaWV3RGF0YSIsImxpdmVNb2RlIiwic3lzdGVtIiwicGhvbmUiLCJvRHluYW1pY1BhZ2UiLCJieUlkIiwic2V0SGVhZGVyRXhwYW5kZWQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJvQ29udHJvbGxlciIsInNPdXRib3VuZFRhcmdldCIsIm9Db250ZXh0Iiwic0NyZWF0ZVBhdGgiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJnZXRDb250ZW50Iiwib1RhYmxlIiwiX2dldFRhYmxlIiwiYURhdGEiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0IiwiQ2hhcnRVdGlscyIsInNldENoYXJ0RmlsdGVycyIsIm9uU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsImtleSIsIm9DaGFydCIsIm9TZWdtZW50ZWRCdXR0b25EZWxlZ2F0ZSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJhSXRlbXMiLCJvU2VnbWVudGVkQnV0dG9uIiwiZ2V0SXRlbXMiLCJvSXRlbSIsImdldEtleSIsImZvY3VzIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9nZXRTZWdtZW50ZWRCdXR0b24iLCJhZGRFdmVudERlbGVnYXRlIiwiX3VwZGF0ZVRhYmxlIiwiX3VwZGF0ZUNoYXJ0IiwiSHlicmlkIiwib25GaWx0ZXJzU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsInNldFZpc2libGUiLCJvblN0YXRlQ2hhbmdlZCIsImZvcm1hdHRlcnMiLCJzZXRUYWJNZXNzYWdlU3RyaXAiLCJhSWdub3JlZEZpZWxkcyIsInNUYWJUaXRsZSIsImJJc0NoYXJ0Iiwib0FwcGx5U3VwcG9ydGVkIiwic1RleHQiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJzRmlsdGVyQmFyRW50aXR5UGF0aCIsIm9NZXRhTW9kZWwiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJhSWdub3JlZExhYmVscyIsIm1hcCIsInNQcm9wZXJ0eSIsIm9NYWNyb1Jlc291cmNlQnVuZGxlIiwiZ2V0VGV4dCIsInNMYWJlbCIsImdldE9iamVjdCIsIkRlbGVnYXRlVXRpbCIsImdldExvY2FsaXplZFRleHQiLCJiSXNTZWFyY2hJZ25vcmVkIiwiZW5hYmxlU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJnZXRNZXNzYWdlU3RyaXBUZXh0IiwiZXh0ZW5zaW9uQVBJIiwiRXh0ZW5zaW9uQVBJIiwib25Jbml0IiwiUGFnZUNvbnRyb2xsZXIiLCJwcm90b3R5cGUiLCJvTXVsdGlNb2RlVGFiIiwic2VsZWN0ZWQiLCJvVXBkYXRlQ291bnRzIiwiX3VwZGF0ZUNvdW50cyIsImFkZEV2ZW50VG9CaW5kaW5nSW5mbyIsIl9oYXNNdWx0aVZpc3VhbGl6YXRpb25zIiwiYWxwQ29udGVudFZpZXciLCJfZ2V0RGVmYXVsdFBhdGgiLCJkZXNrdG9wIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJ3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24iLCJvbkV4aXQiLCJfb0xpc3RSZXBvcnRDb250cm9sIiwiZGVzdHJveSIsImFUYWJsZXMiLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5Iiwib1RhYmxlQmluZGluZyIsIl9nZXRUYWJsZUJpbmRpbmciLCJzVXBkYXRlVGltZXIiLCJyZWZyZXNoIiwiZm5VcGRhdGVUYWJsZUFjdGlvbnMiLCJfdXBkYXRlVGFibGVBY3Rpb25zIiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwic2V0RWRpdFN0YXRlUHJvY2Vzc2VkIiwicGFnZVJlYWR5Iiwid2FpdEZvciIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJvbkJlZm9yZVJlbmRlcmluZyIsImdldFJlc291cmNlQnVuZGxlIiwicmVzcG9uc2UiLCJzRW50aXR5U2V0IiwiZW50aXR5U2V0IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJzZXROb0RhdGFUZXh0Iiwib25QYWdlUmVhZHkiLCJmb3JjZUZvY3VzIiwiZ2V0U2hvd01lc3NhZ2VzIiwic2V0U2hvd01lc3NhZ2VzIiwic2V0Rm9jdXNPbkZpcnN0RXJyb25lb3VzRmllbGQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJfc0VudGl0eVNldCIsInNsaWNlIiwiYUlCTkFjdGlvbnMiLCJnZXRJQk5BY3Rpb25zIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkpTT04iLCJwYXJzZSIsIkNvbW1vbkhlbHBlciIsInBhcnNlQ3VzdG9tRGF0YSIsImdldEN1c3RvbURhdGEiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwib1RpdGxlSW5mbyIsInRpdGxlIiwic3VidGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiTGlzdFJlcG9ydFRpdGxlIiwiTGlzdFJlcG9ydFN1YnRpdGxlIiwiX2dldEZpbHRlckJhckNvbnRyb2xJZCIsInNDb250cm9sIiwiX2dldFNlZ21lbnRlZEJ1dHRvbklkIiwiX2dldENoYXJ0Q29udHJvbElkIiwiX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2wiLCJfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbElkIiwiX2dldFRhYmxlQ29udHJvbElkIiwic1RhYmxlSWQiLCJvVGFibGVDb250cm9sIiwib0JpbmRpbmciLCJfZ2V0Um93QmluZGluZyIsInNLZXkiLCJvVGFiTXVsdGlNb2RlIiwiaW5kZXhPZiIsInB1c2giLCJkZWZhdWx0UGF0aCIsIl9iTXVsdGlNb2RlIiwiX2lzTXVsdGlFbnRpdHlTZXRzIiwiX3NldFNoYXJlTW9kZWwiLCJmbkdldFVzZXIiLCJPYmplY3RQYXRoIiwiZ2V0Iiwib1NoYXJlSW5mbyIsImJvb2ttYXJrVGl0bGUiLCJkb2N1bWVudCIsImJvb2ttYXJrQ3VzdG9tVXJsIiwic0hhc2giLCJoYXNoZXIiLCJnZXRIYXNoIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwiaXNTaGFyZUluSmFtQWN0aXZlIiwiaXNKYW1BY3RpdmUiLCJvVGVtcGxhdGVQcml2YXRlTW9kZWwiLCJnZXRPd25lckNvbXBvbmVudCIsInNEaXNwbGF5Q29udHJvbElkIiwic0NvbnRyb2xJZCIsIm1DYWNoZSIsImlnbm9yZWRGaWVsZHMiLCJpZ25vcmVkRmllbGRzVGl0bGUiLCJhQ2hhcnRzIiwic1RhYmxlRW50aXR5UGF0aCIsInNUYWJsZUVudGl0eVNldCIsInNUYWJJZCIsImdldFBhcmVudCIsInNDYWNoZUtleSIsImdldE5vdEFwcGxpY2FibGVGaWx0ZXJzIiwiY2FsbCIsInNDaGFydEVudGl0eVBhdGgiLCJzQ2hhcnRFbnRpdHlTZXQiLCJfdXBkYXRlTXVsdGlNb2RlQ291bnRzIiwiYUJpbmRpbmdQcm9taXNlcyIsImFDb21wbGlhbnRUYWJzIiwiY29udHJvbCIsIml0ZW0iLCJtVGFiIiwic2V0Q291bnQiLCJvRmlsdGVySW5mb3MiLCJUYWJsZVV0aWxzIiwiZ2V0RmlsdGVyc0luZm9Gb3JTViIsImdldExpc3RCaW5kaW5nRm9yQ291bnQiLCJiYXRjaEdyb3VwSWQiLCJhZGRpdGlvbmFsRmlsdGVycyIsImZpbHRlcnMiLCJQcm9taXNlIiwiYWxsIiwiYUNvdW50cyIsImsiLCJnZXRDb3VudEZvcm1hdHRlZCIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImhpZGVGaWx0ZXJCYXIiLCJpbml0aWFsTG9hZCIsIkF1dG8iLCJnZXRTdGFuZGFyZFZhcmlhbnRLZXkiLCJnZXRDdXJyZW50VmFyaWFudEtleSIsIm9Db25kaXRpb25zIiwic3RhcnRzV2l0aCIsImlzVGFibGVCb3VuZCIsImlzQm91bmQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbURBLE1BQU1BLG1CQUFtQixHQUFHQyxXQUFXLENBQUNELG1CQUF4QztBQUFBLE1BQ0NFLGVBQWUsR0FBR0QsV0FBVyxDQUFDQyxlQUQvQjtNQUlNQyxvQixXQURMQyxjQUFjLENBQUMsa0RBQUQsQyxVQUViQyxjQUFjLENBQ2RDLGVBQWUsQ0FBQ0MsUUFBaEIsQ0FBeUI7QUFDeEJDLElBQUFBLGNBQWMsRUFBRSxZQUFpQztBQUMvQyxXQUFLQyxPQUFMLEdBQWVDLGFBQWYsRUFBRCxDQUF5REMsZUFBekQ7QUFDQTtBQUh1QixHQUF6QixDQURjLEMsVUFRZE4sY0FBYyxDQUNkTyw2QkFBNkIsQ0FBQ0wsUUFBOUIsQ0FBdUM7QUFDdENNLElBQUFBLFlBQVksRUFBRSxZQUErQztBQUM1RCxhQUFRLEtBQUtDLElBQU4sQ0FBb0NDLG1CQUFwQyxFQUFQO0FBQ0E7QUFIcUMsR0FBdkMsQ0FEYyxDLFVBUWRWLGNBQWMsQ0FBQ1csV0FBRCxDLFVBR2RYLGNBQWMsQ0FBQ1kscUJBQXFCLENBQUNWLFFBQXRCLENBQStCVyw2QkFBL0Is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QixLQUE5QjtBQUNBO0FBQ0QsSzs7O0lBdHBCaUNzRixjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0F1N0JwQnpNLG9CIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IER5bmFtaWNQYWdlIGZyb20gXCJzYXAvZi9EeW5hbWljUGFnZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9FZGl0Rmxvd1wiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBLUElNYW5hZ2VtZW50IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9LUElNYW5hZ2VtZW50XCI7XG5pbXBvcnQgTWFzc0VkaXQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01hc3NFZGl0XCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NpZGVFZmZlY3RzXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCBGaWx0ZXJCYXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0ZpbHRlckJhclwiO1xuaW1wb3J0IHtcblx0ZGVmaW5lVUk1Q2xhc3MsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRwcml2YXRlRXh0ZW5zaW9uLFxuXHRwdWJsaWNFeHRlbnNpb24sXG5cdHVzaW5nRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IENoYXJ0UnVudGltZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFJ1bnRpbWVcIjtcbmltcG9ydCBDaGFydFV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NoYXJ0L0NoYXJ0VXRpbHNcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IEZpbHRlclV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBFZGl0Rmxvd092ZXJyaWRlcyBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9Sb290Q29udGFpbmVyL292ZXJyaWRlcy9FZGl0Rmxvd1wiO1xuaW1wb3J0IFRhYmxlU2Nyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvVGFibGVTY3JvbGxlclwiO1xuaW1wb3J0IEljb25UYWJCYXIgZnJvbSBcInNhcC9tL0ljb25UYWJCYXJcIjtcbmltcG9ydCBTZWdtZW50ZWRCdXR0b24gZnJvbSBcInNhcC9tL1NlZ21lbnRlZEJ1dHRvblwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHsgc3lzdGVtIH0gZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCBDb250cm9sUGVyc29uYWxpemF0aW9uV3JpdGVBUEkgZnJvbSBcInNhcC91aS9mbC93cml0ZS9hcGkvQ29udHJvbFBlcnNvbmFsaXphdGlvbldyaXRlQVBJXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgaGFzaGVyIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9oYXNoZXJcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuY29uc3QgVGVtcGxhdGVDb250ZW50VmlldyA9IENvcmVMaWJyYXJ5LlRlbXBsYXRlQ29udGVudFZpZXcsXG5cdEluaXRpYWxMb2FkTW9kZSA9IENvcmVMaWJyYXJ5LkluaXRpYWxMb2FkTW9kZTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0Lkxpc3RSZXBvcnRDb250cm9sbGVyXCIpXG5jbGFzcyBMaXN0UmVwb3J0Q29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsUm91dGluZy5vdmVycmlkZSh7XG5cdFx0XHRvbkFmdGVyQmluZGluZzogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsUm91dGluZykge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIExpc3RSZXBvcnRDb250cm9sbGVyKS5fb25BZnRlckJpbmRpbmcoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9yb3V0aW5nITogSW50ZXJuYWxSb3V0aW5nO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0RW50aXR5U2V0OiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmJhc2UgYXMgTGlzdFJlcG9ydENvbnRyb2xsZXIpLmdldEN1cnJlbnRFbnRpdHlTZXQoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFNpZGVFZmZlY3RzKVxuXHRzaWRlRWZmZWN0cyE6IFNpZGVFZmZlY3RzO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUpKVxuXHRpbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFNoYXJlLm92ZXJyaWRlKFNoYXJlT3ZlcnJpZGVzKSlcblx0c2hhcmUhOiBTaGFyZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oRWRpdEZsb3cub3ZlcnJpZGUoRWRpdEZsb3dPdmVycmlkZXMpKVxuXHRlZGl0RmxvdyE6IEVkaXRGbG93O1xuXG5cdEB1c2luZ0V4dGVuc2lvbihWaWV3U3RhdGUub3ZlcnJpZGUoVmlld1N0YXRlT3ZlcnJpZGVzKSlcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihLUElNYW5hZ2VtZW50KVxuXHRrcGlNYW5hZ2VtZW50ITogS1BJTWFuYWdlbWVudDtcblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRwbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oTWFzc0VkaXQpXG5cdG1hc3NFZGl0ITogTWFzc0VkaXQ7XG5cdHByaXZhdGUgZXh0ZW5zaW9uQVBJPzogRXh0ZW5zaW9uQVBJO1xuXHRwcml2YXRlIF9vTGlzdFJlcG9ydENvbnRyb2w/OiBDb250cm9sO1xuXHRwcml2YXRlIGZpbHRlckJhckNvbmRpdGlvbnM/OiBhbnk7XG5cdHByaXZhdGUgX2JNdWx0aU1vZGU/OiBib29sZWFuO1xuXHRwcml2YXRlIHNVcGRhdGVUaW1lcj86IGFueTtcblx0cHJpdmF0ZSBvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblx0cHJpdmF0ZSBfc0VudGl0eVNldD86IHN0cmluZztcblx0cHJpdmF0ZSBoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBoYXNQZW5kaW5nVGFibGVDaGFuZ2VzPzogYm9vbGVhbjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKCk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdH1cblxuXHRvbkluaXQoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uSW5pdC5hcHBseSh0aGlzKTtcblx0XHRjb25zdCBhQ29udHJvbHMgPSB0aGlzLl9nZXRDb250cm9scygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdGNvbnN0IG9NdWx0aU1vZGVUYWIgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJ0YWJzXCIsIHtcblx0XHRcdFx0c2VsZWN0ZWQ6IG9NdWx0aU1vZGVUYWIuZ2V0U2VsZWN0ZWRLZXkoKSB8fCAob011bHRpTW9kZVRhYi5nZXRJdGVtcygpWzBdIGFzIGFueSkuZ2V0S2V5KClcblx0XHRcdH0pO1xuXHRcdFx0YUNvbnRyb2xzLmZvckVhY2goKG9Db250cm9sOiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb1VwZGF0ZUNvdW50cyA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVDb3VudHMoKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Q29tbW9uVXRpbHMuYWRkRXZlbnRUb0JpbmRpbmdJbmZvKG9Db250cm9sLCBcImRhdGFSZXF1ZXN0ZWRcIiwgb1VwZGF0ZUNvdW50cyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly9UT0RPOiBUaGlzIGlzIG9ubHkgYSB0ZW1wb3JhcnkgYXBwcm9hY2ggYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIGFwcCBzdGF0ZSBiZWhhdmlvdXIgaXMgZmluYWxpemVkLlxuXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYXBwbGllZEZpbHRlcnNcIiwgXCJcIik7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGlkZURyYWZ0SW5mb1wiLCBmYWxzZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidW9tXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzY2FsZWZhY3RvclwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JOdW1iZXJcIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImN1cnJlbmN5XCIsIHt9KTtcblxuXHRcdGlmICh0aGlzLl9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCkpIHtcblx0XHRcdGxldCBhbHBDb250ZW50VmlldyA9IHRoaXMuX2dldERlZmF1bHRQYXRoKCk7XG5cdFx0XHRpZiAoIXN5c3RlbS5kZXNrdG9wICYmIGFscENvbnRlbnRWaWV3ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZCkge1xuXHRcdFx0XHRhbHBDb250ZW50VmlldyA9IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ7XG5cdFx0XHR9XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhbHBDb250ZW50Vmlld1wiLCBhbHBDb250ZW50Vmlldyk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgY29uZGl0aW9ucyBmcm9tIGZpbHRlciBiYXJcblx0XHQvLyB0aGlzIGlzIGxhdGVyIHVzZWQgYmVmb3JlIG5hdmlnYXRpb24gdG8gZ2V0IGNvbmRpdGlvbnMgYXBwbGllZCBvbiB0aGUgZmlsdGVyIGJhclxuXHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IHt9O1xuXG5cdFx0Ly8gQXMgQXBwU3RhdGVIYW5kbGVyLmFwcGx5QXBwU3RhdGUgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IHdpbGxcblx0XHQvLyBoYXBwZW4gYWZ0ZXIgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgaGFzIGJlZW4gcHJvY2Vzc2VkIChvdGhlcndpc2UgdGhlIHJvdXRlciBnZXRzIGJyb2tlbilcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHR0aGlzLl9pc011bHRpTW9kZSgpICYmIHRoaXMuX3VwZGF0ZU11bHRpQ29udHJvbEhpZGRlblN0YXR1cygpO1xuXHR9XG5cblx0b25FeGl0KCkge1xuXHRcdGRlbGV0ZSB0aGlzLmZpbHRlckJhckNvbmRpdGlvbnM7XG5cdFx0ZGVsZXRlIHRoaXMuX29MaXN0UmVwb3J0Q29udHJvbDtcblx0XHR0aGlzLmV4dGVuc2lvbkFQSSAmJiB0aGlzLmV4dGVuc2lvbkFQSS5kZXN0cm95KCk7XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHR9XG5cblx0X29uQWZ0ZXJCaW5kaW5nKCkge1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpO1xuXHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKCk7XG5cdFx0XHRpZiAob1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRpZiAoIXRoaXMuc1VwZGF0ZVRpbWVyKSB7XG5cdFx0XHRcdFx0dGhpcy5zVXBkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0Q291bnRzT3V0RGF0ZWQoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ291bnRzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5zVXBkYXRlVGltZXI7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVcGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYW5kIHZpc2liaWxpdHkgdXBvbiB0YWJsZSBkYXRhIHVwZGF0ZS5cblx0XHRcdFx0Y29uc3QgZm5VcGRhdGVUYWJsZUFjdGlvbnMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXMpO1xuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0b1RhYmxlQmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVUYWJsZUFjdGlvbnMpO1xuXHRcdFx0fVxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZVByb2Nlc3NlZCgpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhZ2VSZWFkeS53YWl0Rm9yKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0QXBwU3RhdGVIYW5kbGVyKCkuYXBwbHlBcHBTdGF0ZSgpKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0KCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHQudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IHJlc3BvbnNlO1xuXHRcdFx0XHRjb25zdCBhQ29udHJvbHMgPSB0aGlzLl9nZXRDb250cm9scygpO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJUX1RBQkxFX0FORF9DSEFSVF9OT19EQVRBX1RFWFRcIixcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSBhcyBSZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdG9Db250cm9sLnNldE5vRGF0YVRleHQoc1RleHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBhZ2VSZWFkeShtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Ly8gRW5hYmxpbmcgbWFuZGF0b3J5IGZpbHRlciBmaWVsZHMgbWVzc2FnZSBkaWFsb2cgYW5kIGZvY3VzaW5nIG9uIHRoZW1cblx0XHRpZiAobVBhcmFtZXRlcnMuZm9yY2VGb2N1cykge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblxuXHRcdFx0aWYgKG9GaWx0ZXJCYXIgJiYgIW9GaWx0ZXJCYXIuZ2V0U2hvd01lc3NhZ2VzKCkpIHtcblx0XHRcdFx0b0ZpbHRlckJhci5zZXRTaG93TWVzc2FnZXModHJ1ZSk7XG5cdFx0XHRcdChvRmlsdGVyQmFyIGFzIGFueSkuc2V0Rm9jdXNPbkZpcnN0RXJyb25lb3VzRmllbGQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGhhbmRsZXIgb24gYmFjayBuYXZpZ2F0aW9uIHRoYXQgZGlzcGxheXMgRHJhZnQgY29uZmlybWF0aW9uXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnQgb2YgYSBsaXN0IHJlcG9ydCB2aWV3IG5lZWRzIHRvIGJlIHJlZnJlc2hlZC5cblx0ICogVGhpcyBoYXBwZW5zIGVpdGhlciB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIG9uIHRoZSBGaWx0ZXJCYXIgYW5kIHRoZSBzZWFyY2ggaXMgdHJpZ2dlcmVkLFxuXHQgKiBvciB3aGVuIGEgdGFiIHdpdGggY3VzdG9tIGNvbnRlbnQgaXMgc2VsZWN0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge21hcH0gbVBhcmFtZXRlcnMgTWFwIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBjb25kaXRpb25zIG9mIHRoZSBGaWx0ZXJCYXIsIHRoZSBjdXJyZW50VGFiSURcblx0ICogYW5kIHRoZSB2aWV3IHJlZnJlc2ggY2F1c2UgKHRhYkNoYW5nZWQgb3Igc2VhcmNoKS5cblx0ICogVGhlIG1hcCBsb29rcyBsaWtlIHRoaXM6XG5cdCAqIDxjb2RlPjxwcmU+XG5cdCAqIFx0e1xuXHQgKiBcdFx0ZmlsdGVyQ29uZGl0aW9uczoge1xuXHQgKiBcdFx0XHRDb3VudHJ5OiBbXG5cdCAqIFx0XHRcdFx0e1xuXHQgKiBcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIlxuXHQgKlx0XHRcdFx0XHR2YWxpZGF0ZWQ6IFwiTm90VmFsaWRhdGVkXCJcblx0ICpcdFx0XHRcdFx0dmFsdWVzOiBbXCJHZXJtYW55XCIsIC4uLl1cblx0ICogXHRcdFx0XHR9LFxuXHQgKiBcdFx0XHRcdC4uLlxuXHQgKiBcdFx0XHRdXG5cdCAqIFx0XHRcdC4uLlxuXHQgKiBcdFx0fSxcblx0ICpcdFx0Y3VycmVudFRhYklkOiBcImZlOjpDdXN0b21UYWI6OnRhYjFcIixcblx0ICpcdFx0cmVmcmVzaENhdXNlOiBcInRhYkNoYW5nZWRcIiB8IFwic2VhcmNoXCJcblx0ICpcdH1cblx0ICogPC9wcmU+PC9jb2RlPlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25WaWV3TmVlZHNSZWZyZXNoKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvKiBUbyBiZSBvdmVycmlkZW4gKi9cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBmaWx0ZXIgb3Igc2VhcmNoIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIEZpbHRlckJhcixcblx0ICogYnV0IGhhcyBub3QgYmVlbiB2YWxpZGF0ZWQgeWV0IGJ5IHRoZSBlbmQgdXNlciAod2l0aCB0aGUgJ0dvJyBvciAnU2VhcmNoJyBidXR0b24pLlxuXHQgKiBUeXBpY2FsbHksIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IHRhYiBpcyBncmV5ZWQgb3V0IHVudGlsIHRoZSBmaWx0ZXJzIGFyZSB2YWxpZGF0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGVuZGluZ0ZpbHRlcnMoKSB7XG5cdFx0LyogVG8gYmUgb3ZlcnJpZGVuICovXG5cdH1cblxuXHRnZXRDdXJyZW50RW50aXR5U2V0KCkge1xuXHRcdGlmICghdGhpcy5fc0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgb0Rpc3BsYXllZENvbnRyb2wgPSAodGhpcy5faXNNdWx0aU1vZGUoKSAmJiB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpKSB8fCB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0dGhpcy5fc0VudGl0eVNldCA9IG9EaXNwbGF5ZWRDb250cm9sPy5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIikuc2xpY2UoMSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9zRW50aXR5U2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYXRlcyB0aGUgdXBkYXRlIG9mIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JJQk4gYnV0dG9ucy5cblx0ICogQHBhcmFtIGFUYWJsZXMgQXJyYXkgb2YgdGFibGVzIGluIHRoZSBsaXN0IHJlcG9ydFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzOiBhbnkpIHtcblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gVXBkYXRlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiBEYXRhRmllbGRGb3JBY3Rpb24gYnV0dG9ucyBvbiB0YWJsZSB0b29sYmFyXG5cdFx0XHQvLyBUaGUgc2FtZSBpcyBhbHNvIHBlcmZvcm1lZCBvbiBUYWJsZSBzZWxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpLFxuXHRcdFx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpIGFzIGFueVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyA9IG9UYWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCk7XG5cblx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIHRvIGEgc3BlY2lmaWMgcm93IG9uIGFsbCB0aGUgYXZhaWxhYmxlIHRhYmxlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyI19zY3JvbGxUYWJsZXNUb1Jvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Jvd1BhdGggVGhlIHBhdGggb2YgdGhlIHRhYmxlIHJvdyBjb250ZXh0IHRvIGJlIHNjcm9sbGVkIHRvXG5cdCAqL1xuXHRfc2Nyb2xsVGFibGVzVG9Sb3coc1Jvd1BhdGg6IHN0cmluZykge1xuXHRcdHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIikuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhvVGFibGUsIHNSb3dQYXRoKTtcblx0XHR9KTtcblx0fVxuXG5cdF9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpIHtcblx0XHRjb25zdCBvVGl0bGVJbmZvID0geyB0aXRsZTogXCJcIiwgc3VidGl0bGU6IFwiXCIsIGludGVudDogXCJcIiwgaWNvbjogXCJcIiB9O1xuXHRcdG9UaXRsZUluZm8udGl0bGUgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YSgpLkxpc3RSZXBvcnRUaXRsZTtcblx0XHRvVGl0bGVJbmZvLnN1YnRpdGxlID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoKS5MaXN0UmVwb3J0U3VidGl0bGU7XG5cdFx0cmV0dXJuIG9UaXRsZUluZm87XG5cdH1cblxuXHRfZ2V0RmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKSkgYXMgRmlsdGVyQmFyO1xuXHR9XG5cblx0X2dldFNlZ21lbnRlZEJ1dHRvbihzQ29udHJvbDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uSWQoc0NvbnRyb2wpKTtcblx0fVxuXG5cdF9nZXRTZWdtZW50ZWRCdXR0b25JZChzQ29udHJvbDogYW55KSB7XG5cdFx0aWYgKHNDb250cm9sID09PSBcIkNoYXJ0XCIpIHtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRDaGFydCgpLmRhdGEoXCJzZWdtZW50ZWRCdXR0b25JZFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRhYmxlKCk/LmRhdGEoXCJzZWdtZW50ZWRCdXR0b25JZFwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0RmlsdGVyQmFyQ29udHJvbElkKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcImZpbHRlckJhcklkXCIpO1xuXHR9XG5cblx0X2dldENoYXJ0Q29udHJvbElkKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcInNpbmdsZUNoYXJ0SWRcIik7XG5cdH1cblxuXHRnZXRDaGFydENvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0Q2hhcnRDb250cm9sSWQoKSk7XG5cdH1cblxuXHRfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sSWQoKSk7XG5cdH1cblxuXHRfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbElkKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcInZpc3VhbEZpbHRlckJhcklkXCIpO1xuXHR9XG5cblx0X2dldE11bHRpTW9kZUNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6VGFiTXVsdGlwbGVNb2RlXCIpIGFzIEljb25UYWJCYXI7XG5cdH1cblxuXHRfZ2V0VGFibGVDb250cm9sSWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwic2luZ2xlVGFibGVJZFwiKTtcblx0fVxuXG5cdF9nZXRDdXJyZW50Q29udHJvbCgpOiBDb250cm9sIHtcblx0XHRpZiAoIXRoaXMuX29MaXN0UmVwb3J0Q29udHJvbCkge1xuXHRcdFx0Y29uc3Qgb011bHRpTW9kZVRhYiA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRcdHRoaXMuX29MaXN0UmVwb3J0Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQoXG5cdFx0XHRcdG9NdWx0aU1vZGVUYWIuZ2V0U2VsZWN0ZWRLZXkoKSB8fCAob011bHRpTW9kZVRhYi5nZXRJdGVtcygpWzBdIGFzIGFueSkuZ2V0S2V5KClcblx0XHRcdCkgYXMgQ29udHJvbDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX29MaXN0UmVwb3J0Q29udHJvbCBhcyBDb250cm9sO1xuXHR9XG5cblx0X2dldFRhYmxlKCk6IFRhYmxlIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2wgPSB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpO1xuXHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgPyAob0NvbnRyb2wgYXMgVGFibGUpIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRUYWJsZUNvbnRyb2xJZCgpKSBhcyBUYWJsZTtcblx0fVxuXG5cdF9nZXRDaGFydCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRDaGFydENvbnRyb2xJZCgpKTtcblx0fVxuXG5cdF9nZXRUYWJsZUJpbmRpbmcoc1RhYmxlSWQ/OiBhbnkpIHtcblx0XHRjb25zdCBvVGFibGVDb250cm9sID0gc1RhYmxlSWQgPyB0aGlzLmdldFZpZXcoKS5ieUlkKHNUYWJsZUlkKSA6IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvVGFibGVDb250cm9sICYmIChvVGFibGVDb250cm9sIGFzIGFueSkuX2dldFJvd0JpbmRpbmcoKTtcblxuXHRcdHJldHVybiBvQmluZGluZztcblx0fVxuXG5cdF9nZXRDb250cm9scyhzS2V5PzogYW55KSB7XG5cdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdGNvbnN0IGFDb250cm9sczogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IG9UYWJNdWx0aU1vZGUgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0XHRvVGFiTXVsdGlNb2RlLmdldEl0ZW1zKCkuZm9yRWFjaCgob0l0ZW06IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQob0l0ZW0uZ2V0S2V5KCkpO1xuXHRcdFx0XHRpZiAoc0tleSkge1xuXHRcdFx0XHRcdGlmIChvSXRlbS5nZXRLZXkoKS5pbmRleE9mKFwiZmU6OlwiICsgc0tleSkgPiAtMSkge1xuXHRcdFx0XHRcdFx0b0NvbnRyb2wgJiYgYUNvbnRyb2xzLnB1c2gob0NvbnRyb2wpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvQ29udHJvbCAmJiBhQ29udHJvbHMucHVzaChvQ29udHJvbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFDb250cm9scztcblx0XHR9IGVsc2UgaWYgKHNLZXkgPT09IFwiQ2hhcnRcIikge1xuXHRcdFx0Y29uc3Qgb0NoYXJ0ID0gdGhpcy5fZ2V0Q2hhcnQoKTtcblx0XHRcdHJldHVybiBvQ2hhcnQgPyBbb0NoYXJ0XSA6IFtdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0cmV0dXJuIG9UYWJsZSA/IFtvVGFibGVdIDogW107XG5cdFx0fVxuXHR9XG5cblx0X2dldERlZmF1bHRQYXRoKCkge1xuXHRcdGNvbnN0IGRlZmF1bHRQYXRoID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJkZWZhdWx0UGF0aFwiKTtcblx0XHRzd2l0Y2ggKGRlZmF1bHRQYXRoKSB7XG5cdFx0XHRjYXNlIFwicHJpbWFyeVwiOlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydDtcblx0XHRcdGNhc2UgXCJzZWNvbmRhcnlcIjpcblx0XHRcdFx0cmV0dXJuIFRlbXBsYXRlQ29udGVudFZpZXcuVGFibGU7XG5cdFx0XHRjYXNlIFwiYm90aFwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFRlbXBsYXRlQ29udGVudFZpZXcuSHlicmlkO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8ga25vdyBpZiBMaXN0UmVwb3J0IGlzIGNvbmZpZ3VyZWQgd2l0aCBNdWx0aXBsZSBUYWJsZSBtb2RlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2lzTXVsdGlNb2RlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBJcyBNdWx0aXBsZSBUYWJsZSBtb2RlIHNldD9cblx0ICovXG5cdF9pc011bHRpTW9kZSgpIHtcblx0XHRpZiAoIXRoaXMuX29MaXN0UmVwb3J0Q29udHJvbCkge1xuXHRcdFx0dGhpcy5fYk11bHRpTW9kZSA9ICEhdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fYk11bHRpTW9kZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8ga25vdyBpZiBMaXN0UmVwb3J0IGlzIGNvbmZpZ3VyZWQgd2l0aCBNdWx0aXBsZSBFbnRpdHlTZXRzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2lzTXVsdGlFbnRpdHlTZXRzXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBJcyBNdWx0aXBsZSBFbnRpdHlTZXRzIGNvbmZpZ3VyYXRpb24/XG5cdCAqL1xuXHRfaXNNdWx0aUVudGl0eVNldHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwiaXNNdWx0aUVudGl0eVNldHNcIikgPT09IFwidHJ1ZVwiO1xuXHR9XG5cblx0X2hhc011bHRpVmlzdWFsaXphdGlvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwiaGFzTXVsdGlWaXN1YWxpemF0aW9uc1wiKSA9PT0gXCJ0cnVlXCI7XG5cdH1cblxuXHRfc2V0U2hhcmVNb2RlbCgpIHtcblx0XHQvLyBUT0RPOiBkZWFjdGl2YXRlZCBmb3Igbm93IC0gY3VycmVudGx5IHRoZXJlIGlzIG5vIF90ZW1wbFByaXYgYW55bW9yZSwgdG8gYmUgZGlzY3Vzc2VkXG5cdFx0Ly8gdGhpcyBtZXRob2QgaXMgY3VycmVudGx5IG5vdCBjYWxsZWQgYW55bW9yZSBmcm9tIHRoZSBpbml0IG1ldGhvZFxuXG5cdFx0Y29uc3QgZm5HZXRVc2VyID0gT2JqZWN0UGF0aC5nZXQoXCJzYXAudXNoZWxsLkNvbnRhaW5lci5nZXRVc2VyXCIpO1xuXHRcdC8vdmFyIG9NYW5pZmVzdCA9IHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhZGF0YSgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAudWlcIik7XG5cdFx0Ly92YXIgc0Jvb2ttYXJrSWNvbiA9IChvTWFuaWZlc3QgJiYgb01hbmlmZXN0Lmljb25zICYmIG9NYW5pZmVzdC5pY29ucy5pY29uKSB8fCBcIlwiO1xuXG5cdFx0Ly9zaGFyZU1vZGVsOiBIb2xkcyBhbGwgdGhlIHNoYXJpbmcgcmVsZXZhbnQgaW5mb3JtYXRpb24gYW5kIGluZm8gdXNlZCBpbiBYTUwgdmlld1xuXHRcdGNvbnN0IG9TaGFyZUluZm8gPSB7XG5cdFx0XHRib29rbWFya1RpdGxlOiBkb2N1bWVudC50aXRsZSwgLy9UbyBuYW1lIHRoZSBib29rbWFyayBhY2NvcmRpbmcgdG8gdGhlIGFwcCB0aXRsZS5cblx0XHRcdGJvb2ttYXJrQ3VzdG9tVXJsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IHNIYXNoID0gaGFzaGVyLmdldEhhc2goKTtcblx0XHRcdFx0cmV0dXJuIHNIYXNoID8gXCIjXCIgKyBzSGFzaCA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0fSxcblx0XHRcdC8qXG5cdFx0XHRcdFx0XHRcdFRvIGJlIGFjdGl2YXRlZCBvbmNlIHRoZSBGTFAgc2hvd3MgdGhlIGNvdW50IC0gc2VlIGNvbW1lbnQgYWJvdmVcblx0XHRcdFx0XHRcdFx0Ym9va21hcmtTZXJ2aWNlVXJsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHQvL3ZhciBvVGFibGUgPSBvVGFibGUuZ2V0SW5uZXJUYWJsZSgpOyBvVGFibGUgaXMgYWxyZWFkeSB0aGUgc2FwLmZlIHRhYmxlIChidXQgbm90IHRoZSBpbm5lciBvbmUpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIHVzZSB0YWJsZS5nZXRMaXN0QmluZGluZ0luZm8gaW5zdGVhZCBvZiB0aGUgYmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdHZhciBvQmluZGluZyA9IG9UYWJsZS5nZXRCaW5kaW5nKFwicm93c1wiKSB8fCBvVGFibGUuZ2V0QmluZGluZyhcIml0ZW1zXCIpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQmluZGluZyA/IGZuR2V0RG93bmxvYWRVcmwob0JpbmRpbmcpIDogXCJcIjtcblx0XHRcdFx0XHRcdFx0fSwqL1xuXHRcdFx0aXNTaGFyZUluSmFtQWN0aXZlOiAhIWZuR2V0VXNlciAmJiBmbkdldFVzZXIoKS5pc0phbUFjdGl2ZSgpXG5cdFx0fTtcblxuXHRcdGNvbnN0IG9UZW1wbGF0ZVByaXZhdGVNb2RlbCA9IHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRNb2RlbChcIl90ZW1wbFByaXZcIikgYXMgSlNPTk1vZGVsO1xuXHRcdG9UZW1wbGF0ZVByaXZhdGVNb2RlbC5zZXRQcm9wZXJ0eShcIi9saXN0UmVwb3J0L3NoYXJlXCIsIG9TaGFyZUluZm8pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhpZGRlbiB0YWJsZXMgbXVzdCBiZSBtYXJrZWQgYXMgaGlkZGVuIHRvIGF2b2lkIHNlbmRpbmdcblx0ICogcmVxdWVzdHMgd2hlbiBGaWx0ZXJCYXIgaXMgY2hhbmdlZCBvciBMUiBpcyBpbml0aWFsaXplZFxuXHQgKiBCZXN0IHdvcmtmbG93IHdvdWxkIGJlIHRvIHN1c3BlbmQgdGFibGUgYmluZGluZyBidXRcblx0ICogaWYgdGhlIHVzZXIgc3dpdGNoIHF1aWNrbHkgYmV0d2VlbiB0YWJzIHRoZSBiYXRjaCByZXNwb25zZSBvZiBwcmV2aW91c1xuXHQgKiBpcyByZWNlaXZlZCB3aGVuIHByZXZpb3VzIHRhYiBpcyBhbHJlYWR5IGRpc2FibGVkIChiaW5kaW5nIGlzIHN1c3BlbmRlZCkgYW5kXG5cdCAqIGdlbmVyYXRlcyBlcnJvci5cblx0ICogQSB0ZW1wb3Jhcnkgc29sdXRpb24gKGlmIHdlIGZpbmQgYmV0dGVyIHdvcmtmbG93KSBpcyB0byBzZXQgYSBjdXN0b21EYXRhIGFuZCBkb24ndCB0cmlnZ2VyXG5cdCAqIHJlYmluZFRhYmxlIGlmIHRoaXMgY3VzdG9tRGF0YSBpcyBzZXQgdG8gdHJ1ZS5cblx0ICovXG5cdF91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMoKSB7XG5cdFx0Y29uc3Qgb0Rpc3BsYXllZENvbnRyb2wgPSB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpO1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpICYmIG9EaXNwbGF5ZWRDb250cm9sKSB7XG5cdFx0XHRjb25zdCBzRGlzcGxheUNvbnRyb2xJZCA9IG9EaXNwbGF5ZWRDb250cm9sLmdldElkKCk7XG5cdFx0XHRjb25zdCBhQ29udHJvbHMgPSB0aGlzLl9nZXRDb250cm9scygpO1xuXHRcdFx0YUNvbnRyb2xzLmZvckVhY2goZnVuY3Rpb24gKG9Db250cm9sOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc0NvbnRyb2xJZCA9IG9Db250cm9sLmdldElkKCk7XG5cdFx0XHRcdG9Db250cm9sLmRhdGEoXCJjb250cm9sSGlkZGVuXCIsIHNDb250cm9sSWQgIT09IHNEaXNwbGF5Q29udHJvbElkKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gdXBkYXRlIHRoZSBsb2NhbCBVSSBtb2RlbCBvZiB0aGUgcGFnZSB3aXRoIHRoZSBmaWVsZHMgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gdGhlIGZpbHRlciBiYXIgKHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhlIG11bHRpcGxlIHRhYmxlIHNjZW5hcmlvKS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwuY29udGV4dH0gb0ludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1kYy5GaWx0ZXJCYXJ9IG9GaWx0ZXJCYXIgTURDIGZpbHRlciBiYXJcblx0ICovXG5cdF91cGRhdGVNdWx0aVRhYk5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0OiBhbnksIG9GaWx0ZXJCYXI6IGFueSkge1xuXHRcdGNvbnN0IG1DYWNoZTogYW55ID0ge307XG5cdFx0Y29uc3QgaWdub3JlZEZpZWxkczogYW55ID0ge30sXG5cdFx0XHRpZ25vcmVkRmllbGRzVGl0bGU6IGFueSA9IHt9LFxuXHRcdFx0YVRhYmxlcyA9IHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIiksXG5cdFx0XHRhQ2hhcnRzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJDaGFydFwiKTtcblx0XHRhVGFibGVzLmZvckVhY2goKG9UYWJsZTogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzVGFibGVFbnRpdHlQYXRoID0gb1RhYmxlLmRhdGEoXCJ0YXJnZXRDb2xsZWN0aW9uUGF0aFwiKSxcblx0XHRcdFx0c1RhYmxlRW50aXR5U2V0ID0gc1RhYmxlRW50aXR5UGF0aC5zbGljZSgxKSxcblx0XHRcdFx0c1RhYklkID0gb1RhYmxlLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldEtleSgpLFxuXHRcdFx0XHRzVGFiVGl0bGUgPSBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0VGV4dCgpLFxuXHRcdFx0XHRzQ2FjaGVLZXkgPSBzVGFibGVFbnRpdHlTZXQgKyAob1RhYmxlLmRhdGEoXCJlbmFibGVBbmFseXRpY3NcIikgPT09IFwidHJ1ZVwiID8gXCJBbmFseXRpY2FsXCIgOiBcIlJlZ3VsYXJcIik7XG5cdFx0XHRpZiAoIW1DYWNoZVtzQ2FjaGVLZXldKSB7XG5cdFx0XHRcdG1DYWNoZVtzQ2FjaGVLZXldID0gRmlsdGVyVXRpbHMuZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMob0ZpbHRlckJhciwgb1RhYmxlKTtcblx0XHRcdH1cblx0XHRcdGlnbm9yZWRGaWVsZHNbc1RhYklkXSA9IG1DYWNoZVtzQ2FjaGVLZXldO1xuXHRcdFx0aWdub3JlZEZpZWxkc1RpdGxlW3NUYWJJZF0gPSB0aGlzLmZvcm1hdHRlcnMuc2V0VGFiTWVzc2FnZVN0cmlwLmNhbGwodGhpcywgbUNhY2hlW3NDYWNoZUtleV0sIHNUYWJUaXRsZSwgXCJmYWxzZVwiLCB7fSk7XG5cdFx0fSk7XG5cdFx0YUNoYXJ0cy5mb3JFYWNoKChvQ2hhcnQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgc0NoYXJ0RW50aXR5UGF0aCA9IG9DaGFydC5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIiksXG5cdFx0XHRcdHNDaGFydEVudGl0eVNldCA9IHNDaGFydEVudGl0eVBhdGguc2xpY2UoMSksXG5cdFx0XHRcdHNUYWJJZCA9IG9DaGFydC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRLZXkoKSxcblx0XHRcdFx0c1RhYlRpdGxlID0gb0NoYXJ0LmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFRleHQoKSxcblx0XHRcdFx0c0NhY2hlS2V5ID0gc0NoYXJ0RW50aXR5U2V0ICsgXCJDaGFydFwiO1xuXHRcdFx0aWYgKCFtQ2FjaGVbc0NhY2hlS2V5XSkge1xuXHRcdFx0XHRtQ2FjaGVbc0NhY2hlS2V5XSA9IEZpbHRlclV0aWxzLmdldE5vdEFwcGxpY2FibGVGaWx0ZXJzKG9GaWx0ZXJCYXIsIG9DaGFydCk7XG5cdFx0XHR9XG5cdFx0XHRpZ25vcmVkRmllbGRzW3NUYWJJZF0gPSBtQ2FjaGVbc0NhY2hlS2V5XTtcblx0XHRcdGlnbm9yZWRGaWVsZHNUaXRsZVtzVGFiSWRdID0gdGhpcy5mb3JtYXR0ZXJzLnNldFRhYk1lc3NhZ2VTdHJpcC5jYWxsKHRoaXMsIG1DYWNoZVtzQ2FjaGVLZXldLCBzVGFiVGl0bGUsIFwiZmFsc2VcIiwge30pO1xuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInRhYnMvaWdub3JlZEZpZWxkc1wiLCBpZ25vcmVkRmllbGRzKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJ0YWJzL2lnbm9yZWRGaWVsZHNUaXRsZVwiLCBpZ25vcmVkRmllbGRzVGl0bGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byB1cGRhdGUgdGhlIGxvY2FsIFVJIG1vZGVsIG9mIHRoZSBwYWdlIHdpdGggdGhlIGZpZWxkcyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSB0byB0aGUgZmlsdGVyIGJhciAodGhpcyBpcyBzcGVjaWZpYyB0byB0aGUgQUxQIHNjZW5hcmlvKS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwuY29udGV4dH0gb0ludGVybmFsTW9kZWxDb250ZXh0IFRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1kYy5GaWx0ZXJCYXJ9IG9GaWx0ZXJCYXIgTURDIGZpbHRlciBiYXJcblx0ICovXG5cdF91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzKG9JbnRlcm5hbE1vZGVsQ29udGV4dDogYW55LCBvRmlsdGVyQmFyOiBhbnkpIHtcblx0XHRjb25zdCBtQ2FjaGU6IGFueSA9IHt9O1xuXHRcdGNvbnN0IGlnbm9yZWRGaWVsZHM6IGFueSA9IHt9LFxuXHRcdFx0YVRhYmxlcyA9IHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIiksXG5cdFx0XHRhQ2hhcnRzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJDaGFydFwiKTtcblxuXHRcdGlmICghYVRhYmxlcy5sZW5ndGggfHwgIWFDaGFydHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5vdCBhIHRhYmxlIGFuZCBhIGNoYXJ0LCB3ZSdyZSBub3QgaW4gdGhlIEFMUCBjYXNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIHRoZSBtb21lbnQsIHRoZXJlJ3Mgbm90aGluZyBmb3IgdGFibGVzLi4uXG5cdFx0YUNoYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hhcnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgc0NoYXJ0RW50aXR5UGF0aCA9IG9DaGFydC5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIiksXG5cdFx0XHRcdHNDaGFydEVudGl0eVNldCA9IHNDaGFydEVudGl0eVBhdGguc2xpY2UoMSksXG5cdFx0XHRcdHNDYWNoZUtleSA9IHNDaGFydEVudGl0eVNldCArIFwiQ2hhcnRcIjtcblx0XHRcdGlmICghbUNhY2hlW3NDYWNoZUtleV0pIHtcblx0XHRcdFx0bUNhY2hlW3NDYWNoZUtleV0gPSBGaWx0ZXJVdGlscy5nZXROb3RBcHBsaWNhYmxlRmlsdGVycyhvRmlsdGVyQmFyLCBvQ2hhcnQpO1xuXHRcdFx0fVxuXHRcdFx0aWdub3JlZEZpZWxkc1tzQ2FjaGVLZXldID0gbUNhY2hlW3NDYWNoZUtleV07XG5cdFx0fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY29udHJvbHMvaWdub3JlZEZpZWxkc1wiLCBpZ25vcmVkRmllbGRzKTtcblx0fVxuXG5cdF91cGRhdGVNdWx0aU1vZGVTZWxlY3RlZENvbnRyb2woKSB7XG5cdFx0dGhpcy5fc0VudGl0eVNldCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLl9vTGlzdFJlcG9ydENvbnRyb2wgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5fZ2V0Q3VycmVudENvbnRyb2woKTtcblx0fVxuXG5cdF91cGRhdGVDb3VudHMoKSB7XG5cdFx0dGhpcy5fdXBkYXRlTXVsdGlNb2RlQ291bnRzKCk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiBhIHRhYiBmcm9tIHRoZSBsaXN0IHJlcG9ydCBpcyBhIGN1c3RvbSB0YWIuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNDdXN0b21UYWJcblx0ICogQHJldHVybnMge2Jvb2xlYW59IERldGVybWluZXMgaWYgdGhlIHRhYiBpcyBhIGN1c3RvbSB0YWIuXG5cdCAqL1xuXHRfaXNDdXN0b21UYWIoKSB7XG5cdFx0Y29uc3Qgb011bHRpTW9kZUNvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0cmV0dXJuIG9NdWx0aU1vZGVDb250cm9sICYmIG9NdWx0aU1vZGVDb250cm9sLmdldFNlbGVjdGVkS2V5KCkuaW5kZXhPZihcIjo6Q3VzdG9tVGFiOjpcIikgPiAtMTtcblx0fVxuXG5cdF9zZXRDb3VudHNPdXREYXRlZCgpIHtcblx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRpZiAob011bHRpTW9kZUNvbnRyb2wgJiYgb011bHRpTW9kZUNvbnRyb2wuZGF0YShcInNob3dDb3VudHNcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRjb25zdCBhSXRlbXMgPSBvTXVsdGlNb2RlQ29udHJvbC5nZXRJdGVtcygpO1xuXHRcdFx0YUl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpLmluZGV4T2YoXCJmZTo6Q2hhcnRcIikgPT09IC0xKSB7XG5cdFx0XHRcdFx0b0l0ZW0uZGF0YShcIm91dGRhdGVkQ291bnRzXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfdXBkYXRlTXVsdGlNb2RlQ291bnRzKCkge1xuXHRcdGxldCBhQmluZGluZ1Byb21pc2VzID0gW107XG5cdFx0Y29uc3Qgb011bHRpTW9kZUNvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0aWYgKG9NdWx0aU1vZGVDb250cm9sICYmIG9NdWx0aU1vZGVDb250cm9sLmRhdGEoXCJzaG93Q291bnRzXCIpID09PSBcInRydWVcIiAmJiAhdGhpcy5faXNDdXN0b21UYWIoKSkge1xuXHRcdFx0Y29uc3Qgb0Rpc3BsYXllZENvbnRyb2wgPSB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpO1xuXHRcdFx0Y29uc3Qgc0Rpc3BsYXllZENvbnRyb2xJZCA9IG9EaXNwbGF5ZWRDb250cm9sLmdldElkKCk7XG5cdFx0XHRjb25zdCBhQ29tcGxpYW50VGFiczogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IGFJdGVtcyA9IG9NdWx0aU1vZGVDb250cm9sLmdldEl0ZW1zKCk7XG5cdFx0XHRhSXRlbXMuZm9yRWFjaCgob0l0ZW06IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQob0l0ZW0uZ2V0S2V5KCkpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0NvbnRyb2wgJiZcblx0XHRcdFx0XHQhb0NvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSAmJlxuXHRcdFx0XHRcdChvSXRlbS5kYXRhKFwib3V0ZGF0ZWRDb3VudHNcIikgfHwgb0NvbnRyb2wuZ2V0SWQoKSA9PT0gc0Rpc3BsYXllZENvbnRyb2xJZClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0YUNvbXBsaWFudFRhYnMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb250cm9sOiBvQ29udHJvbCxcblx0XHRcdFx0XHRcdGl0ZW06IG9JdGVtXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRhQmluZGluZ1Byb21pc2VzID0gYUNvbXBsaWFudFRhYnMubWFwKChtVGFiOiBhbnkpID0+IHtcblx0XHRcdFx0bVRhYi5pdGVtLnNldENvdW50KFwiLi4uXCIpO1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbCA9IG1UYWIuY29udHJvbDtcblx0XHRcdFx0Y29uc3Qgb0ZpbHRlckluZm9zID0gVGFibGVVdGlscy5nZXRGaWx0ZXJzSW5mb0ZvclNWKG9Db250cm9sLCBtVGFiLml0ZW0uZGF0YShcInNlbGVjdGlvblZhcmlhbnRcIikpIGFzIGFueTtcblx0XHRcdFx0cmV0dXJuIFRhYmxlVXRpbHMuZ2V0TGlzdEJpbmRpbmdGb3JDb3VudChvQ29udHJvbCwgdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSwge1xuXHRcdFx0XHRcdGJhdGNoR3JvdXBJZDogb0NvbnRyb2wuZ2V0SWQoKSA9PT0gc0Rpc3BsYXllZENvbnRyb2xJZCA/IG9Db250cm9sLmRhdGEoXCJiYXRjaEdyb3VwSWRcIikgOiBcIiRhdXRvXCIsXG5cdFx0XHRcdFx0YWRkaXRpb25hbEZpbHRlcnM6IG9GaWx0ZXJJbmZvcy5maWx0ZXJzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdFByb21pc2UuYWxsKGFCaW5kaW5nUHJvbWlzZXMpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhQ291bnRzOiBhbnlbXSkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgayBpbiBhQ291bnRzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvSXRlbSA9IGFDb21wbGlhbnRUYWJzW2tdLml0ZW07XG5cdFx0XHRcdFx0XHRvSXRlbS5zZXRDb3VudChUYWJsZVV0aWxzLmdldENvdW50Rm9ybWF0dGVkKGFDb3VudHNba10pKTtcblx0XHRcdFx0XHRcdG9JdGVtLmRhdGEoXCJvdXRkYXRlZENvdW50c1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgdmFsdWVzIGZvciB0aGUgaWNvbiB0YWIgYmFyXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF9pc0ZpbHRlckJhckhpZGRlbigpIHtcblx0XHRyZXR1cm4gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5oaWRlRmlsdGVyQmFyO1xuXHR9XG5cblx0X3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoKG9WTTogYW55KSB7XG5cdFx0aWYgKFxuXHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5pbml0aWFsTG9hZCA9PT0gSW5pdGlhbExvYWRNb2RlLkF1dG8gJiZcblx0XHRcdCghb1ZNIHx8IG9WTS5nZXRTdGFuZGFyZFZhcmlhbnRLZXkoKSA9PT0gb1ZNLmdldEN1cnJlbnRWYXJpYW50S2V5KCkpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0aWYgKG9GaWx0ZXJCYXIpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmRpdGlvbnMgPSBvRmlsdGVyQmFyLmdldENvbmRpdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9Db25kaXRpb25zKSB7XG5cdFx0XHRcdFx0Ly8gaWdub3JlIGZpbHRlcnMgc3RhcnRpbmcgd2l0aCAkIChlLmcuICRzZWFyY2gsICRlZGl0U3RhdGUpXG5cdFx0XHRcdFx0aWYgKCFzS2V5LnN0YXJ0c1dpdGgoXCIkXCIpICYmIEFycmF5LmlzQXJyYXkob0NvbmRpdGlvbnNbc0tleV0pICYmIG9Db25kaXRpb25zW3NLZXldLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0X3VwZGF0ZVRhYmxlKG9UYWJsZTogYW55KSB7XG5cdFx0aWYgKCFvVGFibGUuaXNUYWJsZUJvdW5kKCkgfHwgdGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzKSB7XG5cdFx0XHRvVGFibGUucmViaW5kKCk7XG5cdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRfdXBkYXRlQ2hhcnQob0NoYXJ0OiBhbnkpIHtcblx0XHRjb25zdCBvSW5uZXJDaGFydCA9IG9DaGFydC5nZXRDb250cm9sRGVsZWdhdGUoKS5fZ2V0Q2hhcnQob0NoYXJ0KTtcblx0XHRpZiAoIShvSW5uZXJDaGFydCAmJiBvSW5uZXJDaGFydC5pc0JvdW5kKFwiZGF0YVwiKSkgfHwgdGhpcy5oYXNQZW5kaW5nVGFibGVDaGFuZ2VzKSB7XG5cdFx0XHRvQ2hhcnQuZ2V0Q29udHJvbERlbGVnYXRlKCkucmViaW5kKG9DaGFydCwgb0lubmVyQ2hhcnQuZ2V0QmluZGluZ0luZm8oXCJkYXRhXCIpKTtcblx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGhhbmRsZXJzID0ge1xuXHRcdG9uVGFiTXVsdGlNb2RlQ2hhbmdlKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0dGhpcy5fdXBkYXRlTXVsdGlNb2RlU2VsZWN0ZWRDb250cm9sKCk7XG5cdFx0XHR0aGlzLl91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMoKTtcblxuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvRGlzcGxheWVkQ29udHJvbCA9IHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb011bHRpTW9kZUNvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0XHRjb25zdCBzU2VsZWN0ZWRLZXkgPSBvTXVsdGlNb2RlQ29udHJvbC5nZXRTZWxlY3RlZEtleSgpO1xuXHRcdFx0Y29uc3Qgc1ByZXZpb3VzU2VsZWN0ZWRLZXkgPSBvRXZlbnQgJiYgb0V2ZW50Lm1QYXJhbWV0ZXJzID8gb0V2ZW50Lm1QYXJhbWV0ZXJzLnByZXZpb3VzS2V5IDogdW5kZWZpbmVkO1xuXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJ0YWJzL3NlbGVjdGVkXCIsIHNTZWxlY3RlZEtleSk7XG5cdFx0XHRpZiAob0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIikgIT09IHRydWUpIHtcblx0XHRcdFx0Ly8gTm8gcGVuZGluZyBmaWx0ZXJzIGludG8gRmlsdGVyQmFyXG5cdFx0XHRcdGlmIChvRmlsdGVyQmFyICYmIHRoaXMuX2lzQ3VzdG9tVGFiKCkpIHtcblx0XHRcdFx0XHRjb25zdCBvRmlsdGVyQ29uZGl0aW9ucyA9IG9GaWx0ZXJCYXIuZ2V0RmlsdGVyQ29uZGl0aW9ucygpO1xuXHRcdFx0XHRcdHRoaXMub25WaWV3TmVlZHNSZWZyZXNoKHtcblx0XHRcdFx0XHRcdGZpbHRlckNvbmRpdGlvbnM6IG9GaWx0ZXJDb25kaXRpb25zLFxuXHRcdFx0XHRcdFx0Y3VycmVudFRhYklkOiBzU2VsZWN0ZWRLZXksXG5cdFx0XHRcdFx0XHRyZWZyZXNoQ2F1c2U6IFwidGFiQ2hhbmdlZFwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0IW9EaXNwbGF5ZWRDb250cm9sLmlzQShcInNhcC51aS5tZGMuQ2hhcnRcIikgJiZcblx0XHRcdFx0XHQoIW9EaXNwbGF5ZWRDb250cm9sLmdldFJvd0JpbmRpbmcoKSB8fCAvLyBmaXJzdCB0aW1lIHRoZSB0YWIvdGFibGUgaXMgZGlzcGxheWVkXG5cdFx0XHRcdFx0XHRvRGlzcGxheWVkQ29udHJvbC5kYXRhKFwib3V0ZGF0ZWRSb3dzXCIpID09PSB0cnVlKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBTZWFyY2ggaGFzIGJlZW4gdHJpZ2dlcmVkIG9uIGEgZGlmZmVyZW50IHRhYiB7fVxuXHRcdFx0XHRcdG9EaXNwbGF5ZWRDb250cm9sLnJlYmluZCgpO1xuXHRcdFx0XHRcdG9EaXNwbGF5ZWRDb250cm9sLmRhdGEoXCJvdXRkYXRlZFJvd3NcIiwgZmFsc2UpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdG9EaXNwbGF5ZWRDb250cm9sLmlzQShcInNhcC51aS5tZGMuQ2hhcnRcIikgJiZcblx0XHRcdFx0XHQoIW9EaXNwbGF5ZWRDb250cm9sLmdldENvbnRyb2xEZWxlZ2F0ZSgpLl9nZXRDaGFydChvRGlzcGxheWVkQ29udHJvbCkuZ2V0QmluZGluZyhcImRhdGFcIikgfHwgLy8gZmlyc3QgdGltZSB0aGUgdGFiL2NoYXJ0IGlzIGRpc3BsYXllZFxuXHRcdFx0XHRcdFx0b0Rpc3BsYXllZENvbnRyb2wuZGF0YShcIm91dGRhdGVkUm93c1wiKSA9PT0gdHJ1ZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0lubmVyQ2hhcnQgPSBvRGlzcGxheWVkQ29udHJvbC5nZXRDb250cm9sRGVsZWdhdGUoKS5fZ2V0Q2hhcnQob0Rpc3BsYXllZENvbnRyb2wpO1xuXHRcdFx0XHRcdG9EaXNwbGF5ZWRDb250cm9sLmdldENvbnRyb2xEZWxlZ2F0ZSgpLnJlYmluZChvRGlzcGxheWVkQ29udHJvbCwgb0lubmVyQ2hhcnQuZ2V0QmluZGluZ0luZm8oXCJkYXRhXCIpKTtcblx0XHRcdFx0XHRvRGlzcGxheWVkQ29udHJvbC5kYXRhKFwib3V0ZGF0ZWRSb3dzXCIsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0V2ZW50ICYmIG9FdmVudC5tUGFyYW1ldGVycyAmJiBzUHJldmlvdXNTZWxlY3RlZEtleSAhPT0gb0V2ZW50Lm1QYXJhbWV0ZXJzLnNlbGVjdGVkS2V5KSB7XG5cdFx0XHRcdENvbnRyb2xQZXJzb25hbGl6YXRpb25Xcml0ZUFQSS5hZGQoe1xuXHRcdFx0XHRcdGNoYW5nZXM6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlU3BlY2lmaWNEYXRhOiB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlVHlwZTogXCJzZWxlY3RJY29uVGFiQmFyRmlsdGVyXCIsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDoge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2VsZWN0ZWRLZXk6IHNTZWxlY3RlZEtleSxcblx0XHRcdFx0XHRcdFx0XHRcdHByZXZpb3VzU2VsZWN0ZWRLZXk6IHNQcmV2aW91c1NlbGVjdGVkS2V5XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RvckVsZW1lbnQ6IG9NdWx0aU1vZGVDb250cm9sXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdG9uRmlsdGVyc0NoYW5nZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0aWYgKG9GaWx0ZXJCYXIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0Ly8gUGVuZGluZyBmaWx0ZXJzIGludG8gRmlsdGVyQmFyIHRvIGJlIHVzZWQgZm9yIGN1c3RvbSB2aWV3c1xuXHRcdFx0XHR0aGlzLm9uUGVuZGluZ0ZpbHRlcnMoKTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYXBwbGllZEZpbHRlcnNcIiwgb0ZpbHRlckJhci5nZXRBc3NpZ25lZEZpbHRlcnNUZXh0KCkuZmlsdGVyc1RleHQpO1xuXHRcdFx0XHRpZiAob0V2ZW50LmdldFBhcmFtZXRlcihcImNvbmRpdGlvbnNCYXNlZFwiKSkge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTZWxlY3RlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9WTSA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdC8vIHNldFRpbWVvdXQgY2F1c2UgdGhlIHZhcmlhbnQgbmVlZHMgdG8gYmUgYXBwbGllZCBiZWZvcmUganVkZ2luZyB0aGUgYXV0byBzZWFyY2ggb3IgdXBkYXRpbmcgdGhlIGFwcCBzdGF0ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRcdFx0KHRoaXMuaGFuZGxlcnMgYXMgYW55KS5vblRhYk11bHRpTW9kZUNoYW5nZS5hcHBseSh0aGlzLCBbb0V2ZW50XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuX3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoKG9WTSkpIHtcblx0XHRcdFx0XHQvLyB0aGUgYXBwIHN0YXRlIHdpbGwgYmUgdXBkYXRlZCB2aWEgb25TZWFyY2ggaGFuZGxlclxuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkudHJpZ2dlclNlYXJjaCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0Ly9UT0RPOiBTaG91bGQgcmVtb3ZlIHRoaXMgc2V0VGltZU91dCBvbmNlIFZhcmlhbnQgTWFuYWdlbWVudCBwcm92aWRlcyBhbiBhcGkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmFyaWFudCBrZXkgb24gc2F2ZSEhIVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH0sIDEwMDApO1xuXHRcdH0sXG5cdFx0b25TZWFyY2godGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb01kY0NoYXJ0ID0gdGhpcy5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdGNvbnN0IGJIaWRlRHJhZnQgPSBGaWx0ZXJVdGlscy5nZXRFZGl0U3RhdGVJc0hpZGVEcmFmdChvRmlsdGVyQmFyLmdldENvbmRpdGlvbnMoKSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiLCBmYWxzZSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoaWRlRHJhZnRJbmZvXCIsIGJIaWRlRHJhZnQpO1xuXHRcdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdFx0Y29uc3QgYUNvbnRyb2xzID0gdGhpcy5fZ2V0Q29udHJvbHMoKSxcblx0XHRcdFx0XHRvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRcdFx0dGhpcy5fc2V0Q291bnRzT3V0RGF0ZWQoKTtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0N1c3RvbVRhYigpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc0Rpc3BsYXllZENvbnRyb2xJZCA9IHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCkuZ2V0SWQoKTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVNdWx0aVRhYk5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyKTtcblx0XHRcdFx0XHQvLyBUaGlzIHNob3VsZCBiZSBkb25lIG91dHNpZGUgdGhlIHNlYXJjaCBldmVudCBoYW5kbGVyIG9mIHRoZSBmaWx0ZXIgYmFyLlxuXHRcdFx0XHRcdC8vIFRoZSBzYW1lIGxvZ2ljIGlzIHJlcXVpcmVkIHdoZW4gZmlsdGVyIGJhciBpcyBoaWRkZW4gYW5kIG11bHRpcGxlIHRhYmxlcyBleGlzdCBvbiB0aGUgTFIuXG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBjdXJyZW50bHkgZG9uZSBpbiBMaXN0UmVwb3J0L292ZXJyaWRlcy9WaWV3U3RhdGUuanMjb25BZnRlclN0YXRlQXBwbGllZCgpXG5cdFx0XHRcdFx0YUNvbnRyb2xzLmZvckVhY2goZnVuY3Rpb24gKG9Db250cm9sOiBhbnkpIHtcblx0XHRcdFx0XHRcdG9Db250cm9sLmRhdGEoXCJvdXRkYXRlZFJvd3NcIiwgb0NvbnRyb2wuZ2V0SWQoKSAhPT0gc0Rpc3BsYXllZENvbnRyb2xJZCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0ZpbHRlckNvbmRpdGlvbnMgPSBvRmlsdGVyQmFyLmdldEZpbHRlckNvbmRpdGlvbnMoKTtcblx0XHRcdFx0XHR0aGlzLm9uVmlld05lZWRzUmVmcmVzaCh7XG5cdFx0XHRcdFx0XHRmaWx0ZXJDb25kaXRpb25zOiBvRmlsdGVyQ29uZGl0aW9ucyxcblx0XHRcdFx0XHRcdGN1cnJlbnRUYWJJZDogb011bHRpTW9kZUNvbnRyb2wuZ2V0U2VsZWN0ZWRLZXkoKSxcblx0XHRcdFx0XHRcdHJlZnJlc2hDYXVzZTogXCJzZWFyY2hcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgb0ZpbHRlckJhcik7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01kY0NoYXJ0KSB7XG5cdFx0XHRcdC8vIGRpc2FibGUgYm91bmQgYWN0aW9ucyBUT0RPOiB0aGlzIGNsZWFycyBldmVyeXRoaW5nIGZvciB0aGUgY2hhcnQ/XG5cdFx0XHRcdChvTWRjQ2hhcnQuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXCJcIiwge30pO1xuXG5cdFx0XHRcdGNvbnN0IG9QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvTWRjQ2hhcnQuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKSArIFwiL2FscENvbnRlbnRWaWV3XCIpO1xuXHRcdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSkge1xuXHRcdFx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIHN0b3JlIGZpbHRlciBiYXIgY29uZGl0aW9ucyB0byB1c2UgbGF0ZXIgd2hpbGUgbmF2aWdhdGlvblxuXHRcdFx0U3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvRmlsdGVyQmFyKVxuXHRcdFx0XHQudGhlbigob0V4dGVybmFsU3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IG9FeHRlcm5hbFN0YXRlLmZpbHRlcjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGV4dGVybmFsIHN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0aWYgKCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkubGl2ZU1vZGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN5c3RlbS5waG9uZSkge1xuXHRcdFx0XHRjb25zdCBvRHluYW1pY1BhZ2UgPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6Okxpc3RSZXBvcnRcIikgYXMgRHluYW1pY1BhZ2U7XG5cdFx0XHRcdG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsIG9Db250ZXh0OiBhbnksIHNDcmVhdGVQYXRoOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0LCBvQ29udGV4dCwgc0NyZWF0ZVBhdGgpO1xuXHRcdH0sXG5cdFx0b25DaGFydFNlbGVjdGlvbkNoYW5nZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvTWRjQ2hhcnQgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0Q29udGVudCgpLFxuXHRcdFx0XHRvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpLFxuXHRcdFx0XHRhRGF0YSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJkYXRhXCIpLFxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKGFEYXRhKSB7XG5cdFx0XHRcdC8vIHVwZGF0ZSBhY3Rpb24gYnV0dG9ucyBlbmFibGVtZW50IC8gZGlzYWJsZW1lbnRcblx0XHRcdFx0Q2hhcnRSdW50aW1lLmZuVXBkYXRlQ2hhcnQob0V2ZW50KTtcblx0XHRcdFx0Ly8gdXBkYXRlIHNlbGVjdGlvbnMgb24gc2VsZWN0aW9uIG9yIGRlc2VsZWN0aW9uXG5cdFx0XHRcdENoYXJ0VXRpbHMuc2V0Q2hhcnRGaWx0ZXJzKG9NZGNDaGFydCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzVGVtcGxhdGVDb250ZW50VmlldyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpICsgXCIvYWxwQ29udGVudFZpZXdcIik7XG5cdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9UYWJsZSAmJiAob1RhYmxlIGFzIGFueSkucmViaW5kKCk7XG5cdFx0XHRcdHRoaXMuaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25TZWdtZW50ZWRCdXR0b25QcmVzc2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgc1NlbGVjdGVkS2V5ID0gb0V2ZW50Lm1QYXJhbWV0ZXJzLmtleSA/IG9FdmVudC5tUGFyYW1ldGVycy5rZXkgOiBudWxsO1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFscENvbnRlbnRWaWV3XCIsIHNTZWxlY3RlZEtleSk7XG5cdFx0XHRjb25zdCBvQ2hhcnQgPSB0aGlzLl9nZXRDaGFydCgpO1xuXHRcdFx0Y29uc3Qgb1RhYmxlID0gdGhpcy5fZ2V0VGFibGUoKTtcblx0XHRcdGNvbnN0IG9TZWdtZW50ZWRCdXR0b25EZWxlZ2F0ZSA9IHtcblx0XHRcdFx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHRcdFx0XHRjb25zdCBhSXRlbXMgPSBvU2VnbWVudGVkQnV0dG9uLmdldEl0ZW1zKCk7XG5cdFx0XHRcdFx0YUl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvSXRlbS5nZXRLZXkoKSA9PT0gc1NlbGVjdGVkS2V5KSB7XG5cdFx0XHRcdFx0XHRcdG9JdGVtLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b1NlZ21lbnRlZEJ1dHRvbi5yZW1vdmVFdmVudERlbGVnYXRlKG9TZWdtZW50ZWRCdXR0b25EZWxlZ2F0ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBvU2VnbWVudGVkQnV0dG9uID0gKFxuXHRcdFx0XHRzU2VsZWN0ZWRLZXkgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuVGFibGUgPyB0aGlzLl9nZXRTZWdtZW50ZWRCdXR0b24oXCJUYWJsZVwiKSA6IHRoaXMuX2dldFNlZ21lbnRlZEJ1dHRvbihcIkNoYXJ0XCIpXG5cdFx0XHQpIGFzIFNlZ21lbnRlZEJ1dHRvbjtcblx0XHRcdGlmIChvU2VnbWVudGVkQnV0dG9uICE9PSBvRXZlbnQuZ2V0U291cmNlKCkpIHtcblx0XHRcdFx0b1NlZ21lbnRlZEJ1dHRvbi5hZGRFdmVudERlbGVnYXRlKG9TZWdtZW50ZWRCdXR0b25EZWxlZ2F0ZSk7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHNTZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuVGFibGU6XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlVGFibGUob1RhYmxlKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0OlxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUNoYXJ0KG9DaGFydCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQ6XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlVGFibGUob1RhYmxlKTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVDaGFydChvQ2hhcnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25GaWx0ZXJzU2VnbWVudGVkQnV0dG9uUHJlc3NlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGlmIChvRXZlbnQuZ2V0UGFyYW1ldGVyKFwia2V5XCIpID09PSBcIkNvbXBhY3RcIikge1xuXHRcdFx0XHR0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJ2aXN1YWxGaWx0ZXJCYXJJZFwiKSkgYXMgQ29udHJvbCkuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5ieUlkKHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwidmlzdWFsRmlsdGVyQmFySWRcIikpIGFzIENvbnRyb2wpLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblN0YXRlQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH1cblx0fTtcblx0Zm9ybWF0dGVycyA9IHtcblx0XHQvKipcblx0XHQgKiBNZXRob2QgdG8gc2V0IHRoZSBtZXNzYWdlIHRleHQgZm9yIHRoZSBtdWx0aXBsZSBlbnRpdHkgc2V0cyB3aGVuIGZpZWxkcyBpbiB0aGUgRmlsdGVyQmFyIG5lZWQgdG8gYmUgaWdub3JlZC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB0aGlzXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYUlnbm9yZWRGaWVsZHMgQXJyYXkgb2YgaWdub3JlZCBmaWVsZHMgaW4gdGhlIEZpbHRlckJhciBmb3IgdGhlIGN1cnJlbnQgdGFiIChtdWx0aXBsZSBlbnRpdHkgc2V0cylcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhYlRpdGxlIFRhYiB0aXRsZVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYklzQ2hhcnQgRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGEgY2hhcnQgb3Igbm90XG5cdFx0ICogQHBhcmFtIHtvYmplY3R9IG9BcHBseVN1cHBvcnRlZCBBcHBseVN1cHBvcnRlZCBmb3IgdGhlIGNvbnRyb2xcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBNZXNzYWdlIHRleHRcblx0XHQgKi9cblx0XHRzZXRUYWJNZXNzYWdlU3RyaXAodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIGFJZ25vcmVkRmllbGRzOiBhbnlbXSwgc1RhYlRpdGxlOiBzdHJpbmcsIGJJc0NoYXJ0PzogYW55LCBvQXBwbHlTdXBwb3J0ZWQ/OiBhbnkpIHtcblx0XHRcdGxldCBzVGV4dCA9IFwiXCI7XG5cdFx0XHRiSXNDaGFydCA9IGJJc0NoYXJ0ID09PSBcInRydWVcIiB8fCBiSXNDaGFydCA9PT0gdHJ1ZTtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhciAmJiBBcnJheS5pc0FycmF5KGFJZ25vcmVkRmllbGRzKSAmJiBhSWdub3JlZEZpZWxkcy5sZW5ndGggPiAwICYmIChzVGFiVGl0bGUgfHwgYklzQ2hhcnQpKSB7XG5cdFx0XHRcdGNvbnN0IHNGaWx0ZXJCYXJFbnRpdHlQYXRoID0gb0ZpbHRlckJhci5kYXRhKFwiZW50aXR5VHlwZVwiKSxcblx0XHRcdFx0XHRvTWV0YU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS50ZW1wbGF0ZXNcIikgYXMgUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0YUlnbm9yZWRMYWJlbHMgPSBhSWdub3JlZEZpZWxkcy5tYXAoZnVuY3Rpb24gKHNQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01hY3JvUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5tYWNyb3NcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0XHRpZiAoc1Byb3BlcnR5ID09PSBcIiRzZWFyY2hcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01hY3JvUmVzb3VyY2VCdW5kbGUgPyBvTWFjcm9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9GSUxURVJCQVJfU0VBUkNIXCIpIDogXCJcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChzUHJvcGVydHkgPT09IFwiJGVkaXRTdGF0ZVwiKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWFjcm9SZXNvdXJjZUJ1bmRsZSA/IG9NYWNyb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0NPTU1PTl9GSUxURVJCQVJfRURJVElOR19TVEFUVVNcIikgOiBcIlwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3Qgc0xhYmVsID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0ZpbHRlckJhckVudGl0eVBhdGggKyBzUHJvcGVydHkgKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxcIik7XG5cdFx0XHRcdFx0XHRyZXR1cm4gRGVsZWdhdGVVdGlsLmdldExvY2FsaXplZFRleHQoc0xhYmVsLCBvRmlsdGVyQmFyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgYklzU2VhcmNoSWdub3JlZCA9ICFvQXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoO1xuXHRcdFx0XHRpZiAob1Jlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdFx0c1RleHQgPSBDb21tb25VdGlscy5nZXRNZXNzYWdlU3RyaXBUZXh0KFxuXHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRhSWdub3JlZExhYmVscyxcblx0XHRcdFx0XHRcdG9GaWx0ZXJCYXIsXG5cdFx0XHRcdFx0XHRiSXNDaGFydCxcblx0XHRcdFx0XHRcdGJJc1NlYXJjaElnbm9yZWQsXG5cdFx0XHRcdFx0XHRzVGFiVGl0bGUsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHREZWxlZ2F0ZVV0aWwuZ2V0TG9jYWxpemVkVGV4dFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzVGV4dDtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RSZXBvcnRDb250cm9sbGVyO1xuIl19