@sapui5/sap.fe.core 1.98.0 → 1.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/package.json +8 -5
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AnnotationHelper.js +328 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +321 -0
  5. package/src/sap/fe/core/AppComponent.js +382 -399
  6. package/src/sap/fe/core/AppComponent.ts +397 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +67 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2221 -2399
  14. package/src/sap/fe/core/CommonUtils.ts +2248 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +280 -274
  16. package/src/sap/fe/core/ExtensionAPI.ts +242 -0
  17. package/src/sap/fe/core/PageController.js +219 -131
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +936 -823
  20. package/src/sap/fe/core/RouterProxy.ts +854 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +248 -164
  24. package/src/sap/fe/core/TemplateComponent.ts +161 -0
  25. package/src/sap/fe/core/TemplateModel.js +77 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1575 -1664
  28. package/src/sap/fe/core/TransactionHelper.ts +1736 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +406 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +362 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +146 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +129 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +264 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +246 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +100 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +663 -608
  38. package/src/sap/fe/core/actions/draft.ts +669 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +576 -514
  40. package/src/sap/fe/core/actions/messageHandling.ts +562 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1215
  44. package/src/sap/fe/core/actions/operations.ts +1193 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  48. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  50. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  51. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
  52. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
  53. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  54. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  55. package/src/sap/fe/core/controllerextensions/EditFlow.js +1855 -1827
  56. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
  57. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  58. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
  59. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +717 -512
  60. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
  61. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -815
  62. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
  63. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1057 -1004
  64. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
  65. package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -533
  66. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +36 -32
  67. package/src/sap/fe/core/controllerextensions/MassEdit.js +142 -77
  68. package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
  69. package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -236
  70. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +215 -0
  71. package/src/sap/fe/core/controllerextensions/PageReady.js +312 -345
  72. package/src/sap/fe/core/controllerextensions/PageReady.ts +63 -55
  73. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -175
  74. package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
  75. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -149
  76. package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
  77. package/src/sap/fe/core/controllerextensions/Routing.js +145 -121
  78. package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
  79. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  80. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  81. package/src/sap/fe/core/controllerextensions/Share.js +231 -268
  82. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  83. package/src/sap/fe/core/controllerextensions/SideEffects.js +603 -644
  84. package/src/sap/fe/core/controllerextensions/SideEffects.ts +79 -79
  85. package/src/sap/fe/core/controllerextensions/ViewState.js +775 -806
  86. package/src/sap/fe/core/controllerextensions/ViewState.ts +796 -0
  87. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  88. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  89. package/src/sap/fe/core/controls/Any.js +28 -0
  90. package/src/sap/fe/core/controls/Any.ts +30 -0
  91. package/src/sap/fe/core/controls/CommandExecution.js +93 -68
  92. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  93. package/src/sap/fe/core/controls/ConditionalWrapper.js +166 -79
  94. package/src/sap/fe/core/controls/ConditionalWrapper.ts +74 -0
  95. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
  96. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
  97. package/src/sap/fe/core/controls/CustomQuickViewPage.js +168 -125
  98. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +116 -0
  99. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +164 -122
  101. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
  102. package/src/sap/fe/core/controls/FieldWrapper.js +213 -153
  103. package/src/sap/fe/core/controls/FieldWrapper.ts +104 -0
  104. package/src/sap/fe/core/controls/FileWrapper.js +313 -0
  105. package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
  106. package/src/sap/fe/core/controls/FilterBar.js +198 -159
  107. package/src/sap/fe/core/controls/FilterBar.ts +148 -0
  108. package/src/sap/fe/core/controls/FormElementWrapper.js +101 -39
  109. package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
  110. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  111. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  112. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  113. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +148 -115
  114. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
  115. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +301 -265
  116. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
  117. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +186 -140
  118. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  119. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  120. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  121. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
  122. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +76 -74
  123. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +71 -0
  124. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  125. package/src/sap/fe/core/converters/ConverterContext.ts +23 -19
  126. package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -2
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -365
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +19 -0
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +16 -11
  131. package/src/sap/fe/core/converters/MetaModelConverter.ts +21 -18
  132. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  133. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  134. package/src/sap/fe/core/converters/annotations/DataField.js +26 -13
  135. package/src/sap/fe/core/converters/annotations/DataField.ts +40 -17
  136. package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
  137. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -11
  138. package/src/sap/fe/core/converters/controls/Common/Action.ts +22 -21
  139. package/src/sap/fe/core/converters/controls/Common/Chart.js +12 -10
  140. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -14
  141. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  142. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  143. package/src/sap/fe/core/converters/controls/Common/Form.js +9 -7
  144. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -5
  145. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  146. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -2
  147. package/src/sap/fe/core/converters/controls/Common/Table.js +562 -218
  148. package/src/sap/fe/core/converters/controls/Common/Table.ts +670 -320
  149. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +218 -94
  150. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +265 -159
  151. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +495 -77
  152. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +535 -130
  153. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  154. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  155. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +10 -7
  156. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +13 -16
  157. package/src/sap/fe/core/converters/helpers/Aggregation.js +117 -127
  158. package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  159. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  160. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  161. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  162. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  163. package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
  164. package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  165. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  166. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  167. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  168. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  169. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +54 -30
  170. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
  171. package/src/sap/fe/core/converters/templates/ListReportConverter.js +52 -28
  172. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +111 -74
  173. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +11 -9
  174. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -8
  175. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -98
  176. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  177. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  178. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  179. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  180. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  181. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  182. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  183. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  184. package/src/sap/fe/core/formatters/KPIFormatter.ts +4 -1
  185. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  186. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  187. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  188. package/src/sap/fe/core/formatters/ValueFormatter.ts +5 -7
  189. package/src/sap/fe/core/fpm/Component.js +81 -55
  190. package/src/sap/fe/core/fpm/Component.ts +43 -0
  191. package/src/sap/fe/core/helpers/AppStartupHelper.js +324 -310
  192. package/src/sap/fe/core/helpers/AppStartupHelper.ts +370 -341
  193. package/src/sap/fe/core/helpers/BindingExpression.js +319 -360
  194. package/src/sap/fe/core/helpers/BindingExpression.ts +323 -397
  195. package/src/sap/fe/core/helpers/ClassSupport.js +321 -168
  196. package/src/sap/fe/core/helpers/ClassSupport.ts +362 -158
  197. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  198. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  199. package/src/sap/fe/core/helpers/EditState.js +81 -84
  200. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  201. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  202. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  203. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  204. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  205. package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
  206. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  207. package/src/sap/fe/core/helpers/MassEditHelper.js +736 -676
  208. package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
  209. package/src/sap/fe/core/helpers/ModelHelper.js +281 -225
  210. package/src/sap/fe/core/helpers/ModelHelper.ts +273 -0
  211. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  212. package/src/sap/fe/core/helpers/PasteHelper.ts +197 -0
  213. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  214. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +336 -0
  215. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  216. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  217. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -10
  218. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -10
  219. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  220. package/src/sap/fe/core/jsx-runtime/jsx.ts +23 -9
  221. package/src/sap/fe/core/library.js +426 -451
  222. package/src/sap/fe/core/library.support.js +23 -33
  223. package/src/sap/fe/core/library.support.ts +23 -0
  224. package/src/sap/fe/core/library.ts +420 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +5 -5
  227. package/src/sap/fe/core/messagebundle.properties +63 -18
  228. package/src/sap/fe/core/messagebundle_ar.properties +37 -6
  229. package/src/sap/fe/core/messagebundle_bg.properties +37 -6
  230. package/src/sap/fe/core/messagebundle_ca.properties +37 -6
  231. package/src/sap/fe/core/messagebundle_cs.properties +38 -7
  232. package/src/sap/fe/core/messagebundle_cy.properties +37 -6
  233. package/src/sap/fe/core/messagebundle_da.properties +37 -6
  234. package/src/sap/fe/core/messagebundle_de.properties +37 -6
  235. package/src/sap/fe/core/messagebundle_el.properties +37 -6
  236. package/src/sap/fe/core/messagebundle_en.properties +37 -6
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -6
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -6
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -6
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +37 -6
  241. package/src/sap/fe/core/messagebundle_es.properties +37 -6
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +37 -6
  243. package/src/sap/fe/core/messagebundle_et.properties +37 -6
  244. package/src/sap/fe/core/messagebundle_fi.properties +38 -7
  245. package/src/sap/fe/core/messagebundle_fr.properties +43 -12
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +45 -14
  247. package/src/sap/fe/core/messagebundle_hi.properties +43 -12
  248. package/src/sap/fe/core/messagebundle_hr.properties +43 -12
  249. package/src/sap/fe/core/messagebundle_hu.properties +37 -6
  250. package/src/sap/fe/core/messagebundle_id.properties +38 -7
  251. package/src/sap/fe/core/messagebundle_it.properties +37 -6
  252. package/src/sap/fe/core/messagebundle_iw.properties +37 -6
  253. package/src/sap/fe/core/messagebundle_ja.properties +36 -5
  254. package/src/sap/fe/core/messagebundle_kk.properties +43 -12
  255. package/src/sap/fe/core/messagebundle_ko.properties +37 -6
  256. package/src/sap/fe/core/messagebundle_lt.properties +37 -6
  257. package/src/sap/fe/core/messagebundle_lv.properties +44 -13
  258. package/src/sap/fe/core/messagebundle_ms.properties +42 -11
  259. package/src/sap/fe/core/messagebundle_nl.properties +37 -6
  260. package/src/sap/fe/core/messagebundle_no.properties +37 -6
  261. package/src/sap/fe/core/messagebundle_pl.properties +37 -6
  262. package/src/sap/fe/core/messagebundle_pt.properties +38 -7
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +37 -6
  264. package/src/sap/fe/core/messagebundle_ro.properties +37 -6
  265. package/src/sap/fe/core/messagebundle_ru.properties +37 -6
  266. package/src/sap/fe/core/messagebundle_sh.properties +39 -8
  267. package/src/sap/fe/core/messagebundle_sk.properties +37 -6
  268. package/src/sap/fe/core/messagebundle_sl.properties +43 -12
  269. package/src/sap/fe/core/messagebundle_sv.properties +38 -7
  270. package/src/sap/fe/core/messagebundle_th.properties +36 -5
  271. package/src/sap/fe/core/messagebundle_tr.properties +39 -8
  272. package/src/sap/fe/core/messagebundle_uk.properties +37 -6
  273. package/src/sap/fe/core/messagebundle_vi.properties +37 -6
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +37 -6
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +43 -12
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +211 -0
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -8
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +963 -899
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +907 -0
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -40
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +572 -643
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +67 -96
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -487
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +449 -0
  294. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +48 -8
  295. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +11 -0
  296. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  297. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  298. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  299. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  300. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  301. package/src/sap/fe/core/support/CommonHelper.ts +1 -4
  302. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  303. package/src/sap/fe/core/templating/DataModelPathHelper.js +91 -90
  304. package/src/sap/fe/core/templating/DataModelPathHelper.ts +126 -123
  305. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
  307. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  308. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  309. package/src/sap/fe/core/templating/FilterHelper.js +138 -79
  310. package/src/sap/fe/core/templating/FilterHelper.ts +148 -79
  311. package/src/sap/fe/core/templating/PropertyHelper.js +16 -2
  312. package/src/sap/fe/core/templating/PropertyHelper.ts +31 -24
  313. package/src/sap/fe/core/templating/UIFormatters.js +179 -43
  314. package/src/sap/fe/core/templating/UIFormatters.ts +190 -61
  315. package/src/sap/fe/core/type/Email.js +26 -8
  316. package/src/sap/fe/core/type/Email.ts +10 -11
  317. package/ui5.yaml +0 -3
  318. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -74
@@ -1,325 +1,339 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
+ sap.ui.define(["sap/ui/mdc/condition/Condition", "sap/base/Log", "sap/ui/core/format/NumberFormat", "sap/fe/core/templating/FilterHelper", "sap/ui/model/odata/type/DateTimeOffset"], function (Condition, Log, NumberFormat, FilterHelper, DateTimeOffset) {
6
+ "use strict";
5
7
 
6
- sap.ui.define(
7
- ["sap/fe/core/templating/FilterHelper", "sap/ui/core/format/NumberFormat", "sap/ui/mdc/condition/Condition", "sap/base/Log"],
8
- function(FilterHelper, NumberFormat, Condition, Log) {
9
- "use strict";
10
- return {
11
- /**
12
- * Applies the median scale to the chart data.
13
- *
14
- * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
15
- * @param {object} oView Instance of the view
16
- * @param {object} sVFId VisualFilter control ID
17
- * @param {string} sInfoPath Internal model context path to store info.
18
- */
19
- applyMedianScaleToChartData: function(oInteractiveChart, oView, sVFId, sInfoPath) {
20
- var aAggregation;
21
- var oData = [];
22
- var sMeasure = oInteractiveChart.data("measure");
23
- var oInternalModelContext = oView.getBindingContext("internal");
24
- aAggregation =
25
- (oInteractiveChart.getPoints && oInteractiveChart.getPoints()) ||
26
- (oInteractiveChart.getBars && oInteractiveChart.getBars()) ||
27
- (oInteractiveChart.getSegments && oInteractiveChart.getSegments());
28
- for (var i = 0; i < aAggregation.length; i++) {
29
- oData.push(aAggregation[i].getBindingContext().getObject());
30
- }
31
- var scaleFactor = this._getMedianScaleFactor(oData, sMeasure);
32
- if (scaleFactor && scaleFactor.iShortRefNumber && scaleFactor.scale) {
33
- oInternalModelContext.setProperty("scalefactor/" + sInfoPath, scaleFactor.scale);
34
- oInternalModelContext.setProperty("scalefactorNumber/" + sInfoPath, scaleFactor.iShortRefNumber);
35
- } else {
36
- oInternalModelContext.setProperty("scalefactor/" + sInfoPath, "");
37
- oInternalModelContext.setProperty("scalefactorNumber/" + sInfoPath, "");
38
- var oScaleTitle = oView.byId(sVFId + "::ScaleUoMTitle");
39
- var oMeasureDimensionTitle = oView.byId(sVFId + "::MeasureDimensionTitle");
40
- var sText = oScaleTitle.getText();
41
- if (sText === " | ") {
42
- oScaleTitle.setVisible(false);
43
- oMeasureDimensionTitle.setTooltip(oMeasureDimensionTitle.getText());
44
- }
45
- }
46
- },
47
-
48
- /**
49
- * Returns the median scale factor.
50
- *
51
- * @param {object} oData VisualFilter data
52
- * @param {string} sMeasureField Path of the measure
53
- * @returns {object} Object containing scale and iShortRefNumber
54
- */
55
- _getMedianScaleFactor: function(oData, sMeasureField) {
56
- oData.sort(function(a, b) {
57
- if (Number(a[sMeasureField]) < Number(b[sMeasureField])) {
58
- return -1;
59
- }
60
- if (Number(a[sMeasureField]) > Number(b[sMeasureField])) {
61
- return 1;
62
- }
63
- return 0;
64
- });
65
- if (oData.length > 0) {
66
- // get median index
67
- var iMid = oData.length / 2, // get mid of array
68
- // if iMid is whole number, array length is even, calculate median
69
- // if iMid is not whole number, array length is odd, take median as iMid - 1
70
- iMedian =
71
- iMid % 1 === 0
72
- ? (parseFloat(oData[iMid - 1][sMeasureField]) + parseFloat(oData[iMid][sMeasureField])) / 2
73
- : parseFloat(oData[Math.floor(iMid)][sMeasureField]),
74
- // get scale factor on median
75
- val = iMedian,
76
- scaleFactor;
77
- for (var i = 0; i < 14; i++) {
78
- scaleFactor = Math.pow(10, i);
79
- if (Math.round(Math.abs(val) / scaleFactor) < 10) {
80
- break;
81
- }
82
- }
83
- }
84
-
85
- var fixedInteger = NumberFormat.getIntegerInstance({
86
- style: "short",
87
- showScale: false,
88
- shortRefNumber: scaleFactor
89
- });
90
-
91
- // apply scale factor to other values and check
92
- for (var i = 0; i < oData.length; i++) {
93
- var aData = oData[i],
94
- sScaledValue = fixedInteger.format(aData[sMeasureField]),
95
- aScaledValueParts = sScaledValue.split(".");
96
- // if scaled value has only 0 before decimal or 0 after decimal (example: 0.02)
97
- // then ignore this scale factor else proceed with this scale factor
98
- // if scaled value divided by 1000 is >= 1000 then also ignore scale factor
99
- if (
100
- (!aScaledValueParts[1] && parseInt(aScaledValueParts[0], 10) === 0) ||
101
- (aScaledValueParts[1] && parseInt(aScaledValueParts[0], 10) === 0 && aScaledValueParts[1].indexOf("0") === 0) ||
102
- sScaledValue / 1000 >= 1000
103
- ) {
104
- scaleFactor = undefined;
105
- break;
106
- }
107
- }
108
- return {
109
- iShortRefNumber: scaleFactor,
110
- scale: scaleFactor ? fixedInteger.getScale() : ""
111
- };
112
- },
113
-
114
- /**
115
- * Returns the formatted number according to the rules of VisualChartFilters.
116
- *
117
- * @param {string | number} value Value which needs to be formatted
118
- * @param {string} scaleFactor ScaleFactor to which the value needs to be scaled
119
- * @param {number} numberOfFractionalDigits NumberOfFractionalDigits digits in the decimals according to scale
120
- * @param {string} currency Currency code
121
- * @returns {number} The formatted number
122
- */
123
- getFormattedNumber: function(value, scaleFactor, numberOfFractionalDigits, currency) {
124
- value = typeof value === "string" ? Number(value.replace(/,/g, "")) : value;
125
-
126
- if (currency) {
127
- var currencyFormat = NumberFormat.getCurrencyInstance({
128
- showMeasure: false
129
- });
130
- return currencyFormat.format(parseFloat(value), currency);
131
- // parseFloat(value) is required otherwise -ve value are wrongly rounded off
132
- // Example: "-1.9" rounds off to -1 instead of -2. however -1.9 rounds off to -2
133
- } else if (scaleFactor) {
134
- var fixedInteger = NumberFormat.getFloatInstance({
135
- style: "short",
136
- showScale: false,
137
- shortRefNumber: scaleFactor,
138
- shortDecimals: numberOfFractionalDigits
139
- });
140
- return fixedInteger.format(parseFloat(value));
141
- } else {
142
- var fixedInteger = NumberFormat.getFloatInstance({
143
- decimals: numberOfFractionalDigits
144
- });
145
- return fixedInteger.format(parseFloat(value));
146
- }
147
- },
148
-
149
- /**
150
- * Applies the UOM to the title of the visual filter control.
151
- *
152
- * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
153
- * @param {object} oContextData Data of the VisualFilter
154
- * @param {object} oView Instance of the view
155
- * @param {string} sInfoPath Internal model context path to store info.
156
- */
157
- applyUOMToTitle: function(oInteractiveChart, oContextData, oView, sInfoPath) {
158
- var vUOM = oInteractiveChart.data("uom"),
159
- sUOM;
160
- var sCurrency;
161
- if (vUOM && vUOM["ISOCurrency"]) {
162
- sUOM = vUOM["ISOCurrency"];
163
- sCurrency = sUOM.$Path ? oContextData[sUOM.$Path] : sUOM;
164
- } else if (vUOM && vUOM["Unit"]) {
165
- sUOM = vUOM["Unit"];
166
- }
167
- if (sUOM) {
168
- var sUOMValue = sUOM.$Path ? oContextData[sUOM.$Path] : sUOM;
169
- var oInternalModelContext = oView.getBindingContext("internal");
170
- oInternalModelContext.setProperty("uom/" + sInfoPath, sUOMValue);
171
- if (sCurrency) {
172
- oInternalModelContext.setProperty("currency/" + sInfoPath, sUOMValue);
173
- }
174
- }
175
- },
176
- /**
177
- * Updates the scale factor in the title of the visual filter.
178
- *
179
- * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
180
- * @param {object} oView Instance of the view
181
- * @param {object} sVFId VisualFilter control ID
182
- * @param {string} sInfoPath Internal model context path to store info.
183
- */
184
- updateChartScaleFactorTitle: function(oInteractiveChart, oView, sVFId, sInfoPath) {
185
- if (!oInteractiveChart.data("scalefactor")) {
186
- this.applyMedianScaleToChartData(oInteractiveChart, oView, sVFId, sInfoPath);
187
- } else {
188
- var fixedInteger = NumberFormat.getIntegerInstance({
189
- style: "short",
190
- showScale: false,
191
- shortRefNumber: oInteractiveChart.data("scalefactor")
192
- });
193
- var oInternalModelContext = oView.getBindingContext("internal");
194
- oInternalModelContext.setProperty("scalefactor/" + sInfoPath, fixedInteger.getScale());
195
- }
196
- },
197
-
198
- /**
199
- *
200
- * @param {string} s18nMessageTitle Text of the error message title.
201
- * @param {string} s18nMessage Text of the error message description.
202
- * @param {string} sInfoPath Internal model context path to store info.
203
- * @param {object} oView Instance of the view.
204
- */
205
- applyErrorMessageAndTitle: function(s18nMessageTitle, s18nMessage, sInfoPath, oView) {
206
- var oInternalModelContext = oView.getBindingContext("internal");
207
- oInternalModelContext.setProperty(sInfoPath, {});
208
- oInternalModelContext.setProperty(sInfoPath, {
209
- "errorMessageTitle": s18nMessageTitle,
210
- "errorMessage": s18nMessage,
211
- "showError": true
212
- });
213
- },
214
- /**
215
- * Checks if multiple units are present.
216
- *
217
- * @param {object} oContexts Contexts of the VisualFilter
218
- * @param {object} sUnitfield The path of the unit field
219
- * @returns {boolean} Returns if multiple units are configured or not
220
- */
221
- checkMulitUnit: function(oContexts, sUnitfield) {
222
- var aData = [];
223
- if (oContexts && sUnitfield) {
224
- for (var i = 0; i < oContexts.length; i++) {
225
- var aContextData = oContexts[i] && oContexts[i].getObject();
226
- aData.push(aContextData[sUnitfield]);
227
- }
228
- }
229
- return !!aData.reduce(function(data, key) {
230
- return data === key ? data : NaN;
231
- });
232
- },
233
-
234
- /**
235
- * Sets an error message if multiple UOM are present.
236
- *
237
- * @param {object} oData Data of the VisualFilter control
238
- * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
239
- * @param {string} sInfoPath Internal model context path to store info.
240
- * @param {string} oResourceBundle The resource bundle
241
- * @param {string} oView Instance of the view
242
- */
243
- setMultiUOMMessage: function(oData, oInteractiveChart, sInfoPath, oResourceBundle, oView) {
244
- var vUOM = oInteractiveChart.data("uom");
245
- var sIsCurrency = vUOM && vUOM["ISOCurrency"] && vUOM["ISOCurrency"].$Path;
246
- var sIsUnit = vUOM && vUOM["Unit"] && vUOM["Unit"].$Path;
247
- var sUnitfield = sIsCurrency || sIsUnit;
248
- var s18nMessageTitle, s18nMessage;
249
- if (sUnitfield) {
250
- if (!this.checkMulitUnit(oData, sUnitfield)) {
251
- if (sIsCurrency) {
252
- s18nMessageTitle = oResourceBundle.getText("M_VISUAL_FILTERS_ERROR_MESSAGE_TITLE");
253
- s18nMessage = oResourceBundle.getText("M_VISUAL_FILTERS_MULTIPLE_CURRENCY", sUnitfield);
254
- this.applyErrorMessageAndTitle(s18nMessageTitle, s18nMessage, sInfoPath, oView);
255
- Log.warning("Filter is set for multiple Currency for" + sUnitfield);
256
- } else if (sIsUnit) {
257
- s18nMessageTitle = oResourceBundle.getText("M_VISUAL_FILTERS_ERROR_MESSAGE_TITLE");
258
- s18nMessage = oResourceBundle.getText("M_VISUAL_FILTERS_MULTIPLE_UNIT", sUnitfield);
259
- this.applyErrorMessageAndTitle(s18nMessageTitle, s18nMessage, sInfoPath, oView);
260
- Log.warning("Filter is set for multiple UOMs for" + sUnitfield);
261
- }
262
- }
263
- }
264
- },
265
-
266
- /**
267
- * Sets an error message if response data is empty.
268
- *
269
- * @param {string} sInfoPath Internal model context path to store info.
270
- * @param {string} oResourceBundle The resource bundle
271
- * @param {string} oView Instance of the view
272
- */
273
- setNoDataMessage: function(sInfoPath, oResourceBundle, oView) {
274
- var s18nMessageTitle = oResourceBundle.getText("M_VISUAL_FILTERS_ERROR_MESSAGE_TITLE");
275
- var s18nMessage = oResourceBundle.getText("M_VISUAL_FILTER_NO_DATA_TEXT");
276
- this.applyErrorMessageAndTitle(s18nMessageTitle, s18nMessage, sInfoPath, oView);
277
- },
278
- convertFilterCondions: function(oFilterConditions) {
279
- var oConvertedConditions = {};
280
- Object.keys(oFilterConditions).forEach(function(sKey) {
281
- var aConvertedConditions = [];
282
- var aConditions = oFilterConditions[sKey];
283
- for (var i = 0; i < aConditions.length; i++) {
284
- var values = aConditions[i].value2 ? [aConditions[i].value1, aConditions[i].value2] : [aConditions[i].value1];
285
- aConvertedConditions.push(Condition.createCondition(aConditions[i].operator, values, null, null, "Validated"));
286
- }
287
- if (aConvertedConditions.length) {
288
- oConvertedConditions[sKey] = aConvertedConditions;
289
- }
290
- });
291
- return oConvertedConditions;
292
- },
293
- getCustomConditions: function(Range, oValidProperty, sPropertyName) {
294
- var value1, value2;
295
- if (oValidProperty.$Type === "Edm.DateTimeOffset") {
296
- value1 = this._parseDateTime(FilterHelper.getTypeCompliantValue(this._formatDateTime(Range.Low), oValidProperty.$Type));
297
- value2 = Range.High
298
- ? this._parseDateTime(FilterHelper.getTypeCompliantValue(this._formatDateTime(Range.High), oValidProperty.$Type))
299
- : null;
300
- } else {
301
- value1 = Range.Low;
302
- value2 = Range.High ? Range.High : null;
303
- }
304
- return {
305
- operator: Range.Option ? FilterHelper.getOperator(Range.Option.$EnumMember || Range.Option) : null,
306
- value1: value1,
307
- value2: value2,
308
- path: sPropertyName
309
- };
310
- },
311
- _parseDateTime: function(sValue) {
312
- return this._getDateTimeTypeInstance().parseValue(sValue, "string");
313
- },
314
- _formatDateTime: function(sValue) {
315
- return this._getDateTimeTypeInstance().formatValue(sValue, "string");
316
- },
317
- _getDateTimeTypeInstance: function() {
318
- return new sap.ui.model.odata.type.DateTimeOffset(
319
- { pattern: "yyyy-MM-ddTHH:mm:ssZ", calendarType: "Gregorian" },
320
- { V4: true }
321
- );
322
- }
323
- };
324
- }
325
- );
8
+ var getTypeCompliantValue = FilterHelper.getTypeCompliantValue;
9
+ var getOperator = FilterHelper.getOperator;
10
+
11
+ var VisualFilterUtils = {
12
+ /**
13
+ * Applies the median scale to the chart data.
14
+ *
15
+ * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
16
+ * @param {object} oView Instance of the view
17
+ * @param {object} sVFId VisualFilter control ID
18
+ * @param {string} sInfoPath Internal model context path to store info.
19
+ */
20
+ applyMedianScaleToChartData: function (oInteractiveChart, oView, sVFId, sInfoPath) {
21
+ var oData = [];
22
+ var sMeasure = oInteractiveChart.data("measure");
23
+ var oInternalModelContext = oView.getBindingContext("internal");
24
+ var aAggregation = oInteractiveChart.getPoints && oInteractiveChart.getPoints() || oInteractiveChart.getBars && oInteractiveChart.getBars() || oInteractiveChart.getSegments && oInteractiveChart.getSegments();
25
+
26
+ for (var i = 0; i < aAggregation.length; i++) {
27
+ oData.push(aAggregation[i].getBindingContext().getObject());
28
+ }
29
+
30
+ var scaleFactor = this._getMedianScaleFactor(oData, sMeasure);
31
+
32
+ if (scaleFactor && scaleFactor.iShortRefNumber && scaleFactor.scale) {
33
+ oInternalModelContext.setProperty("scalefactor/" + sInfoPath, scaleFactor.scale);
34
+ oInternalModelContext.setProperty("scalefactorNumber/" + sInfoPath, scaleFactor.iShortRefNumber);
35
+ } else {
36
+ oInternalModelContext.setProperty("scalefactor/" + sInfoPath, "");
37
+ oInternalModelContext.setProperty("scalefactorNumber/" + sInfoPath, "");
38
+ var oScaleTitle = oView.byId(sVFId + "::ScaleUoMTitle");
39
+ var oMeasureDimensionTitle = oView.byId(sVFId + "::MeasureDimensionTitle");
40
+ var sText = oScaleTitle.getText();
41
+
42
+ if (sText === " | ") {
43
+ oScaleTitle.setVisible(false);
44
+ oMeasureDimensionTitle.setTooltip(oMeasureDimensionTitle.getText());
45
+ }
46
+ }
47
+ },
48
+
49
+ /**
50
+ * Returns the median scale factor.
51
+ *
52
+ * @param {object} oData VisualFilter data
53
+ * @param {string} sMeasureField Path of the measure
54
+ * @returns {object} Object containing scale and iShortRefNumber
55
+ */
56
+ _getMedianScaleFactor: function (oData, sMeasureField) {
57
+ var i;
58
+ var scaleFactor;
59
+ oData.sort(function (a, b) {
60
+ if (Number(a[sMeasureField]) < Number(b[sMeasureField])) {
61
+ return -1;
62
+ }
63
+
64
+ if (Number(a[sMeasureField]) > Number(b[sMeasureField])) {
65
+ return 1;
66
+ }
67
+
68
+ return 0;
69
+ });
70
+
71
+ if (oData.length > 0) {
72
+ // get median index
73
+ var iMid = oData.length / 2,
74
+ // get mid of array
75
+ // if iMid is whole number, array length is even, calculate median
76
+ // if iMid is not whole number, array length is odd, take median as iMid - 1
77
+ iMedian = iMid % 1 === 0 ? (parseFloat(oData[iMid - 1][sMeasureField]) + parseFloat(oData[iMid][sMeasureField])) / 2 : parseFloat(oData[Math.floor(iMid)][sMeasureField]),
78
+ // get scale factor on median
79
+ val = iMedian;
80
+
81
+ for (i = 0; i < 14; i++) {
82
+ scaleFactor = Math.pow(10, i);
83
+
84
+ if (Math.round(Math.abs(val) / scaleFactor) < 10) {
85
+ break;
86
+ }
87
+ }
88
+ }
89
+
90
+ var fixedInteger = NumberFormat.getIntegerInstance({
91
+ style: "short",
92
+ showScale: false,
93
+ shortRefNumber: scaleFactor
94
+ }); // apply scale factor to other values and check
95
+
96
+ for (i = 0; i < oData.length; i++) {
97
+ var aData = oData[i],
98
+ sScaledValue = fixedInteger.format(aData[sMeasureField]),
99
+ aScaledValueParts = sScaledValue.split("."); // if scaled value has only 0 before decimal or 0 after decimal (example: 0.02)
100
+ // then ignore this scale factor else proceed with this scale factor
101
+ // if scaled value divided by 1000 is >= 1000 then also ignore scale factor
102
+
103
+ if (!aScaledValueParts[1] && parseInt(aScaledValueParts[0], 10) === 0 || aScaledValueParts[1] && parseInt(aScaledValueParts[0], 10) === 0 && aScaledValueParts[1].indexOf("0") === 0 || sScaledValue / 1000 >= 1000) {
104
+ scaleFactor = undefined;
105
+ break;
106
+ }
107
+ }
108
+
109
+ return {
110
+ iShortRefNumber: scaleFactor,
111
+ scale: scaleFactor ? fixedInteger.getScale() : ""
112
+ };
113
+ },
114
+
115
+ /**
116
+ * Returns the formatted number according to the rules of VisualChartFilters.
117
+ *
118
+ * @param {string | number} value Value which needs to be formatted
119
+ * @param {number} scaleFactor ScaleFactor to which the value needs to be scaled
120
+ * @param {number} numberOfFractionalDigits NumberOfFractionalDigits digits in the decimals according to scale
121
+ * @param {string} currency Currency code
122
+ * @returns {number} The formatted number
123
+ */
124
+ getFormattedNumber: function (value, scaleFactor, numberOfFractionalDigits, currency) {
125
+ var fixedInteger;
126
+ value = typeof value === "string" ? Number(value.replace(/,/g, "")) : value;
127
+
128
+ if (currency) {
129
+ var currencyFormat = NumberFormat.getCurrencyInstance({
130
+ showMeasure: false
131
+ });
132
+ return currencyFormat.format(parseFloat(value), currency); // parseFloat(value) is required otherwise -ve value are wrongly rounded off
133
+ // Example: "-1.9" rounds off to -1 instead of -2. however -1.9 rounds off to -2
134
+ } else if (scaleFactor) {
135
+ fixedInteger = NumberFormat.getFloatInstance({
136
+ style: "short",
137
+ showScale: false,
138
+ shortRefNumber: scaleFactor,
139
+ shortDecimals: numberOfFractionalDigits
140
+ });
141
+ return fixedInteger.format(parseFloat(value));
142
+ } else {
143
+ fixedInteger = NumberFormat.getFloatInstance({
144
+ decimals: numberOfFractionalDigits
145
+ });
146
+ return fixedInteger.format(parseFloat(value));
147
+ }
148
+ },
149
+
150
+ /**
151
+ * Applies the UOM to the title of the visual filter control.
152
+ *
153
+ * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
154
+ * @param {object} oContextData Data of the VisualFilter
155
+ * @param {object} oView Instance of the view
156
+ * @param {string} sInfoPath Internal model context path to store info.
157
+ */
158
+ applyUOMToTitle: function (oInteractiveChart, oContextData, oView, sInfoPath) {
159
+ var vUOM = oInteractiveChart.data("uom");
160
+ var sUOM;
161
+ var sCurrency;
162
+
163
+ if (vUOM && vUOM["ISOCurrency"]) {
164
+ sUOM = vUOM["ISOCurrency"];
165
+ sCurrency = sUOM.$Path ? oContextData[sUOM.$Path] : sUOM;
166
+ } else if (vUOM && vUOM["Unit"]) {
167
+ sUOM = vUOM["Unit"];
168
+ }
169
+
170
+ if (sUOM) {
171
+ var sUOMValue = sUOM.$Path ? oContextData[sUOM.$Path] : sUOM;
172
+ var oInternalModelContext = oView.getBindingContext("internal");
173
+ oInternalModelContext.setProperty("uom/" + sInfoPath, sUOMValue);
174
+
175
+ if (sCurrency) {
176
+ oInternalModelContext.setProperty("currency/" + sInfoPath, sUOMValue);
177
+ }
178
+ }
179
+ },
180
+
181
+ /**
182
+ * Updates the scale factor in the title of the visual filter.
183
+ *
184
+ * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
185
+ * @param {object} oView Instance of the view
186
+ * @param {object} sVFId VisualFilter control ID
187
+ * @param {string} sInfoPath Internal model context path to store info.
188
+ */
189
+ updateChartScaleFactorTitle: function (oInteractiveChart, oView, sVFId, sInfoPath) {
190
+ if (!oInteractiveChart.data("scalefactor")) {
191
+ this.applyMedianScaleToChartData(oInteractiveChart, oView, sVFId, sInfoPath);
192
+ } else {
193
+ var fixedInteger = NumberFormat.getIntegerInstance({
194
+ style: "short",
195
+ showScale: false,
196
+ shortRefNumber: oInteractiveChart.data("scalefactor")
197
+ });
198
+ var oInternalModelContext = oView.getBindingContext("internal");
199
+ oInternalModelContext.setProperty("scalefactor/" + sInfoPath, fixedInteger.getScale());
200
+ }
201
+ },
202
+
203
+ /**
204
+ *
205
+ * @param {string} s18nMessageTitle Text of the error message title.
206
+ * @param {string} s18nMessage Text of the error message description.
207
+ * @param {string} sInfoPath Internal model context path to store info.
208
+ * @param {object} oView Instance of the view.
209
+ */
210
+ applyErrorMessageAndTitle: function (s18nMessageTitle, s18nMessage, sInfoPath, oView) {
211
+ var oInternalModelContext = oView.getBindingContext("internal");
212
+ oInternalModelContext.setProperty(sInfoPath, {});
213
+ oInternalModelContext.setProperty(sInfoPath, {
214
+ "errorMessageTitle": s18nMessageTitle,
215
+ "errorMessage": s18nMessage,
216
+ "showError": true
217
+ });
218
+ },
219
+
220
+ /**
221
+ * Checks if multiple units are present.
222
+ *
223
+ * @param {object} oContexts Contexts of the VisualFilter
224
+ * @param {string} sUnitfield The path of the unit field
225
+ * @returns {boolean} Returns if multiple units are configured or not
226
+ */
227
+ checkMulitUnit: function (oContexts, sUnitfield) {
228
+ var aData = [];
229
+
230
+ if (oContexts && sUnitfield) {
231
+ for (var i = 0; i < oContexts.length; i++) {
232
+ var aContextData = oContexts[i] && oContexts[i].getObject();
233
+ aData.push(aContextData[sUnitfield]);
234
+ }
235
+ }
236
+
237
+ return !!aData.reduce(function (data, key) {
238
+ return data === key ? data : NaN;
239
+ });
240
+ },
241
+
242
+ /**
243
+ * Sets an error message if multiple UOM are present.
244
+ *
245
+ * @param {object} oData Data of the VisualFilter control
246
+ * @param {object} oInteractiveChart InteractiveChart in the VisualFilter control
247
+ * @param {string} sInfoPath Internal model context path to store info.
248
+ * @param {string} oResourceBundle The resource bundle
249
+ * @param {string} oView Instance of the view
250
+ */
251
+ setMultiUOMMessage: function (oData, oInteractiveChart, sInfoPath, oResourceBundle, oView) {
252
+ var vUOM = oInteractiveChart.data("uom");
253
+ var sIsCurrency = vUOM && vUOM["ISOCurrency"] && vUOM["ISOCurrency"].$Path;
254
+ var sIsUnit = vUOM && vUOM["Unit"] && vUOM["Unit"].$Path;
255
+ var sUnitfield = sIsCurrency || sIsUnit;
256
+ var s18nMessageTitle, s18nMessage;
257
+
258
+ if (sUnitfield) {
259
+ if (!this.checkMulitUnit(oData, sUnitfield)) {
260
+ if (sIsCurrency) {
261
+ s18nMessageTitle = oResourceBundle.getText("M_VISUAL_FILTERS_ERROR_MESSAGE_TITLE");
262
+ s18nMessage = oResourceBundle.getText("M_VISUAL_FILTERS_MULTIPLE_CURRENCY", sUnitfield);
263
+ this.applyErrorMessageAndTitle(s18nMessageTitle, s18nMessage, sInfoPath, oView);
264
+ Log.warning("Filter is set for multiple Currency for" + sUnitfield);
265
+ } else if (sIsUnit) {
266
+ s18nMessageTitle = oResourceBundle.getText("M_VISUAL_FILTERS_ERROR_MESSAGE_TITLE");
267
+ s18nMessage = oResourceBundle.getText("M_VISUAL_FILTERS_MULTIPLE_UNIT", sUnitfield);
268
+ this.applyErrorMessageAndTitle(s18nMessageTitle, s18nMessage, sInfoPath, oView);
269
+ Log.warning("Filter is set for multiple UOMs for" + sUnitfield);
270
+ }
271
+ }
272
+ }
273
+ },
274
+
275
+ /**
276
+ * Sets an error message if response data is empty.
277
+ *
278
+ * @param {string} sInfoPath Internal model context path to store info.
279
+ * @param {string} oResourceBundle The resource bundle
280
+ * @param {string} oView Instance of the view
281
+ */
282
+ setNoDataMessage: function (sInfoPath, oResourceBundle, oView) {
283
+ var s18nMessageTitle = oResourceBundle.getText("M_VISUAL_FILTERS_ERROR_MESSAGE_TITLE");
284
+ var s18nMessage = oResourceBundle.getText("M_VISUAL_FILTER_NO_DATA_TEXT");
285
+ this.applyErrorMessageAndTitle(s18nMessageTitle, s18nMessage, sInfoPath, oView);
286
+ },
287
+ convertFilterCondions: function (oFilterConditions) {
288
+ var oConvertedConditions = {};
289
+ Object.keys(oFilterConditions).forEach(function (sKey) {
290
+ var aConvertedConditions = [];
291
+ var aConditions = oFilterConditions[sKey];
292
+
293
+ for (var i = 0; i < aConditions.length; i++) {
294
+ var values = aConditions[i].value2 ? [aConditions[i].value1, aConditions[i].value2] : [aConditions[i].value1];
295
+ aConvertedConditions.push(Condition.createCondition(aConditions[i].operator, values, null, null, "Validated"));
296
+ }
297
+
298
+ if (aConvertedConditions.length) {
299
+ oConvertedConditions[sKey] = aConvertedConditions;
300
+ }
301
+ });
302
+ return oConvertedConditions;
303
+ },
304
+ getCustomConditions: function (Range, oValidProperty, sPropertyName) {
305
+ var value1, value2;
306
+
307
+ if (oValidProperty.$Type === "Edm.DateTimeOffset") {
308
+ value1 = this._parseDateTime(getTypeCompliantValue(this._formatDateTime(Range.Low), oValidProperty.$Type));
309
+ value2 = Range.High ? this._parseDateTime(getTypeCompliantValue(this._formatDateTime(Range.High), oValidProperty.$Type)) : null;
310
+ } else {
311
+ value1 = Range.Low;
312
+ value2 = Range.High ? Range.High : null;
313
+ }
314
+
315
+ return {
316
+ operator: Range.Option ? getOperator(Range.Option.$EnumMember || Range.Option) : null,
317
+ value1: value1,
318
+ value2: value2,
319
+ path: sPropertyName
320
+ };
321
+ },
322
+ _parseDateTime: function (sValue) {
323
+ return this._getDateTimeTypeInstance().parseValue(sValue, "string");
324
+ },
325
+ _formatDateTime: function (sValue) {
326
+ return this._getDateTimeTypeInstance().formatValue(sValue, "string");
327
+ },
328
+ _getDateTimeTypeInstance: function () {
329
+ return new DateTimeOffset({
330
+ pattern: "yyyy-MM-ddTHH:mm:ssZ",
331
+ calendarType: "Gregorian"
332
+ }, {
333
+ V4: true
334
+ });
335
+ }
336
+ };
337
+ return VisualFilterUtils;
338
+ }, false);
339
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpc3VhbEZpbHRlclV0aWxzLnRzIl0sIm5hbWVzIjpbIlZpc3VhbEZpbHRlclV0aWxzIiwiYXBwbHlNZWRpYW5TY2FsZVRvQ2hhcnREYXRhIiwib0ludGVyYWN0aXZlQ2hhcnQiLCJvVmlldyIsInNWRklkIiwic0luZm9QYXRoIiwib0RhdGEiLCJzTWVhc3VyZSIsImRhdGEiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImFBZ2dyZWdhdGlvbiIsImdldFBvaW50cyIsImdldEJhcnMiLCJnZXRTZWdtZW50cyIsImkiLCJsZW5ndGgiLCJwdXNoIiwiZ2V0T2JqZWN0Iiwic2NhbGVGYWN0b3IiLCJfZ2V0TWVkaWFuU2NhbGVGYWN0b3IiLCJpU2hvcnRSZWZOdW1iZXIiLCJzY2FsZSIsInNldFByb3BlcnR5Iiwib1NjYWxlVGl0bGUiLCJieUlkIiwib01lYXN1cmVEaW1lbnNpb25UaXRsZSIsInNUZXh0IiwiZ2V0VGV4dCIsInNldFZpc2libGUiLCJzZXRUb29sdGlwIiwic01lYXN1cmVGaWVsZCIsInNvcnQiLCJhIiwiYiIsIk51bWJlciIsImlNaWQiLCJpTWVkaWFuIiwicGFyc2VGbG9hdCIsIk1hdGgiLCJmbG9vciIsInZhbCIsInBvdyIsInJvdW5kIiwiYWJzIiwiZml4ZWRJbnRlZ2VyIiwiTnVtYmVyRm9ybWF0IiwiZ2V0SW50ZWdlckluc3RhbmNlIiwic3R5bGUiLCJzaG93U2NhbGUiLCJzaG9ydFJlZk51bWJlciIsImFEYXRhIiwic1NjYWxlZFZhbHVlIiwiZm9ybWF0IiwiYVNjYWxlZFZhbHVlUGFydHMiLCJzcGxpdCIsInBhcnNlSW50IiwiaW5kZXhPZiIsInVuZGVmaW5lZCIsImdldFNjYWxlIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyIiwidmFsdWUiLCJudW1iZXJPZkZyYWN0aW9uYWxEaWdpdHMiLCJjdXJyZW5jeSIsInJlcGxhY2UiLCJjdXJyZW5jeUZvcm1hdCIsImdldEN1cnJlbmN5SW5zdGFuY2UiLCJzaG93TWVhc3VyZSIsImdldEZsb2F0SW5zdGFuY2UiLCJzaG9ydERlY2ltYWxzIiwiZGVjaW1hbHMiLCJhcHBseVVPTVRvVGl0bGUiLCJvQ29udGV4dERhdGEiLCJ2VU9NIiwic1VPTSIsInNDdXJyZW5jeSIsIiRQYXRoIiwic1VPTVZhbHVlIiwidXBkYXRlQ2hhcnRTY2FsZUZhY3RvclRpdGxlIiwiYXBwbHlFcnJvck1lc3NhZ2VBbmRUaXRsZSIsInMxOG5NZXNzYWdlVGl0bGUiLCJzMThuTWVzc2FnZSIsImNoZWNrTXVsaXRVbml0Iiwib0NvbnRleHRzIiwic1VuaXRmaWVsZCIsImFDb250ZXh0RGF0YSIsInJlZHVjZSIsImtleSIsIk5hTiIsInNldE11bHRpVU9NTWVzc2FnZSIsIm9SZXNvdXJjZUJ1bmRsZSIsInNJc0N1cnJlbmN5Iiwic0lzVW5pdCIsIkxvZyIsIndhcm5pbmciLCJzZXROb0RhdGFNZXNzYWdlIiwiY29udmVydEZpbHRlckNvbmRpb25zIiwib0ZpbHRlckNvbmRpdGlvbnMiLCJvQ29udmVydGVkQ29uZGl0aW9ucyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwic0tleSIsImFDb252ZXJ0ZWRDb25kaXRpb25zIiwiYUNvbmRpdGlvbnMiLCJ2YWx1ZXMiLCJ2YWx1ZTIiLCJ2YWx1ZTEiLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJvcGVyYXRvciIsImdldEN1c3RvbUNvbmRpdGlvbnMiLCJSYW5nZSIsIm9WYWxpZFByb3BlcnR5Iiwic1Byb3BlcnR5TmFtZSIsIiRUeXBlIiwiX3BhcnNlRGF0ZVRpbWUiLCJnZXRUeXBlQ29tcGxpYW50VmFsdWUiLCJfZm9ybWF0RGF0ZVRpbWUiLCJMb3ciLCJIaWdoIiwiT3B0aW9uIiwiZ2V0T3BlcmF0b3IiLCIkRW51bU1lbWJlciIsInBhdGgiLCJzVmFsdWUiLCJfZ2V0RGF0ZVRpbWVUeXBlSW5zdGFuY2UiLCJwYXJzZVZhbHVlIiwiZm9ybWF0VmFsdWUiLCJEYXRlVGltZU9mZnNldCIsInBhdHRlcm4iLCJjYWxlbmRhclR5cGUiLCJW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QTFCLEdBQXVFLElBRDNFO0FBRU5kLFFBQUFBLE1BQU0sRUFBRUEsTUFGRjtBQUdORCxRQUFBQSxNQUFNLEVBQUVBLE1BSEY7QUFJTmtCLFFBQUFBLElBQUksRUFBRVY7QUFKQSxPQUFQO0FBTUEsS0F4VHdCO0FBeVR6QkUsSUFBQUEsY0FBYyxFQUFFLFVBQVNTLE1BQVQsRUFBc0I7QUFDckMsYUFBTyxLQUFLQyx3QkFBTCxHQUFnQ0MsVUFBaEMsQ0FBMkNGLE1BQTNDLEVBQW1ELFFBQW5ELENBQVA7QUFDQSxLQTNUd0I7QUE0VHpCUCxJQUFBQSxlQUFlLEVBQUUsVUFBU08sTUFBVCxFQUFzQjtBQUN0QyxhQUFPLEtBQUtDLHdCQUFMLEdBQWdDRSxXQUFoQyxDQUE0Q0gsTUFBNUMsRUFBb0QsUUFBcEQsQ0FBUDtBQUNBLEtBOVR3QjtBQStUekJDLElBQUFBLHdCQUF3QixFQUFFLFlBQVc7QUFDcEMsYUFBTyxJQUFJRyxjQUFKLENBQW1CO0FBQUVDLFFBQUFBLE9BQU8sRUFBRSxzQkFBWDtBQUFtQ0MsUUFBQUEsWUFBWSxFQUFFO0FBQWpELE9BQW5CLEVBQW1GO0FBQUVDLFFBQUFBLEVBQUUsRUFBRTtBQUFOLE9BQW5GLENBQVA7QUFDQTtBQWpVd0IsR0FBMUI7U0FvVWVwSSxpQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IENvbmRpdGlvbiBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFRpdGxlIGZyb20gXCJzYXAvbS9UaXRsZVwiO1xuaW1wb3J0IE51bWJlckZvcm1hdCBmcm9tIFwic2FwL3VpL2NvcmUvZm9ybWF0L051bWJlckZvcm1hdFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBDb25kaXRpb25WYWxpZGF0ZWQgZnJvbSBcInNhcC91aS9tZGMvZW51bS9Db25kaXRpb25WYWxpZGF0ZWRcIjtcbmltcG9ydCB7IGdldE9wZXJhdG9yLCBnZXRUeXBlQ29tcGxpYW50VmFsdWUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWx0ZXJIZWxwZXJcIjtcbmltcG9ydCBEYXRlVGltZU9mZnNldCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3R5cGUvRGF0ZVRpbWVPZmZzZXRcIjtcblxuY29uc3QgVmlzdWFsRmlsdGVyVXRpbHMgPSB7XG5cdC8qKlxuXHQgKiBBcHBsaWVzIHRoZSBtZWRpYW4gc2NhbGUgdG8gdGhlIGNoYXJ0IGRhdGEuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvSW50ZXJhY3RpdmVDaGFydCBJbnRlcmFjdGl2ZUNoYXJ0IGluIHRoZSBWaXN1YWxGaWx0ZXIgY29udHJvbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgSW5zdGFuY2Ugb2YgdGhlIHZpZXdcblx0ICogQHBhcmFtIHtvYmplY3R9IHNWRklkIFZpc3VhbEZpbHRlciBjb250cm9sIElEXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5mb1BhdGggSW50ZXJuYWwgbW9kZWwgY29udGV4dCBwYXRoIHRvIHN0b3JlIGluZm8uXG5cdCAqL1xuXHRhcHBseU1lZGlhblNjYWxlVG9DaGFydERhdGE6IGZ1bmN0aW9uKG9JbnRlcmFjdGl2ZUNoYXJ0OiBhbnksIG9WaWV3OiBWaWV3LCBzVkZJZDogc3RyaW5nLCBzSW5mb1BhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IG9EYXRhID0gW107XG5cdFx0Y29uc3Qgc01lYXN1cmUgPSBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwibWVhc3VyZVwiKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IGFBZ2dyZWdhdGlvbiA9XG5cdFx0XHQob0ludGVyYWN0aXZlQ2hhcnQuZ2V0UG9pbnRzICYmIG9JbnRlcmFjdGl2ZUNoYXJ0LmdldFBvaW50cygpKSB8fFxuXHRcdFx0KG9JbnRlcmFjdGl2ZUNoYXJ0LmdldEJhcnMgJiYgb0ludGVyYWN0aXZlQ2hhcnQuZ2V0QmFycygpKSB8fFxuXHRcdFx0KG9JbnRlcmFjdGl2ZUNoYXJ0LmdldFNlZ21lbnRzICYmIG9JbnRlcmFjdGl2ZUNoYXJ0LmdldFNlZ21lbnRzKCkpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUFnZ3JlZ2F0aW9uLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvRGF0YS5wdXNoKGFBZ2dyZWdhdGlvbltpXS5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpKTtcblx0XHR9XG5cdFx0Y29uc3Qgc2NhbGVGYWN0b3IgPSB0aGlzLl9nZXRNZWRpYW5TY2FsZUZhY3RvcihvRGF0YSwgc01lYXN1cmUpO1xuXHRcdGlmIChzY2FsZUZhY3RvciAmJiBzY2FsZUZhY3Rvci5pU2hvcnRSZWZOdW1iZXIgJiYgc2NhbGVGYWN0b3Iuc2NhbGUpIHtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNjYWxlZmFjdG9yL1wiICsgc0luZm9QYXRoLCBzY2FsZUZhY3Rvci5zY2FsZSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzY2FsZWZhY3Rvck51bWJlci9cIiArIHNJbmZvUGF0aCwgc2NhbGVGYWN0b3IuaVNob3J0UmVmTnVtYmVyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3IvXCIgKyBzSW5mb1BhdGgsIFwiXCIpO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JOdW1iZXIvXCIgKyBzSW5mb1BhdGgsIFwiXCIpO1xuXHRcdFx0Y29uc3Qgb1NjYWxlVGl0bGUgPSBvVmlldy5ieUlkKHNWRklkICsgXCI6OlNjYWxlVW9NVGl0bGVcIikgYXMgVGl0bGU7XG5cdFx0XHRjb25zdCBvTWVhc3VyZURpbWVuc2lvblRpdGxlID0gb1ZpZXcuYnlJZChzVkZJZCArIFwiOjpNZWFzdXJlRGltZW5zaW9uVGl0bGVcIikgYXMgVGl0bGU7XG5cdFx0XHRjb25zdCBzVGV4dCA9IG9TY2FsZVRpdGxlLmdldFRleHQoKTtcblx0XHRcdGlmIChzVGV4dCA9PT0gXCIgfCBcIikge1xuXHRcdFx0XHRvU2NhbGVUaXRsZS5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0b01lYXN1cmVEaW1lbnNpb25UaXRsZS5zZXRUb29sdGlwKG9NZWFzdXJlRGltZW5zaW9uVGl0bGUuZ2V0VGV4dCgpKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG1lZGlhbiBzY2FsZSBmYWN0b3IuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGF0YSBWaXN1YWxGaWx0ZXIgZGF0YVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc01lYXN1cmVGaWVsZCBQYXRoIG9mIHRoZSBtZWFzdXJlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHNjYWxlIGFuZCBpU2hvcnRSZWZOdW1iZXJcblx0ICovXG5cdF9nZXRNZWRpYW5TY2FsZUZhY3RvcjogZnVuY3Rpb24ob0RhdGE6IGFueVtdLCBzTWVhc3VyZUZpZWxkOiBzdHJpbmcpIHtcblx0XHRsZXQgaTtcblx0XHRsZXQgc2NhbGVGYWN0b3I7XG5cdFx0b0RhdGEuc29ydChmdW5jdGlvbihhOiBhbnksIGI6IGFueSkge1xuXHRcdFx0aWYgKE51bWJlcihhW3NNZWFzdXJlRmllbGRdKSA8IE51bWJlcihiW3NNZWFzdXJlRmllbGRdKSkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoTnVtYmVyKGFbc01lYXN1cmVGaWVsZF0pID4gTnVtYmVyKGJbc01lYXN1cmVGaWVsZF0pKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fSk7XG5cdFx0aWYgKG9EYXRhLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIGdldCBtZWRpYW4gaW5kZXhcblx0XHRcdGNvbnN0IGlNaWQgPSBvRGF0YS5sZW5ndGggLyAyLCAvLyBnZXQgbWlkIG9mIGFycmF5XG5cdFx0XHRcdC8vIGlmIGlNaWQgaXMgd2hvbGUgbnVtYmVyLCBhcnJheSBsZW5ndGggaXMgZXZlbiwgY2FsY3VsYXRlIG1lZGlhblxuXHRcdFx0XHQvLyBpZiBpTWlkIGlzIG5vdCB3aG9sZSBudW1iZXIsIGFycmF5IGxlbmd0aCBpcyBvZGQsIHRha2UgbWVkaWFuIGFzIGlNaWQgLSAxXG5cdFx0XHRcdGlNZWRpYW4gPVxuXHRcdFx0XHRcdGlNaWQgJSAxID09PSAwXG5cdFx0XHRcdFx0XHQ/IChwYXJzZUZsb2F0KG9EYXRhW2lNaWQgLSAxXVtzTWVhc3VyZUZpZWxkXSkgKyBwYXJzZUZsb2F0KG9EYXRhW2lNaWRdW3NNZWFzdXJlRmllbGRdKSkgLyAyXG5cdFx0XHRcdFx0XHQ6IHBhcnNlRmxvYXQob0RhdGFbTWF0aC5mbG9vcihpTWlkKV1bc01lYXN1cmVGaWVsZF0pLFxuXHRcdFx0XHQvLyBnZXQgc2NhbGUgZmFjdG9yIG9uIG1lZGlhblxuXHRcdFx0XHR2YWwgPSBpTWVkaWFuO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHtcblx0XHRcdFx0c2NhbGVGYWN0b3IgPSBNYXRoLnBvdygxMCwgaSk7XG5cdFx0XHRcdGlmIChNYXRoLnJvdW5kKE1hdGguYWJzKHZhbCkgLyBzY2FsZUZhY3RvcikgPCAxMCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZml4ZWRJbnRlZ2VyID0gTnVtYmVyRm9ybWF0LmdldEludGVnZXJJbnN0YW5jZSh7XG5cdFx0XHRzdHlsZTogXCJzaG9ydFwiLFxuXHRcdFx0c2hvd1NjYWxlOiBmYWxzZSxcblx0XHRcdHNob3J0UmVmTnVtYmVyOiBzY2FsZUZhY3RvclxuXHRcdH0pO1xuXG5cdFx0Ly8gYXBwbHkgc2NhbGUgZmFjdG9yIHRvIG90aGVyIHZhbHVlcyBhbmQgY2hlY2tcblx0XHRmb3IgKGkgPSAwOyBpIDwgb0RhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGFEYXRhID0gb0RhdGFbaV0sXG5cdFx0XHRcdHNTY2FsZWRWYWx1ZSA9IGZpeGVkSW50ZWdlci5mb3JtYXQoYURhdGFbc01lYXN1cmVGaWVsZF0pIGFzIGFueSxcblx0XHRcdFx0YVNjYWxlZFZhbHVlUGFydHMgPSBzU2NhbGVkVmFsdWUuc3BsaXQoXCIuXCIpO1xuXHRcdFx0Ly8gaWYgc2NhbGVkIHZhbHVlIGhhcyBvbmx5IDAgYmVmb3JlIGRlY2ltYWwgb3IgMCBhZnRlciBkZWNpbWFsIChleGFtcGxlOiAwLjAyKVxuXHRcdFx0Ly8gdGhlbiBpZ25vcmUgdGhpcyBzY2FsZSBmYWN0b3IgZWxzZSBwcm9jZWVkIHdpdGggdGhpcyBzY2FsZSBmYWN0b3Jcblx0XHRcdC8vIGlmIHNjYWxlZCB2YWx1ZSBkaXZpZGVkIGJ5IDEwMDAgaXMgPj0gMTAwMCB0aGVuIGFsc28gaWdub3JlIHNjYWxlIGZhY3RvclxuXHRcdFx0aWYgKFxuXHRcdFx0XHQoIWFTY2FsZWRWYWx1ZVBhcnRzWzFdICYmIHBhcnNlSW50KGFTY2FsZWRWYWx1ZVBhcnRzWzBdLCAxMCkgPT09IDApIHx8XG5cdFx0XHRcdChhU2NhbGVkVmFsdWVQYXJ0c1sxXSAmJiBwYXJzZUludChhU2NhbGVkVmFsdWVQYXJ0c1swXSwgMTApID09PSAwICYmIGFTY2FsZWRWYWx1ZVBhcnRzWzFdLmluZGV4T2YoXCIwXCIpID09PSAwKSB8fFxuXHRcdFx0XHRzU2NhbGVkVmFsdWUgLyAxMDAwID49IDEwMDBcblx0XHRcdCkge1xuXHRcdFx0XHRzY2FsZUZhY3RvciA9IHVuZGVmaW5lZDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRpU2hvcnRSZWZOdW1iZXI6IHNjYWxlRmFjdG9yLFxuXHRcdFx0c2NhbGU6IHNjYWxlRmFjdG9yID8gKGZpeGVkSW50ZWdlciBhcyBhbnkpLmdldFNjYWxlKCkgOiBcIlwiXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIFZpc3VhbENoYXJ0RmlsdGVycy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlIFZhbHVlIHdoaWNoIG5lZWRzIHRvIGJlIGZvcm1hdHRlZFxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVGYWN0b3IgU2NhbGVGYWN0b3IgdG8gd2hpY2ggdGhlIHZhbHVlIG5lZWRzIHRvIGJlIHNjYWxlZFxuXHQgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzIE51bWJlck9mRnJhY3Rpb25hbERpZ2l0cyBkaWdpdHMgaW4gdGhlIGRlY2ltYWxzIGFjY29yZGluZyB0byBzY2FsZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY3VycmVuY3kgQ3VycmVuY3kgY29kZVxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZm9ybWF0dGVkIG51bWJlclxuXHQgKi9cblx0Z2V0Rm9ybWF0dGVkTnVtYmVyOiBmdW5jdGlvbihcblx0XHR2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuXHRcdHNjYWxlRmFjdG9yOiBudW1iZXIgfCB1bmRlZmluZWQsXG5cdFx0bnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzOiBudW1iZXIgfCB1bmRlZmluZWQsXG5cdFx0Y3VycmVuY3k6IHN0cmluZyB8IHVuZGVmaW5lZFxuXHQpIHtcblx0XHRsZXQgZml4ZWRJbnRlZ2VyO1xuXHRcdHZhbHVlID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gTnVtYmVyKHZhbHVlLnJlcGxhY2UoLywvZywgXCJcIikpIDogdmFsdWU7XG5cblx0XHRpZiAoY3VycmVuY3kpIHtcblx0XHRcdGNvbnN0IGN1cnJlbmN5Rm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldEN1cnJlbmN5SW5zdGFuY2Uoe1xuXHRcdFx0XHRzaG93TWVhc3VyZTogZmFsc2Vcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGN1cnJlbmN5Rm9ybWF0LmZvcm1hdChwYXJzZUZsb2F0KHZhbHVlIGFzIGFueSksIGN1cnJlbmN5KTtcblx0XHRcdC8vIHBhcnNlRmxvYXQodmFsdWUpIGlzIHJlcXVpcmVkIG90aGVyd2lzZSAtdmUgdmFsdWUgYXJlIHdyb25nbHkgcm91bmRlZCBvZmZcblx0XHRcdC8vIEV4YW1wbGU6IFwiLTEuOVwiIHJvdW5kcyBvZmYgdG8gLTEgaW5zdGVhZCBvZiAtMi4gaG93ZXZlciAtMS45IHJvdW5kcyBvZmYgdG8gLTJcblx0XHR9IGVsc2UgaWYgKHNjYWxlRmFjdG9yKSB7XG5cdFx0XHRmaXhlZEludGVnZXIgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZSh7XG5cdFx0XHRcdHN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2UsXG5cdFx0XHRcdHNob3J0UmVmTnVtYmVyOiBzY2FsZUZhY3Rvcixcblx0XHRcdFx0c2hvcnREZWNpbWFsczogbnVtYmVyT2ZGcmFjdGlvbmFsRGlnaXRzXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBmaXhlZEludGVnZXIuZm9ybWF0KHBhcnNlRmxvYXQodmFsdWUgYXMgYW55KSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZpeGVkSW50ZWdlciA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKHtcblx0XHRcdFx0ZGVjaW1hbHM6IG51bWJlck9mRnJhY3Rpb25hbERpZ2l0c1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gZml4ZWRJbnRlZ2VyLmZvcm1hdChwYXJzZUZsb2F0KHZhbHVlIGFzIGFueSkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQXBwbGllcyB0aGUgVU9NIHRvIHRoZSB0aXRsZSBvZiB0aGUgdmlzdWFsIGZpbHRlciBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ludGVyYWN0aXZlQ2hhcnQgSW50ZXJhY3RpdmVDaGFydCBpbiB0aGUgVmlzdWFsRmlsdGVyIGNvbnRyb2xcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0RGF0YSBEYXRhIG9mIHRoZSBWaXN1YWxGaWx0ZXJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3IEluc3RhbmNlIG9mIHRoZSB2aWV3XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5mb1BhdGggSW50ZXJuYWwgbW9kZWwgY29udGV4dCBwYXRoIHRvIHN0b3JlIGluZm8uXG5cdCAqL1xuXHRhcHBseVVPTVRvVGl0bGU6IGZ1bmN0aW9uKG9JbnRlcmFjdGl2ZUNoYXJ0OiBhbnksIG9Db250ZXh0RGF0YTogYW55LCBvVmlldzogVmlldywgc0luZm9QYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2VU9NID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcInVvbVwiKTtcblx0XHRsZXQgc1VPTTtcblx0XHRsZXQgc0N1cnJlbmN5O1xuXHRcdGlmICh2VU9NICYmIHZVT01bXCJJU09DdXJyZW5jeVwiXSkge1xuXHRcdFx0c1VPTSA9IHZVT01bXCJJU09DdXJyZW5jeVwiXTtcblx0XHRcdHNDdXJyZW5jeSA9IHNVT00uJFBhdGggPyBvQ29udGV4dERhdGFbc1VPTS4kUGF0aF0gOiBzVU9NO1xuXHRcdH0gZWxzZSBpZiAodlVPTSAmJiB2VU9NW1wiVW5pdFwiXSkge1xuXHRcdFx0c1VPTSA9IHZVT01bXCJVbml0XCJdO1xuXHRcdH1cblx0XHRpZiAoc1VPTSkge1xuXHRcdFx0Y29uc3Qgc1VPTVZhbHVlID0gc1VPTS4kUGF0aCA/IG9Db250ZXh0RGF0YVtzVU9NLiRQYXRoXSA6IHNVT007XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidW9tL1wiICsgc0luZm9QYXRoLCBzVU9NVmFsdWUpO1xuXHRcdFx0aWYgKHNDdXJyZW5jeSkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjdXJyZW5jeS9cIiArIHNJbmZvUGF0aCwgc1VPTVZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBzY2FsZSBmYWN0b3IgaW4gdGhlIHRpdGxlIG9mIHRoZSB2aXN1YWwgZmlsdGVyLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ludGVyYWN0aXZlQ2hhcnQgSW50ZXJhY3RpdmVDaGFydCBpbiB0aGUgVmlzdWFsRmlsdGVyIGNvbnRyb2xcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3IEluc3RhbmNlIG9mIHRoZSB2aWV3XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBzVkZJZCBWaXN1YWxGaWx0ZXIgY29udHJvbCBJRFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0luZm9QYXRoIEludGVybmFsIG1vZGVsIGNvbnRleHQgcGF0aCB0byBzdG9yZSBpbmZvLlxuXHQgKi9cblx0dXBkYXRlQ2hhcnRTY2FsZUZhY3RvclRpdGxlOiBmdW5jdGlvbihvSW50ZXJhY3RpdmVDaGFydDogYW55LCBvVmlldzogVmlldywgc1ZGSWQ6IHN0cmluZywgc0luZm9QYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIW9JbnRlcmFjdGl2ZUNoYXJ0LmRhdGEoXCJzY2FsZWZhY3RvclwiKSkge1xuXHRcdFx0dGhpcy5hcHBseU1lZGlhblNjYWxlVG9DaGFydERhdGEob0ludGVyYWN0aXZlQ2hhcnQsIG9WaWV3LCBzVkZJZCwgc0luZm9QYXRoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZml4ZWRJbnRlZ2VyID0gTnVtYmVyRm9ybWF0LmdldEludGVnZXJJbnN0YW5jZSh7XG5cdFx0XHRcdHN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2UsXG5cdFx0XHRcdHNob3J0UmVmTnVtYmVyOiBvSW50ZXJhY3RpdmVDaGFydC5kYXRhKFwic2NhbGVmYWN0b3JcIilcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNjYWxlZmFjdG9yL1wiICsgc0luZm9QYXRoLCAoZml4ZWRJbnRlZ2VyIGFzIGFueSkuZ2V0U2NhbGUoKSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gczE4bk1lc3NhZ2VUaXRsZSBUZXh0IG9mIHRoZSBlcnJvciBtZXNzYWdlIHRpdGxlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gczE4bk1lc3NhZ2UgVGV4dCBvZiB0aGUgZXJyb3IgbWVzc2FnZSBkZXNjcmlwdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNJbmZvUGF0aCBJbnRlcm5hbCBtb2RlbCBjb250ZXh0IHBhdGggdG8gc3RvcmUgaW5mby5cblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3IEluc3RhbmNlIG9mIHRoZSB2aWV3LlxuXHQgKi9cblx0YXBwbHlFcnJvck1lc3NhZ2VBbmRUaXRsZTogZnVuY3Rpb24oczE4bk1lc3NhZ2VUaXRsZTogc3RyaW5nLCBzMThuTWVzc2FnZTogc3RyaW5nLCBzSW5mb1BhdGg6IHN0cmluZywgb1ZpZXc6IFZpZXcpIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShzSW5mb1BhdGgsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoc0luZm9QYXRoLCB7XG5cdFx0XHRcImVycm9yTWVzc2FnZVRpdGxlXCI6IHMxOG5NZXNzYWdlVGl0bGUsXG5cdFx0XHRcImVycm9yTWVzc2FnZVwiOiBzMThuTWVzc2FnZSxcblx0XHRcdFwic2hvd0Vycm9yXCI6IHRydWVcblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBpZiBtdWx0aXBsZSB1bml0cyBhcmUgcHJlc2VudC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0cyBDb250ZXh0cyBvZiB0aGUgVmlzdWFsRmlsdGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVW5pdGZpZWxkIFRoZSBwYXRoIG9mIHRoZSB1bml0IGZpZWxkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGlmIG11bHRpcGxlIHVuaXRzIGFyZSBjb25maWd1cmVkIG9yIG5vdFxuXHQgKi9cblx0Y2hlY2tNdWxpdFVuaXQ6IGZ1bmN0aW9uKG9Db250ZXh0czogQ29udGV4dFtdLCBzVW5pdGZpZWxkOiBzdHJpbmcpIHtcblx0XHRjb25zdCBhRGF0YSA9IFtdO1xuXHRcdGlmIChvQ29udGV4dHMgJiYgc1VuaXRmaWVsZCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgYUNvbnRleHREYXRhID0gb0NvbnRleHRzW2ldICYmIChvQ29udGV4dHNbaV0uZ2V0T2JqZWN0KCkgYXMgYW55KTtcblx0XHRcdFx0YURhdGEucHVzaChhQ29udGV4dERhdGFbc1VuaXRmaWVsZF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gISFhRGF0YS5yZWR1Y2UoZnVuY3Rpb24oZGF0YTogYW55LCBrZXk6IGFueSkge1xuXHRcdFx0cmV0dXJuIGRhdGEgPT09IGtleSA/IGRhdGEgOiBOYU47XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgYW4gZXJyb3IgbWVzc2FnZSBpZiBtdWx0aXBsZSBVT00gYXJlIHByZXNlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGF0YSBEYXRhIG9mIHRoZSBWaXN1YWxGaWx0ZXIgY29udHJvbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ludGVyYWN0aXZlQ2hhcnQgSW50ZXJhY3RpdmVDaGFydCBpbiB0aGUgVmlzdWFsRmlsdGVyIGNvbnRyb2xcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNJbmZvUGF0aCBJbnRlcm5hbCBtb2RlbCBjb250ZXh0IHBhdGggdG8gc3RvcmUgaW5mby5cblx0ICogQHBhcmFtIHtzdHJpbmd9IG9SZXNvdXJjZUJ1bmRsZSBUaGUgcmVzb3VyY2UgYnVuZGxlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvVmlldyBJbnN0YW5jZSBvZiB0aGUgdmlld1xuXHQgKi9cblx0c2V0TXVsdGlVT01NZXNzYWdlOiBmdW5jdGlvbihcblx0XHRvRGF0YTogQ29udGV4dFtdLFxuXHRcdG9JbnRlcmFjdGl2ZUNoYXJ0OiBhbnksXG5cdFx0c0luZm9QYXRoOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSxcblx0XHRvVmlldzogVmlld1xuXHQpIHtcblx0XHRjb25zdCB2VU9NID0gb0ludGVyYWN0aXZlQ2hhcnQuZGF0YShcInVvbVwiKTtcblx0XHRjb25zdCBzSXNDdXJyZW5jeSA9IHZVT00gJiYgdlVPTVtcIklTT0N1cnJlbmN5XCJdICYmIHZVT01bXCJJU09DdXJyZW5jeVwiXS4kUGF0aDtcblx0XHRjb25zdCBzSXNVbml0ID0gdlVPTSAmJiB2VU9NW1wiVW5pdFwiXSAmJiB2VU9NW1wiVW5pdFwiXS4kUGF0aDtcblx0XHRjb25zdCBzVW5pdGZpZWxkID0gc0lzQ3VycmVuY3kgfHwgc0lzVW5pdDtcblx0XHRsZXQgczE4bk1lc3NhZ2VUaXRsZSwgczE4bk1lc3NhZ2U7XG5cdFx0aWYgKHNVbml0ZmllbGQpIHtcblx0XHRcdGlmICghdGhpcy5jaGVja011bGl0VW5pdChvRGF0YSwgc1VuaXRmaWVsZCkpIHtcblx0XHRcdFx0aWYgKHNJc0N1cnJlbmN5KSB7XG5cdFx0XHRcdFx0czE4bk1lc3NhZ2VUaXRsZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9WSVNVQUxfRklMVEVSU19FUlJPUl9NRVNTQUdFX1RJVExFXCIpO1xuXHRcdFx0XHRcdHMxOG5NZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX1ZJU1VBTF9GSUxURVJTX01VTFRJUExFX0NVUlJFTkNZXCIsIHNVbml0ZmllbGQpO1xuXHRcdFx0XHRcdHRoaXMuYXBwbHlFcnJvck1lc3NhZ2VBbmRUaXRsZShzMThuTWVzc2FnZVRpdGxlLCBzMThuTWVzc2FnZSwgc0luZm9QYXRoLCBvVmlldyk7XG5cdFx0XHRcdFx0TG9nLndhcm5pbmcoXCJGaWx0ZXIgaXMgc2V0IGZvciBtdWx0aXBsZSBDdXJyZW5jeSBmb3JcIiArIHNVbml0ZmllbGQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNJc1VuaXQpIHtcblx0XHRcdFx0XHRzMThuTWVzc2FnZVRpdGxlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX1ZJU1VBTF9GSUxURVJTX0VSUk9SX01FU1NBR0VfVElUTEVcIik7XG5cdFx0XHRcdFx0czE4bk1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fVklTVUFMX0ZJTFRFUlNfTVVMVElQTEVfVU5JVFwiLCBzVW5pdGZpZWxkKTtcblx0XHRcdFx0XHR0aGlzLmFwcGx5RXJyb3JNZXNzYWdlQW5kVGl0bGUoczE4bk1lc3NhZ2VUaXRsZSwgczE4bk1lc3NhZ2UsIHNJbmZvUGF0aCwgb1ZpZXcpO1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKFwiRmlsdGVyIGlzIHNldCBmb3IgbXVsdGlwbGUgVU9NcyBmb3JcIiArIHNVbml0ZmllbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIGFuIGVycm9yIG1lc3NhZ2UgaWYgcmVzcG9uc2UgZGF0YSBpcyBlbXB0eS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNJbmZvUGF0aCBJbnRlcm5hbCBtb2RlbCBjb250ZXh0IHBhdGggdG8gc3RvcmUgaW5mby5cblx0ICogQHBhcmFtIHtzdHJpbmd9IG9SZXNvdXJjZUJ1bmRsZSBUaGUgcmVzb3VyY2UgYnVuZGxlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvVmlldyBJbnN0YW5jZSBvZiB0aGUgdmlld1xuXHQgKi9cblx0c2V0Tm9EYXRhTWVzc2FnZTogZnVuY3Rpb24oc0luZm9QYXRoOiBzdHJpbmcsIG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGUsIG9WaWV3OiBWaWV3KSB7XG5cdFx0Y29uc3QgczE4bk1lc3NhZ2VUaXRsZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9WSVNVQUxfRklMVEVSU19FUlJPUl9NRVNTQUdFX1RJVExFXCIpO1xuXHRcdGNvbnN0IHMxOG5NZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX1ZJU1VBTF9GSUxURVJfTk9fREFUQV9URVhUXCIpO1xuXHRcdHRoaXMuYXBwbHlFcnJvck1lc3NhZ2VBbmRUaXRsZShzMThuTWVzc2FnZVRpdGxlLCBzMThuTWVzc2FnZSwgc0luZm9QYXRoLCBvVmlldyk7XG5cdH0sXG5cdGNvbnZlcnRGaWx0ZXJDb25kaW9uczogZnVuY3Rpb24ob0ZpbHRlckNvbmRpdGlvbnM6IGFueSkge1xuXHRcdGNvbnN0IG9Db252ZXJ0ZWRDb25kaXRpb25zOiBhbnkgPSB7fTtcblx0XHRPYmplY3Qua2V5cyhvRmlsdGVyQ29uZGl0aW9ucykuZm9yRWFjaChmdW5jdGlvbihzS2V5OiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IGFDb252ZXJ0ZWRDb25kaXRpb25zID0gW107XG5cdFx0XHRjb25zdCBhQ29uZGl0aW9ucyA9IG9GaWx0ZXJDb25kaXRpb25zW3NLZXldO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhQ29uZGl0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZXMgPSBhQ29uZGl0aW9uc1tpXS52YWx1ZTIgPyBbYUNvbmRpdGlvbnNbaV0udmFsdWUxLCBhQ29uZGl0aW9uc1tpXS52YWx1ZTJdIDogW2FDb25kaXRpb25zW2ldLnZhbHVlMV07XG5cdFx0XHRcdGFDb252ZXJ0ZWRDb25kaXRpb25zLnB1c2goXG5cdFx0XHRcdFx0Q29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihhQ29uZGl0aW9uc1tpXS5vcGVyYXRvciwgdmFsdWVzLCBudWxsLCBudWxsLCBcIlZhbGlkYXRlZFwiIGFzIENvbmRpdGlvblZhbGlkYXRlZClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmIChhQ29udmVydGVkQ29uZGl0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0b0NvbnZlcnRlZENvbmRpdGlvbnNbc0tleV0gPSBhQ29udmVydGVkQ29uZGl0aW9ucztcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gb0NvbnZlcnRlZENvbmRpdGlvbnM7XG5cdH0sXG5cdGdldEN1c3RvbUNvbmRpdGlvbnM6IGZ1bmN0aW9uKFJhbmdlOiBhbnksIG9WYWxpZFByb3BlcnR5OiBhbnksIHNQcm9wZXJ0eU5hbWU6IGFueSkge1xuXHRcdGxldCB2YWx1ZTEsIHZhbHVlMjtcblx0XHRpZiAob1ZhbGlkUHJvcGVydHkuJFR5cGUgPT09IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIpIHtcblx0XHRcdHZhbHVlMSA9IHRoaXMuX3BhcnNlRGF0ZVRpbWUoZ2V0VHlwZUNvbXBsaWFudFZhbHVlKHRoaXMuX2Zvcm1hdERhdGVUaW1lKFJhbmdlLkxvdyksIG9WYWxpZFByb3BlcnR5LiRUeXBlKSk7XG5cdFx0XHR2YWx1ZTIgPSBSYW5nZS5IaWdoID8gdGhpcy5fcGFyc2VEYXRlVGltZShnZXRUeXBlQ29tcGxpYW50VmFsdWUodGhpcy5fZm9ybWF0RGF0ZVRpbWUoUmFuZ2UuSGlnaCksIG9WYWxpZFByb3BlcnR5LiRUeXBlKSkgOiBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWx1ZTEgPSBSYW5nZS5Mb3c7XG5cdFx0XHR2YWx1ZTIgPSBSYW5nZS5IaWdoID8gUmFuZ2UuSGlnaCA6IG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRvcGVyYXRvcjogUmFuZ2UuT3B0aW9uID8gZ2V0T3BlcmF0b3IoUmFuZ2UuT3B0aW9uLiRFbnVtTWVtYmVyIHx8IFJhbmdlLk9wdGlvbikgOiBudWxsLFxuXHRcdFx0dmFsdWUxOiB2YWx1ZTEsXG5cdFx0XHR2YWx1ZTI6IHZhbHVlMixcblx0XHRcdHBhdGg6IHNQcm9wZXJ0eU5hbWVcblx0XHR9O1xuXHR9LFxuXHRfcGFyc2VEYXRlVGltZTogZnVuY3Rpb24oc1ZhbHVlOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0RGF0ZVRpbWVUeXBlSW5zdGFuY2UoKS5wYXJzZVZhbHVlKHNWYWx1ZSwgXCJzdHJpbmdcIik7XG5cdH0sXG5cdF9mb3JtYXREYXRlVGltZTogZnVuY3Rpb24oc1ZhbHVlOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0RGF0ZVRpbWVUeXBlSW5zdGFuY2UoKS5mb3JtYXRWYWx1ZShzVmFsdWUsIFwic3RyaW5nXCIpO1xuXHR9LFxuXHRfZ2V0RGF0ZVRpbWVUeXBlSW5zdGFuY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBuZXcgRGF0ZVRpbWVPZmZzZXQoeyBwYXR0ZXJuOiBcInl5eXktTU0tZGRUSEg6bW06c3NaXCIsIGNhbGVuZGFyVHlwZTogXCJHcmVnb3JpYW5cIiB9LCB7IFY0OiB0cnVlIH0pO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWaXN1YWxGaWx0ZXJVdGlscztcbiJdfQ==