@sapui5/sap.fe.core 1.97.0 → 1.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +68 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -0,0 +1,604 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/m/Dialog", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/m/Button", "../converters/MetaModelConverter", "sap/fe/macros/field/FieldTemplating", "../templating/UIFormatters", "../templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (Dialog, XMLTemplateProcessor, JSONModel, Fragment, XMLPreprocessor, Log, CommonUtils, Button, MetaModelConverter, FieldTemplating, UIFormatters, FieldControlHelper, PropertyHelper) {
6
+ "use strict";
7
+
8
+ var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
9
+ var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression;
10
+ var getRequiredExpression = UIFormatters.getRequiredExpression;
11
+ var getEditableExpression = UIFormatters.getEditableExpression;
12
+ var getTextBinding = FieldTemplating.getTextBinding;
13
+ var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
14
+ var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
15
+
16
+ var aValidDataTypes = ["Edm.Boolean", "Edm.Byte", "Edm.Decimal", "Edm.Double", "Edm.Float", "Edm.Guid", "Edm.Int16", "Edm.Int32", "Edm.Int64", "Edm.SByte", "Edm.Single", "Edm.String"];
17
+ var MassEditHelper = {
18
+ /**
19
+ * Initializes the value at final or deepest level path with a blank array.
20
+ * Return an empty array pointing to the final or deepest level path.
21
+ *
22
+ * @param {string} sPath Property path
23
+ * @param {Array} aValues Array instance where the default data needs to be added
24
+ * @returns {Array}
25
+ */
26
+ initLastLevelOfPropertyPath: function (sPath, aValues) {
27
+ var aFinalPath;
28
+ var index = 0;
29
+ var aPaths = sPath.split("/");
30
+ var sFullPath = "";
31
+ aPaths.forEach(function (sPropertyPath) {
32
+ if (!aValues[sPropertyPath] && index === 0) {
33
+ aValues[sPropertyPath] = {};
34
+ aFinalPath = aValues[sPropertyPath];
35
+ sFullPath = sFullPath + sPropertyPath;
36
+ index++;
37
+ } else if (!aFinalPath[sPropertyPath]) {
38
+ sFullPath = sFullPath + "/" + sPropertyPath;
39
+
40
+ if (sFullPath !== sPath) {
41
+ aFinalPath[sPropertyPath] = {};
42
+ aFinalPath = aFinalPath[sPropertyPath];
43
+ } else {
44
+ aFinalPath[sPropertyPath] = [];
45
+ }
46
+ }
47
+ });
48
+ return aFinalPath;
49
+ },
50
+
51
+ /**
52
+ * Method to get unique values for given array values.
53
+ *
54
+ * @param {string} sValue Property value
55
+ * @param {number} index Index of the property value
56
+ * @param {Array} self Instance of the array
57
+ * @returns {boolean}
58
+ */
59
+ getUniqueValues: function (sValue, index, self) {
60
+ if (sValue) {
61
+ return self.indexOf(sValue) === index;
62
+ }
63
+ },
64
+
65
+ /**
66
+ * Gets the property value for a multi-level path (for example: _Materials/Material_Details gets the value of Material_Details under _Materials Object).
67
+ * Returns the propertyValue, which can be of any type (string, number, etc..).
68
+ *
69
+ * @param {string} sDataPropertyPath Property path
70
+ * @param {object} oValues Object of property values
71
+ * @returns {*}
72
+ */
73
+ getValueForMultiLevelPath: function (sDataPropertyPath, oValues) {
74
+ if (sDataPropertyPath && sDataPropertyPath.indexOf("/") > 0) {
75
+ var aPropertyPaths = sDataPropertyPath.split("/");
76
+ var Result;
77
+ aPropertyPaths.forEach(function (sPath) {
78
+ Result = oValues && oValues[sPath] ? oValues[sPath] : Result && Result[sPath];
79
+ });
80
+ return Result;
81
+ }
82
+ },
83
+
84
+ /**
85
+ * Gets the key path for the key of a combo box that must be selected initially when the dialog opens:
86
+ * => If propertyValue for all selected contexts is different, then < Keep Existing Values > is preselected.
87
+ * => If propertyValue for all selected contexts is the same, then the propertyValue is preselected.
88
+ * => If propertyValue for all selected contexts is empty, then < Leave Blank > is preselected.
89
+ *
90
+ *
91
+ * @param {Array} aContexts Contexts for mass edit
92
+ * @param {string} sDataPropertyPath Data property path
93
+ * @returns {string}
94
+ */
95
+ getDefaultSelectionPathComboBox: function (aContexts, sDataPropertyPath) {
96
+ if (sDataPropertyPath && aContexts.length > 0) {
97
+ var oSelectedContext = aContexts,
98
+ aPropertyValues = [];
99
+ oSelectedContext.forEach(function (oContext) {
100
+ var oDataObject = oContext.getObject();
101
+ var sMultiLevelPathCondition = sDataPropertyPath.indexOf("/") > -1 && oDataObject.hasOwnProperty(sDataPropertyPath.split("/")[0]);
102
+
103
+ if (oContext && (oDataObject.hasOwnProperty(sDataPropertyPath) || sMultiLevelPathCondition)) {
104
+ aPropertyValues.push(oContext.getObject(sDataPropertyPath));
105
+ }
106
+ });
107
+ var aUniquePropertyValues = aPropertyValues.filter(MassEditHelper.getUniqueValues);
108
+
109
+ if (aUniquePropertyValues.length > 1) {
110
+ return "Default/" + sDataPropertyPath;
111
+ } else if (aUniquePropertyValues.length === 0) {
112
+ return "Empty/" + sDataPropertyPath;
113
+ } else if (aUniquePropertyValues.length === 1) {
114
+ return sDataPropertyPath;
115
+ }
116
+ }
117
+ },
118
+
119
+ /**
120
+ * Checks hidden annotation value [both static and path based] for table's selected context.
121
+ *
122
+ * @param {*} hiddenValue Hidden annotation value / path for field
123
+ * @param {Array} aContexts Contexts for mass edit
124
+ * @returns {boolean}
125
+ */
126
+ getHiddenValueForContexts: function (hiddenValue, aContexts) {
127
+ if (hiddenValue && hiddenValue.$Path) {
128
+ return !aContexts.some(function (oSelectedContext) {
129
+ return oSelectedContext.getObject(hiddenValue.$Path) === false;
130
+ });
131
+ }
132
+
133
+ return hiddenValue;
134
+ },
135
+
136
+ /**
137
+ * Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
138
+ *
139
+ * @param {object} oTable Instance of Table
140
+ * @param {Array} aContexts Contexts for mass edit
141
+ * @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
142
+ * @returns {object}
143
+ */
144
+ prepareDataForDialog: function (oTable, aContexts, aDataArray) {
145
+ var oMetaModel = oTable && oTable.getModel().getMetaModel(),
146
+ sCurrentEntitySetName = oTable.data("metaPath"),
147
+ aTableFields = MassEditHelper.getTableFields(oTable),
148
+ oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName + "/@"),
149
+ oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
150
+ var oDataFieldModel = new JSONModel();
151
+ var oResult;
152
+ var sLabelText;
153
+ var bValueHelpEnabled;
154
+ var sUnitPropertyPath;
155
+ var bValueHelpEnabledForUnit;
156
+ var bIsImmutable;
157
+ var bIsComputed;
158
+ var bChartProperty;
159
+ var oTextBinding;
160
+ var bValidDataType;
161
+ var bInValidInputType;
162
+ aTableFields.forEach(function (oColumnInfo) {
163
+ var sDataPropertyPath = oColumnInfo.dataProperty;
164
+
165
+ if (sDataPropertyPath) {
166
+ var oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@");
167
+ bValueHelpEnabled = sDataPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sDataPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
168
+ sUnitPropertyPath = oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.Unit"] && oPropertyInfo["@Org.OData.Measures.V1.Unit"].$Path || oPropertyInfo && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"] && oPropertyInfo["@Org.OData.Measures.V1.ISOCurrency"].$Path;
169
+ sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"];
170
+ bValueHelpEnabledForUnit = sUnitPropertyPath && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@") && oMetaModel.getObject(sCurrentEntitySetName + "/" + sUnitPropertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueList"];
171
+
172
+ if (oDataModelObjectPath) {
173
+ oDataModelObjectPath.targetObject = oDataModelObjectPath.targetEntityType.entityProperties.filter(function (oProperty) {
174
+ return oProperty.name === sDataPropertyPath;
175
+ });
176
+ }
177
+
178
+ oDataModelObjectPath.targetObject = oDataModelObjectPath.targetObject[0] || {};
179
+ oTextBinding = getTextBinding(oDataModelObjectPath, {}, true) || {};
180
+ var oFieldContext = oMetaModel.getContext(oColumnInfo.annotationPath),
181
+ oDataFieldConverted = convertMetaModelContext(oFieldContext),
182
+ oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName + "/" + sDataPropertyPath + "@"),
183
+ oInterface = oPropertyContext && oPropertyContext.getInterface();
184
+ bIsImmutable = oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Immutable"];
185
+ bIsComputed = oPropertyContext && oPropertyContext.getProperty() && oPropertyContext.getProperty()["@Org.OData.Core.V1.Computed"];
186
+ var bHiddenField = MassEditHelper.getHiddenValueForContexts(oFieldContext && oFieldContext.getObject()["@com.sap.vocabularies.UI.v1.Hidden"], aContexts) || false;
187
+ oInterface.context = {
188
+ getModel: function () {
189
+ return oInterface.getModel();
190
+ },
191
+ getPath: function () {
192
+ return sCurrentEntitySetName + "/" + sDataPropertyPath;
193
+ }
194
+ };
195
+ oPropertyInfo = oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
196
+
197
+ var isReadOnly = isReadOnlyExpression(oPropertyInfo);
198
+ bChartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
199
+ bValidDataType = oPropertyInfo && aValidDataTypes.indexOf(oPropertyInfo.type) !== -1;
200
+ bInValidInputType = oColumnInfo && oColumnInfo.inputType && (oColumnInfo.inputType === "sap.m.RatingIndicator" || oColumnInfo.inputType === "sap.ui.mdc.MultiValueField") || hasValueHelpWithFixedValues(oPropertyInfo);
201
+
202
+ if (sDataPropertyPath && !bHiddenField && !bIsImmutable && !bIsComputed && !bChartProperty && bValidDataType && !bInValidInputType && oColumnInfo.inputType && getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath) !== "false") {
203
+ oResult = {
204
+ "label": sLabelText + ":",
205
+ "visible": sDataPropertyPath && !bHiddenField && !bIsImmutable && !bIsComputed && getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath),
206
+ "dataProperty": sDataPropertyPath,
207
+ "isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
208
+ "unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
209
+ "isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
210
+ "propertyPathForValueHelp": sCurrentEntitySetName + "/" + sDataPropertyPath,
211
+ "propertyPathForValueHelpUnit": sCurrentEntitySetName + "/" + sUnitPropertyPath,
212
+ "isFieldRequired": getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
213
+ "defaultSelectionPath": sDataPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath) : false,
214
+ "defaultSelectionUnitPath": sUnitPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath) : false,
215
+ "entitySet": sCurrentEntitySetName,
216
+ "textBinding": oTextBinding,
217
+ "nullable": oPropertyInfo.nullable !== undefined ? oPropertyInfo.nullable : true,
218
+ "isPropertyReadOnly": isReadOnly !== undefined ? isReadOnly : false
219
+ };
220
+ aDataArray.push(oResult);
221
+ }
222
+ }
223
+ });
224
+ oDataFieldModel.setData(aDataArray);
225
+ return oDataFieldModel;
226
+ },
227
+ getInputTypeForColumn: function (oColumn) {
228
+ return oColumn.getTemplate().getContent && oColumn.getTemplate().getContent() && oColumn.getTemplate().getContent().getContentEdit && oColumn.getTemplate().getContent().getContentEdit() && oColumn.getTemplate().getContent().getContentEdit()[0] && oColumn.getTemplate().getContent().getContentEdit()[0].getMetadata().getName();
229
+ },
230
+ getTableFields: function (oTable) {
231
+ var aColumns = oTable && oTable.getColumns() || [];
232
+ return aColumns.map(function (oColumn) {
233
+ var sDataProperty = oColumn && oColumn.getDataProperty(),
234
+ aRealtedColumnInfo = oTable.data("columns") && oTable.data("columns").customData.filter(function (oColumnInfo) {
235
+ return oColumnInfo.name === sDataProperty && oColumnInfo.type === "Annotation";
236
+ });
237
+ return {
238
+ "dataProperty": sDataProperty,
239
+ "label": oColumn.getHeader(),
240
+ "annotationPath": aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath,
241
+ "inputType": MassEditHelper.getInputTypeForColumn(oColumn)
242
+ };
243
+ });
244
+ },
245
+ getDefaultTextsForDialog: function (oResourceBundle, iSelectedContexts, oTable) {
246
+ // The confirm button text is "Save" for table in Display mode and "Apply" for table in edit mode. This can be later exposed if needed.
247
+ var bDisplayMode = oTable.data("displayModePropertyBinding") === "true";
248
+ return {
249
+ "keepExistingPrefix": "< Keep",
250
+ "leaveBlankValue": "< Leave Blank >",
251
+ "clearFieldValue": "< Clear Values >",
252
+ "massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
253
+ "applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
254
+ "cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
255
+ };
256
+ },
257
+
258
+ /**
259
+ * Adds a suffix to the 'keep existing' property of the comboBox.
260
+ *
261
+ * @param {string} sInputType InputType of the field
262
+ * @returns {string}
263
+ */
264
+ getSuffixForKeepExisiting: function (sInputType) {
265
+ var sResult = "Values";
266
+
267
+ switch (sInputType) {
268
+ //TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
269
+ case "sap.m.DatePicker":
270
+ sResult = "Dates";
271
+ break;
272
+
273
+ case "sap.m.CheckBox":
274
+ sResult = "Settings";
275
+ break;
276
+ }
277
+
278
+ return sResult;
279
+ },
280
+
281
+ /**
282
+ * Adds default values to the model [Keep Existing Values, Leave Blank].
283
+ *
284
+ * @param {Array} aValues Array instance where the default data needs to be added
285
+ * @param {Array} aContexts Contexts for mass edit
286
+ * @param {object} oDefaultValues Default values from Application Manifest
287
+ * @param {object} oPropertyInfo Property information
288
+ * @param {boolean} bUOMField
289
+ */
290
+ setDefaultValuesToDialog: function (aValues, aContexts, oDefaultValues, oPropertyInfo, bUOMField) {
291
+ var sPropertyPath = oPropertyInfo.dataProperty,
292
+ sInputType = oPropertyInfo.inputType,
293
+ bPropertyRequired = oPropertyInfo.isFieldRequired;
294
+ var sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType); //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
295
+ //TODO - Add option Apply to Empty Fields only for Both Value Help and controls.
296
+
297
+ var bValueExistsForPropertyPath = aContexts.some(function (oSelectedContext) {
298
+ return oSelectedContext.getObject(sPropertyPath);
299
+ });
300
+
301
+ if (bValueExistsForPropertyPath) {
302
+ if (bPropertyRequired !== "true" && !bUOMField) {
303
+ aValues.unshift({
304
+ text: oDefaultValues.clearFieldValue,
305
+ key: "ClearFieldValue/" + sPropertyPath
306
+ });
307
+ }
308
+ } else {
309
+ aValues.unshift({
310
+ text: oDefaultValues.leaveBlankValue,
311
+ key: "Empty/" + sPropertyPath
312
+ });
313
+ }
314
+
315
+ aValues.unshift({
316
+ text: oDefaultValues.keepExistingPrefix + " " + sSuffixForKeepExisting + " >",
317
+ key: "Default/" + sPropertyPath
318
+ });
319
+ },
320
+ getTextArrangementInfo: function (sProperty, oTextBinding, sCurrentEntitySet, oSelectedContext) {
321
+ var oMetaModel = oSelectedContext.getModel().getMetaModel();
322
+ var sDisplayMode = CommonUtils.computeDisplayMode(oMetaModel.getObject(sCurrentEntitySet + "/" + sProperty + "@"));
323
+ var sDescriptionPath, sValue, sDescriptionValue, sFullText;
324
+
325
+ if (oTextBinding && (oTextBinding.path || oTextBinding.parameters && oTextBinding.parameters.length) && sProperty) {
326
+ if (oTextBinding.path) {
327
+ if (sDisplayMode === "Description") {
328
+ sValue = oSelectedContext.getObject(sProperty);
329
+ sDescriptionValue = oSelectedContext.getObject(oTextBinding.path);
330
+ sFullText = sDescriptionValue;
331
+ } else if (sDisplayMode === "Value") {
332
+ sValue = oSelectedContext.getObject(sProperty);
333
+ sFullText = sValue;
334
+ }
335
+ } else if (oTextBinding.parameters) {
336
+ oTextBinding.parameters.forEach(function (oProps) {
337
+ if (oProps.path && oProps.path !== sProperty) {
338
+ sDescriptionPath = oProps.path;
339
+ }
340
+ });
341
+ sValue = oSelectedContext.getObject(sProperty);
342
+ sDescriptionValue = oSelectedContext.getObject(sDescriptionPath);
343
+
344
+ if (sDisplayMode === "ValueDescription" && sValue && sDescriptionValue) {
345
+ sFullText = sValue + " (" + sDescriptionValue + ")";
346
+ } else if (sDisplayMode === "DescriptionValue" && sDescriptionValue && sValue) {
347
+ sFullText = sDescriptionValue + " (" + sValue + ")";
348
+ }
349
+ }
350
+
351
+ return {
352
+ "textArrangement": sDisplayMode,
353
+ "valuePath": sProperty,
354
+ "descriptionPath": sDescriptionPath,
355
+ "value": sValue,
356
+ "description": sDescriptionValue,
357
+ "fullText": sFullText
358
+ };
359
+ }
360
+
361
+ return undefined;
362
+ },
363
+
364
+ /**
365
+ * Initializes a runtime model:
366
+ * => The model consists of values shown in the comboBox of the dialog (Leave Blank, Keep Existing Values, or any property value for the selected context, etc.)
367
+ * => The model will capture runtime changes in the results property (the value entered in the comboBox).
368
+ *
369
+ * @param {Array} aContexts Contexts for mass edit
370
+ * @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
371
+ * @param {object} oDefaultValues Default values from i18n
372
+ * @returns {object}
373
+ */
374
+ setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues) {
375
+ var aValues = [];
376
+ var aUnitData = [];
377
+ var aResults = [];
378
+ var aReadOnlyFieldInfo = [];
379
+ var oDistinctValueMap = {};
380
+ var sPropertyName;
381
+ aDataArray.forEach(function (oData) {
382
+ var oTextInfo;
383
+
384
+ if (oData.dataProperty && oData.dataProperty.indexOf("/") > -1) {
385
+ var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues);
386
+ var aPropertyPaths = oData.dataProperty.split("/");
387
+ var sPropertyKey;
388
+
389
+ for (var i = 0; i < aContexts.length; i++) {
390
+ var sMultiLevelPathValue = aContexts[i].getObject(oData.dataProperty);
391
+ sPropertyKey = oData.dataProperty + "/" + sMultiLevelPathValue;
392
+
393
+ if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
394
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[i]);
395
+ aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
396
+ "text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
397
+ "key": oData.dataProperty,
398
+ "textInfo": oTextInfo
399
+ });
400
+ oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
401
+ }
402
+ }
403
+ } else {
404
+ aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
405
+
406
+ if (oData.unitProperty) {
407
+ aUnitData[oData.unitProperty] = aUnitData[oData.unitProperty] || [];
408
+ }
409
+
410
+ for (var _i = 0; _i < aContexts.length; _i++) {
411
+ var oDataObject = aContexts[_i].getObject();
412
+
413
+ sPropertyName = oData.dataProperty + "/" + oDataObject[oData.dataProperty];
414
+
415
+ if (oData.dataProperty && oDataObject[oData.dataProperty] && !oDistinctValueMap[sPropertyName]) {
416
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
417
+ aValues[oData.dataProperty].push({
418
+ "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
419
+ "key": oData.dataProperty,
420
+ "textInfo": oTextInfo
421
+ });
422
+ oDistinctValueMap[sPropertyName] = oDataObject[oData.dataProperty];
423
+ }
424
+
425
+ if (oData.unitProperty && oDataObject[oData.unitProperty]) {
426
+ sPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
427
+
428
+ if (!oDistinctValueMap[sPropertyName]) {
429
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oData.unitProperty, oData.textBinding, oData.entitySet, aContexts[_i]);
430
+ aUnitData[oData.unitProperty].push({
431
+ "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.unitProperty],
432
+ "key": oData.unitProperty,
433
+ "textInfo": oTextInfo
434
+ });
435
+ oDistinctValueMap[sPropertyName] = oDataObject[oData.unitProperty];
436
+ }
437
+ }
438
+ }
439
+ }
440
+ });
441
+ aDataArray.forEach(function (oData) {
442
+ if (oData.dataProperty.indexOf("/") > -1) {
443
+ var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oData.dataProperty, aValues);
444
+
445
+ if (!sMultiLevelPropPathValue) {
446
+ sMultiLevelPropPathValue.push({
447
+ text: oDefaultValues.leaveBlankValue,
448
+ key: "Empty/" + oData.dataProperty
449
+ });
450
+ } else {
451
+ MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, aContexts, oDefaultValues, oData);
452
+ }
453
+ } else if (aValues[oData.dataProperty] && aValues[oData.dataProperty].length) {
454
+ MassEditHelper.setDefaultValuesToDialog(aValues[oData.dataProperty], aContexts, oDefaultValues, oData);
455
+ }
456
+
457
+ if (aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].length) {
458
+ MassEditHelper.setDefaultValuesToDialog(aUnitData[oData.unitProperty], aContexts, oDefaultValues, oData, true);
459
+ } else if (oData.dataProperty && aValues[oData.dataProperty] && !aValues[oData.dataProperty].length || oData.unitProperty && aUnitData[oData.unitProperty] && !aUnitData[oData.unitProperty].length) {
460
+ var bClearFieldOrBlankValueExists = aValues[oData.dataProperty] && aValues[oData.dataProperty].some(function (obj) {
461
+ return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
462
+ });
463
+
464
+ if (oData.dataProperty && !bClearFieldOrBlankValueExists) {
465
+ aValues[oData.dataProperty].push({
466
+ text: oDefaultValues.leaveBlankValue,
467
+ key: "Empty/" + oData.dataProperty
468
+ });
469
+ }
470
+
471
+ var bClearFieldOrBlankUnitValueExists = aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].some(function (obj) {
472
+ return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
473
+ });
474
+
475
+ if (oData.unitProperty && !bClearFieldOrBlankUnitValueExists) {
476
+ aUnitData[oData.unitProperty].push({
477
+ text: oDefaultValues.leaveBlankValue,
478
+ key: "Empty/" + oData.unitProperty
479
+ });
480
+ }
481
+ }
482
+
483
+ if (oData.isPropertyReadOnly && typeof oData.isPropertyReadOnly === "boolean") {
484
+ aReadOnlyFieldInfo.push({
485
+ "property": oData.dataProperty,
486
+ value: oData.isPropertyReadOnly,
487
+ type: "Default"
488
+ });
489
+ } else if (oData.isPropertyReadOnly && oData.isPropertyReadOnly.operands && oData.isPropertyReadOnly.operands[0] && oData.isPropertyReadOnly.operands[0].operand1 && oData.isPropertyReadOnly.operands[0].operand2) {
490
+ // This needs to be refactored in accordance with the ReadOnlyExpression change
491
+ aReadOnlyFieldInfo.push({
492
+ "property": oData.dataProperty,
493
+ propertyPath: oData.isPropertyReadOnly.operands[0].operand1.path,
494
+ propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
495
+ type: "Path"
496
+ });
497
+ }
498
+ });
499
+ var oData = {
500
+ "values": aValues,
501
+ "unitData": aUnitData,
502
+ "results": aResults,
503
+ "readablePropertyData": aReadOnlyFieldInfo
504
+ };
505
+ var oDialogDataModel = new JSONModel(oData);
506
+ return oDialogDataModel;
507
+ },
508
+
509
+ /**
510
+ * Create the mass edit dialog.
511
+ *
512
+ * @param {object} oTable Instance of Table
513
+ * @param {Array} aContexts Contexts for mass edit
514
+ * @param {object} oController Controller for the view
515
+ * @returns {object} Promise returning instance of dialog.
516
+ */
517
+ createDialog: function (oTable, aContexts, oController) {
518
+ var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
519
+ aDataArray = [],
520
+ oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
521
+ oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
522
+ oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
523
+ oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues);
524
+ return new Promise(function (resolve, reject) {
525
+ var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
526
+ return Promise.resolve(XMLPreprocessor.process(oFragment, {
527
+ name: sFragmentName
528
+ }, {
529
+ bindingContexts: {
530
+ dataFieldModel: oDataFieldModel.createBindingContext("/")
531
+ },
532
+ models: {
533
+ dataFieldModel: oDataFieldModel
534
+ }
535
+ })).then(function (oFragment) {
536
+ return Fragment.load({
537
+ definition: oFragment
538
+ }).then(function (oDialogContent) {
539
+ var oDialog = new Dialog({
540
+ title: oDefaultValues.massEditTitle,
541
+ content: [oDialogContent],
542
+ beginButton: new Button({
543
+ text: oDefaultValues.applyButtonText,
544
+ type: "Emphasized",
545
+ press: function (oEvent) {
546
+ var oDialog = oEvent.getSource().getParent();
547
+ var oModel = oDialog.getModel("fieldsInfo");
548
+ var aResults = oModel.getProperty("/results");
549
+ var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
550
+ var changePromise = [];
551
+ var bReadOnlyField = false;
552
+ aContexts.forEach(function (oSelectedContext) {
553
+ aResults.forEach(function (oResult) {
554
+ //TODO - Add save implementation for Value Help.
555
+ if (aPropertyReadableInfo) {
556
+ bReadOnlyField = aPropertyReadableInfo.some(function (oPropertyInfo) {
557
+ if (oResult.keyValue === oPropertyInfo.property) {
558
+ if (oPropertyInfo.type === "Default") {
559
+ return oPropertyInfo.value === true;
560
+ } else if (oPropertyInfo.type === "Path" && oPropertyInfo.propertyValue && oPropertyInfo.propertyPath) {
561
+ return oSelectedContext.getObject(oPropertyInfo.propertyPath) === oPropertyInfo.propertyValue;
562
+ }
563
+ }
564
+ });
565
+ }
566
+
567
+ if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
568
+ changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value));
569
+ }
570
+ });
571
+ });
572
+ return Promise.all(changePromise).then(function (oRes) {
573
+ var oListBinding = oTable.getRowBinding(),
574
+ oExtensionAPI = oController && oController.getExtensionAPI();
575
+ return oExtensionAPI.refresh(oListBinding.getPath()).then(function () {
576
+ oDialog.close();
577
+ oDialog.destroy();
578
+ return oRes;
579
+ });
580
+ }).catch(function (oError) {
581
+ //TODO - Add error handling part for the Dialog
582
+ Log.error("Mass Edit: Something went wrong in updating entries.", oError);
583
+ });
584
+ }
585
+ }),
586
+ endButton: new Button({
587
+ text: oDefaultValues.cancelButtonText,
588
+ press: function (oEvent) {
589
+ var oDialog = oEvent.getSource().getParent();
590
+ oDialog.close();
591
+ oDialog.destroy();
592
+ }
593
+ })
594
+ });
595
+ oDialog.setModel(oDialogDataModel, "fieldsInfo");
596
+ resolve(oDialog);
597
+ });
598
+ }).catch(reject);
599
+ });
600
+ }
601
+ };
602
+ return MassEditHelper;
603
+ }, false);
604
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbImFWYWxpZERhdGFUeXBlcyIsIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwicHJlcGFyZURhdGFGb3JEaWFsb2ciLCJvVGFibGUiLCJhRGF0YUFycmF5Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0N1cnJlbnRFbnRpdHlTZXROYW1lIiwiZGF0YSIsImFUYWJsZUZpZWxkcyIsImdldFRhYmxlRmllbGRzIiwib0VudGl0eVR5cGVDb250ZXh0IiwiZ2V0Q29udGV4dCIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0RhdGFGaWVsZE1vZGVsIiwiSlNPTk1vZGVsIiwib1Jlc3VsdCIsInNMYWJlbFRleHQiLCJiVmFsdWVIZWxwRW5hYmxlZCIsInNVbml0UHJvcGVydHlQYXRoIiwiYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwiYklzSW1tdXRhYmxlIiwiYklzQ29tcHV0ZWQiLCJiQ2hhcnRQcm9wZXJ0eSIsIm9UZXh0QmluZGluZyIsImJWYWxpZERhdGFUeXBlIiwiYkluVmFsaWRJbnB1dFR5cGUiLCJvQ29sdW1uSW5mbyIsImRhdGFQcm9wZXJ0eSIsIm9Qcm9wZXJ0eUluZm8iLCJsYWJlbCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsImdldFRleHRCaW5kaW5nIiwib0ZpZWxkQ29udGV4dCIsImFubm90YXRpb25QYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib1Byb3BlcnR5Q29udGV4dCIsIm9JbnRlcmZhY2UiLCJnZXRJbnRlcmZhY2UiLCJnZXRQcm9wZXJ0eSIsImJIaWRkZW5GaWVsZCIsImNvbnRleHQiLCJnZXRQYXRoIiwiVmFsdWUiLCIkdGFyZ2V0IiwiVGFyZ2V0IiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwidGVybSIsInR5cGUiLCJpbnB1dFR5cGUiLCJoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInVuZGVmaW5lZCIsInNldERhdGEiLCJnZXRJbnB1dFR5cGVGb3JDb2x1bW4iLCJvQ29sdW1uIiwiZ2V0VGVtcGxhdGUiLCJnZXRDb250ZW50IiwiZ2V0Q29udGVudEVkaXQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJtYXAiLCJzRGF0YVByb3BlcnR5IiwiZ2V0RGF0YVByb3BlcnR5IiwiYVJlYWx0ZWRDb2x1bW5JbmZvIiwiY3VzdG9tRGF0YSIsImdldEhlYWRlciIsImdldERlZmF1bHRUZXh0c0ZvckRpYWxvZyIsIm9SZXNvdXJjZUJ1bmRsZSIsImlTZWxlY3RlZENvbnRleHRzIiwiYkRpc3BsYXlNb2RlIiwiZ2V0VGV4dCIsInRvU3RyaW5nIiwiZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyIsInNJbnB1dFR5cGUiLCJzUmVzdWx0Iiwic2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nIiwib0RlZmF1bHRWYWx1ZXMiLCJiVU9NRmllbGQiLCJiUHJvcGVydHlSZXF1aXJlZCIsImlzRmllbGRSZXF1aXJlZCIsInNTdWZmaXhGb3JLZWVwRXhpc3RpbmciLCJiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGgiLCJ1bnNoaWZ0IiwidGV4dCIsImNsZWFyRmllbGRWYWx1ZSIsImtleSIsImxlYXZlQmxhbmtWYWx1ZSIsImtlZXBFeGlzdGluZ1ByZWZpeCIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzUHJvcGVydHkiLCJzQ3VycmVudEVudGl0eVNldCIsInNEaXNwbGF5TW9kZSIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwic0Rlc2NyaXB0aW9uUGF0aCIsInNEZXNjcmlwdGlvblZhbHVlIiwic0Z1bGxUZXh0IiwicGF0aCIsInBhcmFtZXRlcnMiLCJvUHJvcHMiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImFVbml0RGF0YSIsImFSZXN1bHRzIiwiYVJlYWRPbmx5RmllbGRJbmZvIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJzUHJvcGVydHlOYW1lIiwib0RhdGEiLCJvVGV4dEluZm8iLCJzUHJvcGVydHlLZXkiLCJpIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJ0ZXh0QmluZGluZyIsImVudGl0eVNldCIsImZ1bGxUZXh0IiwidW5pdFByb3BlcnR5Iiwic011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlIiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJ2YWx1ZSIsIm9wZXJhbmRzIiwib3BlcmFuZDEiLCJvcGVyYW5kMiIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5VmFsdWUiLCJvRGlhbG9nRGF0YU1vZGVsIiwiY3JlYXRlRGlhbG9nIiwib0NvbnRyb2xsZXIiLCJzRnJhZ21lbnROYW1lIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwidGhlbiIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsIm1hc3NFZGl0VGl0bGUiLCJjb250ZW50IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJhcHBseUJ1dHRvblRleHQiLCJwcmVzcyIsIm9FdmVudCIsImdldFNvdXJjZSIsImdldFBhcmVudCIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImtleVZhbHVlIiwicHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsImFsbCIsIm9SZXMiLCJvTGlzdEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwib0V4dGVuc2lvbkFQSSIsImdldEV4dGVuc2lvbkFQSSIsInJlZnJlc2giLCJjbG9zZSIsImRlc3Ryb3kiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZW5kQnV0dG9uIiwiY2FuY2VsQnV0dG9uVGV4dCIsInNldE1vZGVsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUF3QkEsTUFBTUEsZUFBZSxHQUFHLENBQ3ZC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T0F4Rk0sQ0FBUDtBQXlGQTtBQS9vQnFCLEdBQXZCO1NBa3BCZXhMLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCwgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRUZXh0QmluZGluZyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgZ2V0RWRpdGFibGVFeHByZXNzaW9uLCBnZXRSZXF1aXJlZEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuY29uc3QgYVZhbGlkRGF0YVR5cGVzID0gW1xuXHRcIkVkbS5Cb29sZWFuXCIsXG5cdFwiRWRtLkJ5dGVcIixcblx0XCJFZG0uRGVjaW1hbFwiLFxuXHRcIkVkbS5Eb3VibGVcIixcblx0XCJFZG0uRmxvYXRcIixcblx0XCJFZG0uR3VpZFwiLFxuXHRcIkVkbS5JbnQxNlwiLFxuXHRcIkVkbS5JbnQzMlwiLFxuXHRcIkVkbS5JbnQ2NFwiLFxuXHRcIkVkbS5TQnl0ZVwiLFxuXHRcIkVkbS5TaW5nbGVcIixcblx0XCJFZG0uU3RyaW5nXCJcbl07XG5jb25zdCBNYXNzRWRpdEhlbHBlciA9IHtcblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBhdCBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGggd2l0aCBhIGJsYW5rIGFycmF5LlxuXHQgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgcG9pbnRpbmcgdG8gdGhlIGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm5zIHtBcnJheX1cblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55KSB7XG5cdFx0bGV0IGFGaW5hbFBhdGg6IGFueTtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdGNvbnN0IGFQYXRocyA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgc0Z1bGxQYXRoID0gXCJcIjtcblx0XHRhUGF0aHMuZm9yRWFjaChmdW5jdGlvbihzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGlmIChzRnVsbFBhdGggIT09IHNQYXRoKSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdFx0XHRcdGFGaW5hbFBhdGggPSBhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhRmluYWxQYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHVuaXF1ZSB2YWx1ZXMgZm9yIGdpdmVuIGFycmF5IHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNWYWx1ZSBQcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggb2YgdGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgSW5zdGFuY2Ugb2YgdGhlIGFycmF5XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbihzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5pbmRleE9mKHNWYWx1ZSkgPT09IGluZGV4O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgbXVsdGktbGV2ZWwgcGF0aCAoZm9yIGV4YW1wbGU6IF9NYXRlcmlhbHMvTWF0ZXJpYWxfRGV0YWlscyBnZXRzIHRoZSB2YWx1ZSBvZiBNYXRlcmlhbF9EZXRhaWxzIHVuZGVyIF9NYXRlcmlhbHMgT2JqZWN0KS5cblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHlWYWx1ZSwgd2hpY2ggY2FuIGJlIG9mIGFueSB0eXBlIChzdHJpbmcsIG51bWJlciwgZXRjLi4pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZhbHVlcyBPYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Z2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aDogZnVuY3Rpb24oc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24oYUNvbnRleHRzOiBhbnlbXSwgc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFPYmplY3QgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xICYmIG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVswXSk7XG5cdFx0XHRcdGlmIChvQ29udGV4dCAmJiAob0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGgpIHx8IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbikpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlWYWx1ZXMucHVzaChvQ29udGV4dC5nZXRPYmplY3Qoc0RhdGFQcm9wZXJ0eVBhdGgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhVW5pcXVlUHJvcGVydHlWYWx1ZXMgPSBhUHJvcGVydHlWYWx1ZXMuZmlsdGVyKE1hc3NFZGl0SGVscGVyLmdldFVuaXF1ZVZhbHVlcyk7XG5cdFx0XHRpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0cmV0dXJuIFwiRGVmYXVsdC9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBcIkVtcHR5L1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlIFtib3RoIHN0YXRpYyBhbmQgcGF0aCBiYXNlZF0gZm9yIHRhYmxlJ3Mgc2VsZWN0ZWQgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0czogZnVuY3Rpb24oaGlkZGVuVmFsdWU6IGFueSwgYUNvbnRleHRzOiBhbnlbXSkge1xuXHRcdGlmIChoaWRkZW5WYWx1ZSAmJiBoaWRkZW5WYWx1ZS4kUGF0aCkge1xuXHRcdFx0cmV0dXJuICFhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIEpTT04gTW9kZWwgZm9yIHByb3BlcnRpZXMgb2YgZGlhbG9nIGZpZWxkcyBbbGFiZWwsIHZpc2libGl0eSwgZGF0YXByb3BlcnR5LCBldGMuXS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRwcmVwYXJlRGF0YUZvckRpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1RhYmxlICYmIChvVGFibGUuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLFxuXHRcdFx0c0N1cnJlbnRFbnRpdHlTZXROYW1lID0gb1RhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSxcblx0XHRcdGFUYWJsZUZpZWxkcyA9IE1hc3NFZGl0SGVscGVyLmdldFRhYmxlRmllbGRzKG9UYWJsZSksXG5cdFx0XHRvRW50aXR5VHlwZUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvQFwiKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBiSXNJbW11dGFibGU7XG5cdFx0bGV0IGJJc0NvbXB1dGVkO1xuXHRcdGxldCBiQ2hhcnRQcm9wZXJ0eTtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXHRcdGxldCBiVmFsaWREYXRhVHlwZTtcblx0XHRsZXQgYkluVmFsaWRJbnB1dFR5cGU7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbihvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5UGF0aCA9IG9Db2x1bW5JbmZvLmRhdGFQcm9wZXJ0eTtcblx0XHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCkge1xuXHRcdFx0XHRsZXQgb1Byb3BlcnR5SW5mbyA9IHNEYXRhUHJvcGVydHlQYXRoICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIik7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID1cblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0c1VuaXRQcm9wZXJ0eVBhdGggPVxuXHRcdFx0XHRcdChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLlVuaXRcIl0gJiYgb1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuVW5pdFwiXS4kUGF0aCkgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJlxuXHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mb1tcIkBPcmcuT0RhdGEuTWVhc3VyZXMuVjEuSVNPQ3VycmVuY3lcIl0gJiZcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm9bXCJAT3JnLk9EYXRhLk1lYXN1cmVzLlYxLklTT0N1cnJlbmN5XCJdLiRQYXRoKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9IG9Db2x1bW5JbmZvLmxhYmVsIHx8IChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCJdKTtcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWRGb3JVbml0ID1cblx0XHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc1VuaXRQcm9wZXJ0eVBhdGggKyBcIkBcIikgJiZcblx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoICsgXCJAXCIpW1xuXHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbihcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXHRcdFx0XHRiSXNJbW11dGFibGUgPVxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRQcm9wZXJ0eSgpICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKVtcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl07XG5cdFx0XHRcdGJJc0NvbXB1dGVkID1cblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ICYmIG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoKSAmJiBvUHJvcGVydHlDb250ZXh0LmdldFByb3BlcnR5KClbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl07XG5cdFx0XHRcdGNvbnN0IGJIaWRkZW5GaWVsZCA9XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyhcblx0XHRcdFx0XHRcdG9GaWVsZENvbnRleHQgJiYgb0ZpZWxkQ29udGV4dC5nZXRPYmplY3QoKVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl0sXG5cdFx0XHRcdFx0XHRhQ29udGV4dHNcblx0XHRcdFx0XHQpIHx8IGZhbHNlO1xuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL1wiICsgc0RhdGFQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHQob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0Ly8gRGF0YWZpZWxkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRmllbGRDb250cm9sIGNhbGN1bGF0aW9uLCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0XHRjb25zdCBpc1JlYWRPbmx5ID0gaXNSZWFkT25seUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJDaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGJWYWxpZERhdGFUeXBlID0gb1Byb3BlcnR5SW5mbyAmJiBhVmFsaWREYXRhVHlwZXMuaW5kZXhPZihvUHJvcGVydHlJbmZvLnR5cGUpICE9PSAtMTtcblx0XHRcdFx0YkluVmFsaWRJbnB1dFR5cGUgPVxuXHRcdFx0XHRcdChvQ29sdW1uSW5mbyAmJlxuXHRcdFx0XHRcdFx0b0NvbHVtbkluZm8uaW5wdXRUeXBlICYmXG5cdFx0XHRcdFx0XHQob0NvbHVtbkluZm8uaW5wdXRUeXBlID09PSBcInNhcC5tLlJhdGluZ0luZGljYXRvclwiIHx8IG9Db2x1bW5JbmZvLmlucHV0VHlwZSA9PT0gXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkgfHxcblx0XHRcdFx0XHRoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzRGF0YVByb3BlcnR5UGF0aCAmJlxuXHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHQhYklzSW1tdXRhYmxlICYmXG5cdFx0XHRcdFx0IWJJc0NvbXB1dGVkICYmXG5cdFx0XHRcdFx0IWJDaGFydFByb3BlcnR5ICYmXG5cdFx0XHRcdFx0YlZhbGlkRGF0YVR5cGUgJiZcblx0XHRcdFx0XHQhYkluVmFsaWRJbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5pbnB1dFR5cGUgJiZcblx0XHRcdFx0XHRnZXRFZGl0YWJsZUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpICE9PSBcImZhbHNlXCJcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b1Jlc3VsdCA9IHtcblx0XHRcdFx0XHRcdFwibGFiZWxcIjogc0xhYmVsVGV4dCArIFwiOlwiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmxlXCI6XG5cdFx0XHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoICYmXG5cdFx0XHRcdFx0XHRcdCFiSGlkZGVuRmllbGQgJiZcblx0XHRcdFx0XHRcdFx0IWJJc0ltbXV0YWJsZSAmJlxuXHRcdFx0XHRcdFx0XHQhYklzQ29tcHV0ZWQgJiZcblx0XHRcdFx0XHRcdFx0Z2V0RWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxPYmplY3RQYXRoKSxcblx0XHRcdFx0XHRcdFwiZGF0YVByb3BlcnR5XCI6IHNEYXRhUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRcIjogYlZhbHVlSGVscEVuYWJsZWQgPyBiVmFsdWVIZWxwRW5hYmxlZCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJ1bml0UHJvcGVydHlcIjogc1VuaXRQcm9wZXJ0eVBhdGggPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA/IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJwcm9wZXJ0eVBhdGhGb3JWYWx1ZUhlbHBcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNVbml0UHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XCJpc0ZpZWxkUmVxdWlyZWRcIjogZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIHRydWUpLFxuXHRcdFx0XHRcdFx0XCJkZWZhdWx0U2VsZWN0aW9uUGF0aFwiOiBzRGF0YVByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzRGF0YVByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblVuaXRQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdD8gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIHNVbml0UHJvcGVydHlQYXRoKVxuXHRcdFx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJlbnRpdHlTZXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0XCJ0ZXh0QmluZGluZ1wiOiBvVGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcIm51bGxhYmxlXCI6IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJpc1Byb3BlcnR5UmVhZE9ubHlcIjogaXNSZWFkT25seSAhPT0gdW5kZWZpbmVkID8gaXNSZWFkT25seSA6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhRGF0YUFycmF5LnB1c2gob1Jlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGF0YUZpZWxkTW9kZWwuc2V0RGF0YShhRGF0YUFycmF5KTtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZE1vZGVsO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZUZvckNvbHVtbjogZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9Db2x1bW4uZ2V0VGVtcGxhdGUoKS5nZXRDb250ZW50ICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpICYmXG5cdFx0XHRvQ29sdW1uLmdldFRlbXBsYXRlKCkuZ2V0Q29udGVudCgpLmdldENvbnRlbnRFZGl0ICYmXG5cdFx0XHRvQ29sdW1uXG5cdFx0XHRcdC5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdC5nZXRDb250ZW50KClcblx0XHRcdFx0LmdldENvbnRlbnRFZGl0KCkgJiZcblx0XHRcdG9Db2x1bW5cblx0XHRcdFx0LmdldFRlbXBsYXRlKClcblx0XHRcdFx0LmdldENvbnRlbnQoKVxuXHRcdFx0XHQuZ2V0Q29udGVudEVkaXQoKVswXSAmJlxuXHRcdFx0b0NvbHVtblxuXHRcdFx0XHQuZ2V0VGVtcGxhdGUoKVxuXHRcdFx0XHQuZ2V0Q29udGVudCgpXG5cdFx0XHRcdC5nZXRDb250ZW50RWRpdCgpWzBdXG5cdFx0XHRcdC5nZXRNZXRhZGF0YSgpXG5cdFx0XHRcdC5nZXROYW1lKClcblx0XHQpO1xuXHR9LFxuXG5cdGdldFRhYmxlRmllbGRzOiBmdW5jdGlvbihvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eSA9IG9Db2x1bW4gJiYgb0NvbHVtbi5nZXREYXRhUHJvcGVydHkoKSxcblx0XHRcdFx0YVJlYWx0ZWRDb2x1bW5JbmZvID1cblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikgJiZcblx0XHRcdFx0XHRvVGFibGUuZGF0YShcImNvbHVtbnNcIikuY3VzdG9tRGF0YS5maWx0ZXIoZnVuY3Rpb24ob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db2x1bW5JbmZvLm5hbWUgPT09IHNEYXRhUHJvcGVydHkgJiYgb0NvbHVtbkluZm8udHlwZSA9PT0gXCJBbm5vdGF0aW9uXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcImxhYmVsXCI6IG9Db2x1bW4uZ2V0SGVhZGVyKCksXG5cdFx0XHRcdFwiYW5ub3RhdGlvblBhdGhcIjogYVJlYWx0ZWRDb2x1bW5JbmZvICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXSAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFwiaW5wdXRUeXBlXCI6IE1hc3NFZGl0SGVscGVyLmdldElucHV0VHlwZUZvckNvbHVtbihvQ29sdW1uKVxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSxcblxuXHRnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2c6IGZ1bmN0aW9uKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHRcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHRcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHRcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHRcdFx0Y2FzZSBcInNhcC5tLkRhdGVQaWNrZXJcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic2FwLm0uQ2hlY2tCb3hcIjpcblx0XHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBzUmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uKGFWYWx1ZXM6IGFueVtdLCBhQ29udGV4dHM6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBvUHJvcGVydHlJbmZvOiBhbnksIGJVT01GaWVsZD86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdC8vVE9ETyAtIEFkZCA8PFVzZSBWYWx1ZSBIZWxwIG9yIGNvbnRyb2wgaW1wbG1lbnRhdGlvbj4+IGFuZCByZWxhdGVkIGtleSBieSBjaGVja2luZyBpZiB2YWx1ZSBoZWxwIGlzIGVuYWJsZWQgZm9yIHByb3BlcnR5IG9yIFVuaXQuXG5cdFx0Ly9UT0RPIC0gQWRkIG9wdGlvbiBBcHBseSB0byBFbXB0eSBGaWVsZHMgb25seSBmb3IgQm90aCBWYWx1ZSBIZWxwIGFuZCBjb250cm9scy5cblx0XHRjb25zdCBiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGggPSBhQ29udGV4dHMuc29tZShmdW5jdGlvbihvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChzUHJvcGVydHlQYXRoKTtcblx0XHR9KTtcblx0XHRpZiAoYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRpZiAoYlByb3BlcnR5UmVxdWlyZWQgIT09IFwidHJ1ZVwiICYmICFiVU9NRmllbGQpIHtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IFwiQ2xlYXJGaWVsZFZhbHVlL1wiICsgc1Byb3BlcnR5UGF0aCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBzUHJvcGVydHlQYXRoIH0pO1xuXHRcdH1cblx0XHRhVmFsdWVzLnVuc2hpZnQoe1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fSk7XG5cdH0sXG5cblx0Z2V0VGV4dEFycmFuZ2VtZW50SW5mbzogZnVuY3Rpb24oXG5cdFx0c1Byb3BlcnR5OiBhbnksXG5cdFx0b1RleHRCaW5kaW5nOiBhbnksXG5cdFx0c0N1cnJlbnRFbnRpdHlTZXQ6IGFueSxcblx0XHRvU2VsZWN0ZWRDb250ZXh0OiBhbnlcblx0KTogVGV4dEFycmFuZ2VtZW50SW5mbyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9TZWxlY3RlZENvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRGlzcGxheU1vZGUgPSBDb21tb25VdGlscy5jb21wdXRlRGlzcGxheU1vZGUob01ldGFNb2RlbC5nZXRPYmplY3Qoc0N1cnJlbnRFbnRpdHlTZXQgKyBcIi9cIiArIHNQcm9wZXJ0eSArIFwiQFwiKSk7XG5cdFx0bGV0IHNEZXNjcmlwdGlvblBhdGgsIHNWYWx1ZSwgc0Rlc2NyaXB0aW9uVmFsdWUsIHNGdWxsVGV4dDtcblx0XHRpZiAob1RleHRCaW5kaW5nICYmIChvVGV4dEJpbmRpbmcucGF0aCB8fCAob1RleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgb1RleHRCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoKSkgJiYgc1Byb3BlcnR5KSB7XG5cdFx0XHRpZiAob1RleHRCaW5kaW5nLnBhdGgpIHtcblx0XHRcdFx0aWYgKHNEaXNwbGF5TW9kZSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0c1ZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5KTtcblx0XHRcdFx0XHRzRGVzY3JpcHRpb25WYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9UZXh0QmluZGluZy5wYXRoKTtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVcIikge1xuXHRcdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c0Z1bGxUZXh0ID0gc1ZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG9UZXh0QmluZGluZy5wYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24ob1Byb3BzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob1Byb3BzLnBhdGggJiYgb1Byb3BzLnBhdGggIT09IHNQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0c0Rlc2NyaXB0aW9uUGF0aCA9IG9Qcm9wcy5wYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNWYWx1ZSA9IG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHNQcm9wZXJ0eSk7XG5cdFx0XHRcdHNEZXNjcmlwdGlvblZhbHVlID0gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc0Rlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdGlmIChzRGlzcGxheU1vZGUgPT09IFwiVmFsdWVEZXNjcmlwdGlvblwiICYmIHNWYWx1ZSAmJiBzRGVzY3JpcHRpb25WYWx1ZSkge1xuXHRcdFx0XHRcdHNGdWxsVGV4dCA9IHNWYWx1ZSArIFwiIChcIiArIHNEZXNjcmlwdGlvblZhbHVlICsgXCIpXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Rpc3BsYXlNb2RlID09PSBcIkRlc2NyaXB0aW9uVmFsdWVcIiAmJiBzRGVzY3JpcHRpb25WYWx1ZSAmJiBzVmFsdWUpIHtcblx0XHRcdFx0XHRzRnVsbFRleHQgPSBzRGVzY3JpcHRpb25WYWx1ZSArIFwiIChcIiArIHNWYWx1ZSArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcInRleHRBcnJhbmdlbWVudFwiOiBzRGlzcGxheU1vZGUsXG5cdFx0XHRcdFwidmFsdWVQYXRoXCI6IHNQcm9wZXJ0eSxcblx0XHRcdFx0XCJkZXNjcmlwdGlvblBhdGhcIjogc0Rlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XCJ2YWx1ZVwiOiBzVmFsdWUsXG5cdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogc0Rlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcdFwiZnVsbFRleHRcIjogc0Z1bGxUZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIHJ1bnRpbWUgbW9kZWw6XG5cdCAqID0+IFRoZSBtb2RlbCBjb25zaXN0cyBvZiB2YWx1ZXMgc2hvd24gaW4gdGhlIGNvbWJvQm94IG9mIHRoZSBkaWFsb2cgKExlYXZlIEJsYW5rLCBLZWVwIEV4aXN0aW5nIFZhbHVlcywgb3IgYW55IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgY29udGV4dCwgZXRjLilcblx0ICogPT4gVGhlIG1vZGVsIHdpbGwgY2FwdHVyZSBydW50aW1lIGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgcHJvcGVydHkgKHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBjb21ib0JveCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0c2V0UnVudGltZU1vZGVsT25EaWFsb2c6IGZ1bmN0aW9uKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRsZXQgc1Byb3BlcnR5TmFtZTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24ob0RhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9EYXRhLmRhdGFQcm9wZXJ0eS5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoVmFsdWUgPSBhQ29udGV4dHNbaV0uZ2V0T2JqZWN0KG9EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gb0RhdGEuZGF0YVByb3BlcnR5ICsgXCIvXCIgKyBzTXVsdGlMZXZlbFBhdGhWYWx1ZTtcblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gJiYgYUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0pIHtcblx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmVudGl0eVNldCxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzW2ldXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgc011bHRpTGV2ZWxQYXRoVmFsdWUsXG5cdFx0XHRcdFx0XHRcdFwia2V5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gYUNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvRGF0YS5kYXRhUHJvcGVydHkgKyBcIi9cIiArIG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0aWYgKG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvRGF0YS50ZXh0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHNbaV1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1Byb3BlcnR5TmFtZSA9IG9EYXRhLnVuaXRQcm9wZXJ0eSArIFwiL1wiICsgb0RhdGFPYmplY3Rbb0RhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5TmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEudGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0c1tpXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogb0RhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YURhdGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uKG9EYXRhOiBhbnkpIHtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPiAtMSkge1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUgPSBNYXNzRWRpdEhlbHBlci5nZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoKG9EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyk7XG5cdFx0XHRcdGlmICghc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlKSB7XG5cdFx0XHRcdFx0c011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLCBhQ29udGV4dHMsIG9EZWZhdWx0VmFsdWVzLCBvRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmIGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSwgYUNvbnRleHRzLCBvRGVmYXVsdFZhbHVlcywgb0RhdGEpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhLCB0cnVlKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChvRGF0YS5kYXRhUHJvcGVydHkgJiYgYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0ubGVuZ3RoKSB8fFxuXHRcdFx0XHQob0RhdGEudW5pdFByb3BlcnR5ICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5sZW5ndGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0RhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBvRGF0YS5kYXRhUHJvcGVydHkgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24ob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvRGF0YS51bml0UHJvcGVydHkgJiYgIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnB1c2goe1xuXHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0a2V5OiBcIkVtcHR5L1wiICsgb0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiYgdHlwZW9mIG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSwgdmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSwgdHlwZTogXCJEZWZhdWx0XCIgfSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQyXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUmVhZE9ubHlFeHByZXNzaW9uIGNoYW5nZVxuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7XG5cdFx0XHRcdFx0XCJwcm9wZXJ0eVwiOiBvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDIudmFsdWUsXG5cdFx0XHRcdFx0dHlwZTogXCJQYXRoXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb0RhdGEgPSB7IFwidmFsdWVzXCI6IGFWYWx1ZXMsIFwidW5pdERhdGFcIjogYVVuaXREYXRhLCBcInJlc3VsdHNcIjogYVJlc3VsdHMsIFwicmVhZGFibGVQcm9wZXJ0eURhdGFcIjogYVJlYWRPbmx5RmllbGRJbmZvIH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sbGVyIENvbnRyb2xsZXIgZm9yIHRoZSB2aWV3XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGNyZWF0ZURpYWxvZzogZnVuY3Rpb24ob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nKGFDb250ZXh0cywgYURhdGFBcnJheSwgb0RlZmF1bHRWYWx1ZXMpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQgfSkudGhlbihmdW5jdGlvbihvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBvRGVmYXVsdFZhbHVlcy5tYXNzRWRpdFRpdGxlLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZVByb21pc2U6IGFueVtdID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24ob1NlbGVjdGVkQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24ob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbihvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgPT09IG9Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5SW5mby50eXBlID09PSBcIkRlZmF1bHRcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm8udmFsdWUgPT09IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJQYXRoXCIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlICYmIG9SZXN1bHQudmFsdWUgIT09IFwiRGVmYXVsdFwiICYmICFiUmVhZE9ubHlGaWVsZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlUHJvbWlzZS5wdXNoKG9TZWxlY3RlZENvbnRleHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChjaGFuZ2VQcm9taXNlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvUmVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXh0ZW5zaW9uQVBJID0gb0NvbnRyb2xsZXIgJiYgKG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9FeHRlbnNpb25BUEkucmVmcmVzaChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1Jlcztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIGVycm9yIGhhbmRsaW5nIHBhcnQgZm9yIHRoZSBEaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob0RpYWxvZ0RhdGFNb2RlbCwgXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvRGlhbG9nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19