@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
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/macros/field/FieldRuntime", "sap/base/Log"], function (ControllerExtension, ControllerExtensionMetadata, ClassSupport, CommonUtils, FieldRuntime, Log) {
5
+ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "../helpers/ClassSupport", "sap/fe/macros/field/FieldRuntime", "sap/base/Log", "../CommonUtils"], function (ControllerExtension, ControllerExtensionMetadata, ClassSupport, FieldRuntime, Log, CommonUtils) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _class, _class2;
@@ -13,698 +13,657 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
13
13
  var Override = ClassSupport.Override;
14
14
  var UI5Class = ClassSupport.UI5Class;
15
15
 
16
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
17
-
18
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
19
-
20
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
21
-
22
16
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
23
17
 
24
18
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
19
 
26
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
27
-
28
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
29
-
30
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
31
-
32
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
33
-
34
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
35
-
36
20
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
37
21
 
38
22
  var SideEffectsControllerExtension = (_dec = UI5Class("sap.fe.core.controllerextensions.SideEffects", ControllerExtensionMetadata), _dec2 = Override(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
39
23
  _inherits(SideEffectsControllerExtension, _ControllerExtension);
40
24
 
41
- var _super = _createSuper(SideEffectsControllerExtension);
42
-
43
25
  function SideEffectsControllerExtension() {
44
- _classCallCheck(this, SideEffectsControllerExtension);
45
-
46
- return _super.apply(this, arguments);
26
+ return _ControllerExtension.apply(this, arguments) || this;
47
27
  }
48
28
 
49
- _createClass(SideEffectsControllerExtension, [{
50
- key: "onInit",
51
- value: function onInit() {
52
- this._oView = this.base.getView();
53
- this._oAppComponent = CommonUtils.getAppComponent(this._oView);
54
- this._oSideEffectsService = this._oAppComponent.getSideEffectsService();
55
- this._mFieldGroupQueue = {};
56
- this._aSourcePropertiesFailure = new Set();
57
- this._mFailedSideEffects = {};
58
- }
59
- /**
60
- * Clear recorded validation status for all properties.
61
- *
62
- * @function
63
- * @name clearPropertiesStatus
64
- */
65
-
66
- }, {
67
- key: "clearPropertiesStatus",
68
- value: function clearPropertiesStatus() {
69
- this._aSourcePropertiesFailure.clear();
70
- }
71
- /**
72
- * Gets failed SideEffects.
73
- *
74
- * @function
75
- * @name getRegisteredFailedRequests
76
- * @returns {object} Registered SideEffects requests that have failed
77
- */
78
-
79
- }, {
80
- key: "getRegisteredFailedRequests",
81
- value: function getRegisteredFailedRequests() {
82
- return this._mFailedSideEffects;
83
- }
84
- /**
85
- * Manages the workflow for SideEffects with related changes to a field
86
- * The following scenarios are managed:
87
- * - Execute: triggers immediate SideEffects requests if the promise for the field event is fulfilled
88
- * - Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
89
- *
90
- * @function
91
- * @name handleFieldChange
92
- * @param {object} oEvent SAPUI5 event that comes from a field change
93
- * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
94
- * @returns {object} Promise on SideEffects request(s)
95
- */
96
-
97
- }, {
98
- key: "handleFieldChange",
99
- value: function handleFieldChange(oEvent, oFieldGroupPreRequisite) {
100
- var _this = this;
101
-
102
- var mEventFieldProperties = this._getFieldProperties(oEvent),
103
- aImmediateSideEffectsProperties = this._initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite);
104
-
105
- var bIsImmediateTriggered = false;
106
- return this._generateImmediatePromise(mEventFieldProperties).then(function () {
107
- bIsImmediateTriggered = true;
108
- return Promise.all(aImmediateSideEffectsProperties.map(function (mSideEffectsProperty) {
109
- return _this.requestSideEffects(mSideEffectsProperty.sideEffects, mSideEffectsProperty.context);
110
- }) || []);
111
- }).catch(function (oError) {
112
- if (bIsImmediateTriggered) {
113
- Log.debug("Error while processing Field SideEffects", oError);
114
- } else {
115
- /**
116
- * SideEffects have not been triggered since preRequisite validation fails so we need
117
- * to keep previously failed request as Failed request (to be retrigger on next change)
118
- */
119
- aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
120
- return mImmediateSideEffects.previouslyFailed === true;
121
- }).forEach(function (mImmediateSideEffects) {
122
- return _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
123
- });
124
- }
125
- });
126
- }
127
- /**
128
- * Manages SideEffects with a related 'focus out' to a field group.
129
- *
130
- * @function
131
- * @name handleFieldGroupChange
132
- * @param {object} oEvent SAPUI5 Event
133
- * @returns {object} Promise on SideEffects request(s)
134
- */
135
-
136
- }, {
137
- key: "handleFieldGroupChange",
138
- value: function handleFieldGroupChange(oEvent) {
139
- // eslint-disable-next-line @typescript-eslint/no-this-alias
140
- var that = this,
141
- aDeferredSideEffects = [],
142
- aFieldGroupIds = oEvent.getParameter("fieldGroupIds");
143
-
144
- var getFieldGroupRequestPromise = function (oDeferredSideEffect) {
145
- var bIsRequestsTriggered = false;
146
- var oSideEffectProperty = oDeferredSideEffect.sideEffectProperty;
147
- var oContext = oSideEffectProperty.context;
148
- var sContextPath = oContext.getPath();
149
-
150
- var sEntityType = that._oSideEffectsService.getEntityTypeFromContext(oContext);
151
-
152
- var mEntityType = that._getEntityTypeFromFQN(sEntityType);
153
-
154
- return Promise.all(oDeferredSideEffect.promises).then(function () {
155
- bIsRequestsTriggered = true; //Deferred SideEffects are executed only if all sourceProperties have no registered failure.
156
-
157
- if (mEntityType && oSideEffectProperty.sideEffects.SourceProperties.every(function (sourceProperty) {
158
- if (sourceProperty.type === "PropertyPath") {
159
- var sId = that._generateStatusIndex(mEntityType, sourceProperty.value, oContext);
160
-
161
- if (sId) {
162
- return !that._aSourcePropertiesFailure.has(sId);
163
- }
164
- }
165
-
166
- return true;
167
- })) {
168
- return that.requestSideEffects(oSideEffectProperty.sideEffects, oSideEffectProperty.context);
169
- }
170
-
171
- return null;
172
- }).catch(function (oError) {
173
- if (bIsRequestsTriggered) {
174
- Log.debug("Error while processing FieldGroup SideEffects on context " + sContextPath, oError);
175
- }
176
- }).finally(function () {
177
- delete that._mFieldGroupQueue[oSideEffectProperty.name][sContextPath];
178
- });
179
- };
180
-
181
- aFieldGroupIds.forEach(function (sFieldGroupId) {
182
- var _that$_mFieldGroupQue;
29
+ var _proto = SideEffectsControllerExtension.prototype;
183
30
 
31
+ _proto.onInit = function onInit() {
32
+ this._oView = this.base.getView();
33
+ this._oAppComponent = CommonUtils.getAppComponent(this._oView);
34
+ this._oSideEffectsService = this._oAppComponent.getSideEffectsService();
35
+ this._mFieldGroupQueue = {};
36
+ this._aSourcePropertiesFailure = new Set();
37
+ this._mFailedSideEffects = {};
38
+ }
39
+ /**
40
+ * Clear recorded validation status for all properties.
41
+ *
42
+ * @function
43
+ * @name clearPropertiesStatus
44
+ */
45
+ ;
46
+
47
+ _proto.clearPropertiesStatus = function clearPropertiesStatus() {
48
+ this._aSourcePropertiesFailure.clear();
49
+ }
50
+ /**
51
+ * Gets failed SideEffects.
52
+ *
53
+ * @function
54
+ * @name getRegisteredFailedRequests
55
+ * @returns {object} Registered SideEffects requests that have failed
56
+ */
57
+ ;
58
+
59
+ _proto.getRegisteredFailedRequests = function getRegisteredFailedRequests() {
60
+ return this._mFailedSideEffects;
61
+ }
62
+ /**
63
+ * Manages the workflow for SideEffects with related changes to a field
64
+ * The following scenarios are managed:
65
+ * - Execute: triggers immediate SideEffects requests if the promise for the field event is fulfilled
66
+ * - Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
67
+ *
68
+ * @function
69
+ * @name handleFieldChange
70
+ * @param {object} oEvent SAPUI5 event that comes from a field change
71
+ * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
72
+ * @returns {object} Promise on SideEffects request(s)
73
+ */
74
+ ;
75
+
76
+ _proto.handleFieldChange = function handleFieldChange(oEvent, oFieldGroupPreRequisite) {
77
+ var _this = this;
78
+
79
+ var mEventFieldProperties = this._getFieldProperties(oEvent),
80
+ aImmediateSideEffectsProperties = this._initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite);
81
+
82
+ var bIsImmediateTriggered = false;
83
+ return this._generateImmediatePromise(mEventFieldProperties).then(function () {
84
+ bIsImmediateTriggered = true;
85
+ return Promise.all(aImmediateSideEffectsProperties.map(function (mSideEffectsProperty) {
86
+ return _this.requestSideEffects(mSideEffectsProperty.sideEffects, mSideEffectsProperty.context);
87
+ }) || []);
88
+ }).catch(function (oError) {
89
+ if (bIsImmediateTriggered) {
90
+ Log.debug("Error while processing Field SideEffects", oError);
91
+ } else {
184
92
  /**
185
- * string "$$ImmediateRequest" is added to the SideEffects name during templating to know
186
- * if this SideEffects must be immediately executed requested (on field change) or must
187
- * be deferred (on field group focus out)
188
- *
93
+ * SideEffects have not been triggered since preRequisite validation fails so we need
94
+ * to keep previously failed request as Failed request (to be retrigger on next change)
189
95
  */
190
- var sSideEffectName = sFieldGroupId.replace("$$ImmediateRequest", "");
191
- var mContextDeferredSideEffects = (_that$_mFieldGroupQue = that._mFieldGroupQueue) === null || _that$_mFieldGroupQue === void 0 ? void 0 : _that$_mFieldGroupQue[sSideEffectName];
192
-
193
- if (mContextDeferredSideEffects) {
194
- Object.keys(mContextDeferredSideEffects).forEach(function (sContextPath) {
195
- var oDeferredSideEffect = mContextDeferredSideEffects[sContextPath];
96
+ aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
97
+ return mImmediateSideEffects.previouslyFailed === true;
98
+ }).forEach(function (mImmediateSideEffects) {
99
+ return _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
100
+ });
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Manages SideEffects with a related 'focus out' to a field group.
106
+ *
107
+ * @function
108
+ * @name handleFieldGroupChange
109
+ * @param {object} oEvent SAPUI5 Event
110
+ * @returns {object} Promise on SideEffects request(s)
111
+ */
112
+ ;
113
+
114
+ _proto.handleFieldGroupChange = function handleFieldGroupChange(oEvent) {
115
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
116
+ var that = this,
117
+ aDeferredSideEffects = [],
118
+ aFieldGroupIds = oEvent.getParameter("fieldGroupIds");
119
+
120
+ var getFieldGroupRequestPromise = function (oDeferredSideEffect) {
121
+ var bIsRequestsTriggered = false;
122
+ var oSideEffectProperty = oDeferredSideEffect.sideEffectProperty;
123
+ var oContext = oSideEffectProperty.context;
124
+ var sContextPath = oContext.getPath();
196
125
 
197
- if (!oDeferredSideEffect.processStarted) {
198
- oDeferredSideEffect.processStarted = true;
199
- aDeferredSideEffects.push(oDeferredSideEffect);
200
- }
201
- });
202
- }
203
- });
204
- return Promise.all(aDeferredSideEffects.map(function (oDeferredSideEffect) {
205
- return getFieldGroupRequestPromise(oDeferredSideEffect);
206
- }));
207
- }
208
- /**
209
- * Adds a SideEffects control.
210
- *
211
- * @function
212
- * @name addControlSideEffects
213
- * @param {string} sEntityType Name of the entity where the SideEffects control will be registered
214
- * @param {object} oSideEffects SideEffects to register. Ensure the sourceControlId matches the associated SAPUI5 control ID.
215
- *
216
- */
217
-
218
- }, {
219
- key: "addControlSideEffects",
220
- value: function addControlSideEffects(sEntityType, oSideEffects) {
221
- this._oSideEffectsService.addControlSideEffects(sEntityType, oSideEffects);
222
- }
223
- /**
224
- * Removes the queue containing the failed SideEffects.
225
- *
226
- * @function
227
- * @name removeFailedSideEffects
228
- */
229
-
230
- }, {
231
- key: "removeFailedSideEffects",
232
- value: function removeFailedSideEffects() {
233
- this._mFailedSideEffects = {};
234
- }
235
- /**
236
- * Request SideEffects on a specific context.
237
- *
238
- * @function
239
- * @name requestSideEffects
240
- * @param {object} oSideEffects SideEffects to be executed
241
- * @param {object} oContext Context where SideEffects need to be executed
242
- * @returns {object} SideEffects request on SAPUI5 context
243
- */
244
-
245
- }, {
246
- key: "requestSideEffects",
247
- value: function requestSideEffects(oSideEffects, oContext) {
248
- var _this2 = this;
249
-
250
- var fResolver, fRejector;
251
- var oPromise = new Promise(function (resolve, reject) {
252
- fResolver = resolve;
253
- fRejector = reject;
254
- });
255
- var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
256
- sTriggerAction = oSideEffects.TriggerAction;
126
+ var sEntityType = that._oSideEffectsService.getEntityTypeFromContext(oContext);
257
127
 
258
- if (sTriggerAction) {
259
- this._oSideEffectsService.executeAction(sTriggerAction, oContext);
260
- }
128
+ var mEntityType = that._getEntityTypeFromFQN(sEntityType);
261
129
 
262
- this._oSideEffectsService.requestSideEffects(aTargets, oContext).then(function () {
263
- return fResolver();
264
- }).catch(function (oError) {
265
- _this2._addFailedSideEffects(oSideEffects, oContext);
130
+ return Promise.all(oDeferredSideEffect.promises).then(function () {
131
+ bIsRequestsTriggered = true; //Deferred SideEffects are executed only if all sourceProperties have no registered failure.
266
132
 
267
- fRejector(oError);
268
- });
133
+ if (mEntityType && oSideEffectProperty.sideEffects.SourceProperties.every(function (sourceProperty) {
134
+ if (sourceProperty.type === "PropertyPath") {
135
+ var sId = that._generateStatusIndex(mEntityType, sourceProperty.value, oContext);
269
136
 
270
- return oPromise;
271
- }
272
- /**
273
- * Removes SideEffects created by a control.
274
- *
275
- * @function
276
- * @name removeControlSideEffects
277
- * @param {object} oControl SAPUI5 Control
278
- */
279
-
280
- }, {
281
- key: "removeControlSideEffects",
282
- value: function removeControlSideEffects(oControl) {
283
- var sControlId = oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject") && oControl.getId();
284
-
285
- if (sControlId) {
286
- this._oSideEffectsService.removeControlSideEffects(sControlId);
287
- }
288
- }
289
- /**
290
- * Adds SideEffects to the queue of the failed SideEffects
291
- * The SideEffects will be retriggered on the next change on the same context.
292
- *
293
- * @function
294
- * @name _addFailedSideEffects
295
- * @param {object} oSideEffects SideEffects that need to be retriggered
296
- * @param {object} oContext Context where SideEffects have failed
297
- */
298
-
299
- }, {
300
- key: "_addFailedSideEffects",
301
- value: function _addFailedSideEffects(oSideEffects, oContext) {
302
- var sContextPath = oContext.getPath();
303
- this._mFailedSideEffects[sContextPath] = this._mFailedSideEffects[sContextPath] || [];
137
+ if (sId) {
138
+ return !that._aSourcePropertiesFailure.has(sId);
139
+ }
140
+ }
304
141
 
305
- var bIsNotAlreadyListed = this._mFailedSideEffects[sContextPath].every(function (mFailedSideEffects) {
306
- return oSideEffects.fullyQualifiedName !== mFailedSideEffects.fullyQualifiedName;
307
- });
142
+ return true;
143
+ })) {
144
+ return that.requestSideEffects(oSideEffectProperty.sideEffects, oSideEffectProperty.context);
145
+ }
308
146
 
309
- if (bIsNotAlreadyListed) {
310
- this._mFailedSideEffects[sContextPath].push(oSideEffects);
311
- }
312
- }
313
- /**
314
- * Generates the promise for the field group that is required before requesting SideEffects.
315
- * If the promise is rejected and only the field requires the SideEffects on this context, the SideEffects are removed from the
316
- * SideEffects queue.
317
- *
318
- * @function
319
- * @name _generateFieldGroupPromise
320
- * @param {object} mEventFieldProperties Field properties
321
- * @returns {object} Promise to be used for the validation of the field
322
- */
323
-
324
- }, {
325
- key: "_generateFieldGroupPromise",
326
- value: function _generateFieldGroupPromise(mEventFieldProperties) {
327
- // eslint-disable-next-line @typescript-eslint/no-this-alias
328
- var that = this;
329
- var bPromiseSuccess = true;
330
- return mEventFieldProperties.promise.then(function () {
331
- return bPromiseSuccess;
332
- }).catch(function () {
333
- bPromiseSuccess = false;
334
- return bPromiseSuccess;
147
+ return null;
148
+ }).catch(function (oError) {
149
+ if (bIsRequestsTriggered) {
150
+ Log.debug("Error while processing FieldGroup SideEffects on context " + sContextPath, oError);
151
+ }
335
152
  }).finally(function () {
336
- /**
337
- * Need to store the status of properties related to this field for deferred SideEffects
338
- * since all SourceProperties for this kind of SideEffects must be valid
339
- */
340
- that._saveFieldPropertiesStatus(mEventFieldProperties.field, bPromiseSuccess);
153
+ delete that._mFieldGroupQueue[oSideEffectProperty.name][sContextPath];
341
154
  });
155
+ };
156
+
157
+ aFieldGroupIds.forEach(function (sFieldGroupId) {
158
+ var _that$_mFieldGroupQue;
159
+
160
+ /**
161
+ * string "$$ImmediateRequest" is added to the SideEffects name during templating to know
162
+ * if this SideEffects must be immediately executed requested (on field change) or must
163
+ * be deferred (on field group focus out)
164
+ *
165
+ */
166
+ var sSideEffectName = sFieldGroupId.replace("$$ImmediateRequest", "");
167
+ var mContextDeferredSideEffects = (_that$_mFieldGroupQue = that._mFieldGroupQueue) === null || _that$_mFieldGroupQue === void 0 ? void 0 : _that$_mFieldGroupQue[sSideEffectName];
168
+
169
+ if (mContextDeferredSideEffects) {
170
+ Object.keys(mContextDeferredSideEffects).forEach(function (sContextPath) {
171
+ var oDeferredSideEffect = mContextDeferredSideEffects[sContextPath];
172
+
173
+ if (!oDeferredSideEffect.processStarted) {
174
+ oDeferredSideEffect.processStarted = true;
175
+ aDeferredSideEffects.push(oDeferredSideEffect);
176
+ }
177
+ });
178
+ }
179
+ });
180
+ return Promise.all(aDeferredSideEffects.map(function (oDeferredSideEffect) {
181
+ return getFieldGroupRequestPromise(oDeferredSideEffect);
182
+ }));
183
+ }
184
+ /**
185
+ * Adds a SideEffects control.
186
+ *
187
+ * @function
188
+ * @name addControlSideEffects
189
+ * @param {string} sEntityType Name of the entity where the SideEffects control will be registered
190
+ * @param {object} oSideEffects SideEffects to register. Ensure the sourceControlId matches the associated SAPUI5 control ID.
191
+ *
192
+ */
193
+ ;
194
+
195
+ _proto.addControlSideEffects = function addControlSideEffects(sEntityType, oSideEffects) {
196
+ this._oSideEffectsService.addControlSideEffects(sEntityType, oSideEffects);
197
+ }
198
+ /**
199
+ * Removes the queue containing the failed SideEffects.
200
+ *
201
+ * @function
202
+ * @name removeFailedSideEffects
203
+ */
204
+ ;
205
+
206
+ _proto.removeFailedSideEffects = function removeFailedSideEffects() {
207
+ this._mFailedSideEffects = {};
208
+ }
209
+ /**
210
+ * Request SideEffects on a specific context.
211
+ *
212
+ * @function
213
+ * @name requestSideEffects
214
+ * @param {object} oSideEffects SideEffects to be executed
215
+ * @param {object} oContext Context where SideEffects need to be executed
216
+ * @returns {object} SideEffects request on SAPUI5 context
217
+ */
218
+ ;
219
+
220
+ _proto.requestSideEffects = function requestSideEffects(oSideEffects, oContext) {
221
+ var _this2 = this;
222
+
223
+ var fResolver, fRejector;
224
+ var oPromise = new Promise(function (resolve, reject) {
225
+ fResolver = resolve;
226
+ fRejector = reject;
227
+ });
228
+ var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
229
+ sTriggerAction = oSideEffects.TriggerAction;
230
+
231
+ if (sTriggerAction) {
232
+ this._oSideEffectsService.executeAction(sTriggerAction, oContext);
342
233
  }
343
- /**
344
- * Generates the promise for the field that is required before requesting immediate SideEffects.
345
- *
346
- * @function
347
- * @name _generateImmediatePromise
348
- * @param {object} mEventFieldProperties Field properties
349
- * @returns {object} Promise to be used for the validation of the field
350
- */
351
-
352
- }, {
353
- key: "_generateImmediatePromise",
354
- value: function _generateImmediatePromise(mEventFieldProperties) {
355
- var oPromise = mEventFieldProperties.promise;
356
- return oPromise.then(function () {
357
- /**
358
- * If the field gets a FieldHelper, we need to wait until all fields changed by this FieldHelper have been set.
359
- * To achieve this, we ensure that all related bindings have been resolved.
360
- *
361
- * This resolution process is not managed by the Field Event Promise, so for fast user actions (like automation) it can lock the model
362
- * and no request can be executed.
363
- */
364
- var oField = mEventFieldProperties.field;
365
- var sFieldHelperId = oField.getFieldHelp && oField.getFieldHelp();
366
234
 
367
- if (sFieldHelperId) {
368
- var oFilterHelp = sap.ui.getCore().byId(sFieldHelperId);
235
+ this._oSideEffectsService.requestSideEffects(aTargets, oContext).then(function () {
236
+ return fResolver();
237
+ }).catch(function (oError) {
238
+ _this2._addFailedSideEffects(oSideEffects, oContext);
369
239
 
370
- if (oFilterHelp) {
371
- return Promise.all(oFilterHelp.getOutParameters().map(function (oOutParameter) {
372
- var oBinding = oOutParameter.getBinding("value");
373
- return oBinding ? oBinding.requestValue() : Promise.resolve();
374
- }));
375
- }
376
- }
240
+ fRejector(oError);
241
+ });
377
242
 
378
- return Promise.all([]);
379
- });
243
+ return oPromise;
244
+ }
245
+ /**
246
+ * Removes SideEffects created by a control.
247
+ *
248
+ * @function
249
+ * @name removeControlSideEffects
250
+ * @param {object} oControl SAPUI5 Control
251
+ */
252
+ ;
253
+
254
+ _proto.removeControlSideEffects = function removeControlSideEffects(oControl) {
255
+ var sControlId = oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject") && oControl.getId();
256
+
257
+ if (sControlId) {
258
+ this._oSideEffectsService.removeControlSideEffects(sControlId);
380
259
  }
381
- /**
382
- * Generates a status index.
383
- *
384
- * @function
385
- * @name _generateStatusIndex
386
- * @param {object} mEntityType The entity type
387
- * @param {string} sPropertyPath The property path
388
- * @param {object} oContext SAPUI5 Context
389
- * @returns {string | undefined} Index
390
- */
391
-
392
- }, {
393
- key: "_generateStatusIndex",
394
- value: function _generateStatusIndex(mEntityType, sPropertyPath, oContext) {
395
- var sContextPath = oContext.getPath();
396
- var mProperty = mEntityType.resolvePath(sPropertyPath);
397
-
398
- if (mProperty) {
399
- if (mProperty && mProperty._type === "Property") {
400
- return [mProperty.fullyQualifiedName, sContextPath].join("__");
260
+ }
261
+ /**
262
+ * Adds SideEffects to the queue of the failed SideEffects
263
+ * The SideEffects will be retriggered on the next change on the same context.
264
+ *
265
+ * @function
266
+ * @name _addFailedSideEffects
267
+ * @param {object} oSideEffects SideEffects that need to be retriggered
268
+ * @param {object} oContext Context where SideEffects have failed
269
+ */
270
+ ;
271
+
272
+ _proto._addFailedSideEffects = function _addFailedSideEffects(oSideEffects, oContext) {
273
+ var sContextPath = oContext.getPath();
274
+ this._mFailedSideEffects[sContextPath] = this._mFailedSideEffects[sContextPath] || [];
275
+
276
+ var bIsNotAlreadyListed = this._mFailedSideEffects[sContextPath].every(function (mFailedSideEffects) {
277
+ return oSideEffects.fullyQualifiedName !== mFailedSideEffects.fullyQualifiedName;
278
+ });
279
+
280
+ if (bIsNotAlreadyListed) {
281
+ this._mFailedSideEffects[sContextPath].push(oSideEffects);
282
+ }
283
+ }
284
+ /**
285
+ * Generates the promise for the field group that is required before requesting SideEffects.
286
+ * If the promise is rejected and only the field requires the SideEffects on this context, the SideEffects are removed from the
287
+ * SideEffects queue.
288
+ *
289
+ * @function
290
+ * @name _generateFieldGroupPromise
291
+ * @param {object} mEventFieldProperties Field properties
292
+ * @returns {object} Promise to be used for the validation of the field
293
+ */
294
+ ;
295
+
296
+ _proto._generateFieldGroupPromise = function _generateFieldGroupPromise(mEventFieldProperties) {
297
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
298
+ var that = this;
299
+ var bPromiseSuccess = true;
300
+ return mEventFieldProperties.promise.then(function () {
301
+ return bPromiseSuccess;
302
+ }).catch(function () {
303
+ bPromiseSuccess = false;
304
+ return bPromiseSuccess;
305
+ }).finally(function () {
306
+ /**
307
+ * Need to store the status of properties related to this field for deferred SideEffects
308
+ * since all SourceProperties for this kind of SideEffects must be valid
309
+ */
310
+ that._saveFieldPropertiesStatus(mEventFieldProperties.field, bPromiseSuccess);
311
+ });
312
+ }
313
+ /**
314
+ * Generates the promise for the field that is required before requesting immediate SideEffects.
315
+ *
316
+ * @function
317
+ * @name _generateImmediatePromise
318
+ * @param {object} mEventFieldProperties Field properties
319
+ * @returns {object} Promise to be used for the validation of the field
320
+ */
321
+ ;
322
+
323
+ _proto._generateImmediatePromise = function _generateImmediatePromise(mEventFieldProperties) {
324
+ var oPromise = mEventFieldProperties.promise;
325
+ return oPromise.then(function () {
326
+ /**
327
+ * If the field gets a FieldHelper, we need to wait until all fields changed by this FieldHelper have been set.
328
+ * To achieve this, we ensure that all related bindings have been resolved.
329
+ *
330
+ * This resolution process is not managed by the Field Event Promise, so for fast user actions (like automation) it can lock the model
331
+ * and no request can be executed.
332
+ */
333
+ var oField = mEventFieldProperties.field;
334
+ var sFieldHelperId = oField.getFieldHelp && oField.getFieldHelp();
335
+
336
+ if (sFieldHelperId) {
337
+ var oFilterHelp = sap.ui.getCore().byId(sFieldHelperId);
338
+
339
+ if (oFilterHelp) {
340
+ return Promise.all(oFilterHelp.getOutParameters().map(function (oOutParameter) {
341
+ var oBinding = oOutParameter.getBinding("value");
342
+ return oBinding ? oBinding.requestValue() : Promise.resolve();
343
+ }));
401
344
  }
402
345
  }
403
346
 
404
- return undefined;
347
+ return Promise.all([]);
348
+ });
349
+ }
350
+ /**
351
+ * Generates a status index.
352
+ *
353
+ * @function
354
+ * @name _generateStatusIndex
355
+ * @param {object} mEntityType The entity type
356
+ * @param {string} sPropertyPath The property path
357
+ * @param {object} oContext SAPUI5 Context
358
+ * @returns {string | undefined} Index
359
+ */
360
+ ;
361
+
362
+ _proto._generateStatusIndex = function _generateStatusIndex(mEntityType, sPropertyPath, oContext) {
363
+ var sContextPath = oContext === null || oContext === void 0 ? void 0 : oContext.getPath();
364
+ var mProperty = mEntityType.resolvePath(sPropertyPath);
365
+
366
+ if (mProperty) {
367
+ if (mProperty && mProperty._type === "Property") {
368
+ return [mProperty.fullyQualifiedName, sContextPath].join("__");
369
+ }
405
370
  }
406
- /**
407
- * Gets the appropriate context on which SideEffects can be requested.
408
- * The correct one must have the binding parameter $$patchWithoutSideEffects.
409
- *
410
- * @function
411
- * @name _getContextForSideEffects
412
- * @param {object} oSourceField Field
413
- * @param {string} sSideEffectEntityType Target entity type of the SideEffects annotation
414
- * @returns {object} SAPUI5 Context
415
- */
416
-
417
- }, {
418
- key: "_getContextForSideEffects",
419
- value: function _getContextForSideEffects(oSourceField, sSideEffectEntityType) {
420
- var oBindingContext = oSourceField.getBindingContext();
421
-
422
- var oContextForSideEffects = oBindingContext,
423
- sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
424
-
425
- if (sSideEffectEntityType !== sEntityType) {
426
- oContextForSideEffects = oBindingContext.getBinding().getContext();
427
-
428
- if (oContextForSideEffects) {
429
- sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
430
-
431
- if (sSideEffectEntityType !== sEntityType) {
432
- oContextForSideEffects = oContextForSideEffects.getBinding().getContext();
433
-
434
- if (oContextForSideEffects) {
435
- sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
436
-
437
- if (sSideEffectEntityType !== sEntityType) {
438
- return undefined;
439
- }
371
+
372
+ return undefined;
373
+ }
374
+ /**
375
+ * Gets the appropriate context on which SideEffects can be requested.
376
+ * The correct one must have the binding parameter $$patchWithoutSideEffects.
377
+ *
378
+ * @function
379
+ * @name _getContextForSideEffects
380
+ * @param {object} oSourceField Field
381
+ * @param {string} sSideEffectEntityType Target entity type of the SideEffects annotation
382
+ * @returns {object} SAPUI5 Context
383
+ */
384
+ ;
385
+
386
+ _proto._getContextForSideEffects = function _getContextForSideEffects(oSourceField, sSideEffectEntityType) {
387
+ var oBindingContext = oSourceField.getBindingContext();
388
+
389
+ var oContextForSideEffects = oBindingContext,
390
+ sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
391
+
392
+ if (sSideEffectEntityType !== sEntityType) {
393
+ oContextForSideEffects = oBindingContext.getBinding().getContext();
394
+
395
+ if (oContextForSideEffects) {
396
+ sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
397
+
398
+ if (sSideEffectEntityType !== sEntityType) {
399
+ oContextForSideEffects = oContextForSideEffects.getBinding().getContext();
400
+
401
+ if (oContextForSideEffects) {
402
+ sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
403
+
404
+ if (sSideEffectEntityType !== sEntityType) {
405
+ return undefined;
440
406
  }
441
407
  }
442
408
  }
443
409
  }
444
-
445
- return oContextForSideEffects || undefined;
446
410
  }
447
- /**
448
- * Retrieves the EntityType based on its fully-qualified name.
449
- *
450
- * @param {string} sFullyQualifiedName The fully-qualified name
451
- * @returns {object} The entity type
452
- */
453
-
454
- }, {
455
- key: "_getEntityTypeFromFQN",
456
- value: function _getEntityTypeFromFQN(sFullyQualifiedName) {
457
- var mEntityType = this._oSideEffectsService.getConvertedMetaModel().entityTypes.find(function (oEntityType) {
458
- return oEntityType.fullyQualifiedName === sFullyQualifiedName;
459
- });
460
411
 
461
- return mEntityType;
462
- }
463
- /**
464
- * Gets the promise of the field validation that is required for the SideEffects process.
465
- *
466
- * @function
467
- * @name _getFieldPromise
468
- * @param {object} oEvent Field change event
469
- * @returns {object} Field promise
470
- */
471
-
472
- }, {
473
- key: "_getFieldPromise",
474
- value: function _getFieldPromise(oEvent) {
475
- var promise = oEvent.getParameter("promise") || Promise.resolve();
476
- return promise.then(function () {
477
- var oPromise = new Promise(function (resolve, reject) {
478
- if (!FieldRuntime.getFieldStateOnChange(oEvent).state.validity) {
479
- reject();
480
- } else {
481
- resolve(true);
412
+ return oContextForSideEffects || undefined;
413
+ }
414
+ /**
415
+ * Retrieves the EntityType based on its fully-qualified name.
416
+ *
417
+ * @param {string} sFullyQualifiedName The fully-qualified name
418
+ * @returns {object} The entity type
419
+ */
420
+ ;
421
+
422
+ _proto._getEntityTypeFromFQN = function _getEntityTypeFromFQN(sFullyQualifiedName) {
423
+ var mEntityType = this._oSideEffectsService.getConvertedMetaModel().entityTypes.find(function (oEntityType) {
424
+ return oEntityType.fullyQualifiedName === sFullyQualifiedName;
425
+ });
426
+
427
+ return mEntityType;
428
+ }
429
+ /**
430
+ * Gets the promise of the field validation that is required for the SideEffects process.
431
+ *
432
+ * @function
433
+ * @name _getFieldPromise
434
+ * @param {object} oEvent Field change event
435
+ * @returns {object} Field promise
436
+ */
437
+ ;
438
+
439
+ _proto._getFieldPromise = function _getFieldPromise(oEvent) {
440
+ var promise = oEvent.getParameter("promise") || Promise.resolve();
441
+ return promise.then(function () {
442
+ var oPromise = new Promise(function (resolve, reject) {
443
+ if (!FieldRuntime.getFieldStateOnChange(oEvent).state.validity) {
444
+ reject();
445
+ } else {
446
+ resolve(true);
447
+ }
448
+ });
449
+ return oPromise;
450
+ });
451
+ }
452
+ /**
453
+ * Gets the properties of the field that are required for the SideEffects process.
454
+ *
455
+ * @function
456
+ * @name _getFieldProperties
457
+ * @param {object} oEvent Field change event
458
+ * @returns {object} Field properties (event change promise, field, SideEffects related to this field)
459
+ */
460
+ ;
461
+
462
+ _proto._getFieldProperties = function _getFieldProperties(oEvent) {
463
+ var oField = oEvent.getSource();
464
+ return {
465
+ promise: this._getFieldPromise(oEvent),
466
+ field: oField,
467
+ sideEffectsMap: this._getFieldSideEffectsMap(oField)
468
+ };
469
+ }
470
+ /**
471
+ * Gets the SideEffects map
472
+ * These SideEffects are
473
+ * - listed into FieldGroupIds (coming from an OData Service)
474
+ * - generated by a control or controls and that configure this field as SourceProperties.
475
+ *
476
+ * @function
477
+ * @name _getFieldSideEffectsMap
478
+ * @param {object} oField Field
479
+ * @returns {object} SideEffects map
480
+ */
481
+ ;
482
+
483
+ _proto._getFieldSideEffectsMap = function _getFieldSideEffectsMap(oField) {
484
+ var _this3 = this;
485
+
486
+ var mSideEffectsMap = {},
487
+ aFieldGroupIds = oField.getFieldGroupIds(),
488
+ sViewEntitySetSetName = this._oView.getViewData().entitySet,
489
+ oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
490
+ return oEntitySet.name === sViewEntitySetSetName;
491
+ }); // SideEffects coming from an OData Service
492
+
493
+
494
+ aFieldGroupIds.forEach(function (sFieldGroupId) {
495
+ var _this3$_oSideEffectsS;
496
+
497
+ var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
498
+ sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
499
+ aSideEffectParts = sName.split("#"),
500
+ sSideEffectEntityType = aSideEffectParts[0],
501
+ sSideEffectPath = sSideEffectEntityType + "@com.sap.vocabularies.Common.v1.SideEffects" + (aSideEffectParts.length === 2 ? "#" + aSideEffectParts[1] : ""),
502
+ oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
503
+ oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
504
+
505
+ if (oSideEffect && oContext) {
506
+ mSideEffectsMap[sName] = {
507
+ name: sName,
508
+ immediate: bIsImmediate,
509
+ sideEffects: oSideEffect,
510
+ context: oContext
511
+ };
512
+ }
513
+ }); //SideEffects coming from control(s)
514
+
515
+ if (sViewEntitySetSetName && oViewEntitySet) {
516
+ var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
517
+ mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
518
+ return oCustomData.getKey() === "sourcePath";
519
+ }),
520
+ oContext = this._getContextForSideEffects(oField, sViewEntityType);
521
+
522
+ if (mFieldPath && oContext) {
523
+ var sFieldPath = mFieldPath.getValue().replace("/" + sViewEntitySetSetName + "/", ""),
524
+ mControlEntityType = this._oSideEffectsService.getControlEntitySideEffects(sViewEntityType);
525
+
526
+ Object.keys(mControlEntityType).forEach(function (sControlName) {
527
+ var oControlSideEffects = mControlEntityType[sControlName];
528
+
529
+ if (oControlSideEffects.SourceProperties.includes(sFieldPath)) {
530
+ var sName = sControlName + "::" + sViewEntityType;
531
+ mSideEffectsMap[sName] = {
532
+ name: sName,
533
+ immediate: true,
534
+ sideEffects: oControlSideEffects,
535
+ context: oContext
536
+ };
482
537
  }
483
538
  });
484
- return oPromise;
485
- });
486
- }
487
- /**
488
- * Gets the properties of the field that are required for the SideEffects process.
489
- *
490
- * @function
491
- * @name _getFieldProperties
492
- * @param {object} oEvent Field change event
493
- * @returns {object} Field properties (event change promise, field, SideEffects related to this field)
494
- */
495
-
496
- }, {
497
- key: "_getFieldProperties",
498
- value: function _getFieldProperties(oEvent) {
499
- var oField = oEvent.getSource();
500
- return {
501
- promise: this._getFieldPromise(oEvent),
502
- field: oField,
503
- sideEffectsMap: this._getFieldSideEffectsMap(oField)
504
- };
505
- }
506
- /**
507
- * Gets the SideEffects map
508
- * These SideEffects are
509
- * - listed into FieldGroupIds (coming from an OData Service)
510
- * - generated by a control or controls and that configure this field as SourceProperties.
511
- *
512
- * @function
513
- * @name _getFieldSideEffectsMap
514
- * @param {object} oField Field
515
- * @returns {object} SideEffects map
516
- */
517
-
518
- }, {
519
- key: "_getFieldSideEffectsMap",
520
- value: function _getFieldSideEffectsMap(oField) {
521
- var _this3 = this;
522
-
523
- var mSideEffectsMap = {},
524
- aFieldGroupIds = oField.getFieldGroupIds(),
525
- sViewEntitySetSetName = this._oView.getViewData().entitySet,
526
- oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
527
- return oEntitySet.name === sViewEntitySetSetName;
528
- }); // SideEffects coming from an OData Service
529
-
530
-
531
- aFieldGroupIds.forEach(function (sFieldGroupId) {
532
- var _this3$_oSideEffectsS;
533
-
534
- var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
535
- sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
536
- aSideEffectParts = sName.split("#"),
537
- sSideEffectEntityType = aSideEffectParts[0],
538
- sSideEffectPath = sSideEffectEntityType + "@com.sap.vocabularies.Common.v1.SideEffects" + (aSideEffectParts.length === 2 ? "#" + aSideEffectParts[1] : ""),
539
- oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
540
- oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
541
-
542
- if (oSideEffect && oContext) {
543
- mSideEffectsMap[sName] = {
544
- name: sName,
545
- immediate: bIsImmediate,
546
- sideEffects: oSideEffect,
547
- context: oContext
548
- };
549
- }
550
- }); //SideEffects coming from control(s)
551
-
552
- if (sViewEntitySetSetName && oViewEntitySet) {
553
- var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
554
- mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
555
- return oCustomData.getKey() === "sourcePath";
556
- }),
557
- oContext = this._getContextForSideEffects(oField, sViewEntityType);
558
-
559
- if (mFieldPath && oContext) {
560
- var sFieldPath = mFieldPath.getValue().replace("/" + sViewEntitySetSetName + "/", ""),
561
- mControlEntityType = this._oSideEffectsService.getControlEntitySideEffects(sViewEntityType);
562
-
563
- Object.keys(mControlEntityType).forEach(function (sControlName) {
564
- var oControlSideEffects = mControlEntityType[sControlName];
565
-
566
- if (oControlSideEffects.SourceProperties.includes(sFieldPath)) {
567
- var sName = sControlName + "::" + sViewEntityType;
568
- mSideEffectsMap[sName] = {
569
- name: sName,
570
- immediate: true,
571
- sideEffects: oControlSideEffects,
572
- context: oContext
573
- };
574
- }
575
- });
576
- }
577
539
  }
578
-
579
- return mSideEffectsMap;
580
540
  }
581
- /**
582
- * Manages the SideEffects with related changes to a field
583
- * List: gets immediate SideEffects requests
584
- * Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
585
- *
586
- * @function
587
- * @name _initializeFieldSideEffects
588
- * @param {object} mEventFieldProperties Field event properties
589
- * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
590
- * @returns {Array} Array of immediate SideEffects
591
- */
592
-
593
- }, {
594
- key: "_initializeFieldSideEffects",
595
- value: function _initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite) {
596
- var _this4 = this;
597
-
598
- var mFieldSideEffectsMap = mEventFieldProperties.sideEffectsMap,
599
- oFieldPromiseForFieldGroup = this._generateFieldGroupPromise(mEventFieldProperties),
600
- // Promise managing FieldGroup requests if Field promise fails
601
- mFailedSideEffectsName = {},
602
- aImmediateSideEffectsProperties = [];
603
-
604
- oFieldGroupPreRequisite = oFieldGroupPreRequisite || Promise.resolve();
605
- Object.keys(mFieldSideEffectsMap).forEach(function (sSideEffectName) {
606
- var oSideEffectProperty = mFieldSideEffectsMap[sSideEffectName],
607
- sSideEffectContextPath = oSideEffectProperty.context.getPath(),
608
- aFailedSideEffects = _this4._mFailedSideEffects[sSideEffectContextPath]; // Check if there is any previously failed request for this context
609
-
610
- if (aFailedSideEffects) {
611
- delete _this4._mFailedSideEffects[sSideEffectContextPath];
612
- mFailedSideEffectsName[sSideEffectContextPath] = {};
613
- aFailedSideEffects.forEach(function (mFailedSideEffects) {
614
- mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
615
- aImmediateSideEffectsProperties.push({
616
- name: sSideEffectName,
617
- previouslyFailed: true,
618
- sideEffects: mFailedSideEffects,
619
- context: oSideEffectProperty.context
620
- });
541
+
542
+ return mSideEffectsMap;
543
+ }
544
+ /**
545
+ * Manages the SideEffects with related changes to a field
546
+ * List: gets immediate SideEffects requests
547
+ * Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
548
+ *
549
+ * @function
550
+ * @name _initializeFieldSideEffects
551
+ * @param {object} mEventFieldProperties Field event properties
552
+ * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
553
+ * @returns {Array} Array of immediate SideEffects
554
+ */
555
+ ;
556
+
557
+ _proto._initializeFieldSideEffects = function _initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite) {
558
+ var _this4 = this;
559
+
560
+ var mFieldSideEffectsMap = mEventFieldProperties.sideEffectsMap,
561
+ oFieldPromiseForFieldGroup = this._generateFieldGroupPromise(mEventFieldProperties),
562
+ // Promise managing FieldGroup requests if Field promise fails
563
+ mFailedSideEffectsName = {},
564
+ aImmediateSideEffectsProperties = [];
565
+
566
+ oFieldGroupPreRequisite = oFieldGroupPreRequisite || Promise.resolve();
567
+ Object.keys(mFieldSideEffectsMap).forEach(function (sSideEffectName) {
568
+ var oSideEffectProperty = mFieldSideEffectsMap[sSideEffectName],
569
+ sSideEffectContextPath = oSideEffectProperty.context.getPath(),
570
+ aFailedSideEffects = _this4._mFailedSideEffects[sSideEffectContextPath]; // Check if there is any previously failed request for this context
571
+
572
+ if (aFailedSideEffects) {
573
+ delete _this4._mFailedSideEffects[sSideEffectContextPath];
574
+ mFailedSideEffectsName[sSideEffectContextPath] = {};
575
+ aFailedSideEffects.forEach(function (mFailedSideEffects) {
576
+ mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
577
+ aImmediateSideEffectsProperties.push({
578
+ name: sSideEffectName,
579
+ previouslyFailed: true,
580
+ sideEffects: mFailedSideEffects,
581
+ context: oSideEffectProperty.context
621
582
  });
622
- }
583
+ });
584
+ }
623
585
 
624
- if (oSideEffectProperty.immediate) {
625
- var _mFailedSideEffectsNa;
586
+ if (oSideEffectProperty.immediate) {
587
+ var _mFailedSideEffectsNa;
626
588
 
627
- // SideEffects will be executed immediately after event promise validation
628
- if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
629
- aImmediateSideEffectsProperties.push({
630
- name: sSideEffectName,
631
- sideEffects: oSideEffectProperty.sideEffects,
632
- context: oSideEffectProperty.context
633
- });
634
- }
635
- } else {
636
- // Add deferred SideEffects to the related dictionary
637
- _this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
638
- var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
639
- promises: [],
640
- sideEffectProperty: oSideEffectProperty,
641
- processStarted: false
642
- };
643
- mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
644
- _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
589
+ // SideEffects will be executed immediately after event promise validation
590
+ if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
591
+ aImmediateSideEffectsProperties.push({
592
+ name: sSideEffectName,
593
+ sideEffects: oSideEffectProperty.sideEffects,
594
+ context: oSideEffectProperty.context
595
+ });
645
596
  }
646
- });
647
- return aImmediateSideEffectsProperties;
648
- }
649
- /**
650
- * Saves the validation status of properties related to a field control.
651
- *
652
- * @param {object} oField Field
653
- * @param {boolean} bSuccess Status of the field validation
654
- */
597
+ } else {
598
+ // Add deferred SideEffects to the related dictionary
599
+ _this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
600
+ var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
601
+ promises: [],
602
+ sideEffectProperty: oSideEffectProperty,
603
+ processStarted: false
604
+ };
605
+ mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
606
+ _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
607
+ }
608
+ });
609
+ return aImmediateSideEffectsProperties;
610
+ }
611
+ /**
612
+ * Saves the validation status of properties related to a field control.
613
+ *
614
+ * @param {object} oField Field
615
+ * @param {boolean} bSuccess Status of the field validation
616
+ */
617
+ ;
655
618
 
656
- }, {
657
- key: "_saveFieldPropertiesStatus",
658
- value: function _saveFieldPropertiesStatus(oField, bSuccess) {
659
- var _this5 = this;
619
+ _proto._saveFieldPropertiesStatus = function _saveFieldPropertiesStatus(oField, bSuccess) {
620
+ var _this5 = this;
660
621
 
661
- var oBindingContext = oField.getBindingContext();
622
+ var oBindingContext = oField.getBindingContext();
662
623
 
663
- var sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
624
+ var sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
664
625
 
665
- var mEntityType = this._getEntityTypeFromFQN(sEntityType);
626
+ var mEntityType = this._getEntityTypeFromFQN(sEntityType);
666
627
 
667
- if (mEntityType) {
668
- // Retrieves all properties used by the field
669
- var oFieldBinding = this._getBindingForField(oField);
628
+ if (mEntityType) {
629
+ // Retrieves all properties used by the field
630
+ var oFieldBinding = this._getBindingForField(oField);
670
631
 
671
- var aFieldPaths = oFieldBinding.isA("sap.ui.model.CompositeBinding") ? (oFieldBinding.getBindings() || []).map(function (oBinding) {
672
- return oBinding.sPath;
673
- }) : [oFieldBinding.getPath()]; // Stores status for all properties
632
+ var aFieldPaths = oFieldBinding.isA("sap.ui.model.CompositeBinding") ? (oFieldBinding.getBindings() || []).map(function (oBinding) {
633
+ return oBinding.sPath;
634
+ }) : [oFieldBinding.getPath()]; // Stores status for all properties
674
635
 
675
- aFieldPaths.forEach(function (sFieldPath) {
676
- var sId = _this5._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
636
+ aFieldPaths.forEach(function (sFieldPath) {
637
+ var sId = _this5._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
677
638
 
678
- if (sId) {
679
- _this5._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
680
- }
681
- });
682
- }
639
+ if (sId) {
640
+ _this5._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
641
+ }
642
+ });
683
643
  }
684
- /**
685
- * Retrieves the property binding to the value of the field.
686
- *
687
- * @param oField Field
688
- * @returns {Binding} Binding to the value
689
- */
690
-
691
- }, {
692
- key: "_getBindingForField",
693
- value: function _getBindingForField(oField) {
694
- var oBinding;
695
-
696
- if (oField.isA("sap.m.CheckBox")) {
697
- oBinding = oField.getBinding("selected");
698
- } else {
699
- oBinding = oField.getBinding("value");
700
- }
701
-
702
- return oBinding;
644
+ }
645
+ /**
646
+ * Retrieves the property binding to the value of the field.
647
+ *
648
+ * @param oField Field
649
+ * @returns {Binding} Binding to the value
650
+ */
651
+ ;
652
+
653
+ _proto._getBindingForField = function _getBindingForField(oField) {
654
+ var sBindingName = "value";
655
+
656
+ if (oField.isA("sap.m.CheckBox")) {
657
+ sBindingName = "selected";
658
+ } else if (oField.isA("sap.ui.unified.FileUploader")) {
659
+ sBindingName = "uploadUrl";
703
660
  }
704
- }]);
661
+
662
+ return oField.getBinding(sBindingName);
663
+ };
705
664
 
706
665
  return SideEffectsControllerExtension;
707
666
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeFailedSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_addFailedSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_addFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_getContextForSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_getContextForSideEffects"), _class2.prototype)), _class2)) || _class);
708
667
  return SideEffectsControllerExtension;
709
668
  }, false);
710
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhciIsIm9FdmVudCIsIm9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwibUV2ZW50RmllbGRQcm9wZXJ0aWVzIiwiX2dldEZpZWxkUHJvcGVydGllcyIsImFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMiLCJiSXNJbW1lZGlhdGVUcmlnZ2VyZWQiLCJfZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJtU2lkZUVmZmVjdHNQcm9wZXJ0eSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZGVidWciLCJmaWx0ZXIiLCJtSW1tZWRpYXRlU2lkZUVmZmVjdHMiLCJwcmV2aW91c2x5RmFpbGVkIiwiZm9yRWFjaCIsIl9hZGRGYWlsZWRTaWRlRWZmZWN0cyIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsIm9TaWRlRWZmZWN0cyIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsImZSZXNvbHZlciIsImZSZWplY3RvciIsIm9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImFUYXJnZXRzIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwic1RyaWdnZXJBY3Rpb24iLCJUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsIm9Db250cm9sIiwic0NvbnRyb2xJZCIsImlzQSIsImdldElkIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiYklzTm90QWxyZWFkeUxpc3RlZCIsIm1GYWlsZWRTaWRlRWZmZWN0cyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImJQcm9taXNlU3VjY2VzcyIsInByb21pc2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpZWxkIiwib0ZpZWxkIiwic0ZpZWxkSGVscGVySWQiLCJnZXRGaWVsZEhlbHAiLCJvRmlsdGVySGVscCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImJ5SWQiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib091dFBhcmFtZXRlciIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInNQcm9wZXJ0eVBhdGgiLCJtUHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiam9pbiIsInVuZGVmaW5lZCIsIm9Tb3VyY2VGaWVsZCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0NvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldENvbnRleHQiLCJzRnVsbHlRdWFsaWZpZWROYW1lIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwib0VudGl0eVR5cGUiLCJGaWVsZFJ1bnRpbWUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwiX2dldEZpZWxkUHJvbWlzZSIsInNpZGVFZmZlY3RzTWFwIiwiX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJtU2lkZUVmZmVjdHNNYXAiLCJnZXRGaWVsZEdyb3VwSWRzIiwic1ZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJvVmlld0VudGl0eVNldCIsImVudGl0eVNldHMiLCJvRW50aXR5U2V0IiwiYklzSW1tZWRpYXRlIiwiaW5kZXhPZiIsInNOYW1lIiwiYVNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic1NpZGVFZmZlY3RQYXRoIiwibGVuZ3RoIiwib1NpZGVFZmZlY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsImltbWVkaWF0ZSIsInNWaWV3RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJtRmllbGRQYXRoIiwiZ2V0QWdncmVnYXRpb24iLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInNGaWVsZFBhdGgiLCJnZXRWYWx1ZSIsIm1Db250cm9sRW50aXR5VHlwZSIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsInNDb250cm9sTmFtZSIsIm9Db250cm9sU2lkZUVmZmVjdHMiLCJpbmNsdWRlcyIsIm1GaWVsZFNpZGVFZmZlY3RzTWFwIiwib0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAiLCJfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZSIsIm1GYWlsZWRTaWRlRWZmZWN0c05hbWUiLCJzU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwibVNpZGVFZmZlY3RDb250ZXh0UGF0aCIsImJTdWNjZXNzIiwib0ZpZWxkQmluZGluZyIsIl9nZXRCaW5kaW5nRm9yRmllbGQiLCJhRmllbGRQYXRocyIsImdldEJpbmRpbmdzIiwic1BhdGgiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiLCJQcml2YXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BbURNQSw4QixXQURMQyxRQUFRLENBQUMsOENBQUQsRUFBaURDLDJCQUFqRCxDLFVBU1BDLFFBQVEsRTs7Ozs7Ozs7Ozs7OzthQUFULGtCQUNnQjtBQUNmLGFBQUtDLE1BQUwsR0FBZSxJQUFELENBQWNDLElBQWQsQ0FBbUJDLE9BQW5CLEVBQWQ7QUFDQSxhQUFLQyxjQUFMLEdBQXNCQyxXQUFXLENBQUNDLGVBQVosQ0FBNEIsS0FBS0wsTUFBakMsQ0FBdEI7QUFDQSxhQUFLTSxvQkFBTCxHQUE2QixLQUFLSCxjQUFOLENBQTZCSSxxQkFBN0IsRUFBNUI7QUFDQSxhQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLGFBQUtDLHlCQUFMLEdBQWlDLElBQUlDLEdBQUosRUFBakM7QUFDQSxhQUFLQyxtQkFBTCxHQUEyQixFQUEzQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsaUNBRXFDO0FBQ3BDLGFBQUtGLHlCQUFMLENBQStCRyxLQUEvQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyx1Q0FFaUU7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O0lBNW5CMkN5RSxtQiw2TkF3QjNDQyxNLEVBQ0FDLEssaUxBWUFELE0sRUFDQUMsSyw2S0FpQkFELE0sRUFDQUMsSyx3S0E2Q0FELE0sRUFDQUMsSyw0S0FrRkFELE0sRUFDQUMsSyw2S0FXQUQsTSxFQUNBQyxLLDBLQWNBRCxNLEVBQ0FDLEssMktBZ0NBRCxNLEVBQ0FDLEssOEtBa0JBQyxPLEVBQ0FELEssK0tBOEdBQyxPLEVBQ0FELEs7U0F3UWE1TCw4QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiB9IGZyb20gXCJzYXAvdWkvY29yZS9tdmNcIjtcbmltcG9ydCB7IEJpbmRpbmcsIENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsXCI7XG5pbXBvcnQgeyBDaGVja0JveCB9IGZyb20gXCJzYXAvbVwiO1xuaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zXCI7XG5pbXBvcnQgeyBVSTVDbGFzcywgT3ZlcnJpZGUsIFB1YmxpYywgRmluYWwsIFByaXZhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IEFwcENvbXBvbmVudCwgQ29tbW9uVXRpbHMgfSBmcm9tIFwic2FwL2ZlL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2wgfSBmcm9tIFwic2FwL3VpL2NvcmVcIjtcbmltcG9ydCB7XG5cdFNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzVHlwZSxcblx0T0RhdGFTaWRlRWZmZWN0c1R5cGUsXG5cdENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB7IEZpZWxkUnVudGltZSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJPdXRwdXQsIFByb3BlcnR5UGF0aCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5cbnR5cGUgRmllbGRDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0RmllbGRIZWxwKCk6IHN0cmluZztcblx0Z2V0RmllbGRHcm91cElkcygpOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRmllbGRFdmVudFByb3BlcnR5VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRmaWVsZDogRmllbGRDb250cm9sO1xuXHRzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcbn07XG5cbnR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdGNvbnRleHQ6IENvbnRleHQ8YW55Pjtcblx0c2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZTtcblx0cHJldmlvdXNseUZhaWxlZD86IGJvb2xlYW47XG59O1xuXG50eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdHNUeXBlW10+O1xuXG50eXBlIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSA9IHtcblx0cHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXHRzaWRlRWZmZWN0UHJvcGVydHk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZTtcblx0cHJvY2Vzc1N0YXJ0ZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZEdyb3VwUXVldWVNYXBUeXBlID0ge1xuXHRbc2lkZUVmZmVjdE5hbWU6IHN0cmluZ106IHtcblx0XHRbY29udGV4dFBhdGg6IHN0cmluZ106IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZTtcblx0fTtcbn07XG5cbkBVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlNpZGVFZmZlY3RzXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9tRmllbGRHcm91cFF1ZXVlITogRmllbGRHcm91cFF1ZXVlTWFwVHlwZTtcblx0cHJpdmF0ZSBfYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlITogU2V0PHN0cmluZz47XG5cdHByaXZhdGUgX29TaWRlRWZmZWN0c1NlcnZpY2UhOiBhbnk7XG5cdHByaXZhdGUgX21GYWlsZWRTaWRlRWZmZWN0cyE6IEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSAodGhpcyBhcyBhbnkpLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWUgPSB7fTtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUgPSBuZXcgU2V0KCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgcmVjb3JkZWQgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cygpOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0cmV0dXJuIHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSB3b3JrZmxvdyBmb3IgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBUaGUgZm9sbG93aW5nIHNjZW5hcmlvcyBhcmUgbWFuYWdlZDpcblx0ICogIC0gRXhlY3V0ZTogdHJpZ2dlcnMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGlmIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZXZlbnQgaXMgZnVsZmlsbGVkXG5cdCAqICAtIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaGFuZGxlRmllbGRDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgZXZlbnQgdGhhdCBjb21lcyBmcm9tIGEgZmllbGQgY2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Qocylcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBoYW5kbGVGaWVsZENoYW5nZShvRXZlbnQ6IFVJNUV2ZW50LCBvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55Pik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbUV2ZW50RmllbGRQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudCksXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IHRoaXMuX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRtRXZlbnRGaWVsZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlXG5cdFx0XHQpO1xuXG5cdFx0bGV0IGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm1hcChtU2lkZUVmZmVjdHNQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMobVNpZGVFZmZlY3RzUHJvcGVydHkuc2lkZUVmZmVjdHMsIG1TaWRlRWZmZWN0c1Byb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH0pIHx8IFtdXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdGlmIChiSXNJbW1lZGlhdGVUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkIFNpZGVFZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU2lkZUVmZmVjdHMgaGF2ZSBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgcHJlUmVxdWlzaXRlIHZhbGlkYXRpb24gZmFpbHMgc28gd2UgbmVlZFxuXHRcdFx0XHRcdCAqIHRvIGtlZXAgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBhcyBGYWlsZWQgcmVxdWVzdCAodG8gYmUgcmV0cmlnZ2VyIG9uIG5leHQgY2hhbmdlKVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0LmZpbHRlcihtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT4gbUltbWVkaWF0ZVNpZGVFZmZlY3RzLnByZXZpb3VzbHlGYWlsZWQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT5cblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMobUltbWVkaWF0ZVNpZGVFZmZlY3RzLnNpZGVFZmZlY3RzLCBtSW1tZWRpYXRlU2lkZUVmZmVjdHMuY29udGV4dClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRHcm91cENoYW5nZShvRXZlbnQ6IFVJNUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGVbXSA9IFtdLFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImZpZWxkR3JvdXBJZHNcIik7XG5cblx0XHRjb25zdCBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2UgPSBmdW5jdGlvbihvRGVmZXJyZWRTaWRlRWZmZWN0OiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpIHtcblx0XHRcdGxldCBiSXNSZXF1ZXN0c1RyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eSA9IG9EZWZlcnJlZFNpZGVFZmZlY3Quc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoYXQuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhhdC5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwob0RlZmVycmVkU2lkZUVmZmVjdC5wcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YklzUmVxdWVzdHNUcmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly9EZWZlcnJlZCBTaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBhbGwgc291cmNlUHJvcGVydGllcyBoYXZlIG5vIHJlZ2lzdGVyZWQgZmFpbHVyZS5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXSkuZXZlcnkoc291cmNlUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc291cmNlUHJvcGVydHkudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNJZCA9IHRoYXQuX2dlbmVyYXRlU3RhdHVzSW5kZXgobUVudGl0eVR5cGUsIHNvdXJjZVByb3BlcnR5LnZhbHVlLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICF0aGF0Ll9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuaGFzKHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLCBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdFx0aWYgKGJJc1JlcXVlc3RzVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCBcIiArIHNDb250ZXh0UGF0aCwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZVtvU2lkZUVmZmVjdFByb3BlcnR5Lm5hbWVdW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKHNGaWVsZEdyb3VwSWQgPT4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBzdHJpbmcgXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiBpcyBhZGRlZCB0byB0aGUgU2lkZUVmZmVjdHMgbmFtZSBkdXJpbmcgdGVtcGxhdGluZyB0byBrbm93XG5cdFx0XHQgKiBpZiB0aGlzIFNpZGVFZmZlY3RzIG11c3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgcmVxdWVzdGVkIChvbiBmaWVsZCBjaGFuZ2UpIG9yIG11c3Rcblx0XHRcdCAqIGJlIGRlZmVycmVkIChvbiBmaWVsZCBncm91cCBmb2N1cyBvdXQpXG5cdFx0XHQgKlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzU2lkZUVmZmVjdE5hbWU6IHN0cmluZyA9IHNGaWVsZEdyb3VwSWQucmVwbGFjZShcIiQkSW1tZWRpYXRlUmVxdWVzdFwiLCBcIlwiKTtcblx0XHRcdGNvbnN0IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cyA9IHRoYXQuX21GaWVsZEdyb3VwUXVldWU/LltzU2lkZUVmZmVjdE5hbWVdO1xuXHRcdFx0aWYgKG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpLmZvckVhY2goc0NvbnRleHRQYXRoID0+IHtcblx0XHRcdFx0XHRjb25zdCBvRGVmZXJyZWRTaWRlRWZmZWN0ID0gbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0aWYgKCFvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkKSB7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLnB1c2gob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLm1hcChvRGVmZXJyZWRTaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0cmV0dXJuIGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZShvRGVmZXJyZWRTaWRlRWZmZWN0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGFkZENvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZSwgb1NpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBxdWV1ZSBjb250YWluaW5nIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzKCk6IHZvaWQge1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dDxhbnk+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRsZXQgZlJlc29sdmVyOiBhbnksIGZSZWplY3RvcjogYW55O1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRmUmVzb2x2ZXIgPSByZXNvbHZlO1xuXHRcdFx0ZlJlamVjdG9yID0gcmVqZWN0O1xuXHRcdH0pO1xuXHRcdGNvbnN0IGFUYXJnZXRzOiBhbnlbXSA9ICgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSkuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pLFxuXHRcdFx0c1RyaWdnZXJBY3Rpb246IFN0cmluZyB8IHVuZGVmaW5lZCA9IChvU2lkZUVmZmVjdHMgYXMgT0RhdGFTaWRlRWZmZWN0c1R5cGUpLlRyaWdnZXJBY3Rpb247XG5cblx0XHRpZiAoc1RyaWdnZXJBY3Rpb24pIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQpO1xuXHRcdH1cblxuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2Vcblx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldHMsIG9Db250ZXh0KVxuXHRcdFx0LnRoZW4oKCkgPT4gZlJlc29sdmVyKCkpXG5cdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0cywgb0NvbnRleHQpO1xuXHRcdFx0XHRmUmVqZWN0b3Iob0Vycm9yKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgU2lkZUVmZmVjdHMgY3JlYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVDb250cm9sU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sIFNBUFVJNSBDb250cm9sXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKG9Db250cm9sOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRyb2xJZCA9IG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpICYmIG9Db250cm9sLmdldElkKCk7XG5cblx0XHRpZiAoc0NvbnRyb2xJZCkge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5yZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgU2lkZUVmZmVjdHMgdG8gdGhlIHF1ZXVlIG9mIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHNcblx0ICogVGhlIFNpZGVFZmZlY3RzIHdpbGwgYmUgcmV0cmlnZ2VyZWQgb24gdGhlIG5leHQgY2hhbmdlIG9uIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0aGF0IG5lZWQgdG8gYmUgcmV0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBQcml2YXRlXG5cdEBGaW5hbFxuXHRwcml2YXRlIF9hZGRGYWlsZWRTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQ8YW55Pik6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aDogc3RyaW5nID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gfHwgW107XG5cdFx0Y29uc3QgYklzTm90QWxyZWFkeUxpc3RlZCA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLmV2ZXJ5KFxuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzID0+IG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IG1GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHQpO1xuXHRcdGlmIChiSXNOb3RBbHJlYWR5TGlzdGVkKSB7XG5cdFx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXS5wdXNoKG9TaWRlRWZmZWN0cyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGdyb3VwIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgU2lkZUVmZmVjdHMuXG5cdCAqIElmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIGFuZCBvbmx5IHRoZSBmaWVsZCByZXF1aXJlcyB0aGUgU2lkZUVmZmVjdHMgb24gdGhpcyBjb250ZXh0LCB0aGUgU2lkZUVmZmVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGVcblx0ICogU2lkZUVmZmVjdHMgcXVldWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblxuXHRcdGxldCBiUHJvbWlzZVN1Y2Nlc3MgPSB0cnVlO1xuXHRcdHJldHVybiBtRXZlbnRGaWVsZFByb3BlcnRpZXMucHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBiUHJvbWlzZVN1Y2Nlc3M7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBJZiB0aGUgZmllbGQgZ2V0cyBhIEZpZWxkSGVscGVyLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgYWxsIGZpZWxkcyBjaGFuZ2VkIGJ5IHRoaXMgRmllbGRIZWxwZXIgaGF2ZSBiZWVuIHNldC5cblx0XHRcdCAqIFRvIGFjaGlldmUgdGhpcywgd2UgZW5zdXJlIHRoYXQgYWxsIHJlbGF0ZWQgYmluZGluZ3MgaGF2ZSBiZWVuIHJlc29sdmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgcmVzb2x1dGlvbiBwcm9jZXNzIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBGaWVsZCBFdmVudCBQcm9taXNlLCBzbyBmb3IgZmFzdCB1c2VyIGFjdGlvbnMgKGxpa2UgYXV0b21hdGlvbikgaXQgY2FuIGxvY2sgdGhlIG1vZGVsXG5cdFx0XHQgKiBhbmQgbm8gcmVxdWVzdCBjYW4gYmUgZXhlY3V0ZWQuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IG9GaWVsZCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZDtcblx0XHRcdGNvbnN0IHNGaWVsZEhlbHBlcklkID0gb0ZpZWxkLmdldEZpZWxkSGVscCAmJiBvRmllbGQuZ2V0RmllbGRIZWxwKCk7XG5cdFx0XHRpZiAoc0ZpZWxkSGVscGVySWQpIHtcblx0XHRcdFx0Y29uc3Qgb0ZpbHRlckhlbHA6IGFueSA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChzRmllbGRIZWxwZXJJZCk7XG5cdFx0XHRcdGlmIChvRmlsdGVySGVscCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcChvT3V0UGFyYW1ldGVyID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvT3V0UGFyYW1ldGVyLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gb0JpbmRpbmcucmVxdWVzdFZhbHVlKCkgOiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtdKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBzdGF0dXMgaW5kZXguXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVTdGF0dXNJbmRleFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBTQVBVSTUgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBJbmRleFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZTogRW50aXR5VHlwZSwgc1Byb3BlcnR5UGF0aDogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dDxhbnk+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogVGhlIGNvcnJlY3Qgb25lIG11c3QgaGF2ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXIgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2VGaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NpZGVFZmZlY3RFbnRpdHlUeXBlIFRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgU2lkZUVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTQVBVSTUgQ29udGV4dFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvU291cmNlRmllbGQ6IEZpZWxkQ29udHJvbCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0PGFueT4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGxldCBvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gb0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXG5cdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSAob0JpbmRpbmdDb250ZXh0IGFzIGFueSkuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IChvQ29udGV4dEZvclNpZGVFZmZlY3RzIGFzIGFueSkuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAob0NvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgfHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgRW50aXR5VHlwZSBiYXNlZCBvbiBpdHMgZnVsbHktcXVhbGlmaWVkIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgZW50aXR5IHR5cGVcblx0ICovXG5cdHByaXZhdGUgX2dldEVudGl0eVR5cGVGcm9tRlFOKHNGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gKHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCkgYXMgQ29udmVydGVyT3V0cHV0KS5lbnRpdHlUeXBlcy5maW5kKG9FbnRpdHlUeXBlID0+IHtcblx0XHRcdHJldHVybiBvRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPT09IHNGdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG1FbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb21pc2Ugb2YgdGhlIGZpZWxkIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZCBmb3IgdGhlIFNpZGVFZmZlY3RzIHByb2Nlc3MuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRQcm9taXNlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgRmllbGQgY2hhbmdlIGV2ZW50XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEZpZWxkIHByb21pc2Vcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkUHJvbWlzZShvRXZlbnQ6IFVJNUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBwcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIikgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdGlmICghRmllbGRSdW50aW1lLmdldEZpZWxkU3RhdGVPbkNoYW5nZShvRXZlbnQpLnN0YXRlLnZhbGlkaXR5KSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgZmllbGQgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBTaWRlRWZmZWN0cyBwcm9jZXNzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkUHJvcGVydGllc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IEZpZWxkIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBGaWVsZCBwcm9wZXJ0aWVzIChldmVudCBjaGFuZ2UgcHJvbWlzZSwgZmllbGQsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gdGhpcyBmaWVsZClcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkUHJvcGVydGllcyhvRXZlbnQ6IFVJNUV2ZW50KTogRmllbGRFdmVudFByb3BlcnR5VHlwZSB7XG5cdFx0Y29uc3Qgb0ZpZWxkOiBGaWVsZENvbnRyb2wgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvbWlzZTogdGhpcy5fZ2V0RmllbGRQcm9taXNlKG9FdmVudCksXG5cdFx0XHRmaWVsZDogb0ZpZWxkLFxuXHRcdFx0c2lkZUVmZmVjdHNNYXA6IHRoaXMuX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgbWFwXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGFyZVxuXHQgKiAtIGxpc3RlZCBpbnRvIEZpZWxkR3JvdXBJZHMgKGNvbWluZyBmcm9tIGFuIE9EYXRhIFNlcnZpY2UpXG5cdCAqIC0gZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCBvciBjb250cm9scyBhbmQgdGhhdCBjb25maWd1cmUgdGhpcyBmaWVsZCBhcyBTb3VyY2VQcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXBcblx0ICogQHBhcmFtIHtvYmplY3R9IG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBtYXBcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNNYXA6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSB7fSxcblx0XHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IG9GaWVsZC5nZXRGaWVsZEdyb3VwSWRzKCksXG5cdFx0XHRzVmlld0VudGl0eVNldFNldE5hbWUgPSB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLmVudGl0eVNldCxcblx0XHRcdG9WaWV3RW50aXR5U2V0ID0gKHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCkgYXMgQ29udmVydGVyT3V0cHV0KS5lbnRpdHlTZXRzLmZpbmQob0VudGl0eVNldCA9PiB7XG5cdFx0XHRcdHJldHVybiBvRW50aXR5U2V0Lm5hbWUgPT09IHNWaWV3RW50aXR5U2V0U2V0TmFtZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdGFGaWVsZEdyb3VwSWRzLmZvckVhY2goc0ZpZWxkR3JvdXBJZCA9PiB7XG5cdFx0XHRjb25zdCBiSXNJbW1lZGlhdGU6IGJvb2xlYW4gPSBzRmllbGRHcm91cElkLmluZGV4T2YoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIikgIT09IC0xLFxuXHRcdFx0XHRzTmFtZTogc3RyaW5nID0gc0ZpZWxkR3JvdXBJZC5yZXBsYWNlKFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIsIFwiXCIpLFxuXHRcdFx0XHRhU2lkZUVmZmVjdFBhcnRzOiBzdHJpbmdbXSA9IHNOYW1lLnNwbGl0KFwiI1wiKSxcblx0XHRcdFx0c1NpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmcgPSBhU2lkZUVmZmVjdFBhcnRzWzBdLFxuXHRcdFx0XHRzU2lkZUVmZmVjdFBhdGg6IHN0cmluZyA9XG5cdFx0XHRcdFx0c1NpZGVFZmZlY3RFbnRpdHlUeXBlICtcblx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHNcIiArXG5cdFx0XHRcdFx0KGFTaWRlRWZmZWN0UGFydHMubGVuZ3RoID09PSAyID8gXCIjXCIgKyBhU2lkZUVmZmVjdFBhcnRzWzFdIDogXCJcIiksXG5cdFx0XHRcdG9TaWRlRWZmZWN0OiBTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc1NpZGVFZmZlY3RFbnRpdHlUeXBlKT8uW1xuXHRcdFx0XHRcdHNTaWRlRWZmZWN0UGF0aFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRvQ29udGV4dDogQ29udGV4dDxhbnk+IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZTogYklzSW1tZWRpYXRlLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly9TaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHNWaWV3RW50aXR5U2V0U2V0TmFtZSAmJiBvVmlld0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgc1ZpZXdFbnRpdHlUeXBlID0gb1ZpZXdFbnRpdHlTZXQuZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdG1GaWVsZFBhdGg6IGFueSA9IChvRmllbGQuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21EYXRhXCIpIGFzIGFueVtdKS5maW5kKG9DdXN0b21EYXRhID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQ8YW55PiB8IHVuZGVmaW5lZCA9IHRoaXMuX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvRmllbGQsIHNWaWV3RW50aXR5VHlwZSk7XG5cblx0XHRcdGlmIChtRmllbGRQYXRoICYmIG9Db250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHNGaWVsZFBhdGggPSBtRmllbGRQYXRoLmdldFZhbHVlKCkucmVwbGFjZShcIi9cIiArIHNWaWV3RW50aXR5U2V0U2V0TmFtZSArIFwiL1wiLCBcIlwiKSxcblx0XHRcdFx0XHRtQ29udHJvbEVudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdHNWaWV3RW50aXR5VHlwZVxuXHRcdFx0XHRcdCkgYXMgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeTtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRyb2xFbnRpdHlUeXBlKS5mb3JFYWNoKHNDb250cm9sTmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xTaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlID0gbUNvbnRyb2xFbnRpdHlUeXBlW3NDb250cm9sTmFtZV07XG5cdFx0XHRcdFx0aWYgKChvQ29udHJvbFNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKHNGaWVsZFBhdGgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzTmFtZSA9IHNDb250cm9sTmFtZSArIFwiOjpcIiArIHNWaWV3RW50aXR5VHlwZTtcblx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogTGlzdDogZ2V0cyBpbW1lZGlhdGUgU2lkZUVmZmVjdHMgcmVxdWVzdHNcblx0ICogUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBldmVudCBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gIEFycmF5IG9mIGltbWVkaWF0ZSBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMoXG5cdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlLFxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTxhbnk+XG5cdCk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZVtdIHtcblx0XHRjb25zdCBtRmllbGRTaWRlRWZmZWN0c01hcCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5zaWRlRWZmZWN0c01hcCxcblx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwID0gdGhpcy5fZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpLCAvLyBQcm9taXNlIG1hbmFnaW5nIEZpZWxkR3JvdXAgcmVxdWVzdHMgaWYgRmllbGQgcHJvbWlzZSBmYWlsc1xuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZTogYW55ID0ge30sXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IFtdO1xuXG5cdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgPSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdE9iamVjdC5rZXlzKG1GaWVsZFNpZGVFZmZlY3RzTWFwKS5mb3JFYWNoKHNTaWRlRWZmZWN0TmFtZSA9PiB7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBtRmllbGRTaWRlRWZmZWN0c01hcFtzU2lkZUVmZmVjdE5hbWVdLFxuXHRcdFx0XHRzU2lkZUVmZmVjdENvbnRleHRQYXRoID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBmb3IgdGhpcyBjb250ZXh0XG5cdFx0XHRpZiAoYUZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF07XG5cdFx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzLmZvckVhY2gobUZhaWxlZFNpZGVFZmZlY3RzID0+IHtcblx0XHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdW21GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gdHJ1ZTtcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogc1NpZGVFZmZlY3ROYW1lLFxuXHRcdFx0XHRcdFx0cHJldmlvdXNseUZhaWxlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBtRmFpbGVkU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjb250ZXh0OiBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RQcm9wZXJ0eS5pbW1lZGlhdGUpIHtcblx0XHRcdFx0Ly8gU2lkZUVmZmVjdHMgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBldmVudCBwcm9taXNlIHZhbGlkYXRpb25cblx0XHRcdFx0aWYgKCFtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdPy5bb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFkZCBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0byB0aGUgcmVsYXRlZCBkaWN0aW9uYXJ5XG5cdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSB8fCB7fTtcblx0XHRcdFx0Y29uc3QgbVNpZGVFZmZlY3RDb250ZXh0UGF0aCA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXSB8fCB7XG5cdFx0XHRcdFx0cHJvbWlzZXM6IFtdLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RQcm9wZXJ0eTogb1NpZGVFZmZlY3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9jZXNzU3RhcnRlZDogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdFx0bVNpZGVFZmZlY3RDb250ZXh0UGF0aC5wcm9taXNlcyA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMuY29uY2F0KFtcblx0XHRcdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCxcblx0XHRcdFx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBhcyBQcm9taXNlPGFueT5cblx0XHRcdFx0XSk7XG5cdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXSA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGg7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXM7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHByb3BlcnRpZXMgcmVsYXRlZCB0byBhIGZpZWxkIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGQgRmllbGRcblx0ICogQHBhcmFtIHtib29sZWFufSBiU3VjY2VzcyBTdGF0dXMgb2YgdGhlIGZpZWxkIHZhbGlkYXRpb25cblx0ICovXG5cdHByaXZhdGUgX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMob0ZpZWxkOiBGaWVsZENvbnRyb2wsIGJTdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb0ZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhpcy5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0Ly8gUmV0cmlldmVzIGFsbCBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGZpZWxkXG5cdFx0XHRjb25zdCBvRmllbGRCaW5kaW5nOiBhbnkgPSB0aGlzLl9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkKTtcblx0XHRcdGNvbnN0IGFGaWVsZFBhdGhzID0gb0ZpZWxkQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1wiKVxuXHRcdFx0XHQ/ICgob0ZpZWxkQmluZGluZyBhcyBhbnkpLmdldEJpbmRpbmdzKCkgfHwgW10pLm1hcCgob0JpbmRpbmc6IGFueSkgPT4gb0JpbmRpbmcuc1BhdGgpXG5cdFx0XHRcdDogW29GaWVsZEJpbmRpbmcuZ2V0UGF0aCgpXTtcblxuXHRcdFx0Ly8gU3RvcmVzIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXNcblx0XHRcdGFGaWVsZFBhdGhzLmZvckVhY2goKHNGaWVsZFBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBzSWQgPSB0aGlzLl9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlLCBzRmllbGRQYXRoLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoc0lkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlW2JTdWNjZXNzID8gXCJkZWxldGVcIiA6IFwiYWRkXCJdKHNJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IGJpbmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyB7QmluZGluZ30gIEJpbmRpbmcgdG8gdGhlIHZhbHVlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBCaW5kaW5nIHtcblx0XHRsZXQgb0JpbmRpbmc6IEJpbmRpbmc7XG5cdFx0aWYgKG9GaWVsZC5pc0E8Q2hlY2tCb3g+KFwic2FwLm0uQ2hlY2tCb3hcIikpIHtcblx0XHRcdG9CaW5kaW5nID0gb0ZpZWxkLmdldEJpbmRpbmcoXCJzZWxlY3RlZFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0JpbmRpbmcgPSBvRmllbGQuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0JpbmRpbmc7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
669
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhclByb3BlcnRpZXNTdGF0dXMiLCJjbGVhciIsImdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwib0V2ZW50Iiwib0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUiLCJtRXZlbnRGaWVsZFByb3BlcnRpZXMiLCJfZ2V0RmllbGRQcm9wZXJ0aWVzIiwiYUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcyIsIl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyIsImJJc0ltbWVkaWF0ZVRyaWdnZXJlZCIsIl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UiLCJ0aGVuIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm1TaWRlRWZmZWN0c1Byb3BlcnR5IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHMiLCJjb250ZXh0IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJkZWJ1ZyIsImZpbHRlciIsIm1JbW1lZGlhdGVTaWRlRWZmZWN0cyIsInByZXZpb3VzbHlGYWlsZWQiLCJmb3JFYWNoIiwiX2FkZEZhaWxlZFNpZGVFZmZlY3RzIiwiaGFuZGxlRmllbGRHcm91cENoYW5nZSIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsIm9TaWRlRWZmZWN0cyIsInJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzIiwiZlJlc29sdmVyIiwiZlJlamVjdG9yIiwib1Byb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiYVRhcmdldHMiLCJUYXJnZXRFbnRpdGllcyIsImNvbmNhdCIsIlRhcmdldFByb3BlcnRpZXMiLCJzVHJpZ2dlckFjdGlvbiIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwib0NvbnRyb2wiLCJzQ29udHJvbElkIiwiaXNBIiwiZ2V0SWQiLCJiSXNOb3RBbHJlYWR5TGlzdGVkIiwibUZhaWxlZFNpZGVFZmZlY3RzIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UiLCJiUHJvbWlzZVN1Y2Nlc3MiLCJwcm9taXNlIiwiX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMiLCJmaWVsZCIsIm9GaWVsZCIsInNGaWVsZEhlbHBlcklkIiwiZ2V0RmllbGRIZWxwIiwib0ZpbHRlckhlbHAiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJieUlkIiwiZ2V0T3V0UGFyYW1ldGVycyIsIm9PdXRQYXJhbWV0ZXIiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJyZXF1ZXN0VmFsdWUiLCJzUHJvcGVydHlQYXRoIiwibVByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImpvaW4iLCJ1bmRlZmluZWQiLCJfZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzIiwib1NvdXJjZUZpZWxkIiwic1NpZGVFZmZlY3RFbnRpdHlUeXBlIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQ29udGV4dEZvclNpZGVFZmZlY3RzIiwiZ2V0Q29udGV4dCIsInNGdWxseVF1YWxpZmllZE5hbWUiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZpbmQiLCJvRW50aXR5VHlwZSIsIl9nZXRGaWVsZFByb21pc2UiLCJGaWVsZFJ1bnRpbWUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwic2lkZUVmZmVjdHNNYXAiLCJfZ2V0RmllbGRTaWRlRWZmZWN0c01hcCIsIm1TaWRlRWZmZWN0c01hcCIsImdldEZpZWxkR3JvdXBJZHMiLCJzVmlld0VudGl0eVNldFNldE5hbWUiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsIm9WaWV3RW50aXR5U2V0IiwiZW50aXR5U2V0cyIsIm9FbnRpdHlTZXQiLCJiSXNJbW1lZGlhdGUiLCJpbmRleE9mIiwic05hbWUiLCJhU2lkZUVmZmVjdFBhcnRzIiwic3BsaXQiLCJzU2lkZUVmZmVjdFBhdGgiLCJsZW5ndGgiLCJvU2lkZUVmZmVjdCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJpbW1lZGlhdGUiLCJzVmlld0VudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwibUZpZWxkUGF0aCIsImdldEFnZ3JlZ2F0aW9uIiwib0N1c3RvbURhdGEiLCJnZXRLZXkiLCJzRmllbGRQYXRoIiwiZ2V0VmFsdWUiLCJtQ29udHJvbEVudGl0eVR5cGUiLCJnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMiLCJzQ29udHJvbE5hbWUiLCJvQ29udHJvbFNpZGVFZmZlY3RzIiwiaW5jbHVkZXMiLCJtRmllbGRTaWRlRWZmZWN0c01hcCIsIm9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwIiwibUZhaWxlZFNpZGVFZmZlY3RzTmFtZSIsInNTaWRlRWZmZWN0Q29udGV4dFBhdGgiLCJhRmFpbGVkU2lkZUVmZmVjdHMiLCJtU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYlN1Y2Nlc3MiLCJvRmllbGRCaW5kaW5nIiwiX2dldEJpbmRpbmdGb3JGaWVsZCIsImFGaWVsZFBhdGhzIiwiZ2V0QmluZGluZ3MiLCJzUGF0aCIsInNCaW5kaW5nTmFtZSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiLCJGaW5hbCIsIlByaXZhdGUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXFETUEsOEIsV0FETEMsUUFBUSxDQUFDLDhDQUFELEVBQWlEQywyQkFBakQsQyxVQVNQQyxRQUFRLEU7Ozs7Ozs7OztXQUNGQyxNLEdBRFAsa0JBQ2dCO0FBQ2YsV0FBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtBQUNBLFdBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtBQUNBLFdBQUtNLG9CQUFMLEdBQTZCLEtBQUtILGNBQU4sQ0FBNkJJLHFCQUE3QixFQUE1QjtBQUNBLFdBQUtDLGlCQUFMLEdBQXlCLEVBQXpCO0FBQ0EsV0FBS0MseUJBQUwsR0FBaUMsSUFBSUMsR0FBSixFQUFqQztBQUNBLFdBQUtDLG1CQUFMLEdBQTJCLEVBQTNC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Q0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNTd0gsbUIsR0FBUiw2QkFBNEI5RSxNQUE1QixFQUEyRDtBQUMxRCxVQUFJa0YsWUFBWSxHQUFHLE9BQW5COztBQUNBLFVBQUlsRixNQUFNLENBQUNWLEdBQVAsQ0FBVyxnQkFBWCxDQUFKLEVBQWtDO0FBQ2pDNEYsUUFBQUEsWUFBWSxHQUFHLFVBQWY7QUFDQSxPQUZELE1BRU8sSUFBSWxGLE1BQU0sQ0FBQ1YsR0FBUCxDQUFXLDZCQUFYLENBQUosRUFBK0M7QUFDckQ0RixRQUFBQSxZQUFZLEdBQUcsV0FBZjtBQUNBOztBQUNELGFBQU9sRixNQUFNLENBQUNXLFVBQVAsQ0FBa0J1RSxZQUFsQixDQUFQO0FBQ0EsSzs7O0lBNW5CMkNDLG1CLDZOQXdCM0NDLE0sRUFDQUMsSyxpTEFZQUQsTSxFQUNBQyxLLDZLQWlCQUQsTSxFQUNBQyxLLHdLQTZDQUQsTSxFQUNBQyxLLDRLQWtGQUQsTSxFQUNBQyxLLDZLQVdBRCxNLEVBQ0FDLEssMEtBY0FELE0sRUFDQUMsSywyS0FnQ0FELE0sRUFDQUMsSyw4S0FrQkFDLE8sRUFDQUQsSywrS0E4R0FDLE8sRUFDQUQsSztTQXdRYW5NLDhCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGFcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSwgUHVibGljLCBGaW5hbCwgUHJpdmF0ZSB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHtcblx0U2lkZUVmZmVjdHNUeXBlLFxuXHRDb250cm9sU2lkZUVmZmVjdHNUeXBlLFxuXHRPRGF0YVNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgRmllbGRSdW50aW1lIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGRcIjtcbmltcG9ydCB7IENvbnZlcnRlck91dHB1dCwgUHJvcGVydHlQYXRoLCBFbnRpdHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcblxudHlwZSBGaWVsZENvbnRyb2wgPSBDb250cm9sICYge1xuXHRnZXRGaWVsZEhlbHAoKTogc3RyaW5nO1xuXHRnZXRGaWVsZEdyb3VwSWRzKCk6IHN0cmluZ1tdO1xufTtcblxudHlwZSBGaWVsZEV2ZW50UHJvcGVydHlUeXBlID0ge1xuXHRwcm9taXNlOiBQcm9taXNlPGFueT47XG5cdGZpZWxkOiBGaWVsZENvbnRyb2w7XG5cdHNpZGVFZmZlY3RzTWFwOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0aW1tZWRpYXRlPzogYm9vbGVhbjtcblx0Y29udGV4dDogQ29udGV4dDtcblx0c2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZTtcblx0cHJldmlvdXNseUZhaWxlZD86IGJvb2xlYW47XG59O1xuXG50eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdHNUeXBlW10+O1xuXG50eXBlIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSA9IHtcblx0cHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXHRzaWRlRWZmZWN0UHJvcGVydHk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZTtcblx0cHJvY2Vzc1N0YXJ0ZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZEdyb3VwUXVldWVNYXBUeXBlID0ge1xuXHRbc2lkZUVmZmVjdE5hbWU6IHN0cmluZ106IHtcblx0XHRbY29udGV4dFBhdGg6IHN0cmluZ106IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZTtcblx0fTtcbn07XG5cbkBVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlNpZGVFZmZlY3RzXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9tRmllbGRHcm91cFF1ZXVlITogRmllbGRHcm91cFF1ZXVlTWFwVHlwZTtcblx0cHJpdmF0ZSBfYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlITogU2V0PHN0cmluZz47XG5cdHByaXZhdGUgX29TaWRlRWZmZWN0c1NlcnZpY2UhOiBhbnk7XG5cdHByaXZhdGUgX21GYWlsZWRTaWRlRWZmZWN0cyE6IEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSAodGhpcyBhcyBhbnkpLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWUgPSB7fTtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUgPSBuZXcgU2V0KCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgcmVjb3JkZWQgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cygpOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0cmV0dXJuIHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSB3b3JrZmxvdyBmb3IgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBUaGUgZm9sbG93aW5nIHNjZW5hcmlvcyBhcmUgbWFuYWdlZDpcblx0ICogIC0gRXhlY3V0ZTogdHJpZ2dlcnMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGlmIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZXZlbnQgaXMgZnVsZmlsbGVkXG5cdCAqICAtIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaGFuZGxlRmllbGRDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgZXZlbnQgdGhhdCBjb21lcyBmcm9tIGEgZmllbGQgY2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Qocylcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBoYW5kbGVGaWVsZENoYW5nZShvRXZlbnQ6IEV2ZW50LCBvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55Pik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbUV2ZW50RmllbGRQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudCksXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IHRoaXMuX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRtRXZlbnRGaWVsZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlXG5cdFx0XHQpO1xuXG5cdFx0bGV0IGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm1hcChtU2lkZUVmZmVjdHNQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMobVNpZGVFZmZlY3RzUHJvcGVydHkuc2lkZUVmZmVjdHMsIG1TaWRlRWZmZWN0c1Byb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH0pIHx8IFtdXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdGlmIChiSXNJbW1lZGlhdGVUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkIFNpZGVFZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU2lkZUVmZmVjdHMgaGF2ZSBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgcHJlUmVxdWlzaXRlIHZhbGlkYXRpb24gZmFpbHMgc28gd2UgbmVlZFxuXHRcdFx0XHRcdCAqIHRvIGtlZXAgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBhcyBGYWlsZWQgcmVxdWVzdCAodG8gYmUgcmV0cmlnZ2VyIG9uIG5leHQgY2hhbmdlKVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0LmZpbHRlcihtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT4gbUltbWVkaWF0ZVNpZGVFZmZlY3RzLnByZXZpb3VzbHlGYWlsZWQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT5cblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMobUltbWVkaWF0ZVNpZGVFZmZlY3RzLnNpZGVFZmZlY3RzLCBtSW1tZWRpYXRlU2lkZUVmZmVjdHMuY29udGV4dClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRHcm91cENoYW5nZShvRXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGVbXSA9IFtdLFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImZpZWxkR3JvdXBJZHNcIik7XG5cblx0XHRjb25zdCBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2UgPSBmdW5jdGlvbihvRGVmZXJyZWRTaWRlRWZmZWN0OiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpIHtcblx0XHRcdGxldCBiSXNSZXF1ZXN0c1RyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eSA9IG9EZWZlcnJlZFNpZGVFZmZlY3Quc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoYXQuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhhdC5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwob0RlZmVycmVkU2lkZUVmZmVjdC5wcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YklzUmVxdWVzdHNUcmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly9EZWZlcnJlZCBTaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBhbGwgc291cmNlUHJvcGVydGllcyBoYXZlIG5vIHJlZ2lzdGVyZWQgZmFpbHVyZS5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXSkuZXZlcnkoc291cmNlUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc291cmNlUHJvcGVydHkudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNJZCA9IHRoYXQuX2dlbmVyYXRlU3RhdHVzSW5kZXgobUVudGl0eVR5cGUsIHNvdXJjZVByb3BlcnR5LnZhbHVlLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICF0aGF0Ll9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuaGFzKHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLCBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdFx0aWYgKGJJc1JlcXVlc3RzVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCBcIiArIHNDb250ZXh0UGF0aCwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZVtvU2lkZUVmZmVjdFByb3BlcnR5Lm5hbWVdW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKHNGaWVsZEdyb3VwSWQgPT4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBzdHJpbmcgXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiBpcyBhZGRlZCB0byB0aGUgU2lkZUVmZmVjdHMgbmFtZSBkdXJpbmcgdGVtcGxhdGluZyB0byBrbm93XG5cdFx0XHQgKiBpZiB0aGlzIFNpZGVFZmZlY3RzIG11c3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgcmVxdWVzdGVkIChvbiBmaWVsZCBjaGFuZ2UpIG9yIG11c3Rcblx0XHRcdCAqIGJlIGRlZmVycmVkIChvbiBmaWVsZCBncm91cCBmb2N1cyBvdXQpXG5cdFx0XHQgKlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzU2lkZUVmZmVjdE5hbWU6IHN0cmluZyA9IHNGaWVsZEdyb3VwSWQucmVwbGFjZShcIiQkSW1tZWRpYXRlUmVxdWVzdFwiLCBcIlwiKTtcblx0XHRcdGNvbnN0IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cyA9IHRoYXQuX21GaWVsZEdyb3VwUXVldWU/LltzU2lkZUVmZmVjdE5hbWVdO1xuXHRcdFx0aWYgKG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpLmZvckVhY2goc0NvbnRleHRQYXRoID0+IHtcblx0XHRcdFx0XHRjb25zdCBvRGVmZXJyZWRTaWRlRWZmZWN0ID0gbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0aWYgKCFvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkKSB7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLnB1c2gob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLm1hcChvRGVmZXJyZWRTaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0cmV0dXJuIGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZShvRGVmZXJyZWRTaWRlRWZmZWN0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGFkZENvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZSwgb1NpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBxdWV1ZSBjb250YWluaW5nIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzKCk6IHZvaWQge1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGZSZXNvbHZlcjogYW55LCBmUmVqZWN0b3I6IGFueTtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0ZlJlc29sdmVyID0gcmVzb2x2ZTtcblx0XHRcdGZSZWplY3RvciA9IHJlamVjdDtcblx0XHR9KTtcblx0XHRjb25zdCBhVGFyZ2V0czogYW55W10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKSxcblx0XHRcdHNUcmlnZ2VyQWN0aW9uOiBTdHJpbmcgfCB1bmRlZmluZWQgPSAob1NpZGVFZmZlY3RzIGFzIE9EYXRhU2lkZUVmZmVjdHNUeXBlKS5UcmlnZ2VyQWN0aW9uO1xuXG5cdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9Db250ZXh0KTtcblx0XHR9XG5cblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlXG5cdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dClcblx0XHRcdC50aGVuKCgpID0+IGZSZXNvbHZlcigpKVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9hZGRGYWlsZWRTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMsIG9Db250ZXh0KTtcblx0XHRcdFx0ZlJlamVjdG9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIFNpZGVFZmZlY3RzIGNyZWF0ZWQgYnkgYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbCBTQVBVSTUgQ29udHJvbFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhvQ29udHJvbDogQ29udHJvbCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250cm9sSWQgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdFwiKSAmJiBvQ29udHJvbC5nZXRJZCgpO1xuXG5cdFx0aWYgKHNDb250cm9sSWQpIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UucmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzXG5cdCAqIFRoZSBTaWRlRWZmZWN0cyB3aWxsIGJlIHJldHJpZ2dlcmVkIG9uIHRoZSBuZXh0IGNoYW5nZSBvbiB0aGUgc2FtZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIGhhdmUgZmFpbGVkXG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0cHJpdmF0ZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUsIG9Db250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoOiBzdHJpbmcgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gPSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXSB8fCBbXTtcblx0XHRjb25zdCBiSXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0uZXZlcnkoXG5cdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHMgPT4gb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSAhPT0gbUZhaWxlZFNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdCk7XG5cdFx0aWYgKGJJc05vdEFscmVhZHlMaXN0ZWQpIHtcblx0XHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLnB1c2gob1NpZGVFZmZlY3RzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZ3JvdXAgdGhhdCBpcyByZXF1aXJlZCBiZWZvcmUgcmVxdWVzdGluZyBTaWRlRWZmZWN0cy5cblx0ICogSWYgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgYW5kIG9ubHkgdGhlIGZpZWxkIHJlcXVpcmVzIHRoZSBTaWRlRWZmZWN0cyBvbiB0aGlzIGNvbnRleHQsIHRoZSBTaWRlRWZmZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZVxuXHQgKiBTaWRlRWZmZWN0cyBxdWV1ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUZpZWxkR3JvdXBQcm9taXNlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgcHJvcGVydGllc1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIHRvIGJlIHVzZWQgZm9yIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXM6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXG5cdFx0bGV0IGJQcm9taXNlU3VjY2VzcyA9IHRydWU7XG5cdFx0cmV0dXJuIG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGJQcm9taXNlU3VjY2VzcyA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gYlByb21pc2VTdWNjZXNzO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIE5lZWQgdG8gc3RvcmUgdGhlIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhpcyBmaWVsZCBmb3IgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogc2luY2UgYWxsIFNvdXJjZVByb3BlcnRpZXMgZm9yIHRoaXMga2luZCBvZiBTaWRlRWZmZWN0cyBtdXN0IGJlIHZhbGlkXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGF0Ll9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZCwgYlByb21pc2VTdWNjZXNzKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgaW1tZWRpYXRlIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXM6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLnByb21pc2U7XG5cdFx0cmV0dXJuIG9Qcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIElmIHRoZSBmaWVsZCBnZXRzIGEgRmllbGRIZWxwZXIsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBhbGwgZmllbGRzIGNoYW5nZWQgYnkgdGhpcyBGaWVsZEhlbHBlciBoYXZlIGJlZW4gc2V0LlxuXHRcdFx0ICogVG8gYWNoaWV2ZSB0aGlzLCB3ZSBlbnN1cmUgdGhhdCBhbGwgcmVsYXRlZCBiaW5kaW5ncyBoYXZlIGJlZW4gcmVzb2x2ZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhpcyByZXNvbHV0aW9uIHByb2Nlc3MgaXMgbm90IG1hbmFnZWQgYnkgdGhlIEZpZWxkIEV2ZW50IFByb21pc2UsIHNvIGZvciBmYXN0IHVzZXIgYWN0aW9ucyAobGlrZSBhdXRvbWF0aW9uKSBpdCBjYW4gbG9jayB0aGUgbW9kZWxcblx0XHRcdCAqIGFuZCBubyByZXF1ZXN0IGNhbiBiZSBleGVjdXRlZC5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgb0ZpZWxkID0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLmZpZWxkO1xuXHRcdFx0Y29uc3Qgc0ZpZWxkSGVscGVySWQgPSBvRmllbGQuZ2V0RmllbGRIZWxwICYmIG9GaWVsZC5nZXRGaWVsZEhlbHAoKTtcblx0XHRcdGlmIChzRmllbGRIZWxwZXJJZCkge1xuXHRcdFx0XHRjb25zdCBvRmlsdGVySGVscDogYW55ID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKHNGaWVsZEhlbHBlcklkKTtcblx0XHRcdFx0aWYgKG9GaWx0ZXJIZWxwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0KG9GaWx0ZXJIZWxwLmdldE91dFBhcmFtZXRlcnMoKSBhcyBhbnlbXSkubWFwKG9PdXRQYXJhbWV0ZXIgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZyA9IG9PdXRQYXJhbWV0ZXIuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBvQmluZGluZy5yZXF1ZXN0VmFsdWUoKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW10pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZVN0YXR1c0luZGV4XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogVGhlIGNvcnJlY3Qgb25lIG11c3QgaGF2ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXIgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2VGaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NpZGVFZmZlY3RFbnRpdHlUeXBlIFRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgU2lkZUVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTQVBVSTUgQ29udGV4dFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvU291cmNlRmllbGQ6IEZpZWxkQ29udHJvbCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvU291cmNlRmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRsZXQgb0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IG9CaW5kaW5nQ29udGV4dCxcblx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblxuXHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCk7XG5cdFx0XHRpZiAob0NvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSAob0NvbnRleHRGb3JTaWRlRWZmZWN0cyBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdFx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvQ29udGV4dEZvclNpZGVFZmZlY3RzIHx8IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIEVudGl0eVR5cGUgYmFzZWQgb24gaXRzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0Z1bGx5UXVhbGlmaWVkTmFtZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIGVudGl0eSB0eXBlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRFbnRpdHlUeXBlRnJvbUZRTihzRnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9ICh0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpIGFzIENvbnZlcnRlck91dHB1dCkuZW50aXR5VHlwZXMuZmluZChvRW50aXR5VHlwZSA9PiB7XG5cdFx0XHRyZXR1cm4gb0VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lID09PSBzRnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdH0pO1xuXHRcdHJldHVybiBtRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9taXNlIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBTaWRlRWZmZWN0cyBwcm9jZXNzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IEZpZWxkIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBGaWVsZCBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb21pc2Uob0V2ZW50OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgcHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRpZiAoIUZpZWxkUnVudGltZS5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eSkge1xuXHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZpZWxkIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb3BlcnRpZXNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gRmllbGQgcHJvcGVydGllcyAoZXZlbnQgY2hhbmdlIHByb21pc2UsIGZpZWxkLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIHRoaXMgZmllbGQpXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50OiBFdmVudCk6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUge1xuXHRcdGNvbnN0IG9GaWVsZDogRmllbGRDb250cm9sID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIEZpZWxkQ29udHJvbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9taXNlOiB0aGlzLl9nZXRGaWVsZFByb21pc2Uob0V2ZW50KSxcblx0XHRcdGZpZWxkOiBvRmllbGQsXG5cdFx0XHRzaWRlRWZmZWN0c01hcDogdGhpcy5fZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXBcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9LFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVNldHMuZmluZChvRW50aXR5U2V0ID0+IHtcblx0XHRcdFx0cmV0dXJuIG9FbnRpdHlTZXQubmFtZSA9PT0gc1ZpZXdFbnRpdHlTZXRTZXROYW1lO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdGNvbnN0IGJJc0ltbWVkaWF0ZTogYm9vbGVhbiA9IHNGaWVsZEdyb3VwSWQuaW5kZXhPZihcIiQkSW1tZWRpYXRlUmVxdWVzdFwiKSAhPT0gLTEsXG5cdFx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRcdGFTaWRlRWZmZWN0UGFydHM6IHN0cmluZ1tdID0gc05hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyA9IGFTaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID1cblx0XHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGUgK1xuXHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0c1wiICtcblx0XHRcdFx0XHQoYVNpZGVFZmZlY3RQYXJ0cy5sZW5ndGggPT09IDIgPyBcIiNcIiArIGFTaWRlRWZmZWN0UGFydHNbMV0gOiBcIlwiKSxcblx0XHRcdFx0b1NpZGVFZmZlY3Q6IFNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzU2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bXG5cdFx0XHRcdFx0c1NpZGVFZmZlY3RQYXRoXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZTogYklzSW1tZWRpYXRlLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly9TaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHNWaWV3RW50aXR5U2V0U2V0TmFtZSAmJiBvVmlld0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgc1ZpZXdFbnRpdHlUeXBlID0gb1ZpZXdFbnRpdHlTZXQuZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdG1GaWVsZFBhdGg6IGFueSA9IChvRmllbGQuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21EYXRhXCIpIGFzIGFueVtdKS5maW5kKG9DdXN0b21EYXRhID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzVmlld0VudGl0eVR5cGUpO1xuXG5cdFx0XHRpZiAobUZpZWxkUGF0aCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzRmllbGRQYXRoID0gbUZpZWxkUGF0aC5nZXRWYWx1ZSgpLnJlcGxhY2UoXCIvXCIgKyBzVmlld0VudGl0eVNldFNldE5hbWUgKyBcIi9cIiwgXCJcIiksXG5cdFx0XHRcdFx0bUNvbnRyb2xFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRzVmlld0VudGl0eVR5cGVcblx0XHRcdFx0XHQpIGFzIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnk7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db250cm9sRW50aXR5VHlwZSkuZm9yRWFjaChzQ29udHJvbE5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmICgob0NvbnRyb2xTaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhzRmllbGRQYXRoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc05hbWUgPSBzQ29udHJvbE5hbWUgKyBcIjo6XCIgKyBzVmlld0VudGl0eVR5cGU7XG5cdFx0XHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzTmFtZSxcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb0NvbnRyb2xTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogb0NvbnRleHRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1TaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB3aXRoIHJlbGF0ZWQgY2hhbmdlcyB0byBhIGZpZWxkXG5cdCAqIExpc3Q6IGdldHMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzXG5cdCAqIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgZXZlbnQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9ICBBcnJheSBvZiBpbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSxcblx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55PlxuXHQpOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSB7XG5cdFx0Y29uc3QgbUZpZWxkU2lkZUVmZmVjdHNNYXAgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuc2lkZUVmZmVjdHNNYXAsXG5cdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCA9IHRoaXMuX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKSwgLy8gUHJvbWlzZSBtYW5hZ2luZyBGaWVsZEdyb3VwIHJlcXVlc3RzIGlmIEZpZWxkIHByb21pc2UgZmFpbHNcblx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWU6IGFueSA9IHt9LFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSBbXTtcblxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlID0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRPYmplY3Qua2V5cyhtRmllbGRTaWRlRWZmZWN0c01hcCkuZm9yRWFjaChzU2lkZUVmZmVjdE5hbWUgPT4ge1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eTogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gbUZpZWxkU2lkZUVmZmVjdHNNYXBbc1NpZGVFZmZlY3ROYW1lXSxcblx0XHRcdFx0c1NpZGVFZmZlY3RDb250ZXh0UGF0aCA9IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgZm9yIHRoaXMgY29udGV4dFxuXHRcdFx0aWYgKGFGYWlsZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0ge307XG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cy5mb3JFYWNoKG1GYWlsZWRTaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXVttRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRydWU7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHByZXZpb3VzbHlGYWlsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogbUZhaWxlZFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9TaWRlRWZmZWN0UHJvcGVydHkuaW1tZWRpYXRlKSB7XG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlbnQgcHJvbWlzZSB2YWxpZGF0aW9uXG5cdFx0XHRcdGlmICghbUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXT8uW29TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNvbnRleHQ6IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBZGQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdG8gdGhlIHJlbGF0ZWQgZGljdGlvbmFyeVxuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gfHwge307XG5cdFx0XHRcdGNvbnN0IG1TaWRlRWZmZWN0Q29udGV4dFBhdGggPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gfHwge1xuXHRcdFx0XHRcdHByb21pc2VzOiBbXSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0UHJvcGVydHk6IG9TaWRlRWZmZWN0UHJvcGVydHksXG5cdFx0XHRcdFx0cHJvY2Vzc1N0YXJ0ZWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHRcdG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMgPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoLnByb21pc2VzLmNvbmNhdChbXG5cdFx0XHRcdFx0b0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAsXG5cdFx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgYXMgUHJvbWlzZTxhbnk+XG5cdFx0XHRcdF0pO1xuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG9GaWVsZDogRmllbGRDb250cm9sLCBiU3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9GaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdC8vIFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBmaWVsZFxuXHRcdFx0Y29uc3Qgb0ZpZWxkQmluZGluZzogYW55ID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAob0ZpZWxkQmluZGluZy5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMge0JpbmRpbmd9ICBCaW5kaW5nIHRvIHRoZSB2YWx1ZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZDogRmllbGRDb250cm9sKTogQmluZGluZyB7XG5cdFx0bGV0IHNCaW5kaW5nTmFtZSA9IFwidmFsdWVcIjtcblx0XHRpZiAob0ZpZWxkLmlzQShcInNhcC5tLkNoZWNrQm94XCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInNlbGVjdGVkXCI7XG5cdFx0fSBlbHNlIGlmIChvRmllbGQuaXNBKFwic2FwLnVpLnVuaWZpZWQuRmlsZVVwbG9hZGVyXCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInVwbG9hZFVybFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpZWxkLmdldEJpbmRpbmcoc0JpbmRpbmdOYW1lKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=