@sapui5/sap.fe.core 1.97.0 → 1.100.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 (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -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 +68 -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 +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -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 +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -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 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -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/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -1,583 +1,523 @@
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
-
6
- // Provides static functions for the draft programming model
7
- sap.ui.define(
8
- [
9
- "sap/m/Dialog",
10
- "sap/m/Button",
11
- "sap/m/Text",
12
- "sap/m/MessageBox",
13
- "sap/fe/core/actions/messageHandling",
14
- "sap/fe/core/CommonUtils",
15
- "sap/base/Log"
16
- ],
17
- function(Dialog, Button, Text, MessageBox, messageHandling, CommonUtils, Log) {
18
- "use strict";
19
-
20
- /**
21
- * Interface for callbacks used in the functions
22
- *
23
- *
24
- * @author SAP SE
25
- * @since 1.54.0
26
- * @interface
27
- * @name sap.fe.core.actions.draft.ICallback
28
- * @private
29
- */
30
-
31
- /**
32
- * Callback to approve or reject the creation of a draft
33
- * @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
34
- * @function
35
- * @static
36
- * @abstract
37
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
38
- * @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
39
- *
40
- * @private
41
- */
42
-
43
- /**
44
- * Callback after a draft was successully created
45
- * @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
46
- * @function
47
- * @static
48
- * @abstract
49
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
50
- * @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
51
- * @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
52
- *
53
- * @private
54
- */
55
-
56
- /**
57
- * Callback to approve or reject overwriting an unsaved draft of another user
58
- * @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
59
- * @function
60
- * @public
61
- * @static
62
- * @abstract
63
- *
64
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
65
- * @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
66
- *
67
- * @ui5-restricted
68
- */
69
-
70
- /* Constants for draft operations */
71
- var draftOperations = {
72
- EDIT: "EditAction",
73
- ACTIVATION: "ActivationAction",
74
- DISCARD: "DiscardAction",
75
- PREPARE: "PreparationAction"
76
- };
77
-
78
- /**
79
- * Determines action name for a draft operation.
80
- *
81
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
82
- * @param {string} sOperation The operation name
83
- * @returns {string} The name of the draft operation
84
- */
85
- function getActionName(oContext, sOperation) {
86
- var oModel = oContext.getModel(),
87
- oMetaModel = oModel.getMetaModel(),
88
- sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
89
-
90
- return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
91
- }
92
-
93
- /**
94
- * Creates an operation context binding for the given context and operation.
95
- *
96
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
97
- * @param {string} sOperation The operation (action or function import)
98
- * @param oOptions Options to create the operation context
99
- * @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
100
- */
101
- function createOperation(oContext, sOperation, oOptions) {
102
- var sOperationName = getActionName(oContext, sOperation);
103
-
104
- return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
105
- }
106
-
107
- /**
108
- * Check if optional draft prepare action exists.
109
- *
110
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
111
- * @returns {boolean} True if a a prepare action exists
112
- */
113
- function hasPrepareAction(oContext) {
114
- return !!getActionName(oContext, draftOperations.PREPARE);
115
- }
116
-
117
- /**
118
- * Creates a new draft from an active document.
119
- *
120
- * @function
121
- * @param {sap.ui.model.odata.v4.Context} oContext context for which the action should be performed
122
- * @param {boolean} bPreserveChanges
123
- * <ul>
124
- * <li>true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend</li>
125
- * <li>false - existing changes from another user that are not locked are overwritten</li>
126
- * </ul>
127
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
128
- * @private
129
- * @ui5-restricted
130
- */
131
-
132
- function executeDraftEditAction(oContext, bPreserveChanges) {
133
- if (oContext.getProperty("IsActiveEntity")) {
134
- var oOptions = { $$inheritExpandSelect: true };
135
- var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
136
- oOperation.setParameter("PreserveChanges", bPreserveChanges);
137
- var oEditPromise = oOperation.execute("direct").then(function(oDraftDocumentContext) {
138
- return oDraftDocumentContext;
139
- });
140
- oOperation.getModel().submitBatch("direct");
141
- return oEditPromise;
142
- } else {
143
- throw new Error("The edit action cannot be executed on a draft document");
144
- }
145
- }
146
-
147
- /**
148
- * Activates a draft document. The draft will replace the sibling entity and will be deleted by the backend.
149
- *
150
- * @function
151
- * @param {sap.ui.model.odata.v4.Context} oContext context for which the action should be performed
152
- * @param {object} oAppComponent The AppComponent
153
- * @param {string} [sGroupId] the optional batch group where we want to execute the operation in
154
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
155
- * @private
156
- * @ui5-restricted
157
- */
158
-
159
- function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
160
- var bHasPrepareAction = hasPrepareAction(oContext);
161
-
162
- // According to the draft spec if the service contains a prepare action and we trigger both prepare and
163
- // activate in one $batch the activate action is called with iF-Match=*
164
- var bIgnoreEtag = bHasPrepareAction;
165
-
166
- if (!oContext.getProperty("IsActiveEntity")) {
167
- var oOperation = createOperation(oContext, draftOperations.ACTIVATION, { $$inheritExpandSelect: true });
168
- return oOperation
169
- .execute(sGroupId, bIgnoreEtag)
170
- .then(function(oActiveDocumentContext) {
171
- return oActiveDocumentContext;
172
- })
173
- .catch(
174
- //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
175
- function() {
176
- if (bHasPrepareAction) {
177
- var sActionName = getActionName(oContext, draftOperations.PREPARE),
178
- oSideEffectsService = oAppComponent.getSideEffectsService(),
179
- oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
180
- aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
181
- if (aTargetPaths && aTargetPaths.length > 0) {
182
- oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function(oError) {
183
- Log.error("Error while requesting side effects", oError);
184
- });
185
- } else {
186
- requestMessages(oContext, oSideEffectsService).catch(function(oError) {
187
- Log.error("Error while requesting messages", oError);
188
- });
189
- }
190
- }
191
- return Promise.reject();
192
- }
193
- );
194
- } else {
195
- throw new Error("The activation action cannot be executed on an active document");
196
- }
197
- }
198
-
199
- /**
200
- * Execute a preparation action.
201
- *
202
- * @function
203
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
204
- * @param {object} oAppComponent The AppComponent
205
- * @param {object} mParameters The parameters
206
- * @param {boolean} [mParameters.groupId] The optional batch group where we want to execute the operation in
207
- * @param {boolean} [mParameters.bPrepareForEdit] Shall the messages be requested if supported by service
208
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
209
- * @private
210
- * @ui5-restricted
211
- */
212
- function executeDraftPreparationAction(oContext, oAppComponent, mParameters) {
213
- var mParams = mParameters || {};
214
- if (!oContext.getProperty("IsActiveEntity")) {
215
- var oOperation = createOperation(oContext, draftOperations.PREPARE);
216
-
217
- // TODO: side effects qualifier shall be even deprecated to be checked
218
- oOperation.setParameter("SideEffectsQualifier", "");
219
-
220
- var sGroupId = mParams.groupId || oOperation.getGroupId();
221
- var oPreparationPromise = oOperation
222
- .execute(sGroupId)
223
- .then(function() {
224
- if (mParams.bPrepareForEdit) {
225
- // if PREPARE action is triggered after Edit then either the sideEffects (if annotated against PREPARE) are executed or the messages are requested as fallback if no sideEffects:
226
- var sActionName = getActionName(oContext, draftOperations.PREPARE),
227
- oSideEffectsService = oAppComponent.getSideEffectsService(),
228
- oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
229
- aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
230
- if (aTargetPaths && aTargetPaths.length > 0) {
231
- oSideEffectsService.requestSideEffects(aTargetPaths, oContext, sGroupId).catch(function(oError) {
232
- Log.error("Error while requesting side effects", oError);
233
- });
234
- } else {
235
- requestMessages(oContext, oSideEffectsService);
236
- }
237
- }
238
- return oOperation;
239
- })
240
- .catch(function(oError) {
241
- Log.error("Error while executing the operation", oError);
242
- });
243
-
244
- return oPreparationPromise;
245
- } else {
246
- throw new Error("The preparation action cannot be executed on an active document");
247
- }
248
- }
249
-
250
- /**
251
- * Determines the message path for a context.
252
- *
253
- * @function
254
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
255
- * @returns {string} Message path, empty if not annotated
256
- * @private
257
- * @ui5-restricted
258
- */
259
- function getMessagesPath(oContext) {
260
- var oModel = oContext.getModel(),
261
- oMetaModel = oModel.getMetaModel(),
262
- sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
263
- return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
264
- }
265
-
266
- /**
267
- * Requests the messages if annotated for a given context.
268
- *
269
- * @function
270
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
271
- * @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
272
- * @returns {Promise} Promise which is resolved once messages were requested
273
- * @private
274
- * @ui5-restricted
275
- */
276
- function requestMessages(oContext, oSideEffectsService) {
277
- var sMessagesPath = getMessagesPath(oContext);
278
- if (sMessagesPath) {
279
- return oSideEffectsService.requestSideEffects([{ $PropertyPath: sMessagesPath }], oContext);
280
- }
281
- }
282
-
283
- /**
284
- * Executes discard of a draft function using HTTP Post.
285
- *
286
- * @function
287
- * @param {sap.ui.model.odata.v4.Context} oContext context for which the action should be performed
288
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
289
- * @private
290
- * @ui5-restricted
291
- */
292
-
293
- function executeDraftDiscardAction(oContext) {
294
- if (!oContext.getProperty("IsActiveEntity")) {
295
- var oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
296
- var oDiscardPromise = oDiscardOperation.execute("direct");
297
- oContext.getModel().submitBatch("direct");
298
- return oDiscardPromise;
299
- } else {
300
- throw new Error("The discard action cannot be executed on an active document");
301
- }
302
- }
303
-
304
- /**
305
- * Creates a draft document from an existing document.
306
- *
307
- * The function supports several hooks as there is a certain coreography defined.
308
- *
309
- * @function
310
- * @name sap.fe.core.actions.draft#createDraftFromActiveDocument
311
- * @memberof sap.fe.core.actions.draft
312
- * @static
313
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
314
- * @param {object} oAppComponent The AppComponent
315
- * @param {object} mParameters The parameters
316
- * @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
317
- * @param {boolean} [mParameters.bPrepareOnEdit] Also call prepare when calling draft creation
318
- * @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
319
- * @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
320
- * @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
321
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
322
- * @private
323
- * @ui5-restricted
324
- */
325
- function createDraftFromActiveDocument(oContext, oAppComponent, mParameters) {
326
- var mParam = mParameters || {},
327
- localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
328
- bRunPreserveChangesFlow =
329
- typeof mParam.bPreserveChanges === "undefined" ||
330
- (typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges); //default true
331
-
332
- /**
333
- * Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
334
- *
335
- * @param {*} bOverwrite Overwrite the change or not
336
- * @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
337
- */
338
- function overwriteOnDemand(bOverwrite) {
339
- if (bOverwrite) {
340
- //Overwrite existing changes
341
- var oModel = oContext.getModel(),
342
- oResourceBundle,
343
- draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
344
- return mParameters.oView
345
- .getModel("sap.fe.i18n")
346
- .getResourceBundle()
347
- .then(function(_oResourceBundle) {
348
- oResourceBundle = _oResourceBundle;
349
- return draftDataContext.requestObject();
350
- })
351
- .then(function(draftAdminData) {
352
- if (draftAdminData) {
353
- // remove all unbound transition messages as we show a special dialog
354
- messageHandling.removeUnboundTransitionMessages();
355
- var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
356
- var sEntitySet = mParameters.oView.getViewData().entitySet;
357
- if (sInfo) {
358
- var sLockedByUserMsg = CommonUtils.getTranslatedText(
359
- "C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER",
360
- oResourceBundle,
361
- sInfo,
362
- sEntitySet
363
- );
364
- MessageBox.error(sLockedByUserMsg);
365
- throw new Error(sLockedByUserMsg);
366
- } else {
367
- sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
368
- var sUnsavedChangesMsg = CommonUtils.getTranslatedText(
369
- "C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES",
370
- oResourceBundle,
371
- sInfo,
372
- sEntitySet
373
- );
374
- return showMessageBox(sUnsavedChangesMsg).then(function() {
375
- return executeDraftEditAction(oContext, false);
376
- });
377
- }
378
- }
379
- });
380
- }
381
- return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
382
- }
383
-
384
- function showMessageBox(sUnsavedChangesMsg) {
385
- return new Promise(function(resolve, reject) {
386
- var oDialog = new Dialog({
387
- title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
388
- state: "Warning",
389
- content: new Text({
390
- text: sUnsavedChangesMsg
391
- }),
392
- beginButton: new Button({
393
- text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
394
- type: "Emphasized",
395
- press: function() {
396
- oDialog.close();
397
- resolve(true);
398
- }
399
- }),
400
- endButton: new Button({
401
- text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
402
- press: function() {
403
- oDialog.close();
404
- reject("Draft creation aborted for document: " + oContext.getPath());
405
- }
406
- }),
407
- afterClose: function() {
408
- oDialog.destroy();
409
- }
410
- });
411
- oDialog.addStyleClass("sapUiContentPadding");
412
- oDialog.open();
413
- });
414
- }
415
-
416
- if (!oContext) {
417
- return Promise.reject(new Error("Binding context to active document is required"));
418
- }
419
-
420
- return Promise.resolve(
421
- mParam.fnBeforeCreateDraftFromActiveDocument
422
- ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow)
423
- : true
424
- )
425
- .then(function(bExecute) {
426
- if (!bExecute) {
427
- throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
428
- }
429
- return executeDraftEditAction(oContext, bRunPreserveChangesFlow).catch(function(oResponse) {
430
- //Only call back if error 409
431
- if (bRunPreserveChangesFlow && oResponse.status === 409) {
432
- return Promise.resolve(
433
- mParam.fnWhenDecisionToOverwriteDocumentIsRequired
434
- ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired()
435
- : true
436
- ).then(overwriteOnDemand);
437
- } else {
438
- throw new Error(oResponse);
439
- }
440
- });
441
- })
442
- .then(function(oDraftContext) {
443
- return Promise.resolve(
444
- mParam.fnAfterCreateDraftFromActiveDocument
445
- ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext)
446
- : oDraftContext
447
- );
448
- })
449
- .then(function(oDraftContext) {
450
- if (mParam.bPrepareOnEdit && hasPrepareAction(oDraftContext)) {
451
- return executeDraftPreparationAction(oDraftContext, oAppComponent, { bPrepareForEdit: true }).then(function() {
452
- return oDraftContext;
453
- });
454
- }
455
- return oDraftContext;
456
- })
457
- .catch(function(exc) {
458
- return Promise.reject(exc);
459
- });
460
- }
461
-
462
- /**
463
- * Creates an active document from a draft document.
464
- *
465
- * The function supports several hooks as there is a certain choreography defined.
466
- *
467
- * @function
468
- * @name sap.fe.core.actions.draft#activateDocument
469
- * @memberof sap.fe.core.actions.draft
470
- * @static
471
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
472
- * @param {object} oAppComponent The AppComponent
473
- * @param {object} mParameters The parameters
474
- * @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
475
- * @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
476
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
477
- * @private
478
- * @ui5-restricted
479
- */
480
- function activateDocument(oContext, oAppComponent, mParameters) {
481
- var mParam = mParameters || {};
482
-
483
- if (!oContext) {
484
- return Promise.reject(new Error("Binding context to draft document is required"));
485
- }
486
- return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true)
487
- .then(function(bExecute) {
488
- if (!bExecute) {
489
- return Promise.reject(
490
- new Error("Activation of the document was aborted by extension for document: " + oContext.getPath())
491
- );
492
- }
493
-
494
- if (!hasPrepareAction(oContext)) {
495
- return executeDraftActivationAction(oContext, oAppComponent);
496
- }
497
-
498
- /* activation requires preparation */
499
- var sBatchGroup = "draft";
500
- // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
501
- var oPreparePromise = executeDraftPreparationAction(oContext, oAppComponent, {
502
- groupId: sBatchGroup,
503
- bPrepareForEdit: false
504
- });
505
- oContext.getModel().submitBatch(sBatchGroup);
506
-
507
- var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
508
-
509
- return Promise.all([oPreparePromise, oActivatePromise])
510
- .then(function(values) {
511
- return values[1];
512
- })
513
- .catch(function(exc) {
514
- return Promise.reject(exc);
515
- });
516
- })
517
- .then(function(oActiveDocumentContext) {
518
- return Promise.resolve(
519
- mParam.fnAfterActivateDocument
520
- ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext)
521
- : oActiveDocumentContext
522
- );
523
- })
524
- .catch(function(exc) {
525
- return Promise.reject(exc);
526
- });
527
- }
528
-
529
- /**
530
- * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
531
- * and Active Instance uses DELETE always.
532
- *
533
- * @function
534
- * @name sap.fe.core.actions.draft#deleteDraft
535
- * @memberof sap.fe.core.actions.draft
536
- * @static
537
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
538
- * @private
539
- * @returns {Promise}
540
- * @ui5-restricted
541
- */
542
- function deleteDraft(oContext) {
543
- var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
544
- bIsActiveEntity = oContext.getObject().IsActiveEntity;
545
-
546
- if (bIsActiveEntity || (!bIsActiveEntity && !sDiscardAction)) {
547
- //Use Delete in case of active entity and no discard action available for draft
548
- if (oContext.hasPendingChanges()) {
549
- oContext
550
- .getBinding()
551
- .resetChanges()
552
- .then(function() {
553
- return oContext.delete();
554
- })
555
- .catch(function(error) {
556
- return Promise.reject(error);
557
- });
558
- } else {
559
- return oContext.delete();
560
- }
561
- } else {
562
- //Use Discard Post Action if it is a draft entity and discard action exists
563
- return executeDraftDiscardAction(oContext);
564
- }
565
- }
566
- /**
567
- * Static functions for the draft programming model
568
- *
569
- * @namespace
570
- * @alias sap.fe.core.actions.draft
571
- * @private
572
- * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
573
- * @since 1.54.0
574
- */
575
- var draft = {
576
- createDraftFromActiveDocument: createDraftFromActiveDocument,
577
- activateDocument: activateDocument,
578
- deleteDraft: deleteDraft
579
- };
580
-
581
- return draft;
582
- }
583
- );
5
+ sap.ui.define(["sap/m/Dialog", "sap/m/Button", "sap/m/Text", "sap/m/MessageBox", "sap/fe/core/actions/messageHandling", "sap/fe/core/CommonUtils", "sap/base/Log"], function (Dialog, Button, Text, MessageBox, messageHandling, CommonUtils, Log) {
6
+ "use strict";
7
+
8
+ /**
9
+ * Interface for callbacks used in the functions
10
+ *
11
+ *
12
+ * @author SAP SE
13
+ * @since 1.54.0
14
+ * @interface
15
+ * @name sap.fe.core.actions.draft.ICallback
16
+ * @private
17
+ */
18
+
19
+ /**
20
+ * Callback to approve or reject the creation of a draft
21
+ * @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
22
+ * @function
23
+ * @static
24
+ * @abstract
25
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
26
+ * @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
27
+ *
28
+ * @private
29
+ */
30
+
31
+ /**
32
+ * Callback after a draft was successully created
33
+ * @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
34
+ * @function
35
+ * @static
36
+ * @abstract
37
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
38
+ * @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
39
+ * @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
40
+ *
41
+ * @private
42
+ */
43
+
44
+ /**
45
+ * Callback to approve or reject overwriting an unsaved draft of another user
46
+ * @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
47
+ * @function
48
+ * @public
49
+ * @static
50
+ * @abstract
51
+ *
52
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
53
+ * @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
54
+ *
55
+ * @ui5-restricted
56
+ */
57
+
58
+ /* Constants for draft operations */
59
+ var draftOperations = {
60
+ EDIT: "EditAction",
61
+ ACTIVATION: "ActivationAction",
62
+ DISCARD: "DiscardAction",
63
+ PREPARE: "PreparationAction"
64
+ };
65
+ /**
66
+ * Static functions for the draft programming model
67
+ *
68
+ * @namespace
69
+ * @alias sap.fe.core.actions.draft
70
+ * @private
71
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
72
+ * @since 1.54.0
73
+ */
74
+
75
+ var draft = {
76
+ createDraftFromActiveDocument: createDraftFromActiveDocument,
77
+ activateDocument: activateDocument,
78
+ deleteDraft: deleteDraft
79
+ };
80
+ /**
81
+ * Determines action name for a draft operation.
82
+ *
83
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
84
+ * @param {string} sOperation The operation name
85
+ * @returns {string} The name of the draft operation
86
+ */
87
+
88
+ function getActionName(oContext, sOperation) {
89
+ var oModel = oContext.getModel(),
90
+ oMetaModel = oModel.getMetaModel(),
91
+ sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
92
+ return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
93
+ }
94
+ /**
95
+ * Creates an operation context binding for the given context and operation.
96
+ *
97
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
98
+ * @param {string} sOperation The operation (action or function import)
99
+ * @param oOptions Options to create the operation context
100
+ * @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
101
+ */
102
+
103
+
104
+ function createOperation(oContext, sOperation, oOptions) {
105
+ var sOperationName = getActionName(oContext, sOperation);
106
+ return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
107
+ }
108
+ /**
109
+ * Check if optional draft prepare action exists.
110
+ *
111
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
112
+ * @returns {boolean} True if a a prepare action exists
113
+ */
114
+
115
+
116
+ function hasPrepareAction(oContext) {
117
+ return !!getActionName(oContext, draftOperations.PREPARE);
118
+ }
119
+ /**
120
+ * Creates a new draft from an active document.
121
+ *
122
+ * @function
123
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
124
+ * @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
125
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
126
+ * @private
127
+ * @ui5-restricted
128
+ */
129
+
130
+
131
+ function executeDraftEditAction(oContext, bPreserveChanges) {
132
+ if (oContext.getProperty("IsActiveEntity")) {
133
+ var oOptions = {
134
+ $$inheritExpandSelect: true
135
+ };
136
+ var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
137
+ oOperation.setParameter("PreserveChanges", bPreserveChanges);
138
+ var sGroupId = "direct";
139
+ var localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
140
+ var sActionName = localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT");
141
+ var oEditPromise = oOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel())).then(function (oDraftDocumentContext) {
142
+ return oDraftDocumentContext;
143
+ });
144
+ oOperation.getModel().submitBatch(sGroupId);
145
+ return oEditPromise;
146
+ } else {
147
+ throw new Error("You cannot edit this draft document");
148
+ }
149
+ }
150
+ /**
151
+ * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
152
+ *
153
+ * @function
154
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
155
+ * @param {object} oAppComponent The AppComponent
156
+ * @param {string} [sGroupId] The optional batch group in which the operation is to be executed
157
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
158
+ * @private
159
+ * @ui5-restricted
160
+ */
161
+
162
+
163
+ function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
164
+ var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
165
+ // activate in one $batch the activate action is called with iF-Match=*
166
+
167
+ var bIgnoreEtag = bHasPrepareAction;
168
+
169
+ if (!oContext.getProperty("IsActiveEntity")) {
170
+ var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
171
+ $$inheritExpandSelect: true
172
+ });
173
+ var localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
174
+ var sActionName = localI18nRef.getText("C_OP_OBJECT_PAGE_SAVE");
175
+ return oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()) : undefined) //3rd parameter<------
176
+ .then(function (oActiveDocumentContext) {
177
+ return oActiveDocumentContext;
178
+ }).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
179
+ function () {
180
+ if (bHasPrepareAction) {
181
+ var _sActionName = getActionName(oContext, draftOperations.PREPARE),
182
+ oSideEffectsService = oAppComponent.getSideEffectsService(),
183
+ oBindingParameters = oSideEffectsService.getODataActionSideEffects(_sActionName, oContext),
184
+ aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
185
+
186
+ if (aTargetPaths && aTargetPaths.length > 0) {
187
+ oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function (oError) {
188
+ Log.error("Error while requesting side effects", oError);
189
+ });
190
+ } else {
191
+ requestMessages(oContext, oSideEffectsService).catch(function (oError) {
192
+ Log.error("Error while requesting messages", oError);
193
+ });
194
+ }
195
+ }
196
+
197
+ return Promise.reject();
198
+ });
199
+ } else {
200
+ throw new Error("The activation action cannot be executed on an active document");
201
+ }
202
+ }
203
+ /**
204
+ * Execute a preparation action.
205
+ *
206
+ * @function
207
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
208
+ * @param {string} groupId The optional batch group in which we want to execute the operation
209
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
210
+ * @private
211
+ * @ui5-restricted
212
+ */
213
+
214
+
215
+ function executeDraftPreparationAction(oContext, groupId) {
216
+ if (!oContext.getProperty("IsActiveEntity")) {
217
+ var oOperation = createOperation(oContext, draftOperations.PREPARE); // TODO: side effects qualifier shall be even deprecated to be checked
218
+
219
+ oOperation.setParameter("SideEffectsQualifier", "");
220
+ var sGroupId = groupId || oOperation.getGroupId();
221
+ return oOperation.execute(sGroupId).then(function () {
222
+ return oOperation;
223
+ }).catch(function (oError) {
224
+ Log.error("Error while executing the operation", oError);
225
+ });
226
+ } else {
227
+ throw new Error("The preparation action cannot be executed on an active document");
228
+ }
229
+ }
230
+ /**
231
+ * Determines the message path for a context.
232
+ *
233
+ * @function
234
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
235
+ * @returns {string} Message path, empty if not annotated
236
+ * @private
237
+ * @ui5-restricted
238
+ */
239
+
240
+
241
+ function getMessagesPath(oContext) {
242
+ var oModel = oContext.getModel(),
243
+ oMetaModel = oModel.getMetaModel(),
244
+ sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
245
+ return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
246
+ }
247
+ /**
248
+ * Requests the messages if annotated for a given context.
249
+ *
250
+ * @function
251
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
252
+ * @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
253
+ * @returns {Promise} Promise which is resolved once messages were requested
254
+ * @private
255
+ * @ui5-restricted
256
+ */
257
+
258
+
259
+ function requestMessages(oContext, oSideEffectsService) {
260
+ var sMessagesPath = getMessagesPath(oContext);
261
+
262
+ if (sMessagesPath) {
263
+ return oSideEffectsService.requestSideEffects([{
264
+ $PropertyPath: sMessagesPath
265
+ }], oContext);
266
+ }
267
+
268
+ return Promise.resolve();
269
+ }
270
+ /**
271
+ * Executes discard of a draft function using HTTP Post.
272
+ *
273
+ * @function
274
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
275
+ * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
276
+ * @private
277
+ * @ui5-restricted
278
+ */
279
+
280
+
281
+ function executeDraftDiscardAction(oContext) {
282
+ if (!oContext.getProperty("IsActiveEntity")) {
283
+ var oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
284
+ var localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
285
+ var sGroupId = "direct";
286
+ var sActionName = localI18nRef.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON");
287
+ var oDiscardPromise = oDiscardOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()));
288
+ oContext.getModel().submitBatch(sGroupId);
289
+ return oDiscardPromise;
290
+ } else {
291
+ throw new Error("The discard action cannot be executed on an active document");
292
+ }
293
+ }
294
+ /**
295
+ * Creates a draft document from an existing document.
296
+ *
297
+ * The function supports several hooks as there is a certain coreography defined.
298
+ *
299
+ * @function
300
+ * @name sap.fe.core.actions.draft#createDraftFromActiveDocument
301
+ * @memberof sap.fe.core.actions.draft
302
+ * @static
303
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
304
+ * @param {AppComponent} oAppComponent The AppComponent
305
+ * @param {object} mParameters The parameters
306
+ * @param {boolean} [mParameters.oView] The view
307
+ * @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
308
+ * @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
309
+ * @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
310
+ * @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
311
+ * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
312
+ * @private
313
+ * @ui5-restricted
314
+ */
315
+
316
+
317
+ function createDraftFromActiveDocument(oContext, oAppComponent, mParameters) {
318
+ var mParam = mParameters || {},
319
+ localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
320
+ bRunPreserveChangesFlow = typeof mParam.bPreserveChanges === "undefined" || typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges; //default true
321
+
322
+ /**
323
+ * Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
324
+ *
325
+ * @param {*} bOverwrite Overwrite the change or not
326
+ * @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
327
+ */
328
+
329
+ function overwriteOnDemand(bOverwrite) {
330
+ if (bOverwrite) {
331
+ //Overwrite existing changes
332
+ var oModel = oContext.getModel();
333
+ var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
334
+ var oResourceBundle;
335
+ return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
336
+ oResourceBundle = _oResourceBundle;
337
+ return draftDataContext.requestObject();
338
+ }).then(function (draftAdminData) {
339
+ if (draftAdminData) {
340
+ // remove all unbound transition messages as we show a special dialog
341
+ messageHandling.removeUnboundTransitionMessages();
342
+ var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
343
+ var sEntitySet = mParameters.oView.getViewData().entitySet;
344
+
345
+ if (sInfo) {
346
+ var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
347
+ MessageBox.error(sLockedByUserMsg);
348
+ throw new Error(sLockedByUserMsg);
349
+ } else {
350
+ sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
351
+ var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
352
+ return showMessageBox(sUnsavedChangesMsg).then(function () {
353
+ return executeDraftEditAction(oContext, false);
354
+ });
355
+ }
356
+ }
357
+ });
358
+ }
359
+
360
+ return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
361
+ }
362
+
363
+ function showMessageBox(sUnsavedChangesMsg) {
364
+ return new Promise(function (resolve, reject) {
365
+ var oDialog = new Dialog({
366
+ title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
367
+ state: "Warning",
368
+ content: new Text({
369
+ text: sUnsavedChangesMsg
370
+ }),
371
+ beginButton: new Button({
372
+ text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
373
+ type: "Emphasized",
374
+ press: function () {
375
+ oDialog.close();
376
+ resolve(true);
377
+ }
378
+ }),
379
+ endButton: new Button({
380
+ text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
381
+ press: function () {
382
+ oDialog.close();
383
+ reject("Draft creation aborted for document: " + oContext.getPath());
384
+ }
385
+ }),
386
+ afterClose: function () {
387
+ oDialog.destroy();
388
+ }
389
+ });
390
+ oDialog.addStyleClass("sapUiContentPadding");
391
+ oDialog.open();
392
+ });
393
+ }
394
+
395
+ if (!oContext) {
396
+ return Promise.reject(new Error("Binding context to active document is required"));
397
+ }
398
+
399
+ return Promise.resolve(mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true).then(function (bExecute) {
400
+ if (!bExecute) {
401
+ throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
402
+ }
403
+
404
+ return executeDraftEditAction(oContext, bRunPreserveChangesFlow).catch(function (oResponse) {
405
+ //Only call back if error 409
406
+ if (bRunPreserveChangesFlow && oResponse.status === 409) {
407
+ return Promise.resolve(mParam.fnWhenDecisionToOverwriteDocumentIsRequired ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired() : true).then(overwriteOnDemand);
408
+ } else {
409
+ throw new Error(oResponse);
410
+ }
411
+ });
412
+ }).then(function (oDraftContext) {
413
+ return Promise.resolve(mParam.fnAfterCreateDraftFromActiveDocument ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext) : oDraftContext);
414
+ }).then(function (oDraftContext) {
415
+ var _oSideEffects$trigger;
416
+
417
+ var sEditActionName = getActionName(oDraftContext, draftOperations.EDIT);
418
+ var oSideEffects = oAppComponent.getSideEffectsService().getODataActionSideEffects(sEditActionName, oDraftContext);
419
+
420
+ if (oSideEffects !== null && oSideEffects !== void 0 && (_oSideEffects$trigger = oSideEffects.triggerActions) !== null && _oSideEffects$trigger !== void 0 && _oSideEffects$trigger.length) {
421
+ return oAppComponent.getSideEffectsService().requestSideEffectsForODataAction(oSideEffects, oDraftContext).then(function () {
422
+ return oDraftContext;
423
+ });
424
+ } else {
425
+ return oDraftContext;
426
+ }
427
+ }).catch(function (exc) {
428
+ return Promise.reject(exc);
429
+ });
430
+ }
431
+ /**
432
+ * Creates an active document from a draft document.
433
+ *
434
+ * The function supports several hooks as there is a certain choreography defined.
435
+ *
436
+ * @function
437
+ * @name sap.fe.core.actions.draft#activateDocument
438
+ * @memberof sap.fe.core.actions.draft
439
+ * @static
440
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
441
+ * @param {object} oAppComponent The AppComponent
442
+ * @param {object} mParameters The parameters
443
+ * @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
444
+ * @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
445
+ * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
446
+ * @private
447
+ * @ui5-restricted
448
+ */
449
+
450
+
451
+ function activateDocument(oContext, oAppComponent, mParameters) {
452
+ var mParam = mParameters || {};
453
+
454
+ if (!oContext) {
455
+ return Promise.reject(new Error("Binding context to draft document is required"));
456
+ }
457
+
458
+ return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
459
+ if (!bExecute) {
460
+ return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
461
+ }
462
+
463
+ if (!hasPrepareAction(oContext)) {
464
+ return executeDraftActivationAction(oContext, oAppComponent);
465
+ }
466
+ /* activation requires preparation */
467
+
468
+
469
+ var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
470
+
471
+ var oPreparePromise = executeDraftPreparationAction(oContext, sBatchGroup);
472
+ oContext.getModel().submitBatch(sBatchGroup);
473
+ var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
474
+ return Promise.all([oPreparePromise, oActivatePromise]).then(function (values) {
475
+ return values[1];
476
+ }).catch(function (exc) {
477
+ return Promise.reject(exc);
478
+ });
479
+ }).then(function (oActiveDocumentContext) {
480
+ return Promise.resolve(mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext);
481
+ }).catch(function (exc) {
482
+ return Promise.reject(exc);
483
+ });
484
+ }
485
+ /**
486
+ * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
487
+ * and Active Instance uses DELETE always.
488
+ *
489
+ * @function
490
+ * @name sap.fe.core.actions.draft#deleteDraft
491
+ * @memberof sap.fe.core.actions.draft
492
+ * @static
493
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
494
+ * @private
495
+ * @returns {Promise}
496
+ * @ui5-restricted
497
+ */
498
+
499
+
500
+ function deleteDraft(oContext) {
501
+ var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
502
+ bIsActiveEntity = oContext.getObject().IsActiveEntity;
503
+
504
+ if (bIsActiveEntity || !bIsActiveEntity && !sDiscardAction) {
505
+ //Use Delete in case of active entity and no discard action available for draft
506
+ if (oContext.hasPendingChanges()) {
507
+ return oContext.getBinding().resetChanges().then(function () {
508
+ return oContext.delete();
509
+ }).catch(function (error) {
510
+ return Promise.reject(error);
511
+ });
512
+ } else {
513
+ return oContext.delete();
514
+ }
515
+ } else {
516
+ //Use Discard Post Action if it is a draft entity and discard action exists
517
+ return executeDraftDiscardAction(oContext);
518
+ }
519
+ }
520
+
521
+ return draft;
522
+ }, false);
523
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJBQ1RJVkFUSU9OIiwiRElTQ0FSRCIsIlBSRVBBUkUiLCJkcmFmdCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsImRlbGV0ZURyYWZ0IiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiaGFzUHJlcGFyZUFjdGlvbiIsImV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24iLCJiUHJlc2VydmVDaGFuZ2VzIiwiZ2V0UHJvcGVydHkiLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJvT3BlcmF0aW9uIiwic2V0UGFyYW1ldGVyIiwic0dyb3VwSWQiLCJsb2NhbEkxOG5SZWYiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJzQWN0aW9uTmFtZSIsImdldFRleHQiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwidW5kZWZpbmVkIiwiQ29tbW9uVXRpbHMiLCJmbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQiLCJiaW5kIiwidGhlbiIsIm9EcmFmdERvY3VtZW50Q29udGV4dCIsInN1Ym1pdEJhdGNoIiwiRXJyb3IiLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsImJIYXNQcmVwYXJlQWN0aW9uIiwiYklnbm9yZUV0YWciLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiY2F0Y2giLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwib0JpbmRpbmdQYXJhbWV0ZXJzIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsImFUYXJnZXRQYXRocyIsInBhdGhFeHByZXNzaW9ucyIsImxlbmd0aCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwicmVxdWVzdE1lc3NhZ2VzIiwiUHJvbWlzZSIsInJlamVjdCIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ3JvdXBJZCIsImdldEdyb3VwSWQiLCJnZXRNZXNzYWdlc1BhdGgiLCJzTWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsInJlc29sdmUiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJtUGFyYW1ldGVycyIsIm1QYXJhbSIsImJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93Iiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwiZHJhZnREYXRhQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm9SZXNvdXJjZUJ1bmRsZSIsIm9WaWV3IiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJfb1Jlc291cmNlQnVuZGxlIiwicmVxdWVzdE9iamVjdCIsImRyYWZ0QWRtaW5EYXRhIiwibWVzc2FnZUhhbmRsaW5nIiwicmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsInNJbmZvIiwiSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24iLCJJblByb2Nlc3NCeVVzZXIiLCJzRW50aXR5U2V0IiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJzTG9ja2VkQnlVc2VyTXNnIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJNZXNzYWdlQm94IiwiQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIiwiQ3JlYXRlZEJ5VXNlciIsInNVbnNhdmVkQ2hhbmdlc01zZyIsInNob3dNZXNzYWdlQm94Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJiRXhlY3V0ZSIsIm9SZXNwb25zZSIsInN0YXR1cyIsImZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImV4YyIsImZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCIsInNCYXRjaEdyb3VwIiwib1ByZXBhcmVQcm9taXNlIiwib0FjdGl2YXRlUHJvbWlzZSIsImFsbCIsInZhbHVlcyIsImZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0EsTUFBTUEsZUFBZSxHQUFHO0FB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvcmVzb3VyY2UvUmVzb3VyY2VNb2RlbFwiO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY2FsbGJhY2tzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uc1xuICpcbiAqXG4gKiBAYXV0aG9yIFNBUCBTRVxuICogQHNpbmNlIDEuNTQuMFxuICogQGludGVyZmFjZVxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayB0byBhcHByb3ZlIG9yIHJlamVjdCB0aGUgY3JlYXRpb24gb2YgYSBkcmFmdFxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgb2YgZHJhZnQgY3JlYXRpb24gW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGFmdGVyIGEgZHJhZnQgd2FzIHN1Y2Nlc3N1bGx5IGNyZWF0ZWRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3Qgb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXG4gKiBAZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCB0byBvdmVyd3JpdGUgdW5zYXZlZCBkcmFmdCBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnRcbn07XG4vKipcbiAqIERldGVybWluZXMgYWN0aW9uIG5hbWUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9cIiArIHNPcGVyYXRpb24pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiAoYWN0aW9uIG9yIGZ1bmN0aW9uIGltcG9ydClcbiAqIEBwYXJhbSBvT3B0aW9ucyBPcHRpb25zIHRvIGNyZWF0ZSB0aGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ30gVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogYW55LCBzT3BlcmF0aW9uOiBzdHJpbmcsIG9PcHRpb25zPzogYW55KSB7XG5cdGNvbnN0IHNPcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgc09wZXJhdGlvbik7XG5cblx0cmV0dXJuIG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc09wZXJhdGlvbk5hbWUgKyBcIiguLi4pXCIsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG4vKipcbiAqIENoZWNrIGlmIG9wdGlvbmFsIGRyYWZ0IHByZXBhcmUgYWN0aW9uIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlQ2hhbmdlcyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBwcmVzZXJ2ZWQgYW5kIGFuIGVycm9yIG1lc3NhZ2UgKGh0dHAgc3RhdHVzIDQwOSkgaXMgc2VuZCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQ6IGFueSwgYlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbikge1xuXHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcHRpb25zID0geyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfTtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCwgb09wdGlvbnMpO1xuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiUHJlc2VydmVDaGFuZ2VzXCIsIGJQcmVzZXJ2ZUNoYW5nZXMpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBsb2NhbEkxOG5SZWYgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpO1xuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkLCB1bmRlZmluZWQsIENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9EcmFmdERvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZCA/IENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpIDogdW5kZWZpbmVkXG5cdFx0XHQpIC8vM3JkIHBhcmFtZXRlcjwtLS0tLS1cblx0XHRcdC50aGVuKGZ1bmN0aW9uKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdC8vaWYgQUNUSVZBVEUgYWN0aW9uIGZhaWxzIHRoZW4gd2UgcmVxdWVzdCBlaXRoZXIgdGhlIHNpZGVFZmZlY3RzIGFnYWluc3QgUFJFUEFSRSBhY3Rpb24gKGlmIGFubm90YXRlZCkgb3IgdGhlIG1lc3NhZ2VzIGFzIGZhbGxiYWNrOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoYkhhc1ByZXBhcmVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpLFxuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lLCBvQ29udGV4dCksXG5cdFx0XHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0UGF0aHMsIG9Db250ZXh0KS5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKS5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpIHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IGdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIG1lc3NhZ2UgcGF0aCBmb3IgYSBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIHBhdGggc2hhbGwgYmUgZGV0ZXJtaW5lZFxuICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZSBwYXRoLCBlbXB0eSBpZiBub3QgYW5ub3RhdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcbn1cbi8qKlxuICogUmVxdWVzdHMgdGhlIG1lc3NhZ2VzIGlmIGFubm90YXRlZCBmb3IgYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSBtZXNzYWdlcyB3ZXJlIHJlcXVlc3RlZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQ6IGFueSwgb1NpZGVFZmZlY3RzU2VydmljZTogU2lkZUVmZmVjdHNTZXJ2aWNlKSB7XG5cdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlc1BhdGgob0NvbnRleHQpO1xuXHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdHJldHVybiBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkUHJvcGVydHlQYXRoOiBzTWVzc2FnZXNQYXRoIH1dIGFzIGFueSwgb0NvbnRleHQpO1xuXHR9XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUG9zdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9EaXNjYXJkT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpO1xuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9IG9EaXNjYXJkT3BlcmF0aW9uLmV4ZWN1dGUoXG5cdFx0XHRzR3JvdXBJZCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpXG5cdFx0KTtcblx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtBcHBDb21wb25lbnR9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkcmFmdCBkb2N1bWVudCB3YXMgY3JlYXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay53aGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZH0gW21QYXJhbWV0ZXJzLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRdIENhbGxiYWNrIGZvciBkZWNpZGluZyBvbiBvdmVyd3JpdGluZyBhbiB1bnNhdmVkIGNoYW5nZSBieSBhbm90aGVyIHVzZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IFZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0Zm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZD86IGFueTtcblx0fVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGxvY2FsSTE4blJlZiA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGUsXG5cdFx0YlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgPVxuXHRcdFx0dHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcInVuZGVmaW5lZFwiIHx8ICh0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwiYm9vbGVhblwiICYmIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzKTsgLy9kZWZhdWx0IHRydWVcblxuXHQvKipcblx0ICogT3ZlcndyaXRlIG9yIHJlamVjdCBiYXNlZCBvbiBmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGJPdmVyd3JpdGUgT3ZlcndyaXRlIHRoZSBjaGFuZ2Ugb3Igbm90XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB7QGxpbmsgc2FwLmZlLmNvcmUuYWN0aW9ucyNleGVjdXRlRHJhZnRFZGl0QWN0aW9ufVxuXHQgKi9cblx0ZnVuY3Rpb24gb3ZlcndyaXRlT25EZW1hbmQoYk92ZXJ3cml0ZTogYW55KSB7XG5cdFx0aWYgKGJPdmVyd3JpdGUpIHtcblx0XHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0bGV0IG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRcdHJldHVybiAoKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oX29SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gX29SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRyZXR1cm4gZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKGRyYWZ0QWRtaW5EYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRcdC8vIHJlbW92ZSBhbGwgdW5ib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFzIHdlIHNob3cgYSBzcGVjaWFsIGRpYWxvZ1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdGxldCBzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSAobVBhcmFtZXRlcnMub1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVudGl0eVNldDtcblx0XHRcdFx0XHRcdGlmIChzSW5mbykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzTG9ja2VkQnlVc2VyTXNnID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX0xPQ0tFRF9CWV9VU0VSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0XHRcdHNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c0luZm8gPSBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlcjtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc1Vuc2F2ZWRDaGFuZ2VzTXNnID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX1VOU0FWRURfQ0hBTkdFU1wiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRzSW5mbyxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBzaG93TWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2cpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBhbnkpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHR0aXRsZTogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHR9XG5cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdFx0PyBtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cpXG5cdFx0XHQ6IHRydWVcblx0KVxuXHRcdC50aGVuKGZ1bmN0aW9uKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KS5jYXRjaChmdW5jdGlvbihvUmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHQvL09ubHkgY2FsbCBiYWNrIGlmIGVycm9yIDQwOVxuXHRcdFx0XHRpZiAoYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgJiYgb1Jlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpLnRoZW4ob3ZlcndyaXRlT25EZW1hbmQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KVxuXHRcdC50aGVuKGZ1bmN0aW9uKG9EcmFmdENvbnRleHQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0bVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0XHQ6IG9EcmFmdENvbnRleHRcblx0XHRcdCk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbihvRHJhZnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKG9TaWRlRWZmZWN0cywgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uKGV4YzogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHR9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjYWN0aXZhdGVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5BZnRlckFjdGl2YXRlRG9jdW1lbnR9IFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IGFueSxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogeyBmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQ/OiBhbnk7IGZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50PzogYW55IH1cbikge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBkcmFmdCBkb2N1bWVudCBpcyByZXF1aXJlZFwiKSk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCkgOiB0cnVlKVxuXHRcdC50aGVuKGZ1bmN0aW9uKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiZHJhZnRcIjtcblx0XHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXApO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24odmFsdWVzOiBbYW55LCBhbnldKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlc1sxXTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGV4YzogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGV4Yyk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pXG5cdFx0LnRoZW4oZnVuY3Rpb24ob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbihleGM6IGFueSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGV4Yyk7XG5cdFx0fSk7XG59XG4vKipcbiAqIEhUVFAgUE9TVCBjYWxsIHdoZW4gRHJhZnRBY3Rpb24gaXMgcHJlc2VudCBmb3IgRHJhZnQgRGVsZXRlOyBIVFRQIERFTEVURSBmb3IgRHJhZnQod2hlbiBubyBEcmFmdEFjdGlvbilcbiAqIGFuZCBBY3RpdmUgSW5zdGFuY2UgdXNlcyBERUxFVEUgYWx3YXlzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNkZWxldGVEcmFmdFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZURyYWZ0KG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0Y29uc3Qgc0Rpc2NhcmRBY3Rpb24gPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCksXG5cdFx0YklzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cblx0aWYgKGJJc0FjdGl2ZUVudGl0eSB8fCAoIWJJc0FjdGl2ZUVudGl0eSAmJiAhc0Rpc2NhcmRBY3Rpb24pKSB7XG5cdFx0Ly9Vc2UgRGVsZXRlIGluIGNhc2Ugb2YgYWN0aXZlIGVudGl0eSBhbmQgbm8gZGlzY2FyZCBhY3Rpb24gYXZhaWxhYmxlIGZvciBkcmFmdFxuXHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHRcblx0XHRcdFx0LmdldEJpbmRpbmcoKVxuXHRcdFx0XHQucmVzZXRDaGFuZ2VzKClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdHJldHVybiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdfQ==