@sapui5/sap.fe.core 1.131.0 → 1.133.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 (317) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +17 -23
  4. package/src/sap/fe/core/AppComponent.js +74 -36
  5. package/src/sap/fe/core/AppComponent.ts +70 -3
  6. package/src/sap/fe/core/AppStateHandler.js +44 -13
  7. package/src/sap/fe/core/AppStateHandler.ts +38 -0
  8. package/src/sap/fe/core/BaseController.js +3 -3
  9. package/src/sap/fe/core/CommonUtils.js +30 -37
  10. package/src/sap/fe/core/CommonUtils.ts +15 -13
  11. package/src/sap/fe/core/ExtensionAPI.js +29 -34
  12. package/src/sap/fe/core/ExtensionAPI.ts +3 -0
  13. package/src/sap/fe/core/InsightsFormattersExtension.js +2 -2
  14. package/src/sap/fe/core/PageController.js +40 -31
  15. package/src/sap/fe/core/PageController.ts +14 -1
  16. package/src/sap/fe/core/ResourceModel.js +4 -4
  17. package/src/sap/fe/core/ReuseComponent.js +27 -13
  18. package/src/sap/fe/core/ReuseComponent.ts +18 -0
  19. package/src/sap/fe/core/TemplateComponent.js +102 -89
  20. package/src/sap/fe/core/TemplateComponent.ts +20 -1
  21. package/src/sap/fe/core/TemplateModel.js +6 -7
  22. package/src/sap/fe/core/UIProvider.js +1 -1
  23. package/src/sap/fe/core/UIProvider.ts +2 -9
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +63 -48
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +56 -27
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +9 -0
  27. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.ts +48 -0
  28. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +4 -6
  29. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +2 -2
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -3
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +32 -18
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +30 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +9 -13
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +2 -1
  35. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +2 -2
  36. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +19 -25
  37. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -1
  38. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +3 -4
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +20 -24
  40. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +10 -15
  41. package/src/sap/fe/core/controllerextensions/ContextSharing.js +3 -3
  42. package/src/sap/fe/core/controllerextensions/EditFlow.js +296 -246
  43. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -175
  44. package/src/sap/fe/core/controllerextensions/Feedback.js +10 -11
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +6 -6
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -0
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -36
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +57 -78
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +42 -50
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +12 -19
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +23 -17
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -7
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +15 -21
  54. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -3
  55. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/Recommendations.js +23 -36
  57. package/src/sap/fe/core/controllerextensions/Recommendations.ts +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +3 -3
  59. package/src/sap/fe/core/controllerextensions/Share.js +19 -28
  60. package/src/sap/fe/core/controllerextensions/SideEffects.js +68 -32
  61. package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -6
  62. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -5
  63. package/src/sap/fe/core/controllerextensions/ViewState.js +23 -24
  64. package/src/sap/fe/core/controllerextensions/ViewState.ts +6 -1
  65. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +13 -10
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +13 -8
  67. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  68. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +15 -16
  69. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +3 -4
  70. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +288 -0
  71. package/src/sap/fe/core/controllerextensions/dialog/{OperationsDialog.block.tsx → OperationsDialog.tsx} +27 -29
  72. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +41 -5
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +61 -8
  74. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +404 -0
  75. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +502 -0
  76. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +35 -43
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +34 -14
  78. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -27
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +27 -15
  80. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +51 -39
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +75 -34
  82. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +4 -4
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +88 -427
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +82 -620
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +9 -5
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +6 -5
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +116 -79
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +87 -13
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +4 -6
  90. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +5 -7
  91. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +6 -7
  92. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +4 -4
  93. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +58 -20
  94. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -4
  95. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +1 -1
  97. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +9 -12
  98. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  99. package/src/sap/fe/core/controls/ComponentLoader.js +20 -21
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +250 -0
  101. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/{DraftDataLossDialog.block.tsx → DraftDataLossDialog.tsx} +31 -19
  102. package/src/sap/fe/core/controls/FormElementWrapper.js +19 -21
  103. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +114 -0
  104. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +115 -0
  105. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +454 -0
  106. package/src/sap/fe/core/controls/Recommendations/{ConfirmRecommendationDialog.block.tsx → ConfirmRecommendationDialog.tsx} +5 -9
  107. package/src/sap/fe/core/converters/ConverterContext.js +17 -18
  108. package/src/sap/fe/core/converters/ConverterContext.ts +10 -15
  109. package/src/sap/fe/core/converters/ManifestSettings.js +29 -28
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +22 -1
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +26 -48
  112. package/src/sap/fe/core/converters/MetaModelConverter.js +21 -28
  113. package/src/sap/fe/core/converters/MetaModelConverter.ts +2 -0
  114. package/src/sap/fe/core/converters/TemplateConverter.js +17 -21
  115. package/src/sap/fe/core/converters/TemplateConverter.ts +5 -3
  116. package/src/sap/fe/core/converters/annotations/DataField.js +69 -66
  117. package/src/sap/fe/core/converters/annotations/DataField.ts +30 -0
  118. package/src/sap/fe/core/converters/common/AnnotationConverter.js +20 -23
  119. package/src/sap/fe/core/converters/controls/Common/Action.js +178 -43
  120. package/src/sap/fe/core/converters/controls/Common/Action.ts +202 -19
  121. package/src/sap/fe/core/converters/controls/Common/Chart.js +47 -22
  122. package/src/sap/fe/core/converters/controls/Common/Chart.ts +50 -5
  123. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +16 -23
  124. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -38
  125. package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -0
  126. package/src/sap/fe/core/converters/controls/Common/KPI.js +32 -47
  127. package/src/sap/fe/core/converters/controls/Common/Table.js +464 -506
  128. package/src/sap/fe/core/converters/controls/Common/Table.ts +335 -219
  129. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +17 -28
  130. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +1 -2
  131. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +66 -90
  132. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +10 -1
  133. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +49 -73
  134. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +6 -10
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +35 -50
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +110 -60
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +137 -41
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +19 -30
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +5 -5
  140. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +11 -14
  141. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +14 -21
  142. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +4 -6
  143. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -7
  144. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  145. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -3
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -52
  147. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -34
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +103 -74
  149. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +111 -39
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.js +28 -31
  151. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +17 -9
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +61 -52
  153. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +60 -21
  154. package/src/sap/fe/core/definition/FEDefinition.js +104 -44
  155. package/src/sap/fe/core/designtime/AppComponent.designtime.js +37 -7
  156. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +42 -2
  157. package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -5
  158. package/src/sap/fe/core/formatters/FiscalFormat.js +24 -24
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -23
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -18
  161. package/src/sap/fe/core/fpm/Component.js +12 -14
  162. package/src/sap/fe/core/fpm/manifest.json +1 -1
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +20 -15
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +22 -13
  165. package/src/sap/fe/core/helpers/BindingHelper.js +3 -3
  166. package/src/sap/fe/core/helpers/BindingHelper.ts +1 -1
  167. package/src/sap/fe/core/helpers/DeleteHelper.js +55 -62
  168. package/src/sap/fe/core/helpers/DeleteHelper.ts +48 -51
  169. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +4 -7
  170. package/src/sap/fe/core/helpers/FPMHelper.js +4 -7
  171. package/src/sap/fe/core/helpers/HTTP503Handler.js +2 -1
  172. package/src/sap/fe/core/helpers/HTTP503Handler.ts +4 -3
  173. package/src/sap/fe/core/helpers/KeepAliveHelper.js +5 -5
  174. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +6 -6
  175. package/src/sap/fe/core/helpers/LoaderUtils.js +8 -3
  176. package/src/sap/fe/core/helpers/LoaderUtils.ts +15 -4
  177. package/src/sap/fe/core/helpers/MessageStrip.js +3 -4
  178. package/src/sap/fe/core/helpers/MetaModelFunction.js +26 -40
  179. package/src/sap/fe/core/helpers/MetaPath.js +9 -7
  180. package/src/sap/fe/core/helpers/MetaPath.ts +9 -3
  181. package/src/sap/fe/core/helpers/ModelHelper.js +33 -57
  182. package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
  183. package/src/sap/fe/core/helpers/PasteHelper.js +11 -19
  184. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  185. package/src/sap/fe/core/helpers/RecommendationHelper.js +3 -4
  186. package/src/sap/fe/core/helpers/ResourceModelHelper.js +3 -5
  187. package/src/sap/fe/core/helpers/SizeHelper.js +3 -5
  188. package/src/sap/fe/core/helpers/StableIdHelper.js +13 -11
  189. package/src/sap/fe/core/helpers/StableIdHelper.ts +5 -1
  190. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +28 -38
  191. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  192. package/src/sap/fe/core/helpers/TitleHelper.js +19 -40
  193. package/src/sap/fe/core/helpers/TitleHelper.ts +5 -25
  194. package/src/sap/fe/core/helpers/TypeGuards.js +25 -18
  195. package/src/sap/fe/core/helpers/TypeGuards.ts +7 -0
  196. package/src/sap/fe/core/helpers/WebSocket.js +4 -4
  197. package/src/sap/fe/core/library.js +8 -7
  198. package/src/sap/fe/core/library.ts +2 -0
  199. package/src/sap/fe/core/manifestMerger/AddNewPage.js +9 -11
  200. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +14 -25
  201. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +15 -17
  202. package/src/sap/fe/core/messagebundle.properties +21 -0
  203. package/src/sap/fe/core/messagebundle_ar.properties +5 -1
  204. package/src/sap/fe/core/messagebundle_bg.properties +4 -0
  205. package/src/sap/fe/core/messagebundle_ca.properties +4 -0
  206. package/src/sap/fe/core/messagebundle_cnr.properties +4 -0
  207. package/src/sap/fe/core/messagebundle_cs.properties +8 -4
  208. package/src/sap/fe/core/messagebundle_cy.properties +4 -0
  209. package/src/sap/fe/core/messagebundle_da.properties +4 -0
  210. package/src/sap/fe/core/messagebundle_de.properties +4 -0
  211. package/src/sap/fe/core/messagebundle_el.properties +4 -0
  212. package/src/sap/fe/core/messagebundle_en.properties +4 -0
  213. package/src/sap/fe/core/messagebundle_en_GB.properties +4 -0
  214. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
  215. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +249 -231
  216. package/src/sap/fe/core/messagebundle_es.properties +5 -1
  217. package/src/sap/fe/core/messagebundle_es_MX.properties +4 -0
  218. package/src/sap/fe/core/messagebundle_et.properties +4 -0
  219. package/src/sap/fe/core/messagebundle_fi.properties +4 -0
  220. package/src/sap/fe/core/messagebundle_fr.properties +6 -2
  221. package/src/sap/fe/core/messagebundle_fr_CA.properties +4 -0
  222. package/src/sap/fe/core/messagebundle_hi.properties +4 -0
  223. package/src/sap/fe/core/messagebundle_hr.properties +4 -0
  224. package/src/sap/fe/core/messagebundle_hu.properties +4 -0
  225. package/src/sap/fe/core/messagebundle_id.properties +4 -0
  226. package/src/sap/fe/core/messagebundle_it.properties +4 -0
  227. package/src/sap/fe/core/messagebundle_iw.properties +4 -0
  228. package/src/sap/fe/core/messagebundle_ja.properties +4 -0
  229. package/src/sap/fe/core/messagebundle_kk.properties +4 -0
  230. package/src/sap/fe/core/messagebundle_ko.properties +4 -0
  231. package/src/sap/fe/core/messagebundle_lt.properties +4 -0
  232. package/src/sap/fe/core/messagebundle_lv.properties +4 -0
  233. package/src/sap/fe/core/messagebundle_mk.properties +4 -0
  234. package/src/sap/fe/core/messagebundle_ms.properties +4 -0
  235. package/src/sap/fe/core/messagebundle_nl.properties +4 -0
  236. package/src/sap/fe/core/messagebundle_no.properties +4 -0
  237. package/src/sap/fe/core/messagebundle_pl.properties +4 -0
  238. package/src/sap/fe/core/messagebundle_pt.properties +4 -0
  239. package/src/sap/fe/core/messagebundle_pt_PT.properties +4 -0
  240. package/src/sap/fe/core/messagebundle_ro.properties +4 -0
  241. package/src/sap/fe/core/messagebundle_ru.properties +4 -0
  242. package/src/sap/fe/core/messagebundle_sh.properties +4 -0
  243. package/src/sap/fe/core/messagebundle_sk.properties +4 -0
  244. package/src/sap/fe/core/messagebundle_sl.properties +4 -0
  245. package/src/sap/fe/core/messagebundle_sr.properties +4 -0
  246. package/src/sap/fe/core/messagebundle_sv.properties +4 -0
  247. package/src/sap/fe/core/messagebundle_th.properties +4 -0
  248. package/src/sap/fe/core/messagebundle_tr.properties +5 -1
  249. package/src/sap/fe/core/messagebundle_uk.properties +4 -0
  250. package/src/sap/fe/core/messagebundle_vi.properties +4 -0
  251. package/src/sap/fe/core/messagebundle_zh_CN.properties +4 -0
  252. package/src/sap/fe/core/messagebundle_zh_TW.properties +4 -0
  253. package/src/sap/fe/core/operationsHelper.js +23 -27
  254. package/src/sap/fe/core/operationsHelper.ts +6 -7
  255. package/src/sap/fe/core/rootView/Fcl.controller.js +53 -40
  256. package/src/sap/fe/core/rootView/Fcl.controller.ts +42 -7
  257. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -10
  258. package/src/sap/fe/core/rootView/RootViewBaseController.js +22 -21
  259. package/src/sap/fe/core/rootView/RootViewBaseController.ts +10 -2
  260. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  261. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +4 -3
  262. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -0
  263. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +12 -10
  264. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +6 -2
  265. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +8 -13
  266. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +5 -7
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +31 -8
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +31 -5
  269. package/src/sap/fe/core/services/InlineEditServiceFactory.js +190 -0
  270. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +226 -0
  271. package/src/sap/fe/core/services/NavigationServiceFactory.js +10 -15
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +76 -56
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +47 -14
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +32 -34
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +75 -60
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +58 -12
  278. package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -9
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +13 -18
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +3 -0
  281. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +7 -9
  282. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +12 -16
  283. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +1 -1
  284. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +4 -7
  285. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +5 -6
  286. package/src/sap/fe/core/support/CommonHelper.js +2 -3
  287. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  288. package/src/sap/fe/core/templating/ActionHelper.js +3 -4
  289. package/src/sap/fe/core/templating/CommonFormatters.js +6 -8
  290. package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
  291. package/src/sap/fe/core/templating/CriticalityFormatters.js +53 -5
  292. package/src/sap/fe/core/templating/CriticalityFormatters.ts +129 -7
  293. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -11
  294. package/src/sap/fe/core/templating/DataFieldFormatters.ts +1 -1
  295. package/src/sap/fe/core/templating/DataModelPathHelper.js +33 -56
  296. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  297. package/src/sap/fe/core/templating/EntitySetHelper.js +11 -19
  298. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  299. package/src/sap/fe/core/templating/FieldControlHelper.js +13 -20
  300. package/src/sap/fe/core/templating/FilterTemplating.js +6 -9
  301. package/src/sap/fe/core/templating/PropertyHelper.js +33 -63
  302. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -1
  303. package/src/sap/fe/core/templating/SemanticObjectHelper.js +13 -21
  304. package/src/sap/fe/core/templating/UIFormatters.js +57 -78
  305. package/src/sap/fe/core/templating/UIFormatters.ts +2 -1
  306. package/src/sap/fe/core/type/Date.js +2 -2
  307. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  308. package/src/sap/fe/core/type/EDM.js +3 -5
  309. package/src/sap/fe/core/type/Email.js +17 -6
  310. package/src/sap/fe/core/type/Email.ts +23 -4
  311. package/src/sap/fe/core/type/FiscalDate.js +8 -9
  312. package/src/sap/fe/core/type/InputMask.js +3 -4
  313. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +0 -299
  314. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +0 -87
  315. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +0 -43
  316. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +0 -251
  317. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +0 -471
@@ -161,22 +161,26 @@ async function executeDraftEditAction(
161
161
  messageHandler: MessageHandler,
162
162
  overwriteChange?: boolean
163
163
  ): Promise<Context> {
164
- if (oContext.getProperty("IsActiveEntity")) {
164
+ // If the context is not loaded (i.e. oContext.getObject() == undefined), we assume it corresponds to an active context
165
+ // This situation happens when opening an OP directly in edit mode (InternalRouting._bindPageForEdit)
166
+ if (oContext.getObject() === undefined || oContext.getProperty("IsActiveEntity")) {
165
167
  const oOptions = { $$inheritExpandSelect: true };
166
168
  const oOperation = draft.createOperation(oContext, draftOperations.EDIT, oOptions);
167
169
  oOperation.setParameter("PreserveChanges", bPreserveChanges);
168
170
 
171
+ // If the context has not been loaded yet, we can ignore the ETag (as no previous ETag is available)
172
+ const ignoreETag = oContext.getObject() === undefined ? true : undefined;
173
+
169
174
  const resourceModel = getResourceModel(oView);
170
175
  const sActionName = resourceModel.getText("C_COMMON_OBJECT_PAGE_EDIT");
171
176
  //If the context is coming from a list binding we pass the flag true to replace the context by the active one
172
177
  const oEditPromise = oOperation.execute(
173
178
  groupId,
174
- undefined,
179
+ ignoreETag,
175
180
  operationsHelper.fnOnStrictHandlingFailed.bind(
176
181
  draft,
177
182
  groupId,
178
- { label: sActionName, model: oContext.getModel() },
179
- resourceModel,
183
+ { appComponent: CommonUtils.getAppComponent(oView), label: sActionName, model: oContext.getModel() },
180
184
  null,
181
185
  null,
182
186
  null,
@@ -219,12 +223,12 @@ async function executeDraftValidation(
219
223
  // the POST will be sent without If-Match and will generate an error on backend side.
220
224
  await (context.getBinding() as ODataContextBinding).requestObject("");
221
225
  }
222
- const operation = await draft.executeDraftPreparationAction(context, context.getUpdateGroupId(), true, ignoreETag);
223
- // if there is no returned operation by executeDraftPreparationAction -> the action has failed
224
- if (operation && !getReturnType(context, draftOperations.PREPARE)) {
226
+ const operation = draft.executeDraftPreparationAction(context, context.getUpdateGroupId(), true, ignoreETag);
227
+ if (!getReturnType(context, draftOperations.PREPARE)) {
225
228
  requestMessages(context, appComponent.getSideEffectsService());
226
229
  }
227
- return operation;
230
+
231
+ return await operation;
228
232
  } catch (error: unknown) {
229
233
  Log.error("Error while requesting messages", error as string);
230
234
  }
@@ -264,8 +268,7 @@ async function executeDraftActivationAction(
264
268
  ? operationsHelper.fnOnStrictHandlingFailed.bind(
265
269
  draft,
266
270
  sGroupId,
267
- { label: sActionName, model: oContext.getModel() },
268
- resourceModel,
271
+ { appComponent: oAppComponent, label: sActionName, model: oContext.getModel() },
269
272
  null,
270
273
  null,
271
274
  null,
@@ -385,12 +388,12 @@ async function requestMessages(oContext: Context, oSideEffectsService: SideEffec
385
388
  async function executeDraftDiscardAction(
386
389
  oContext: Context,
387
390
  messageHandler: MessageHandler,
388
- oAppComponent?: AppComponent,
391
+ oAppComponent: AppComponent,
389
392
  bEnableStrictHandling?: boolean
390
393
  ): Promise<void> {
391
394
  if (!oContext.getProperty("IsActiveEntity")) {
392
395
  const oDiscardOperation = draft.createOperation(oContext, draftOperations.DISCARD);
393
- const resourceModel = oAppComponent && getResourceModel(oAppComponent);
396
+ const resourceModel = getResourceModel(oAppComponent);
394
397
  const sGroupId = "direct";
395
398
  const sActionName = resourceModel?.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON") || "";
396
399
  // as the discard action doesnt' send the active version in the response we do not use the replace in cache
@@ -402,8 +405,7 @@ async function executeDraftDiscardAction(
402
405
  operationsHelper.fnOnStrictHandlingFailed.bind(
403
406
  draft,
404
407
  sGroupId,
405
- { label: sActionName, model: oContext.getModel() },
406
- resourceModel,
408
+ { AppComponent: oAppComponent, label: sActionName, model: oContext.getModel() },
407
409
  null,
408
410
  null,
409
411
  null,
@@ -497,6 +499,16 @@ async function computeSiblingInformation(
497
499
  // --> ["Param(aa)/Entity(bb-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)/_SubNav(dd-sibling)"]
498
500
  const canonicalPaths = (await Promise.all(canonicalPathPromises)) as string[];
499
501
 
502
+ // Workaround (temporary ?): when the sibling doesn't exist, requestCanonicalPath returns the same path
503
+ if (
504
+ canonicalPaths.some((path) => {
505
+ return path && path.endsWith("/SiblingEntity");
506
+ })
507
+ ) {
508
+ // At least one sibling entity doesn't exist
509
+ return undefined;
510
+ }
511
+
500
512
  if (rootContextInfo?.rootSiblingPathPromise) {
501
513
  const rootSiblingPath = (await rootContextInfo.rootSiblingPathPromise)?.getPath() as string;
502
514
  canonicalPaths.unshift(rootSiblingPath);
@@ -749,7 +761,7 @@ async function showEditConfirmationMessageBox(sUnsavedChangesMsg: string, oConte
749
761
  async function deleteDraft(
750
762
  oContext: Context,
751
763
  messageHandler: MessageHandler,
752
- oAppComponent?: AppComponent,
764
+ oAppComponent: AppComponent,
753
765
  bEnableStrictHandling?: boolean
754
766
  ): Promise<void> {
755
767
  const sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
@@ -2,25 +2,25 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "../../controls/DataLossOrDraftDiscard/DraftDataLossDialog.block", "../../controls/Recommendations/ConfirmRecommendationDialog.block"], function (Log, CommonUtils, EditState, ModelHelper, DraftDataLossDialogBlock, ConfirmRecommendationDialog_block) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "../../controls/DataLossOrDraftDiscard/DraftDataLossDialog", "../../controls/Recommendations/ConfirmRecommendationDialog"], function (Log, CommonUtils, EditState, ModelHelper, DraftDataLossDialog, ConfirmRecommendationDialog) {
6
6
  "use strict";
7
7
 
8
- var RecommendationDialogDecision = ConfirmRecommendationDialog_block.RecommendationDialogDecision;
8
+ var RecommendationDialogDecision = ConfirmRecommendationDialog.RecommendationDialogDecision;
9
9
  /* Enum for navigation types */
10
- var NavigationType;
11
- /* Enum types for the data loss dialog options */
12
- (function (NavigationType) {
10
+ var NavigationType = /*#__PURE__*/function (NavigationType) {
13
11
  NavigationType["BackNavigation"] = "BackNavigation";
14
12
  NavigationType["ForwardNavigation"] = "ForwardNavigation";
15
- })(NavigationType || (NavigationType = {}));
16
- var DraftDataLossOptions;
17
- (function (DraftDataLossOptions) {
13
+ return NavigationType;
14
+ }(NavigationType || {});
15
+ /* Enum types for the data loss dialog options */
16
+ var DraftDataLossOptions = /*#__PURE__*/function (DraftDataLossOptions) {
18
17
  DraftDataLossOptions["Save"] = "draftDataLossOptionSave";
19
18
  DraftDataLossOptions["Keep"] = "draftDataLossOptionKeep";
20
19
  DraftDataLossOptions["Discard"] = "draftDataLossOptionDiscard";
21
- })(DraftDataLossOptions || (DraftDataLossOptions = {}));
20
+ return DraftDataLossOptions;
21
+ }(DraftDataLossOptions || {});
22
22
  /*Create the data loss dialog*/
23
- const dataLossDialog = new DraftDataLossDialogBlock({});
23
+ const dataLossDialog = new DraftDataLossDialog("fe::DraftDataLossPopup");
24
24
 
25
25
  /**
26
26
  * The method checks whether an optional parameter in the manifest is set to silently keep the draft in case a forward navigation is triggered.
@@ -28,9 +28,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
28
28
  * @returns Boolean value with true or false to silently keep the draft
29
29
  */
30
30
  function silentlyKeepDraftOnForwardNavigation(pageController) {
31
- var _oManifest$app;
32
31
  const oManifest = pageController.getAppComponent().getManifestEntry("sap.fe");
33
- return (oManifest === null || oManifest === void 0 ? void 0 : (_oManifest$app = oManifest.app) === null || _oManifest$app === void 0 ? void 0 : _oManifest$app.silentlyKeepDraftOnForwardNavigation) || false;
32
+ return oManifest?.app?.silentlyKeepDraftOnForwardNavigation || false;
34
33
  }
35
34
 
36
35
  /**
@@ -41,16 +40,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
41
40
  * @param processFunctionForDrafts The function to process the handler
42
41
  * @param bSkipBindingToView The optional parameter to skip the binding to the view
43
42
  * @param context The context to be used for the draft operation
43
+ * @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
44
44
  * @returns Nothing
45
45
  */
46
- async function processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, context) {
46
+ async function processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, context, hiddenDraft) {
47
47
  // The application is running in FCL mode so in this case we fall back to
48
48
  // the old logic since the dirty state handling is not properly working
49
49
  // for FCL.
50
- if (draftAdminData.CreationDateTime !== draftAdminData.LastChangeDateTime) {
51
- return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
52
- } else {
50
+ if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime && !oController.editFlow.isDocumentModified()) {
53
51
  processFunctionForDrafts();
52
+ } else {
53
+ return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context, hiddenDraft));
54
54
  }
55
55
  }
56
56
 
@@ -64,15 +64,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
64
64
  * @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
65
65
  * @param bSkipBindingToView The optional parameter to skip the binding to the view
66
66
  * @param context The context to be used for the draft operations
67
+ * @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
67
68
  * @returns Nothing
68
69
  */
69
- async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context) {
70
+ async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context, hiddenDraft) {
70
71
  // There is no active entity so, we are editing either newly created data or
71
72
  // a draft which has never been saved to active version
72
73
  // Since we want to react differently in the two situations, we have to check the
73
74
  // dirty state
74
75
  if (EditState.isEditStateDirty()) {
75
- if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime && navigationType === NavigationType.BackNavigation) {
76
+ if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime && !oController.editFlow.isDocumentModified() && navigationType === NavigationType.BackNavigation) {
76
77
  // in case we have untouched changes for the draft and a "back"
77
78
  // navigation we can silently discard the draft again
78
79
  // eslint-disable-next-line promise/no-nesting
@@ -89,7 +90,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
89
90
  } else {
90
91
  // In this case data is being changed or a forward navigation is triggered
91
92
  // and, we always want to show the data loss dialog on navigation
92
- return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
93
+ return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context, hiddenDraft));
93
94
  }
94
95
  } else {
95
96
  // We are editing a draft which has been created earlier but never saved to active
@@ -116,7 +117,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
116
117
  // navigation but in case of a forward navigation we want to silently keep it!
117
118
  if (navigationType === NavigationType.BackNavigation) {
118
119
  const mParameters = {
119
- skipDiscardPopover: true
120
+ skipDiscardPopover: true,
121
+ skipBindingToView: true
120
122
  };
121
123
  try {
122
124
  await oController.editFlow.cancelDocument(oContext, mParameters);
@@ -140,9 +142,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
140
142
  * @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
141
143
  * @param bSkipBindingToView The optional parameter to skip the binding to the view.
142
144
  * @param context The context to be used for the draft operations
145
+ * @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
143
146
  * @returns Nothing
144
147
  */
145
- async function processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context) {
148
+ async function processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context, hiddenDraft) {
146
149
  if (navigationType === NavigationType.ForwardNavigation && bSilentlyKeepDraftOnForwardNavigation) {
147
150
  // In case we have a "forward navigation" and an additional parameter set in the manifest
148
151
  // we "silently" keep the draft
@@ -153,7 +156,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
153
156
  // have been made in the current editing session or not
154
157
  // Changes have been made in the current editing session, so we want
155
158
  // to show the data loss dialog and let the user decide
156
- return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
159
+ return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context, hiddenDraft));
157
160
  }
158
161
  }
159
162
 
@@ -162,14 +165,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
162
165
  * @param draftAdminData Admin data
163
166
  * @param fnProcessFunction The function to process the handler
164
167
  * @param fnCancelFunction The cancel function
165
- * @param oContext The context of the current call
168
+ * @param context Context
166
169
  * @param oController The current controller referenced
167
170
  * @param bSkipBindingToView The optional parameter to skip the binding to the view
168
171
  * @param navigationType The navigation type for which the function should be called
172
+ * @param hasActiveEntity Boolean value which mentions if root context has active entity or not
173
+ * @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
169
174
  * @returns Nothing
170
175
  */
171
- async function processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
176
+ async function processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, context, oController, bSkipBindingToView) {
172
177
  let navigationType = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : NavigationType.BackNavigation;
178
+ let hasActiveEntity = arguments.length > 7 ? arguments[7] : undefined;
179
+ let hiddenDraft = arguments.length > 8 ? arguments[8] : undefined;
173
180
  const collaborationConnected = oController.collaborativeDraft.isConnected();
174
181
  const processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
175
182
  oController.collaborativeDraft.disconnect();
@@ -181,13 +188,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
181
188
  const bSilentlyKeepDraftOnForwardNavigation = silentlyKeepDraftOnForwardNavigation(oController);
182
189
  if (draftAdminData) {
183
190
  if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
184
- await processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, oContext);
185
- } else if (!oContext.getObject().HasActiveEntity) {
186
- processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView);
187
- } else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
188
- processEditingDraftForExistingEntity(oController, oContext, processFunctionForDrafts, navigationType);
191
+ await processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, context, hiddenDraft);
192
+ } else if (!hasActiveEntity) {
193
+ processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, undefined, hiddenDraft);
194
+ } else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime && !hiddenDraft) {
195
+ processEditingDraftForExistingEntity(oController, context, processFunctionForDrafts, navigationType);
189
196
  } else if (EditState.isEditStateDirty()) {
190
- processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView);
197
+ processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context, hiddenDraft);
191
198
  } else {
192
199
  // The user started editing the existing draft but did not make any changes
193
200
  // in the current editing session, so in this case we do not want
@@ -207,9 +214,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
207
214
  * @param oController
208
215
  * @param bSkipBindingToView
209
216
  * @param navigationType
217
+ * @param alwaysShowInHiddenDraft
210
218
  */
211
219
  async function processDataLossOrDraftDiscardConfirmation(fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
212
220
  let navigationType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : NavigationType.BackNavigation;
221
+ let alwaysShowInHiddenDraft = arguments.length > 6 ? arguments[6] : undefined;
213
222
  const oView = oController.getView();
214
223
  const oModel = oView.getBindingContext().getModel();
215
224
  const oMetaModel = oModel.getMetaModel();
@@ -225,17 +234,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
225
234
  $expand: "DraftAdministrativeData"
226
235
  }).getBoundContext();
227
236
  }
228
-
229
- // Shouldn't display data loss popover on shell back navigation from sub-object pages
237
+ const hiddenDraft = oController.getAppComponent().getEnvironmentCapabilities()?.getCapabilities()?.HiddenDraft?.enabled;
238
+ // Shouldn't display data loss popover on shell back navigation from sub-object pages (unless there's no page before in the history because of deep linking)
230
239
  // or when object page is in display mode, or when the object is deleted
231
- if (originalContext.isDeleted() || !isDraftRoot && navigationType === NavigationType.BackNavigation || !bIsEditable) {
240
+ const backNavShowsDialog = isDraftRoot || oController.getAppComponent().getRouterProxy().checkIfBackExitsApp() || hiddenDraft && alwaysShowInHiddenDraft;
241
+ if (originalContext.isDeleted() || !backNavShowsDialog && navigationType === NavigationType.BackNavigation || !bIsEditable) {
232
242
  fnProcessFunction();
233
243
  } else {
234
244
  try {
235
245
  // The following 3 properties are needed to determine the state of the draft, so we ensure they are loaded
236
246
  await oContext.requestProperty(["DraftAdministrativeData/CreationDateTime", "DraftAdministrativeData/LastChangeDateTime", "HasActiveEntity"]);
237
247
  const draftAdminData = oContext.getObject("DraftAdministrativeData");
238
- await processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView, navigationType);
248
+ await processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, hiddenDraft ? originalContext : oContext, oController, bSkipBindingToView, navigationType, oContext.getProperty("HasActiveEntity"), hiddenDraft);
239
249
  } catch (oError) {
240
250
  Log.error("Cannot retrieve draftDataContext information", oError);
241
251
  fnProcessFunction();
@@ -265,12 +275,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
265
275
  * @param controller Controller of the current view
266
276
  * @param skipBindingToView The parameter to skip the binding to the view
267
277
  * @param context The context to be used for the draft operations
278
+ * @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
268
279
  * @returns A promise resolved if cancelDocument was successful
269
280
  */
270
- async function discardDraft(controller, skipBindingToView, context) {
281
+ async function discardDraft(controller, skipBindingToView, context, hiddenDraft) {
271
282
  context = context ?? controller.getView().getBindingContext();
272
283
  const params = {
273
- skipBackNavigation: true,
284
+ skipBackNavigation: hiddenDraft && !context.getProperty("HasActiveEntity") ? false : true,
274
285
  skipDiscardPopover: true,
275
286
  skipBindingToView: skipBindingToView !== undefined ? skipBindingToView : true
276
287
  };
@@ -285,8 +296,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
285
296
  * @param controller Controller of the current view
286
297
  * @param skipBindingToView The parameter to skip the binding to the view
287
298
  * @param context The context to be used for the binding
299
+ * @param hiddenDraft Boolean value which mentions if hidden draft is enabled or not
288
300
  */
289
- function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView, context) {
301
+ function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView, context, hiddenDraft) {
290
302
  switch (selectedKey) {
291
303
  case DraftDataLossOptions.Save:
292
304
  draftDataLossPopup.saveDocument(controller, context).then(savedContext => processFunctionForDrafts(savedContext)).catch(function (error) {
@@ -302,7 +314,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
302
314
  dataLossDialog.close();
303
315
  break;
304
316
  case DraftDataLossOptions.Discard:
305
- draftDataLossPopup.discardDraft(controller, skipBindingToView, context).then(discardedDraft => processFunctionForDrafts(discardedDraft)).catch(function (error) {
317
+ draftDataLossPopup.discardDraft(controller, skipBindingToView, context, hiddenDraft).then(discardedDraft => processFunctionForDrafts(discardedDraft)).catch(function (error) {
306
318
  Log.error("Error while discarding draft", error);
307
319
  });
308
320
  dataLossDialog.close();
@@ -326,4 +338,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/E
326
338
  };
327
339
  return draftDataLossPopup;
328
340
  }, false);
329
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2siLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJwYWdlQ29udHJvbGxlciIsIl9vTWFuaWZlc3QkYXBwIiwib01hbmlmZXN0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0TWFuaWZlc3RFbnRyeSIsImFwcCIsInByb2Nlc3NGY2xNb2RlIiwiZHJhZnRBZG1pbkRhdGEiLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJjb250ZXh0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsIm9wZW4iLCJ0aGVuIiwic2VsZWN0ZWRLZXkiLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJoYW5kbGVEaWFsb2dTZWxlY3Rpb24iLCJwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlIiwibmF2aWdhdGlvblR5cGUiLCJiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIkJhY2tOYXZpZ2F0aW9uIiwiZGlzY2FyZERyYWZ0IiwiZXJyb3IiLCJMb2ciLCJGb3J3YXJkTmF2aWdhdGlvbiIsInByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlZGl0RmxvdyIsImNhbmNlbERvY3VtZW50IiwicHJvY2Vzc0VkaXRTdGF0ZURpcnR5IiwicHJvY2Vzc0RyYWZ0QWRtaW5EYXRhIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJhcHBseSIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImdldE9iamVjdCIsIkhhc0FjdGl2ZUVudGl0eSIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwib1ZpZXciLCJnZXRWaWV3Iiwib01vZGVsIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJ2aWV3RGF0YSIsImdldFZpZXdEYXRhIiwiY29udGV4dFBhdGgiLCJlbnRpdHlTZXQiLCJpc0RyYWZ0Um9vdCIsImJJc0VkaXRhYmxlIiwiQ29tbW9uVXRpbHMiLCJnZXRJc0VkaXRhYmxlIiwib3JpZ2luYWxDb250ZXh0IiwiZHJhZnRSb290UGF0aCIsImdldFBhdGgiLCJNb2RlbEhlbHBlciIsImdldERyYWZ0Um9vdFBhdGgiLCJiaW5kQ29udGV4dCIsIiRleHBhbmQiLCJnZXRCb3VuZENvbnRleHQiLCJpc0RlbGV0ZWQiLCJyZXF1ZXN0UHJvcGVydHkiLCJvRXJyb3IiLCJzYXZlRG9jdW1lbnQiLCJjb250cm9sbGVyIiwiaGFzSW5pdGlhbENvbnRleHQiLCJpc0EiLCJfc2F2ZURvY3VtZW50Iiwic2tpcEJpbmRpbmdUb1ZpZXciLCJwYXJhbXMiLCJza2lwQmFja05hdmlnYXRpb24iLCJTYXZlIiwic2F2ZWRDb250ZXh0IiwiY2F0Y2giLCJSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIiwiQ29udGludWUiLCJjbG9zZSIsIktlZXAiLCJEaXNjYXJkIiwiZGlzY2FyZGVkRHJhZnQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImRyYWZ0RGF0YUxvc3NQb3B1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUNvbnRyb2xsZXJDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgRHJhZnREYXRhTG9zc0RpYWxvZ0Jsb2NrIGZyb20gXCIuLi8uLi9jb250cm9scy9EYXRhTG9zc09yRHJhZnREaXNjYXJkL0RyYWZ0RGF0YUxvc3NEaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB7IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfSBmcm9tIFwiLi4vLi4vY29udHJvbHMvUmVjb21tZW5kYXRpb25zL0NvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZy5ibG9ja1wiO1xuXG4vKiBFbnVtIGZvciBuYXZpZ2F0aW9uIHR5cGVzICovXG5lbnVtIE5hdmlnYXRpb25UeXBlIHtcblx0QmFja05hdmlnYXRpb24gPSBcIkJhY2tOYXZpZ2F0aW9uXCIsXG5cdEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXG59XG5cbi8qIEVudW0gdHlwZXMgZm9yIHRoZSBkYXRhIGxvc3MgZGlhbG9nIG9wdGlvbnMgKi9cbmVudW0gRHJhZnREYXRhTG9zc09wdGlvbnMge1xuXHRTYXZlID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uU2F2ZVwiLFxuXHRLZWVwID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uS2VlcFwiLFxuXHREaXNjYXJkID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uRGlzY2FyZFwiXG59XG5cbnR5cGUgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgPSB7XG5cdENyZWF0aW9uRGF0ZVRpbWU6IERhdGU7XG5cdExhc3RDaGFuZ2VEYXRlVGltZTogRGF0ZTtcbn07XG5cbi8qQ3JlYXRlIHRoZSBkYXRhIGxvc3MgZGlhbG9nKi9cbmNvbnN0IGRhdGFMb3NzRGlhbG9nID0gbmV3IERyYWZ0RGF0YUxvc3NEaWFsb2dCbG9jayh7fSk7XG5cbi8qKlxuICogVGhlIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gdGhlIG1hbmlmZXN0IGlzIHNldCB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBpbiBjYXNlIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBwYWdlQ29udHJvbGxlciBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFBhZ2VDb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdpdGggdHJ1ZSBvciBmYWxzZSB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdFxuICovXG5mdW5jdGlvbiBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24ocGFnZUNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKTogYm9vbGVhbiB7XG5cdGNvbnN0IG9NYW5pZmVzdCA9IHBhZ2VDb250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuZmVcIik7XG5cdHJldHVybiBvTWFuaWZlc3Q/LmFwcD8uc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIEZDTCBtb2RlLlxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGY2xNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0Ly8gdGhlIG9sZCBsb2dpYyBzaW5jZSB0aGUgZGlydHkgc3RhdGUgaGFuZGxpbmcgaXMgbm90IHByb3Blcmx5IHdvcmtpbmdcblx0Ly8gZm9yIEZDTC5cblx0aWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBtb2RlIHdpdGggbm8gYWN0aXZlIGVudGl0eS5cbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEBwYXJhbSBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIFRoZSBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2tpcCB0aGUgcG9wdXAgYXBwZWFyYW5jZSBpbiBmb3J3YXJkIGNhc2VcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uc1xuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSxcblx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gVGhlcmUgaXMgbm8gYWN0aXZlIGVudGl0eSBzbywgd2UgYXJlIGVkaXRpbmcgZWl0aGVyIG5ld2x5IGNyZWF0ZWQgZGF0YSBvclxuXHQvLyBhIGRyYWZ0IHdoaWNoIGhhcyBuZXZlciBiZWVuIHNhdmVkIHRvIGFjdGl2ZSB2ZXJzaW9uXG5cdC8vIFNpbmNlIHdlIHdhbnQgdG8gcmVhY3QgZGlmZmVyZW50bHkgaW4gdGhlIHR3byBzaXR1YXRpb25zLCB3ZSBoYXZlIHRvIGNoZWNrIHRoZVxuXHQvLyBkaXJ0eSBzdGF0ZVxuXHRpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdGlmIChkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUgJiYgbmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHQvLyBpbiBjYXNlIHdlIGhhdmUgdW50b3VjaGVkIGNoYW5nZXMgZm9yIHRoZSBkcmFmdCBhbmQgYSBcImJhY2tcIlxuXHRcdFx0Ly8gbmF2aWdhdGlvbiB3ZSBjYW4gc2lsZW50bHkgZGlzY2FyZCB0aGUgZHJhZnQgYWdhaW5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL25vLW5lc3Rpbmdcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0RGF0YUxvc3NQb3B1cC5kaXNjYXJkRHJhZnQob0NvbnRyb2xsZXIsIGJTa2lwQmluZGluZ1RvVmlldywgY29udGV4dCk7XG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY2FuY2VsaW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkZvcndhcmROYXZpZ2F0aW9uICYmIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24pIHtcblx0XHRcdC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdC8vIHdlIFwic2lsZW50bHlcIiBrZWVwIHRoZSBkcmFmdFxuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEluIHRoaXMgY2FzZSBkYXRhIGlzIGJlaW5nIGNoYW5nZWQgb3IgYSBmb3J3YXJkIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdFx0XHQvLyBhbmQsIHdlIGFsd2F5cyB3YW50IHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgb24gbmF2aWdhdGlvblxuXHRcdFx0cmV0dXJuIGRhdGFMb3NzRGlhbG9nXG5cdFx0XHRcdC5vcGVuKG9Db250cm9sbGVyKVxuXHRcdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwLmhhbmRsZURpYWxvZ1NlbGVjdGlvbihcblx0XHRcdFx0XHRcdHNlbGVjdGVkS2V5IGFzIHN0cmluZyxcblx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFdlIGFyZSBlZGl0aW5nIGEgZHJhZnQgd2hpY2ggaGFzIGJlZW4gY3JlYXRlZCBlYXJsaWVyIGJ1dCBuZXZlciBzYXZlZCB0byBhY3RpdmVcblx0XHQvLyB2ZXJzaW9uIGFuZCBzaW5jZSB0aGUgZWRpdCBzdGF0ZSBpcyBub3QgZGlydHksIHRoZXJlIGhhdmUgYmVlbiBubyB1c2VyIGNoYW5nZXNcblx0XHQvLyBzbyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBzaWxlbnRseSBuYXZpZ2F0ZSBhbmQgZG8gbm90aGluZ1xuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgZHJhZnQgZWRpdGluZyBmb3IgZXhpc3RpbmcgZW50aXR5LlxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBjYWxsXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5KFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBGdW5jdGlvbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHQvLyBUaGUgQ3JlYXRpb25EYXRlVGltZSBhbmQgTGFzdENoYW5nZURhdGVUaW1lIGFyZSBlcXVhbCwgc28gdGhpcyBkcmFmdCB3YXNcblx0Ly8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXG5cdC8vIGFuIGV4aXN0aW5nIGFjdGl2ZSBlbnRpdHkgZm9yIHRoZSBmaXJzdCB0aW1lLlxuXHQvLyBBbHNvLCB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0Ly8gY2FzZSB3ZSB3YW50IHRvIHNpbGVudGx5IG5hdmlnYXRlIGFuZCBkZWxldGUgdGhlIGRyYWZ0IGluIGNhc2Ugb2YgYSBiYWNrXG5cdC8vIG5hdmlnYXRpb24gYnV0IGluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugd2FudCB0byBzaWxlbnRseSBrZWVwIGl0IVxuXHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWVcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IG9Db250cm9sbGVyLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY2FuY2VsaW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBFcnJvcik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHQvLyBleGVjdXRlIHRoZSBmb2xsb3d1cCBmdW5jdGlvbi5cblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGNvbnRleHQgd2hlbiB0aGUgZWRpdCBzdGF0ZSBpcyBpbiBkaXJ0eSBtb2RlLlxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gVGhlIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBza2lwIHRoZSBwb3B1cCBhcHBlYXJhbmNlIGluIGZvcndhcmQgY2FzZVxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcuXG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uc1xuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSxcblx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0Ly8gSW4gY2FzZSB3ZSBoYXZlIGEgXCJmb3J3YXJkIG5hdmlnYXRpb25cIiBhbmQgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgc2V0IGluIHRoZSBtYW5pZmVzdFxuXHRcdC8vIHdlIFwic2lsZW50bHlcIiBrZWVwIHRoZSBkcmFmdFxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdC8vIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyB3ZSB3YW50XG5cdFx0Ly8gdG8gc2hvdyB0aGUgZGF0YSBsb3NzIGRpYWxvZyBhbmQgbGV0IHRoZSB1c2VyIGRlY2lkZVxuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBhZG1pbiBkYXRhLlxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RyYWZ0QWRtaW5EYXRhKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBvQ29udHJvbGxlci5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0XHRcdG9Db250cm9sbGVyLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLmFwcGx5KG51bGwsIC4uLmFyZ3MpO1xuXHRcdCAgfTtcblxuXHRjb25zdCBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uID0gc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKG9Db250cm9sbGVyKTtcblxuXHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGF3YWl0IHByb2Nlc3NGY2xNb2RlKGRyYWZ0QWRtaW5EYXRhLCBmbkNhbmNlbEZ1bmN0aW9uLCBvQ29udHJvbGxlciwgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLCBiU2tpcEJpbmRpbmdUb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9IGVsc2UgaWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUoXG5cdFx0XHRcdGRyYWZ0QWRtaW5EYXRhLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRuYXZpZ2F0aW9uVHlwZSxcblx0XHRcdFx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSB7XG5cdFx0XHRwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHkob0NvbnRyb2xsZXIsIG9Db250ZXh0LCBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsIG5hdmlnYXRpb25UeXBlKTtcblx0XHR9IGVsc2UgaWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHByb2Nlc3NFZGl0U3RhdGVEaXJ0eShcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGUsXG5cdFx0XHRcdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlld1xuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVGhlIHVzZXIgc3RhcnRlZCBlZGl0aW5nIHRoZSBleGlzdGluZyBkcmFmdCBidXQgZGlkIG5vdCBtYWtlIGFueSBjaGFuZ2VzXG5cdFx0XHQvLyBpbiB0aGUgY3VycmVudCBlZGl0aW5nIHNlc3Npb24sIHNvIGluIHRoaXMgY2FzZSB3ZSBkbyBub3Qgd2FudFxuXHRcdFx0Ly8gdG8gc2hvdyB0aGUgZGF0YSBsb3NzIGRpYWxvZyBidXQganVzdCBrZWVwIHRoZSBkcmFmdFxuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZuUHJvY2Vzc0Z1bmN0aW9uKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgZ2VuZXJhbCBoYW5kbGVyIGluIHdoaWNoIHRoZSBpbmRpdmlkdWFsIHN0ZXBzIGFyZSBjYWxsZWQuXG4gKiBAcGFyYW0gZm5Qcm9jZXNzRnVuY3Rpb25cbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHRcbiAqIEBwYXJhbSBvQ29udHJvbGxlclxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlld1xuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRmblByb2Nlc3NGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBvVmlldyA9IG9Db250cm9sbGVyLmdldFZpZXcoKTtcblx0Y29uc3Qgb01vZGVsID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRNb2RlbCgpO1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCB2aWV3RGF0YSA9IG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgeyBlbnRpdHlTZXQ/OiBzdHJpbmc7IGNvbnRleHRQYXRoPzogc3RyaW5nIH07XG5cdGNvbnN0IGNvbnRleHRQYXRoID0gdmlld0RhdGEuY29udGV4dFBhdGggfHwgKHZpZXdEYXRhLmVudGl0eVNldCA/IGAvJHt2aWV3RGF0YS5lbnRpdHlTZXR9YCA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IGlzRHJhZnRSb290ID0gY29udGV4dFBhdGggPyAhIW9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke2NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCkgOiBmYWxzZTtcblx0Y29uc3QgYklzRWRpdGFibGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKG9WaWV3KTtcblx0Y29uc3Qgb3JpZ2luYWxDb250ZXh0ID0gb0NvbnRleHQ7XG5cdGxldCBkcmFmdFJvb3RQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRpZiAoIWlzRHJhZnRSb290KSB7XG5cdFx0ZHJhZnRSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpID8/IGRyYWZ0Um9vdFBhdGg7XG5cdFx0b0NvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoZHJhZnRSb290UGF0aCwgdW5kZWZpbmVkLCB7ICRleHBhbmQ6IFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIiB9KS5nZXRCb3VuZENvbnRleHQoKTtcblx0fVxuXG5cdC8vIFNob3VsZG4ndCBkaXNwbGF5IGRhdGEgbG9zcyBwb3BvdmVyIG9uIHNoZWxsIGJhY2sgbmF2aWdhdGlvbiBmcm9tIHN1Yi1vYmplY3QgcGFnZXNcblx0Ly8gb3Igd2hlbiBvYmplY3QgcGFnZSBpcyBpbiBkaXNwbGF5IG1vZGUsIG9yIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkXG5cdGlmIChvcmlnaW5hbENvbnRleHQuaXNEZWxldGVkKCkgfHwgKCFpc0RyYWZ0Um9vdCAmJiBuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24pIHx8ICFiSXNFZGl0YWJsZSkge1xuXHRcdGZuUHJvY2Vzc0Z1bmN0aW9uKCk7XG5cdH0gZWxzZSB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIFRoZSBmb2xsb3dpbmcgMyBwcm9wZXJ0aWVzIGFyZSBuZWVkZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0ZSBvZiB0aGUgZHJhZnQsIHNvIHdlIGVuc3VyZSB0aGV5IGFyZSBsb2FkZWRcblx0XHRcdGF3YWl0IG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXG5cdFx0XHRcdFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvQ3JlYXRpb25EYXRlVGltZVwiLFxuXHRcdFx0XHRcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZVwiLFxuXHRcdFx0XHRcIkhhc0FjdGl2ZUVudGl0eVwiXG5cdFx0XHRdKTtcblx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRhd2FpdCBwcm9jZXNzRHJhZnRBZG1pbkRhdGEoXG5cdFx0XHRcdGRyYWZ0QWRtaW5EYXRhLFxuXHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbixcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIGRyYWZ0RGF0YUNvbnRleHQgaW5mb3JtYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBkb2N1bWVudC4gSWYgdGhlIGNvbnRyb2xsZXIgaXMgb2YgdHlwZSBPYmplY3RQYWdlLCB0aGVuIGludGVybmFsIF9zYXZlRG9jdW1lbnQgaXMgY2FsbGVkLCBvdGhlcndpc2Ugc2F2ZURvY3VtZW50XG4gKiBmcm9tIEVkaXRGbG93IGlzIGNhbGxlZC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiB0aGUgc2F2ZSB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlRG9jdW1lbnQoY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCBoYXNJbml0aWFsQ29udGV4dCA9IGNvbnRleHQgIT09IHVuZGVmaW5lZDtcblx0Y29udGV4dCA9IGNvbnRleHQgPz8gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0aWYgKCFoYXNJbml0aWFsQ29udGV4dCAmJiBjb250cm9sbGVyLmlzQTxPYmplY3RQYWdlQ29udHJvbGxlckNvbnRyb2xsZXI+KFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuX3NhdmVEb2N1bWVudCgpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb250cm9sbGVyLmVkaXRGbG93LnNhdmVEb2N1bWVudChjb250ZXh0LCB7fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBEaXNjYXJkcyB0aGUgZHJhZnQuXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2ZWQgaWYgY2FuY2VsRG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlzY2FyZERyYWZ0KFxuXHRjb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0c2tpcEJpbmRpbmdUb1ZpZXc6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdGNvbnRleHQgPSBjb250ZXh0ID8/IGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRza2lwQmFja05hdmlnYXRpb246IHRydWUsXG5cdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlLFxuXHRcdHNraXBCaW5kaW5nVG9WaWV3OiBza2lwQmluZGluZ1RvVmlldyAhPT0gdW5kZWZpbmVkID8gc2tpcEJpbmRpbmdUb1ZpZXcgOiB0cnVlXG5cdH07XG5cdHJldHVybiBjb250cm9sbGVyLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KGNvbnRleHQsIHBhcmFtcyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGZvbGxvdy11cCBmdW5jdGlvbnMgYWZ0ZXIgYW4gb3B0aW9uIHdhcyBzZWxlY3RlZCBpbiB0aGUgZGF0YSBsb3NzIGRpYWxvZy5cbiAqIEBwYXJhbSBzZWxlY3RlZEtleSBUaGUga2V5IG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gZnJvbSB0aGUgZGF0YSBsb3NzIGRpYWxvZ1xuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRzZWxlY3RlZEtleTogc3RyaW5nLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0Y29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHRcbik6IHZvaWQge1xuXHRzd2l0Y2ggKHNlbGVjdGVkS2V5KSB7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5TYXZlOlxuXHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwXG5cdFx0XHRcdC5zYXZlRG9jdW1lbnQoY29udHJvbGxlciwgY29udGV4dClcblx0XHRcdFx0LnRoZW4oKHNhdmVkQ29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhzYXZlZENvbnRleHQpKVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoZXJyb3IgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuS2VlcDpcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3LCBjb250ZXh0KVxuXHRcdFx0XHQudGhlbigoZGlzY2FyZGVkRHJhZnQ/KSA9PiBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoZGlzY2FyZGVkRHJhZnQpKVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIGRyYWZ0XCIsIGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24oKTtcblx0XHRcdGRhdGFMb3NzRGlhbG9nLmNsb3NlKCk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnREYXRhTG9zc1BvcHVwID0ge1xuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdHByb2Nlc3NGY2xNb2RlOiBwcm9jZXNzRmNsTW9kZSxcblx0cHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZTogcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZSxcblx0cHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5OiBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHksXG5cdHByb2Nlc3NFZGl0U3RhdGVEaXJ0eTogcHJvY2Vzc0VkaXRTdGF0ZURpcnR5LFxuXHRoYW5kbGVEaWFsb2dTZWxlY3Rpb246IGhhbmRsZURpYWxvZ1NlbGVjdGlvbixcblx0c2F2ZURvY3VtZW50OiBzYXZlRG9jdW1lbnQsXG5cdGRpc2NhcmREcmFmdDogZGlzY2FyZERyYWZ0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdERhdGFMb3NzUG9wdXA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0VBVUE7RUFBQSxJQUNLQSxjQUFjO0VBS25CO0VBQUEsV0FMS0EsY0FBYztJQUFkQSxjQUFjO0lBQWRBLGNBQWM7RUFBQSxHQUFkQSxjQUFjLEtBQWRBLGNBQWM7RUFBQSxJQU1kQyxvQkFBb0I7RUFBQSxXQUFwQkEsb0JBQW9CO0lBQXBCQSxvQkFBb0I7SUFBcEJBLG9CQUFvQjtJQUFwQkEsb0JBQW9CO0VBQUEsR0FBcEJBLG9CQUFvQixLQUFwQkEsb0JBQW9CO0VBV3pCO0VBQ0EsTUFBTUMsY0FBYyxH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
341
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwicGFnZUNvbnRyb2xsZXIiLCJvTWFuaWZlc3QiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRNYW5pZmVzdEVudHJ5IiwiYXBwIiwicHJvY2Vzc0ZjbE1vZGUiLCJkcmFmdEFkbWluRGF0YSIsImZuQ2FuY2VsRnVuY3Rpb24iLCJvQ29udHJvbGxlciIsInByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyIsImJTa2lwQmluZGluZ1RvVmlldyIsImNvbnRleHQiLCJoaWRkZW5EcmFmdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJlZGl0RmxvdyIsImlzRG9jdW1lbnRNb2RpZmllZCIsIm9wZW4iLCJ0aGVuIiwic2VsZWN0ZWRLZXkiLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJoYW5kbGVEaWFsb2dTZWxlY3Rpb24iLCJwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlIiwibmF2aWdhdGlvblR5cGUiLCJiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIkJhY2tOYXZpZ2F0aW9uIiwiZGlzY2FyZERyYWZ0IiwiZXJyb3IiLCJMb2ciLCJGb3J3YXJkTmF2aWdhdGlvbiIsInByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJza2lwQmluZGluZ1RvVmlldyIsImNhbmNlbERvY3VtZW50IiwicHJvY2Vzc0VkaXRTdGF0ZURpcnR5IiwicHJvY2Vzc0RyYWZ0QWRtaW5EYXRhIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJoYXNBY3RpdmVFbnRpdHkiLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJhcHBseSIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiYWx3YXlzU2hvd0luSGlkZGVuRHJhZnQiLCJvVmlldyIsImdldFZpZXciLCJvTW9kZWwiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsImlzRHJhZnRSb290IiwiZ2V0T2JqZWN0IiwiYklzRWRpdGFibGUiLCJDb21tb25VdGlscyIsImdldElzRWRpdGFibGUiLCJvcmlnaW5hbENvbnRleHQiLCJkcmFmdFJvb3RQYXRoIiwiZ2V0UGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0RHJhZnRSb290UGF0aCIsImJpbmRDb250ZXh0IiwiJGV4cGFuZCIsImdldEJvdW5kQ29udGV4dCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJlbmFibGVkIiwiYmFja05hdlNob3dzRGlhbG9nIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0V4aXRzQXBwIiwiaXNEZWxldGVkIiwicmVxdWVzdFByb3BlcnR5IiwiZ2V0UHJvcGVydHkiLCJvRXJyb3IiLCJzYXZlRG9jdW1lbnQiLCJjb250cm9sbGVyIiwiaGFzSW5pdGlhbENvbnRleHQiLCJpc0EiLCJfc2F2ZURvY3VtZW50IiwicGFyYW1zIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwiU2F2ZSIsInNhdmVkQ29udGV4dCIsImNhdGNoIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiY2xvc2UiLCJLZWVwIiwiRGlzY2FyZCIsImRpc2NhcmRlZERyYWZ0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJkcmFmdERhdGFMb3NzUG9wdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL09iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IERyYWZ0RGF0YUxvc3NEaWFsb2cgZnJvbSBcIi4uLy4uL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRHJhZnREYXRhTG9zc0RpYWxvZ1wiO1xuaW1wb3J0IHsgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi8uLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSB7IEhpZGRlbkRyYWZ0IH0gZnJvbSBcIi4uLy4uL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuXG4vKiBFbnVtIGZvciBuYXZpZ2F0aW9uIHR5cGVzICovXG5lbnVtIE5hdmlnYXRpb25UeXBlIHtcblx0QmFja05hdmlnYXRpb24gPSBcIkJhY2tOYXZpZ2F0aW9uXCIsXG5cdEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXG59XG5cbi8qIEVudW0gdHlwZXMgZm9yIHRoZSBkYXRhIGxvc3MgZGlhbG9nIG9wdGlvbnMgKi9cbmVudW0gRHJhZnREYXRhTG9zc09wdGlvbnMge1xuXHRTYXZlID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uU2F2ZVwiLFxuXHRLZWVwID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uS2VlcFwiLFxuXHREaXNjYXJkID0gXCJkcmFmdERhdGFMb3NzT3B0aW9uRGlzY2FyZFwiXG59XG5cbnR5cGUgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgPSB7XG5cdENyZWF0aW9uRGF0ZVRpbWU6IERhdGU7XG5cdExhc3RDaGFuZ2VEYXRlVGltZTogRGF0ZTtcbn07XG5cbi8qQ3JlYXRlIHRoZSBkYXRhIGxvc3MgZGlhbG9nKi9cbmNvbnN0IGRhdGFMb3NzRGlhbG9nID0gbmV3IERyYWZ0RGF0YUxvc3NEaWFsb2coXCJmZTo6RHJhZnREYXRhTG9zc1BvcHVwXCIpO1xuXG4vKipcbiAqIFRoZSBtZXRob2QgY2hlY2tzIHdoZXRoZXIgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGluIHRoZSBtYW5pZmVzdCBpcyBzZXQgdG8gc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgaW4gY2FzZSBhIGZvcndhcmQgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0gcGFnZUNvbnRyb2xsZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBQYWdlQ29udHJvbGxlciBpbnN0YW5jZVxuICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSB3aXRoIHRydWUgb3IgZmFsc2UgdG8gc2lsZW50bHkga2VlcCB0aGUgZHJhZnRcbiAqL1xuZnVuY3Rpb24gc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKHBhZ2VDb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcik6IGJvb2xlYW4ge1xuXHRjb25zdCBvTWFuaWZlc3QgPSBwYWdlQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmZlXCIpO1xuXHRyZXR1cm4gb01hbmlmZXN0Py5hcHA/LnNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBGQ0wgbW9kZS5cbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICogQHBhcmFtIGhpZGRlbkRyYWZ0IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgaGlkZGVuIGRyYWZ0IGlzIGVuYWJsZWQgb3Igbm90XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGY2xNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCxcblx0aGlkZGVuRHJhZnQ/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Ly8gVGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gRkNMIG1vZGUgc28gaW4gdGhpcyBjYXNlIHdlIGZhbGwgYmFjayB0b1xuXHQvLyB0aGUgb2xkIGxvZ2ljIHNpbmNlIHRoZSBkaXJ0eSBzdGF0ZSBoYW5kbGluZyBpcyBub3QgcHJvcGVybHkgd29ya2luZ1xuXHQvLyBmb3IgRkNMLlxuXHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmICFvQ29udHJvbGxlci5lZGl0Rmxvdy5pc0RvY3VtZW50TW9kaWZpZWQoKSkge1xuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRcdGhpZGRlbkRyYWZ0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBtb2RlIHdpdGggbm8gYWN0aXZlIGVudGl0eS5cbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEBwYXJhbSBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIFRoZSBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2tpcCB0aGUgcG9wdXAgYXBwZWFyYW5jZSBpbiBmb3J3YXJkIGNhc2VcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uc1xuICogQHBhcmFtIGhpZGRlbkRyYWZ0IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgaGlkZGVuIGRyYWZ0IGlzIGVuYWJsZWQgb3Igbm90XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUoXG5cdGRyYWZ0QWRtaW5EYXRhOiBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSxcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBGdW5jdGlvbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBib29sZWFuLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHQsXG5cdGhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFRoZXJlIGlzIG5vIGFjdGl2ZSBlbnRpdHkgc28sIHdlIGFyZSBlZGl0aW5nIGVpdGhlciBuZXdseSBjcmVhdGVkIGRhdGEgb3Jcblx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHQvLyBTaW5jZSB3ZSB3YW50IHRvIHJlYWN0IGRpZmZlcmVudGx5IGluIHRoZSB0d28gc2l0dWF0aW9ucywgd2UgaGF2ZSB0byBjaGVjayB0aGVcblx0Ly8gZGlydHkgc3RhdGVcblx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRpZiAoXG5cdFx0XHRkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUgJiZcblx0XHRcdCFvQ29udHJvbGxlci5lZGl0Rmxvdy5pc0RvY3VtZW50TW9kaWZpZWQoKSAmJlxuXHRcdFx0bmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0KSB7XG5cdFx0XHQvLyBpbiBjYXNlIHdlIGhhdmUgdW50b3VjaGVkIGNoYW5nZXMgZm9yIHRoZSBkcmFmdCBhbmQgYSBcImJhY2tcIlxuXHRcdFx0Ly8gbmF2aWdhdGlvbiB3ZSBjYW4gc2lsZW50bHkgZGlzY2FyZCB0aGUgZHJhZnQgYWdhaW5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL25vLW5lc3Rpbmdcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0RGF0YUxvc3NQb3B1cC5kaXNjYXJkRHJhZnQob0NvbnRyb2xsZXIsIGJTa2lwQmluZGluZ1RvVmlldywgY29udGV4dCk7XG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY2FuY2VsaW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkZvcndhcmROYXZpZ2F0aW9uICYmIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24pIHtcblx0XHRcdC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdC8vIHdlIFwic2lsZW50bHlcIiBrZWVwIHRoZSBkcmFmdFxuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEluIHRoaXMgY2FzZSBkYXRhIGlzIGJlaW5nIGNoYW5nZWQgb3IgYSBmb3J3YXJkIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdFx0XHQvLyBhbmQsIHdlIGFsd2F5cyB3YW50IHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgb24gbmF2aWdhdGlvblxuXHRcdFx0cmV0dXJuIGRhdGFMb3NzRGlhbG9nXG5cdFx0XHRcdC5vcGVuKG9Db250cm9sbGVyKVxuXHRcdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwLmhhbmRsZURpYWxvZ1NlbGVjdGlvbihcblx0XHRcdFx0XHRcdHNlbGVjdGVkS2V5IGFzIHN0cmluZyxcblx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0XHRoaWRkZW5EcmFmdFxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCB3aGljaCBoYXMgYmVlbiBjcmVhdGVkIGVhcmxpZXIgYnV0IG5ldmVyIHNhdmVkIHRvIGFjdGl2ZVxuXHRcdC8vIHZlcnNpb24gYW5kIHNpbmNlIHRoZSBlZGl0IHN0YXRlIGlzIG5vdCBkaXJ0eSwgdGhlcmUgaGF2ZSBiZWVuIG5vIHVzZXIgY2hhbmdlc1xuXHRcdC8vIHNvIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHNpbGVudGx5IG5hdmlnYXRlIGFuZCBkbyBub3RoaW5nXG5cdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBkcmFmdCBlZGl0aW5nIGZvciBleGlzdGluZyBlbnRpdHkuXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGVcbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IGZvciBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5XG5cdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIGVxdWFsLCBzbyB0aGlzIGRyYWZ0IHdhc1xuXHQvLyBuZXZlciBzYXZlZCBiZWZvcmUsIGhlbmNlIHdlJ3JlIGN1cnJlbnRseSBlZGl0aW5nIGEgbmV3bHkgY3JlYXRlZCBkcmFmdCBmb3Jcblx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdC8vIEFsc28sIHRoZXJlIGhhdmUgc28gZmFyIGJlZW4gbm8gY2hhbmdlcyBtYWRlIHRvIHRoZSBkcmFmdCBhbmQgaW4gdGhpc1xuXHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0Ly8gbmF2aWdhdGlvbiBidXQgaW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIHNpbGVudGx5IGtlZXAgaXQhXG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24pIHtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZSxcblx0XHRcdHNraXBCaW5kaW5nVG9WaWV3OiB0cnVlXG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBvQ29udHJvbGxlci5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgRXJyb3IpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBJbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0IGFuZCBvbmx5XG5cdFx0Ly8gZXhlY3V0ZSB0aGUgZm9sbG93dXAgZnVuY3Rpb24uXG5cdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBjb250ZXh0IHdoZW4gdGhlIGVkaXQgc3RhdGUgaXMgaW4gZGlydHkgbW9kZS5cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWQuXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEBwYXJhbSBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIFRoZSBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2tpcCB0aGUgcG9wdXAgYXBwZWFyYW5jZSBpbiBmb3J3YXJkIGNhc2VcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3LlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBoaWRkZW5EcmFmdCBCb29sZWFuIHZhbHVlIHdoaWNoIG1lbnRpb25zIGlmIGhpZGRlbiBkcmFmdCBpcyBlbmFibGVkIG9yIG5vdFxuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSxcblx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0LFxuXHRoaWRkZW5EcmFmdD86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkZvcndhcmROYXZpZ2F0aW9uICYmIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24pIHtcblx0XHQvLyBJbiBjYXNlIHdlIGhhdmUgYSBcImZvcndhcmQgbmF2aWdhdGlvblwiIGFuZCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0Ly8gd2UgXCJzaWxlbnRseVwiIGtlZXAgdGhlIGRyYWZ0XG5cdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgTk9UIGVxdWFsLCBzbyB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmdcblx0XHQvLyBhbiBleGlzdGluZyBkcmFmdCBhbmQgbmVlZCB0byBkaXN0aW5ndWlzaCBkZXBlbmRpbmcgb24gaWYgYW55IGNoYW5nZXNcblx0XHQvLyBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgY3VycmVudCBlZGl0aW5nIHNlc3Npb24gb3Igbm90XG5cdFx0Ly8gQ2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgY3VycmVudCBlZGl0aW5nIHNlc3Npb24sIHNvIHdlIHdhbnRcblx0XHQvLyB0byBzaG93IHRoZSBkYXRhIGxvc3MgZGlhbG9nIGFuZCBsZXQgdGhlIHVzZXIgZGVjaWRlXG5cdFx0cmV0dXJuIGRhdGFMb3NzRGlhbG9nXG5cdFx0XHQub3BlbihvQ29udHJvbGxlcilcblx0XHRcdC50aGVuKChzZWxlY3RlZEtleSkgPT5cblx0XHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwLmhhbmRsZURpYWxvZ1NlbGVjdGlvbihcblx0XHRcdFx0XHRzZWxlY3RlZEtleSBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3LFxuXHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0aGlkZGVuRHJhZnRcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGFkbWluIGRhdGEuXG4gKiBAcGFyYW0gZHJhZnRBZG1pbkRhdGEgQWRtaW4gZGF0YVxuICogQHBhcmFtIGZuUHJvY2Vzc0Z1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKiBAcGFyYW0gaGFzQWN0aXZlRW50aXR5IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgcm9vdCBjb250ZXh0IGhhcyBhY3RpdmUgZW50aXR5IG9yIG5vdFxuICogQHBhcmFtIGhpZGRlbkRyYWZ0IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgaGlkZGVuIGRyYWZ0IGlzIGVuYWJsZWQgb3Igbm90XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEcmFmdEFkbWluRGF0YShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmblByb2Nlc3NGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbixcblx0aGFzQWN0aXZlRW50aXR5PzogYm9vbGVhbixcblx0aGlkZGVuRHJhZnQ/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3QgY29sbGFib3JhdGlvbkNvbm5lY3RlZCA9IG9Db250cm9sbGVyLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpO1xuXHRjb25zdCBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgPSAhY29sbGFib3JhdGlvbkNvbm5lY3RlZFxuXHRcdD8gZm5Qcm9jZXNzRnVuY3Rpb25cblx0XHQ6IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24uYXBwbHkobnVsbCwgLi4uYXJncyk7XG5cdFx0ICB9O1xuXG5cdGNvbnN0IGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gPSBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24ob0NvbnRyb2xsZXIpO1xuXHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGF3YWl0IHByb2Nlc3NGY2xNb2RlKFxuXHRcdFx0XHRkcmFmdEFkbWluRGF0YSxcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3LFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRoaWRkZW5EcmFmdFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKCFoYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUoXG5cdFx0XHRcdGRyYWZ0QWRtaW5EYXRhLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRuYXZpZ2F0aW9uVHlwZSxcblx0XHRcdFx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3LFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGhpZGRlbkRyYWZ0XG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmICFoaWRkZW5EcmFmdCkge1xuXHRcdFx0cHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5KG9Db250cm9sbGVyLCBjb250ZXh0LCBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsIG5hdmlnYXRpb25UeXBlKTtcblx0XHR9IGVsc2UgaWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHByb2Nlc3NFZGl0U3RhdGVEaXJ0eShcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGUsXG5cdFx0XHRcdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0aGlkZGVuRHJhZnRcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRoZSB1c2VyIHN0YXJ0ZWQgZWRpdGluZyB0aGUgZXhpc3RpbmcgZHJhZnQgYnV0IGRpZCBub3QgbWFrZSBhbnkgY2hhbmdlc1xuXHRcdFx0Ly8gaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnRcblx0XHRcdC8vIHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGdlbmVyYWwgaGFuZGxlciBpbiB3aGljaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyBhcmUgY2FsbGVkLlxuICogQHBhcmFtIGZuUHJvY2Vzc0Z1bmN0aW9uXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0XG4gKiBAcGFyYW0gb0NvbnRyb2xsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXdcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZVxuICogQHBhcmFtIGFsd2F5c1Nob3dJbkhpZGRlbkRyYWZ0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRmblByb2Nlc3NGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24sXG5cdGFsd2F5c1Nob3dJbkhpZGRlbkRyYWZ0PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBvTW9kZWwgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE1vZGVsKCk7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IHZpZXdEYXRhID0gb1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyB7IGVudGl0eVNldD86IHN0cmluZzsgY29udGV4dFBhdGg/OiBzdHJpbmcgfTtcblx0Y29uc3QgY29udGV4dFBhdGggPSB2aWV3RGF0YS5jb250ZXh0UGF0aCB8fCAodmlld0RhdGEuZW50aXR5U2V0ID8gYC8ke3ZpZXdEYXRhLmVudGl0eVNldH1gIDogdW5kZWZpbmVkKTtcblx0Y29uc3QgaXNEcmFmdFJvb3QgPSBjb250ZXh0UGF0aCA/ICEhb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7Y29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKSA6IGZhbHNlO1xuXHRjb25zdCBiSXNFZGl0YWJsZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUob1ZpZXcpO1xuXHRjb25zdCBvcmlnaW5hbENvbnRleHQgPSBvQ29udGV4dDtcblx0bGV0IGRyYWZ0Um9vdFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdGlmICghaXNEcmFmdFJvb3QpIHtcblx0XHRkcmFmdFJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290UGF0aChvQ29udGV4dCkgPz8gZHJhZnRSb290UGF0aDtcblx0XHRvQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChkcmFmdFJvb3RQYXRoLCB1bmRlZmluZWQsIHsgJGV4cGFuZDogXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiIH0pLmdldEJvdW5kQ29udGV4dCgpO1xuXHR9XG5cdGNvbnN0IGhpZGRlbkRyYWZ0ID0gKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpPy5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdClcblx0XHQ/LmVuYWJsZWQ7XG5cdC8vIFNob3VsZG4ndCBkaXNwbGF5IGRhdGEgbG9zcyBwb3BvdmVyIG9uIHNoZWxsIGJhY2sgbmF2aWdhdGlvbiBmcm9tIHN1Yi1vYmplY3QgcGFnZXMgKHVubGVzcyB0aGVyZSdzIG5vIHBhZ2UgYmVmb3JlIGluIHRoZSBoaXN0b3J5IGJlY2F1c2Ugb2YgZGVlcCBsaW5raW5nKVxuXHQvLyBvciB3aGVuIG9iamVjdCBwYWdlIGlzIGluIGRpc3BsYXkgbW9kZSwgb3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWRcblx0Y29uc3QgYmFja05hdlNob3dzRGlhbG9nID1cblx0XHRpc0RyYWZ0Um9vdCB8fCBvQ29udHJvbGxlci5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSWZCYWNrRXhpdHNBcHAoKSB8fCAoaGlkZGVuRHJhZnQgJiYgYWx3YXlzU2hvd0luSGlkZGVuRHJhZnQpO1xuXHRpZiAob3JpZ2luYWxDb250ZXh0LmlzRGVsZXRlZCgpIHx8ICghYmFja05hdlNob3dzRGlhbG9nICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikgfHwgIWJJc0VkaXRhYmxlKSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gVGhlIGZvbGxvd2luZyAzIHByb3BlcnRpZXMgYXJlIG5lZWRlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXRlIG9mIHRoZSBkcmFmdCwgc28gd2UgZW5zdXJlIHRoZXkgYXJlIGxvYWRlZFxuXHRcdFx0YXdhaXQgb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcblx0XHRcdFx0XCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9DcmVhdGlvbkRhdGVUaW1lXCIsXG5cdFx0XHRcdFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsXG5cdFx0XHRcdFwiSGFzQWN0aXZlRW50aXR5XCJcblx0XHRcdF0pO1xuXHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdGF3YWl0IHByb2Nlc3NEcmFmdEFkbWluRGF0YShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRoaWRkZW5EcmFmdCA/IG9yaWdpbmFsQ29udGV4dCA6IG9Db250ZXh0LFxuXHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3LFxuXHRcdFx0XHRuYXZpZ2F0aW9uVHlwZSxcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIiksXG5cdFx0XHRcdGhpZGRlbkRyYWZ0XG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIGRyYWZ0RGF0YUNvbnRleHQgaW5mb3JtYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBkb2N1bWVudC4gSWYgdGhlIGNvbnRyb2xsZXIgaXMgb2YgdHlwZSBPYmplY3RQYWdlLCB0aGVuIGludGVybmFsIF9zYXZlRG9jdW1lbnQgaXMgY2FsbGVkLCBvdGhlcndpc2Ugc2F2ZURvY3VtZW50XG4gKiBmcm9tIEVkaXRGbG93IGlzIGNhbGxlZC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiB0aGUgc2F2ZSB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlRG9jdW1lbnQoY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCBoYXNJbml0aWFsQ29udGV4dCA9IGNvbnRleHQgIT09IHVuZGVmaW5lZDtcblx0Y29udGV4dCA9IGNvbnRleHQgPz8gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0aWYgKCFoYXNJbml0aWFsQ29udGV4dCAmJiBjb250cm9sbGVyLmlzQTxPYmplY3RQYWdlQ29udHJvbGxlckNvbnRyb2xsZXI+KFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuX3NhdmVEb2N1bWVudCgpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb250cm9sbGVyLmVkaXRGbG93LnNhdmVEb2N1bWVudChjb250ZXh0LCB7fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBEaXNjYXJkcyB0aGUgZHJhZnQuXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcGFyYW0gaGlkZGVuRHJhZnQgQm9vbGVhbiB2YWx1ZSB3aGljaCBtZW50aW9ucyBpZiBoaWRkZW4gZHJhZnQgaXMgZW5hYmxlZCBvciBub3RcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiBjYW5jZWxEb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNjYXJkRHJhZnQoXG5cdGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRza2lwQmluZGluZ1RvVmlldzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0LFxuXHRoaWRkZW5EcmFmdD86IGJvb2xlYW5cbik6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb250ZXh0ID0gY29udGV4dCA/PyBjb250cm9sbGVyLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0c2tpcEJhY2tOYXZpZ2F0aW9uOiBoaWRkZW5EcmFmdCAmJiAhY29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA/IGZhbHNlIDogdHJ1ZSxcblx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWUsXG5cdFx0c2tpcEJpbmRpbmdUb1ZpZXc6IHNraXBCaW5kaW5nVG9WaWV3ICE9PSB1bmRlZmluZWQgPyBza2lwQmluZGluZ1RvVmlldyA6IHRydWVcblx0fTtcblx0cmV0dXJuIGNvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQoY29udGV4dCwgcGFyYW1zKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZm9sbG93LXVwIGZ1bmN0aW9ucyBhZnRlciBhbiBvcHRpb24gd2FzIHNlbGVjdGVkIGluIHRoZSBkYXRhIGxvc3MgZGlhbG9nLlxuICogQHBhcmFtIHNlbGVjdGVkS2V5IFRoZSBrZXkgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiBmcm9tIHRoZSBkYXRhIGxvc3MgZGlhbG9nXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGNvbnRyb2xsZXIgQ29udHJvbGxlciBvZiB0aGUgY3VycmVudCB2aWV3XG4gKiBAcGFyYW0gc2tpcEJpbmRpbmdUb1ZpZXcgVGhlIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgYmluZGluZ1xuICogQHBhcmFtIGhpZGRlbkRyYWZ0IEJvb2xlYW4gdmFsdWUgd2hpY2ggbWVudGlvbnMgaWYgaGlkZGVuIGRyYWZ0IGlzIGVuYWJsZWQgb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZURpYWxvZ1NlbGVjdGlvbihcblx0c2VsZWN0ZWRLZXk6IHN0cmluZyxcblx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRza2lwQmluZGluZ1RvVmlldzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0LFxuXHRoaWRkZW5EcmFmdD86IGJvb2xlYW5cbik6IHZvaWQge1xuXHRzd2l0Y2ggKHNlbGVjdGVkS2V5KSB7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5TYXZlOlxuXHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwXG5cdFx0XHRcdC5zYXZlRG9jdW1lbnQoY29udHJvbGxlciwgY29udGV4dClcblx0XHRcdFx0LnRoZW4oKHNhdmVkQ29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhzYXZlZENvbnRleHQpKVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoZXJyb3IgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuS2VlcDpcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3LCBjb250ZXh0LCBoaWRkZW5EcmFmdClcblx0XHRcdFx0LnRoZW4oKGRpc2NhcmRlZERyYWZ0PykgPT4gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKGRpc2NhcmRlZERyYWZ0KSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0RGF0YUxvc3NQb3B1cCA9IHtcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRwcm9jZXNzRmNsTW9kZTogcHJvY2Vzc0ZjbE1vZGUsXG5cdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGU6IHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUsXG5cdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eTogcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5LFxuXHRwcm9jZXNzRWRpdFN0YXRlRGlydHk6IHByb2Nlc3NFZGl0U3RhdGVEaXJ0eSxcblx0aGFuZGxlRGlhbG9nU2VsZWN0aW9uOiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24sXG5cdHNhdmVEb2N1bWVudDogc2F2ZURvY3VtZW50LFxuXHRkaXNjYXJkRHJhZnQ6IGRpc2NhcmREcmFmdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnREYXRh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