@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,808 +1,791 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(
6
- [
7
- "sap/ui/core/mvc/ControllerExtension",
8
- "sap/ui/core/mvc/OverrideExecution",
9
- "sap/base/Log",
10
- "sap/base/util/merge",
11
- "sap/ui/fl/apply/api/ControlVariantApplyAPI",
12
- "sap/ui/mdc/p13n/StateUtil",
13
- "sap/fe/navigation/library",
14
- "sap/fe/core/CommonUtils",
15
- "sap/fe/core/helpers/KeepAliveHelper",
16
- "sap/fe/core/helpers/ModelHelper"
17
- ],
18
- function(
19
- ControllerExtension,
20
- OverrideExecution,
21
- Log,
22
- mergeObjects,
23
- ControlVariantApplyAPI,
24
- StateUtil,
25
- NavLibrary,
26
- CommonUtils,
27
- KeepAliveHelper,
28
- ModelHelper
29
- ) {
30
- "use strict";
31
-
32
- // additionalStates are stored next to control IDs, so name clash avoidance needed. Fortunately IDs have restrictions:
33
- // "Allowed is a sequence of characters (capital/lowercase), digits, underscores, dashes, points and/or colons."
34
- // Therefore adding a symbol like # or @
35
- var ADDITIONAL_STATES_KEY = "#additionalStates",
36
- NavType = NavLibrary.NavType;
37
-
38
- ///////////////////////////////////////////////////////////////////
39
- // methods to retrieve & apply states for the different controls //
40
- ///////////////////////////////////////////////////////////////////
41
-
42
- var _mControlStateHandlerMap = {
43
- "sap.ui.fl.variants.VariantManagement": {
44
- retrieve: function(oVM) {
45
- return {
46
- "variantId": oVM.getCurrentVariantKey()
47
- };
48
- },
49
- apply: function(oVM, oControlState) {
50
- if (oControlState && oControlState.variantId !== undefined && oControlState.variantId !== oVM.getCurrentVariantKey()) {
51
- var sVariantReference = this._checkIfVariantIdIsAvailable(oVM, oControlState.variantId)
52
- ? oControlState.variantId
53
- : oVM.getStandardVariantKey();
54
- return ControlVariantApplyAPI.activateVariant({
55
- element: oVM,
56
- variantReference: sVariantReference
57
- });
58
- }
59
- }
60
- },
61
- "sap.m.IconTabBar": {
62
- retrieve: function(oTabBar) {
63
- return {
64
- selectedKey: oTabBar.getSelectedKey()
65
- };
66
- },
67
- apply: function(oTabBar, oControlState) {
68
- if (oControlState && oControlState.selectedKey) {
69
- var oSelectedItem = oTabBar.getItems().find(function(oItem) {
70
- return oItem.getKey() === oControlState.selectedKey;
71
- });
72
- if (oSelectedItem) {
73
- oTabBar.setSelectedItem(oSelectedItem);
74
- }
75
- }
76
- }
77
- },
78
- "sap.ui.mdc.FilterBar": {
79
- retrieve: function(oFilterBar) {
80
- return StateUtil.retrieveExternalState(oFilterBar).then(function(mFilterBarState) {
81
- // remove sensitive or view state irrelevant fields
82
- var aPropertiesInfo = oFilterBar.getPropertyInfoSet(),
83
- mFilter = mFilterBarState.filter || {};
84
- aPropertiesInfo
85
- .filter(function(oPropertyInfo) {
86
- return (
87
- mFilter[oPropertyInfo.path] &&
88
- (oPropertyInfo.removeFromAppState || mFilter[oPropertyInfo.path].length === 0)
89
- );
90
- })
91
- .forEach(function(oPropertyInfo) {
92
- delete mFilter[oPropertyInfo.path];
93
- });
94
- return mFilterBarState;
95
- });
96
- },
97
- apply: function(oFilterBar, oControlState) {
98
- if (oControlState) {
99
- return StateUtil.applyExternalState(oFilterBar, oControlState);
100
- }
101
- }
102
- },
103
- "sap.ui.mdc.Table": {
104
- retrieve: function(oTable) {
105
- return StateUtil.retrieveExternalState(oTable);
106
- },
107
- apply: function(oTable, oControlState) {
108
- if (oControlState) {
109
- return StateUtil.applyExternalState(oTable, oControlState);
110
- }
111
- },
112
- refreshBinding: function(oTable) {
113
- var oTableBinding = oTable.getRowBinding();
114
- if (oTableBinding) {
115
- var oRootBinding = oTableBinding.getRootBinding();
116
- if (oRootBinding === oTableBinding) {
117
- // absolute binding
118
- oTableBinding.refresh();
119
- } else {
120
- // relative binding
121
- var oHeaderContext = oTableBinding.getHeaderContext();
122
- var sGroupId = oTableBinding.getGroupId();
123
-
124
- if (oHeaderContext) {
125
- oHeaderContext.requestSideEffects([{ $NavigationPropertyPath: "" }], sGroupId);
126
- }
127
- }
128
- } else {
129
- Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
130
- }
131
- }
132
- },
133
- "sap.uxap.ObjectPageLayout": {
134
- retrieve: function(oOPLayout) {
135
- return {
136
- selectedSection: oOPLayout.getSelectedSection()
137
- };
138
- },
139
- apply: function(oOPLayout, oControlState) {
140
- oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
141
- },
142
- refreshBinding: function(oOPLayout) {
143
- var oBindingContext = oOPLayout.getBindingContext();
144
- var oBinding = oBindingContext && oBindingContext.getBinding();
145
- if (oBinding) {
146
- var sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
147
- var sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
148
- if (sStrategy === "self") {
149
- // Refresh main context and 1-1 navigation properties or OP
150
- var oModel = oBindingContext.getModel(),
151
- oMetaModel = oModel.getMetaModel(),
152
- oNavigationProperties =
153
- CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
154
- $kind: "NavigationProperty"
155
- }) || {},
156
- aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function(aPrev, sNavProp) {
157
- if (oNavigationProperties[sNavProp].$isCollection !== true) {
158
- aPrev.push({ $NavigationPropertyPath: sNavProp });
159
- }
160
- return aPrev;
161
- }, []),
162
- aProperties = [{ $PropertyPath: "*" }],
163
- sGroupId = oBinding.getGroupId();
164
-
165
- oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
166
- } else if (sStrategy === "includingDependents") {
167
- // Complete refresh
168
- oBinding.refresh();
169
- }
170
- } else {
171
- Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
172
- }
173
- }
174
- },
175
- "sap.fe.macros.table.QuickFilterContainer": {
176
- retrieve: function(oQuickFilter) {
177
- return {
178
- selectedKey: oQuickFilter.getSelectorKey()
179
- };
180
- },
181
- apply: function(oQuickFilter, oControlState) {
182
- oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
183
- }
184
- },
185
- "sap.m.SegmentedButton": {
186
- retrieve: function(oSegmentedButton) {
187
- return {
188
- selectedKey: oSegmentedButton.getSelectedKey()
189
- };
190
- },
191
- apply: function(oSegmentedButton, oControlState) {
192
- oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
193
- }
194
- },
195
- "sap.m.Select": {
196
- retrieve: function(oSelect) {
197
- return {
198
- selectedKey: oSelect.getSelectedKey()
199
- };
200
- },
201
- apply: function(oSelect, oControlState) {
202
- oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
203
- }
204
- },
205
- "sap.f.DynamicPage": {
206
- retrieve: function(oDynamicPage) {
207
- return {
208
- headerExpanded: oDynamicPage.getHeaderExpanded()
209
- };
210
- },
211
- apply: function(oDynamicPage, oControlState) {
212
- oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
213
- }
214
- },
215
- "sap.ui.core.mvc.View": {
216
- retrieve: function(oView) {
217
- var oController = oView.getController();
218
- if (oController && oController.viewState) {
219
- return oController.viewState.retrieveViewState(oController.viewState);
220
- }
221
- return {};
222
- },
223
- apply: function(oView, oControlState, oNavParameters) {
224
- var oController = oView.getController();
225
- if (oController && oController.viewState) {
226
- return oController.viewState.applyViewState(oControlState, oNavParameters);
227
- }
228
- },
229
- refreshBinding: function(oView) {
230
- var oController = oView.getController();
231
- if (oController && oController.viewState) {
232
- return oController.viewState.refreshViewBindings();
233
- }
234
- }
235
- },
236
- "sap.ui.core.ComponentContainer": {
237
- retrieve: function(oComponentContainer) {
238
- var oComponent = oComponentContainer.getComponentInstance();
239
- if (oComponent) {
240
- return this.retrieveControlState(oComponent.getRootControl());
241
- }
242
- return {};
243
- },
244
- apply: function(oComponentContainer, oControlState, oNavParameters) {
245
- var oComponent = oComponentContainer.getComponentInstance();
246
- if (oComponent) {
247
- return this.applyControlState(oComponent.getRootControl(), oControlState, oNavParameters);
248
- }
249
- }
250
- }
251
- };
252
-
253
- /**
254
- * @class A controller extension offering hooks for state handling
255
- *
256
- * If you need to maintain a specific state for your application, you can use the controller extension.
257
- *
258
- * @name sap.fe.core.controllerextensions.ViewState
259
- * @hideconstructor
260
- * @public
261
- * @since 1.85.0
262
- */
263
- var ViewState = ControllerExtension.extend("sap.fe.core.controllerextensions.ViewState", {
264
- metadata: {
265
- methods: {
266
- refreshViewBindings: { "public": true, "final": true },
267
- adaptBindingRefreshControls: {
268
- "public": true,
269
- "final": false,
270
- overrideExecution: OverrideExecution.After
271
- },
272
- getControlRefreshBindingHandler: {
273
- "public": false,
274
- "final": true
275
- },
276
- refreshControlBinding: {
277
- "public": false,
278
- "final": true
279
- },
280
- adaptBindingRefreshHandler: {
281
- "public": true,
282
- "final": false,
283
- overrideExecution: OverrideExecution.After
284
- },
285
- collectResults: { "public": false, "final": true },
286
- adaptControlStateHandler: {
287
- "public": true,
288
- "final": false,
289
- overrideExecution: OverrideExecution.After
290
- },
291
- getControlStateHandler: { "public": false, "final": true },
292
- adaptStateControls: {
293
- "public": true,
294
- "final": false,
295
- overrideExecution: OverrideExecution.After
296
- },
297
- retrieveAdditionalStates: {
298
- "public": true,
299
- "final": false,
300
- overrideExecution: OverrideExecution.After
301
- },
302
- retrieveViewState: { "public": true, "final": true },
303
- retrieveControlState: { "public": false, "final": true },
304
- applyInitialStateOnly: {
305
- "public": true,
306
- "final": false,
307
- overrideExecution: OverrideExecution.Instead
308
- },
309
- applyViewState: { "public": true, "final": true },
310
- applyControlState: { "public": false, "final": true },
311
- applyAdditionalStates: {
312
- "public": true,
313
- "final": false,
314
- overrideExecution: OverrideExecution.After
315
- },
316
- applyNavigationParameters: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
317
- onBeforeStateApplied: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
318
- onAfterStateApplied: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
319
- onSuspend: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
320
- onRestore: { "public": true, "final": false, overrideExecution: OverrideExecution.After }
321
- }
322
- },
323
-
324
- /**
325
- * Constructor.
326
- */
327
- constructor: function() {
328
- ControllerExtension.apply(this);
329
- var that = this;
330
- that._iRetrievingStateCounter = 0;
331
- this._pInitialStateApplied = new Promise(function(resolve) {
332
- that._pInitialStateAppliedResolve = resolve;
333
- });
334
- },
335
-
336
- /**
337
- * @private
338
- * @name sap.fe.core.controllerextensions.ViewState.getMetadata
339
- * @function
340
- */
341
- /**
342
- * @private
343
- * @name sap.fe.core.controllerextensions.ViewState.extend
344
- * @function
345
- */
346
-
347
- refreshViewBindings: function() {
348
- var that = this;
349
- return that.collectResults(that.base.viewState.adaptBindingRefreshControls).then(function(aControls) {
350
- var oPromiseChain = Promise.resolve();
351
- aControls
352
- .filter(function(oControl) {
353
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
354
- })
355
- .forEach(function(oControl) {
356
- oPromiseChain = oPromiseChain.then(that.refreshControlBinding.bind(that, oControl));
357
- });
358
- return oPromiseChain;
359
- });
360
- },
361
- /**
362
- * This function should add all controls relevant for refreshing to the provided control array.
363
- *
364
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
365
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
366
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
367
- * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
368
- * @protected
369
- */
370
- adaptBindingRefreshControls: function(aCollectedControls) {},
371
-
372
- refreshControlBinding: function(oControl) {
373
- var oControlRefreshBindingHandler = this.getControlRefreshBindingHandler(oControl),
374
- oPromiseChain = Promise.resolve(),
375
- that = this;
376
- if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
377
- Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
378
- } else {
379
- oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(that, oControl));
380
- }
381
- return oPromiseChain;
382
- },
383
-
384
- /**
385
- * Returns a map of <code>refreshBinding</code> function for a certain control.
386
- *
387
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
388
- * @returns {object} A plain object with one function: <code>refreshBinding</code>
389
- */
390
-
391
- getControlRefreshBindingHandler: function(oControl) {
392
- var oRefreshBindingHandler = {};
393
- if (oControl) {
394
- for (var sType in _mControlStateHandlerMap) {
395
- if (oControl.isA(sType)) {
396
- // pass only the refreshBinding handler in an object so that :
397
- // 1. Application has access only to refreshBinding and not apply and reterive at this stage
398
- // 2. Application modifications to the object will be reflected here (as we pass by reference)
399
- oRefreshBindingHandler["refreshBinding"] = _mControlStateHandlerMap[sType].refreshBinding || {};
400
- break;
401
- }
402
- }
403
- }
404
- this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
405
- return oRefreshBindingHandler;
406
- },
407
- /**
408
- * Customize the <code>refreshBinding</code> function for a certain control.
409
- *
410
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
411
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
412
- *
413
- * @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
414
- * @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
415
- *
416
- * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
417
- * @protected
418
- */
419
- adaptBindingRefreshHandler: function(oControl, oControlHandler) {},
420
-
421
- /**
422
- * Called when the application is suspended due to keep-alive mode.
423
- *
424
- * @alias sap.fe.core.controllerextensions.ViewState#onSuspend
425
- * @public
426
- */
427
- onSuspend: function() {},
428
-
429
- /**
430
- * Called when the application is restored due to keep-alive mode.
431
- *
432
- * @alias sap.fe.core.controllerextensions.ViewState#onRestore
433
- * @public
434
- */
435
- onRestore: function() {},
436
-
437
- /**
438
- * Destructor method for objects.
439
- */
440
- destroy: function() {
441
- delete this._pInitialStateApplied;
442
- delete this._pInitialStateAppliedResolve;
443
- delete this._iRetrievingStateCounter;
444
- ControllerExtension.prototype.destroy.apply(this);
445
- },
446
-
447
- /**
448
- * Helper function to enable multi override. It is adding an additional parameter (array) to the provided
449
- * function (and its parameters), that will be evaluated via <code>Promise.all</code>.
450
- *
451
- * @param {Function} fnCall The function to be called
452
- * @returns {Promise} A promise to be resolved with the result of all overrides
453
- */
454
- collectResults: function(fnCall) {
455
- var aResults = [],
456
- aArguments = Array.prototype.slice.call(arguments, 1);
457
- aArguments.push(aResults);
458
- fnCall.apply(this, aArguments);
459
- return Promise.all(aResults);
460
- },
461
-
462
- /**
463
- * Customize the <code>retrieve</code> and <code>apply</code> functions for a certain control.
464
- *
465
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
466
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
467
- *
468
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
469
- * @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
470
- *
471
- * @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
472
- * @protected
473
- */
474
- adaptControlStateHandler: function(oControl, aControlHandler) {
475
- // to be overridden if needed
476
- },
477
-
478
- /**
479
- * Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
480
- *
481
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
482
- * @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
483
- */
484
- getControlStateHandler: function(oControl) {
485
- var aInternalControlStateHandler = [],
486
- aCustomControlStateHandler = [];
487
- if (oControl) {
488
- for (var sType in _mControlStateHandlerMap) {
489
- if (oControl.isA(sType)) {
490
- // avoid direct manipulation of internal _mControlStateHandlerMap
491
- aInternalControlStateHandler.push(Object.assign({}, _mControlStateHandlerMap[sType]));
492
- break;
493
- }
494
- }
495
- }
496
- this.base.viewState.adaptControlStateHandler(oControl, aCustomControlStateHandler);
497
- return aInternalControlStateHandler.concat(aCustomControlStateHandler);
498
- },
499
-
500
- /**
501
- * This function should add all controls for given view that should be considered for the state handling to the provided control array.
502
- *
503
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
504
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
505
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
506
- * @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
507
- * @protected
508
- */
509
- adaptStateControls: function(aCollectedControls) {
510
- // to be overridden if needed
511
- },
512
-
513
- /**
514
- * Returns the key to be used for given control.
515
- *
516
- * @param {sap.ui.base.ManagedObject} oControl The control to get state key for
517
- * @returns {string} The key to be used for storing the controls state
518
- */
519
- getStateKey: function(oControl) {
520
- return this.getView().getLocalId(oControl.getId()) || oControl.getId();
521
- },
522
-
523
- /**
524
- * Retrieve the view state of this extensions view.
525
- * When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
526
- *
527
- * @returns {Promise} A promise resolving the view state
528
- *
529
- * @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
530
- * @public
531
- */
532
- retrieveViewState: function() {
533
- var that = this;
534
- ++that._iRetrievingStateCounter;
535
- return that._pInitialStateApplied
536
- .then(function() {
537
- return that.collectResults(that.base.viewState.adaptStateControls);
538
- })
539
- .then(function(aControls) {
540
- return Promise.all(
541
- aControls
542
- .filter(function(oControl) {
543
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
544
- })
545
- .map(function(oControl) {
546
- return that.retrieveControlState(oControl).then(function(vResult) {
547
- return {
548
- key: that.getStateKey(oControl),
549
- value: vResult
550
- };
551
- });
552
- })
553
- );
554
- })
555
- .then(function(aResolvedStates) {
556
- return aResolvedStates.reduce(function(oStates, mState) {
557
- var oCurrentState = {};
558
- oCurrentState[mState.key] = mState.value;
559
- return mergeObjects(oStates, oCurrentState);
560
- }, {});
561
- })
562
- .then(function(oViewState) {
563
- return Promise.resolve(that._retrieveAdditionalStates()).then(function(mAdditionalStates) {
564
- if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
565
- oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
566
- }
567
- return oViewState;
568
- });
569
- })
570
- .finally(function() {
571
- --that._iRetrievingStateCounter;
572
- })
573
- .then(function(oViewState) {
574
- return that._iRetrievingStateCounter === 0 ? oViewState : undefined;
575
- });
576
- },
577
-
578
- /**
579
- * Extend the map of additional states (not control bound) to be added to the current view state of the given view.
580
- *
581
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
582
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
583
- *
584
- * @param {object} mAdditionalStates The additional state
585
- *
586
- * @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
587
- * @protected
588
- */
589
- retrieveAdditionalStates: function(mAdditionalStates) {
590
- // to be overridden if needed
591
- },
592
-
593
- /**
594
- * Returns a map of additional states (not control bound) to be added to the current view state of the given view.
595
- *
596
- * @returns {object | Promise<object>} Additional view states
597
- */
598
- _retrieveAdditionalStates: function() {
599
- var mAdditionalStates = {};
600
- this.base.viewState.retrieveAdditionalStates(mAdditionalStates);
601
- return mAdditionalStates;
602
- },
603
-
604
- /**
605
- * Returns the current state for the given control.
606
- *
607
- * @param {sap.ui.base.ManagedObject} oControl The object to get the state for
608
- * @returns {Promise<object>} The state for the given control
609
- */
610
- retrieveControlState: function(oControl) {
611
- var aControlStateHandlers = this.getControlStateHandler(oControl);
612
- return Promise.all(
613
- aControlStateHandlers.map(function(mControlStateHandler) {
614
- if (typeof mControlStateHandler.retrieve !== "function") {
615
- throw new Error(
616
- "controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName()
617
- );
618
- }
619
- return mControlStateHandler.retrieve.call(this, oControl);
620
- })
621
- ).then(function(aStates) {
622
- return aStates.reduce(function(oFinalState, oCurrentState) {
623
- return mergeObjects(oFinalState, oCurrentState);
624
- }, {});
625
- });
626
- },
627
-
628
- /**
629
- * Defines whether the view state should only be applied once initially.
630
- *
631
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
632
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
633
- *
634
- * Important:
635
- * You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
636
- *
637
- * @returns {boolean} If <code>true</code>, only the initial view state is applied once,
638
- * else any new view state is also applied on follow-up calls (default)
639
- *
640
- * @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
641
- * @protected
642
- */
643
- applyInitialStateOnly: function() {
644
- return true;
645
- },
646
- /**
647
- * Applies the given view state to this extensions view.
648
- *
649
- * @param {object} oViewState The view state to apply (can be undefined)
650
- * @param {object} oNavParameter The current navigation parameter
651
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
652
- * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
653
- * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
654
- * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
655
- *
656
- * @returns {Promise} Promise for async state handling
657
- *
658
- * @alias sap.fe.core.controllerextensions.ViewState#applyViewState
659
- * @public
660
- */
661
- applyViewState: function(oViewState, oNavParameter) {
662
- var that = this;
663
- if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
664
- return Promise.resolve();
665
- }
666
- return this.collectResults(this.base.viewState.onBeforeStateApplied)
667
- .then(function() {
668
- return that.collectResults(that.base.viewState.adaptStateControls);
669
- })
670
- .then(function(aControls) {
671
- var oPromiseChain = Promise.resolve();
672
- aControls
673
- .filter(function(oControl) {
674
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
675
- })
676
- .forEach(function(oControl) {
677
- var sKey = that.getStateKey(oControl);
678
- oPromiseChain = oPromiseChain.then(
679
- that.applyControlState.bind(that, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter)
680
- );
681
- });
682
- return oPromiseChain;
683
- })
684
- .then(function() {
685
- if (oNavParameter.navigationType === NavType.iAppState) {
686
- return that.collectResults(
687
- that.base.viewState.applyAdditionalStates,
688
- oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined
689
- );
690
- } else {
691
- return that.collectResults(that.base.viewState.applyNavigationParameters, oNavParameter);
692
- }
693
- })
694
- .finally(function() {
695
- return that.collectResults(that.base.viewState.onAfterStateApplied).then(that._setInitialStateApplied.bind(that));
696
- });
697
- },
698
-
699
- _checkIfVariantIdIsAvailable: function(oVM, sVariantId) {
700
- var aVariants = oVM.getVariants(),
701
- bIsControlStateVariantAvailable = false;
702
- aVariants.forEach(function(oVariant) {
703
- if (oVariant.key === sVariantId) {
704
- bIsControlStateVariantAvailable = true;
705
- }
706
- });
707
- return bIsControlStateVariantAvailable;
708
- },
709
-
710
- _setInitialStateApplied: function() {
711
- if (this._pInitialStateAppliedResolve) {
712
- var pInitialStateAppliedResolve = this._pInitialStateAppliedResolve;
713
- delete this._pInitialStateAppliedResolve;
714
- pInitialStateAppliedResolve();
715
- }
716
- },
717
-
718
- _getInitialStateApplied: function() {
719
- return !this._pInitialStateAppliedResolve;
720
- },
721
-
722
- /**
723
- * Hook to react before a state for given view is applied.
724
- *
725
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
726
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
727
- *
728
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
729
- *
730
- * @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
731
- * @protected
732
- */
733
- onBeforeStateApplied: function(aPromises) {},
734
-
735
- /**
736
- * Hook to react when state for given view was applied.
737
- *
738
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
739
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
740
- *
741
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
742
- *
743
- * @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
744
- * @protected
745
- */
746
- onAfterStateApplied: function(aPromises) {},
747
-
748
- /**
749
- * Applying additional, not control related, states - is called only if navigation type is iAppState.
750
- *
751
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
752
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
753
- *
754
- * @param {object} oViewState The current view state
755
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
756
- *
757
- * @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
758
- * @protected
759
- */
760
- applyAdditionalStates: function(oViewState, aPromises) {
761
- // to be overridden if needed
762
- },
763
-
764
- /**
765
- * Apply navigation parameters - is called only if navigation type is not iAppState.
766
- *
767
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
768
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
769
- *
770
- * @param {object} oNavParameter The current navigation parameter
771
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
772
- * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
773
- * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
774
- * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
775
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
776
- *
777
- * @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
778
- * @protected
779
- */
780
- applyNavigationParameters: function(oNavParameter, aPromises) {
781
- // to be overridden if needed
782
- },
783
-
784
- /**
785
- * Applying the given state to the given control.
786
- *
787
- * @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
788
- * @param {object} oControlState The state for the given control
789
- * @param {object} oNavParameters The current navigation parameters
790
- * @returns {any} Return a promise for async state handling
791
- */
792
- applyControlState: function(oControl, oControlState, oNavParameters) {
793
- var aControlStateHandlers = this.getControlStateHandler(oControl),
794
- oPromiseChain = Promise.resolve(),
795
- that = this;
796
- aControlStateHandlers.forEach(function(mControlStateHandler) {
797
- if (typeof mControlStateHandler.apply !== "function") {
798
- throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
799
- }
800
- oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(that, oControl, oControlState, oNavParameters));
801
- });
802
- return oPromiseChain;
803
- }
804
- });
805
-
806
- return ViewState;
807
- }
808
- );
5
+ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/base/Log", "sap/base/util/merge", "sap/ui/fl/apply/api/ControlVariantApplyAPI", "sap/ui/mdc/p13n/StateUtil", "sap/fe/navigation/library", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/controllerextensions/ControllerExtensionMetadata"], function (ControllerExtension, OverrideExecution, Log, mergeObjects, ControlVariantApplyAPI, StateUtil, NavLibrary, CommonUtils, KeepAliveHelper, ModelHelper, ClassSupport, ControllerExtensionMetadata) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _class, _class2;
9
+
10
+ var UI5Class = ClassSupport.UI5Class;
11
+ var Public = ClassSupport.Public;
12
+ var Private = ClassSupport.Private;
13
+ var Final = ClassSupport.Final;
14
+ var Extensible = ClassSupport.Extensible;
15
+
16
+ function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
17
+
18
+ function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
19
+
20
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
21
+
22
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
23
+
24
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
+
26
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
27
+
28
+ // additionalStates are stored next to control IDs, so name clash avoidance needed. Fortunately IDs have restrictions:
29
+ // "Allowed is a sequence of characters (capital/lowercase), digits, underscores, dashes, points and/or colons."
30
+ // Therefore adding a symbol like # or @
31
+ var ADDITIONAL_STATES_KEY = "#additionalStates",
32
+ NavType = NavLibrary.NavType; ///////////////////////////////////////////////////////////////////
33
+ // methods to retrieve & apply states for the different controls //
34
+ ///////////////////////////////////////////////////////////////////
35
+
36
+ var _mControlStateHandlerMap = {
37
+ "sap.ui.fl.variants.VariantManagement": {
38
+ retrieve: function (oVM) {
39
+ return {
40
+ "variantId": oVM.getCurrentVariantKey()
41
+ };
42
+ },
43
+ apply: function (oVM, oControlState) {
44
+ if (oControlState && oControlState.variantId !== undefined && oControlState.variantId !== oVM.getCurrentVariantKey()) {
45
+ var sVariantReference = this._checkIfVariantIdIsAvailable(oVM, oControlState.variantId) ? oControlState.variantId : oVM.getStandardVariantKey();
46
+ return ControlVariantApplyAPI.activateVariant({
47
+ element: oVM,
48
+ variantReference: sVariantReference
49
+ });
50
+ }
51
+ }
52
+ },
53
+ "sap.m.IconTabBar": {
54
+ retrieve: function (oTabBar) {
55
+ return {
56
+ selectedKey: oTabBar.getSelectedKey()
57
+ };
58
+ },
59
+ apply: function (oTabBar, oControlState) {
60
+ if (oControlState && oControlState.selectedKey) {
61
+ var oSelectedItem = oTabBar.getItems().find(function (oItem) {
62
+ return oItem.getKey() === oControlState.selectedKey;
63
+ });
64
+
65
+ if (oSelectedItem) {
66
+ oTabBar.setSelectedItem(oSelectedItem);
67
+ }
68
+ }
69
+ }
70
+ },
71
+ "sap.ui.mdc.FilterBar": {
72
+ retrieve: function (oFilterBar) {
73
+ return StateUtil.retrieveExternalState(oFilterBar).then(function (mFilterBarState) {
74
+ // remove sensitive or view state irrelevant fields
75
+ var aPropertiesInfo = oFilterBar.getPropertyInfoSet(),
76
+ mFilter = mFilterBarState.filter || {};
77
+ aPropertiesInfo.filter(function (oPropertyInfo) {
78
+ return mFilter[oPropertyInfo.path] && (oPropertyInfo.removeFromAppState || mFilter[oPropertyInfo.path].length === 0);
79
+ }).forEach(function (oPropertyInfo) {
80
+ delete mFilter[oPropertyInfo.path];
81
+ });
82
+ return mFilterBarState;
83
+ });
84
+ },
85
+ apply: function (oFilterBar, oControlState) {
86
+ if (oControlState) {
87
+ return StateUtil.applyExternalState(oFilterBar, oControlState);
88
+ }
89
+ }
90
+ },
91
+ "sap.ui.mdc.Table": {
92
+ retrieve: function (oTable) {
93
+ return StateUtil.retrieveExternalState(oTable);
94
+ },
95
+ apply: function (oTable, oControlState) {
96
+ if (oControlState) {
97
+ return StateUtil.applyExternalState(oTable, oControlState);
98
+ }
99
+ },
100
+ refreshBinding: function (oTable) {
101
+ var oTableBinding = oTable.getRowBinding();
102
+
103
+ if (oTableBinding) {
104
+ var oRootBinding = oTableBinding.getRootBinding();
105
+
106
+ if (oRootBinding === oTableBinding) {
107
+ // absolute binding
108
+ oTableBinding.refresh();
109
+ } else {
110
+ // relative binding
111
+ var oHeaderContext = oTableBinding.getHeaderContext();
112
+ var sGroupId = oTableBinding.getGroupId();
113
+
114
+ if (oHeaderContext) {
115
+ oHeaderContext.requestSideEffects([{
116
+ $NavigationPropertyPath: ""
117
+ }], sGroupId);
118
+ }
119
+ }
120
+ } else {
121
+ Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
122
+ }
123
+ }
124
+ },
125
+ "sap.uxap.ObjectPageLayout": {
126
+ retrieve: function (oOPLayout) {
127
+ return {
128
+ selectedSection: oOPLayout.getSelectedSection()
129
+ };
130
+ },
131
+ apply: function (oOPLayout, oControlState) {
132
+ oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
133
+ },
134
+ refreshBinding: function (oOPLayout) {
135
+ var oBindingContext = oOPLayout.getBindingContext();
136
+ var oBinding = oBindingContext && oBindingContext.getBinding();
137
+
138
+ if (oBinding) {
139
+ var sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
140
+ var sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
141
+
142
+ if (sStrategy === "self") {
143
+ // Refresh main context and 1-1 navigation properties or OP
144
+ var oModel = oBindingContext.getModel(),
145
+ oMetaModel = oModel.getMetaModel(),
146
+ oNavigationProperties = CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
147
+ $kind: "NavigationProperty"
148
+ }) || {},
149
+ aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function (aPrev, sNavProp) {
150
+ if (oNavigationProperties[sNavProp].$isCollection !== true) {
151
+ aPrev.push({
152
+ $NavigationPropertyPath: sNavProp
153
+ });
154
+ }
155
+
156
+ return aPrev;
157
+ }, []),
158
+ aProperties = [{
159
+ $PropertyPath: "*"
160
+ }],
161
+ sGroupId = oBinding.getGroupId();
162
+ oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
163
+ } else if (sStrategy === "includingDependents") {
164
+ // Complete refresh
165
+ oBinding.refresh();
166
+ }
167
+ } else {
168
+ Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
169
+ }
170
+ }
171
+ },
172
+ "sap.fe.macros.table.QuickFilterContainer": {
173
+ retrieve: function (oQuickFilter) {
174
+ return {
175
+ selectedKey: oQuickFilter.getSelectorKey()
176
+ };
177
+ },
178
+ apply: function (oQuickFilter, oControlState) {
179
+ oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
180
+ }
181
+ },
182
+ "sap.m.SegmentedButton": {
183
+ retrieve: function (oSegmentedButton) {
184
+ return {
185
+ selectedKey: oSegmentedButton.getSelectedKey()
186
+ };
187
+ },
188
+ apply: function (oSegmentedButton, oControlState) {
189
+ oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
190
+ }
191
+ },
192
+ "sap.m.Select": {
193
+ retrieve: function (oSelect) {
194
+ return {
195
+ selectedKey: oSelect.getSelectedKey()
196
+ };
197
+ },
198
+ apply: function (oSelect, oControlState) {
199
+ oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
200
+ }
201
+ },
202
+ "sap.f.DynamicPage": {
203
+ retrieve: function (oDynamicPage) {
204
+ return {
205
+ headerExpanded: oDynamicPage.getHeaderExpanded()
206
+ };
207
+ },
208
+ apply: function (oDynamicPage, oControlState) {
209
+ oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
210
+ }
211
+ },
212
+ "sap.ui.core.mvc.View": {
213
+ retrieve: function (oView) {
214
+ var oController = oView.getController();
215
+
216
+ if (oController && oController.viewState) {
217
+ return oController.viewState.retrieveViewState(oController.viewState);
218
+ }
219
+
220
+ return {};
221
+ },
222
+ apply: function (oView, oControlState, oNavParameters) {
223
+ var oController = oView.getController();
224
+
225
+ if (oController && oController.viewState) {
226
+ return oController.viewState.applyViewState(oControlState, oNavParameters);
227
+ }
228
+ },
229
+ refreshBinding: function (oView) {
230
+ var oController = oView.getController();
231
+
232
+ if (oController && oController.viewState) {
233
+ return oController.viewState.refreshViewBindings();
234
+ }
235
+ }
236
+ },
237
+ "sap.ui.core.ComponentContainer": {
238
+ retrieve: function (oComponentContainer) {
239
+ var oComponent = oComponentContainer.getComponentInstance();
240
+
241
+ if (oComponent) {
242
+ return this.retrieveControlState(oComponent.getRootControl());
243
+ }
244
+
245
+ return {};
246
+ },
247
+ apply: function (oComponentContainer, oControlState, oNavParameters) {
248
+ var oComponent = oComponentContainer.getComponentInstance();
249
+
250
+ if (oComponent) {
251
+ return this.applyControlState(oComponent.getRootControl(), oControlState, oNavParameters);
252
+ }
253
+ }
254
+ }
255
+ };
256
+ /**
257
+ * A controller extension offering hooks for state handling
258
+ *
259
+ * If you need to maintain a specific state for your application, you can use the controller extension.
260
+ *
261
+ * @hideconstructor
262
+ * @public
263
+ * @since 1.85.0
264
+ */
265
+
266
+ var ViewState = (_dec = UI5Class("sap.fe.core.controllerextensions.ViewState", ControllerExtensionMetadata), _dec2 = Extensible(OverrideExecution.After), _dec3 = Extensible(OverrideExecution.After), _dec4 = Extensible(OverrideExecution.After), _dec5 = Extensible(OverrideExecution.After), _dec6 = Extensible(OverrideExecution.After), _dec7 = Extensible(OverrideExecution.After), _dec8 = Extensible(OverrideExecution.After), _dec9 = Extensible(OverrideExecution.Instead), _dec10 = Extensible(OverrideExecution.After), _dec11 = Extensible(OverrideExecution.After), _dec12 = Extensible(OverrideExecution.After), _dec13 = Extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
267
+ _inherits(ViewState, _ControllerExtension);
268
+
269
+ /**
270
+ * Constructor.
271
+ */
272
+ function ViewState() {
273
+ var _this;
274
+
275
+ _this = _ControllerExtension.call(this) || this;
276
+ _this._iRetrievingStateCounter = 0;
277
+ _this._pInitialStateApplied = new Promise(function (resolve) {
278
+ _this._pInitialStateAppliedResolve = resolve;
279
+ });
280
+ return _this;
281
+ }
282
+ /**
283
+ * @private
284
+ * @name sap.fe.core.controllerextensions.ViewState.getMetadata
285
+ * @function
286
+ */
287
+
288
+ /**
289
+ * @private
290
+ * @name sap.fe.core.controllerextensions.ViewState.extend
291
+ * @function
292
+ */
293
+
294
+
295
+ var _proto = ViewState.prototype;
296
+
297
+ _proto.refreshViewBindings = function refreshViewBindings() {
298
+ var _this2 = this;
299
+
300
+ return this.collectResults(this.base.viewState.adaptBindingRefreshControls).then(function (aControls) {
301
+ var oPromiseChain = Promise.resolve();
302
+ aControls.filter(function (oControl) {
303
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
304
+ }).forEach(function (oControl) {
305
+ oPromiseChain = oPromiseChain.then(_this2.refreshControlBinding.bind(_this2, oControl));
306
+ });
307
+ return oPromiseChain;
308
+ });
309
+ }
310
+ /**
311
+ * This function should add all controls relevant for refreshing to the provided control array.
312
+ *
313
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
314
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
315
+ * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
316
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
317
+ * @protected
318
+ */
319
+ ;
320
+
321
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
322
+ adaptBindingRefreshControls = function adaptBindingRefreshControls(aCollectedControls) {// to be overriden
323
+ };
324
+
325
+ _proto.refreshControlBinding = function refreshControlBinding(oControl) {
326
+ var oControlRefreshBindingHandler = this.getControlRefreshBindingHandler(oControl);
327
+ var oPromiseChain = Promise.resolve();
328
+
329
+ if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
330
+ Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
331
+ } else {
332
+ oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(this, oControl));
333
+ }
334
+
335
+ return oPromiseChain;
336
+ }
337
+ /**
338
+ * Returns a map of <code>refreshBinding</code> function for a certain control.
339
+ *
340
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
341
+ * @returns {object} A plain object with one function: <code>refreshBinding</code>
342
+ */
343
+ ;
344
+
345
+ _proto.getControlRefreshBindingHandler = function getControlRefreshBindingHandler(oControl) {
346
+ var oRefreshBindingHandler = {};
347
+
348
+ if (oControl) {
349
+ for (var sType in _mControlStateHandlerMap) {
350
+ if (oControl.isA(sType)) {
351
+ // pass only the refreshBinding handler in an object so that :
352
+ // 1. Application has access only to refreshBinding and not apply and reterive at this stage
353
+ // 2. Application modifications to the object will be reflected here (as we pass by reference)
354
+ oRefreshBindingHandler["refreshBinding"] = _mControlStateHandlerMap[sType].refreshBinding || {};
355
+ break;
356
+ }
357
+ }
358
+ }
359
+
360
+ this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
361
+ return oRefreshBindingHandler;
362
+ }
363
+ /**
364
+ * Customize the <code>refreshBinding</code> function for a certain control.
365
+ *
366
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
367
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
368
+ *
369
+ * @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
370
+ * @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
371
+ *
372
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
373
+ * @protected
374
+ */
375
+ ;
376
+
377
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
378
+ adaptBindingRefreshHandler = function adaptBindingRefreshHandler(oControl, oControlHandler) {// to be overriden
379
+ }
380
+ /**
381
+ * Called when the application is suspended due to keep-alive mode.
382
+ *
383
+ * @alias sap.fe.core.controllerextensions.ViewState#onSuspend
384
+ * @public
385
+ */
386
+ ;
387
+
388
+ _proto.onSuspend = function onSuspend() {// to be overriden
389
+ }
390
+ /**
391
+ * Called when the application is restored due to keep-alive mode.
392
+ *
393
+ * @alias sap.fe.core.controllerextensions.ViewState#onRestore
394
+ * @public
395
+ */
396
+ ;
397
+
398
+ _proto.onRestore = function onRestore() {// to be overriden
399
+ }
400
+ /**
401
+ * Destructor method for objects.
402
+ */
403
+ ;
404
+
405
+ _proto.destroy = function destroy() {
406
+ delete this._pInitialStateAppliedResolve;
407
+
408
+ _get(_getPrototypeOf(ViewState.prototype), "destroy", this).call(this);
409
+ }
410
+ /**
411
+ * Helper function to enable multi override. It is adding an additional parameter (array) to the provided
412
+ * function (and its parameters), that will be evaluated via <code>Promise.all</code>.
413
+ *
414
+ * @param {Function} fnCall The function to be called
415
+ * @param args
416
+ * @returns {Promise} A promise to be resolved with the result of all overrides
417
+ */
418
+ ;
419
+
420
+ _proto.collectResults = function collectResults(fnCall) {
421
+ var aResults = [];
422
+
423
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
424
+ args[_key - 1] = arguments[_key];
425
+ }
426
+
427
+ args.push(aResults);
428
+ fnCall.apply(this, args);
429
+ return Promise.all(aResults);
430
+ }
431
+ /**
432
+ * Customize the <code>retrieve</code> and <code>apply</code> functions for a certain control.
433
+ *
434
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
435
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
436
+ *
437
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
438
+ * @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
439
+ *
440
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
441
+ * @protected
442
+ */
443
+ ;
444
+
445
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
446
+ adaptControlStateHandler = function adaptControlStateHandler(oControl, aControlHandler) {// to be overridden if needed
447
+ }
448
+ /**
449
+ * Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
450
+ *
451
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
452
+ * @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
453
+ */
454
+ ;
455
+
456
+ _proto.getControlStateHandler = function getControlStateHandler(oControl) {
457
+ var aInternalControlStateHandler = [],
458
+ aCustomControlStateHandler = [];
459
+
460
+ if (oControl) {
461
+ for (var sType in _mControlStateHandlerMap) {
462
+ if (oControl.isA(sType)) {
463
+ // avoid direct manipulation of internal _mControlStateHandlerMap
464
+ aInternalControlStateHandler.push(Object.assign({}, _mControlStateHandlerMap[sType]));
465
+ break;
466
+ }
467
+ }
468
+ }
469
+
470
+ this.base.viewState.adaptControlStateHandler(oControl, aCustomControlStateHandler);
471
+ return aInternalControlStateHandler.concat(aCustomControlStateHandler);
472
+ }
473
+ /**
474
+ * This function should add all controls for given view that should be considered for the state handling to the provided control array.
475
+ *
476
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
477
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
478
+ * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
479
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
480
+ * @protected
481
+ */
482
+ ;
483
+
484
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
485
+ adaptStateControls = function adaptStateControls(aCollectedControls) {// to be overridden if needed
486
+ }
487
+ /**
488
+ * Returns the key to be used for given control.
489
+ *
490
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state key for
491
+ * @returns {string} The key to be used for storing the controls state
492
+ */
493
+ ;
494
+
495
+ _proto.getStateKey = function getStateKey(oControl) {
496
+ return this.getView().getLocalId(oControl.getId()) || oControl.getId();
497
+ }
498
+ /**
499
+ * Retrieve the view state of this extensions view.
500
+ * When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
501
+ *
502
+ * @returns {Promise} A promise resolving the view state
503
+ *
504
+ * @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
505
+ * @public
506
+ */
507
+ ;
508
+
509
+ _proto.retrieveViewState = function retrieveViewState() {
510
+ var _this3 = this;
511
+
512
+ ++this._iRetrievingStateCounter;
513
+ return this._pInitialStateApplied.then(function () {
514
+ return _this3.collectResults(_this3.base.viewState.adaptStateControls);
515
+ }).then(function (aControls) {
516
+ return Promise.all(aControls.filter(function (oControl) {
517
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
518
+ }).map(function (oControl) {
519
+ return _this3.retrieveControlState(oControl).then(function (vResult) {
520
+ return {
521
+ key: _this3.getStateKey(oControl),
522
+ value: vResult
523
+ };
524
+ });
525
+ }));
526
+ }).then(function (aResolvedStates) {
527
+ return aResolvedStates.reduce(function (oStates, mState) {
528
+ var oCurrentState = {};
529
+ oCurrentState[mState.key] = mState.value;
530
+ return mergeObjects(oStates, oCurrentState);
531
+ }, {});
532
+ }).then(function (oViewState) {
533
+ return Promise.resolve(_this3._retrieveAdditionalStates()).then(function (mAdditionalStates) {
534
+ if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
535
+ oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
536
+ }
537
+
538
+ return oViewState;
539
+ });
540
+ }).finally(function () {
541
+ --_this3._iRetrievingStateCounter;
542
+ }).then(function (oViewState) {
543
+ return _this3._iRetrievingStateCounter === 0 ? oViewState : undefined;
544
+ });
545
+ }
546
+ /**
547
+ * Extend the map of additional states (not control bound) to be added to the current view state of the given view.
548
+ *
549
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
550
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
551
+ *
552
+ * @param {object} mAdditionalStates The additional state
553
+ *
554
+ * @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
555
+ * @protected
556
+ */
557
+ ;
558
+
559
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
560
+ retrieveAdditionalStates = function retrieveAdditionalStates(mAdditionalStates) {// to be overridden if needed
561
+ }
562
+ /**
563
+ * Returns a map of additional states (not control bound) to be added to the current view state of the given view.
564
+ *
565
+ * @returns {object | Promise<object>} Additional view states
566
+ */
567
+ ;
568
+
569
+ _proto._retrieveAdditionalStates = function _retrieveAdditionalStates() {
570
+ var mAdditionalStates = {};
571
+ this.base.viewState.retrieveAdditionalStates(mAdditionalStates);
572
+ return mAdditionalStates;
573
+ }
574
+ /**
575
+ * Returns the current state for the given control.
576
+ *
577
+ * @param {sap.ui.base.ManagedObject} oControl The object to get the state for
578
+ * @returns {Promise<object>} The state for the given control
579
+ */
580
+ ;
581
+
582
+ _proto.retrieveControlState = function retrieveControlState(oControl) {
583
+ var _this4 = this;
584
+
585
+ var aControlStateHandlers = this.getControlStateHandler(oControl);
586
+ return Promise.all(aControlStateHandlers.map(function (mControlStateHandler) {
587
+ if (typeof mControlStateHandler.retrieve !== "function") {
588
+ throw new Error("controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName());
589
+ }
590
+
591
+ return mControlStateHandler.retrieve.call(_this4, oControl);
592
+ })).then(function (aStates) {
593
+ return aStates.reduce(function (oFinalState, oCurrentState) {
594
+ return mergeObjects(oFinalState, oCurrentState);
595
+ }, {});
596
+ });
597
+ }
598
+ /**
599
+ * Defines whether the view state should only be applied once initially.
600
+ *
601
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
602
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
603
+ *
604
+ * Important:
605
+ * You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
606
+ *
607
+ * @returns {boolean} If <code>true</code>, only the initial view state is applied once,
608
+ * else any new view state is also applied on follow-up calls (default)
609
+ *
610
+ * @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
611
+ * @protected
612
+ */
613
+ ;
614
+
615
+ _proto.applyInitialStateOnly = function applyInitialStateOnly() {
616
+ return true;
617
+ }
618
+ /**
619
+ * Applies the given view state to this extensions view.
620
+ *
621
+ * @param {object} oViewState The view state to apply (can be undefined)
622
+ * @param {object} oNavParameter The current navigation parameter
623
+ * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
624
+ * @param {object} oNavParameter.selectionVariant The selectionVariant from the navigation
625
+ * @param {object} oNavParameter.selectionVariantDefaults The selectionVariant defaults from the navigation
626
+ * @param {boolean} oNavParameter.requiresStandardVariant Defines whether standard variant must be used in VM
627
+ *
628
+ * @returns {Promise} Promise for async state handling
629
+ *
630
+ * @alias sap.fe.core.controllerextensions.ViewState#applyViewState
631
+ * @public
632
+ */
633
+ ;
634
+
635
+ _proto.applyViewState = function applyViewState(oViewState, oNavParameter) {
636
+ var _this5 = this;
637
+
638
+ if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
639
+ return Promise.resolve();
640
+ }
641
+
642
+ return this.collectResults(this.base.viewState.onBeforeStateApplied).then(function () {
643
+ return _this5.collectResults(_this5.base.viewState.adaptStateControls);
644
+ }).then(function (aControls) {
645
+ var oPromiseChain = Promise.resolve();
646
+ aControls.filter(function (oControl) {
647
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
648
+ }).forEach(function (oControl) {
649
+ var sKey = _this5.getStateKey(oControl);
650
+
651
+ oPromiseChain = oPromiseChain.then(_this5.applyControlState.bind(_this5, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter));
652
+ });
653
+ return oPromiseChain;
654
+ }).then(function () {
655
+ if (oNavParameter.navigationType === NavType.iAppState) {
656
+ return _this5.collectResults(_this5.base.viewState.applyAdditionalStates, oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined);
657
+ } else {
658
+ return _this5.collectResults(_this5.base.viewState.applyNavigationParameters, oNavParameter);
659
+ }
660
+ }).finally(function () {
661
+ return _this5.collectResults(_this5.base.viewState.onAfterStateApplied).then(_this5._setInitialStateApplied.bind(_this5));
662
+ });
663
+ };
664
+
665
+ _proto._checkIfVariantIdIsAvailable = function _checkIfVariantIdIsAvailable(oVM, sVariantId) {
666
+ var aVariants = oVM.getVariants();
667
+ var bIsControlStateVariantAvailable = false;
668
+ aVariants.forEach(function (oVariant) {
669
+ if (oVariant.key === sVariantId) {
670
+ bIsControlStateVariantAvailable = true;
671
+ }
672
+ });
673
+ return bIsControlStateVariantAvailable;
674
+ };
675
+
676
+ _proto._setInitialStateApplied = function _setInitialStateApplied() {
677
+ if (this._pInitialStateAppliedResolve) {
678
+ var pInitialStateAppliedResolve = this._pInitialStateAppliedResolve;
679
+ delete this._pInitialStateAppliedResolve;
680
+ pInitialStateAppliedResolve();
681
+ }
682
+ };
683
+
684
+ _proto._getInitialStateApplied = function _getInitialStateApplied() {
685
+ return !this._pInitialStateAppliedResolve;
686
+ }
687
+ /**
688
+ * Hook to react before a state for given view is applied.
689
+ *
690
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
691
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
692
+ *
693
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
694
+ *
695
+ * @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
696
+ * @protected
697
+ */
698
+ ;
699
+
700
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
701
+ onBeforeStateApplied = function onBeforeStateApplied(aPromises) {// to be overriden
702
+ }
703
+ /**
704
+ * Hook to react when state for given view was applied.
705
+ *
706
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
707
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
708
+ *
709
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
710
+ *
711
+ * @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
712
+ * @protected
713
+ */
714
+ ;
715
+
716
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
717
+ onAfterStateApplied = function onAfterStateApplied(aPromises) {// to be overriden
718
+ }
719
+ /**
720
+ * Applying additional, not control related, states - is called only if navigation type is iAppState.
721
+ *
722
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
723
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
724
+ *
725
+ * @param {object} oViewState The current view state
726
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
727
+ *
728
+ * @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
729
+ * @protected
730
+ */
731
+ ;
732
+
733
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
734
+ applyAdditionalStates = function applyAdditionalStates(oViewState, aPromises) {// to be overridden if needed
735
+ }
736
+ /**
737
+ * Apply navigation parameters - is called only if navigation type is not iAppState.
738
+ *
739
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
740
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
741
+ *
742
+ * @param {object} oNavParameter The current navigation parameter
743
+ * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
744
+ * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
745
+ * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
746
+ * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
747
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
748
+ *
749
+ * @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
750
+ * @protected
751
+ */
752
+ ;
753
+
754
+ _proto.applyNavigationParameters = function applyNavigationParameters( // eslint-disable-next-line @typescript-eslint/no-unused-vars
755
+ oNavParameter, // eslint-disable-next-line @typescript-eslint/no-unused-vars
756
+ aPromises) {// to be overridden if needed
757
+ }
758
+ /**
759
+ * Applying the given state to the given control.
760
+ *
761
+ * @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
762
+ * @param {object} oControlState The state for the given control
763
+ * @param {object} [oNavParameters] The current navigation parameters
764
+ * @returns {any} Return a promise for async state handling
765
+ */
766
+ ;
767
+
768
+ _proto.applyControlState = function applyControlState(oControl, oControlState, oNavParameters) {
769
+ var _this6 = this;
770
+
771
+ var aControlStateHandlers = this.getControlStateHandler(oControl);
772
+ var oPromiseChain = Promise.resolve();
773
+ aControlStateHandlers.forEach(function (mControlStateHandler) {
774
+ if (typeof mControlStateHandler.apply !== "function") {
775
+ throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
776
+ }
777
+
778
+ oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(_this6, oControl, oControlState, oNavParameters));
779
+ });
780
+ return oPromiseChain;
781
+ };
782
+
783
+ _proto.getInterface = function getInterface() {
784
+ return this;
785
+ };
786
+
787
+ return ViewState;
788
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "refreshViewBindings", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshViewBindings"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshControls", [Public, _dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "refreshControlBinding", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshControlBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlRefreshBindingHandler", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlRefreshBindingHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshHandler", [Public, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onSuspend", [Public, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onSuspend"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRestore", [Public, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRestore"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "collectResults", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "collectResults"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptControlStateHandler", [Public, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlStateHandler", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptStateControls", [Public, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptStateControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getStateKey", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getStateKey"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveViewState", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveAdditionalStates", [Public, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveControlState", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveControlState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyInitialStateOnly", [Public, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "applyInitialStateOnly"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyViewState", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "applyViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable", [Private], Object.getOwnPropertyDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeStateApplied", [Public, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterStateApplied", [Public, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyAdditionalStates", [Public, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "applyAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyNavigationParameters", [Public, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "applyNavigationParameters"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyControlState", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "applyControlState"), _class2.prototype)), _class2)) || _class);
789
+ return ViewState;
790
+ }, false);
791
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJuYW1lcyI6WyJBRERJVElPTkFMX1NUQVRFU19LRVkiLCJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIl9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCIsInJldHJpZXZlIiwib1ZNIiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJhcHBseSIsIm9Db250cm9sU3RhdGUiLCJ2YXJpYW50SWQiLCJ1bmRlZmluZWQiLCJzVmFyaWFudFJlZmVyZW5jZSIsIl9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUiLCJnZXRTdGFuZGFyZFZhcmlhbnRLZXkiLCJDb250cm9sVmFyaWFudEFwcGx5QVBJIiwiYWN0aXZhdGVWYXJpYW50IiwiZWxlbWVudCIsInZhcmlhbnRSZWZlcmVuY2UiLCJvVGFiQmFyIiwic2VsZWN0ZWRLZXkiLCJnZXRTZWxlY3RlZEtleSIsIm9TZWxlY3RlZEl0ZW0iLCJnZXRJdGVtcyIsImZpbmQiLCJvSXRlbSIsImdldEtleSIsInNldFNlbGVjdGVkSXRlbSIsIm9GaWx0ZXJCYXIiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ0aGVuIiwibUZpbHRlckJhclN0YXRlIiwiYVByb3BlcnRpZXNJbmZvIiwiZ2V0UHJvcGVydHlJbmZvU2V0IiwibUZpbHRlciIsImZpbHRlciIsIm9Qcm9wZXJ0eUluZm8iLCJwYXRoIiwicmVtb3ZlRnJvbUFwcFN0YXRlIiwibGVuZ3RoIiwiZm9yRWFjaCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsIm9UYWJsZSIsInJlZnJlc2hCaW5kaW5nIiwib1RhYmxlQmluZGluZyIsImdldFJvd0JpbmRpbmciLCJvUm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInJlZnJlc2giLCJvSGVhZGVyQ29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJzR3JvdXBJZCIsImdldEdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIkxvZyIsImluZm8iLCJnZXRJZCIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYVByZXYiLCJzTmF2UHJvcCIsIiRpc0NvbGxlY3Rpb24iLCJwdXNoIiwiYVByb3BlcnRpZXMiLCIkUHJvcGVydHlQYXRoIiwiY29uY2F0Iiwib1F1aWNrRmlsdGVyIiwiZ2V0U2VsZWN0b3JLZXkiLCJzZXRTZWxlY3RvcktleSIsIm9TZWdtZW50ZWRCdXR0b24iLCJzZXRTZWxlY3RlZEtleSIsIm9TZWxlY3QiLCJvRHluYW1pY1BhZ2UiLCJoZWFkZXJFeHBhbmRlZCIsImdldEhlYWRlckV4cGFuZGVkIiwic2V0SGVhZGVyRXhwYW5kZWQiLCJvVmlldyIsIm9Db250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsInZpZXdTdGF0ZSIsInJldHJpZXZlVmlld1N0YXRlIiwib05hdlBhcmFtZXRlcnMiLCJhcHBseVZpZXdTdGF0ZSIsInJlZnJlc2hWaWV3QmluZGluZ3MiLCJvQ29tcG9uZW50Q29udGFpbmVyIiwib0NvbXBvbmVudCIsImdldENvbXBvbmVudEluc3RhbmNlIiwicmV0cmlldmVDb250cm9sU3RhdGUiLCJnZXRSb290Q29udHJvbCIsImFwcGx5Q29udHJvbFN0YXRlIiwiVmlld1N0YXRlIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJFeHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsIkluc3RlYWQiLCJfaVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIiLCJfcEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUiLCJjb2xsZWN0UmVzdWx0cyIsImJhc2UiLCJhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMiLCJhQ29udHJvbHMiLCJvUHJvbWlzZUNoYWluIiwib0NvbnRyb2wiLCJpc0EiLCJyZWZyZXNoQ29udHJvbEJpbmRpbmciLCJiaW5kIiwiYUNvbGxlY3RlZENvbnRyb2xzIiwib0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwib1JlZnJlc2hCaW5kaW5nSGFuZGxlciIsInNUeXBlIiwiYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIiLCJvQ29udHJvbEhhbmRsZXIiLCJvblN1c3BlbmQiLCJvblJlc3RvcmUiLCJkZXN0cm95IiwiZm5DYWxsIiwiYVJlc3VsdHMiLCJhcmdzIiwiYWxsIiwiYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyIiwiYUNvbnRyb2xIYW5kbGVyIiwiZ2V0Q29udHJvbFN0YXRlSGFuZGxlciIsImFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlciIsImFzc2lnbiIsImFkYXB0U3RhdGVDb250cm9scyIsImdldFN0YXRlS2V5IiwiZ2V0VmlldyIsImdldExvY2FsSWQiLCJtYXAiLCJ2UmVzdWx0Iiwia2V5IiwidmFsdWUiLCJhUmVzb2x2ZWRTdGF0ZXMiLCJvU3RhdGVzIiwibVN0YXRlIiwib0N1cnJlbnRTdGF0ZSIsIm1lcmdlT2JqZWN0cyIsIm9WaWV3U3RhdGUiLCJfcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwibUFkZGl0aW9uYWxTdGF0ZXMiLCJmaW5hbGx5IiwicmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwiYUNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwibUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJFcnJvciIsImNhbGwiLCJhU3RhdGVzIiwib0ZpbmFsU3RhdGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJvTmF2UGFyYW1ldGVyIiwiX2dldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJvbkJlZm9yZVN0YXRlQXBwbGllZCIsInNLZXkiLCJuYXZpZ2F0aW9uVHlwZSIsImlBcHBTdGF0ZSIsImFwcGx5QWRkaXRpb25hbFN0YXRlcyIsImFwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvbkFmdGVyU3RhdGVBcHBsaWVkIiwiX3NldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJzVmFyaWFudElkIiwiYVZhcmlhbnRzIiwiZ2V0VmFyaWFudHMiLCJiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlIiwib1ZhcmlhbnQiLCJwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUiLCJhUHJvbWlzZXMiLCJnZXRJbnRlcmZhY2UiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiLCJQcml2YXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxxQkFBcUIsR0FBRyxtQkFBOUI7QUFBQSxNQUNDQyxPQUFPLEdBQUdDLFVBQVUsQ0FBQ0QsT0FEdEIsQyxDQUVBO0FBQ0E7QUFDQTs7QUFDQSxNQUFNRSx3QkFBNkMsR0FBRztBQUNyRCw0Q0FBd0M7QUFDdkNDLE1BQUFBLFFBQVEsRUFBRSxVQUFTQyxHQUFULEVBQW1CO0FBQzVCLGVBQU87QUFDTix1QkFBYUEsR0FBRyxDQUFDQyxvQkFBSjtBQURQLFNBQVA7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QUlELGFBQWEsR0FBR1AsT0FBTyxDQUFDQyxPQUFSLEVBQXBCO0FBQ0FtRCxNQUFBQSxxQkFBcUIsQ0FBQ3hJLE9BQXRCLENBQThCLFVBQUN5SSxvQkFBRCxFQUErQjtBQUM1RCxZQUFJLE9BQU9BLG9CQUFvQixDQUFDMUssS0FBNUIsS0FBc0MsVUFBMUMsRUFBc0Q7QUFDckQsZ0JBQU0sSUFBSTJLLEtBQUosQ0FBVSw4REFBOEQ5QyxRQUFRLENBQUNPLFdBQVQsR0FBdUJDLE9BQXZCLEVBQXhFLENBQU47QUFDQTs7QUFDRFQsUUFBQUEsYUFBYSxHQUFHQSxhQUFhLENBQUNyRyxJQUFkLENBQW1CbUosb0JBQW9CLENBQUMxSyxLQUFyQixDQUEyQmdJLElBQTNCLENBQWdDLE1BQWhDLEVBQXNDSCxRQUF0QyxFQUFnRDVILGFBQWhELEVBQStEa0csY0FBL0QsQ0FBbkIsQ0FBaEI7QUFDQSxPQUxEO0FBTUEsYUFBT3lCLGFBQVA7QUFDQSxLOztXQUNEcUUsWSxHQUFBLHdCQUFlO0FBQ2QsYUFBTyxJQUFQO0FBQ0EsSzs7O0lBaGpCc0JDLG1CLHlFQTRCdEJDLE0sRUFDQUMsSywrS0F1QkFELE0sd0xBT0FFLE8sRUFDQUQsSyxxTEFtQkFDLE8sRUFDQUQsSywwTEE2QkFELE0sMktBYUFBLE0sMEpBWUFBLE0sK0pBc0JBRSxPLEVBQ0FELEssdUtBb0JBRCxNLHNMQWFBRSxPLEVBQ0FELEsseUtBMEJBRCxNLHFLQWFBQSxNLEVBQ0FDLEssNkpBY0FELE0sRUFDQUMsSywwS0F5REFELE0sb0xBd0JBRSxPLEVBQ0FELEssMEtBZ0NBRCxNLDJLQW9CQUEsTSxFQUNBQyxLLDJLQThDQUMsTyxpTEFrQ0FGLE0sZ0xBa0JBQSxNLGlMQW1CQUEsTSx1TEF1QkFBLE0sbUxBd0JBRSxPLEVBQ0FELEs7U0FpQmF4RixTIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBDb250cm9sVmFyaWFudEFwcGx5QVBJIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvYXBpL0NvbnRyb2xWYXJpYW50QXBwbHlBUElcIjtcbmltcG9ydCBTdGF0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvcDEzbi9TdGF0ZVV0aWxcIjtcbmltcG9ydCBOYXZMaWJyYXJ5IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9saWJyYXJ5XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBFeHRlbnNpYmxlLCBGaW5hbCwgUHJpdmF0ZSwgUHVibGljLCBVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuLy8gYWRkaXRpb25hbFN0YXRlcyBhcmUgc3RvcmVkIG5leHQgdG8gY29udHJvbCBJRHMsIHNvIG5hbWUgY2xhc2ggYXZvaWRhbmNlIG5lZWRlZC4gRm9ydHVuYXRlbHkgSURzIGhhdmUgcmVzdHJpY3Rpb25zOlxuLy8gXCJBbGxvd2VkIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyAoY2FwaXRhbC9sb3dlcmNhc2UpLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBkYXNoZXMsIHBvaW50cyBhbmQvb3IgY29sb25zLlwiXG4vLyBUaGVyZWZvcmUgYWRkaW5nIGEgc3ltYm9sIGxpa2UgIyBvciBAXG5jb25zdCBBRERJVElPTkFMX1NUQVRFU19LRVkgPSBcIiNhZGRpdGlvbmFsU3RhdGVzXCIsXG5cdE5hdlR5cGUgPSBOYXZMaWJyYXJ5Lk5hdlR5cGU7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBtZXRob2RzIHRvIHJldHJpZXZlICYgYXBwbHkgc3RhdGVzIGZvciB0aGUgZGlmZmVyZW50IGNvbnRyb2xzIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG5cdFwic2FwLnVpLmZsLnZhcmlhbnRzLlZhcmlhbnRNYW5hZ2VtZW50XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1ZNOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwidmFyaWFudElkXCI6IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uKG9WTTogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlICYmIG9Db250cm9sU3RhdGUudmFyaWFudElkICE9PSB1bmRlZmluZWQgJiYgb0NvbnRyb2xTdGF0ZS52YXJpYW50SWQgIT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpKSB7XG5cdFx0XHRcdGNvbnN0IHNWYXJpYW50UmVmZXJlbmNlID0gdGhpcy5fY2hlY2tJZlZhcmlhbnRJZElzQXZhaWxhYmxlKG9WTSwgb0NvbnRyb2xTdGF0ZS52YXJpYW50SWQpXG5cdFx0XHRcdFx0PyBvQ29udHJvbFN0YXRlLnZhcmlhbnRJZFxuXHRcdFx0XHRcdDogb1ZNLmdldFN0YW5kYXJkVmFyaWFudEtleSgpO1xuXHRcdFx0XHRyZXR1cm4gQ29udHJvbFZhcmlhbnRBcHBseUFQSS5hY3RpdmF0ZVZhcmlhbnQoe1xuXHRcdFx0XHRcdGVsZW1lbnQ6IG9WTSxcblx0XHRcdFx0XHR2YXJpYW50UmVmZXJlbmNlOiBzVmFyaWFudFJlZmVyZW5jZVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLm0uSWNvblRhYkJhclwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9UYWJCYXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9UYWJCYXIuZ2V0U2VsZWN0ZWRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvVGFiQmFyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUgJiYgb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRJdGVtID0gb1RhYkJhci5nZXRJdGVtcygpLmZpbmQoZnVuY3Rpb24ob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvSXRlbS5nZXRLZXkoKSA9PT0gb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRJdGVtKSB7XG5cdFx0XHRcdFx0b1RhYkJhci5zZXRTZWxlY3RlZEl0ZW0ob1NlbGVjdGVkSXRlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLm1kYy5GaWx0ZXJCYXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbihvRmlsdGVyQmFyOiBhbnkpIHtcblx0XHRcdHJldHVybiBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIpLnRoZW4oZnVuY3Rpb24obUZpbHRlckJhclN0YXRlOiBhbnkpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIHNlbnNpdGl2ZSBvciB2aWV3IHN0YXRlIGlycmVsZXZhbnQgZmllbGRzXG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzSW5mbyA9IG9GaWx0ZXJCYXIuZ2V0UHJvcGVydHlJbmZvU2V0KCksXG5cdFx0XHRcdFx0bUZpbHRlciA9IG1GaWx0ZXJCYXJTdGF0ZS5maWx0ZXIgfHwge307XG5cdFx0XHRcdGFQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24ob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF0gJiYgKG9Qcm9wZXJ0eUluZm8ucmVtb3ZlRnJvbUFwcFN0YXRlIHx8IG1GaWx0ZXJbb1Byb3BlcnR5SW5mby5wYXRoXS5sZW5ndGggPT09IDApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24ob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgbUZpbHRlcltvUHJvcGVydHlJbmZvLnBhdGhdO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gbUZpbHRlckJhclN0YXRlO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob0ZpbHRlckJhcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIsIG9Db250cm9sU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLlRhYmxlXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1RhYmxlOiBhbnkpIHtcblx0XHRcdHJldHVybiBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9UYWJsZSk7XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob1RhYmxlOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUob1RhYmxlLCBvQ29udHJvbFN0YXRlKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbihvVGFibGU6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1RhYmxlQmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRpZiAob1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvVGFibGVCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUm9vdEJpbmRpbmcgPT09IG9UYWJsZUJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBiaW5kaW5nXG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gcmVsYXRpdmUgYmluZGluZ1xuXHRcdFx0XHRcdGNvbnN0IG9IZWFkZXJDb250ZXh0ID0gb1RhYmxlQmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0dyb3VwSWQgPSBvVGFibGVCaW5kaW5nLmdldEdyb3VwSWQoKTtcblxuXHRcdFx0XHRcdGlmIChvSGVhZGVyQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0b0hlYWRlckNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBzR3JvdXBJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cuaW5mbyhcIlRhYmxlOiBcIiArIG9UYWJsZS5nZXRJZCgpICsgXCIgd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudXhhcC5PYmplY3RQYWdlTGF5b3V0XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkU2VjdGlvbjogb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uKG9PUExheW91dDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdG9Db250cm9sU3RhdGUgJiYgb09QTGF5b3V0LnNldFNlbGVjdGVkU2VjdGlvbihvQ29udHJvbFN0YXRlLnNlbGVjdGVkU2VjdGlvbik7XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24ob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PUExheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGlmIChvQmluZGluZykge1xuXHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0Y29uc3Qgc1N0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aChvT1BMYXlvdXQsIHNNZXRhUGF0aCk7XG5cdFx0XHRcdGlmIChzU3RyYXRlZ3kgPT09IFwic2VsZlwiKSB7XG5cdFx0XHRcdFx0Ly8gUmVmcmVzaCBtYWluIGNvbnRleHQgYW5kIDEtMSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgb3IgT1Bcblx0XHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnRpZXMgPVxuXHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiTmF2aWdhdGlvblByb3BlcnR5XCJcblx0XHRcdFx0XHRcdFx0fSkgfHwge30sXG5cdFx0XHRcdFx0XHRhTmF2UHJvcGVydGllc1RvUmVxdWVzdCA9IE9iamVjdC5rZXlzKG9OYXZpZ2F0aW9uUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uKGFQcmV2OiBhbnlbXSwgc05hdlByb3A6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVByZXYucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2UHJvcCB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0XHR9LCBbXSksXG5cdFx0XHRcdFx0XHRhUHJvcGVydGllcyA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKGFQcm9wZXJ0aWVzLmNvbmNhdChhTmF2UHJvcGVydGllc1RvUmVxdWVzdCksIHNHcm91cElkKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJPYmplY3RQYWdlOiBcIiArIG9PUExheW91dC5nZXRJZCgpICsgXCIgd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAuZmUubWFjcm9zLnRhYmxlLlF1aWNrRmlsdGVyQ29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1F1aWNrRmlsdGVyOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkS2V5OiBvUXVpY2tGaWx0ZXIuZ2V0U2VsZWN0b3JLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvUXVpY2tGaWx0ZXI6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9RdWlja0ZpbHRlci5zZXRTZWxlY3RvcktleShvQ29udHJvbFN0YXRlLnNlbGVjdGVkS2V5KTtcblx0XHR9XG5cdH0sXG5cdFwic2FwLm0uU2VnbWVudGVkQnV0dG9uXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1NlZ21lbnRlZEJ1dHRvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlZ21lbnRlZEJ1dHRvbi5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uKG9TZWdtZW50ZWRCdXR0b246IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9TZWdtZW50ZWRCdXR0b24uc2V0U2VsZWN0ZWRLZXkob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSk7XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLlNlbGVjdFwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9TZWxlY3Q6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9TZWxlY3QuZ2V0U2VsZWN0ZWRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvU2VsZWN0OiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VsZWN0LnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAuZi5EeW5hbWljUGFnZVwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9EeW5hbWljUGFnZTogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRoZWFkZXJFeHBhbmRlZDogb0R5bmFtaWNQYWdlLmdldEhlYWRlckV4cGFuZGVkKClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob0R5bmFtaWNQYWdlOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvRHluYW1pY1BhZ2Uuc2V0SGVhZGVyRXhwYW5kZWQob0NvbnRyb2xTdGF0ZS5oZWFkZXJFeHBhbmRlZCk7XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5jb3JlLm12Yy5WaWV3XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1ZpZXc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUucmV0cmlldmVWaWV3U3RhdGUob0NvbnRyb2xsZXIudmlld1N0YXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvVmlldzogYW55LCBvQ29udHJvbFN0YXRlOiBhbnksIG9OYXZQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLmFwcGx5Vmlld1N0YXRlKG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbihvVmlldzogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5yZWZyZXNoVmlld0JpbmRpbmdzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9Db21wb25lbnRDb250YWluZXI6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db21wb25lbnRDb250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdGlmIChvQ29tcG9uZW50KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJldHJpZXZlQ29udHJvbFN0YXRlKG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob0NvbXBvbmVudENvbnRhaW5lcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnksIG9OYXZQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29tcG9uZW50Q29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRpZiAob0NvbXBvbmVudCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNvbnRyb2xTdGF0ZShvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCksIG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG4vKipcbiAqIEEgY29udHJvbGxlciBleHRlbnNpb24gb2ZmZXJpbmcgaG9va3MgZm9yIHN0YXRlIGhhbmRsaW5nXG4gKlxuICogSWYgeW91IG5lZWQgdG8gbWFpbnRhaW4gYSBzcGVjaWZpYyBzdGF0ZSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiB1c2UgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuICpcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjg1LjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFZpZXdTdGF0ZSBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9pUmV0cmlldmluZ1N0YXRlQ291bnRlcjogbnVtYmVyO1xuXHRwcml2YXRlIF9wSW5pdGlhbFN0YXRlQXBwbGllZDogUHJvbWlzZTx1bmtub3duPjtcblx0cHJpdmF0ZSBfcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlPzogRnVuY3Rpb247XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3Rvci5cblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIgPSAwO1xuXHRcdHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZS5nZXRNZXRhZGF0YVxuXHQgKiBAZnVuY3Rpb25cblx0ICovXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUuZXh0ZW5kXG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRyZWZyZXNoVmlld0JpbmRpbmdzKCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKS50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdGFDb250cm9sc1xuXHRcdFx0XHQuZmlsdGVyKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIHJlbGV2YW50IGZvciByZWZyZXNoaW5nIHRvIHRoZSBwcm92aWRlZCBjb250cm9sIGFycmF5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0ge0FycmF5PHNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3Q+fSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyhhQ29sbGVjdGVkQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHJlZnJlc2hDb250cm9sQmluZGluZyhvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIgPSB0aGlzLmdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKHR5cGVvZiBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZyAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRMb2cuaW5mbyhcInJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgKyBcIiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4ob0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIucmVmcmVzaEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICovXG5cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdGdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2w6IGFueSk6IGFueSB7XG5cdFx0Y29uc3Qgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcjogYW55ID0ge307XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNUeXBlIGluIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCkge1xuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKHNUeXBlKSkge1xuXHRcdFx0XHRcdC8vIHBhc3Mgb25seSB0aGUgcmVmcmVzaEJpbmRpbmcgaGFuZGxlciBpbiBhbiBvYmplY3Qgc28gdGhhdCA6XG5cdFx0XHRcdFx0Ly8gMS4gQXBwbGljYXRpb24gaGFzIGFjY2VzcyBvbmx5IHRvIHJlZnJlc2hCaW5kaW5nIGFuZCBub3QgYXBwbHkgYW5kIHJldGVyaXZlIGF0IHRoaXMgc3RhZ2Vcblx0XHRcdFx0XHQvLyAyLiBBcHBsaWNhdGlvbiBtb2RpZmljYXRpb25zIHRvIHRoZSBvYmplY3Qgd2lsbCBiZSByZWZsZWN0ZWQgaGVyZSAoYXMgd2UgcGFzcyBieSByZWZlcmVuY2UpXG5cdFx0XHRcdFx0b1JlZnJlc2hCaW5kaW5nSGFuZGxlcltcInJlZnJlc2hCaW5kaW5nXCJdID0gX21Db250cm9sU3RhdGVIYW5kbGVyTWFwW3NUeXBlXS5yZWZyZXNoQmluZGluZyB8fCB7fTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyKG9Db250cm9sLCBvUmVmcmVzaEJpbmRpbmdIYW5kbGVyKTtcblx0XHRyZXR1cm4gb1JlZnJlc2hCaW5kaW5nSGFuZGxlcjtcblx0fVxuXHQvKipcblx0ICogQ3VzdG9taXplIHRoZSA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT4gZnVuY3Rpb24gZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBjb250cm9sIGZvciB3aGljaCB0aGUgcmVmcmVzaCBoYW5kbGVyIGlzIGFkYXB0ZWQuXG5cdCAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gb0NvbnRyb2xIYW5kbGVyIEEgcGxhaW4gb2JqZWN0IHdoaWNoIGNhbiBoYXZlIG9uZSBmdW5jdGlvbjogPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+XG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXJcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgb0NvbnRyb2xIYW5kbGVyOiBhbnlbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBzdXNwZW5kZWQgZHVlIHRvIGtlZXAtYWxpdmUgbW9kZS5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvblN1c3BlbmRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25TdXNwZW5kKCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyByZXN0b3JlZCBkdWUgdG8ga2VlcC1hbGl2ZSBtb2RlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uUmVzdG9yZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJlc3RvcmUoKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogRGVzdHJ1Y3RvciBtZXRob2QgZm9yIG9iamVjdHMuXG5cdCAqL1xuXHRkZXN0cm95KCkge1xuXHRcdGRlbGV0ZSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhlbHBlciBmdW5jdGlvbiB0byBlbmFibGUgbXVsdGkgb3ZlcnJpZGUuIEl0IGlzIGFkZGluZyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciAoYXJyYXkpIHRvIHRoZSBwcm92aWRlZFxuXHQgKiBmdW5jdGlvbiAoYW5kIGl0cyBwYXJhbWV0ZXJzKSwgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCB2aWEgPGNvZGU+UHJvbWlzZS5hbGw8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbkNhbGwgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gYXJnc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCBvZiBhbGwgb3ZlcnJpZGVzXG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0Y29sbGVjdFJlc3VsdHMoZm5DYWxsOiBGdW5jdGlvbiwgLi4uYXJnczogYW55W10pIHtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRhcmdzLnB1c2goYVJlc3VsdHMpO1xuXHRcdGZuQ2FsbC5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUgaGFuZGxlciBmb3Jcblx0ICogQHBhcmFtIHtBcnJheTxvYmplY3Q+fSBhQ29udHJvbEhhbmRsZXIgQSBsaXN0IG9mIHBsYWluIG9iamVjdHMgd2l0aCB0d28gZnVuY3Rpb25zOiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0Q29udHJvbFN0YXRlSGFuZGxlclxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgYUNvbnRyb2xIYW5kbGVyOiBvYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPiBmdW5jdGlvbnMgZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBBIHBsYWluIG9iamVjdCB3aXRoIHR3byBmdW5jdGlvbnM6IDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+XG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0Z2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlciA9IFtdLFxuXHRcdFx0YUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueVtdID0gW107XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNUeXBlIGluIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCkge1xuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKHNUeXBlKSkge1xuXHRcdFx0XHRcdC8vIGF2b2lkIGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgaW50ZXJuYWwgX21Db250cm9sU3RhdGVIYW5kbGVyTWFwXG5cdFx0XHRcdFx0YUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlci5wdXNoKE9iamVjdC5hc3NpZ24oe30sIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0pKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCwgYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIpO1xuXHRcdHJldHVybiBhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyLmNvbmNhdChhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYWRkIGFsbCBjb250cm9scyBmb3IgZ2l2ZW4gdmlldyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGUgc3RhdGUgaGFuZGxpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRyb2wgYXJyYXkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7QXJyYXk8c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdD59IGFDb2xsZWN0ZWRDb250cm9scyBUaGUgY29sbGVjdGVkIGNvbnRyb2xzXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRTdGF0ZUNvbnRyb2xzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRTdGF0ZUNvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgZ2l2ZW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUga2V5IGZvclxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUga2V5IHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgdGhlIGNvbnRyb2xzIHN0YXRlXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRnZXRTdGF0ZUtleShvQ29udHJvbDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldExvY2FsSWQob0NvbnRyb2wuZ2V0SWQoKSkgfHwgb0NvbnRyb2wuZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgdmlldyBzdGF0ZSBvZiB0aGlzIGV4dGVuc2lvbnMgdmlldy5cblx0ICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBiZWZvcmUgZmluaXNoaW5nLCBhbGwgYnV0IHRoZSBmaW5hbCByZXNwb25zZSB3aWxsIHJlc29sdmUgdG8gPGNvZGU+dW5kZWZpbmVkPC9jb2RlPi5cblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSByZXNvbHZpbmcgdGhlIHZpZXcgc3RhdGVcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNyZXRyaWV2ZVZpZXdTdGF0ZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRyZXRyaWV2ZVZpZXdTdGF0ZSgpIHtcblx0XHQrK3RoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdHJldHVybiB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0U3RhdGVDb250cm9scyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKGFDb250cm9sczogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24ob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0Lm1hcCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29udHJvbCkudGhlbigodlJlc3VsdDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogdGhpcy5nZXRTdGF0ZUtleShvQ29udHJvbCksXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdlJlc3VsdFxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbihhUmVzb2x2ZWRTdGF0ZXM6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gYVJlc29sdmVkU3RhdGVzLnJlZHVjZShmdW5jdGlvbihvU3RhdGVzOiBhbnksIG1TdGF0ZTogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZTogYW55ID0ge307XG5cdFx0XHRcdFx0b0N1cnJlbnRTdGF0ZVttU3RhdGUua2V5XSA9IG1TdGF0ZS52YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbWVyZ2VPYmplY3RzKG9TdGF0ZXMsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0XHR9LCB7fSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9WaWV3U3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcygpKS50aGVuKGZ1bmN0aW9uKG1BZGRpdGlvbmFsU3RhdGVzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAobUFkZGl0aW9uYWxTdGF0ZXMgJiYgT2JqZWN0LmtleXMobUFkZGl0aW9uYWxTdGF0ZXMpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0b1ZpZXdTdGF0ZVtBRERJVElPTkFMX1NUQVRFU19LRVldID0gbUFkZGl0aW9uYWxTdGF0ZXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvVmlld1N0YXRlO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC0tdGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXI7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9WaWV3U3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIgPT09IDAgPyBvVmlld1N0YXRlIDogdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRXh0ZW5kIHRoZSBtYXAgb2YgYWRkaXRpb25hbCBzdGF0ZXMgKG5vdCBjb250cm9sIGJvdW5kKSB0byBiZSBhZGRlZCB0byB0aGUgY3VycmVudCB2aWV3IHN0YXRlIG9mIHRoZSBnaXZlbiB2aWV3LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUFkZGl0aW9uYWxTdGF0ZXMgVGhlIGFkZGl0aW9uYWwgc3RhdGVcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMobUFkZGl0aW9uYWxTdGF0ZXM6IG9iamVjdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiBhZGRpdGlvbmFsIHN0YXRlcyAobm90IGNvbnRyb2wgYm91bmQpIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgb2YgdGhlIGdpdmVuIHZpZXcuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3QgfCBQcm9taXNlPG9iamVjdD59IEFkZGl0aW9uYWwgdmlldyBzdGF0ZXNcblx0ICovXG5cdF9yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMoKSB7XG5cdFx0Y29uc3QgbUFkZGl0aW9uYWxTdGF0ZXMgPSB7fTtcblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLnJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyhtQWRkaXRpb25hbFN0YXRlcyk7XG5cdFx0cmV0dXJuIG1BZGRpdGlvbmFsU3RhdGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBzdGF0ZSBmb3Jcblx0ICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHJldHJpZXZlQ29udHJvbFN0YXRlKG9Db250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBhQ29udHJvbFN0YXRlSGFuZGxlcnMgPSB0aGlzLmdldENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2wpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFDb250cm9sU3RhdGVIYW5kbGVycy5tYXAoKG1Db250cm9sU3RhdGVIYW5kbGVyOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiY29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZSBpcyBub3QgYSBmdW5jdGlvbiBmb3IgY29udHJvbDogXCIgKyBvQ29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1Db250cm9sU3RhdGVIYW5kbGVyLnJldHJpZXZlLmNhbGwodGhpcywgb0NvbnRyb2wpO1xuXHRcdFx0fSlcblx0XHQpLnRoZW4oKGFTdGF0ZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRyZXR1cm4gYVN0YXRlcy5yZWR1Y2UoZnVuY3Rpb24ob0ZpbmFsU3RhdGU6IGFueSwgb0N1cnJlbnRTdGF0ZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXJnZU9iamVjdHMob0ZpbmFsU3RhdGUsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0fSwge30pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgdmlldyBzdGF0ZSBzaG91bGQgb25seSBiZSBhcHBsaWVkIG9uY2UgaW5pdGlhbGx5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZH0uXG5cdCAqXG5cdCAqIEltcG9ydGFudDpcblx0ICogWW91IHNob3VsZCBvbmx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjdXN0b20gcGFnZXMgYW5kIG5vdCBmb3IgdGhlIHN0YW5kYXJkIExpc3RSZXBvcnRQYWdlIGFuZCBPYmplY3RQYWdlIVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG9ubHkgdGhlIGluaXRpYWwgdmlldyBzdGF0ZSBpcyBhcHBsaWVkIG9uY2UsXG5cdCAqIGVsc2UgYW55IG5ldyB2aWV3IHN0YXRlIGlzIGFsc28gYXBwbGllZCBvbiBmb2xsb3ctdXAgY2FsbHMgKGRlZmF1bHQpXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlJbml0aWFsU3RhdGVPbmx5XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0YXBwbHlJbml0aWFsU3RhdGVPbmx5KCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdC8qKlxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiB2aWV3IHN0YXRlIHRvIHRoaXMgZXh0ZW5zaW9ucyB2aWV3LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXdTdGF0ZSBUaGUgdmlldyBzdGF0ZSB0byBhcHBseSAoY2FuIGJlIHVuZGVmaW5lZClcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmF2UGFyYW1ldGVyLnNlbGVjdGlvblZhcmlhbnQgVGhlIHNlbGVjdGlvblZhcmlhbnQgZnJvbSB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHMgVGhlIHNlbGVjdGlvblZhcmlhbnQgZGVmYXVsdHMgZnJvbSB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG9OYXZQYXJhbWV0ZXIucmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQgRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIGZvciBhc3luYyBzdGF0ZSBoYW5kbGluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FwcGx5Vmlld1N0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGFwcGx5Vmlld1N0YXRlKFxuXHRcdG9WaWV3U3RhdGU6IGFueSxcblx0XHRvTmF2UGFyYW1ldGVyOiB7XG5cdFx0XHRuYXZpZ2F0aW9uVHlwZTogYW55O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnREZWZhdWx0cz86IG9iamVjdDtcblx0XHRcdHJlcXVpcmVzU3RhbmRhcmRWYXJpYW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8YW55PiB7XG5cdFx0aWYgKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlJbml0aWFsU3RhdGVPbmx5KCkgJiYgdGhpcy5fZ2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25CZWZvcmVTdGF0ZUFwcGxpZWQpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRTdGF0ZUNvbnRyb2xzKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoYUNvbnRyb2xzOiBhbnkpID0+IHtcblx0XHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0YUNvbnRyb2xzXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbihvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0tleSA9IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpO1xuXHRcdFx0XHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBseUNvbnRyb2xTdGF0ZS5iaW5kKHRoaXMsIG9Db250cm9sLCBvVmlld1N0YXRlID8gb1ZpZXdTdGF0ZVtzS2V5XSA6IHVuZGVmaW5lZCwgb05hdlBhcmFtZXRlcilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgPT09IE5hdlR5cGUuaUFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHMoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFwcGx5QWRkaXRpb25hbFN0YXRlcyxcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGUgPyBvVmlld1N0YXRlW0FERElUSU9OQUxfU1RBVEVTX0tFWV0gOiB1bmRlZmluZWRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycywgb05hdlBhcmFtZXRlcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25BZnRlclN0YXRlQXBwbGllZCkudGhlbih0aGlzLl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkLmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAUHJpdmF0ZVxuXHRfY2hlY2tJZlZhcmlhbnRJZElzQXZhaWxhYmxlKG9WTTogYW55LCBzVmFyaWFudElkOiBhbnkpIHtcblx0XHRjb25zdCBhVmFyaWFudHMgPSBvVk0uZ2V0VmFyaWFudHMoKTtcblx0XHRsZXQgYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IGZhbHNlO1xuXHRcdGFWYXJpYW50cy5mb3JFYWNoKGZ1bmN0aW9uKG9WYXJpYW50OiBhbnkpIHtcblx0XHRcdGlmIChvVmFyaWFudC5rZXkgPT09IHNWYXJpYW50SWQpIHtcblx0XHRcdFx0YklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGU7XG5cdH1cblxuXHRfc2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRpZiAodGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKSB7XG5cdFx0XHRjb25zdCBwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdFx0cEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cdF9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkge1xuXHRcdHJldHVybiAhdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3QgYmVmb3JlIGEgc3RhdGUgZm9yIGdpdmVuIHZpZXcgaXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVTdGF0ZUFwcGxpZWQoYVByb21pc2VzOiBQcm9taXNlPGFueT4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHRvIHJlYWN0IHdoZW4gc3RhdGUgZm9yIGdpdmVuIHZpZXcgd2FzIGFwcGxpZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvbkFmdGVyU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25BZnRlclN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5aW5nIGFkZGl0aW9uYWwsIG5vdCBjb250cm9sIHJlbGF0ZWQsIHN0YXRlcyAtIGlzIGNhbGxlZCBvbmx5IGlmIG5hdmlnYXRpb24gdHlwZSBpcyBpQXBwU3RhdGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVmlld1N0YXRlIFRoZSBjdXJyZW50IHZpZXcgc3RhdGVcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FwcGx5QWRkaXRpb25hbFN0YXRlc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFwcGx5QWRkaXRpb25hbFN0YXRlcyhvVmlld1N0YXRlOiBvYmplY3QsIGFQcm9taXNlczogUHJvbWlzZTxhbnk+KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgbm90IGlBcHBTdGF0ZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50XSBUaGUgc2VsZWN0aW9uVmFyaWFudCBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbb05hdlBhcmFtZXRlci5yZXF1aXJlc1N0YW5kYXJkVmFyaWFudF0gRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdG9OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdGFQcm9taXNlczogUHJvbWlzZTxhbnk+XG5cdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogQXBwbHlpbmcgdGhlIGdpdmVuIHN0YXRlIHRvIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBvYmplY3QgdG8gYXBwbHkgdGhlIGdpdmVuIHN0YXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbFN0YXRlIFRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbnRyb2xcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvTmF2UGFyYW1ldGVyc10gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIHthbnl9IFJldHVybiBhIHByb21pc2UgZm9yIGFzeW5jIHN0YXRlIGhhbmRsaW5nXG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0YXBwbHlDb250cm9sU3RhdGUob0NvbnRyb2w6IGFueSwgb0NvbnRyb2xTdGF0ZTogb2JqZWN0LCBvTmF2UGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdGNvbnN0IGFDb250cm9sU3RhdGVIYW5kbGVycyA9IHRoaXMuZ2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMuZm9yRWFjaCgobUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0fVxuXHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseS5iaW5kKHRoaXMsIG9Db250cm9sLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycykpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHR9XG5cdGdldEludGVyZmFjZSgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWV3U3RhdGU7XG4iXX0=