@sapui5/sap.fe.core 1.100.0 → 1.102.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 (295) hide show
  1. package/package.json +4 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AppComponent.js +23 -30
  4. package/src/sap/fe/core/AppComponent.ts +35 -40
  5. package/src/sap/fe/core/AppStateHandler.js +8 -8
  6. package/src/sap/fe/core/AppStateHandler.ts +11 -11
  7. package/src/sap/fe/core/BaseController.js +9 -9
  8. package/src/sap/fe/core/BaseController.ts +3 -4
  9. package/src/sap/fe/core/CommonUtils.js +122 -101
  10. package/src/sap/fe/core/CommonUtils.ts +239 -193
  11. package/src/sap/fe/core/ExtensionAPI.js +12 -13
  12. package/src/sap/fe/core/ExtensionAPI.ts +21 -31
  13. package/src/sap/fe/core/PageController.js +19 -13
  14. package/src/sap/fe/core/PageController.ts +40 -34
  15. package/src/sap/fe/core/TemplateComponent.js +198 -123
  16. package/src/sap/fe/core/TemplateComponent.ts +109 -121
  17. package/src/sap/fe/core/TemplateModel.js +7 -9
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  27. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  28. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  29. package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
  30. package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
  33. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
  34. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
  35. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
  36. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
  37. package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
  38. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
  39. package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
  40. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
  41. package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
  42. package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
  43. package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
  44. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
  45. package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
  46. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
  47. package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
  48. package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
  50. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  51. package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
  52. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  53. package/src/sap/fe/core/controllerextensions/Share.js +34 -16
  54. package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
  55. package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
  56. package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
  57. package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
  58. package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  61. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
  63. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
  65. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
  67. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
  68. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  69. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
  70. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
  71. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
  73. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
  74. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
  75. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  77. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
  78. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
  79. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  80. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  82. package/src/sap/fe/core/controls/Any.js +28 -0
  83. package/src/sap/fe/core/controls/Any.ts +30 -0
  84. package/src/sap/fe/core/controls/CommandExecution.js +50 -16
  85. package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
  86. package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
  87. package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
  88. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
  89. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
  90. package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
  91. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
  93. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
  95. package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
  96. package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
  97. package/src/sap/fe/core/controls/FileWrapper.js +360 -0
  98. package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
  99. package/src/sap/fe/core/controls/FilterBar.js +154 -119
  100. package/src/sap/fe/core/controls/FilterBar.ts +128 -123
  101. package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
  102. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
  103. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  104. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  105. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
  106. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
  107. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
  108. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
  109. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
  110. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
  111. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  112. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  113. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
  114. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
  117. package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
  118. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  119. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  120. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  121. package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
  127. package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
  128. package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
  129. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  130. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
  131. package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
  132. package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
  133. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
  135. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
  137. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  138. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  139. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
  140. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
  141. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  142. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  143. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  144. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  145. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  147. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
  149. package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
  151. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
  153. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  154. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  155. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  156. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  157. package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
  158. package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  161. package/src/sap/fe/core/fpm/Component.js +46 -17
  162. package/src/sap/fe/core/fpm/Component.ts +11 -16
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
  165. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  166. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  167. package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
  168. package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
  169. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  170. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  171. package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
  172. package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
  173. package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
  174. package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
  175. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  176. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  177. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
  178. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
  179. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  181. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
  182. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
  183. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  184. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  185. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  186. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  187. package/src/sap/fe/core/library.js +13 -5
  188. package/src/sap/fe/core/library.ts +26 -17
  189. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  190. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
  191. package/src/sap/fe/core/messagebundle.properties +135 -180
  192. package/src/sap/fe/core/messagebundle_ar.properties +31 -64
  193. package/src/sap/fe/core/messagebundle_bg.properties +31 -64
  194. package/src/sap/fe/core/messagebundle_ca.properties +31 -64
  195. package/src/sap/fe/core/messagebundle_cs.properties +31 -64
  196. package/src/sap/fe/core/messagebundle_cy.properties +32 -65
  197. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  198. package/src/sap/fe/core/messagebundle_de.properties +29 -62
  199. package/src/sap/fe/core/messagebundle_el.properties +32 -65
  200. package/src/sap/fe/core/messagebundle_en.properties +32 -65
  201. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
  202. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
  203. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
  204. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
  205. package/src/sap/fe/core/messagebundle_es.properties +31 -64
  206. package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
  207. package/src/sap/fe/core/messagebundle_et.properties +31 -64
  208. package/src/sap/fe/core/messagebundle_fi.properties +29 -62
  209. package/src/sap/fe/core/messagebundle_fr.properties +36 -69
  210. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
  211. package/src/sap/fe/core/messagebundle_hi.properties +29 -62
  212. package/src/sap/fe/core/messagebundle_hr.properties +32 -65
  213. package/src/sap/fe/core/messagebundle_hu.properties +30 -63
  214. package/src/sap/fe/core/messagebundle_id.properties +32 -65
  215. package/src/sap/fe/core/messagebundle_it.properties +31 -64
  216. package/src/sap/fe/core/messagebundle_iw.properties +31 -64
  217. package/src/sap/fe/core/messagebundle_ja.properties +29 -62
  218. package/src/sap/fe/core/messagebundle_kk.properties +31 -64
  219. package/src/sap/fe/core/messagebundle_ko.properties +31 -64
  220. package/src/sap/fe/core/messagebundle_lt.properties +31 -64
  221. package/src/sap/fe/core/messagebundle_lv.properties +32 -65
  222. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  223. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  224. package/src/sap/fe/core/messagebundle_no.properties +31 -64
  225. package/src/sap/fe/core/messagebundle_pl.properties +34 -67
  226. package/src/sap/fe/core/messagebundle_pt.properties +32 -65
  227. package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
  228. package/src/sap/fe/core/messagebundle_ro.properties +33 -66
  229. package/src/sap/fe/core/messagebundle_ru.properties +33 -66
  230. package/src/sap/fe/core/messagebundle_sh.properties +31 -64
  231. package/src/sap/fe/core/messagebundle_sk.properties +31 -64
  232. package/src/sap/fe/core/messagebundle_sl.properties +29 -62
  233. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  234. package/src/sap/fe/core/messagebundle_th.properties +31 -64
  235. package/src/sap/fe/core/messagebundle_tr.properties +31 -64
  236. package/src/sap/fe/core/messagebundle_uk.properties +32 -65
  237. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  238. package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
  239. package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
  240. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
  241. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
  243. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
  244. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
  245. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
  246. package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
  247. package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
  248. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
  249. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
  251. package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
  252. package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
  253. package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
  254. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  255. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
  257. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
  258. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  259. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
  260. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  261. package/src/sap/fe/core/support/CommonHelper.ts +0 -3
  262. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
  263. package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
  264. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  265. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
  266. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  267. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  268. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  269. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  270. package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
  271. package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
  272. package/src/sap/fe/core/templating/UIFormatters.js +133 -22
  273. package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
  274. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  275. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  276. package/src/sap/fe/core/type/Email.js +26 -8
  277. package/src/sap/fe/core/type/Email.ts +8 -7
  278. package/src/sap/fe/core/AnnotationHelper.js +0 -312
  279. package/src/sap/fe/core/AnnotationHelper.ts +0 -315
  280. package/src/sap/fe/core/RouterProxy.js +0 -926
  281. package/src/sap/fe/core/TransactionHelper.js +0 -1562
  282. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
  283. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
  284. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
  285. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
  286. package/src/sap/fe/core/actions/draft.js +0 -523
  287. package/src/sap/fe/core/actions/messageHandling.js +0 -567
  288. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  289. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  290. package/src/sap/fe/core/actions/operations.js +0 -1096
  291. package/src/sap/fe/core/actions/sticky.js +0 -130
  292. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
  293. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
  294. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  295. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -2,30 +2,535 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define([], function () {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros/internal/valuehelp/ValueListHelper", "sap/ui/core/Core"], function (Log, ModelHelper, ValueListHelper, Core) {
6
6
  "use strict";
7
7
 
8
- /**
9
- * Constructor for a new Visual Filter Container.
10
- * Used for visual filters
11
- *
12
- * @param {string} [sId] ID for the new control, generated automatically if no ID is given
13
- * @extends sap.ui.mdc.filterbar.IFilterContainer
14
- * @class
15
- * @private
16
- * @alias sap.fe.core.controls.filterbar.VisualFilterContainer
17
- */
18
8
  var MassEditHandlers = {
19
- handleMassEditChange: function (oEvent) {
20
- var oSource = oEvent && oEvent.getSource();
21
- var aParams = oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
22
- var oDialog = oSource && oSource.getParent().getParent().getParent().getParent();
23
- var oFieldsInfoData = oDialog && oDialog.getModel("fieldsInfo").getData();
24
- var oDataObject; //TODO - Value Help Handling Load Value Help when respective value is selected in combo Box in dialog
9
+ /**
10
+ * Called for property change in the transient context.
11
+ *
12
+ * @function
13
+ * @param {any} newValue New value of the property.
14
+ * @param {string} dataProperty Final context returned after the paginator action
15
+ * @param {string} mdcFieldId Final context returned after the paginator action
16
+ */
17
+ contextPropertyChange: function (newValue, dataProperty, mdcFieldId) {
18
+ // Called for
19
+ // 1. Out Parameters.
20
+ // 2. Transient context property change.
21
+ var source = Core.byId(mdcFieldId);
22
+ var transCtx = source && source.getBindingContext();
23
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
24
+ var values = fieldInfoModel.getProperty("/values/" + dataProperty) || fieldInfoModel.getProperty("/unitData/" + dataProperty) || [];
25
25
 
26
- /*
27
- if (aParams[0] === "ValueHelp") {
28
- } */
26
+ if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
27
+ MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, dataProperty);
28
+ }
29
+
30
+ var isDialogOpen = fieldInfoModel && fieldInfoModel.getProperty("/isOpen");
31
+
32
+ if (!isDialogOpen || !source.getVisible()) {
33
+ return;
34
+ }
35
+
36
+ MassEditHandlers._updateSelectKey(source, dataProperty, newValue);
37
+ },
38
+
39
+ /**
40
+ * Called for change in the MDC field.
41
+ * This is called on selection done through VHD.
42
+ * This is not called on change of the dropdown as we are using a custom MassEditSelect control and not general Select.
43
+ *
44
+ * @function
45
+ * @param {object} event Event object for change.
46
+ * @param {string} propertyName Property path.
47
+ */
48
+ handleMDCFieldChange: function (event, propertyName) {
49
+ // Called for
50
+ // 1. VHD property change.
51
+ var source = event && event.getSource();
52
+ var changePromise = event && event.getParameter("promise");
53
+ var comboBox = source.getContent();
54
+
55
+ if (!comboBox || !propertyName) {
56
+ return;
57
+ }
58
+
59
+ changePromise.then(MassEditHandlers._updateSelectKeyForMDCFieldChange.bind(MassEditHandlers, source, propertyName)).catch(function (err) {
60
+ Log.warning("VHD selection couldn't be populated in the mass edit field." + err);
61
+ });
62
+ },
63
+
64
+ /**
65
+ * Called for selection change through the drop down.
66
+ *
67
+ * @function
68
+ * @param {object} event Event object for change.
69
+ */
70
+ handleSelectionChange: function (event) {
71
+ // Called for Manual selection from dropdown(comboBox or select)
72
+ // 1. VHD select.
73
+ // 2. Any value change in the control.
74
+ var source = event && event.getSource();
75
+ var key = source.getSelectedKey();
76
+ var params = source && key && key.split("/");
77
+ var propertyName;
78
+
79
+ if (params[0] === "UseValueHelpValue") {
80
+ var prevItem = event.getParameter("previousSelectedItem");
81
+ var selectKey = prevItem.getKey();
82
+ propertyName = params.slice(1).join("/");
83
+
84
+ MassEditHandlers._onVHSelect(source, propertyName, selectKey);
85
+
86
+ return;
87
+ }
88
+
89
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
90
+ propertyName = MassEditHandlers._getPropertyNameFromKey(key);
91
+
92
+ MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), true);
93
+
94
+ MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), false);
95
+
96
+ MassEditHandlers._updateResults(source, params, true);
97
+ },
98
+
99
+ /**
100
+ * Update selections to results and the suggests in drop downs.
101
+ *
102
+ * @function
103
+ * @param {MDCField} source MDC field that was changed.
104
+ * @param {string} propertyName Property path.
105
+ * @param {any} value New value.
106
+ */
107
+ _updateSelectKeyForMDCFieldChange: function (source, propertyName, value) {
108
+ var transCtx = source && source.getBindingContext();
109
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
110
+ var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
111
+
112
+ if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
113
+ MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, propertyName);
114
+ }
115
+
116
+ MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, false, true);
117
+
118
+ MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, false, true);
119
+
120
+ var formattedValue = source.getFormFormattedValue();
121
+
122
+ MassEditHandlers._updateSelectKey(source, propertyName, value, formattedValue);
123
+ },
124
+
125
+ /**
126
+ * Update suggests for all drop downs with InParameter as the propertyName.
127
+ *
128
+ * @function
129
+ * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
130
+ * @param {string} propertyName Property path.
131
+ * @param {boolean} resetValues Should the values be reset to original state.
132
+ * @param {boolean} keepExistingSelection Should the existing selection before update remain.
133
+ */
134
+ _updateSuggestionForFieldsWithInParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
135
+ var values = fieldInfoModel.getProperty("/values");
136
+ var unitData = fieldInfoModel.getProperty("/unitData");
137
+ var fieldPaths = Object.keys(values);
138
+ var unitFieldPaths = Object.keys(unitData);
139
+ fieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/values/", propertyName, resetValues, keepExistingSelection));
140
+ unitFieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/unitData/", propertyName, resetValues, keepExistingSelection));
141
+ },
142
+
143
+ /**
144
+ * Update suggests for a drop down with InParameter as the srcPropertyName.
145
+ *
146
+ * @function
147
+ * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
148
+ * @param {string} pathPrefix Path in the runtime model.
149
+ * @param {string} srcPropertyName The InParameter Property path.
150
+ * @param {boolean} resetValues Should the values be reset to original state.
151
+ * @param {boolean} keepExistingSelection Should the existing selection before update remain.
152
+ * @param {string} propertyName Property path that needs update of suggestions.
153
+ */
154
+ _updateInParameterSuggetions: function (fieldInfoModel, pathPrefix, srcPropertyName, resetValues, keepExistingSelection, propertyName) {
155
+ var valueListInfo = fieldInfoModel.getProperty(pathPrefix + propertyName + "/valueListInfo");
156
+
157
+ if (valueListInfo && srcPropertyName != propertyName) {
158
+ var inParameters = valueListInfo.inParameters;
159
+
160
+ if (inParameters && inParameters.length > 0 && inParameters.includes(srcPropertyName)) {
161
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix + propertyName, resetValues, keepExistingSelection);
162
+ }
163
+ }
164
+ },
165
+
166
+ /**
167
+ * Update suggests for all OutParameter's drop downs of the propertyName.
168
+ *
169
+ * @function
170
+ * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
171
+ * @param {string} propertyName Property path.
172
+ * @param {boolean} resetValues Should the values be reset to original state.
173
+ * @param {boolean} keepExistingSelection Should the existing selection before update remain.
174
+ */
175
+ _updateSuggestionForFieldsWithOutParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
176
+ var valueListInfo = fieldInfoModel.getProperty("/values/" + propertyName + "/valueListInfo") || fieldInfoModel.getProperty("/unitData/" + propertyName + "/valueListInfo");
177
+
178
+ if (valueListInfo && valueListInfo.outParameters) {
179
+ var outParameters = valueListInfo.outParameters;
180
+
181
+ MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
182
+
183
+ var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
184
+
185
+ if (pathPrefix) {
186
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
187
+ }
188
+ }
189
+ },
190
+
191
+ /**
192
+ * Update suggests for a drop down with InParameter as the srcPropertyName.
193
+ *
194
+ * @function
195
+ * @param {string} outParameters String arrary of OutParameter property paths.
196
+ * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
197
+ * @param {boolean} resetValues Should the values be reset to original state.
198
+ * @param {boolean} keepExistingSelection Should the existing selection before update remain.
199
+ */
200
+ _updateOutParameterSuggetions: function (outParameters, fieldInfoModel, resetValues, keepExistingSelection) {
201
+ var values = fieldInfoModel.getProperty("/values");
202
+ var unitData = fieldInfoModel.getProperty("/unitData");
203
+ var fieldPaths = Object.keys(values);
204
+ var unitFieldPaths = Object.keys(unitData);
205
+ outParameters.forEach(function (outParameter) {
206
+ if (fieldPaths.includes(outParameter)) {
207
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/" + outParameter, resetValues, keepExistingSelection);
208
+ } else if (unitFieldPaths.includes(outParameter)) {
209
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/unitData/" + outParameter, resetValues, keepExistingSelection);
210
+ }
211
+ });
212
+ },
213
+
214
+ /**
215
+ * Update suggests for a drop down of a field.
216
+ *
217
+ * @function
218
+ * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
219
+ * @param {string} fieldPathAbsolute Complete runtime property path.
220
+ * @param {boolean} resetValues Should the values be reset to original state.
221
+ * @param {boolean} keepExistingSelection Should the existing selection before update remain.
222
+ */
223
+ _updateFieldPathSuggestions: function (fieldInfoModel, fieldPathAbsolute, resetValues, keepExistingSelection) {
224
+ var options = fieldInfoModel.getProperty(fieldPathAbsolute);
225
+ var defaultOptions = options.defaultOptions;
226
+ var selectedKey = fieldInfoModel.getProperty(fieldPathAbsolute + "/selectedKey");
227
+ var existingSelection = keepExistingSelection && options.find(function (option) {
228
+ return option.key === selectedKey;
229
+ });
230
+
231
+ if (resetValues) {
232
+ var selectOptions = options.selectOptions;
233
+ options.length = 0;
234
+ defaultOptions.forEach(function (defaultOption) {
235
+ return options.push(defaultOption);
236
+ });
237
+ selectOptions.forEach(function (selectOption) {
238
+ return options.push(selectOption);
239
+ });
240
+ } else {
241
+ options.length = 0;
242
+ defaultOptions.forEach(function (defaultOption) {
243
+ return options.push(defaultOption);
244
+ });
245
+ }
246
+
247
+ fieldInfoModel.setProperty(fieldPathAbsolute, options);
248
+
249
+ if (existingSelection && !options.includes(existingSelection)) {
250
+ options.push(existingSelection);
251
+ fieldInfoModel.setProperty(fieldPathAbsolute + "/selectedKey", selectedKey);
252
+ }
253
+ },
254
+
255
+ /**
256
+ * Update In and Out Parameters in the MED.
257
+ *
258
+ * @function
259
+ * @param {Context} transCtx The transient context of the MED.
260
+ * @param {MDCField} source MDC field.
261
+ * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
262
+ * @param {string} propertyName Property path.
263
+ */
264
+ _setValueListInfo: function (transCtx, source, fieldInfoModel, propertyName) {
265
+ var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
266
+
267
+ if (fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"))) {
268
+ return;
269
+ }
270
+
271
+ var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source);
272
+
273
+ if (fieldValueHelp && fieldValueHelp.getDialogContent().getTable()) {
274
+ var inParameters = (fieldValueHelp.getInParameters() || []).map(function (inParam) {
275
+ return inParam.getFieldPath();
276
+ });
277
+ var outParameters = (fieldValueHelp.getInParameters() || []).map(function (outParam) {
278
+ return outParam.getFieldPath();
279
+ });
280
+ var info = {
281
+ inParameters: inParameters.map(function (inParam) {
282
+ return inParam.getFieldPath();
283
+ }),
284
+ outParameters: outParameters.map(function (outParam) {
285
+ return outParam.getFieldPath();
286
+ })
287
+ };
288
+ fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
289
+
290
+ if (info.outParameters.length > 0) {
291
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
292
+ }
293
+ } else {
294
+ MassEditHandlers._requestValueList(transCtx, source, fieldInfoModel, propertyName);
295
+ }
296
+ },
297
+
298
+ /**
299
+ * Request and update In and Out Parameters in the MED.
300
+ *
301
+ * @function
302
+ * @param {Context} transCtx The transient context of the MED.
303
+ * @param {MDCField} source MDC field.
304
+ * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
305
+ * @param {string} propertyName Property path.
306
+ */
307
+ _requestValueList: function (transCtx, source, fieldInfoModel, propertyName) {
308
+ var metaPath = ModelHelper.getMetaPathForContext(transCtx);
309
+ var propertyPath = metaPath && metaPath + "/" + propertyName;
310
+ var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
311
+ var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
312
+ var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
313
+ return dependent.getId() === fieldHelp;
314
+ });
315
+
316
+ if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
317
+ fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
318
+ }
319
+
320
+ var metaModel = transCtx.getModel().getMetaModel();
321
+ ValueListHelper.createVHUIModel(propertyPath, fieldValueHelp);
322
+ var valueListInfo = ValueListHelper.getValueListInfo(fieldValueHelp, metaModel, propertyPath);
323
+ valueListInfo.then(function (vLinfo) {
324
+ var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
325
+ var info = {
326
+ inParameters: vLinfo.inParameters.map(function (inParam) {
327
+ return inParam.getFieldPath();
328
+ }),
329
+ outParameters: vLinfo.outParameters.map(function (outParam) {
330
+ return outParam.getFieldPath();
331
+ })
332
+ };
333
+ fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
334
+
335
+ if (info.outParameters.length > 0) {
336
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
337
+ }
338
+ }).catch(function () {
339
+ Log.warning("Mass Edit: Couldn't load valueList info for ".concat(propertyPath));
340
+ });
341
+ },
342
+
343
+ /**
344
+ * Get field help control from MDC field.
345
+ *
346
+ * @function
347
+ * @param {Context} transCtx The transient context of the MED.
348
+ * @param {MDCField} source MDC field.
349
+ * @returns Field Help control.
350
+ */
351
+ _getValueHelp: function (transCtx, source) {
352
+ var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
353
+ var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
354
+ var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
355
+ return dependent.getId() === fieldHelp;
356
+ });
357
+ return fieldValueHelp;
358
+ },
359
+
360
+ /**
361
+ * Colled on drop down selection of VHD option.
362
+ *
363
+ * @function
364
+ * @param {MassEditSelect} source Custom Mass Edit Select control.
365
+ * @param {string} propertyName Property path.
366
+ * @param {string} selectKey Previous key before the VHD was selected.
367
+ */
368
+ _onVHSelect: function (source, propertyName, selectKey) {
369
+ // Called for
370
+ // 1. VHD selected.
371
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
372
+ var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
373
+ var transCtx = source.getBindingContext();
374
+
375
+ var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source.getParent());
376
+
377
+ if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
378
+ fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
379
+ }
380
+
381
+ source.fireValueHelpRequest();
382
+ fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", selectKey);
383
+ },
384
+
385
+ /**
386
+ * Gets Property name from selection key.
387
+ *
388
+ * @function
389
+ * @param {string} key Selection key.
390
+ * @returns Property name.
391
+ */
392
+ _getPropertyNameFromKey: function (key) {
393
+ var propertyName = "";
394
+
395
+ if (key.startsWith("Default/") || key.startsWith("ClearFieldValue/") || key.startsWith("UseValueHelpValue/")) {
396
+ propertyName = key.substring(key.indexOf("/") + 1);
397
+ } else {
398
+ propertyName = key.substring(0, key.lastIndexOf("/"));
399
+ }
400
+
401
+ return propertyName;
402
+ },
403
+
404
+ /**
405
+ * Update selection to Custom Mass Edit Select from MDC field.
406
+ *
407
+ * @function
408
+ * @param {MDCField} source MDC field.
409
+ * @param {string} propertyName Property path.
410
+ * @param {string} value Value to update.
411
+ * @param {string} fullText Full text to use.
412
+ */
413
+ _updateSelectKey: function (source, propertyName, value, fullText) {
414
+ // Called for
415
+ // 1. VHD property change
416
+ // 2. Out Parameters.
417
+ // 3. Transient context property change.
418
+ var massEditSelect = source.getContent();
419
+
420
+ if (!massEditSelect || !propertyName) {
421
+ return;
422
+ }
423
+
424
+ var key = massEditSelect.getSelectedKey();
425
+
426
+ if ((key.startsWith("Default/") || key.startsWith("ClearFieldValue/")) && !value) {
427
+ return;
428
+ }
429
+
430
+ var formattedText = MassEditHandlers._valueExists(fullText) ? fullText : value;
431
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
432
+ var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
433
+ var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
434
+ var relatedField = values.find(function (fieldData) {
435
+ var _fieldData$textInfo;
436
+
437
+ return (fieldData === null || fieldData === void 0 ? void 0 : (_fieldData$textInfo = fieldData.textInfo) === null || _fieldData$textInfo === void 0 ? void 0 : _fieldData$textInfo.value) === value || fieldData.text === value;
438
+ });
439
+
440
+ if (relatedField) {
441
+ if (fullText && relatedField.textInfo && relatedField.textInfo.descriptionPath && (relatedField.text != formattedText || relatedField.textInfo.fullText != formattedText)) {
442
+ // Update the full text only when provided.
443
+ relatedField.text = formattedText;
444
+ relatedField.textInfo.fullText = formattedText;
445
+ relatedField.textInfo.description = source.getAdditionalValue();
446
+ }
447
+
448
+ if (relatedField.key === key) {
449
+ fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
450
+ return;
451
+ }
452
+
453
+ key = relatedField.key;
454
+ } else if ([undefined, null, ""].indexOf(value) === -1) {
455
+ key = propertyName + "/" + value;
456
+ var selectionInfo = {
457
+ text: formattedText,
458
+ key: key,
459
+ textInfo: {
460
+ description: source.getAdditionalValue(),
461
+ descriptionPath: values && values.textInfo && values.textInfo.descriptionPath,
462
+ fullText: formattedText,
463
+ textArrangement: source.getDisplay(),
464
+ value: source.getValue(),
465
+ valuePath: propertyName
466
+ }
467
+ };
468
+ values.push(selectionInfo);
469
+ values.selectOptions = values.selectOptions || [];
470
+ values.selectOptions.push(selectionInfo);
471
+ fieldInfoModel.setProperty(propPath + propertyName, values);
472
+ } else {
473
+ key = "Default/" + propertyName;
474
+ }
475
+
476
+ fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
477
+
478
+ MassEditHandlers._updateResults(massEditSelect);
479
+ },
480
+
481
+ /**
482
+ * Get Value from Drop down.
483
+ *
484
+ * @function
485
+ * @param {Control} source Drop down control.
486
+ * @returns {string} Value of selection.
487
+ */
488
+ _getValue: function (source) {
489
+ var _getSelectedItem;
490
+
491
+ return source.getMetadata().getName() === "sap.fe.core.controls.MassEditSelect" ? (_getSelectedItem = source.getSelectedItem()) === null || _getSelectedItem === void 0 ? void 0 : _getSelectedItem.getText() : source.getValue();
492
+ },
493
+ _getValueOnEmpty: function (oSource, fieldsInfoModel, value, sPropertyName) {
494
+ if (!value) {
495
+ var values = fieldsInfoModel.getProperty("/values/".concat(sPropertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(sPropertyName)) || [];
496
+
497
+ if (values.unitProperty) {
498
+ value = 0;
499
+ oSource.setValue(value);
500
+ } else if (values.inputType === "CheckBox") {
501
+ value = null;
502
+ }
503
+ }
504
+
505
+ return value;
506
+ },
507
+ _valueExists: function (value) {
508
+ return value != undefined && value != null;
509
+ },
510
+
511
+ /**
512
+ * Updates selections to runtime model.
513
+ *
514
+ * @function
515
+ * @param {Control} oSource Drop down control.
516
+ * @param {Array} aParams Parts of key in runtime model.
517
+ * @param {boolean} updateTransCtx Should transient context be updated with the value.
518
+ */
519
+ _updateResults: function (oSource) {
520
+ var aParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
521
+ var updateTransCtx = arguments.length > 2 ? arguments[2] : undefined;
522
+ // Called for
523
+ // 1. VHD property change.
524
+ // 2. Out parameter.
525
+ // 3. transient context property change.
526
+ var fieldsInfoModel = oSource && oSource.getModel("fieldsInfo");
527
+ var oFieldsInfoData = fieldsInfoModel && fieldsInfoModel.getData();
528
+
529
+ var value = MassEditHandlers._getValue(oSource);
530
+
531
+ aParams = aParams.length > 0 ? aParams : oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
532
+ var oDataObject;
533
+ var sPropertyName = oSource.getId().substring(oSource.getId().lastIndexOf(":") + 1);
29
534
 
30
535
  if (aParams[0] === "Default") {
31
536
  oDataObject = {
@@ -33,29 +538,29 @@ sap.ui.define([], function () {
33
538
  value: aParams[0]
34
539
  };
35
540
  } else if (aParams[0] === "ClearFieldValue") {
541
+ value = "";
542
+ value = MassEditHandlers._getValueOnEmpty(oSource, fieldsInfoModel, value, sPropertyName);
36
543
  oDataObject = {
37
544
  keyValue: aParams[1],
38
- value: ""
545
+ value: value
39
546
  };
40
547
  } else if (!aParams) {
41
- var sPropertyName = oSource.getId().substring(oSource.getId().lastIndexOf(":") + 1);
548
+ value = MassEditHandlers._getValueOnEmpty(oSource, fieldsInfoModel, value, sPropertyName);
42
549
  oDataObject = {
43
550
  keyValue: sPropertyName,
44
- value: oSource.getValue()
551
+ value: value
45
552
  };
46
553
  } else {
47
- var aRelatedField = aParams[0] && oFieldsInfoData.values && oFieldsInfoData.values[aParams[0]].filter(function (oFieldData) {
48
- return oFieldData.text === oSource.getValue();
49
- });
50
- var iValueIndex = oFieldsInfoData.values[aParams[0]].findIndex(function (data) {
51
- return typeof data.text === "boolean" && data.text === Boolean(oSource.getValue());
554
+ var propertyName = aParams.slice(0, -1).join("/");
555
+ var propertyValues = fieldsInfoModel.getProperty("/values/" + propertyName) || fieldsInfoModel.getProperty("/unitData/" + propertyName) || [];
556
+ var relatedField = (propertyValues || []).find(function (oFieldData) {
557
+ var _oFieldData$textInfo;
558
+
559
+ return (oFieldData === null || oFieldData === void 0 ? void 0 : (_oFieldData$textInfo = oFieldData.textInfo) === null || _oFieldData$textInfo === void 0 ? void 0 : _oFieldData$textInfo.value) === value || oFieldData.text === value;
52
560
  });
53
- oDataObject = aRelatedField && aRelatedField[0] && aRelatedField[0].textInfo ? {
54
- keyValue: aParams[0],
55
- value: aRelatedField[0].textInfo.value
56
- } : {
57
- keyValue: aParams[0],
58
- value: iValueIndex !== -1 ? oFieldsInfoData.values[aParams[0]][iValueIndex].text : oSource.getValue()
561
+ oDataObject = {
562
+ keyValue: propertyName,
563
+ value: relatedField.textInfo && MassEditHandlers._valueExists(relatedField.textInfo.value) ? relatedField.textInfo.value : relatedField.text
59
564
  };
60
565
  }
61
566
 
@@ -72,8 +577,18 @@ sap.ui.define([], function () {
72
577
  } else {
73
578
  oFieldsInfoData.results.push(oDataObject);
74
579
  }
580
+
581
+ if (updateTransCtx) {
582
+ var transCtx = oSource.getBindingContext();
583
+
584
+ if (aParams[0] === "Default" || aParams[0] === "ClearFieldValue") {
585
+ transCtx.setProperty(oDataObject.keyValue, null);
586
+ } else if (oDataObject) {
587
+ transCtx.setProperty(oDataObject.keyValue, oDataObject.value);
588
+ }
589
+ }
75
590
  }
76
591
  };
77
592
  return MassEditHandlers;
78
593
  }, false);
79
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImhhbmRsZU1hc3NFZGl0Q2hhbmdlIiwib0V2ZW50Iiwib1NvdXJjZSIsImdldFNvdXJjZSIsImFQYXJhbXMiLCJnZXRTZWxlY3RlZEtleSIsInNwbGl0Iiwib0RpYWxvZyIsImdldFBhcmVudCIsIm9GaWVsZHNJbmZvRGF0YSIsImdldE1vZGVsIiwiZ2V0RGF0YSIsIm9EYXRhT2JqZWN0Iiwia2V5VmFsdWUiLCJ2YWx1ZSIsInNQcm9wZXJ0eU5hbWUiLCJnZXRJZCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiZ2V0VmFsdWUiLCJhUmVsYXRlZEZpZWxkIiwidmFsdWVzIiwiZmlsdGVyIiwib0ZpZWxkRGF0YSIsInRleHQiLCJpVmFsdWVJbmRleCIsImZpbmRJbmRleCIsImRhdGEiLCJCb29sZWFuIiwidGV4dEluZm8iLCJiRXhpc3RpbmdFbGVtZW50aW5kZXgiLCJpIiwicmVzdWx0cyIsImxlbmd0aCIsInB1c2giXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLGdCQUFnQixHQUFHO0FBQ3hCQyxJQUFBQSxvQkFBb0IsRUFBRSxVQUFTQyxNQUFULEVBQXNCO0FBQzNDLFVBQU1DLE9BQU8sR0FBR0QsTUFBTSxJQUFJQSxNQUFNLENBQUNFLFNBQVAsRUFBMUI7QUFDQSxVQUFNQyxPQUFPLEdBQUdGLE9BQU8sSUFBSUEsT0FBTyxDQUFDRyxjQUFSLEVBQVgsSUFBdUNILE9BQU8sQ0FBQ0csY0FBUixHQUF5QkMsS0FBekIsQ0FBK0IsR0FBL0IsQ0FBdkQ7QUFDQSxVQUFNQyxPQUFPLEdBQ1pMLE9BQU8sSUFDUEEsT0FBTyxDQUNMTSxTQURGLEdBRUVBLFNBRkYsR0FHRUEsU0FIRixHQUlFQSxTQUpGLEVBRkQ7QUFPQSxVQUFNQyxlQUFlLEdBQUdG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LEtBQXdDRCxXQUFXLENBQUNDLFFBQXhELEVBQWtFO0FBQ2pFaUIsVUFBQUEscUJBQXFCLEdBQUdDLENBQXhCO0FBQ0E7QUFDRDs7QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDckIsUUFBQUEsZUFBZSxDQUFDdUIsT0FBaEIsQ0FBd0JGLHFCQUF4QixJQUFpRGxCLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05ILFFBQUFBLGVBQWUsQ0FBQ3VCLE9BQWhCLENBQXdCRSxJQUF4QixDQUE2QnRCLFdBQTdCO0FBQ0E7QUFDRDtBQXhEdUIsR0FBekI7U0EyRGViLGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzID0ge1xuXHRoYW5kbGVNYXNzRWRpdENoYW5nZTogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvU291cmNlID0gb0V2ZW50ICYmIG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBhUGFyYW1zID0gb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBvRGlhbG9nID1cblx0XHRcdG9Tb3VyY2UgJiZcblx0XHRcdG9Tb3VyY2Vcblx0XHRcdFx0LmdldFBhcmVudCgpXG5cdFx0XHRcdC5nZXRQYXJlbnQoKVxuXHRcdFx0XHQuZ2V0UGFyZW50KClcblx0XHRcdFx0LmdldFBhcmVudCgpO1xuXHRcdGNvbnN0IG9GaWVsZHNJbmZvRGF0YSA9IG9EaWFsb2cgJiYgb0RpYWxvZy5nZXRNb2RlbChcImZpZWxkc0luZm9cIikuZ2V0RGF0YSgpO1xuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHQvL1RPRE8gLSBWYWx1ZSBIZWxwIEhhbmRsaW5nIExvYWQgVmFsdWUgSGVscCB3aGVuIHJlc3BlY3RpdmUgdmFsdWUgaXMgc2VsZWN0ZWQgaW4gY29tYm8gQm94IGluIGRpYWxvZ1xuXHRcdC8qXG5cdFx0XHRcdGlmIChhUGFyYW1zWzBdID09PSBcIlZhbHVlSGVscFwiKSB7XG5cdFx0XHRcdH0gKi9cblx0XHRpZiAoYVBhcmFtc1swXSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdG9EYXRhT2JqZWN0ID0geyBrZXlWYWx1ZTogYVBhcmFtc1sxXSwgdmFsdWU6IGFQYXJhbXNbMF0gfTtcblx0XHR9IGVsc2UgaWYgKGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdG9EYXRhT2JqZWN0ID0geyBrZXlWYWx1ZTogYVBhcmFtc1sxXSwgdmFsdWU6IFwiXCIgfTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5nZXRJZCgpLnN1YnN0cmluZyhvU291cmNlLmdldElkKCkubGFzdEluZGV4T2YoXCI6XCIpICsgMSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHNQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHZhbHVlOiBvU291cmNlLmdldFZhbHVlKClcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGFSZWxhdGVkRmllbGQgPVxuXHRcdFx0XHRhUGFyYW1zWzBdICYmXG5cdFx0XHRcdG9GaWVsZHNJbmZvRGF0YS52YWx1ZXMgJiZcblx0XHRcdFx0b0ZpZWxkc0luZm9EYXRhLnZhbHVlc1thUGFyYW1zWzBdXS5maWx0ZXIoZnVuY3Rpb24ob0ZpZWxkRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9GaWVsZERhdGEudGV4dCA9PT0gb1NvdXJjZS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdGNvbnN0IGlWYWx1ZUluZGV4ID0gb0ZpZWxkc0luZm9EYXRhLnZhbHVlc1thUGFyYW1zWzBdXS5maW5kSW5kZXgoZnVuY3Rpb24oZGF0YTogYW55KSB7XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgZGF0YS50ZXh0ID09PSBcImJvb2xlYW5cIiAmJiBkYXRhLnRleHQgPT09IEJvb2xlYW4ob1NvdXJjZS5nZXRWYWx1ZSgpKTtcblx0XHRcdH0pO1xuXHRcdFx0b0RhdGFPYmplY3QgPVxuXHRcdFx0XHRhUmVsYXRlZEZpZWxkICYmIGFSZWxhdGVkRmllbGRbMF0gJiYgYVJlbGF0ZWRGaWVsZFswXS50ZXh0SW5mb1xuXHRcdFx0XHRcdD8geyBrZXlWYWx1ZTogYVBhcmFtc1swXSwgdmFsdWU6IGFSZWxhdGVkRmllbGRbMF0udGV4dEluZm8udmFsdWUgfVxuXHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1swXSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IGlWYWx1ZUluZGV4ICE9PSAtMSA/IG9GaWVsZHNJbmZvRGF0YS52YWx1ZXNbYVBhcmFtc1swXV1baVZhbHVlSW5kZXhdLnRleHQgOiBvU291cmNlLmdldFZhbHVlKClcblx0XHRcdFx0XHQgIH07XG5cdFx0fVxuXHRcdGxldCBiRXhpc3RpbmdFbGVtZW50aW5kZXggPSAtMTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAob0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbaV0ua2V5VmFsdWUgPT09IG9EYXRhT2JqZWN0LmtleVZhbHVlKSB7XG5cdFx0XHRcdGJFeGlzdGluZ0VsZW1lbnRpbmRleCA9IGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiRXhpc3RpbmdFbGVtZW50aW5kZXggIT09IC0xKSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0c1tiRXhpc3RpbmdFbGVtZW50aW5kZXhdID0gb0RhdGFPYmplY3Q7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzLnB1c2gob0RhdGFPYmplY3QpO1xuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdfQ==
594
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImNvbnRleHRQcm9wZXJ0eUNoYW5nZSIsIm5ld1ZhbHVlIiwiZGF0YVByb3BlcnR5IiwibWRjRmllbGRJZCIsInNvdXJjZSIsIkNvcmUiLCJieUlkIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImZpZWxkSW5mb01vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZXMiLCJnZXRQcm9wZXJ0eSIsImlucHV0VHlwZSIsInZhbHVlTGlzdEluZm8iLCJfc2V0VmFsdWVMaXN0SW5mbyIsImlzRGlhbG9nT3BlbiIsImdldFZpc2libGUiLCJfdXBkYXRlU2VsZWN0S2V5IiwiaGFuZGxlTURDRmllbGRDaGFuZ2UiLCJldmVudCIsInByb3BlcnR5TmFtZSIsImdldFNvdXJjZSIsImNoYW5nZVByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJjb21ib0JveCIsImdldENvbnRlbnQiLCJ0aGVuIiwiX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlIiwiYmluZCIsImNhdGNoIiwiZXJyIiwiTG9nIiwid2FybmluZyIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZSIsImtleSIsImdldFNlbGVjdGVkS2V5IiwicGFyYW1zIiwic3BsaXQiLCJwcmV2SXRlbSIsInNlbGVjdEtleSIsImdldEtleSIsInNsaWNlIiwiam9pbiIsIl9vblZIU2VsZWN0IiwiX2dldFByb3BlcnR5TmFtZUZyb21LZXkiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnMiLCJzdGFydHNXaXRoIiwiX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVycyIsIl91cGRhdGVSZXN1bHRzIiwidmFsdWUiLCJmb3JtYXR0ZWRWYWx1ZSIsImdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSIsInJlc2V0VmFsdWVzIiwia2VlcEV4aXN0aW5nU2VsZWN0aW9uIiwidW5pdERhdGEiLCJmaWVsZFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsInVuaXRGaWVsZFBhdGhzIiwiZm9yRWFjaCIsIl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMiLCJwYXRoUHJlZml4Iiwic3JjUHJvcGVydHlOYW1lIiwiaW5QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMiLCJvdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnMiLCJvdXRQYXJhbWV0ZXIiLCJmaWVsZFBhdGhBYnNvbHV0ZSIsIm9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdGVkS2V5IiwiZXhpc3RpbmdTZWxlY3Rpb24iLCJmaW5kIiwib3B0aW9uIiwic2VsZWN0T3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJwdXNoIiwic2VsZWN0T3B0aW9uIiwic2V0UHJvcGVydHkiLCJwcm9wUGF0aCIsImZpZWxkVmFsdWVIZWxwIiwiX2dldFZhbHVlSGVscCIsImdldERpYWxvZ0NvbnRlbnQiLCJnZXRUYWJsZSIsImdldEluUGFyYW1ldGVycyIsIm1hcCIsImluUGFyYW0iLCJnZXRGaWVsZFBhdGgiLCJvdXRQYXJhbSIsImluZm8iLCJfcmVxdWVzdFZhbHVlTGlzdCIsIm1ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJkZXBlbmRlbnRzIiwiZ2V0RGVwZW5kZW50cyIsImZpZWxkSGVscCIsImdldEZpZWxkSGVscCIsImRlcGVuZGVudCIsImdldElkIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsIm1hc3NFZGl0U2VsZWN0IiwiZm9ybWF0dGVkVGV4dCIsIl92YWx1ZUV4aXN0cyIsInJlbGF0ZWRGaWVsZCIsImZpZWxkRGF0YSIsInRleHRJbmZvIiwidGV4dCIsImRlc2NyaXB0aW9uUGF0aCIsImRlc2NyaXB0aW9uIiwiZ2V0QWRkaXRpb25hbFZhbHVlIiwidW5kZWZpbmVkIiwic2VsZWN0aW9uSW5mbyIsInRleHRBcnJhbmdlbWVudCIsImdldERpc3BsYXkiLCJnZXRWYWx1ZSIsInZhbHVlUGF0aCIsIl9nZXRWYWx1ZSIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImdldFNlbGVjdGVkSXRlbSIsImdldFRleHQiLCJfZ2V0VmFsdWVPbkVtcHR5Iiwib1NvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsInNQcm9wZXJ0eU5hbWUiLCJ1bml0UHJvcGVydHkiLCJzZXRWYWx1ZSIsImFQYXJhbXMiLCJ1cGRhdGVUcmFuc0N0eCIsIm9GaWVsZHNJbmZvRGF0YSIsImdldERhdGEiLCJvRGF0YU9iamVjdCIsImtleVZhbHVlIiwicHJvcGVydHlWYWx1ZXMiLCJvRmllbGREYXRhIiwiYkV4aXN0aW5nRWxlbWVudGluZGV4IiwiaSIsInJlc3VsdHMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFxQkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSxxQkFBcUIsRUFBRSxVQUFVQyxRQUFWLEVBQXlCQyxZQUF6QixFQUErQ0MsVUFBL0MsRUFBbUU7QUFDekY7QUFDQTtBQUNBO0FBRUEsVUFBTUMsTUFBTSxHQUFHQyxJQUFJLENBQUNDLElBQUwsQ0FBVUgsVUFBVixDQUFmO0FBQ0EsVUFBTUksUUFBUSxHQUFHSCxNQUFNLElBQUtBLE1BQU0sQ0FBQ0ksaUJBQVAsRUFBNUI7QUFDQSxVQUFNQyxjQUFjLEdBQUdMLE1BQU0sSUFBS0EsTUFBTSxDQUFDTSxRQUFQLENBQWdCLFlBQWhCLENBQWxDO0FBQ0EsVUFB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TUFBNUMsRUFBb0R5RixDQUFDLEVBQXJELEVBQXlEO0FBQ3hELFlBQUlQLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0JELENBQXhCLEVBQTJCSixRQUEzQixLQUF3Q0QsV0FBVyxDQUFDQyxRQUF4RCxFQUFrRTtBQUNqRUcsVUFBQUEscUJBQXFCLEdBQUdDLENBQXhCO0FBQ0E7QUFDRDs7QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDTixRQUFBQSxlQUFlLENBQUNRLE9BQWhCLENBQXdCRixxQkFBeEIsSUFBaURKLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05GLFFBQUFBLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0IzRSxJQUF4QixDQUE2QnFFLFdBQTdCO0FBQ0E7O0FBQ0QsVUFBSUgsY0FBSixFQUFvQjtBQUNuQixZQUFNM0ksUUFBUSxHQUFHcUksT0FBTyxDQUFDcEksaUJBQVIsRUFBakI7O0FBQ0EsWUFBSXlJLE9BQU8sQ0FBQyxDQUFELENBQVAsS0FBZSxTQUFmLElBQTRCQSxPQUFPLENBQUMsQ0FBRCxDQUFQLEtBQWUsaUJBQS9DLEVBQWtFO0FBQ2pFMUksVUFBQUEsUUFBUSxDQUFDMkUsV0FBVCxDQUFxQm1FLFdBQVcsQ0FBQ0MsUUFBakMsRUFBMkMsSUFBM0M7QUFDQSxTQUZELE1BRU8sSUFBSUQsV0FBSixFQUFpQjtBQUN2QjlJLFVBQUFBLFFBQVEsQ0FBQzJFLFdBQVQsQ0FBcUJtRSxXQUFXLENBQUNDLFFBQWpDLEVBQTJDRCxXQUFXLENBQUNuRyxLQUF2RDtBQUNBO0FBQ0Q7QUFDRDtBQXBtQjRCLEdBQTlCO1NBdW1CZW5ELGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgQ29tYm9Cb3ggZnJvbSBcInNhcC9tL0NvbWJvQm94XCI7XG5pbXBvcnQgU2VsZWN0IGZyb20gXCJzYXAvbS9TZWxlY3RcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgSW5QYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvSW5QYXJhbWV0ZXJcIjtcbmltcG9ydCBPdXRQYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvT3V0UGFyYW1ldGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBkYXRhUHJvcGVydHkpIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgZGF0YVByb3BlcnR5KSB8fCBbXTtcblxuXHRcdGlmICh0cmFuc0N0eCAmJiAodmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhWYWx1ZUhlbHBcIiB8fCB2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFVuaXRcIikgJiYgIXZhbHVlcy52YWx1ZUxpc3RJbmZvKSB7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl9zZXRWYWx1ZUxpc3RJbmZvKHRyYW5zQ3R4LCBzb3VyY2UsIGZpZWxkSW5mb01vZGVsLCBkYXRhUHJvcGVydHkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzRGlhbG9nT3BlbiA9IGZpZWxkSW5mb01vZGVsICYmIGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL2lzT3BlblwiKTtcblx0XHRpZiAoIWlzRGlhbG9nT3BlbiB8fCAhc291cmNlLmdldFZpc2libGUoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIGRhdGFQcm9wZXJ0eSwgbmV3VmFsdWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIGNoYW5nZSBpbiB0aGUgTURDIGZpZWxkLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBvbiBzZWxlY3Rpb24gZG9uZSB0aHJvdWdoIFZIRC5cblx0ICogVGhpcyBpcyBub3QgY2FsbGVkIG9uIGNoYW5nZSBvZiB0aGUgZHJvcGRvd24gYXMgd2UgYXJlIHVzaW5nIGEgY3VzdG9tIE1hc3NFZGl0U2VsZWN0IGNvbnRyb2wgYW5kIG5vdCBnZW5lcmFsIFNlbGVjdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3QgZm9yIGNoYW5nZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0aGFuZGxlTURDRmllbGRDaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgY2hhbmdlUHJvbWlzZSA9IGV2ZW50ICYmIGV2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpO1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNoYW5nZVByb21pc2Vcblx0XHRcdC50aGVuKE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlLmJpbmQoTWFzc0VkaXRIYW5kbGVycywgc291cmNlLCBwcm9wZXJ0eU5hbWUpKVxuXHRcdFx0LmNhdGNoKChlcnI6IGFueSkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZIRCBzZWxlY3Rpb24gY291bGRuJ3QgYmUgcG9wdWxhdGVkIGluIHRoZSBtYXNzIGVkaXQgZmllbGQuXCIgKyBlcnIpO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IChldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKSkgYXMgYW55O1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQgdGhhdCB3YXMgY2hhbmdlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgTmV3IHZhbHVlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlOiBmdW5jdGlvbiAoc291cmNlOiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UgJiYgc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgKHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIikgYXMgSlNPTk1vZGVsKTtcblx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdGZpZWxkUGF0aHMuZm9yRWFjaChcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucy5iaW5kKFxuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLFxuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XCIvdmFsdWVzL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHRcdHVuaXRGaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3VuaXREYXRhL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhQcmVmaXggUGF0aCBpbiB0aGUgcnVudGltZSBtb2RlbC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNyY1Byb3BlcnR5TmFtZSBUaGUgSW5QYXJhbWV0ZXIgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aCB0aGF0IG5lZWRzIHVwZGF0ZSBvZiBzdWdnZXN0aW9ucy5cblx0ICovXG5cdF91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHBhdGhQcmVmaXg6IHN0cmluZyxcblx0XHRzcmNQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW4sXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmdcblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KHBhdGhQcmVmaXggKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpIHx8XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSArIFwiL3ZhbHVlTGlzdEluZm9cIik7XG5cblx0XHRpZiAodmFsdWVMaXN0SW5mbyAmJiB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IG91dFBhcmFtZXRlcnMgPSB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnM7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGNvbnN0IHBhdGhQcmVmaXggPVxuXHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgfHxcblx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdGlmIChwYXRoUHJlZml4KSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBwYXRoUHJlZml4LCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVzZXRWYWx1ZXMgU2hvdWxkIHRoZSB2YWx1ZXMgYmUgcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRvdXRQYXJhbWV0ZXJzOiBzdHJpbmdbXSxcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdG91dFBhcmFtZXRlcnMuZm9yRWFjaCgob3V0UGFyYW1ldGVyOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmIChmaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIFwiL3ZhbHVlcy9cIiArIG91dFBhcmFtZXRlciwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9IGVsc2UgaWYgKHVuaXRGaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoXG5cdFx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFx0XCIvdW5pdERhdGEvXCIgKyBvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdGZpZWxkUGF0aEFic29sdXRlOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCkge1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSk7XG5cdFx0Y29uc3QgZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zLmRlZmF1bHRPcHRpb25zO1xuXHRcdGNvbnN0IHNlbGVjdGVkS2V5ID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUgKyBcIi9zZWxlY3RlZEtleVwiKTtcblx0XHRjb25zdCBleGlzdGluZ1NlbGVjdGlvbiA9IGtlZXBFeGlzdGluZ1NlbGVjdGlvbiAmJiBvcHRpb25zLmZpbmQoKG9wdGlvbjogYW55KSA9PiBvcHRpb24ua2V5ID09PSBzZWxlY3RlZEtleSk7XG5cdFx0aWYgKHJlc2V0VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBzZWxlY3RPcHRpb25zID0gb3B0aW9ucy5zZWxlY3RPcHRpb25zO1xuXHRcdFx0b3B0aW9ucy5sZW5ndGggPSAwO1xuXHRcdFx0ZGVmYXVsdE9wdGlvbnMuZm9yRWFjaCgoZGVmYXVsdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goZGVmYXVsdE9wdGlvbikpO1xuXHRcdFx0c2VsZWN0T3B0aW9ucy5mb3JFYWNoKChzZWxlY3RPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKHNlbGVjdE9wdGlvbikpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0fVxuXG5cdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUsIG9wdGlvbnMpO1xuXG5cdFx0aWYgKGV4aXN0aW5nU2VsZWN0aW9uICYmICFvcHRpb25zLmluY2x1ZGVzKGV4aXN0aW5nU2VsZWN0aW9uKSkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKGV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGZpZWxkUGF0aEFic29sdXRlICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXG5cdFx0aWYgKGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZSk7XG5cdFx0aWYgKGZpZWxkVmFsdWVIZWxwICYmIGZpZWxkVmFsdWVIZWxwLmdldERpYWxvZ0NvbnRlbnQoKS5nZXRUYWJsZSgpKSB7XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlcnMgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0SW5QYXJhbWV0ZXJzKCkgfHwgW10pLm1hcCgoaW5QYXJhbTogSW5QYXJhbWV0ZXIpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IChmaWVsZFZhbHVlSGVscC5nZXRJblBhcmFtZXRlcnMoKSB8fCBbXSkubWFwKChvdXRQYXJhbTogT3V0UGFyYW1ldGVyKSA9PiBvdXRQYXJhbS5nZXRGaWVsZFBhdGgoKSk7XG5cdFx0XHRjb25zdCBpbmZvOiBhbnkgPSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyczogaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbTogYW55KSA9PiBpblBhcmFtLmdldEZpZWxkUGF0aCgpKSxcblx0XHRcdFx0b3V0UGFyYW1ldGVyczogb3V0UGFyYW1ldGVycy5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmdldEZpZWxkUGF0aCgpKVxuXHRcdFx0fTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWAsIGZhbHNlLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udGV4dH0gdHJhbnNDdHggVGhlIHRyYW5zaWVudCBjb250ZXh0IG9mIHRoZSBNRUQuXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIG1ldGFQYXRoICsgXCIvXCIgKyBwcm9wZXJ0eU5hbWUpIGFzIHN0cmluZztcblx0XHRjb25zdCBkZXBlbmRlbnRzID0gKHNvdXJjZSBhcyBhbnkpPy5nZXREZXBlbmRlbnRzKCk7XG5cdFx0Y29uc3QgZmllbGRIZWxwID0gc291cmNlPy5nZXRGaWVsZEhlbHAoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0cmFuc0N0eC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFZhbHVlTGlzdEhlbHBlci5jcmVhdGVWSFVJTW9kZWwocHJvcGVydHlQYXRoLCBmaWVsZFZhbHVlSGVscCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBtZXRhTW9kZWwsIHByb3BlcnR5UGF0aCkgYXMgUHJvbWlzZTxhbnk+O1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6IHZMaW5mby5pblBhcmFtZXRlcnMubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6IHZMaW5mby5vdXRQYXJhbWV0ZXJzLm1hcCgob3V0UGFyYW06IGFueSkgPT4gb3V0UGFyYW0uZ2V0RmllbGRQYXRoKCkpXG5cdFx0XHRcdH07XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRcdGlmIChpbmZvLm91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhgTWFzcyBFZGl0OiBDb3VsZG4ndCBsb2FkIHZhbHVlTGlzdCBpbmZvIGZvciAke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgZmllbGQgaGVscCBjb250cm9sIGZyb20gTURDIGZpZWxkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHJldHVybnMgRmllbGQgSGVscCBjb250cm9sLlxuXHQgKi9cblx0X2dldFZhbHVlSGVscDogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IGFueSk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCk7XG5cdFx0cmV0dXJuIGZpZWxkVmFsdWVIZWxwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb2xsZWQgb24gZHJvcCBkb3duIHNlbGVjdGlvbiBvZiBWSEQgb3B0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtNYXNzRWRpdFNlbGVjdH0gc291cmNlIEN1c3RvbSBNYXNzIEVkaXQgU2VsZWN0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdEtleSBQcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBWSEQgd2FzIHNlbGVjdGVkLlxuXHQgKi9cblx0X29uVkhTZWxlY3Q6IGZ1bmN0aW9uIChzb3VyY2U6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHNlbGVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBzZWxlY3RlZC5cblxuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3ZhbHVlcy9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlSGVscCh0cmFuc0N0eCwgc291cmNlLmdldFBhcmVudCgpKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRzb3VyY2UuZmlyZVZhbHVlSGVscFJlcXVlc3QoKTtcblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0S2V5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyBQcm9wZXJ0eSBuYW1lIGZyb20gc2VsZWN0aW9uIGtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgU2VsZWN0aW9uIGtleS5cblx0ICogQHJldHVybnMgUHJvcGVydHkgbmFtZS5cblx0ICovXG5cdF9nZXRQcm9wZXJ0eU5hbWVGcm9tS2V5OiBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRsZXQgcHJvcGVydHlOYW1lID0gXCJcIjtcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIikpIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzZWxlY3Rpb24gdG8gQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge01EQ0ZpZWxkfSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgbWFzc0VkaXRTZWxlY3QgPSAoc291cmNlLmdldENvbnRlbnQoKSBhcyBhbnkpIGFzIFNlbGVjdDtcblx0XHRpZiAoIW1hc3NFZGl0U2VsZWN0IHx8ICFwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGtleTogc3RyaW5nID0gbWFzc0VkaXRTZWxlY3QuZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRpZiAoKGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpKSAmJiAhdmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0ID0gTWFzc0VkaXRIYW5kbGVycy5fdmFsdWVFeGlzdHMoZnVsbFRleHQpID8gZnVsbFRleHQgOiB2YWx1ZTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoKHNvdXJjZSBhcyBhbnkpLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSB8fCBbXTtcblx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGEvXCIgKyBwcm9wZXJ0eU5hbWUpICYmIFwiL3VuaXREYXRhL1wiKTtcblxuXHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IHZhbHVlcy5maW5kKChmaWVsZERhdGE6IGFueSkgPT4gZmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IGZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZSk7XG5cblx0XHRpZiAocmVsYXRlZEZpZWxkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bGxUZXh0ICYmXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoICYmXG5cdFx0XHRcdChyZWxhdGVkRmllbGQudGV4dCAhPSBmb3JtYXR0ZWRUZXh0IHx8IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby5mdWxsVGV4dCAhPSBmb3JtYXR0ZWRUZXh0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgZnVsbCB0ZXh0IG9ubHkgd2hlbiBwcm92aWRlZC5cblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb24gPSBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZEZpZWxkLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwga2V5KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0a2V5ID0gcmVsYXRlZEZpZWxkLmtleTtcblx0XHR9IGVsc2UgaWYgKFt1bmRlZmluZWQsIG51bGwsIFwiXCJdLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuXHRcdFx0a2V5ID0gcHJvcGVydHlOYW1lICsgXCIvXCIgKyB2YWx1ZTtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkluZm8gPSB7XG5cdFx0XHRcdHRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dGV4dEluZm86IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogdmFsdWVzICYmIHZhbHVlcy50ZXh0SW5mbyAmJiB2YWx1ZXMudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdGZ1bGxUZXh0OiBmb3JtYXR0ZWRUZXh0LFxuXHRcdFx0XHRcdHRleHRBcnJhbmdlbWVudDogc291cmNlLmdldERpc3BsYXkoKSxcblx0XHRcdFx0XHR2YWx1ZTogc291cmNlLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBwcm9wZXJ0eU5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHZhbHVlcy5wdXNoKHNlbGVjdGlvbkluZm8pO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMgPSB2YWx1ZXMuc2VsZWN0T3B0aW9ucyB8fCBbXTtcblx0XHRcdHZhbHVlcy5zZWxlY3RPcHRpb25zLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSwgdmFsdWVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5ID0gXCJEZWZhdWx0L1wiICsgcHJvcGVydHlOYW1lO1xuXHRcdH1cblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwga2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVSZXN1bHRzKG1hc3NFZGl0U2VsZWN0KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IFZhbHVlIGZyb20gRHJvcCBkb3duLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250cm9sfSBzb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFZhbHVlIG9mIHNlbGVjdGlvbi5cblx0ICovXG5cdF9nZXRWYWx1ZTogZnVuY3Rpb24gKHNvdXJjZTogQ29udHJvbCkge1xuXHRcdHJldHVybiBzb3VyY2UuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLmZlLmNvcmUuY29udHJvbHMuTWFzc0VkaXRTZWxlY3RcIlxuXHRcdFx0PyAoc291cmNlIGFzIFNlbGVjdCkuZ2V0U2VsZWN0ZWRJdGVtKCk/LmdldFRleHQoKVxuXHRcdFx0OiAoc291cmNlIGFzIENvbWJvQm94KS5nZXRWYWx1ZSgpO1xuXHR9LFxuXG5cdF9nZXRWYWx1ZU9uRW1wdHk6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGZpZWxkc0luZm9Nb2RlbDogSlNPTk1vZGVsLCB2YWx1ZTogYW55LCBzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtzUHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblx0XHRcdGlmICh2YWx1ZXMudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlID0gMDtcblx0XHRcdFx0b1NvdXJjZS5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHR2YWx1ZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblxuXHRfdmFsdWVFeGlzdHM6IGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG5cdFx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPSBudWxsO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHNlbGVjdGlvbnMgdG8gcnVudGltZSBtb2RlbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udHJvbH0gb1NvdXJjZSBEcm9wIGRvd24gY29udHJvbC5cblx0ICogQHBhcmFtIHtBcnJheX0gYVBhcmFtcyBQYXJ0cyBvZiBrZXkgaW4gcnVudGltZSBtb2RlbC5cblx0ICogQHBhcmFtIHtib29sZWFufSB1cGRhdGVUcmFuc0N0eCBTaG91bGQgdHJhbnNpZW50IGNvbnRleHQgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVSZXN1bHRzOiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBhUGFyYW1zOiBBcnJheTxzdHJpbmc+ID0gW10sIHVwZGF0ZVRyYW5zQ3R4OiBib29sZWFuKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Ly8gMi4gT3V0IHBhcmFtZXRlci5cblx0XHQvLyAzLiB0cmFuc2llbnQgY29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Y29uc3QgZmllbGRzSW5mb01vZGVsID0gb1NvdXJjZSAmJiBvU291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBmaWVsZHNJbmZvTW9kZWwgJiYgZmllbGRzSW5mb01vZGVsLmdldERhdGEoKTtcblx0XHRsZXQgdmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZShvU291cmNlIGFzIENvbnRyb2wpO1xuXHRcdGFQYXJhbXMgPSBhUGFyYW1zLmxlbmd0aCA+IDAgPyBhUGFyYW1zIDogb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblxuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5nZXRJZCgpLnN1YnN0cmluZyhvU291cmNlLmdldElkKCkubGFzdEluZGV4T2YoXCI6XCIpICsgMSk7XG5cblx0XHRpZiAoYVBhcmFtc1swXSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1sxXSxcblx0XHRcdFx0dmFsdWU6IGFQYXJhbXNbMF1cblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmIChhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHR2YWx1ZSA9IFwiXCI7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1sxXSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoIWFQYXJhbXMpIHtcblx0XHRcdHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVPbkVtcHR5KG9Tb3VyY2UsIGZpZWxkc0luZm9Nb2RlbCwgdmFsdWUsIHNQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBzUHJvcGVydHlOYW1lLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGFQYXJhbXMuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGEvXCIgKyBwcm9wZXJ0eU5hbWUpIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4KSB7XG5cdFx0XHRjb25zdCB0cmFuc0N0eCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGlmIChhUGFyYW1zWzBdID09PSBcIkRlZmF1bHRcIiB8fCBhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHRcdHRyYW5zQ3R4LnNldFByb3BlcnR5KG9EYXRhT2JqZWN0LmtleVZhbHVlLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAob0RhdGFPYmplY3QpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG9EYXRhT2JqZWN0LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGFuZGxlcnM7XG4iXX0=