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