@sapui5/sap.fe.core 1.97.0 → 1.99.1

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 (249) hide show
  1. package/package.json +5 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +6 -3
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2379
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +16 -7
  14. package/src/sap/fe/core/PageController.js +84 -119
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -807
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -155
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +64 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1579
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +560 -581
  27. package/src/sap/fe/core/actions/draft.ts +594 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -511
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1211
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +229 -260
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -23
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +82 -46
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +113 -25
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +135 -44
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +22 -9
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
  50. package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +22 -8
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
  57. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  58. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  59. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  60. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
  61. package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
  62. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  63. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
  64. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  65. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  66. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  67. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  68. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  69. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  70. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  71. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  72. package/src/sap/fe/core/converters/ConverterContext.js +14 -2
  73. package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
  74. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  75. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  76. package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
  77. package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
  78. package/src/sap/fe/core/converters/MetaModelConverter.js +67 -6
  79. package/src/sap/fe/core/converters/MetaModelConverter.ts +70 -14
  80. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  81. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  82. package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
  83. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  84. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  85. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  86. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  87. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  88. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  89. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  90. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  91. package/src/sap/fe/core/converters/controls/Common/Form.js +20 -10
  92. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -4
  93. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  94. package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
  95. package/src/sap/fe/core/converters/controls/Common/Table.js +390 -398
  96. package/src/sap/fe/core/converters/controls/Common/Table.ts +497 -484
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
  101. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  102. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  107. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  108. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  113. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  114. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  118. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  119. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  120. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  121. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  122. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  123. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  124. package/src/sap/fe/core/fpm/Component.js +3 -2
  125. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  126. package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
  127. package/src/sap/fe/core/helpers/BindingExpression.js +484 -437
  128. package/src/sap/fe/core/helpers/BindingExpression.ts +480 -463
  129. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  130. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  131. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  132. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  133. package/src/sap/fe/core/helpers/EditState.js +81 -84
  134. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  135. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  136. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  137. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  138. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  139. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  140. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  141. package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
  142. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  143. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  144. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  145. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  146. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  147. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  148. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  149. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  150. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  151. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  152. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  153. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  154. package/src/sap/fe/core/library.js +30 -3
  155. package/src/sap/fe/core/library.support.js +12 -5
  156. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  157. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  158. package/src/sap/fe/core/messagebundle.properties +61 -13
  159. package/src/sap/fe/core/messagebundle_ar.properties +33 -2
  160. package/src/sap/fe/core/messagebundle_bg.properties +33 -2
  161. package/src/sap/fe/core/messagebundle_ca.properties +33 -2
  162. package/src/sap/fe/core/messagebundle_cs.properties +34 -3
  163. package/src/sap/fe/core/messagebundle_cy.properties +33 -2
  164. package/src/sap/fe/core/messagebundle_da.properties +33 -2
  165. package/src/sap/fe/core/messagebundle_de.properties +33 -2
  166. package/src/sap/fe/core/messagebundle_el.properties +33 -2
  167. package/src/sap/fe/core/messagebundle_en.properties +32 -1
  168. package/src/sap/fe/core/messagebundle_en_GB.properties +32 -1
  169. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +36 -1
  170. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +33 -2
  171. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +33 -2
  172. package/src/sap/fe/core/messagebundle_es.properties +33 -2
  173. package/src/sap/fe/core/messagebundle_es_MX.properties +33 -2
  174. package/src/sap/fe/core/messagebundle_et.properties +33 -2
  175. package/src/sap/fe/core/messagebundle_fi.properties +34 -3
  176. package/src/sap/fe/core/messagebundle_fr.properties +38 -7
  177. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -2
  178. package/src/sap/fe/core/messagebundle_hi.properties +33 -2
  179. package/src/sap/fe/core/messagebundle_hr.properties +33 -2
  180. package/src/sap/fe/core/messagebundle_hu.properties +34 -3
  181. package/src/sap/fe/core/messagebundle_id.properties +36 -5
  182. package/src/sap/fe/core/messagebundle_it.properties +33 -2
  183. package/src/sap/fe/core/messagebundle_iw.properties +33 -2
  184. package/src/sap/fe/core/messagebundle_ja.properties +33 -2
  185. package/src/sap/fe/core/messagebundle_kk.properties +33 -2
  186. package/src/sap/fe/core/messagebundle_ko.properties +33 -2
  187. package/src/sap/fe/core/messagebundle_lt.properties +33 -2
  188. package/src/sap/fe/core/messagebundle_lv.properties +33 -2
  189. package/src/sap/fe/core/messagebundle_ms.properties +33 -2
  190. package/src/sap/fe/core/messagebundle_nl.properties +33 -2
  191. package/src/sap/fe/core/messagebundle_no.properties +33 -2
  192. package/src/sap/fe/core/messagebundle_pl.properties +33 -2
  193. package/src/sap/fe/core/messagebundle_pt.properties +34 -3
  194. package/src/sap/fe/core/messagebundle_pt_PT.properties +33 -2
  195. package/src/sap/fe/core/messagebundle_ro.properties +33 -2
  196. package/src/sap/fe/core/messagebundle_ru.properties +33 -2
  197. package/src/sap/fe/core/messagebundle_sh.properties +33 -2
  198. package/src/sap/fe/core/messagebundle_sk.properties +33 -2
  199. package/src/sap/fe/core/messagebundle_sl.properties +33 -2
  200. package/src/sap/fe/core/messagebundle_sv.properties +34 -3
  201. package/src/sap/fe/core/messagebundle_th.properties +33 -2
  202. package/src/sap/fe/core/messagebundle_tr.properties +33 -2
  203. package/src/sap/fe/core/messagebundle_uk.properties +33 -2
  204. package/src/sap/fe/core/messagebundle_vi.properties +33 -2
  205. package/src/sap/fe/core/messagebundle_zh_CN.properties +33 -2
  206. package/src/sap/fe/core/messagebundle_zh_TW.properties +33 -2
  207. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  208. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  209. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  210. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  211. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  212. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
  213. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  214. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  215. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  216. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  217. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1152
  218. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  219. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  220. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
  221. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +42 -85
  222. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +57 -100
  223. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
  224. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  225. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  226. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  227. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  228. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  229. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  230. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  231. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  232. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  233. package/src/sap/fe/core/templating/DataModelPathHelper.js +10 -48
  234. package/src/sap/fe/core/templating/DataModelPathHelper.ts +14 -46
  235. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  236. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  237. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  238. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  239. package/src/sap/fe/core/templating/FilterHelper.js +139 -70
  240. package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
  241. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  242. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  243. package/src/sap/fe/core/templating/UIFormatters.js +45 -110
  244. package/src/sap/fe/core/templating/UIFormatters.ts +39 -75
  245. package/src/sap/fe/core/type/Email.js +1 -1
  246. package/src/sap/fe/core/type/Email.ts +4 -6
  247. package/ui5.yaml +0 -3
  248. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  249. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -1,514 +1,548 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 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/m/MessageToast", "sap/m/MessageItem", "sap/m/MessageView", "sap/m/Button", "sap/m/Dialog", "sap/m/Text", "sap/ui/core/library", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/ui/core/message/Message", "sap/ui/core/IconPool", "sap/ui/model/json/JSONModel", "sap/ui/core/format/DateFormat", "sap/m/Bar", "sap/m/MessageBox", "sap/m/FormattedText"], function (MessageToast, MessageItem, MessageView, Button, Dialog, Text, CoreLib, Filter, FilterOperator, Message, IconPool, JSONModel, DateFormat, Bar, MessageBox, FormattedText) {
6
+ "use strict";
5
7
 
6
- // Static functions for Fiori Message Handling
7
- sap.ui.define(
8
- [
9
- "sap/m/MessageToast",
10
- "sap/m/MessageItem",
11
- "sap/m/MessageView",
12
- "sap/m/Button",
13
- "sap/m/Dialog",
14
- "sap/ui/core/library",
15
- "sap/ui/model/Filter",
16
- "sap/ui/model/FilterOperator",
17
- "sap/ui/core/message/Message",
18
- "sap/ui/core/IconPool",
19
- "sap/ui/model/json/JSONModel",
20
- "sap/ui/core/format/DateFormat"
21
- ],
22
- function(
23
- MessageToast,
24
- MessageItem,
25
- MessageView,
26
- Button,
27
- Dialog,
28
- CoreLib,
29
- Filter,
30
- FilterOperator,
31
- Message,
32
- IconPool,
33
- JSONModel,
34
- DateFormat
35
- ) {
36
- "use strict";
37
- var MessageType = CoreLib.MessageType;
38
- var that = this;
39
-
40
- function fnFormatTechnicalDetails() {
41
- var sPreviousGroupName;
42
- // Insert technical detail if it exists
43
- function insertDetail(oProperty) {
44
- return oProperty.property
45
- ? "( ${" +
46
- oProperty.property +
47
- '} ? ("<p>' +
48
- oProperty.property.substr(
49
- Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1
50
- ) +
51
- ' : " + ' +
52
- "${" +
53
- oProperty.property +
54
- '} + "</p>") : "" )'
55
- : "";
56
- }
57
- // Insert groupname if it exists
58
- function insertGroupName(oProperty) {
59
- var sHTML = "";
60
- if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
61
- sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
62
- sPreviousGroupName = oProperty.groupName;
63
- }
64
- return sHTML;
65
- }
66
-
67
- // List of technical details to be shown
68
- function getPaths() {
69
- var sTD = "technicalDetails"; // name of property in message model data for technical details
70
- return [
71
- { "groupName": "", "property": sTD + "/status" },
72
- { "groupName": "", "property": sTD + "/statusText" },
73
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ComponentId" },
74
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ServiceId" },
75
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ServiceRepository" },
76
- { "groupName": "Application", "property": sTD + "/error/@SAP__common.Application/ServiceVersion" },
77
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ErrorResolution/Analysis" },
78
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ErrorResolution/Note" },
79
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ErrorResolution/DetailedNote" },
80
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.ExceptionCategory" },
81
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.TimeStamp" },
82
- { "groupName": "ErrorResolution", "property": sTD + "/error/@SAP__common.TransactionId" },
83
- { "groupName": "Messages", "property": sTD + "/error/code" },
84
- { "groupName": "Messages", "property": sTD + "/error/message" }
85
- ];
86
- }
87
- var sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
88
- getPaths().forEach(function(oProperty) {
89
- sHTML = sHTML + insertGroupName(oProperty) + "" + insertDetail(oProperty) + " + ";
90
- });
91
- return sHTML;
92
- }
93
- function fnFormatDescription() {
94
- var sHTML = "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
95
- return sHTML;
96
- }
97
- /**
98
- * Calculates the highest priority message type(Error/Warning/Success/Information) from the available messages.
99
-
100
- * @function
101
- * @name sap.fe.core.actions.messageHandling.fnGetHighestMessagePriority
102
- * @memberof sap.fe.core.actions.messageHandling
103
- * @param {Array} [aMessages] Messages list
104
- * @returns {string} Highest priority message from the available messages
105
- * @private
106
- * @ui5-restricted
107
- */
108
- function fnGetHighestMessagePriority(aMessages) {
109
- var sMessagePriority = MessageType.None,
110
- iLength = aMessages.length,
111
- oMessageCount = { Error: 0, Warning: 0, Success: 0, Information: 0 };
112
-
113
- for (var i = 0; i < iLength; i++) {
114
- ++oMessageCount[aMessages[i].getType()];
115
- }
116
- if (oMessageCount[MessageType.Error] > 0) {
117
- sMessagePriority = MessageType.Error;
118
- } else if (oMessageCount[MessageType.Warning] > 0) {
119
- sMessagePriority = MessageType.Warning;
120
- } else if (oMessageCount[MessageType.Success] > 0) {
121
- sMessagePriority = MessageType.Success;
122
- } else if (oMessageCount[MessageType.Information] > 0) {
123
- sMessagePriority = MessageType.Information;
124
- }
125
- return sMessagePriority;
126
- }
127
- // function which modify e-Tag messages only.
128
- // returns : true, if any e-Tag message is modified, otherwise false.
129
- function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle) {
130
- var aMessages = oMessageManager.getMessageModel().getObject("/");
131
- var bMessagesModified = false;
132
- var sEtagMessage = "";
133
- aMessages.forEach(function(oMessage, i) {
134
- var oTechnicalDetails = oMessage.getTechnicalDetails();
135
- if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
136
- sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
137
- oMessageManager.removeMessages(aMessages[i]);
138
- oMessage.setMessage(sEtagMessage);
139
- oMessage.target = "";
140
- oMessageManager.addMessages(oMessage);
141
- bMessagesModified = true;
142
- }
143
- });
144
- return bMessagesModified;
145
- }
146
-
147
- // Dialog close Handling
148
- function dialogCloseHandler() {
149
- that.oDialog.close();
150
- that.oBackButton.setVisible(false);
151
- removeUnboundTransitionMessages();
152
- }
153
-
154
- function getRetryAfterMessage(oMessage, bMessageDialog) {
155
- var dNow = new Date();
156
- var oTechnicalDetails = oMessage.getTechnicalDetails(),
157
- oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
158
- sRetryAfterMessage;
159
- if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
160
- var dRetryAfter = oTechnicalDetails.retryAfter;
161
- var sRetryAfterMessage;
162
- var oDateFormat;
163
- if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
164
- //different years
165
- oDateFormat = DateFormat.getDateTimeInstance({
166
- pattern: "MMMM dd, yyyy 'at' hh:mm a"
167
- });
168
- sRetryAfterMessage = oResourceBundle.getText(
169
- "C_MESSAGE_HANDLING_SAPFE_503_ERROR_YEAR",
170
- oDateFormat.format(dRetryAfter)
171
- );
172
- } else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
173
- //same year
174
- if (bMessageDialog) {
175
- //less than 2 min
176
- sRetryAfterMessage =
177
- oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE") +
178
- " " +
179
- oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC");
180
- } else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
181
- oDateFormat = sap.ui.core.format.DateFormat.getDateTimeInstance({
182
- pattern: "MMMM dd 'at' hh:mm a"
183
- }); //different months or different days of same month
184
- sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", oDateFormat.format(dRetryAfter));
185
- } else {
186
- //same day
187
- oDateFormat = sap.ui.core.format.DateFormat.getDateTimeInstance({
188
- pattern: "hh:mm a"
189
- });
190
- sRetryAfterMessage = oResourceBundle.getText(
191
- "C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY",
192
- oDateFormat.format(dRetryAfter)
193
- );
194
- }
195
- }
196
- }
197
-
198
- if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
199
- sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
200
- }
201
- return sRetryAfterMessage;
202
- }
203
- /**
204
- * Shows all unbound (including technical) messages and removes the ones which are transient.
205
- *
206
- * @function
207
- * @static
208
- * @name sap.fe.core.actions.messageHandling.showUnboundMessages
209
- * @memberof sap.fe.core.actions.messageHandling
210
- * @param {Array} aCustomMessages Array of custom messages given by the user to be displayed along with the other unbound messages.
211
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be refreshed or updated
212
- * @param {boolean} bHasEtagMessage The value of the variable is set to 'true' if any ETag message is present.
213
- * @param {boolean} bShowBoundTransition Also show the bound transition messages
214
- * @returns {Promise} Promise resolves when the message toast disappears or when the user closes the popup
215
- * @private
216
- * @ui5-restricted
217
- */
218
- function showUnboundMessages(aCustomMessages, oContext, bHasEtagMessage, bShowBoundTransition) {
219
- var aUnboundMessages = getMessages(),
220
- oMessageManager = sap.ui.getCore().getMessageManager(),
221
- sHighestPriority,
222
- sHighestPriorityText,
223
- aFilters = [
224
- new Filter({ path: "code", operator: FilterOperator.NE, value1: null }),
225
- new Filter({ path: "persistent", operator: FilterOperator.NE, value1: false })
226
- ],
227
- showMessageDialog = false;
228
-
229
- if (bShowBoundTransition) {
230
- aUnboundMessages.push.apply(aUnboundMessages, getMessages(true, true));
231
- // we only want to show bound transition messages not bound state messages hence add a filter for the same
232
- aFilters.push(new Filter({ path: "persistent", operator: FilterOperator.EQ, value1: true }));
233
- var fnCheckControlIdInDialog = function(aControlIds) {
234
- var index = Infinity,
235
- oControl = sap.ui.getCore().byId(aControlIds[0]),
236
- errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
237
- while (oControl) {
238
- var fieldRankinDialog =
239
- oControl instanceof Dialog
240
- ? errorFieldControl
241
- .getParent()
242
- .findElements(true)
243
- .indexOf(errorFieldControl)
244
- : Infinity;
245
- if (oControl instanceof Dialog) {
246
- if (index > fieldRankinDialog) {
247
- index = fieldRankinDialog;
248
- // Set the focus to the dialog's control
249
- errorFieldControl.focus();
250
- }
251
- // messages with target inside sap.m.Dialog should not bring up the message dialog
252
- return false;
253
- }
254
- oControl = oControl.getParent();
255
- }
256
- return true;
257
- };
258
- aFilters.push(
259
- new Filter({
260
- path: "controlIds",
261
- test: fnCheckControlIdInDialog,
262
- caseSensitive: true
263
- })
264
- );
265
- } else {
266
- // only unbound messages have to be shown so add filter accordingly
267
- aFilters.push(new Filter({ path: "target", operator: FilterOperator.EQ, value1: "" }));
268
- }
269
- if (aCustomMessages && aCustomMessages.length) {
270
- aCustomMessages.forEach(function(oMessage) {
271
- var messageCode = oMessage.code ? oMessage.code : "";
272
- oMessageManager.addMessages(
273
- new Message({
274
- message: oMessage.text,
275
- type: oMessage.type,
276
- target: "",
277
- persistent: true,
278
- code: messageCode
279
- })
280
- );
281
- //The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
282
- });
283
- }
284
- var oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
285
- aCurrentContexts = oListBinding.getCurrentContexts(),
286
- oMessageDialogModel = new JSONModel();
287
- if (aCurrentContexts && aCurrentContexts.length > 0) {
288
- // Don't show dialog incase there are no errors to show
289
- showMessageDialog = true;
290
- // As fitering has already happened here hence
291
- // using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
292
- // So we create new json model to use for the message dialog view.
293
- var aMessages = [];
294
- aCurrentContexts.forEach(function(oContext) {
295
- var oMessage = oContext.getObject(),
296
- sRetryAfterMessage = getRetryAfterMessage(oMessage, true);
297
- if (sRetryAfterMessage) {
298
- oMessage.setMessage(sRetryAfterMessage + " " + oMessage.getMessage());
299
- }
300
- aMessages.push(oMessage);
301
- });
302
- oMessageDialogModel.setData(aMessages);
303
- }
304
- if (aUnboundMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
305
- // Don't show the popup if there are no transient messages
306
- return Promise.resolve(true);
307
- } else if (aUnboundMessages.length === 1 && aUnboundMessages[0].getType() === MessageType.Success && !aCustomMessages) {
308
- return new Promise(function(resolve, reject) {
309
- MessageToast.show(aUnboundMessages[0].message);
310
- oMessageManager.removeMessages(aUnboundMessages);
311
- resolve();
312
- });
313
- } else if (showMessageDialog) {
314
- that.aResolveFunctions = that.aResolveFunctions || [];
315
- return new Promise(function(resolve, reject) {
316
- that.aResolveFunctions.push(resolve);
317
- sap.ui
318
- .getCore()
319
- .getLibraryResourceBundle("sap.fe.core", true)
320
- .then(function(oResourceBundle) {
321
- that.oMessageTemplate =
322
- that.oMessageTemplate ||
323
- new MessageItem({
324
- counter: "{counter}",
325
- title: "{message}",
326
- subtitle: "{additionalText}",
327
- longtextUrl: "{descriptionUrl}",
328
- type: "{type}",
329
- description:
330
- "{= ${" +
331
- "description} || ${technicalDetails} ? " +
332
- '"<html><body>" + ' +
333
- fnFormatDescription() +
334
- " + " +
335
- fnFormatTechnicalDetails() +
336
- '"</body></html>"' +
337
- ' : "" }',
338
- markupDescription: true
339
- });
340
- that.oMessageView =
341
- that.oMessageView ||
342
- new MessageView({
343
- showDetailsPageHeader: false,
344
- itemSelect: function() {
345
- that.oBackButton.setVisible(true);
346
- },
347
- items: {
348
- path: "/",
349
- template: that.oMessageTemplate
350
- }
351
- });
352
- that.oBackButton =
353
- that.oBackButton ||
354
- new Button({
355
- icon: IconPool.getIconURI("nav-back"),
356
- visible: false,
357
- press: function() {
358
- that.oMessageView.navigateBack();
359
- this.setVisible(false);
360
- }
361
- });
362
- that.oMessageView.setModel(oMessageDialogModel);
363
- that.oDialog =
364
- that.oDialog ||
365
- new Dialog({
366
- resizable: true,
367
- content: that.oMessageView,
368
- endButton: new Button({
369
- press: function() {
370
- dialogCloseHandler();
371
- // also remove bound transition messages if we were showing them
372
- if (bShowBoundTransition) {
373
- removeBoundTransitionMessages();
374
- }
375
- },
376
- text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
377
- }),
378
- customHeader: new sap.m.Bar({
379
- contentMiddle: [
380
- new sap.m.Text({
381
- text: oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE")
382
- })
383
- ],
384
- contentLeft: [that.oBackButton]
385
- }),
386
- contentWidth: "37.5em",
387
- contentHeight: "21.5em",
388
- verticalScrolling: false,
389
- afterClose: function(oEvent) {
390
- for (var i = 0; i < that.aResolveFunctions.length; i++) {
391
- that.aResolveFunctions[i].call();
392
- }
393
- that.aResolveFunctions = [];
394
- }
395
- });
396
-
397
- // Update proper ETag Mismatch error
398
- var bHasEtagMessage = fnModifyETagMessagesOnly(oMessageManager, oResourceBundle);
399
- if (bHasEtagMessage) {
400
- sap.ui.require(["sap/m/ButtonType"], function(ButtonType) {
401
- that.oDialog.setBeginButton(
402
- new Button({
403
- press: function() {
404
- dialogCloseHandler();
405
- if (oContext.hasPendingChanges()) {
406
- oContext.getBinding().resetChanges();
407
- }
408
- oContext.refresh();
409
- },
410
- text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
411
- type: ButtonType.Emphasized
412
- })
413
- );
414
- });
415
- } else {
416
- that.oDialog.destroyBeginButton();
417
- }
418
- sHighestPriority = fnGetHighestMessagePriority(that.oMessageView.getItems());
419
- sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
420
- that.oDialog.setState(sHighestPriority);
421
- that.oDialog
422
- .getCustomHeader()
423
- .getContentMiddle()[0]
424
- .setText(sHighestPriorityText);
425
- that.oMessageView.navigateBack();
426
- that.oDialog.open();
427
- })
428
- .catch(reject);
429
- });
430
- } else {
431
- return Promise.resolve(true);
432
- }
433
- }
434
-
435
- function getTranslatedTextForMessageDialog(sHighestPriority) {
436
- var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
437
- switch (sHighestPriority) {
438
- case "Error":
439
- return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
440
- case "Information":
441
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
442
- case "Success":
443
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
444
- case "Warning":
445
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
446
- default:
447
- return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
448
- }
449
- }
450
-
451
- function removeUnboundTransitionMessages() {
452
- removeTransitionMessages(false);
453
- }
454
-
455
- function removeBoundTransitionMessages() {
456
- removeTransitionMessages(true);
457
- }
458
-
459
- function getMessages(bBoundMessages, bTransitionOnly) {
460
- var oMessageManager = sap.ui.getCore().getMessageManager(),
461
- oMessageModel = oMessageManager.getMessageModel(),
462
- aMessages = oMessageModel.getObject("/"),
463
- aTransitionMessages = [];
464
-
465
- for (var i = 0; i < aMessages.length; i++) {
466
- if (
467
- (!bTransitionOnly || aMessages[i].persistent) &&
468
- ((bBoundMessages && aMessages[i].target !== "") ||
469
- (!bBoundMessages && (!aMessages[i].target || aMessages[i].target === ""))) &&
470
- aMessages[i].code
471
- ) {
472
- aTransitionMessages.push(aMessages[i]);
473
- }
474
- }
475
-
476
- for (var i = 0; i < aTransitionMessages.length; i++) {
477
- if (aTransitionMessages[i].code === "503") {
478
- aTransitionMessages[i].message = "\n" + aTransitionMessages[i].message;
479
- }
480
- }
481
- return aTransitionMessages;
482
- }
483
-
484
- function removeTransitionMessages(bBoundMessages) {
485
- var aMessagesToBeDeleted = getMessages(bBoundMessages, true);
486
-
487
- if (aMessagesToBeDeleted.length > 0) {
488
- sap.ui
489
- .getCore()
490
- .getMessageManager()
491
- .removeMessages(aMessagesToBeDeleted);
492
- }
493
- }
494
-
495
- /**
496
- * Static functions for Fiori Message Handling
497
- *
498
- * @namespace
499
- * @alias sap.fe.core.actions.messageHandling
500
- * @private
501
- * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
502
- * @since 1.56.0
503
- */
504
- var messageHandling = {
505
- getMessages: getMessages,
506
- showUnboundMessages: showUnboundMessages,
507
- removeUnboundTransitionMessages: removeUnboundTransitionMessages,
508
- removeBoundTransitionMessages: removeBoundTransitionMessages,
509
- modifyETagMessagesOnly: fnModifyETagMessagesOnly,
510
- getRetryAfterMessage: getRetryAfterMessage
511
- };
512
- return messageHandling;
513
- }
514
- );
8
+ var MessageType = CoreLib.MessageType;
9
+ var aMessageList = [];
10
+ var aMessageDataList = [];
11
+ var aResolveFunctions = [];
12
+ var oDialog;
13
+ var oBackButton;
14
+ var oMessageTemplate;
15
+ var oMessageView;
16
+
17
+ function fnFormatTechnicalDetails() {
18
+ var sPreviousGroupName; // Insert technical detail if it exists
19
+
20
+ function insertDetail(oProperty) {
21
+ return oProperty.property ? "( ${" + oProperty.property + '} ? ("<p>' + oProperty.property.substr(Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1) + ' : " + ' + "${" + oProperty.property + '} + "</p>") : "" )' : "";
22
+ } // Insert groupname if it exists
23
+
24
+
25
+ function insertGroupName(oProperty) {
26
+ var sHTML = "";
27
+
28
+ if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
29
+ sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
30
+ sPreviousGroupName = oProperty.groupName;
31
+ }
32
+
33
+ return sHTML;
34
+ } // List of technical details to be shown
35
+
36
+
37
+ function getPaths() {
38
+ var sTD = "technicalDetails"; // name of property in message model data for technical details
39
+
40
+ return [{
41
+ "groupName": "",
42
+ "property": sTD + "/status"
43
+ }, {
44
+ "groupName": "",
45
+ "property": sTD + "/statusText"
46
+ }, {
47
+ "groupName": "Application",
48
+ "property": sTD + "/error/@SAP__common.Application/ComponentId"
49
+ }, {
50
+ "groupName": "Application",
51
+ "property": sTD + "/error/@SAP__common.Application/ServiceId"
52
+ }, {
53
+ "groupName": "Application",
54
+ "property": sTD + "/error/@SAP__common.Application/ServiceRepository"
55
+ }, {
56
+ "groupName": "Application",
57
+ "property": sTD + "/error/@SAP__common.Application/ServiceVersion"
58
+ }, {
59
+ "groupName": "ErrorResolution",
60
+ "property": sTD + "/error/@SAP__common.ErrorResolution/Analysis"
61
+ }, {
62
+ "groupName": "ErrorResolution",
63
+ "property": sTD + "/error/@SAP__common.ErrorResolution/Note"
64
+ }, {
65
+ "groupName": "ErrorResolution",
66
+ "property": sTD + "/error/@SAP__common.ErrorResolution/DetailedNote"
67
+ }, {
68
+ "groupName": "ErrorResolution",
69
+ "property": sTD + "/error/@SAP__common.ExceptionCategory"
70
+ }, {
71
+ "groupName": "ErrorResolution",
72
+ "property": sTD + "/error/@SAP__common.TimeStamp"
73
+ }, {
74
+ "groupName": "ErrorResolution",
75
+ "property": sTD + "/error/@SAP__common.TransactionId"
76
+ }, {
77
+ "groupName": "Messages",
78
+ "property": sTD + "/error/code"
79
+ }, {
80
+ "groupName": "Messages",
81
+ "property": sTD + "/error/message"
82
+ }];
83
+ }
84
+
85
+ var sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
86
+ getPaths().forEach(function (oProperty) {
87
+ sHTML = sHTML + insertGroupName(oProperty) + "" + insertDetail(oProperty) + " + ";
88
+ });
89
+ return sHTML;
90
+ }
91
+
92
+ function fnFormatDescription() {
93
+ var sHTML = "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
94
+ return sHTML;
95
+ }
96
+ /**
97
+ * Calculates the highest priority message type(Error/Warning/Success/Information) from the available messages.
98
+
99
+ * @function
100
+ * @name sap.fe.core.actions.messageHandling.fnGetHighestMessagePriority
101
+ * @memberof sap.fe.core.actions.messageHandling
102
+ * @param {Array} [aMessages] Messages list
103
+ * @returns {string} Highest priority message from the available messages
104
+ * @private
105
+ * @ui5-restricted
106
+ */
107
+
108
+
109
+ function fnGetHighestMessagePriority(aMessages) {
110
+ var sMessagePriority = MessageType.None;
111
+ var iLength = aMessages.length;
112
+ var oMessageCount = {
113
+ Error: 0,
114
+ Warning: 0,
115
+ Success: 0,
116
+ Information: 0
117
+ };
118
+
119
+ for (var i = 0; i < iLength; i++) {
120
+ ++oMessageCount[aMessages[i].getType()];
121
+ }
122
+
123
+ if (oMessageCount[MessageType.Error] > 0) {
124
+ sMessagePriority = MessageType.Error;
125
+ } else if (oMessageCount[MessageType.Warning] > 0) {
126
+ sMessagePriority = MessageType.Warning;
127
+ } else if (oMessageCount[MessageType.Success] > 0) {
128
+ sMessagePriority = MessageType.Success;
129
+ } else if (oMessageCount[MessageType.Information] > 0) {
130
+ sMessagePriority = MessageType.Information;
131
+ }
132
+
133
+ return sMessagePriority;
134
+ } // function which modify e-Tag messages only.
135
+ // returns : true, if any e-Tag message is modified, otherwise false.
136
+
137
+
138
+ function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle) {
139
+ var aMessages = oMessageManager.getMessageModel().getObject("/");
140
+ var bMessagesModified = false;
141
+ var sEtagMessage = "";
142
+ aMessages.forEach(function (oMessage, i) {
143
+ var oTechnicalDetails = oMessage.getTechnicalDetails();
144
+
145
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
146
+ sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
147
+ oMessageManager.removeMessages(aMessages[i]);
148
+ oMessage.setMessage(sEtagMessage);
149
+ oMessage.target = "";
150
+ oMessageManager.addMessages(oMessage);
151
+ bMessagesModified = true;
152
+ }
153
+ });
154
+ return bMessagesModified;
155
+ } // Dialog close Handling
156
+
157
+
158
+ function dialogCloseHandler() {
159
+ oDialog.close();
160
+ oBackButton.setVisible(false);
161
+ aMessageList = [];
162
+ removeUnboundTransitionMessages();
163
+ }
164
+
165
+ function getRetryAfterMessage(oMessage, bMessageDialog) {
166
+ var dNow = new Date();
167
+ var oTechnicalDetails = oMessage.getTechnicalDetails();
168
+ var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
169
+ var sRetryAfterMessage;
170
+
171
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
172
+ var dRetryAfter = oTechnicalDetails.retryAfter;
173
+ var oDateFormat;
174
+
175
+ if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
176
+ //different years
177
+ oDateFormat = DateFormat.getDateTimeInstance({
178
+ pattern: "MMMM dd, yyyy 'at' hh:mm a"
179
+ });
180
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
181
+ } else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
182
+ //same year
183
+ if (bMessageDialog) {
184
+ //less than 2 min
185
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE") + " " + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC");
186
+ } else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
187
+ oDateFormat = DateFormat.getDateTimeInstance({
188
+ pattern: "MMMM dd 'at' hh:mm a"
189
+ }); //different months or different days of same month
190
+
191
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
192
+ } else {
193
+ //same day
194
+ oDateFormat = DateFormat.getDateTimeInstance({
195
+ pattern: "hh:mm a"
196
+ });
197
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY", [oDateFormat.format(dRetryAfter)]);
198
+ }
199
+ }
200
+ }
201
+
202
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
203
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
204
+ }
205
+
206
+ return sRetryAfterMessage;
207
+ }
208
+
209
+ function showUnboundMessages(aCustomMessages, oContext, bHasEtagMessage, bShowBoundTransition) {
210
+ var aUnboundMessages = this.getMessages();
211
+ var oMessageManager = sap.ui.getCore().getMessageManager();
212
+ var sHighestPriority;
213
+ var sHighestPriorityText;
214
+ var aFilters = [new Filter({
215
+ path: "code",
216
+ operator: FilterOperator.NE,
217
+ value1: null
218
+ }), new Filter({
219
+ path: "persistent",
220
+ operator: FilterOperator.NE,
221
+ value1: false
222
+ })];
223
+ var showMessageDialog = false,
224
+ showMessageBox = false;
225
+
226
+ if (bShowBoundTransition) {
227
+ aUnboundMessages = aUnboundMessages.concat(getMessages(true, true)); // we only want to show bound transition messages not bound state messages hence add a filter for the same
228
+
229
+ aFilters.push(new Filter({
230
+ path: "persistent",
231
+ operator: FilterOperator.EQ,
232
+ value1: true
233
+ }));
234
+
235
+ var fnCheckControlIdInDialog = function (aControlIds) {
236
+ var index = Infinity,
237
+ oControl = sap.ui.getCore().byId(aControlIds[0]);
238
+ var errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
239
+
240
+ while (oControl) {
241
+ var fieldRankinDialog = oControl instanceof Dialog ? errorFieldControl.getParent().findElements(true).indexOf(errorFieldControl) : Infinity;
242
+
243
+ if (oControl instanceof Dialog) {
244
+ if (index > fieldRankinDialog) {
245
+ index = fieldRankinDialog; // Set the focus to the dialog's control
246
+
247
+ errorFieldControl.focus();
248
+ } // messages with target inside sap.m.Dialog should not bring up the message dialog
249
+
250
+
251
+ return false;
252
+ }
253
+
254
+ oControl = oControl.getParent();
255
+ }
256
+
257
+ return true;
258
+ };
259
+
260
+ aFilters.push(new Filter({
261
+ path: "controlIds",
262
+ test: fnCheckControlIdInDialog,
263
+ caseSensitive: true
264
+ }));
265
+ } else {
266
+ // only unbound messages have to be shown so add filter accordingly
267
+ aFilters.push(new Filter({
268
+ path: "target",
269
+ operator: FilterOperator.EQ,
270
+ value1: ""
271
+ }));
272
+ }
273
+
274
+ if (aCustomMessages && aCustomMessages.length) {
275
+ aCustomMessages.forEach(function (oMessage) {
276
+ var messageCode = oMessage.code ? oMessage.code : "";
277
+ oMessageManager.addMessages(new Message({
278
+ message: oMessage.text,
279
+ type: oMessage.type,
280
+ target: "",
281
+ persistent: true,
282
+ code: messageCode
283
+ })); //The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
284
+ });
285
+ }
286
+
287
+ var oMessageDialogModel = new JSONModel();
288
+
289
+ if (aUnboundMessages.length === 1 && aUnboundMessages[0].getCode() === "503") {
290
+ showMessageBox = true;
291
+ } else {
292
+ var oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
293
+ aCurrentContexts = oListBinding.getCurrentContexts();
294
+
295
+ if (aCurrentContexts && aCurrentContexts.length > 0) {
296
+ // Don't show dialog incase there are no errors to show
297
+ showMessageDialog = true; // As fitering has already happened here hence
298
+ // using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
299
+ // So we create new json model to use for the message dialog view.
300
+
301
+ var aMessages = [];
302
+ aCurrentContexts.forEach(function (oContext) {
303
+ var oMessage;
304
+
305
+ if (oContext.getObject().technicalDetails && aMessageList.indexOf(oContext.getObject().technicalDetails.originalMessage.message) === -1) {
306
+ aMessageList.push(oContext.getObject().technicalDetails.originalMessage.message);
307
+ oMessage = oContext.getObject();
308
+ aMessages.push(oMessage);
309
+ aMessageDataList = aMessages;
310
+ } else if (!oContext.getObject().technicalDetails) {
311
+ oMessage = oContext.getObject();
312
+ aMessages.push(oMessage);
313
+ aMessageDataList = aMessages;
314
+ }
315
+ }); // if(aMessages.length === 0 && aMessageList.length) {
316
+ // oMessageDialogModel.setData(aMessages);
317
+ // }
318
+
319
+ oMessageDialogModel.setData(aMessageDataList);
320
+ }
321
+ }
322
+
323
+ if (aUnboundMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
324
+ // Don't show the popup if there are no transient messages
325
+ return Promise.resolve(true);
326
+ } else if (aUnboundMessages.length === 1 && aUnboundMessages[0].getType() === MessageType.Success && !aCustomMessages) {
327
+ return new Promise(function (resolve) {
328
+ MessageToast.show(aUnboundMessages[0].message);
329
+ oMessageManager.removeMessages(aUnboundMessages);
330
+ resolve();
331
+ });
332
+ } else if (showMessageDialog) {
333
+ aResolveFunctions = aResolveFunctions || [];
334
+ return new Promise(function (resolve, reject) {
335
+ aResolveFunctions.push(resolve);
336
+ sap.ui.getCore().getLibraryResourceBundle("sap.fe.core", true).then(function (oResourceBundle) {
337
+ oMessageTemplate = oMessageTemplate || new MessageItem(undefined, {
338
+ counter: {
339
+ path: "counter"
340
+ },
341
+ title: "{message}",
342
+ subtitle: "{additionalText}",
343
+ longtextUrl: "{descriptionUrl}",
344
+ type: {
345
+ path: "type"
346
+ },
347
+ description: "{= ${" + "description} || ${technicalDetails} ? " + '"<html><body>" + ' + fnFormatDescription() + " + " + fnFormatTechnicalDetails() + '"</body></html>"' + ' : "" }',
348
+ markupDescription: true
349
+ });
350
+ oMessageView = oMessageView || new MessageView({
351
+ showDetailsPageHeader: false,
352
+ itemSelect: function () {
353
+ oBackButton.setVisible(true);
354
+ },
355
+ items: {
356
+ path: "/",
357
+ template: oMessageTemplate
358
+ }
359
+ });
360
+ oBackButton = oBackButton || new Button({
361
+ icon: IconPool.getIconURI("nav-back"),
362
+ visible: false,
363
+ press: function () {
364
+ oMessageView.navigateBack();
365
+ this.setVisible(false);
366
+ }
367
+ }); // Update proper ETag Mismatch error
368
+
369
+ var bHasEtagMessage = fnModifyETagMessagesOnly(oMessageManager, oResourceBundle);
370
+ oMessageView.setModel(oMessageDialogModel);
371
+ oDialog = oDialog || new Dialog({
372
+ resizable: true,
373
+ content: oMessageView,
374
+ endButton: new Button({
375
+ press: function () {
376
+ dialogCloseHandler(); // also remove bound transition messages if we were showing them
377
+
378
+ if (bShowBoundTransition) {
379
+ removeBoundTransitionMessages();
380
+ }
381
+ },
382
+ text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
383
+ }),
384
+ customHeader: new Bar({
385
+ contentMiddle: [new Text({
386
+ text: oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE")
387
+ })],
388
+ contentLeft: [oBackButton]
389
+ }),
390
+ contentWidth: "37.5em",
391
+ contentHeight: "21.5em",
392
+ verticalScrolling: false,
393
+ afterClose: function () {
394
+ for (var i = 0; i < aResolveFunctions.length; i++) {
395
+ aResolveFunctions[i].call();
396
+ }
397
+
398
+ aResolveFunctions = [];
399
+ }
400
+ });
401
+
402
+ if (bHasEtagMessage) {
403
+ sap.ui.require(["sap/m/ButtonType"], function (ButtonType) {
404
+ oDialog.setBeginButton(new Button({
405
+ press: function () {
406
+ dialogCloseHandler();
407
+
408
+ if (oContext.hasPendingChanges()) {
409
+ oContext.getBinding().resetChanges();
410
+ }
411
+
412
+ oContext.refresh();
413
+ },
414
+ text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
415
+ type: ButtonType.Emphasized
416
+ }));
417
+ });
418
+ } else {
419
+ oDialog.destroyBeginButton();
420
+ }
421
+
422
+ sHighestPriority = fnGetHighestMessagePriority(oMessageView.getItems());
423
+ sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
424
+ oDialog.setState(sHighestPriority);
425
+ oDialog.getCustomHeader().getContentMiddle()[0].setText(sHighestPriorityText);
426
+ oMessageView.navigateBack();
427
+ oDialog.open();
428
+ }).catch(reject);
429
+ });
430
+ } else if (showMessageBox) {
431
+ return new Promise(function (resolve) {
432
+ var oMessage = aUnboundMessages[0];
433
+
434
+ if (oMessage.technicalDetails && aMessageList.indexOf(oMessage.technicalDetails.originalMessage.message) === -1) {
435
+ aMessageList.push(oMessage.technicalDetails.originalMessage.message);
436
+ var formattedTextString = "<html><body>";
437
+ var retryAfterMessage = getRetryAfterMessage(oMessage, true);
438
+
439
+ if (retryAfterMessage) {
440
+ formattedTextString = "<h6>" + retryAfterMessage + "</h6><br>";
441
+ }
442
+
443
+ formattedTextString = formattedTextString + oMessage.getMessage() + "</html></body>";
444
+ var formattedText = new FormattedText({
445
+ htmlText: formattedTextString
446
+ });
447
+ MessageBox.error(formattedText, {
448
+ onClose: function () {
449
+ aMessageList = [];
450
+
451
+ if (bShowBoundTransition) {
452
+ removeBoundTransitionMessages();
453
+ }
454
+
455
+ removeUnboundTransitionMessages();
456
+ resolve(true);
457
+ }
458
+ });
459
+ }
460
+ });
461
+ } else {
462
+ return Promise.resolve(true);
463
+ }
464
+ }
465
+
466
+ function getTranslatedTextForMessageDialog(sHighestPriority) {
467
+ var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
468
+
469
+ switch (sHighestPriority) {
470
+ case "Error":
471
+ return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
472
+
473
+ case "Information":
474
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
475
+
476
+ case "Success":
477
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
478
+
479
+ case "Warning":
480
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
481
+
482
+ default:
483
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
484
+ }
485
+ }
486
+
487
+ function removeUnboundTransitionMessages() {
488
+ removeTransitionMessages(false);
489
+ }
490
+
491
+ function removeBoundTransitionMessages() {
492
+ removeTransitionMessages(true);
493
+ }
494
+
495
+ function getMessages() {
496
+ var bBoundMessages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
497
+ var bTransitionOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
498
+ var i;
499
+ var oMessageManager = sap.ui.getCore().getMessageManager(),
500
+ oMessageModel = oMessageManager.getMessageModel(),
501
+ aMessages = oMessageModel.getObject("/"),
502
+ oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
503
+ aTransitionMessages = [];
504
+
505
+ for (i = 0; i < aMessages.length; i++) {
506
+ if ((!bTransitionOnly || aMessages[i].persistent) && (bBoundMessages && aMessages[i].target !== "" || !bBoundMessages && (!aMessages[i].target || aMessages[i].target === "")) && aMessages[i].code) {
507
+ aTransitionMessages.push(aMessages[i]);
508
+ }
509
+ }
510
+
511
+ for (i = 0; i < aTransitionMessages.length; i++) {
512
+ if (aTransitionMessages[i].code === "503" && aTransitionMessages[i].message !== "" && aTransitionMessages[i].message.indexOf(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")) === -1) {
513
+ aTransitionMessages[i].message = "\n" + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX") + aTransitionMessages[i].message;
514
+ }
515
+ }
516
+
517
+ return aTransitionMessages;
518
+ }
519
+
520
+ function removeTransitionMessages(bBoundMessages) {
521
+ var aMessagesToBeDeleted = getMessages(bBoundMessages, true);
522
+
523
+ if (aMessagesToBeDeleted.length > 0) {
524
+ sap.ui.getCore().getMessageManager().removeMessages(aMessagesToBeDeleted);
525
+ }
526
+ }
527
+ /**
528
+ * Static functions for Fiori Message Handling
529
+ *
530
+ * @namespace
531
+ * @alias sap.fe.core.actions.messageHandling
532
+ * @private
533
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
534
+ * @since 1.56.0
535
+ */
536
+
537
+
538
+ var messageHandling = {
539
+ getMessages: getMessages,
540
+ showUnboundMessages: showUnboundMessages,
541
+ removeUnboundTransitionMessages: removeUnboundTransitionMessages,
542
+ removeBoundTransitionMessages: removeBoundTransitionMessages,
543
+ modifyETagMessagesOnly: fnModifyETagMessagesOnly,
544
+ getRetryAfterMessage: getRetryAfterMessage
545
+ };
546
+ return messageHandling;
547
+ }, false);
548
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1lc3NhZ2VIYW5kbGluZy50cyJdLCJuYW1lcyI6WyJNZXNzYWdlVHlwZSIsIkNvcmVMaWIiLCJhTWVzc2FnZUxpc3QiLCJhTWVzc2FnZURhdGFMaXN0IiwiYVJlc29sdmVGdW5jdGlvbnMiLCJvRGlhbG9nIiwib0JhY2tCdXR0b24iLCJvTWVzc2FnZVRlbXBsYXRlIiwib01lc3NhZ2VWaWV3IiwiZm5Gb3JtYXRUZWNobmljYWxEZXRhaWxzIiwic1ByZXZpb3VzR3JvdXBOYW1lIiwiaW5zZXJ0RGV0YWlsIiwib1Byb3BlcnR5IiwicHJvcGVydHkiLCJzdWJzdHIiLCJNYXRoIiwibWF4IiwibGFzdEluZGV4T2YiLCJpbnNlcnRHcm91cE5hbWUiLCJzSFRNTCIsImdyb3VwTmFtZSIsImdldFBhdGhzIiwic1REIiwiZm9yRWFjaCIsImZuRm9ybWF0RGVzY3JpcHRpb24iLCJmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkiLCJhTWVzc2FnZXMiLCJzTWVzc2FnZVByaW9yaXR5IiwiTm9uZSIsImlMZW5ndGgiLCJsZW5ndGgiLCJvTWVzc2FnZUNvdW50IiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiaSIsImdldFR5cGUiLCJmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXRPYmplY3QiLCJiTWVzc2FnZXNNb2RpZmllZCIsInNFdGFnTWVzc2FnZSIsIm9NZXNzYWdlIiwib1RlY2huaWNhbERldGFpbHMiLCJnZXRUZWNobmljYWxEZXRhaWxzIiwiaHR0cFN0YXR1cyIsImdldFRleHQiLCJyZW1vdmVNZXNzYWdlcyIsInNldE1lc3NhZ2UiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsImRpYWxvZ0Nsb3NlSGFuZGxlciIsImNsb3NlIiwic2V0VmlzaWJsZSIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImJNZXNzYWdlRGlhbG9nIiwiZE5vdyIsIkRhdGUiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJzUmV0cnlBZnRlck1lc3NhZ2UiLCJyZXRyeUFmdGVyIiwiZFJldHJ5QWZ0ZXIiLCJvRGF0ZUZvcm1hdCIsImdldEZ1bGxZZWFyIiwiRGF0ZUZvcm1hdCIsImdldERhdGVUaW1lSW5zdGFuY2UiLCJwYXR0ZXJuIiwiZm9ybWF0IiwiZ2V0TW9udGgiLCJnZXREYXRlIiwic2hvd1VuYm91bmRNZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsIm9Db250ZXh0IiwiYkhhc0V0YWdNZXNzYWdlIiwiYlNob3dCb3VuZFRyYW5zaXRpb24iLCJhVW5ib3VuZE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJnZXRNZXNzYWdlTWFuYWdlciIsInNIaWdoZXN0UHJpb3JpdHkiLCJzSGlnaGVzdFByaW9yaXR5VGV4dCIsImFGaWx0ZXJzIiwiRmlsdGVyIiwicGF0aCIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJORSIsInZhbHVlMSIsInNob3dNZXNzYWdlRGlhbG9nIiwic2hvd01lc3NhZ2VCb3giLCJjb25jYXQiLCJwdXNoIiwiRVEiLCJmbkNoZWNrQ29udHJvbElkSW5EaWFsb2ciLCJhQ29udHJvbElkcyIsImluZGV4IiwiSW5maW5pdHkiLCJvQ29udHJvbCIsImJ5SWQiLCJlcnJvckZpZWxkQ29udHJvbCIsImZpZWxkUmFua2luRGlhbG9nIiwiRGlhbG9nIiwiZ2V0UGFyZW50IiwiZmluZEVsZW1lbnRzIiwiaW5kZXhPZiIsImZvY3VzIiwidGVzdCIsImNhc2VTZW5zaXRpdmUiLCJtZXNzYWdlQ29kZSIsImNvZGUiLCJNZXNzYWdlIiwibWVzc2FnZSIsInRleHQiLCJ0eXBlIiwicGVyc2lzdGVudCIsIm9NZXNzYWdlRGlhbG9nTW9kZWwiLCJKU09OTW9kZWwiLCJnZXRDb2RlIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJ1bmRlZmluZWQiLCJhQ3VycmVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwidGVjaG5pY2FsRGV0YWlscyIsIm9yaWdpbmFsTWVzc2FnZSIsInNldERhdGEiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJyZWplY3QiLCJ0aGVuIiwiTWVzc2FnZUl0ZW0iLCJjb3VudGVyIiwidGl0bGUiLCJzdWJ0aXRsZSIsImxvbmd0ZXh0VXJsIiwiZGVzY3JpcHRpb24iLCJtYXJrdXBEZXNjcmlwdGlvbiIsIk1lc3NhZ2VWaWV3Iiwic2hvd0RldGFpbHNQYWdlSGVhZGVyIiwiaXRlbVNlbGVjdCIsIml0ZW1zIiwidGVtcGxhdGUiLCJCdXR0b24iLCJpY29uIiwiSWNvblBvb2wiLCJnZXRJY29uVVJJIiwidmlzaWJsZSIsInByZXNzIiwibmF2aWdhdGVCYWNrIiwic2V0TW9kZWwiLCJyZXNpemFibGUiLCJjb250ZW50IiwiZW5kQnV0dG9uIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJjdXN0b21IZWFkZXIiLCJCYXIiLCJjb250ZW50TWlkZGxlIiwiVGV4dCIsImNvbnRlbnRMZWZ0IiwiY29udGVudFdpZHRoIiwiY29udGVudEhlaWdodCIsInZlcnRpY2FsU2Nyb2xsaW5nIiwiYWZ0ZXJDbG9zZSIsImNhbGwiLCJyZXF1aXJlIiwiQnV0dG9uVHlwZSIsInNldEJlZ2luQnV0dG9uIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwicmVmcmVzaCIsIkVtcGhhc2l6ZWQiLCJkZXN0cm95QmVnaW5CdXR0b24iLCJnZXRJdGVtcyIsImdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyIsInNldFN0YXRlIiwiZ2V0Q3VzdG9tSGVhZGVyIiwiZ2V0Q29udGVudE1pZGRsZSIsInNldFRleHQiLCJvcGVuIiwiY2F0Y2giLCJmb3JtYXR0ZWRUZXh0U3RyaW5nIiwicmV0cnlBZnRlck1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiZm9ybWF0dGVkVGV4dCIsIkZvcm1hdHRlZFRleHQiLCJodG1sVGV4dCIsIk1lc3NhZ2VCb3giLCJlcnJvciIsIm9uQ2xvc2UiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJiQm91bmRNZXNzYWdlcyIsImJUcmFuc2l0aW9uT25seSIsIm9NZXNzYWdlTW9kZWwiLCJhVHJhbnNpdGlvbk1lc3NhZ2VzIiwiYU1lc3NhZ2VzVG9CZURlbGV0ZWQiLCJtZXNzYWdlSGFuZGxpbmciLCJtb2RpZnlFVGFnTWVzc2FnZXNPbmx5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBa0JBLE1BQU1BLFdBQVcsR0FBR0MsT0FBTyxDQUFDRCxXQUE1QjtBQUNBLE1BQUlFLFlBQW1CLEdBQUcsRUFBMUI7QUFDQSxNQUFJQyxnQkFBdUIsR0FBRyxFQUE5QjtBQUNBLE1BQUlDLGlCQUF3QixHQUFHLEVBQS9CO0FBQ0EsTUFBSUMsT0FBSjtBQUNBLE1BQUlDLFdBQUo7QUFDQSxNQUFJQyxnQkFBSjtBQUNBLE1BQUlDLFlBQUo7O0FBZ0JBLFdBQVNDLHdCQUFULEdBQW9DO0FBQ25DLFFBQUlDLGtCQUFKLENBRG1DLENBR25DOztBQUNBLGFBQVNDLFlBQVQsQ0FBc0JDLFNBQXRCLEVBQXNDO0FBQ3JDLGFBQU9BLFNBQVMsQ0FBQ0MsUUFBVixHQUNKLFNBQ0FELFNBQVMsQ0FBQ0MsUUFEVixHQUVBLFdBRkEsR0FHQUQsU0FBUyxDQUFDQyxRQUFWLENBQW1CQyxNQUFuQixDQUEwQkMsSUFBSSxDQUFDQyxHQUFMLENBQVNKLFNBQVMsQ0FBQ0MsUUFBVixDQUFtQkksV0FBbkIsQ0FBK0IsR0FBL0IsQ0FBVCxFQUE4Q0wsU0FBUyxDQUFDQyxRQUFWLENBQW1CSSxXQUFuQixDQUErQixHQUEvQixDQUE5QyxJQUFxRixDQUEvRyxDQUhBLEdBSUEsU0FKQSxHQUtBLElBTEEsR0FNQUwsU0FBUyxDQUFDQyxRQU5WLEdBT0Esb0JBUkksR0FTSixFQVRIO0FBVUEsS0Fma0MsQ0FnQm5DOzs7QUFDQSxhQUFTSyxlQUFULENBQXlC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Q0E7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBTUMsZUFBb0MsR0FBRztBQUM1Q3pILElBQUFBLFdBQVcsRUFBRUEsV0FEK0I7QUFFNUNOLElBQUFBLG1CQUFtQixFQUFFQSxtQkFGdUI7QUFHNUNwQixJQUFBQSwrQkFBK0IsRUFBRUEsK0JBSFc7QUFJNUN3RyxJQUFBQSw2QkFBNkIsRUFBRUEsNkJBSmE7QUFLNUM0QyxJQUFBQSxzQkFBc0IsRUFBRXZLLHdCQUxvQjtBQU01Q29CLElBQUFBLG9CQUFvQixFQUFFQTtBQU5zQixHQUE3QztTQVNla0osZSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgTWVzc2FnZUl0ZW0gZnJvbSBcInNhcC9tL01lc3NhZ2VJdGVtXCI7XG5pbXBvcnQgTWVzc2FnZVZpZXcgZnJvbSBcInNhcC9tL01lc3NhZ2VWaWV3XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBDb3JlTGliIGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IEljb25Qb29sIGZyb20gXCJzYXAvdWkvY29yZS9JY29uUG9vbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgRGF0ZUZvcm1hdCBmcm9tIFwic2FwL3VpL2NvcmUvZm9ybWF0L0RhdGVGb3JtYXRcIjtcbmltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9tZGMvQ29udHJvbFwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBCYXIgZnJvbSBcInNhcC9tL0JhclwiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBGb3JtYXR0ZWRUZXh0IGZyb20gXCJzYXAvbS9Gb3JtYXR0ZWRUZXh0XCI7XG5cbmNvbnN0IE1lc3NhZ2VUeXBlID0gQ29yZUxpYi5NZXNzYWdlVHlwZTtcbmxldCBhTWVzc2FnZUxpc3Q6IGFueVtdID0gW107XG5sZXQgYU1lc3NhZ2VEYXRhTGlzdDogYW55W10gPSBbXTtcbmxldCBhUmVzb2x2ZUZ1bmN0aW9uczogYW55W10gPSBbXTtcbmxldCBvRGlhbG9nOiBEaWFsb2c7XG5sZXQgb0JhY2tCdXR0b246IEJ1dHRvbjtcbmxldCBvTWVzc2FnZVRlbXBsYXRlOiBNZXNzYWdlSXRlbTtcbmxldCBvTWVzc2FnZVZpZXc6IE1lc3NhZ2VWaWV3O1xuXG5leHBvcnQgdHlwZSBtZXNzYWdlSGFuZGxpbmdUeXBlID0ge1xuXHRnZXRNZXNzYWdlczogKGJCb3VuZE1lc3NhZ2VzPzogYW55LCBiVHJhbnNpdGlvbk9ubHk/OiBhbnkpID0+IGFueVtdO1xuXHRzaG93VW5ib3VuZE1lc3NhZ2VzOiAoXG5cdFx0YUN1c3RvbU1lc3NhZ2VzPzogYW55W10sXG5cdFx0b0NvbnRleHQ/OiBhbnksXG5cdFx0Ykhhc0V0YWdNZXNzYWdlPzogYm9vbGVhbixcblx0XHRiU2hvd0JvdW5kVHJhbnNpdGlvbj86IGJvb2xlYW5cblx0KSA9PiBQcm9taXNlPGFueT47XG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6ICgpID0+IHZvaWQ7XG5cdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiAoKSA9PiB2b2lkO1xuXHRtb2RpZnlFVGFnTWVzc2FnZXNPbmx5OiAob01lc3NhZ2VNYW5hZ2VyOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSA9PiBib29sZWFuO1xuXHRnZXRSZXRyeUFmdGVyTWVzc2FnZTogKG9NZXNzYWdlOiBhbnksIGJNZXNzYWdlRGlhbG9nPzogYW55KSA9PiBhbnk7XG59O1xuXG5mdW5jdGlvbiBmbkZvcm1hdFRlY2huaWNhbERldGFpbHMoKSB7XG5cdGxldCBzUHJldmlvdXNHcm91cE5hbWU6IHN0cmluZztcblxuXHQvLyBJbnNlcnQgdGVjaG5pY2FsIGRldGFpbCBpZiBpdCBleGlzdHNcblx0ZnVuY3Rpb24gaW5zZXJ0RGV0YWlsKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIG9Qcm9wZXJ0eS5wcm9wZXJ0eVxuXHRcdFx0PyBcIiggJHtcIiArXG5cdFx0XHRcdFx0b1Byb3BlcnR5LnByb3BlcnR5ICtcblx0XHRcdFx0XHQnfSA/IChcIjxwPicgK1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eS5zdWJzdHIoTWF0aC5tYXgob1Byb3BlcnR5LnByb3BlcnR5Lmxhc3RJbmRleE9mKFwiL1wiKSwgb1Byb3BlcnR5LnByb3BlcnR5Lmxhc3RJbmRleE9mKFwiLlwiKSkgKyAxKSArXG5cdFx0XHRcdFx0JyA6IFwiICsgJyArXG5cdFx0XHRcdFx0XCIke1wiICtcblx0XHRcdFx0XHRvUHJvcGVydHkucHJvcGVydHkgK1xuXHRcdFx0XHRcdCd9ICsgXCI8L3A+XCIpIDogXCJcIiApJ1xuXHRcdFx0OiBcIlwiO1xuXHR9XG5cdC8vIEluc2VydCBncm91cG5hbWUgaWYgaXQgZXhpc3RzXG5cdGZ1bmN0aW9uIGluc2VydEdyb3VwTmFtZShvUHJvcGVydHk6IGFueSkge1xuXHRcdGxldCBzSFRNTCA9IFwiXCI7XG5cdFx0aWYgKG9Qcm9wZXJ0eS5ncm91cE5hbWUgJiYgb1Byb3BlcnR5LnByb3BlcnR5ICYmIG9Qcm9wZXJ0eS5ncm91cE5hbWUgIT09IHNQcmV2aW91c0dyb3VwTmFtZSkge1xuXHRcdFx0c0hUTUwgKz0gXCIoICR7XCIgKyBvUHJvcGVydHkucHJvcGVydHkgKyAnfSA/IFwiPGJyPjxoMz4nICsgb1Byb3BlcnR5Lmdyb3VwTmFtZSArICc8L2gzPlwiIDogXCJcIiApICsgJztcblx0XHRcdHNQcmV2aW91c0dyb3VwTmFtZSA9IG9Qcm9wZXJ0eS5ncm91cE5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBzSFRNTDtcblx0fVxuXG5cdC8vIExpc3Qgb2YgdGVjaG5pY2FsIGRldGFpbHMgdG8gYmUgc2hvd25cblx0ZnVuY3Rpb24gZ2V0UGF0aHMoKSB7XG5cdFx0Y29uc3Qgc1REID0gXCJ0ZWNobmljYWxEZXRhaWxzXCI7IC8vIG5hbWUgb2YgcHJvcGVydHkgaW4gbWVzc2FnZSBtb2RlbCBkYXRhIGZvciB0ZWNobmljYWwgZGV0YWlsc1xuXHRcdHJldHVybiBbXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvc3RhdHVzXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9zdGF0dXNUZXh0XCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9Db21wb25lbnRJZFwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiQXBwbGljYXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZUlkXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9TZXJ2aWNlUmVwb3NpdG9yeVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiQXBwbGljYXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVZlcnNpb25cIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FcnJvclJlc29sdXRpb24vQW5hbHlzaXNcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FcnJvclJlc29sdXRpb24vTm90ZVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9EZXRhaWxlZE5vdGVcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FeGNlcHRpb25DYXRlZ29yeVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLlRpbWVTdGFtcFwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLlRyYW5zYWN0aW9uSWRcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIk1lc3NhZ2VzXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvY29kZVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiTWVzc2FnZXNcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9tZXNzYWdlXCIgfVxuXHRcdF07XG5cdH1cblxuXHRsZXQgc0hUTUwgPSBcIk9iamVjdC5rZXlzKFwiICsgXCIke3RlY2huaWNhbERldGFpbHN9XCIgKyAnKS5sZW5ndGggPiAwID8gXCI8aDI+VGVjaG5pY2FsIERldGFpbHM8L2gyPlwiIDogXCJcIiAnO1xuXHRnZXRQYXRocygpLmZvckVhY2goZnVuY3Rpb24ob1Byb3BlcnR5OiB7IGdyb3VwTmFtZTogc3RyaW5nOyBwcm9wZXJ0eTogc3RyaW5nIH0pIHtcblx0XHRzSFRNTCA9IHNIVE1MICsgaW5zZXJ0R3JvdXBOYW1lKG9Qcm9wZXJ0eSkgKyBcIlwiICsgaW5zZXJ0RGV0YWlsKG9Qcm9wZXJ0eSkgKyBcIiArIFwiO1xuXHR9KTtcblx0cmV0dXJuIHNIVE1MO1xufVxuZnVuY3Rpb24gZm5Gb3JtYXREZXNjcmlwdGlvbigpIHtcblx0Y29uc3Qgc0hUTUwgPSBcIigke1wiICsgJ2Rlc2NyaXB0aW9ufSA/IChcIjxoMj5EZXNjcmlwdGlvbjwvaDI+XCIgKyAkeycgKyAnZGVzY3JpcHRpb259KSA6IFwiXCIpJztcblx0cmV0dXJuIHNIVE1MO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBoaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2UgdHlwZShFcnJvci9XYXJuaW5nL1N1Y2Nlc3MvSW5mb3JtYXRpb24pIGZyb20gdGhlIGF2YWlsYWJsZSBtZXNzYWdlcy5cblxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZy5mbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZ1xuICogQHBhcmFtIHtBcnJheX0gW2FNZXNzYWdlc10gTWVzc2FnZXMgbGlzdFxuICogQHJldHVybnMge3N0cmluZ30gSGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlIGZyb20gdGhlIGF2YWlsYWJsZSBtZXNzYWdlc1xuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkoYU1lc3NhZ2VzOiBhbnlbXSkge1xuXHRsZXQgc01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdGNvbnN0IGlMZW5ndGggPSBhTWVzc2FnZXMubGVuZ3RoO1xuXHRjb25zdCBvTWVzc2FnZUNvdW50OiBhbnkgPSB7IEVycm9yOiAwLCBXYXJuaW5nOiAwLCBTdWNjZXNzOiAwLCBJbmZvcm1hdGlvbjogMCB9O1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKSB7XG5cdFx0KytvTWVzc2FnZUNvdW50W2FNZXNzYWdlc1tpXS5nZXRUeXBlKCldO1xuXHR9XG5cdGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLkVycm9yXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5XYXJuaW5nXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLlN1Y2Nlc3NdID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuSW5mb3JtYXRpb25dID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbjtcblx0fVxuXHRyZXR1cm4gc01lc3NhZ2VQcmlvcml0eTtcbn1cbi8vIGZ1bmN0aW9uIHdoaWNoIG1vZGlmeSBlLVRhZyBtZXNzYWdlcyBvbmx5LlxuLy8gcmV0dXJucyA6IHRydWUsIGlmIGFueSBlLVRhZyBtZXNzYWdlIGlzIG1vZGlmaWVkLCBvdGhlcndpc2UgZmFsc2UuXG5mdW5jdGlvbiBmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHkob01lc3NhZ2VNYW5hZ2VyOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdGNvbnN0IGFNZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5nZXRPYmplY3QoXCIvXCIpO1xuXHRsZXQgYk1lc3NhZ2VzTW9kaWZpZWQgPSBmYWxzZTtcblx0bGV0IHNFdGFnTWVzc2FnZSA9IFwiXCI7XG5cdGFNZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG9NZXNzYWdlOiBhbnksIGk6IGFueSkge1xuXHRcdGNvbnN0IG9UZWNobmljYWxEZXRhaWxzID0gb01lc3NhZ2UuZ2V0VGVjaG5pY2FsRGV0YWlscygpO1xuXHRcdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA0MTIpIHtcblx0XHRcdHNFdGFnTWVzc2FnZSA9IHNFdGFnTWVzc2FnZSB8fCBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQVBQX0NPTVBPTkVOVF9TQVBGRV9FVEFHX1RFQ0hOSUNBTF9JU1NVRVNcIik7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMoYU1lc3NhZ2VzW2ldKTtcblx0XHRcdG9NZXNzYWdlLnNldE1lc3NhZ2Uoc0V0YWdNZXNzYWdlKTtcblx0XHRcdG9NZXNzYWdlLnRhcmdldCA9IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0Yk1lc3NhZ2VzTW9kaWZpZWQgPSB0cnVlO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBiTWVzc2FnZXNNb2RpZmllZDtcbn1cbi8vIERpYWxvZyBjbG9zZSBIYW5kbGluZ1xuZnVuY3Rpb24gZGlhbG9nQ2xvc2VIYW5kbGVyKCkge1xuXHRvRGlhbG9nLmNsb3NlKCk7XG5cdG9CYWNrQnV0dG9uLnNldFZpc2libGUoZmFsc2UpO1xuXHRhTWVzc2FnZUxpc3QgPSBbXTtcblx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xufVxuZnVuY3Rpb24gZ2V0UmV0cnlBZnRlck1lc3NhZ2Uob01lc3NhZ2U6IGFueSwgYk1lc3NhZ2VEaWFsb2c6IGFueSkge1xuXHRjb25zdCBkTm93ID0gbmV3IERhdGUoKTtcblx0Y29uc3Qgb1RlY2huaWNhbERldGFpbHMgPSBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzKCk7XG5cdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdGxldCBzUmV0cnlBZnRlck1lc3NhZ2U7XG5cdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA1MDMgJiYgb1RlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcikge1xuXHRcdGNvbnN0IGRSZXRyeUFmdGVyID0gb1RlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcjtcblx0XHRsZXQgb0RhdGVGb3JtYXQ7XG5cdFx0aWYgKGROb3cuZ2V0RnVsbFllYXIoKSAhPT0gZFJldHJ5QWZ0ZXIuZ2V0RnVsbFllYXIoKSkge1xuXHRcdFx0Ly9kaWZmZXJlbnQgeWVhcnNcblx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0cGF0dGVybjogXCJNTU1NIGRkLCB5eXl5ICdhdCcgaGg6bW0gYVwiXG5cdFx0XHR9KTtcblx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUlwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdH0gZWxzZSBpZiAoZE5vdy5nZXRGdWxsWWVhcigpID09IGRSZXRyeUFmdGVyLmdldEZ1bGxZZWFyKCkpIHtcblx0XHRcdC8vc2FtZSB5ZWFyXG5cdFx0XHRpZiAoYk1lc3NhZ2VEaWFsb2cpIHtcblx0XHRcdFx0Ly9sZXNzIHRoYW4gMiBtaW5cblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID1cblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfVElUTEVcIikgK1xuXHRcdFx0XHRcdFwiIFwiICtcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfREVTQ1wiKTtcblx0XHRcdH0gZWxzZSBpZiAoZE5vdy5nZXRNb250aCgpICE9PSBkUmV0cnlBZnRlci5nZXRNb250aCgpIHx8IGROb3cuZ2V0RGF0ZSgpICE9PSBkUmV0cnlBZnRlci5nZXREYXRlKCkpIHtcblx0XHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHBhdHRlcm46IFwiTU1NTSBkZCAnYXQnIGhoOm1tIGFcIlxuXHRcdFx0XHR9KTsgLy9kaWZmZXJlbnQgbW9udGhzIG9yIGRpZmZlcmVudCBkYXlzIG9mIHNhbWUgbW9udGhcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3NhbWUgZGF5XG5cdFx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBcImhoOm1tIGFcIlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SX0RBWVwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA1MDMgJiYgIW9UZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXIpIHtcblx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfRVJST1JfTk9fUkVUUllfQUZURVJcIik7XG5cdH1cblx0cmV0dXJuIHNSZXRyeUFmdGVyTWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHNob3dVbmJvdW5kTWVzc2FnZXMoXG5cdHRoaXM6IG1lc3NhZ2VIYW5kbGluZ1R5cGUsXG5cdGFDdXN0b21NZXNzYWdlcz86IGFueVtdLFxuXHRvQ29udGV4dD86IGFueSxcblx0Ykhhc0V0YWdNZXNzYWdlPzogYm9vbGVhbixcblx0YlNob3dCb3VuZFRyYW5zaXRpb24/OiBib29sZWFuXG4pIHtcblx0bGV0IGFVbmJvdW5kTWVzc2FnZXMgPSB0aGlzLmdldE1lc3NhZ2VzKCk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0bGV0IHNIaWdoZXN0UHJpb3JpdHk7XG5cdGxldCBzSGlnaGVzdFByaW9yaXR5VGV4dDtcblx0Y29uc3QgYUZpbHRlcnMgPSBbXG5cdFx0bmV3IEZpbHRlcih7IHBhdGg6IFwiY29kZVwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuTkUsIHZhbHVlMTogbnVsbCB9KSxcblx0XHRuZXcgRmlsdGVyKHsgcGF0aDogXCJwZXJzaXN0ZW50XCIsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5ORSwgdmFsdWUxOiBmYWxzZSB9KVxuXHRdO1xuXHRsZXQgc2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZSxcblx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXG5cdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdGFVbmJvdW5kTWVzc2FnZXMgPSBhVW5ib3VuZE1lc3NhZ2VzLmNvbmNhdChnZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0Ly8gd2Ugb25seSB3YW50IHRvIHNob3cgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBub3QgYm91bmQgc3RhdGUgbWVzc2FnZXMgaGVuY2UgYWRkIGEgZmlsdGVyIGZvciB0aGUgc2FtZVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogdHJ1ZSB9KSk7XG5cdFx0Y29uc3QgZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nID0gZnVuY3Rpb24oYUNvbnRyb2xJZHM6IGFueSkge1xuXHRcdFx0bGV0IGluZGV4ID0gSW5maW5pdHksXG5cdFx0XHRcdG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKGFDb250cm9sSWRzWzBdKSBhcyBNYW5hZ2VkT2JqZWN0O1xuXHRcdFx0Y29uc3QgZXJyb3JGaWVsZENvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoYUNvbnRyb2xJZHNbMF0pIGFzIENvbnRyb2w7XG5cdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0Y29uc3QgZmllbGRSYW5raW5EaWFsb2cgPVxuXHRcdFx0XHRcdG9Db250cm9sIGluc3RhbmNlb2YgRGlhbG9nXG5cdFx0XHRcdFx0XHQ/IChlcnJvckZpZWxkQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBhbnkpLmZpbmRFbGVtZW50cyh0cnVlKS5pbmRleE9mKGVycm9yRmllbGRDb250cm9sKVxuXHRcdFx0XHRcdFx0OiBJbmZpbml0eTtcblx0XHRcdFx0aWYgKG9Db250cm9sIGluc3RhbmNlb2YgRGlhbG9nKSB7XG5cdFx0XHRcdFx0aWYgKGluZGV4ID4gZmllbGRSYW5raW5EaWFsb2cpIHtcblx0XHRcdFx0XHRcdGluZGV4ID0gZmllbGRSYW5raW5EaWFsb2c7XG5cdFx0XHRcdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBkaWFsb2cncyBjb250cm9sXG5cdFx0XHRcdFx0XHRlcnJvckZpZWxkQ29udHJvbC5mb2N1cygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBtZXNzYWdlcyB3aXRoIHRhcmdldCBpbnNpZGUgc2FwLm0uRGlhbG9nIHNob3VsZCBub3QgYnJpbmcgdXAgdGhlIG1lc3NhZ2UgZGlhbG9nXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHRcdGFGaWx0ZXJzLnB1c2goXG5cdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDogXCJjb250cm9sSWRzXCIsXG5cdFx0XHRcdHRlc3Q6IGZuQ2hlY2tDb250cm9sSWRJbkRpYWxvZyxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogdHJ1ZVxuXHRcdFx0fSlcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIG9ubHkgdW5ib3VuZCBtZXNzYWdlcyBoYXZlIHRvIGJlIHNob3duIHNvIGFkZCBmaWx0ZXIgYWNjb3JkaW5nbHlcblx0XHRhRmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBcInRhcmdldFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogXCJcIiB9KSk7XG5cdH1cblx0aWYgKGFDdXN0b21NZXNzYWdlcyAmJiBhQ3VzdG9tTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0YUN1c3RvbU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24ob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZUNvZGUgPSBvTWVzc2FnZS5jb2RlID8gb01lc3NhZ2UuY29kZSA6IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBvTWVzc2FnZS50ZXh0LFxuXHRcdFx0XHRcdHR5cGU6IG9NZXNzYWdlLnR5cGUsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0Y29kZTogbWVzc2FnZUNvZGVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHQvL1RoZSB0YXJnZXQgYW5kIHBlcnNpc3RlbnQgcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZSBhcmUgaGFyZGNvZGVkIGFzIFwiXCIgYW5kIHRydWUgYmVjYXVzZSB0aGUgZnVuY3Rpb24gZGVhbHMgd2l0aCBvbmx5IHVuYm91bmQgbWVzc2FnZXMuXG5cdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01lc3NhZ2VEaWFsb2dNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0aWYgKGFVbmJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxICYmIGFVbmJvdW5kTWVzc2FnZXNbMF0uZ2V0Q29kZSgpID09PSBcIjUwM1wiKSB7XG5cdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5iaW5kTGlzdChcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFGaWx0ZXJzKSxcblx0XHRcdGFDdXJyZW50Q29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0aWYgKGFDdXJyZW50Q29udGV4dHMgJiYgYUN1cnJlbnRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBEb24ndCBzaG93IGRpYWxvZyBpbmNhc2UgdGhlcmUgYXJlIG5vIGVycm9ycyB0byBzaG93XG5cdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHQvLyBBcyBmaXRlcmluZyBoYXMgYWxyZWFkeSBoYXBwZW5lZCBoZXJlIGhlbmNlXG5cdFx0XHQvLyB1c2luZyB0aGUgbWVzc2FnZSBtb2RlbCBhZ2FpbiBmb3IgdGhlIG1lc3NhZ2UgZGlhbG9nIHZpZXcgYW5kIHRoZW4gZmlsdGVyaW5nIG9uIHRoYXQgYmluZGluZyBhZ2FpbiBpcyB1bm5lY2Vzc2FyeS5cblx0XHRcdC8vIFNvIHdlIGNyZWF0ZSBuZXcganNvbiBtb2RlbCB0byB1c2UgZm9yIHRoZSBtZXNzYWdlIGRpYWxvZyB2aWV3LlxuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0YUN1cnJlbnRDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0bGV0IG9NZXNzYWdlO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KCkudGVjaG5pY2FsRGV0YWlscyAmJlxuXHRcdFx0XHRcdGFNZXNzYWdlTGlzdC5pbmRleE9mKG9Db250ZXh0LmdldE9iamVjdCgpLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpID09PSAtMVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRhTWVzc2FnZUxpc3QucHVzaChvQ29udGV4dC5nZXRPYmplY3QoKS50ZWNobmljYWxEZXRhaWxzLm9yaWdpbmFsTWVzc2FnZS5tZXNzYWdlKTtcblx0XHRcdFx0XHRvTWVzc2FnZSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdGFNZXNzYWdlcy5wdXNoKG9NZXNzYWdlKTtcblx0XHRcdFx0XHRhTWVzc2FnZURhdGFMaXN0ID0gYU1lc3NhZ2VzO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS50ZWNobmljYWxEZXRhaWxzKSB7XG5cdFx0XHRcdFx0b01lc3NhZ2UgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRhTWVzc2FnZXMucHVzaChvTWVzc2FnZSk7XG5cdFx0XHRcdFx0YU1lc3NhZ2VEYXRhTGlzdCA9IGFNZXNzYWdlcztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQvLyBpZihhTWVzc2FnZXMubGVuZ3RoID09PSAwICYmIGFNZXNzYWdlTGlzdC5sZW5ndGgpIHtcblx0XHRcdC8vIFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNZXNzYWdlcyk7XG5cdFx0XHQvLyB9XG5cdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoYU1lc3NhZ2VEYXRhTGlzdCk7XG5cdFx0fVxuXHR9XG5cdGlmIChhVW5ib3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMCAmJiAhYUN1c3RvbU1lc3NhZ2VzICYmICFiSGFzRXRhZ01lc3NhZ2UpIHtcblx0XHQvLyBEb24ndCBzaG93IHRoZSBwb3B1cCBpZiB0aGVyZSBhcmUgbm8gdHJhbnNpZW50IG1lc3NhZ2VzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fSBlbHNlIGlmIChhVW5ib3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMSAmJiBhVW5ib3VuZE1lc3NhZ2VzWzBdLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuU3VjY2VzcyAmJiAhYUN1c3RvbU1lc3NhZ2VzKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coYVVuYm91bmRNZXNzYWdlc1swXS5tZXNzYWdlKTtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhVW5ib3VuZE1lc3NhZ2VzKTtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChzaG93TWVzc2FnZURpYWxvZykge1xuXHRcdGFSZXNvbHZlRnVuY3Rpb25zID0gYVJlc29sdmVGdW5jdGlvbnMgfHwgW107XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zLnB1c2gocmVzb2x2ZSk7XG5cdFx0XHQoc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVRlbXBsYXRlID1cblx0XHRcdFx0XHRcdG9NZXNzYWdlVGVtcGxhdGUgfHxcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlSXRlbSh1bmRlZmluZWQsIHtcblx0XHRcdFx0XHRcdFx0Y291bnRlcjogeyBwYXRoOiBcImNvdW50ZXJcIiB9LFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdFx0XHRcdFx0c3VidGl0bGU6IFwie2FkZGl0aW9uYWxUZXh0fVwiLFxuXHRcdFx0XHRcdFx0XHRsb25ndGV4dFVybDogXCJ7ZGVzY3JpcHRpb25Vcmx9XCIsXG5cdFx0XHRcdFx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246XG5cdFx0XHRcdFx0XHRcdFx0XCJ7PSAke1wiICtcblx0XHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9ufSB8fCAke3RlY2huaWNhbERldGFpbHN9ID8gXCIgK1xuXHRcdFx0XHRcdFx0XHRcdCdcIjxodG1sPjxib2R5PlwiICsgJyArXG5cdFx0XHRcdFx0XHRcdFx0Zm5Gb3JtYXREZXNjcmlwdGlvbigpICtcblx0XHRcdFx0XHRcdFx0XHRcIiArIFwiICtcblx0XHRcdFx0XHRcdFx0XHRmbkZvcm1hdFRlY2huaWNhbERldGFpbHMoKSArXG5cdFx0XHRcdFx0XHRcdFx0J1wiPC9ib2R5PjwvaHRtbD5cIicgK1xuXHRcdFx0XHRcdFx0XHRcdCcgOiBcIlwiIH0nLFxuXHRcdFx0XHRcdFx0XHRtYXJrdXBEZXNjcmlwdGlvbjogdHJ1ZVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b01lc3NhZ2VWaWV3ID1cblx0XHRcdFx0XHRcdG9NZXNzYWdlVmlldyB8fFxuXHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2VWaWV3KHtcblx0XHRcdFx0XHRcdFx0c2hvd0RldGFpbHNQYWdlSGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0aXRlbVNlbGVjdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0JhY2tCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0aXRlbXM6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXRoOiBcIi9cIixcblx0XHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZTogb01lc3NhZ2VUZW1wbGF0ZVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvQmFja0J1dHRvbiA9XG5cdFx0XHRcdFx0XHRvQmFja0J1dHRvbiB8fFxuXHRcdFx0XHRcdFx0bmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdGljb246IEljb25Qb29sLmdldEljb25VUkkoXCJuYXYtYmFja1wiKSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbih0aGlzOiBCdXR0b24pIHtcblx0XHRcdFx0XHRcdFx0XHRvTWVzc2FnZVZpZXcubmF2aWdhdGVCYWNrKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Ly8gVXBkYXRlIHByb3BlciBFVGFnIE1pc21hdGNoIGVycm9yXG5cdFx0XHRcdFx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlciwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRvTWVzc2FnZVZpZXcuc2V0TW9kZWwob01lc3NhZ2VEaWFsb2dNb2RlbCk7XG5cdFx0XHRcdFx0b0RpYWxvZyA9XG5cdFx0XHRcdFx0XHRvRGlhbG9nIHx8XG5cdFx0XHRcdFx0XHRuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBvTWVzc2FnZVZpZXcsXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBhbHNvIHJlbW92ZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGlmIHdlIHdlcmUgc2hvd2luZyB0aGVtXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYlNob3dCb3VuZFRyYW5zaXRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfQ0xPU0VcIilcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGN1c3RvbUhlYWRlcjogbmV3IEJhcih7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudE1pZGRsZTogW1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudExlZnQ6IFtvQmFja0J1dHRvbl1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnRXaWR0aDogXCIzNy41ZW1cIixcblx0XHRcdFx0XHRcdFx0Y29udGVudEhlaWdodDogXCIyMS41ZW1cIixcblx0XHRcdFx0XHRcdFx0dmVydGljYWxTY3JvbGxpbmc6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFSZXNvbHZlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZUZ1bmN0aW9uc1tpXS5jYWxsKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zID0gW107XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKGJIYXNFdGFnTWVzc2FnZSkge1xuXHRcdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL20vQnV0dG9uVHlwZVwiXSwgZnVuY3Rpb24oQnV0dG9uVHlwZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmVnaW5CdXR0b24oXG5cdFx0XHRcdFx0XHRcdFx0bmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRpYWxvZ0Nsb3NlSGFuZGxlcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9SRUZSRVNIXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogQnV0dG9uVHlwZS5FbXBoYXNpemVkXG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3lCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzSGlnaGVzdFByaW9yaXR5ID0gZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5KG9NZXNzYWdlVmlldy5nZXRJdGVtcygpKTtcblx0XHRcdFx0XHRzSGlnaGVzdFByaW9yaXR5VGV4dCA9IGdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyhzSGlnaGVzdFByaW9yaXR5KTtcblx0XHRcdFx0XHRvRGlhbG9nLnNldFN0YXRlKHNIaWdoZXN0UHJpb3JpdHkpO1xuXHRcdFx0XHRcdChvRGlhbG9nLmdldEN1c3RvbUhlYWRlcigpIGFzIGFueSkuZ2V0Q29udGVudE1pZGRsZSgpWzBdLnNldFRleHQoc0hpZ2hlc3RQcmlvcml0eVRleHQpO1xuXHRcdFx0XHRcdG9NZXNzYWdlVmlldy5uYXZpZ2F0ZUJhY2soKTtcblx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoc2hvd01lc3NhZ2VCb3gpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2UgPSBhVW5ib3VuZE1lc3NhZ2VzWzBdO1xuXHRcdFx0aWYgKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMgJiYgYU1lc3NhZ2VMaXN0LmluZGV4T2Yob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UubWVzc2FnZSkgPT09IC0xKSB7XG5cdFx0XHRcdGFNZXNzYWdlTGlzdC5wdXNoKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpO1xuXHRcdFx0XHRsZXQgZm9ybWF0dGVkVGV4dFN0cmluZyA9IFwiPGh0bWw+PGJvZHk+XCI7XG5cdFx0XHRcdGNvbnN0IHJldHJ5QWZ0ZXJNZXNzYWdlID0gZ2V0UmV0cnlBZnRlck1lc3NhZ2Uob01lc3NhZ2UsIHRydWUpO1xuXHRcdFx0XHRpZiAocmV0cnlBZnRlck1lc3NhZ2UpIHtcblx0XHRcdFx0XHRmb3JtYXR0ZWRUZXh0U3RyaW5nID0gXCI8aDY+XCIgKyByZXRyeUFmdGVyTWVzc2FnZSArIFwiPC9oNj48YnI+XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9ybWF0dGVkVGV4dFN0cmluZyA9IGZvcm1hdHRlZFRleHRTdHJpbmcgKyBvTWVzc2FnZS5nZXRNZXNzYWdlKCkgKyBcIjwvaHRtbD48L2JvZHk+XCI7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlZFRleHQ6IGFueSA9IG5ldyBGb3JtYXR0ZWRUZXh0KHtcblx0XHRcdFx0XHRodG1sVGV4dDogZm9ybWF0dGVkVGV4dFN0cmluZ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihmb3JtYXR0ZWRUZXh0LCB7XG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRhTWVzc2FnZUxpc3QgPSBbXTtcblx0XHRcdFx0XHRcdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdFx0XHRcdFx0XHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyhzSGlnaGVzdFByaW9yaXR5OiBhbnkpIHtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0c3dpdGNoIChzSGlnaGVzdFByaW9yaXR5KSB7XG5cdFx0Y2FzZSBcIkVycm9yXCI6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCIpO1xuXHRcdGNhc2UgXCJJbmZvcm1hdGlvblwiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfSU5GT1wiKTtcblx0XHRjYXNlIFwiU3VjY2Vzc1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfU1VDQ0VTU1wiKTtcblx0XHRjYXNlIFwiV2FybmluZ1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVcIik7XG5cdH1cbn1cbmZ1bmN0aW9uIHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKSB7XG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSk7XG59XG5mdW5jdGlvbiByZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpIHtcblx0cmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKHRydWUpO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZXMoYkJvdW5kTWVzc2FnZXM6IGJvb2xlYW4gPSBmYWxzZSwgYlRyYW5zaXRpb25Pbmx5OiBib29sZWFuID0gZmFsc2UpIHtcblx0bGV0IGk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRvTWVzc2FnZU1vZGVsID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLFxuXHRcdGFNZXNzYWdlcyA9IG9NZXNzYWdlTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKSxcblx0XHRvUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdGFUcmFuc2l0aW9uTWVzc2FnZXMgPSBbXTtcblxuXHRmb3IgKGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKFxuXHRcdFx0KCFiVHJhbnNpdGlvbk9ubHkgfHwgYU1lc3NhZ2VzW2ldLnBlcnNpc3RlbnQpICYmXG5cdFx0XHQoKGJCb3VuZE1lc3NhZ2VzICYmIGFNZXNzYWdlc1tpXS50YXJnZXQgIT09IFwiXCIpIHx8ICghYkJvdW5kTWVzc2FnZXMgJiYgKCFhTWVzc2FnZXNbaV0udGFyZ2V0IHx8IGFNZXNzYWdlc1tpXS50YXJnZXQgPT09IFwiXCIpKSkgJiZcblx0XHRcdGFNZXNzYWdlc1tpXS5jb2RlXG5cdFx0KSB7XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzLnB1c2goYU1lc3NhZ2VzW2ldKTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0uY29kZSA9PT0gXCI1MDNcIiAmJlxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlICE9PSBcIlwiICYmXG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UuaW5kZXhPZihvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfQkFDS0VORF9QUkVGSVhcIikpID09PSAtMVxuXHRcdCkge1xuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlID1cblx0XHRcdFx0XCJcXG5cIiArIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19CQUNLRU5EX1BSRUZJWFwiKSArIGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFUcmFuc2l0aW9uTWVzc2FnZXM7XG59XG5mdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoYkJvdW5kTWVzc2FnZXM6IGFueSkge1xuXHRjb25zdCBhTWVzc2FnZXNUb0JlRGVsZXRlZCA9IGdldE1lc3NhZ2VzKGJCb3VuZE1lc3NhZ2VzLCB0cnVlKTtcblxuXHRpZiAoYU1lc3NhZ2VzVG9CZURlbGV0ZWQubGVuZ3RoID4gMCkge1xuXHRcdChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlcyhhTWVzc2FnZXNUb0JlRGVsZXRlZCk7XG5cdH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciBGaW9yaSBNZXNzYWdlIEhhbmRsaW5nXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMubWVzc2FnZUhhbmRsaW5nXG4gKiBAcHJpdmF0ZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU2LjBcbiAqL1xuY29uc3QgbWVzc2FnZUhhbmRsaW5nOiBtZXNzYWdlSGFuZGxpbmdUeXBlID0ge1xuXHRnZXRNZXNzYWdlczogZ2V0TWVzc2FnZXMsXG5cdHNob3dVbmJvdW5kTWVzc2FnZXM6IHNob3dVbmJvdW5kTWVzc2FnZXMsXG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6IHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMsXG5cdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiByZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyxcblx0bW9kaWZ5RVRhZ01lc3NhZ2VzT25seTogZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5LFxuXHRnZXRSZXRyeUFmdGVyTWVzc2FnZTogZ2V0UmV0cnlBZnRlck1lc3NhZ2Vcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lc3NhZ2VIYW5kbGluZztcbiJdfQ==