@sapui5/sap.fe.core 1.103.0 → 1.106.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 (303) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +121 -0
  4. package/src/sap/fe/core/ActionRuntime.ts +122 -0
  5. package/src/sap/fe/core/AppComponent.js +24 -11
  6. package/src/sap/fe/core/AppComponent.ts +17 -5
  7. package/src/sap/fe/core/AppStateHandler.js +74 -62
  8. package/src/sap/fe/core/AppStateHandler.ts +24 -29
  9. package/src/sap/fe/core/BaseController.js +2 -2
  10. package/src/sap/fe/core/CommonUtils.js +147 -180
  11. package/src/sap/fe/core/CommonUtils.ts +166 -193
  12. package/src/sap/fe/core/ExtensionAPI.js +2 -2
  13. package/src/sap/fe/core/PageController.js +2 -2
  14. package/src/sap/fe/core/TemplateComponent.js +21 -10
  15. package/src/sap/fe/core/TemplateComponent.ts +3 -0
  16. package/src/sap/fe/core/TemplateModel.js +2 -2
  17. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
  18. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +7 -1
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +194 -43
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +162 -24
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -227
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +268 -119
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +111 -76
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +96 -76
  27. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  28. package/src/sap/fe/core/controllerextensions/EditFlow.js +723 -637
  29. package/src/sap/fe/core/controllerextensions/EditFlow.ts +361 -398
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +83 -55
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +42 -44
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +29 -27
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +35 -30
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +171 -74
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +167 -76
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +5 -21
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -17
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -3
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  43. package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -1
  44. package/src/sap/fe/core/controllerextensions/Paginator.js +13 -13
  45. package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -11
  46. package/src/sap/fe/core/controllerextensions/Placeholder.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +2 -2
  48. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  49. package/src/sap/fe/core/controllerextensions/Share.js +154 -123
  50. package/src/sap/fe/core/controllerextensions/Share.ts +93 -95
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +157 -97
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +151 -95
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +151 -80
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +95 -93
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +9 -9
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +6 -7
  58. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +26 -11
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +30 -11
  60. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -40
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +55 -47
  62. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +31 -32
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1376 -914
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +654 -714
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +372 -326
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +210 -276
  67. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
  68. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +670 -521
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +537 -535
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +85 -65
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +16 -21
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +25 -13
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +53 -43
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +18 -27
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +9 -15
  77. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +19 -3
  78. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
  79. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +26 -16
  80. package/src/sap/fe/core/controls/Any.js +1 -1
  81. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +5 -5
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -3
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FileWrapper.js +8 -3
  89. package/src/sap/fe/core/controls/FileWrapper.ts +5 -1
  90. package/src/sap/fe/core/controls/FilterBar.js +2 -2
  91. package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
  92. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  93. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  94. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +48 -17
  95. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +2 -2
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +2 -2
  98. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -3
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +2 -2
  100. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +2 -2
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +1 -1
  103. package/src/sap/fe/core/converters/ConverterContext.js +23 -2
  104. package/src/sap/fe/core/converters/ConverterContext.ts +34 -9
  105. package/src/sap/fe/core/converters/ManifestSettings.js +19 -18
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +53 -47
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  108. package/src/sap/fe/core/converters/MetaModelConverter.js +32 -10
  109. package/src/sap/fe/core/converters/MetaModelConverter.ts +42 -19
  110. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  111. package/src/sap/fe/core/converters/annotations/DataField.js +5 -2
  112. package/src/sap/fe/core/converters/annotations/DataField.ts +5 -1
  113. package/src/sap/fe/core/converters/common/AnnotationConverter.js +69 -23
  114. package/src/sap/fe/core/converters/controls/Common/Action.js +98 -51
  115. package/src/sap/fe/core/converters/controls/Common/Action.ts +121 -44
  116. package/src/sap/fe/core/converters/controls/Common/Chart.js +31 -34
  117. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -34
  118. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  119. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +43 -7
  120. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -33
  121. package/src/sap/fe/core/converters/controls/Common/Form.js +8 -6
  122. package/src/sap/fe/core/converters/controls/Common/Form.ts +11 -14
  123. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  124. package/src/sap/fe/core/converters/controls/Common/KPI.ts +16 -15
  125. package/src/sap/fe/core/converters/controls/Common/Table.js +188 -157
  126. package/src/sap/fe/core/converters/controls/Common/Table.ts +279 -230
  127. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  128. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +57 -21
  130. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +71 -18
  131. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +30 -8
  132. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +24 -7
  133. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  134. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +43 -34
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +37 -25
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +85 -49
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +74 -50
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +54 -4
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +56 -8
  140. package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
  141. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +6 -4
  142. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +10 -2
  143. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +182 -0
  144. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +167 -0
  145. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  146. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  147. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  148. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  149. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  150. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -3
  151. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  152. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +8 -14
  153. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +6 -9
  154. package/src/sap/fe/core/converters/templates/ListReportConverter.js +31 -31
  155. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +54 -47
  156. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +44 -15
  157. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +64 -30
  158. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  159. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  160. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  161. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  162. package/src/sap/fe/core/formatters/StandardFormatter.js +13 -6
  163. package/src/sap/fe/core/formatters/StandardFormatter.ts +20 -14
  164. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  166. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  167. package/src/sap/fe/core/fpm/Component.js +33 -7
  168. package/src/sap/fe/core/fpm/Component.ts +14 -0
  169. package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
  170. package/src/sap/fe/core/helpers/AppStartupHelper.js +5 -4
  171. package/src/sap/fe/core/helpers/AppStartupHelper.ts +4 -3
  172. package/src/sap/fe/core/helpers/BindingToolkit.js +56 -24
  173. package/src/sap/fe/core/helpers/BindingToolkit.ts +67 -21
  174. package/src/sap/fe/core/helpers/ClassSupport.js +31 -3
  175. package/src/sap/fe/core/helpers/ClassSupport.ts +24 -1
  176. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  177. package/src/sap/fe/core/helpers/EditState.js +1 -1
  178. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  179. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  181. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  182. package/src/sap/fe/core/helpers/LoaderUtils.js +39 -0
  183. package/src/sap/fe/core/helpers/LoaderUtils.ts +14 -0
  184. package/src/sap/fe/core/helpers/MassEditHelper.js +475 -99
  185. package/src/sap/fe/core/helpers/MassEditHelper.ts +468 -155
  186. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  187. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  188. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  189. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  190. package/src/sap/fe/core/helpers/SemanticDateOperators.js +82 -36
  191. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +52 -36
  192. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/SideEffectsHelper.js +146 -0
  194. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +128 -0
  195. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  197. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  198. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  199. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  200. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  201. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
  202. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
  203. package/src/sap/fe/core/jsx-runtime/jsx-control.js +119 -0
  204. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +98 -0
  205. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  206. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  207. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  208. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  209. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  210. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
  211. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
  212. package/src/sap/fe/core/library.js +2 -2
  213. package/src/sap/fe/core/library.support.js +1 -1
  214. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  215. package/src/sap/fe/core/messagebundle.properties +4 -41
  216. package/src/sap/fe/core/messagebundle_ar.properties +22 -45
  217. package/src/sap/fe/core/messagebundle_bg.properties +22 -45
  218. package/src/sap/fe/core/messagebundle_ca.properties +22 -45
  219. package/src/sap/fe/core/messagebundle_cs.properties +22 -45
  220. package/src/sap/fe/core/messagebundle_cy.properties +21 -44
  221. package/src/sap/fe/core/messagebundle_da.properties +22 -45
  222. package/src/sap/fe/core/messagebundle_de.properties +22 -45
  223. package/src/sap/fe/core/messagebundle_el.properties +22 -45
  224. package/src/sap/fe/core/messagebundle_en.properties +21 -44
  225. package/src/sap/fe/core/messagebundle_en_GB.properties +21 -44
  226. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +21 -42
  227. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -40
  228. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -42
  229. package/src/sap/fe/core/messagebundle_es.properties +22 -45
  230. package/src/sap/fe/core/messagebundle_es_MX.properties +22 -45
  231. package/src/sap/fe/core/messagebundle_et.properties +22 -45
  232. package/src/sap/fe/core/messagebundle_fi.properties +22 -45
  233. package/src/sap/fe/core/messagebundle_fr.properties +21 -44
  234. package/src/sap/fe/core/messagebundle_fr_CA.properties +20 -43
  235. package/src/sap/fe/core/messagebundle_hi.properties +22 -45
  236. package/src/sap/fe/core/messagebundle_hr.properties +22 -45
  237. package/src/sap/fe/core/messagebundle_hu.properties +22 -45
  238. package/src/sap/fe/core/messagebundle_id.properties +22 -45
  239. package/src/sap/fe/core/messagebundle_it.properties +22 -45
  240. package/src/sap/fe/core/messagebundle_iw.properties +22 -45
  241. package/src/sap/fe/core/messagebundle_ja.properties +22 -45
  242. package/src/sap/fe/core/messagebundle_kk.properties +22 -45
  243. package/src/sap/fe/core/messagebundle_ko.properties +27 -50
  244. package/src/sap/fe/core/messagebundle_lt.properties +22 -45
  245. package/src/sap/fe/core/messagebundle_lv.properties +22 -45
  246. package/src/sap/fe/core/messagebundle_ms.properties +22 -45
  247. package/src/sap/fe/core/messagebundle_nl.properties +24 -47
  248. package/src/sap/fe/core/messagebundle_no.properties +22 -45
  249. package/src/sap/fe/core/messagebundle_pl.properties +23 -46
  250. package/src/sap/fe/core/messagebundle_pt.properties +23 -46
  251. package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -45
  252. package/src/sap/fe/core/messagebundle_ro.properties +22 -45
  253. package/src/sap/fe/core/messagebundle_ru.properties +22 -45
  254. package/src/sap/fe/core/messagebundle_sh.properties +22 -45
  255. package/src/sap/fe/core/messagebundle_sk.properties +22 -45
  256. package/src/sap/fe/core/messagebundle_sl.properties +22 -45
  257. package/src/sap/fe/core/messagebundle_sv.properties +22 -45
  258. package/src/sap/fe/core/messagebundle_th.properties +20 -43
  259. package/src/sap/fe/core/messagebundle_tr.properties +22 -45
  260. package/src/sap/fe/core/messagebundle_uk.properties +22 -45
  261. package/src/sap/fe/core/messagebundle_vi.properties +22 -45
  262. package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -45
  263. package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -45
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +102 -74
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +62 -63
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
  268. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -8
  269. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -7
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ShellServicesFactory.js +22 -2
  273. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -0
  274. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +2 -2
  276. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +251 -200
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +160 -144
  278. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  279. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  280. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  281. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  282. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  285. package/src/sap/fe/core/templating/CommonFormatters.js +4 -3
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +5 -1
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  288. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  289. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -1
  290. package/src/sap/fe/core/templating/DataModelPathHelper.ts +5 -2
  291. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  292. package/src/sap/fe/core/templating/EntitySetHelper.js +4 -5
  293. package/src/sap/fe/core/templating/EntitySetHelper.ts +4 -3
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  295. package/src/sap/fe/core/templating/FilterHelper.js +34 -15
  296. package/src/sap/fe/core/templating/FilterHelper.ts +28 -12
  297. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  298. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  299. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  300. package/src/sap/fe/core/templating/UIFormatters.js +5 -3
  301. package/src/sap/fe/core/templating/UIFormatters.ts +7 -5
  302. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  303. package/src/sap/fe/core/type/Email.js +2 -2
@@ -0,0 +1,309 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler", "sap/fe/core/helpers/EditState", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/base/Log"], function (DataLossOrDraftDiscardHandler, EditState, ActivitySync, Log) {
6
+ "use strict";
7
+
8
+ function _catch(body, recover) {
9
+ try {
10
+ var result = body();
11
+ } catch (e) {
12
+ return recover(e);
13
+ }
14
+
15
+ if (result && result.then) {
16
+ return result.then(void 0, recover);
17
+ }
18
+
19
+ return result;
20
+ }
21
+
22
+ /**
23
+ * The general handler in which the individual steps are called.
24
+ *
25
+ * @param fnProcessFunction
26
+ * @param fnCancelFunction
27
+ * @param oContext
28
+ * @param oController
29
+ * @param bSkipBindingToView
30
+ * @param navigationType
31
+ */
32
+ var processDataLossOrDraftDiscardConfirmation = function (fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView, navigationType) {
33
+ try {
34
+ if (navigationType === undefined) navigationType = NavigationType.BackNavigation;
35
+ var oModel = oContext.getModel();
36
+ var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
37
+
38
+ var _temp17 = function () {
39
+ if (oContext && oContext.getObject() && (!oContext.getObject().DraftAdministrativeData || oContext.getObject().IsActiveEntity === true)) {
40
+ fnProcessFunction();
41
+ } else {
42
+ var _temp18 = _catch(function () {
43
+ return Promise.resolve(draftDataContext.requestObject()).then(function (draftAdminData) {
44
+ return Promise.resolve(processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView, navigationType)).then(function () {});
45
+ });
46
+ }, function (oError) {
47
+ Log.error("Cannot retrieve draftDataContext information", oError);
48
+ });
49
+
50
+ if (_temp18 && _temp18.then) return _temp18.then(function () {});
51
+ }
52
+ }();
53
+
54
+ return Promise.resolve(_temp17 && _temp17.then ? _temp17.then(function () {}) : void 0);
55
+ } catch (e) {
56
+ return Promise.reject(e);
57
+ }
58
+ };
59
+
60
+ /**
61
+ * Logic to process the admin data.
62
+ *
63
+ * @param draftAdminData Admin data
64
+ * @param fnProcessFunction The functon to process the handler
65
+ * @param fnCancelFunction The cancel function
66
+ * @param oContext The context of the current call
67
+ * @param oController The current controller referenced
68
+ * @param bSkipBindingToView The optional parameter to skip the binding to the view
69
+ * @param navigationType The navigation type for which the function should be called
70
+ */
71
+ var processDraftAdminData = function (draftAdminData, fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView, navigationType) {
72
+ try {
73
+ if (navigationType === undefined) navigationType = NavigationType.BackNavigation;
74
+ var collaborationConnected = ActivitySync.isConnected(oController.getView());
75
+ var processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
76
+ ActivitySync.disconnect(oController.getView());
77
+
78
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
79
+ args[_key] = arguments[_key];
80
+ }
81
+
82
+ fnProcessFunction.apply.apply(fnProcessFunction, [null].concat(args));
83
+ };
84
+ var bSilentlyKeepDraftOnForwardNavigation = silentlyKeepDraftOnForwardNavigation(oController);
85
+
86
+ var _temp13 = function () {
87
+ if (draftAdminData) {
88
+ var _temp14 = function () {
89
+ if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
90
+ return Promise.resolve(processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView)).then(function () {});
91
+ } else if (!oContext.getObject().HasActiveEntity) {
92
+ processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView);
93
+ } else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
94
+ processEditingDraftForExistingEntity(oController, oContext, processFunctionForDrafts, navigationType);
95
+ } else if (EditState.isEditStateDirty()) {
96
+ processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView);
97
+ } else {
98
+ // The user started editing the existing draft but did not make any changes
99
+ // in the current editing session, so in this case we do not want
100
+ // to show the dataloss dialog but just keep the draft
101
+ processFunctionForDrafts();
102
+ }
103
+ }();
104
+
105
+ if (_temp14 && _temp14.then) return _temp14.then(function () {});
106
+ } else {
107
+ fnProcessFunction();
108
+ }
109
+ }();
110
+
111
+ return Promise.resolve(_temp13 && _temp13.then ? _temp13.then(function () {}) : void 0);
112
+ } catch (e) {
113
+ return Promise.reject(e);
114
+ }
115
+ };
116
+
117
+ /**
118
+ * Logic to process the edit state dirty.
119
+ *
120
+ * @param oController The current controller referenced.
121
+ * @param fnCancelFunction The cancel function
122
+ * @param processFunctionForDrafts The functon to process the handler
123
+ * @param navigationType The navigation type for which the function should be called
124
+ * @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
125
+ * @param bSkipBindingToView The optional parameter to skip the binding to the view.
126
+ */
127
+ var processEditStateDirty = function (oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView) {
128
+ try {
129
+ if (navigationType === NavigationType.ForwardNavigation && bSilentlyKeepDraftOnForwardNavigation) {
130
+ // In case we have a "forward navigation" and an additional parameter set in the manifest
131
+ // we "silently" keep the draft
132
+ processFunctionForDrafts();
133
+ } else {
134
+ // The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
135
+ // an existing draft and need to distinguish depending on if any changes
136
+ // have been made in the current editing session or not
137
+ // Changes have been made in the current editing session so we want
138
+ // to show the dataloss dialog and let the user decide
139
+ DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
140
+ }
141
+
142
+ return Promise.resolve();
143
+ } catch (e) {
144
+ return Promise.reject(e);
145
+ }
146
+ };
147
+
148
+ /**
149
+ * Logic to process the draft editing for existing entity.
150
+ *
151
+ * @param oController The current controller referenced.
152
+ * @param oContext The context of the current call
153
+ * @param processFunctionForDrafts The functon to process the handler
154
+ * @param navigationType The navigation type for which the function should be called
155
+ */
156
+ var processEditingDraftForExistingEntity = function (oController, oContext, processFunctionForDrafts, navigationType) {
157
+ try {
158
+ var _temp9 = function () {
159
+ if (navigationType === NavigationType.BackNavigation) {
160
+ var mParameters = {
161
+ skipDiscardPopover: true
162
+ };
163
+
164
+ var _temp10 = _catch(function () {
165
+ return Promise.resolve(oController.editFlow.cancelDocument(oContext, mParameters)).then(function () {
166
+ processFunctionForDrafts();
167
+ });
168
+ }, function (error) {
169
+ Log.error("Error while canceling the document", error);
170
+ });
171
+
172
+ if (_temp10 && _temp10.then) return _temp10.then(function () {});
173
+ } else {
174
+ // In case of a forward navigation we silently keep the draft and only
175
+ // execute the followup function.
176
+ processFunctionForDrafts();
177
+ }
178
+ }();
179
+
180
+ // We are editing a draft for an existing active entity
181
+ // The CreationDateTime and LastChangeDateTime are equal, so this draft was
182
+ // never saved before, hence we're currently editing a newly created draft for
183
+ // an existing active entity for the first time.
184
+ // Also there have so far been no changes made to the draft and in this
185
+ // case we want to silently navigate and delete the draftin case of a back
186
+ // navigation but in case of a forward navigation we want to silently keep it!
187
+ return Promise.resolve(_temp9 && _temp9.then ? _temp9.then(function () {}) : void 0);
188
+ } catch (e) {
189
+ return Promise.reject(e);
190
+ }
191
+ };
192
+
193
+ /**
194
+ * Logic to process the mode with no active entity.
195
+ *
196
+ * @param draftAdminData Admin data
197
+ * @param fnCancelFunction The cancel function
198
+ * @param oController The current controller referenced
199
+ * @param processFunctionForDrafts The functon to process the handler
200
+ * @param navigationType The navigation type for which the function should be called
201
+ * @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
202
+ * @param bSkipBindingToView The optional parameter to skip the binding to the view
203
+ */
204
+ var processNoActiveEntityMode = function (draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView) {
205
+ try {
206
+ var _temp4 = function () {
207
+ if (EditState.isEditStateDirty()) {
208
+ var _temp5 = function () {
209
+ if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime && navigationType === NavigationType.BackNavigation) {
210
+ var _temp6 = _catch(function () {
211
+ return Promise.resolve(DataLossOrDraftDiscardHandler.discardDraft(oController, bSkipBindingToView)).then(function () {
212
+ processFunctionForDrafts();
213
+ });
214
+ }, function (error) {
215
+ Log.error("Error while canceling the document", error);
216
+ });
217
+
218
+ if (_temp6 && _temp6.then) return _temp6.then(function () {});
219
+ } else if (navigationType === NavigationType.ForwardNavigation && bSilentlyKeepDraftOnForwardNavigation) {
220
+ // In case we have a "forward navigation" and an additional parameter set in the manifest
221
+ // we "silently" keep the draft
222
+ processFunctionForDrafts();
223
+ } else {
224
+ // In this case data is being changed or a forward navigation is triggered
225
+ // and we always want to show the dataloss dialog on navigation
226
+ DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
227
+ }
228
+ }();
229
+
230
+ if (_temp5 && _temp5.then) return _temp5.then(function () {});
231
+ } else {
232
+ // We are editing a draft which has been created earlier but never saved to active
233
+ // version and since the edit state is not dirty, there have been no user changes
234
+ // so in this case we want to silently navigate and do nothing
235
+ processFunctionForDrafts();
236
+ }
237
+ }();
238
+
239
+ // There is no active entity so we are editing either newly created data or
240
+ // a draft which has never been saved to active version
241
+ // Since we want to react differently in the two situations, we have to check the
242
+ // dirty state
243
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(function () {}) : void 0);
244
+ } catch (e) {
245
+ return Promise.reject(e);
246
+ }
247
+ };
248
+
249
+ /**
250
+ * Logic to process the fcl mode.
251
+ *
252
+ * @param draftAdminData Admin data
253
+ * @param fnCancelFunction The cancel function
254
+ * @param oController The current controller referenced
255
+ * @param processFunctionForDrafts The functon to process the handler
256
+ * @param bSkipBindingToView The optional parameter to skip the binding to the view
257
+ */
258
+ var processFclMode = function (draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView) {
259
+ try {
260
+ // The application is running in FCL mode so in this case we fall back to
261
+ // the old logic since the dirty state handling is not properly working
262
+ // for FCL.
263
+ if (draftAdminData.CreationDateTime !== draftAdminData.LastChangeDateTime) {
264
+ DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
265
+ } else {
266
+ processFunctionForDrafts();
267
+ }
268
+
269
+ return Promise.resolve();
270
+ } catch (e) {
271
+ return Promise.reject(e);
272
+ }
273
+ };
274
+
275
+ /* Enum for navigation types */
276
+ var NavigationType;
277
+ /**
278
+ * The method checks whether an optional parameter in the manifest is set to silently keep the draft in case a forward navigation is triggered.
279
+ *
280
+ * @param pageController The reference to the current PageController instance
281
+ * @returns Boolean value with true or false to silently keep the draft
282
+ */
283
+
284
+ (function (NavigationType) {
285
+ NavigationType["BackNavigation"] = "BackNavigation";
286
+ NavigationType["ForwardNavigation"] = "ForwardNavigation";
287
+ })(NavigationType || (NavigationType = {}));
288
+
289
+ function silentlyKeepDraftOnForwardNavigation(pageController) {
290
+ var _oManifest$sapFe, _oManifest$sapFe$app;
291
+
292
+ var rbSilentlyKeep = false;
293
+ var oManifest = pageController.getAppComponent().getManifest();
294
+ rbSilentlyKeep = (oManifest === null || oManifest === void 0 ? void 0 : (_oManifest$sapFe = oManifest["sap.fe"]) === null || _oManifest$sapFe === void 0 ? void 0 : (_oManifest$sapFe$app = _oManifest$sapFe.app) === null || _oManifest$sapFe$app === void 0 ? void 0 : _oManifest$sapFe$app.silentlyKeepDraftOnForwardNavigation) || false;
295
+ return rbSilentlyKeep;
296
+ }
297
+
298
+ var draftDataLossPopup = {
299
+ processDataLossOrDraftDiscardConfirmation: processDataLossOrDraftDiscardConfirmation,
300
+ silentlyKeepDraftOnForwardNavigation: silentlyKeepDraftOnForwardNavigation,
301
+ NavigationType: NavigationType,
302
+ processFclMode: processFclMode,
303
+ processNoActiveEntityMode: processNoActiveEntityMode,
304
+ processEditingDraftForExistingEntity: processEditingDraftForExistingEntity,
305
+ processEditStateDirty: processEditStateDirty
306
+ };
307
+ return draftDataLossPopup;
308
+ }, false);
309
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJmblByb2Nlc3NGdW5jdGlvbiIsImZuQ2FuY2VsRnVuY3Rpb24iLCJvQ29udGV4dCIsIm9Db250cm9sbGVyIiwiYlNraXBCaW5kaW5nVG9WaWV3IiwibmF2aWdhdGlvblR5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0IiwiZ2V0T2JqZWN0IiwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEiLCJJc0FjdGl2ZUVudGl0eSIsInJlcXVlc3RPYmplY3QiLCJkcmFmdEFkbWluRGF0YSIsInByb2Nlc3NEcmFmdEFkbWluRGF0YSIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiY29sbGFib3JhdGlvbkNvbm5lY3RlZCIsIkFjdGl2aXR5U3luYyIsImlzQ29ubmVjdGVkIiwiZ2V0VmlldyIsInByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyIsImRpc2Nvbm5lY3QiLCJhcmdzIiwiYXBwbHkiLCJiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwicHJvY2Vzc0ZjbE1vZGUiLCJIYXNBY3RpdmVFbnRpdHkiLCJwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlIiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJwcm9jZXNzRWRpdFN0YXRlRGlydHkiLCJGb3J3YXJkTmF2aWdhdGlvbiIsIkRhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyIiwicGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0IiwibVBhcmFtZXRlcnMiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlZGl0RmxvdyIsImNhbmNlbERvY3VtZW50IiwiZGlzY2FyZERyYWZ0IiwicGFnZUNvbnRyb2xsZXIiLCJyYlNpbGVudGx5S2VlcCIsIm9NYW5pZmVzdCIsImdldE1hbmlmZXN0IiwiYXBwIiwiZHJhZnREYXRhTG9zc1BvcHVwIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJkcmFmdERhdGFMb3NzUG9wdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9EYXRhTG9zc09yRHJhZnREaXNjYXJkL0RhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyXCI7XHJcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XHJcbmltcG9ydCBBY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XHJcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xyXG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwiLi4vLi4vUGFnZUNvbnRyb2xsZXJcIjtcclxuXHJcbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cclxuZW51bSBOYXZpZ2F0aW9uVHlwZSB7XHJcbiAgICBCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcclxuICAgIEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBpbiB0aGUgbWFuaWZlc3QgaXMgc2V0IHRvIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0IGluIGNhc2UgYSBmb3J3YXJkIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0gcGFnZUNvbnRyb2xsZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBQYWdlQ29udHJvbGxlciBpbnN0YW5jZVxyXG4gKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdpdGggdHJ1ZSBvciBmYWxzZSB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdFxyXG4gKi9cclxuZnVuY3Rpb24gc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKHBhZ2VDb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcikge1xyXG4gICAgbGV0IHJiU2lsZW50bHlLZWVwID0gZmFsc2U7XHJcbiAgICBjb25zdCBvTWFuaWZlc3QgPSBwYWdlQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdCgpIGFzIGFueTtcclxuICAgIHJiU2lsZW50bHlLZWVwID0gb01hbmlmZXN0Py5bXCJzYXAuZmVcIl0/LmFwcD8uc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIHx8IGZhbHNlO1xyXG4gICAgcmV0dXJuIHJiU2lsZW50bHlLZWVwO1xyXG59XHJcblxyXG4vKipcclxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgZmNsIG1vZGUuXHJcbiAqIFxyXG4gKiBAcGFyYW0gZHJhZnRBZG1pbkRhdGEgQWRtaW4gZGF0YVxyXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcclxuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3RvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXHJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRmNsTW9kZShcclxuICAgIGRyYWZ0QWRtaW5EYXRhOiBhbnksXHJcbiAgICBmbkNhbmNlbEZ1bmN0aW9uOiBhbnksXHJcbiAgICBvQ29udHJvbGxlcjogYW55LFxyXG4gICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBhbnksXHJcbiAgICBiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxyXG4pIHtcclxuICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cclxuICAgIC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXHJcbiAgICAvLyBmb3IgRkNMLlxyXG4gICAgaWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xyXG4gICAgICAgIERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcclxuICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxyXG4gICAgICAgICAgICBmbkNhbmNlbEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICBvQ29udHJvbGxlcixcclxuICAgICAgICAgICAgYlNraXBCaW5kaW5nVG9WaWV3XHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBtb2RlIHdpdGggbm8gYWN0aXZlIGVudGl0eS5cclxuICogXHJcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXHJcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cclxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZFxyXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdG9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXHJcbiAqIEBwYXJhbSBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIFRoZSBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2tpcCB0aGUgcG9wdXAgYXBwZWFyYW5jZSBpbiBmb3J3YXJkIGNhc2VcclxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUoXHJcbiAgICBkcmFmdEFkbWluRGF0YTogYW55LFxyXG4gICAgZm5DYW5jZWxGdW5jdGlvbjogYW55LFxyXG4gICAgb0NvbnRyb2xsZXI6IGFueSxcclxuICAgIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogYW55LFxyXG4gICAgbmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxyXG4gICAgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcclxuICAgIGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4pIHtcclxuICAgIC8vIFRoZXJlIGlzIG5vIGFjdGl2ZSBlbnRpdHkgc28gd2UgYXJlIGVkaXRpbmcgZWl0aGVyIG5ld2x5IGNyZWF0ZWQgZGF0YSBvclxyXG4gICAgLy8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxyXG4gICAgLy8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXHJcbiAgICAvLyBkaXJ0eSBzdGF0ZVxyXG4gICAgaWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSAmJlxyXG4gICAgICAgICAgICBuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgLy8gaW4gY2FzZSB3ZSBoYXZlIHVudG91Y2hlZCBjaGFuZ2VzIGZvciB0aGUgZHJhZnQgYW5kIGEgXCJiYWNrXCJcclxuICAgICAgICAgICAgLy8gbmF2aWdhdGlvbiB3ZSBjYW4gc2lsZW50bHkgZGlzY2FyZCB0aGUgZHJhZnQgYWdhaW5cclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2Uvbm8tbmVzdGluZ1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIuZGlzY2FyZERyYWZ0KG9Db250cm9sbGVyLCBiU2tpcEJpbmRpbmdUb1ZpZXcpO1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb24gJiYgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbikge1xyXG4gICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBcImZvcndhcmQgbmF2aWdhdGlvblwiIGFuZCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgaW4gdGhlIG1hbmlmZXN0XHJcbiAgICAgICAgICAgIC8vIHdlIFwic2lsZW50bHlcIiBrZWVwIHRoZSBkcmFmdFxyXG4gICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgZGF0YSBpcyBiZWluZyBjaGFuZ2VkIG9yIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxyXG4gICAgICAgICAgICAvLyBhbmQgd2UgYWx3YXlzIHdhbnQgdG8gc2hvdyB0aGUgZGF0YWxvc3MgZGlhbG9nIG9uIG5hdmlnYXRpb25cclxuICAgICAgICAgICAgRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxyXG4gICAgICAgICAgICAgICAgZm5DYW5jZWxGdW5jdGlvbixcclxuICAgICAgICAgICAgICAgIG9Db250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgYlNraXBCaW5kaW5nVG9WaWV3XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXHJcbiAgICAgICAgLy8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXHJcbiAgICAgICAgLy8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcclxuICAgICAgICBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgZHJhZnQgZWRpdGluZyBmb3IgZXhpc3RpbmcgZW50aXR5LlxyXG4gKiBcclxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cclxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGwgXHJcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0b24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHkoXHJcbiAgICBvQ29udHJvbGxlcjogYW55LFxyXG4gICAgb0NvbnRleHQ6IGFueSxcclxuICAgIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogYW55LFxyXG4gICAgbmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxyXG4pIHtcclxuICAgIC8vIFdlIGFyZSBlZGl0aW5nIGEgZHJhZnQgZm9yIGFuIGV4aXN0aW5nIGFjdGl2ZSBlbnRpdHlcclxuICAgIC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIGVxdWFsLCBzbyB0aGlzIGRyYWZ0IHdhc1xyXG4gICAgLy8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXHJcbiAgICAvLyBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5IGZvciB0aGUgZmlyc3QgdGltZS5cclxuICAgIC8vIEFsc28gdGhlcmUgaGF2ZSBzbyBmYXIgYmVlbiBubyBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRyYWZ0IGFuZCBpbiB0aGlzXHJcbiAgICAvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnRpbiBjYXNlIG9mIGEgYmFja1xyXG4gICAgLy8gbmF2aWdhdGlvbiBidXQgaW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIHNpbGVudGx5IGtlZXAgaXQhXHJcbiAgICBpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbVBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgIHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG9Db250cm9sbGVyLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XHJcbiAgICAgICAgICAgIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgICAgTG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY2FuY2VsaW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBJbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0IGFuZCBvbmx5XHJcbiAgICAgICAgLy8gZXhlY3V0ZSB0aGUgZm9sbG93dXAgZnVuY3Rpb24uXHJcbiAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBlZGl0IHN0YXRlIGRpcnR5LlxyXG4gKiBcclxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxyXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdG9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIFxyXG4gKiBAcGFyYW0gYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiBUaGUgcGFyYW1ldGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNraXAgdGhlIHBvcHVwIGFwcGVhcmFuY2UgaW4gZm9yd2FyZCBjYXNlXHJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3LlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0VkaXRTdGF0ZURpcnR5KFxyXG4gICAgb0NvbnRyb2xsZXI6IGFueSxcclxuICAgIGZuQ2FuY2VsRnVuY3Rpb246IGFueSxcclxuICAgIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogYW55LFxyXG4gICAgbmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxyXG4gICAgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcclxuICAgIGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4pIHtcclxuICAgIGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb24gJiYgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbikge1xyXG4gICAgICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3RcclxuICAgICAgICAvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcclxuICAgICAgICBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgTk9UIGVxdWFsLCBzbyB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmdcclxuICAgICAgICAvLyBhbiBleGlzdGluZyBkcmFmdCBhbmQgbmVlZCB0byBkaXN0aW5ndWlzaCBkZXBlbmRpbmcgb24gaWYgYW55IGNoYW5nZXNcclxuICAgICAgICAvLyBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgY3VycmVudCBlZGl0aW5nIHNlc3Npb24gb3Igbm90XHJcbiAgICAgICAgLy8gQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgY3VycmVudCBlZGl0aW5nIHNlc3Npb24gc28gd2Ugd2FudFxyXG4gICAgICAgIC8vIHRvIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBhbmQgbGV0IHRoZSB1c2VyIGRlY2lkZVxyXG4gICAgICAgIERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcclxuICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxyXG4gICAgICAgICAgICBmbkNhbmNlbEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICBvQ29udHJvbGxlcixcclxuICAgICAgICAgICAgYlNraXBCaW5kaW5nVG9WaWV3XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBhZG1pbiBkYXRhLlxyXG4gKiBcclxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcclxuICogQHBhcmFtIGZuUHJvY2Vzc0Z1bmN0aW9uIFRoZSBmdW5jdG9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxyXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgY2FsbFxyXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXHJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XHJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RyYWZ0QWRtaW5EYXRhKGRyYWZ0QWRtaW5EYXRhOiBhbnksIGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksXHJcbiAgICBmbkNhbmNlbEZ1bmN0aW9uOiBhbnksXHJcbiAgICBvQ29udGV4dDogYW55LFxyXG4gICAgb0NvbnRyb2xsZXI6IGFueSxcclxuICAgIGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXHJcbiAgICBuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikge1xyXG5cclxuICAgIGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcclxuICAgIGNvbnN0IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyA9ICFjb2xsYWJvcmF0aW9uQ29ubmVjdGVkXHJcbiAgICAgICAgPyBmblByb2Nlc3NGdW5jdGlvblxyXG4gICAgICAgIDogZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgICAgICAgIEFjdGl2aXR5U3luYy5kaXNjb25uZWN0KG9Db250cm9sbGVyLmdldFZpZXcoKSk7XHJcbiAgICAgICAgICAgIGZuUHJvY2Vzc0Z1bmN0aW9uLmFwcGx5KG51bGwsIC4uLmFyZ3MpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgY29uc3QgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiA9IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbihvQ29udHJvbGxlcik7XHJcblxyXG4gICAgaWYgKGRyYWZ0QWRtaW5EYXRhKSB7XHJcbiAgICAgICAgaWYgKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NGY2xNb2RlKFxyXG4gICAgICAgICAgICAgICAgZHJhZnRBZG1pbkRhdGEsXHJcbiAgICAgICAgICAgICAgICBmbkNhbmNlbEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICAgICAgb0NvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXHJcbiAgICAgICAgICAgICAgICBiU2tpcEJpbmRpbmdUb1ZpZXdcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIW9Db250ZXh0LmdldE9iamVjdCgpLkhhc0FjdGl2ZUVudGl0eSkge1xyXG4gICAgICAgICAgICBwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlKFxyXG4gICAgICAgICAgICAgICAgZHJhZnRBZG1pbkRhdGEsXHJcbiAgICAgICAgICAgICAgICBmbkNhbmNlbEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICAgICAgb0NvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXHJcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXHJcbiAgICAgICAgICAgICAgICBiU2tpcEJpbmRpbmdUb1ZpZXdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xyXG4gICAgICAgICAgICBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHkoXHJcbiAgICAgICAgICAgICAgICBvQ29udHJvbGxlcixcclxuICAgICAgICAgICAgICAgIG9Db250ZXh0LFxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxyXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvblR5cGUsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9IGVsc2UgaWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcclxuICAgICAgICAgICAgcHJvY2Vzc0VkaXRTdGF0ZURpcnR5KFxyXG4gICAgICAgICAgICAgICAgb0NvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgICAgICBmbkNhbmNlbEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxyXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxyXG4gICAgICAgICAgICAgICAgYlNraXBCaW5kaW5nVG9WaWV3XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcclxuICAgICAgICAgICAgLy8gaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnRcclxuICAgICAgICAgICAgLy8gdG8gc2hvdyB0aGUgZGF0YWxvc3MgZGlhbG9nIGJ1dCBqdXN0IGtlZXAgdGhlIGRyYWZ0XHJcbiAgICAgICAgICAgIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm5Qcm9jZXNzRnVuY3Rpb24oKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBnZW5lcmFsIGhhbmRsZXIgaW4gd2hpY2ggdGhlIGluZGl2aWR1YWwgc3RlcHMgYXJlIGNhbGxlZC5cclxuICogXHJcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxyXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvblxyXG4gKiBAcGFyYW0gb0NvbnRleHRcclxuICogQHBhcmFtIG9Db250cm9sbGVyXHJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXdcclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcclxuICAgIGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksXHJcbiAgICBmbkNhbmNlbEZ1bmN0aW9uOiBhbnksXHJcbiAgICBvQ29udGV4dDogYW55LFxyXG4gICAgb0NvbnRyb2xsZXI6IGFueSxcclxuICAgIGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXHJcbiAgICBuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxyXG4pIHtcclxuICAgIGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XHJcbiAgICBjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICAgb0NvbnRleHQgJiZcclxuICAgICAgICBvQ29udGV4dC5nZXRPYmplY3QoKSAmJlxyXG4gICAgICAgICghb0NvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgfHwgb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHkgPT09IHRydWUpXHJcbiAgICApIHtcclxuICAgICAgICBmblByb2Nlc3NGdW5jdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKVxyXG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzRHJhZnRBZG1pbkRhdGEoZHJhZnRBZG1pbkRhdGEsXHJcbiAgICAgICAgICAgICAgICBmblByb2Nlc3NGdW5jdGlvbixcclxuICAgICAgICAgICAgICAgIGZuQ2FuY2VsRnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBvQ29udGV4dCxcclxuICAgICAgICAgICAgICAgIG9Db250cm9sbGVyLFxyXG4gICAgICAgICAgICAgICAgYlNraXBCaW5kaW5nVG9WaWV3LFxyXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvblR5cGUpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChvRXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgZHJhZnREYXRhTG9zc1BvcHVwID0ge1xyXG4gICAgcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxyXG4gICAgc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXHJcbiAgICBOYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXHJcbiAgICBwcm9jZXNzRmNsTW9kZTogcHJvY2Vzc0ZjbE1vZGUsXHJcbiAgICBwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlOiBwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlLFxyXG4gICAgcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5OiBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHksXHJcbiAgICBwcm9jZXNzRWRpdFN0YXRlRGlydHk6IHByb2Nlc3NFZGl0U3RhdGVEaXJ0eVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkcmFmdERhdGFMb3NzUG9wdXA7Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBa2pCTyxnQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0lBQ0EsQ0FGRCxDQUVFLE9BQU1HLENBQU4sRUFBUztNQUNWLE9BQU9GLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFkO0lBQ0E7O0lBQ0QsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQXJCLEVBQTJCO01BQzFC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