@sapui5/sap.fe.templates 1.108.2 → 1.110.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 (94) hide show
  1. package/README.md +5 -1
  2. package/package.json +11 -8
  3. package/src/sap/fe/templates/.library +26 -27
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.js +1 -7
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +1 -4
  6. package/src/sap/fe/templates/ListComponent.js +45 -62
  7. package/src/sap/fe/templates/ListComponent.ts +43 -43
  8. package/src/sap/fe/templates/ListReport/Component.js +11 -19
  9. package/src/sap/fe/templates/ListReport/Component.ts +6 -0
  10. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +15 -36
  11. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +6 -1
  12. package/src/sap/fe/templates/ListReport/LRMessageStrip.js +196 -0
  13. package/src/sap/fe/templates/ListReport/LRMessageStrip.ts +216 -0
  14. package/src/sap/fe/templates/ListReport/ListReport.view.xml +31 -0
  15. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +142 -247
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +50 -15
  17. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +2 -7
  18. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +21 -108
  19. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +2 -2
  20. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +9 -17
  21. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +3 -2
  22. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -25
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +51 -123
  24. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +5 -8
  25. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -23
  26. package/src/sap/fe/templates/ObjectPage/Component.js +19 -40
  27. package/src/sap/fe/templates/ObjectPage/Component.ts +11 -4
  28. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.js +64 -0
  29. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.ts +80 -0
  30. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +24 -59
  31. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +8 -7
  32. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +2 -1
  33. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +182 -463
  34. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +29 -31
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +129 -208
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +62 -14
  37. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +1 -32
  38. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.tsx +3 -2
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +9 -37
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +1 -7
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -31
  42. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
  43. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +2 -4
  44. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  45. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +4 -5
  46. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +4 -4
  47. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +3 -3
  48. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +4 -4
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +3 -3
  50. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +16 -21
  51. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +1 -1
  52. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +19 -1
  53. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +21 -0
  54. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  55. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +4 -5
  56. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +19 -69
  57. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
  58. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +5 -20
  59. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +6 -6
  60. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +4 -3
  61. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +3 -3
  62. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -1
  63. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +1 -1
  64. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -1
  65. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +4 -3
  66. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +7 -5
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +1 -1
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingContent.fragment.xml +1 -0
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +3 -2
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +2 -1
  71. package/src/sap/fe/templates/ObjectPage/view/fragments/SideContentCustomContainer.fragment.xml +7 -7
  72. package/src/sap/fe/templates/TableScroller.js +1 -6
  73. package/src/sap/fe/templates/library.js +4 -7
  74. package/src/sap/fe/templates/library.ts +1 -2
  75. package/src/sap/fe/templates/messagebundle.properties +30 -29
  76. package/src/sap/fe/templates/messagebundle_bg.properties +2 -2
  77. package/src/sap/fe/templates/messagebundle_cs.properties +1 -1
  78. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +1 -1
  79. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +1 -1
  80. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +1 -1
  81. package/src/sap/fe/templates/messagebundle_es.properties +2 -2
  82. package/src/sap/fe/templates/messagebundle_et.properties +2 -2
  83. package/src/sap/fe/templates/messagebundle_no.properties +1 -1
  84. package/src/sap/fe/templates/messagebundle_ro.properties +2 -2
  85. package/src/sap/fe/templates/messagebundle_sl.properties +7 -7
  86. package/src/sap/fe/templates/messagebundle_th.properties +2 -2
  87. package/src/sap/fe/templates/messagebundle_vi.properties +2 -2
  88. package/src/sap/fe/templates/messagebundle_zh_CN.properties +2 -2
  89. package/ui5.yaml +0 -2
  90. package/src/sap/fe/templates/Feedback.js +0 -80
  91. package/src/sap/fe/templates/Feedback.ts +0 -64
  92. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +0 -82
  93. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +0 -20
  94. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +0 -20
@@ -2,18 +2,15 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/LRMessageStrip", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/filter/FilterUtils"], function (ExtensionAPI, ClassSupport, $LRMessageStrip, ChartUtils, FilterUtils) {
5
+ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/filter/FilterUtils", "sap/fe/templates/ListReport/LRMessageStrip", "sap/ui/core/InvisibleMessage", "sap/ui/core/library"], function (ExtensionAPI, ClassSupport, ChartUtils, FilterUtils, $LRMessageStrip, InvisibleMessage, library) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _class;
9
-
9
+ var InvisibleMessageMode = library.InvisibleMessageMode;
10
10
  var LRMessageStrip = $LRMessageStrip.LRMessageStrip;
11
11
  var defineUI5Class = ClassSupport.defineUI5Class;
12
-
13
12
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
14
-
15
13
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
16
-
17
14
  /**
18
15
  * Extension API for list reports in SAP Fiori elements for OData V4.
19
16
  *
@@ -25,13 +22,10 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
25
22
  */
26
23
  var ListReportExtensionAPI = (_dec = defineUI5Class("sap.fe.templates.ListReport.ExtensionAPI"), _dec(_class = /*#__PURE__*/function (_ExtensionAPI) {
27
24
  _inheritsLoose(ListReportExtensionAPI, _ExtensionAPI);
28
-
29
25
  function ListReportExtensionAPI() {
30
26
  return _ExtensionAPI.apply(this, arguments) || this;
31
27
  }
32
-
33
28
  var _proto = ListReportExtensionAPI.prototype;
34
-
35
29
  /**
36
30
  * Refreshes the List Report.
37
31
  * This method currently only supports triggering the search (by clicking on the GO button)
@@ -45,7 +39,6 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
45
39
  */
46
40
  _proto.refresh = function refresh() {
47
41
  var oFilterBar = this._controller._getFilterBarControl();
48
-
49
42
  if (oFilterBar) {
50
43
  return oFilterBar.waitForInitialization().then(function () {
51
44
  oFilterBar.triggerSearch();
@@ -55,36 +48,31 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
55
48
  return Promise.resolve();
56
49
  }
57
50
  }
51
+
58
52
  /**
59
53
  * Gets the list entries currently selected for the displayed control.
60
54
  *
61
55
  * @alias sap.fe.templates.ListReport.ExtensionAPI#getSelectedContexts
62
56
  * @returns Array containing the selected contexts
63
57
  * @public
64
- */
65
- ;
66
-
58
+ */;
67
59
  _proto.getSelectedContexts = function getSelectedContexts() {
68
60
  var _this$_controller$_ge, _this$_controller$_ge2;
69
-
70
61
  var oControl = this._controller._isMultiMode() && ((_this$_controller$_ge = this._controller._getMultiModeControl()) === null || _this$_controller$_ge === void 0 ? void 0 : (_this$_controller$_ge2 = _this$_controller$_ge.getSelectedInnerControl()) === null || _this$_controller$_ge2 === void 0 ? void 0 : _this$_controller$_ge2.content) || this._controller._getTable();
71
-
72
62
  if (oControl.isA("sap.ui.mdc.Chart")) {
73
63
  var aSelectedContexts = [];
74
-
75
64
  if (oControl && oControl.get_chart()) {
76
65
  var aSelectedDataPoints = ChartUtils.getChartSelectedData(oControl.get_chart());
77
-
78
66
  for (var i = 0; i < aSelectedDataPoints.length; i++) {
79
67
  aSelectedContexts.push(aSelectedDataPoints[i].context);
80
68
  }
81
69
  }
82
-
83
70
  return aSelectedContexts;
84
71
  } else {
85
72
  return oControl && oControl.getSelectedContexts() || [];
86
73
  }
87
74
  }
75
+
88
76
  /**
89
77
  * Set the filter values for the given property in the filter bar.
90
78
  * The filter values can be either a single value or an array of values.
@@ -96,21 +84,18 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
96
84
  * @alias sap.fe.templates.ListReport.ExtensionAPI#setFilterValues
97
85
  * @returns A promise for asynchronous handling
98
86
  * @public
99
- */
100
- ;
101
-
87
+ */;
102
88
  _proto.setFilterValues = function setFilterValues(sConditionPath, sOperator, vValues) {
103
89
  // The List Report has two filter bars: The filter bar in the header and the filter bar in the "Adapt Filter" dialog;
104
90
  // when the dialog is opened, the user is working with that active control: Pass it to the setFilterValues method!
105
91
  var filterBar = this._controller._getAdaptationFilterBarControl() || this._controller._getFilterBarControl();
106
-
107
92
  if (arguments.length === 2) {
108
93
  vValues = sOperator;
109
94
  return FilterUtils.setFilterValues(filterBar, sConditionPath, vValues);
110
95
  }
111
-
112
96
  return FilterUtils.setFilterValues(filterBar, sConditionPath, sOperator, vValues);
113
97
  }
98
+
114
99
  /**
115
100
  * This method converts filter conditions to filters.
116
101
  *
@@ -118,12 +103,9 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
118
103
  * @alias sap.fe.templates.ListReport.ExtensionAPI#createFiltersFromFilterConditions
119
104
  * @returns Object containing the converted FilterBar filters.
120
105
  * @public
121
- */
122
- ;
123
-
106
+ */;
124
107
  _proto.createFiltersFromFilterConditions = function createFiltersFromFilterConditions(mFilterConditions) {
125
108
  var oFilterBar = this._controller._getFilterBarControl();
126
-
127
109
  return FilterUtils.getFilterInfo(oFilterBar, undefined, mFilterConditions);
128
110
  }
129
111
  /**
@@ -133,14 +115,12 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
133
115
  * @alias sap.fe.templates.ListReport.ExtensionAPI#getFilters
134
116
  * @returns {{filters: sap.ui.model.Filter[]|undefined, search: string|undefined}} An array of active filters and the search expression.
135
117
  * @public
136
- */
137
- ;
138
-
118
+ */;
139
119
  _proto.getFilters = function getFilters() {
140
120
  var oFilterBar = this._controller._getFilterBarControl();
141
-
142
121
  return FilterUtils.getFilters(oFilterBar);
143
122
  }
123
+
144
124
  /**
145
125
  * Provide an option for showing a custom message in the message strip above the list report table.
146
126
  *
@@ -150,19 +130,18 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
150
130
  * @param {string[]|string} [tabKey] The tabKey identifying the table where the custom message is displayed. If tabKey is empty, the message is displayed in all tabs . If tabKey = ['1','2'], the message is displayed in tabs 1 and 2 only
151
131
  * @param {Function} [onClose] A function that is called when the user closes the message bar.
152
132
  * @public
153
- */
154
- ;
155
-
133
+ */;
156
134
  _proto.setCustomMessage = function setCustomMessage(message, tabKey, onClose) {
157
135
  if (!this.ListReportMessageStrip) {
158
136
  this.ListReportMessageStrip = new LRMessageStrip();
159
137
  }
160
-
161
138
  this.ListReportMessageStrip.showCustomMessage(message, this._controller, tabKey, onClose);
139
+ if (message !== null && message !== void 0 && message.message) {
140
+ InvisibleMessage.getInstance().announce(message.message, InvisibleMessageMode.Assertive);
141
+ }
162
142
  };
163
-
164
143
  return ListReportExtensionAPI;
165
144
  }(ExtensionAPI)) || _class);
166
145
  return ListReportExtensionAPI;
167
146
  }, false);
168
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMaXN0UmVwb3J0RXh0ZW5zaW9uQVBJIiwiZGVmaW5lVUk1Q2xhc3MiLCJyZWZyZXNoIiwib0ZpbHRlckJhciIsIl9jb250cm9sbGVyIiwiX2dldEZpbHRlckJhckNvbnRyb2wiLCJ3YWl0Rm9ySW5pdGlhbGl6YXRpb24iLCJ0aGVuIiwidHJpZ2dlclNlYXJjaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIm9Db250cm9sIiwiX2lzTXVsdGlNb2RlIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJnZXRTZWxlY3RlZElubmVyQ29udHJvbCIsImNvbnRlbnQiLCJfZ2V0VGFibGUiLCJpc0EiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldF9jaGFydCIsImFTZWxlY3RlZERhdGFQb2ludHMiLCJDaGFydFV0aWxzIiwiZ2V0Q2hhcnRTZWxlY3RlZERhdGEiLCJpIiwibGVuZ3RoIiwicHVzaCIsImNvbnRleHQiLCJzZXRGaWx0ZXJWYWx1ZXMiLCJzQ29uZGl0aW9uUGF0aCIsInNPcGVyYXRvciIsInZWYWx1ZXMiLCJmaWx0ZXJCYXIiLCJfZ2V0QWRhcHRhdGlvbkZpbHRlckJhckNvbnRyb2wiLCJhcmd1bWVudHMiLCJGaWx0ZXJVdGlscyIsImNyZWF0ZUZpbHRlcnNGcm9tRmlsdGVyQ29uZGl0aW9ucyIsIm1GaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVySW5mbyIsInVuZGVmaW5lZCIsImdldEZpbHRlcnMiLCJzZXRDdXN0b21NZXNzYWdlIiwibWVzc2FnZSIsInRhYktleSIsIm9uQ2xvc2UiLCJMaXN0UmVwb3J0TWVzc2FnZVN0cmlwIiwiTFJNZXNzYWdlU3RyaXAiLCJzaG93Q3VzdG9tTWVzc2FnZSIsIkV4dGVuc2lvbkFQSSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRXh0ZW5zaW9uQVBJLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS9jb3JlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IExSQ3VzdG9tTWVzc2FnZSwgTFJNZXNzYWdlU3RyaXAgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9MUk1lc3NhZ2VTdHJpcFwiO1xuaW1wb3J0IENoYXJ0VXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRVdGlsc1wiO1xuaW1wb3J0IEZpbHRlclV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IHR5cGUgTGlzdFJlcG9ydENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyXCI7XG5cbi8qKlxuICogRXh0ZW5zaW9uIEFQSSBmb3IgbGlzdCByZXBvcnRzIGluIFNBUCBGaW9yaSBlbGVtZW50cyBmb3IgT0RhdGEgVjQuXG4gKlxuICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUElcbiAqIEBwdWJsaWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBmaW5hbFxuICogQHNpbmNlIDEuNzkuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJXCIpXG5jbGFzcyBMaXN0UmVwb3J0RXh0ZW5zaW9uQVBJIGV4dGVuZHMgRXh0ZW5zaW9uQVBJIHtcblx0cHJvdGVjdGVkIF9jb250cm9sbGVyITogTGlzdFJlcG9ydENvbnRyb2xsZXI7XG5cdExpc3RSZXBvcnRNZXNzYWdlU3RyaXAhOiBMUk1lc3NhZ2VTdHJpcDtcblx0LyoqXG5cdCAqIFJlZnJlc2hlcyB0aGUgTGlzdCBSZXBvcnQuXG5cdCAqIFRoaXMgbWV0aG9kIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHRyaWdnZXJpbmcgdGhlIHNlYXJjaCAoYnkgY2xpY2tpbmcgb24gdGhlIEdPIGJ1dHRvbilcblx0ICogaW4gdGhlIExpc3QgUmVwb3J0IEZpbHRlciBCYXIuIEl0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgdGhlIGluaXRpYWwgbG9hZCBvciB0byByZWZyZXNoIHRoZVxuXHQgKiBjdXJyZW50bHkgc2hvd24gZGF0YSBiYXNlZCBvbiB0aGUgZmlsdGVycyBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuXHQgKiBQbGVhc2Ugbm90ZTogVGhlIFByb21pc2UgaXMgcmVzb2x2ZWQgb25jZSB0aGUgc2VhcmNoIGlzIHRyaWdnZXJlZCBhbmQgbm90IG9uY2UgdGhlIGRhdGEgaXMgcmV0dXJuZWQuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJI3JlZnJlc2hcblx0ICogQHJldHVybnMgUmVzb2x2ZWQgb25jZSB0aGUgZGF0YSBpcyByZWZyZXNoZWQgb3IgcmVqZWN0ZWQgaWYgdGhlIHJlcXVlc3QgZmFpbGVkXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHJlZnJlc2goKSB7XG5cdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2NvbnRyb2xsZXIuX2dldEZpbHRlckJhckNvbnRyb2woKSBhcyBhbnk7XG5cdFx0aWYgKG9GaWx0ZXJCYXIpIHtcblx0XHRcdHJldHVybiBvRmlsdGVyQmFyLndhaXRGb3JJbml0aWFsaXphdGlvbigpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRvRmlsdGVyQmFyLnRyaWdnZXJTZWFyY2goKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUT0RPOiBpZiB0aGVyZSBpcyBubyBmaWx0ZXIgYmFyLCBtYWtlIHJlZnJlc2ggd29ya1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBsaXN0IGVudHJpZXMgY3VycmVudGx5IHNlbGVjdGVkIGZvciB0aGUgZGlzcGxheWVkIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJI2dldFNlbGVjdGVkQ29udGV4dHNcblx0ICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dHNcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0Z2V0U2VsZWN0ZWRDb250ZXh0cygpIHtcblx0XHRjb25zdCBvQ29udHJvbCA9ICgodGhpcy5fY29udHJvbGxlci5faXNNdWx0aU1vZGUoKSAmJlxuXHRcdFx0dGhpcy5fY29udHJvbGxlci5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpPy5nZXRTZWxlY3RlZElubmVyQ29udHJvbCgpPy5jb250ZW50KSB8fFxuXHRcdFx0dGhpcy5fY29udHJvbGxlci5fZ2V0VGFibGUoKSkgYXMgYW55O1xuXHRcdGlmIChvQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLkNoYXJ0XCIpKSB7XG5cdFx0XHRjb25zdCBhU2VsZWN0ZWRDb250ZXh0cyA9IFtdO1xuXHRcdFx0aWYgKG9Db250cm9sICYmIG9Db250cm9sLmdldF9jaGFydCgpKSB7XG5cdFx0XHRcdGNvbnN0IGFTZWxlY3RlZERhdGFQb2ludHMgPSBDaGFydFV0aWxzLmdldENoYXJ0U2VsZWN0ZWREYXRhKG9Db250cm9sLmdldF9jaGFydCgpKTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhU2VsZWN0ZWREYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHMucHVzaChhU2VsZWN0ZWREYXRhUG9pbnRzW2ldLmNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVNlbGVjdGVkQ29udGV4dHM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiAob0NvbnRyb2wgJiYgb0NvbnRyb2wuZ2V0U2VsZWN0ZWRDb250ZXh0cygpKSB8fCBbXTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBmaWx0ZXIgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgaW4gdGhlIGZpbHRlciBiYXIuXG5cdCAqIFRoZSBmaWx0ZXIgdmFsdWVzIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgdmFsdWUgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxuXHQgKiBFYWNoIGZpbHRlciB2YWx1ZSBtdXN0IGJlIHJlcHJlc2VudGVkIGFzIGEgcHJpbWl0aXZlIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0NvbmRpdGlvblBhdGggVGhlIHBhdGggdG8gdGhlIHByb3BlcnR5IGFzIGEgY29uZGl0aW9uIHBhdGhcblx0ICogQHBhcmFtIFtzT3BlcmF0b3JdIFRoZSBvcGVyYXRvciB0byBiZSB1c2VkIChvcHRpb25hbCkgLSBpZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBvcGVyYXRvciAoRVEpIHdpbGwgYmUgdXNlZFxuXHQgKiBAcGFyYW0gdlZhbHVlcyBUaGUgdmFsdWVzIHRvIGJlIGFwcGxpZWRcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUEkjc2V0RmlsdGVyVmFsdWVzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBmb3IgYXN5bmNocm9ub3VzIGhhbmRsaW5nXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHNldEZpbHRlclZhbHVlcyhcblx0XHRzQ29uZGl0aW9uUGF0aDogc3RyaW5nLFxuXHRcdHNPcGVyYXRvcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdHZWYWx1ZXM/OiB1bmRlZmluZWQgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXVxuXHQpIHtcblx0XHQvLyBUaGUgTGlzdCBSZXBvcnQgaGFzIHR3byBmaWx0ZXIgYmFyczogVGhlIGZpbHRlciBiYXIgaW4gdGhlIGhlYWRlciBhbmQgdGhlIGZpbHRlciBiYXIgaW4gdGhlIFwiQWRhcHQgRmlsdGVyXCIgZGlhbG9nO1xuXHRcdC8vIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuZWQsIHRoZSB1c2VyIGlzIHdvcmtpbmcgd2l0aCB0aGF0IGFjdGl2ZSBjb250cm9sOiBQYXNzIGl0IHRvIHRoZSBzZXRGaWx0ZXJWYWx1ZXMgbWV0aG9kIVxuXHRcdGNvbnN0IGZpbHRlckJhciA9IHRoaXMuX2NvbnRyb2xsZXIuX2dldEFkYXB0YXRpb25GaWx0ZXJCYXJDb250cm9sKCkgfHwgdGhpcy5fY29udHJvbGxlci5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHR2VmFsdWVzID0gc09wZXJhdG9yO1xuXHRcdFx0cmV0dXJuIEZpbHRlclV0aWxzLnNldEZpbHRlclZhbHVlcyhmaWx0ZXJCYXIsIHNDb25kaXRpb25QYXRoLCB2VmFsdWVzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gRmlsdGVyVXRpbHMuc2V0RmlsdGVyVmFsdWVzKGZpbHRlckJhciwgc0NvbmRpdGlvblBhdGgsIHNPcGVyYXRvciwgdlZhbHVlcyk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY29udmVydHMgZmlsdGVyIGNvbmRpdGlvbnMgdG8gZmlsdGVycy5cblx0ICpcblx0ICogQHBhcmFtIG1GaWx0ZXJDb25kaXRpb25zIE1hcCBjb250YWluaW5nIHRoZSBmaWx0ZXIgY29uZGl0aW9ucyBvZiB0aGUgRmlsdGVyQmFyLlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSSNjcmVhdGVGaWx0ZXJzRnJvbUZpbHRlckNvbmRpdGlvbnNcblx0ICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCBGaWx0ZXJCYXIgZmlsdGVycy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0Y3JlYXRlRmlsdGVyc0Zyb21GaWx0ZXJDb25kaXRpb25zKG1GaWx0ZXJDb25kaXRpb25zOiBhbnkpIHtcblx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fY29udHJvbGxlci5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdHJldHVybiBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJJbmZvKG9GaWx0ZXJCYXIsIHVuZGVmaW5lZCwgbUZpbHRlckNvbmRpdGlvbnMpO1xuXHR9XG5cdC8qKlxuXHQgKiBQcm92aWRlcyBhbGwgdGhlIG1vZGVsIGZpbHRlcnMgZnJvbSB0aGUgZmlsdGVyIGJhciB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlXG5cdCAqIGFsb25nIHdpdGggdGhlIHNlYXJjaCBleHByZXNzaW9uLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSSNnZXRGaWx0ZXJzXG5cdCAqIEByZXR1cm5zIHt7ZmlsdGVyczogc2FwLnVpLm1vZGVsLkZpbHRlcltdfHVuZGVmaW5lZCwgc2VhcmNoOiBzdHJpbmd8dW5kZWZpbmVkfX0gQW4gYXJyYXkgb2YgYWN0aXZlIGZpbHRlcnMgYW5kIHRoZSBzZWFyY2ggZXhwcmVzc2lvbi5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0Z2V0RmlsdGVycygpIHtcblx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fY29udHJvbGxlci5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdHJldHVybiBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJzKG9GaWx0ZXJCYXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGUgYW4gb3B0aW9uIGZvciBzaG93aW5nIGEgY3VzdG9tIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2Ugc3RyaXAgYWJvdmUgdGhlIGxpc3QgcmVwb3J0IHRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21lc3NhZ2VdIEN1c3RvbSBtZXNzYWdlIGFsb25nIHdpdGggdGhlIG1lc3NhZ2UgdHlwZSB0byBiZSBzZXQgb24gdGhlIHRhYmxlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZS5tZXNzYWdlIE1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGRpc3BsYXllZC5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS5NZXNzYWdlVHlwZX0gbWVzc2FnZS50eXBlIEluZGljYXRlcyB0aGUgdHlwZSBvZiBtZXNzYWdlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ1tdfHN0cmluZ30gW3RhYktleV0gVGhlIHRhYktleSBpZGVudGlmeWluZyB0aGUgdGFibGUgd2hlcmUgdGhlIGN1c3RvbSBtZXNzYWdlIGlzIGRpc3BsYXllZC4gSWYgdGFiS2V5IGlzIGVtcHR5LCB0aGUgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgaW4gYWxsIHRhYnMgLiBJZiB0YWJLZXkgPSBbJzEnLCcyJ10sIHRoZSBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiB0YWJzIDEgYW5kIDIgb25seVxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25DbG9zZV0gQSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgbWVzc2FnZSBiYXIuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHNldEN1c3RvbU1lc3NhZ2UobWVzc2FnZTogTFJDdXN0b21NZXNzYWdlIHwgdW5kZWZpbmVkLCB0YWJLZXk/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIG9uQ2xvc2U/OiBGdW5jdGlvbikge1xuXHRcdGlmICghdGhpcy5MaXN0UmVwb3J0TWVzc2FnZVN0cmlwKSB7XG5cdFx0XHR0aGlzLkxpc3RSZXBvcnRNZXNzYWdlU3RyaXAgPSBuZXcgTFJNZXNzYWdlU3RyaXAoKTtcblx0XHR9XG5cdFx0dGhpcy5MaXN0UmVwb3J0TWVzc2FnZVN0cmlwLnNob3dDdXN0b21NZXNzYWdlKG1lc3NhZ2UsIHRoaXMuX2NvbnRyb2xsZXIsIHRhYktleSwgb25DbG9zZSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlzdFJlcG9ydEV4dGVuc2lvbkFQSTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7OztFQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
147
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMaXN0UmVwb3J0RXh0ZW5zaW9uQVBJIiwiZGVmaW5lVUk1Q2xhc3MiLCJyZWZyZXNoIiwib0ZpbHRlckJhciIsIl9jb250cm9sbGVyIiwiX2dldEZpbHRlckJhckNvbnRyb2wiLCJ3YWl0Rm9ySW5pdGlhbGl6YXRpb24iLCJ0aGVuIiwidHJpZ2dlclNlYXJjaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIm9Db250cm9sIiwiX2lzTXVsdGlNb2RlIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJnZXRTZWxlY3RlZElubmVyQ29udHJvbCIsImNvbnRlbnQiLCJfZ2V0VGFibGUiLCJpc0EiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldF9jaGFydCIsImFTZWxlY3RlZERhdGFQb2ludHMiLCJDaGFydFV0aWxzIiwiZ2V0Q2hhcnRTZWxlY3RlZERhdGEiLCJpIiwibGVuZ3RoIiwicHVzaCIsImNvbnRleHQiLCJzZXRGaWx0ZXJWYWx1ZXMiLCJzQ29uZGl0aW9uUGF0aCIsInNPcGVyYXRvciIsInZWYWx1ZXMiLCJmaWx0ZXJCYXIiLCJfZ2V0QWRhcHRhdGlvbkZpbHRlckJhckNvbnRyb2wiLCJhcmd1bWVudHMiLCJGaWx0ZXJVdGlscyIsImNyZWF0ZUZpbHRlcnNGcm9tRmlsdGVyQ29uZGl0aW9ucyIsIm1GaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVySW5mbyIsInVuZGVmaW5lZCIsImdldEZpbHRlcnMiLCJzZXRDdXN0b21NZXNzYWdlIiwibWVzc2FnZSIsInRhYktleSIsIm9uQ2xvc2UiLCJMaXN0UmVwb3J0TWVzc2FnZVN0cmlwIiwiTFJNZXNzYWdlU3RyaXAiLCJzaG93Q3VzdG9tTWVzc2FnZSIsIkludmlzaWJsZU1lc3NhZ2UiLCJnZXRJbnN0YW5jZSIsImFubm91bmNlIiwiSW52aXNpYmxlTWVzc2FnZU1vZGUiLCJBc3NlcnRpdmUiLCJFeHRlbnNpb25BUEkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkV4dGVuc2lvbkFQSS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvY29yZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ2hhcnRVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSBMaXN0UmVwb3J0Q29udHJvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9MaXN0UmVwb3J0L0xpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IExSQ3VzdG9tTWVzc2FnZSwgTFJNZXNzYWdlU3RyaXAgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9MaXN0UmVwb3J0L0xSTWVzc2FnZVN0cmlwXCI7XG5pbXBvcnQgSW52aXNpYmxlTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvSW52aXNpYmxlTWVzc2FnZVwiO1xuaW1wb3J0IHsgSW52aXNpYmxlTWVzc2FnZU1vZGUgfSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuXG4vKipcbiAqIEV4dGVuc2lvbiBBUEkgZm9yIGxpc3QgcmVwb3J0cyBpbiBTQVAgRmlvcmkgZWxlbWVudHMgZm9yIE9EYXRhIFY0LlxuICpcbiAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJXG4gKiBAcHVibGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAZmluYWxcbiAqIEBzaW5jZSAxLjc5LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSVwiKVxuY2xhc3MgTGlzdFJlcG9ydEV4dGVuc2lvbkFQSSBleHRlbmRzIEV4dGVuc2lvbkFQSSB7XG5cdHByb3RlY3RlZCBfY29udHJvbGxlciE6IExpc3RSZXBvcnRDb250cm9sbGVyO1xuXHRMaXN0UmVwb3J0TWVzc2FnZVN0cmlwITogTFJNZXNzYWdlU3RyaXA7XG5cdC8qKlxuXHQgKiBSZWZyZXNoZXMgdGhlIExpc3QgUmVwb3J0LlxuXHQgKiBUaGlzIG1ldGhvZCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0cmlnZ2VyaW5nIHRoZSBzZWFyY2ggKGJ5IGNsaWNraW5nIG9uIHRoZSBHTyBidXR0b24pXG5cdCAqIGluIHRoZSBMaXN0IFJlcG9ydCBGaWx0ZXIgQmFyLiBJdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IHRoZSBpbml0aWFsIGxvYWQgb3IgdG8gcmVmcmVzaCB0aGVcblx0ICogY3VycmVudGx5IHNob3duIGRhdGEgYmFzZWQgb24gdGhlIGZpbHRlcnMgZW50ZXJlZCBieSB0aGUgdXNlci5cblx0ICogUGxlYXNlIG5vdGU6IFRoZSBQcm9taXNlIGlzIHJlc29sdmVkIG9uY2UgdGhlIHNlYXJjaCBpcyB0cmlnZ2VyZWQgYW5kIG5vdCBvbmNlIHRoZSBkYXRhIGlzIHJldHVybmVkLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSSNyZWZyZXNoXG5cdCAqIEByZXR1cm5zIFJlc29sdmVkIG9uY2UgdGhlIGRhdGEgaXMgcmVmcmVzaGVkIG9yIHJlamVjdGVkIGlmIHRoZSByZXF1ZXN0IGZhaWxlZFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRyZWZyZXNoKCkge1xuXHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9jb250cm9sbGVyLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkgYXMgYW55O1xuXHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRyZXR1cm4gb0ZpbHRlckJhci53YWl0Rm9ySW5pdGlhbGl6YXRpb24oKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0b0ZpbHRlckJhci50cmlnZ2VyU2VhcmNoKCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVE9ETzogaWYgdGhlcmUgaXMgbm8gZmlsdGVyIGJhciwgbWFrZSByZWZyZXNoIHdvcmtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgbGlzdCBlbnRyaWVzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIGRpc3BsYXllZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSSNnZXRTZWxlY3RlZENvbnRleHRzXG5cdCAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIGNvbnRleHRzXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGdldFNlbGVjdGVkQ29udGV4dHMoKSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2wgPSAoKHRoaXMuX2NvbnRyb2xsZXIuX2lzTXVsdGlNb2RlKCkgJiZcblx0XHRcdHRoaXMuX2NvbnRyb2xsZXIuX2dldE11bHRpTW9kZUNvbnRyb2woKT8uZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2woKT8uY29udGVudCkgfHxcblx0XHRcdHRoaXMuX2NvbnRyb2xsZXIuX2dldFRhYmxlKCkpIGFzIGFueTtcblx0XHRpZiAob0NvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSkge1xuXHRcdFx0Y29uc3QgYVNlbGVjdGVkQ29udGV4dHMgPSBbXTtcblx0XHRcdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRfY2hhcnQoKSkge1xuXHRcdFx0XHRjb25zdCBhU2VsZWN0ZWREYXRhUG9pbnRzID0gQ2hhcnRVdGlscy5nZXRDaGFydFNlbGVjdGVkRGF0YShvQ29udHJvbC5nZXRfY2hhcnQoKSk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVNlbGVjdGVkRGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzLnB1c2goYVNlbGVjdGVkRGF0YVBvaW50c1tpXS5jb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFTZWxlY3RlZENvbnRleHRzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKG9Db250cm9sICYmIG9Db250cm9sLmdldFNlbGVjdGVkQ29udGV4dHMoKSkgfHwgW107XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgZmlsdGVyIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IGluIHRoZSBmaWx0ZXIgYmFyLlxuXHQgKiBUaGUgZmlsdGVyIHZhbHVlcyBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHZhbHVlIG9yIGFuIGFycmF5IG9mIHZhbHVlcy5cblx0ICogRWFjaCBmaWx0ZXIgdmFsdWUgbXVzdCBiZSByZXByZXNlbnRlZCBhcyBhIHByaW1pdGl2ZSB2YWx1ZS5cblx0ICpcblx0ICogQHBhcmFtIHNDb25kaXRpb25QYXRoIFRoZSBwYXRoIHRvIHRoZSBwcm9wZXJ0eSBhcyBhIGNvbmRpdGlvbiBwYXRoXG5cdCAqIEBwYXJhbSBbc09wZXJhdG9yXSBUaGUgb3BlcmF0b3IgdG8gYmUgdXNlZCAob3B0aW9uYWwpIC0gaWYgbm90IHNldCwgdGhlIGRlZmF1bHQgb3BlcmF0b3IgKEVRKSB3aWxsIGJlIHVzZWRcblx0ICogQHBhcmFtIHZWYWx1ZXMgVGhlIHZhbHVlcyB0byBiZSBhcHBsaWVkXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJI3NldEZpbHRlclZhbHVlc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgZm9yIGFzeW5jaHJvbm91cyBoYW5kbGluZ1xuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRzZXRGaWx0ZXJWYWx1ZXMoXG5cdFx0c0NvbmRpdGlvblBhdGg6IHN0cmluZyxcblx0XHRzT3BlcmF0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHR2VmFsdWVzPzogdW5kZWZpbmVkIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZ1tdIHwgbnVtYmVyW10gfCBib29sZWFuW11cblx0KSB7XG5cdFx0Ly8gVGhlIExpc3QgUmVwb3J0IGhhcyB0d28gZmlsdGVyIGJhcnM6IFRoZSBmaWx0ZXIgYmFyIGluIHRoZSBoZWFkZXIgYW5kIHRoZSBmaWx0ZXIgYmFyIGluIHRoZSBcIkFkYXB0IEZpbHRlclwiIGRpYWxvZztcblx0XHQvLyB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLCB0aGUgdXNlciBpcyB3b3JraW5nIHdpdGggdGhhdCBhY3RpdmUgY29udHJvbDogUGFzcyBpdCB0byB0aGUgc2V0RmlsdGVyVmFsdWVzIG1ldGhvZCFcblx0XHRjb25zdCBmaWx0ZXJCYXIgPSB0aGlzLl9jb250cm9sbGVyLl9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCgpIHx8IHRoaXMuX2NvbnRyb2xsZXIuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0dlZhbHVlcyA9IHNPcGVyYXRvcjtcblx0XHRcdHJldHVybiBGaWx0ZXJVdGlscy5zZXRGaWx0ZXJWYWx1ZXMoZmlsdGVyQmFyLCBzQ29uZGl0aW9uUGF0aCwgdlZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEZpbHRlclV0aWxzLnNldEZpbHRlclZhbHVlcyhmaWx0ZXJCYXIsIHNDb25kaXRpb25QYXRoLCBzT3BlcmF0b3IsIHZWYWx1ZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIGZpbHRlciBjb25kaXRpb25zIHRvIGZpbHRlcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBtRmlsdGVyQ29uZGl0aW9ucyBNYXAgY29udGFpbmluZyB0aGUgZmlsdGVyIGNvbmRpdGlvbnMgb2YgdGhlIEZpbHRlckJhci5cblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUEkjY3JlYXRlRmlsdGVyc0Zyb21GaWx0ZXJDb25kaXRpb25zXG5cdCAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgRmlsdGVyQmFyIGZpbHRlcnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGNyZWF0ZUZpbHRlcnNGcm9tRmlsdGVyQ29uZGl0aW9ucyhtRmlsdGVyQ29uZGl0aW9uczogYW55KSB7XG5cdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2NvbnRyb2xsZXIuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRyZXR1cm4gRmlsdGVyVXRpbHMuZ2V0RmlsdGVySW5mbyhvRmlsdGVyQmFyLCB1bmRlZmluZWQsIG1GaWx0ZXJDb25kaXRpb25zKTtcblx0fVxuXHQvKipcblx0ICogUHJvdmlkZXMgYWxsIHRoZSBtb2RlbCBmaWx0ZXJzIGZyb20gdGhlIGZpbHRlciBiYXIgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZVxuXHQgKiBhbG9uZyB3aXRoIHRoZSBzZWFyY2ggZXhwcmVzc2lvbi5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUEkjZ2V0RmlsdGVyc1xuXHQgKiBAcmV0dXJucyB7e2ZpbHRlcnM6IHNhcC51aS5tb2RlbC5GaWx0ZXJbXXx1bmRlZmluZWQsIHNlYXJjaDogc3RyaW5nfHVuZGVmaW5lZH19IEFuIGFycmF5IG9mIGFjdGl2ZSBmaWx0ZXJzIGFuZCB0aGUgc2VhcmNoIGV4cHJlc3Npb24uXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGdldEZpbHRlcnMoKSB7XG5cdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2NvbnRyb2xsZXIuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRyZXR1cm4gRmlsdGVyVXRpbHMuZ2V0RmlsdGVycyhvRmlsdGVyQmFyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlIGFuIG9wdGlvbiBmb3Igc2hvd2luZyBhIGN1c3RvbSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIHN0cmlwIGFib3ZlIHRoZSBsaXN0IHJlcG9ydCB0YWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFttZXNzYWdlXSBDdXN0b20gbWVzc2FnZSBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIHR5cGUgdG8gYmUgc2V0IG9uIHRoZSB0YWJsZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UubWVzc2FnZSBNZXNzYWdlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUuTWVzc2FnZVR5cGV9IG1lc3NhZ2UudHlwZSBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgbWVzc2FnZS5cblx0ICogQHBhcmFtIHtzdHJpbmdbXXxzdHJpbmd9IFt0YWJLZXldIFRoZSB0YWJLZXkgaWRlbnRpZnlpbmcgdGhlIHRhYmxlIHdoZXJlIHRoZSBjdXN0b20gbWVzc2FnZSBpcyBkaXNwbGF5ZWQuIElmIHRhYktleSBpcyBlbXB0eSwgdGhlIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIGFsbCB0YWJzIC4gSWYgdGFiS2V5ID0gWycxJywnMiddLCB0aGUgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgaW4gdGFicyAxIGFuZCAyIG9ubHlcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ2xvc2VdIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIG1lc3NhZ2UgYmFyLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRzZXRDdXN0b21NZXNzYWdlKG1lc3NhZ2U6IExSQ3VzdG9tTWVzc2FnZSB8IHVuZGVmaW5lZCwgdGFiS2V5Pzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBvbkNsb3NlPzogRnVuY3Rpb24pIHtcblx0XHRpZiAoIXRoaXMuTGlzdFJlcG9ydE1lc3NhZ2VTdHJpcCkge1xuXHRcdFx0dGhpcy5MaXN0UmVwb3J0TWVzc2FnZVN0cmlwID0gbmV3IExSTWVzc2FnZVN0cmlwKCk7XG5cdFx0fVxuXHRcdHRoaXMuTGlzdFJlcG9ydE1lc3NhZ2VTdHJpcC5zaG93Q3VzdG9tTWVzc2FnZShtZXNzYWdlLCB0aGlzLl9jb250cm9sbGVyLCB0YWJLZXksIG9uQ2xvc2UpO1xuXHRcdGlmIChtZXNzYWdlPy5tZXNzYWdlKSB7XG5cdFx0XHRJbnZpc2libGVNZXNzYWdlLmdldEluc3RhbmNlKCkuYW5ub3VuY2UobWVzc2FnZS5tZXNzYWdlLCBJbnZpc2libGVNZXNzYWdlTW9kZS5Bc3NlcnRpdmUpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXN0UmVwb3J0RXh0ZW5zaW9uQVBJO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0VBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkEsSUFVTUEsc0JBQXNCLFdBRDNCQyxjQUFjLENBQUMsMENBQTBDLENBQUM7SUFBQTtJQUFBO01BQUE7SUFBQTtJQUFBO0lBSTFEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFWQyxPQVdBQyxPQUFPLEdBQVAsbUJBQVU7TUFDVCxJQUFNQyxVQUFVLEdBQUcsSUFBSSxDQUFDQyxXQUFXLENBQUNDLG9CQUFvQixFQUFTO01BQ2pFLElBQUlGLFVBQVUsRUFBRTtRQUNmLE9BQU9BLFVBQVUsQ0FBQ0cscUJBQXFCLEVBQUUsQ0FBQ0MsSUFBSSxDQUFDLFlBQVk7VUFDMURKLFVBQVUsQ0FBQ0ssYUFBYSxFQUFFO1FBQzNCLENBQUMsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNOO1FBQ0EsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLEVBQUU7TUFDekI7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQU5DO0lBQUEsT0FPQUMsbUJBQW1CLEdBQW5CLCtCQUFzQjtNQUFBO01BQ3JCLElBQU1DLFFBQVEsR0FBSyxJQUFJLENBQUNSLFdBQVcsQ0FBQ1MsWUFBWSxFQUFFLDhCQUNqRCxJQUFJLENBQUNULFdBQVcsQ0FB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
@@ -1,9 +1,11 @@
1
1
  import ExtensionAPI from "sap/fe/core/ExtensionAPI";
2
2
  import { defineUI5Class } from "sap/fe/core/helpers/ClassSupport";
3
- import { LRCustomMessage, LRMessageStrip } from "sap/fe/core/helpers/LRMessageStrip";
4
3
  import ChartUtils from "sap/fe/macros/chart/ChartUtils";
5
4
  import FilterUtils from "sap/fe/macros/filter/FilterUtils";
6
5
  import type ListReportController from "sap/fe/templates/ListReport/ListReportController.controller";
6
+ import { LRCustomMessage, LRMessageStrip } from "sap/fe/templates/ListReport/LRMessageStrip";
7
+ import InvisibleMessage from "sap/ui/core/InvisibleMessage";
8
+ import { InvisibleMessageMode } from "sap/ui/core/library";
7
9
 
8
10
  /**
9
11
  * Extension API for list reports in SAP Fiori elements for OData V4.
@@ -134,6 +136,9 @@ class ListReportExtensionAPI extends ExtensionAPI {
134
136
  this.ListReportMessageStrip = new LRMessageStrip();
135
137
  }
136
138
  this.ListReportMessageStrip.showCustomMessage(message, this._controller, tabKey, onClose);
139
+ if (message?.message) {
140
+ InvisibleMessage.getInstance().announce(message.message, InvisibleMessageMode.Assertive);
141
+ }
137
142
  }
138
143
  }
139
144
 
@@ -0,0 +1,196 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/ui/core/Core", "sap/ui/core/message/Message"], function (Core, Message) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ var LRMessageStrip = /*#__PURE__*/function () {
10
+ function LRMessageStrip() {
11
+ var messageManager = Core.getMessageManager();
12
+ this.customMessageInfo = {
13
+ messageManagerDataBinding: messageManager.getMessageModel().bindList("/"),
14
+ multiModeControlMessagesMap: {}
15
+ };
16
+ }
17
+ _exports.LRMessageStrip = LRMessageStrip;
18
+ var _proto = LRMessageStrip.prototype;
19
+ _proto.getCustomMessageInfo = function getCustomMessageInfo() {
20
+ return this.customMessageInfo;
21
+ };
22
+ _proto.destroy = function destroy() {
23
+ this.customMessageInfo.messageManagerDataBinding.detachChange(this._eventHandlerCustomMessage, this);
24
+ };
25
+ _proto._getMessagesWithSameTargetThanCustomMessage = function _getMessagesWithSameTargetThanCustomMessage() {
26
+ var _this = this;
27
+ var messageManager = Core.getMessageManager();
28
+ return messageManager.getMessageModel().getData().filter(function (msg) {
29
+ var _this$customMessageIn;
30
+ return msg.getTargets()[0] === ((_this$customMessageIn = _this.customMessageInfo.currentMessage) === null || _this$customMessageIn === void 0 ? void 0 : _this$customMessageIn.getTargets()[0]) && msg !== _this.customMessageInfo.currentMessage;
31
+ });
32
+ }
33
+
34
+ /**
35
+ * MessageManager Event Handler responsible to add or remove the current customMessage.
36
+ *
37
+ * @alias sap.fe.core.helpers.LRMessageStrip#_eventHandlerCustomMessage
38
+ * @private
39
+ */;
40
+ _proto._eventHandlerCustomMessage = function _eventHandlerCustomMessage() {
41
+ var _this2 = this;
42
+ var messageManager = Core.getMessageManager();
43
+ if (this.customMessageInfo.currentMessage) {
44
+ var aMessageWithSameTargetThanCustomMessage = this._getMessagesWithSameTargetThanCustomMessage();
45
+ var isCustomMessageInMessageManager = !!messageManager.getMessageModel().getData().find(function (msg) {
46
+ return msg === _this2.customMessageInfo.currentMessage;
47
+ });
48
+ if (aMessageWithSameTargetThanCustomMessage.length > 0 && isCustomMessageInMessageManager) {
49
+ var _this$customMessageIn2;
50
+ //if there are other messages with the same message on the MessageManager and the customMessage
51
+ //then we need to remove the customeMessage from the MessageManager
52
+ messageManager.removeMessages([(_this$customMessageIn2 = this.customMessageInfo) === null || _this$customMessageIn2 === void 0 ? void 0 : _this$customMessageIn2.currentMessage]);
53
+ } else if (aMessageWithSameTargetThanCustomMessage.length === 0 && !isCustomMessageInMessageManager) {
54
+ messageManager.addMessages([this.customMessageInfo.currentMessage]);
55
+ }
56
+ }
57
+ }
58
+
59
+ /**
60
+ * This function manages the lifecycle of the custom message (populates the customMessageInfo object, attaches an event to the message manager and inserts a message).
61
+ *
62
+ * @param event Event object (optional).
63
+ * @param oData Parameters
64
+ * @param oData.message The LRCustomMessage to be used to generate the message object
65
+ * @param oData.table The table targeted by the message
66
+ * @param oData.skipMessageManagerUpdate Should skip to insert the message in the MessageManager
67
+ * @alias sap.fe.core.helpers.LRMessageStrip#createCustomMessage
68
+ * @private
69
+ */;
70
+ _proto.createCustomMessage = function createCustomMessage(event, oData) {
71
+ var _table$getRowBinding, _customMessageMap$tab;
72
+ var message = oData.message;
73
+ var table = oData.table;
74
+ var skipMessageManagerUpdate = oData.skipMessageManagerUpdate;
75
+ var rowBindingPath = (_table$getRowBinding = table.getRowBinding()) === null || _table$getRowBinding === void 0 ? void 0 : _table$getRowBinding.getPath();
76
+ var messageManager = Core.getMessageManager();
77
+ var customMessageMap = this.customMessageInfo.multiModeControlMessagesMap;
78
+ customMessageMap[table.getId()] = message;
79
+ if (!rowBindingPath) {
80
+ table.attachEventOnce("bindingUpdated", oData, this.createCustomMessage, this);
81
+ return;
82
+ }
83
+ if ((_customMessageMap$tab = customMessageMap[table.getId()]) !== null && _customMessageMap$tab !== void 0 && _customMessageMap$tab.onClose) {
84
+ var _customMessageMap$tab2;
85
+ table.getDataStateIndicator().detachEvent("close", (_customMessageMap$tab2 = customMessageMap[table.getId()]) === null || _customMessageMap$tab2 === void 0 ? void 0 : _customMessageMap$tab2.onClose, this);
86
+ }
87
+ var processor = table.getModel();
88
+ var oMessage = message ? new Message({
89
+ message: message.message,
90
+ type: message.type,
91
+ target: [rowBindingPath],
92
+ persistent: true,
93
+ processor: processor
94
+ }) : null;
95
+ this.customMessageInfo.messageManagerDataBinding.detachChange(this._eventHandlerCustomMessage, this);
96
+ if (!skipMessageManagerUpdate) {
97
+ if (this.customMessageInfo.currentMessage) {
98
+ messageManager.removeMessages([this.customMessageInfo.currentMessage]);
99
+ }
100
+ if (oMessage) {
101
+ this.customMessageInfo.currentMessage = oMessage;
102
+ } else {
103
+ delete this.customMessageInfo.currentMessage;
104
+ }
105
+ if (oMessage && this._getMessagesWithSameTargetThanCustomMessage().length === 0) {
106
+ messageManager.addMessages([oMessage]);
107
+ }
108
+ }
109
+ this.customMessageInfo.messageManagerDataBinding.attachChange(this._eventHandlerCustomMessage, this);
110
+ this.attachDataStateIndicatorCloseEvent(table, customMessageMap, message === null || message === void 0 ? void 0 : message.onClose);
111
+ }
112
+
113
+ /**
114
+ * This function attaches the onClose event function to the dataStateIndicator.
115
+ *
116
+ * @param table The table associated with the dataStateIndicator
117
+ * @param customMessageMap The CustomMessageMap object
118
+ * @param fnOnClose A function to be attached to the "close" event
119
+ * @alias sap.fe.core.helpers.LRMessageStrip#attachDataStateIndicatorCloseEvent
120
+ * @private
121
+ */;
122
+ _proto.attachDataStateIndicatorCloseEvent = function attachDataStateIndicatorCloseEvent(table, customMessageMap, fnOnClose) {
123
+ if (fnOnClose) {
124
+ table.getDataStateIndicator().attachEventOnce("close", fnOnClose, this);
125
+ }
126
+ //When closing the the messageStrip, the associated message is removed
127
+ table.getDataStateIndicator().attachEventOnce("close", function () {
128
+ delete customMessageMap[table.getId()];
129
+ });
130
+ }
131
+
132
+ /**
133
+ * MultipleModeControl Event handler responsible for displaying the correct custom message when a specific tab is selected.
134
+ *
135
+ * @alias sap.fe.core.helpers.LRMessageStrip#onSelectMultipleModeControl
136
+ * @private
137
+ */;
138
+ _proto.onSelectMultipleModeControl = function onSelectMultipleModeControl(event, controller) {
139
+ var table = controller._getTable();
140
+ var message = this.customMessageInfo.multiModeControlMessagesMap[table.getId()];
141
+ this.createCustomMessage(null, {
142
+ message: message,
143
+ table: table
144
+ });
145
+ }
146
+
147
+ /**
148
+ * Provide an option for showing a custom message in the message bar above the list report table.
149
+ *
150
+ * @param {object} [message] Custom message along with the message type to be set on the table.
151
+ * @param {string} [message.message] Message string to be displayed.
152
+ * @param {sap.ui.core.MessageType} [message.type] Indicates the type of message.
153
+ * @param {ListReportController} [controller] Controller of the current view.
154
+ * @param {string[]|string} [tabKey] The entitySet identifying the table in which to display the custom message.
155
+ * @param {Function} [onClose] A function that is called when the user closes the message bar.
156
+ * @private
157
+ */;
158
+ _proto.showCustomMessage = function showCustomMessage(message, controller, tabKey, onClose) {
159
+ var _this3 = this;
160
+ var _tabKey = Array.isArray(tabKey) ? tabKey : [tabKey];
161
+ var isMultiMode = controller._isMultiMode();
162
+ var table;
163
+ if (message) {
164
+ message.onClose = onClose;
165
+ }
166
+ if (isMultiMode) {
167
+ var multipleModeControl = controller._getMultiModeControl();
168
+ //we fisrt need to detach the select event to prevent multiple attachments.
169
+ multipleModeControl.detachEvent("select", this.onSelectMultipleModeControl, this);
170
+ multipleModeControl.attachEvent("select", controller, this.onSelectMultipleModeControl, this);
171
+ multipleModeControl.getAllInnerControls(true).forEach(function (innerControl, index) {
172
+ if (innerControl.isA("sap.fe.macros.table.TableAPI")) {
173
+ if (!tabKey || _tabKey.indexOf(index.toString()) !== -1) {
174
+ table = innerControl.getContent();
175
+ _this3.createCustomMessage(null, {
176
+ message: message,
177
+ table: table,
178
+ skipMessageManagerUpdate: multipleModeControl.getSelectedInnerControl() !== innerControl
179
+ });
180
+ }
181
+ }
182
+ });
183
+ return;
184
+ }
185
+ table = controller._getTable();
186
+ this.createCustomMessage(null, {
187
+ message: message,
188
+ table: table
189
+ });
190
+ };
191
+ return LRMessageStrip;
192
+ }();
193
+ _exports.LRMessageStrip = LRMessageStrip;
194
+ return _exports;
195
+ }, false);
196
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMUk1lc3NhZ2VTdHJpcCIsIm1lc3NhZ2VNYW5hZ2VyIiwiQ29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiY3VzdG9tTWVzc2FnZUluZm8iLCJtZXNzYWdlTWFuYWdlckRhdGFCaW5kaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiYmluZExpc3QiLCJtdWx0aU1vZGVDb250cm9sTWVzc2FnZXNNYXAiLCJnZXRDdXN0b21NZXNzYWdlSW5mbyIsImRlc3Ryb3kiLCJkZXRhY2hDaGFuZ2UiLCJfZXZlbnRIYW5kbGVyQ3VzdG9tTWVzc2FnZSIsIl9nZXRNZXNzYWdlc1dpdGhTYW1lVGFyZ2V0VGhhbkN1c3RvbU1lc3NhZ2UiLCJnZXREYXRhIiwiZmlsdGVyIiwibXNnIiwiZ2V0VGFyZ2V0cyIsImN1cnJlbnRNZXNzYWdlIiwiYU1lc3NhZ2VXaXRoU2FtZVRhcmdldFRoYW5DdXN0b21NZXNzYWdlIiwiaXNDdXN0b21NZXNzYWdlSW5NZXNzYWdlTWFuYWdlciIsImZpbmQiLCJsZW5ndGgiLCJyZW1vdmVNZXNzYWdlcyIsImFkZE1lc3NhZ2VzIiwiY3JlYXRlQ3VzdG9tTWVzc2FnZSIsImV2ZW50Iiwib0RhdGEiLCJtZXNzYWdlIiwidGFibGUiLCJza2lwTWVzc2FnZU1hbmFnZXJVcGRhdGUiLCJyb3dCaW5kaW5nUGF0aCIsImdldFJvd0JpbmRpbmciLCJnZXRQYXRoIiwiY3VzdG9tTWVzc2FnZU1hcCIsImdldElkIiwiYXR0YWNoRXZlbnRPbmNlIiwib25DbG9zZSIsImdldERhdGFTdGF0ZUluZGljYXRvciIsImRldGFjaEV2ZW50IiwicHJvY2Vzc29yIiwiZ2V0TW9kZWwiLCJvTWVzc2FnZSIsIk1lc3NhZ2UiLCJ0eXBlIiwidGFyZ2V0IiwicGVyc2lzdGVudCIsImF0dGFjaENoYW5nZSIsImF0dGFjaERhdGFTdGF0ZUluZGljYXRvckNsb3NlRXZlbnQiLCJmbk9uQ2xvc2UiLCJvblNlbGVjdE11bHRpcGxlTW9kZUNvbnRyb2wiLCJjb250cm9sbGVyIiwiX2dldFRhYmxlIiwic2hvd0N1c3RvbU1lc3NhZ2UiLCJ0YWJLZXkiLCJfdGFiS2V5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXNNdWx0aU1vZGUiLCJfaXNNdWx0aU1vZGUiLCJtdWx0aXBsZU1vZGVDb250cm9sIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJhdHRhY2hFdmVudCIsImdldEFsbElubmVyQ29udHJvbHMiLCJmb3JFYWNoIiwiaW5uZXJDb250cm9sIiwiaW5kZXgiLCJpc0EiLCJpbmRleE9mIiwidG9TdHJpbmciLCJnZXRDb250ZW50IiwiZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2wiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkxSTWVzc2FnZVN0cmlwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSW5uZXJDb250cm9sVHlwZSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0xpc3RSZXBvcnQvY29udHJvbHMvTXVsdGlwbGVNb2RlQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgTGlzdFJlcG9ydENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNRENUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9MaXN0QmluZGluZ1wiO1xuXG5leHBvcnQgdHlwZSBMUkN1c3RvbU1lc3NhZ2UgPSB7XG5cdG1lc3NhZ2U6IHN0cmluZztcblx0dHlwZT86IE1lc3NhZ2VUeXBlO1xuXHRvbkNsb3NlPzogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgY2xhc3MgTFJNZXNzYWdlU3RyaXAge1xuXHRjdXN0b21NZXNzYWdlSW5mbyE6IHtcblx0XHRtZXNzYWdlTWFuYWdlckRhdGFCaW5kaW5nOiBMaXN0QmluZGluZztcblx0XHRjdXJyZW50TWVzc2FnZT86IE1lc3NhZ2U7XG5cdFx0bXVsdGlNb2RlQ29udHJvbE1lc3NhZ2VzTWFwOiB7IFtrZXk6IHN0cmluZ106IExSQ3VzdG9tTWVzc2FnZSB8IHVuZGVmaW5lZCB9O1xuXHR9O1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBtZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHR0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvID0ge1xuXHRcdFx0bWVzc2FnZU1hbmFnZXJEYXRhQmluZGluZzogbWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuYmluZExpc3QoXCIvXCIpLFxuXHRcdFx0bXVsdGlNb2RlQ29udHJvbE1lc3NhZ2VzTWFwOiB7fVxuXHRcdH07XG5cdH1cblx0Z2V0Q3VzdG9tTWVzc2FnZUluZm8oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3VzdG9tTWVzc2FnZUluZm87XG5cdH1cblx0ZGVzdHJveSgpIHtcblx0XHR0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLm1lc3NhZ2VNYW5hZ2VyRGF0YUJpbmRpbmcuZGV0YWNoQ2hhbmdlKHRoaXMuX2V2ZW50SGFuZGxlckN1c3RvbU1lc3NhZ2UsIHRoaXMpO1xuXHR9XG5cdF9nZXRNZXNzYWdlc1dpdGhTYW1lVGFyZ2V0VGhhbkN1c3RvbU1lc3NhZ2UoKSB7XG5cdFx0Y29uc3QgbWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0cmV0dXJuIG1lc3NhZ2VNYW5hZ2VyXG5cdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdChtc2c6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdFx0bXNnLmdldFRhcmdldHMoKVswXSA9PT0gdGhpcy5jdXN0b21NZXNzYWdlSW5mby5jdXJyZW50TWVzc2FnZT8uZ2V0VGFyZ2V0cygpWzBdICYmXG5cdFx0XHRcdFx0bXNnICE9PSB0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1lc3NhZ2VNYW5hZ2VyIEV2ZW50IEhhbmRsZXIgcmVzcG9uc2libGUgdG8gYWRkIG9yIHJlbW92ZSB0aGUgY3VycmVudCBjdXN0b21NZXNzYWdlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuaGVscGVycy5MUk1lc3NhZ2VTdHJpcCNfZXZlbnRIYW5kbGVyQ3VzdG9tTWVzc2FnZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2V2ZW50SGFuZGxlckN1c3RvbU1lc3NhZ2UoKSB7XG5cdFx0Y29uc3QgbWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0aWYgKHRoaXMuY3VzdG9tTWVzc2FnZUluZm8uY3VycmVudE1lc3NhZ2UpIHtcblx0XHRcdGNvbnN0IGFNZXNzYWdlV2l0aFNhbWVUYXJnZXRUaGFuQ3VzdG9tTWVzc2FnZSA9IHRoaXMuX2dldE1lc3NhZ2VzV2l0aFNhbWVUYXJnZXRUaGFuQ3VzdG9tTWVzc2FnZSgpO1xuXHRcdFx0Y29uc3QgaXNDdXN0b21NZXNzYWdlSW5NZXNzYWdlTWFuYWdlciA9ICEhbWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZpbmQoKG1zZzogTWVzc2FnZSkgPT4gbXNnID09PSB0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlKTtcblxuXHRcdFx0aWYgKGFNZXNzYWdlV2l0aFNhbWVUYXJnZXRUaGFuQ3VzdG9tTWVzc2FnZS5sZW5ndGggPiAwICYmIGlzQ3VzdG9tTWVzc2FnZUluTWVzc2FnZU1hbmFnZXIpIHtcblx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgb3RoZXIgbWVzc2FnZXMgd2l0aCB0aGUgc2FtZSBtZXNzYWdlIG9uIHRoZSBNZXNzYWdlTWFuYWdlciBhbmQgdGhlIGN1c3RvbU1lc3NhZ2Vcblx0XHRcdFx0Ly90aGVuIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBjdXN0b21lTWVzc2FnZSBmcm9tIHRoZSBNZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRtZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhbdGhpcy5jdXN0b21NZXNzYWdlSW5mbz8uY3VycmVudE1lc3NhZ2VdKTtcblx0XHRcdH0gZWxzZSBpZiAoYU1lc3NhZ2VXaXRoU2FtZVRhcmdldFRoYW5DdXN0b21NZXNzYWdlLmxlbmd0aCA9PT0gMCAmJiAhaXNDdXN0b21NZXNzYWdlSW5NZXNzYWdlTWFuYWdlcikge1xuXHRcdFx0XHRtZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhbdGhpcy5jdXN0b21NZXNzYWdlSW5mby5jdXJyZW50TWVzc2FnZV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIG1hbmFnZXMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgY3VzdG9tIG1lc3NhZ2UgKHBvcHVsYXRlcyB0aGUgY3VzdG9tTWVzc2FnZUluZm8gb2JqZWN0LCBhdHRhY2hlcyBhbiBldmVudCB0byB0aGUgbWVzc2FnZSBtYW5hZ2VyIGFuZCBpbnNlcnRzIGEgbWVzc2FnZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBFdmVudCBvYmplY3QgKG9wdGlvbmFsKS5cblx0ICogQHBhcmFtIG9EYXRhIFBhcmFtZXRlcnNcblx0ICogQHBhcmFtIG9EYXRhLm1lc3NhZ2UgVGhlIExSQ3VzdG9tTWVzc2FnZSB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtZXNzYWdlIG9iamVjdFxuXHQgKiBAcGFyYW0gb0RhdGEudGFibGUgVGhlIHRhYmxlIHRhcmdldGVkIGJ5IHRoZSBtZXNzYWdlXG5cdCAqIEBwYXJhbSBvRGF0YS5za2lwTWVzc2FnZU1hbmFnZXJVcGRhdGUgU2hvdWxkIHNraXAgdG8gaW5zZXJ0IHRoZSBtZXNzYWdlIGluIHRoZSBNZXNzYWdlTWFuYWdlclxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuaGVscGVycy5MUk1lc3NhZ2VTdHJpcCNjcmVhdGVDdXN0b21NZXNzYWdlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21NZXNzYWdlKFxuXHRcdGV2ZW50OiBFdmVudCB8IG51bGwsXG5cdFx0b0RhdGE6IHsgbWVzc2FnZTogTFJDdXN0b21NZXNzYWdlIHwgdW5kZWZpbmVkOyB0YWJsZTogTURDVGFibGU7IHNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZT86IGJvb2xlYW4gfVxuXHQpIHtcblx0XHRjb25zdCBtZXNzYWdlID0gb0RhdGEubWVzc2FnZTtcblx0XHRjb25zdCB0YWJsZSA9IG9EYXRhLnRhYmxlO1xuXHRcdGNvbnN0IHNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZSA9IG9EYXRhLnNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZTtcblx0XHRjb25zdCByb3dCaW5kaW5nUGF0aCA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKT8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdGNvbnN0IGN1c3RvbU1lc3NhZ2VNYXAgPSB0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLm11bHRpTW9kZUNvbnRyb2xNZXNzYWdlc01hcDtcblx0XHRjdXN0b21NZXNzYWdlTWFwW3RhYmxlLmdldElkKCldID0gbWVzc2FnZTtcblx0XHRpZiAoIXJvd0JpbmRpbmdQYXRoKSB7XG5cdFx0XHR0YWJsZS5hdHRhY2hFdmVudE9uY2UoXCJiaW5kaW5nVXBkYXRlZFwiLCBvRGF0YSwgdGhpcy5jcmVhdGVDdXN0b21NZXNzYWdlLCB0aGlzKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY3VzdG9tTWVzc2FnZU1hcFt0YWJsZS5nZXRJZCgpXT8ub25DbG9zZSkge1xuXHRcdFx0dGFibGUuZ2V0RGF0YVN0YXRlSW5kaWNhdG9yKCkuZGV0YWNoRXZlbnQoXCJjbG9zZVwiLCBjdXN0b21NZXNzYWdlTWFwW3RhYmxlLmdldElkKCldPy5vbkNsb3NlIGFzIEZ1bmN0aW9uLCB0aGlzKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0YWJsZS5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG9NZXNzYWdlID0gbWVzc2FnZVxuXHRcdFx0PyBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0bWVzc2FnZTogbWVzc2FnZS5tZXNzYWdlLFxuXHRcdFx0XHRcdHR5cGU6IG1lc3NhZ2UudHlwZSxcblx0XHRcdFx0XHR0YXJnZXQ6IFtyb3dCaW5kaW5nUGF0aF0sXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRwcm9jZXNzb3Jcblx0XHRcdCAgfSlcblx0XHRcdDogbnVsbDtcblxuXHRcdHRoaXMuY3VzdG9tTWVzc2FnZUluZm8ubWVzc2FnZU1hbmFnZXJEYXRhQmluZGluZy5kZXRhY2hDaGFuZ2UodGhpcy5fZXZlbnRIYW5kbGVyQ3VzdG9tTWVzc2FnZSwgdGhpcyk7XG5cdFx0aWYgKCFza2lwTWVzc2FnZU1hbmFnZXJVcGRhdGUpIHtcblx0XHRcdGlmICh0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlKSB7XG5cdFx0XHRcdG1lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKFt0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlXSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01lc3NhZ2UpIHtcblx0XHRcdFx0dGhpcy5jdXN0b21NZXNzYWdlSW5mby5jdXJyZW50TWVzc2FnZSA9IG9NZXNzYWdlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuY3VzdG9tTWVzc2FnZUluZm8uY3VycmVudE1lc3NhZ2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01lc3NhZ2UgJiYgdGhpcy5fZ2V0TWVzc2FnZXNXaXRoU2FtZVRhcmdldFRoYW5DdXN0b21NZXNzYWdlKCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdG1lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFtvTWVzc2FnZV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLm1lc3NhZ2VNYW5hZ2VyRGF0YUJpbmRpbmcuYXR0YWNoQ2hhbmdlKHRoaXMuX2V2ZW50SGFuZGxlckN1c3RvbU1lc3NhZ2UsIHRoaXMpO1xuXG5cdFx0dGhpcy5hdHRhY2hEYXRhU3RhdGVJbmRpY2F0b3JDbG9zZUV2ZW50KHRhYmxlLCBjdXN0b21NZXNzYWdlTWFwLCBtZXNzYWdlPy5vbkNsb3NlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIHRoZSBvbkNsb3NlIGV2ZW50IGZ1bmN0aW9uIHRvIHRoZSBkYXRhU3RhdGVJbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhU3RhdGVJbmRpY2F0b3Jcblx0ICogQHBhcmFtIGN1c3RvbU1lc3NhZ2VNYXAgVGhlIEN1c3RvbU1lc3NhZ2VNYXAgb2JqZWN0XG5cdCAqIEBwYXJhbSBmbk9uQ2xvc2UgQSBmdW5jdGlvbiB0byBiZSBhdHRhY2hlZCB0byB0aGUgXCJjbG9zZVwiIGV2ZW50XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5oZWxwZXJzLkxSTWVzc2FnZVN0cmlwI2F0dGFjaERhdGFTdGF0ZUluZGljYXRvckNsb3NlRXZlbnRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGF0dGFjaERhdGFTdGF0ZUluZGljYXRvckNsb3NlRXZlbnQoXG5cdFx0dGFibGU6IE1EQ1RhYmxlLFxuXHRcdGN1c3RvbU1lc3NhZ2VNYXA6IHsgW2tleTogc3RyaW5nXTogTFJDdXN0b21NZXNzYWdlIHwgdW5kZWZpbmVkIH0sXG5cdFx0Zm5PbkNsb3NlPzogRnVuY3Rpb25cblx0KSB7XG5cdFx0aWYgKGZuT25DbG9zZSkge1xuXHRcdFx0dGFibGUuZ2V0RGF0YVN0YXRlSW5kaWNhdG9yKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2xvc2VcIiwgZm5PbkNsb3NlLCB0aGlzKTtcblx0XHR9XG5cdFx0Ly9XaGVuIGNsb3NpbmcgdGhlIHRoZSBtZXNzYWdlU3RyaXAsIHRoZSBhc3NvY2lhdGVkIG1lc3NhZ2UgaXMgcmVtb3ZlZFxuXHRcdHRhYmxlLmdldERhdGFTdGF0ZUluZGljYXRvcigpLmF0dGFjaEV2ZW50T25jZShcImNsb3NlXCIsICgpID0+IHtcblx0XHRcdGRlbGV0ZSBjdXN0b21NZXNzYWdlTWFwW3RhYmxlLmdldElkKCldO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE11bHRpcGxlTW9kZUNvbnRyb2wgRXZlbnQgaGFuZGxlciByZXNwb25zaWJsZSBmb3IgZGlzcGxheWluZyB0aGUgY29ycmVjdCBjdXN0b20gbWVzc2FnZSB3aGVuIGEgc3BlY2lmaWMgdGFiIGlzIHNlbGVjdGVkLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuaGVscGVycy5MUk1lc3NhZ2VTdHJpcCNvblNlbGVjdE11bHRpcGxlTW9kZUNvbnRyb2xcblx0ICogQHByaXZhdGVcblx0ICovXG5cblx0b25TZWxlY3RNdWx0aXBsZU1vZGVDb250cm9sKGV2ZW50OiBFdmVudCwgY29udHJvbGxlcjogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRjb25zdCB0YWJsZSA9IGNvbnRyb2xsZXIuX2dldFRhYmxlKCkgYXMgTURDVGFibGU7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHRoaXMuY3VzdG9tTWVzc2FnZUluZm8ubXVsdGlNb2RlQ29udHJvbE1lc3NhZ2VzTWFwW3RhYmxlLmdldElkKCldO1xuXHRcdHRoaXMuY3JlYXRlQ3VzdG9tTWVzc2FnZShudWxsLCB7IG1lc3NhZ2UsIHRhYmxlIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGUgYW4gb3B0aW9uIGZvciBzaG93aW5nIGEgY3VzdG9tIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgYmFyIGFib3ZlIHRoZSBsaXN0IHJlcG9ydCB0YWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFttZXNzYWdlXSBDdXN0b20gbWVzc2FnZSBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIHR5cGUgdG8gYmUgc2V0IG9uIHRoZSB0YWJsZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlLm1lc3NhZ2VdIE1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGRpc3BsYXllZC5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS5NZXNzYWdlVHlwZX0gW21lc3NhZ2UudHlwZV0gSW5kaWNhdGVzIHRoZSB0eXBlIG9mIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSB7TGlzdFJlcG9ydENvbnRyb2xsZXJ9IFtjb250cm9sbGVyXSBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXcuXG5cdCAqIEBwYXJhbSB7c3RyaW5nW118c3RyaW5nfSBbdGFiS2V5XSBUaGUgZW50aXR5U2V0IGlkZW50aWZ5aW5nIHRoZSB0YWJsZSBpbiB3aGljaCB0byBkaXNwbGF5IHRoZSBjdXN0b20gbWVzc2FnZS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ2xvc2VdIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIG1lc3NhZ2UgYmFyLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0c2hvd0N1c3RvbU1lc3NhZ2UoXG5cdFx0bWVzc2FnZTogTFJDdXN0b21NZXNzYWdlIHwgdW5kZWZpbmVkLFxuXHRcdGNvbnRyb2xsZXI6IExpc3RSZXBvcnRDb250cm9sbGVyLFxuXHRcdHRhYktleT86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCxcblx0XHRvbkNsb3NlPzogRnVuY3Rpb25cblx0KSB7XG5cdFx0Y29uc3QgX3RhYktleSA9IEFycmF5LmlzQXJyYXkodGFiS2V5KSA/IHRhYktleSA6IFt0YWJLZXldO1xuXHRcdGNvbnN0IGlzTXVsdGlNb2RlID0gY29udHJvbGxlci5faXNNdWx0aU1vZGUoKTtcblx0XHRsZXQgdGFibGU6IE1EQ1RhYmxlO1xuXHRcdGlmIChtZXNzYWdlKSB7XG5cdFx0XHRtZXNzYWdlLm9uQ2xvc2UgPSBvbkNsb3NlO1xuXHRcdH1cblx0XHRpZiAoaXNNdWx0aU1vZGUpIHtcblx0XHRcdGNvbnN0IG11bHRpcGxlTW9kZUNvbnRyb2wgPSBjb250cm9sbGVyLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0XHQvL3dlIGZpc3J0IG5lZWQgdG8gZGV0YWNoIHRoZSBzZWxlY3QgZXZlbnQgdG8gcHJldmVudCBtdWx0aXBsZSBhdHRhY2htZW50cy5cblx0XHRcdG11bHRpcGxlTW9kZUNvbnRyb2wuZGV0YWNoRXZlbnQoXCJzZWxlY3RcIiwgdGhpcy5vblNlbGVjdE11bHRpcGxlTW9kZUNvbnRyb2wsIHRoaXMpO1xuXHRcdFx0bXVsdGlwbGVNb2RlQ29udHJvbC5hdHRhY2hFdmVudChcInNlbGVjdFwiLCBjb250cm9sbGVyLCB0aGlzLm9uU2VsZWN0TXVsdGlwbGVNb2RlQ29udHJvbCwgdGhpcyk7XG5cblx0XHRcdG11bHRpcGxlTW9kZUNvbnRyb2wuZ2V0QWxsSW5uZXJDb250cm9scyh0cnVlKS5mb3JFYWNoKChpbm5lckNvbnRyb2w6IElubmVyQ29udHJvbFR5cGUsIGluZGV4OiBudW1iZXIpID0+IHtcblx0XHRcdFx0aWYgKGlubmVyQ29udHJvbC5pc0EoXCJzYXAuZmUubWFjcm9zLnRhYmxlLlRhYmxlQVBJXCIpKSB7XG5cdFx0XHRcdFx0aWYgKCF0YWJLZXkgfHwgX3RhYktleS5pbmRleE9mKGluZGV4LnRvU3RyaW5nKCkpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0dGFibGUgPSAoaW5uZXJDb250cm9sIGFzIGFueSkuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRcdFx0dGhpcy5jcmVhdGVDdXN0b21NZXNzYWdlKG51bGwsIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdFx0XHRcdHNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZTogbXVsdGlwbGVNb2RlQ29udHJvbC5nZXRTZWxlY3RlZElubmVyQ29udHJvbCgpICE9PSBpbm5lckNvbnRyb2xcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGFibGUgPSBjb250cm9sbGVyLl9nZXRUYWJsZSgpIGFzIE1EQ1RhYmxlO1xuXHRcdHRoaXMuY3JlYXRlQ3VzdG9tTWVzc2FnZShudWxsLCB7IG1lc3NhZ2UsIHRhYmxlIH0pO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O01BZWFBLGNBQWM7SUFNMUIsMEJBQWM7TUFDYixJQUFNQyxjQUFjLEdBQUdDLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDL0MsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRztRQUN4QkMseUJBQXlCLEVBQUVKLGNBQWMsQ0FBQ0ssZUFBZSxFQUFFLENBQUNDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDekVDLDJCQUEyQixFQUFFLENBQUM7TUFDL0IsQ0FBQztJQUNGO0lBQUM7SUFBQTtJQUFBLE9BQ0RDLG9CQUFvQixHQUFwQixnQ0FBdUI7TUFDdEIsT0FBTyxJQUFJLENBQUNMLGlCQUFpQjtJQUM5QixDQUFDO0lBQUEsT0FDRE0sT0FBTyxHQUFQLG1CQUFVO01BQ1QsSUFBSSxDQUFDTixpQkFBaUIsQ0FBQ0MseUJBQXlCLENBQUNNLFlBQVksQ0FBQyxJQUFJLENBQUNDLDBCQUEwQixFQUFFLElBQUksQ0FBQztJQUNyRyxDQUFDO0lBQUEsT0FDREMsMkNBQTJDLEdBQTNDLHVEQUE4QztNQUFBO01BQzdDLElBQU1aLGNBQWMsR0FBR0MsSUFBSSxDQUFDQyxpQkFBaUIsRUFBRTtNQUMvQyxPQUFPRixjQUFjLENBQ25CSyxlQUFlLEVBQUUsQ0FDakJRLE9BQU8sRUFBRSxDQUNUQyxNQUFNLENB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