@sapui5/sap.fe.core 1.102.0 → 1.103.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 (311) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +62 -26
  4. package/src/sap/fe/core/AppComponent.ts +56 -40
  5. package/src/sap/fe/core/AppStateHandler.js +10 -10
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +236 -109
  10. package/src/sap/fe/core/CommonUtils.ts +252 -136
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +8 -8
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
  26. package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
  27. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  28. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  29. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
  30. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
  31. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
  32. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
  33. package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
  34. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
  35. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  36. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  37. package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
  38. package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  47. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  49. package/src/sap/fe/core/controllerextensions/Share.js +22 -22
  50. package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  60. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  62. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
  69. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  70. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
  75. package/src/sap/fe/core/controls/Any.js +9 -5
  76. package/src/sap/fe/core/controls/Any.ts +10 -4
  77. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  78. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  81. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  82. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  83. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  84. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  85. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  89. package/src/sap/fe/core/controls/FileWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
  91. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  92. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  93. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  94. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  95. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  96. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  97. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  98. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  99. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  100. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  101. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  102. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
  103. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
  104. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  105. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  106. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  107. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  108. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  109. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  112. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  113. package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
  114. package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
  115. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  116. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  117. package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
  118. package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
  119. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  120. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  121. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  122. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  123. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
  124. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  125. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  126. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  127. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  128. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
  129. package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
  130. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  131. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  132. package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
  133. package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  135. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  137. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
  138. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  139. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  140. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  141. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  142. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  143. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  144. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
  145. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
  146. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  147. package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
  148. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  150. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  152. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  153. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  154. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  155. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  156. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  157. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  158. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  159. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  160. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  161. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  162. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  163. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  164. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  165. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  166. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  167. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  168. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  169. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  170. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  171. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  172. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  173. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  174. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  175. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  176. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  177. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  178. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  179. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  180. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  181. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  182. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  183. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
  184. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  185. package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
  186. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  187. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  188. package/src/sap/fe/core/helpers/EditState.js +1 -6
  189. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  190. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  191. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  192. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  194. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  195. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  196. package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
  197. package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
  198. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  199. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  200. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  201. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  202. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  203. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  204. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  205. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  206. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  207. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  208. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  209. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  210. package/src/sap/fe/core/library.js +42 -3
  211. package/src/sap/fe/core/library.ts +38 -0
  212. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  213. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  214. package/src/sap/fe/core/messagebundle.properties +49 -35
  215. package/src/sap/fe/core/messagebundle_ar.properties +13 -5
  216. package/src/sap/fe/core/messagebundle_bg.properties +13 -5
  217. package/src/sap/fe/core/messagebundle_ca.properties +13 -5
  218. package/src/sap/fe/core/messagebundle_cs.properties +13 -5
  219. package/src/sap/fe/core/messagebundle_cy.properties +14 -6
  220. package/src/sap/fe/core/messagebundle_da.properties +13 -5
  221. package/src/sap/fe/core/messagebundle_de.properties +15 -7
  222. package/src/sap/fe/core/messagebundle_el.properties +14 -6
  223. package/src/sap/fe/core/messagebundle_en.properties +9 -1
  224. package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
  225. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
  226. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
  227. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
  228. package/src/sap/fe/core/messagebundle_es.properties +13 -5
  229. package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
  230. package/src/sap/fe/core/messagebundle_et.properties +13 -5
  231. package/src/sap/fe/core/messagebundle_fi.properties +14 -6
  232. package/src/sap/fe/core/messagebundle_fr.properties +14 -6
  233. package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
  234. package/src/sap/fe/core/messagebundle_hi.properties +14 -6
  235. package/src/sap/fe/core/messagebundle_hr.properties +14 -6
  236. package/src/sap/fe/core/messagebundle_hu.properties +13 -5
  237. package/src/sap/fe/core/messagebundle_id.properties +13 -5
  238. package/src/sap/fe/core/messagebundle_it.properties +33 -25
  239. package/src/sap/fe/core/messagebundle_iw.properties +13 -5
  240. package/src/sap/fe/core/messagebundle_ja.properties +14 -6
  241. package/src/sap/fe/core/messagebundle_kk.properties +13 -5
  242. package/src/sap/fe/core/messagebundle_ko.properties +13 -5
  243. package/src/sap/fe/core/messagebundle_lt.properties +13 -5
  244. package/src/sap/fe/core/messagebundle_lv.properties +14 -6
  245. package/src/sap/fe/core/messagebundle_ms.properties +13 -5
  246. package/src/sap/fe/core/messagebundle_nl.properties +13 -5
  247. package/src/sap/fe/core/messagebundle_no.properties +13 -5
  248. package/src/sap/fe/core/messagebundle_pl.properties +13 -5
  249. package/src/sap/fe/core/messagebundle_pt.properties +13 -5
  250. package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
  251. package/src/sap/fe/core/messagebundle_ro.properties +13 -5
  252. package/src/sap/fe/core/messagebundle_ru.properties +13 -5
  253. package/src/sap/fe/core/messagebundle_sh.properties +13 -5
  254. package/src/sap/fe/core/messagebundle_sk.properties +13 -5
  255. package/src/sap/fe/core/messagebundle_sl.properties +17 -9
  256. package/src/sap/fe/core/messagebundle_sv.properties +14 -6
  257. package/src/sap/fe/core/messagebundle_th.properties +13 -5
  258. package/src/sap/fe/core/messagebundle_tr.properties +13 -5
  259. package/src/sap/fe/core/messagebundle_uk.properties +13 -5
  260. package/src/sap/fe/core/messagebundle_vi.properties +13 -5
  261. package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
  262. package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
  263. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  269. package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
  270. package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
  271. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
  276. package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  278. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
  281. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  282. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  285. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  288. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  289. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  290. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  291. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  292. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  294. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  295. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  296. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  297. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  298. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  299. package/src/sap/fe/core/templating/FilterHelper.js +10 -9
  300. package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
  301. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  302. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  303. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  304. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  305. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  306. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  307. package/src/sap/fe/core/templating/UIFormatters.js +148 -93
  308. package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
  309. package/src/sap/fe/core/type/Email.js +2 -2
  310. package/src/sap/fe/core/type/Email.ts +2 -2
  311. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -10,9 +10,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
10
10
  * Called for property change in the transient context.
11
11
  *
12
12
  * @function
13
- * @param {any} newValue New value of the property.
14
- * @param {string} dataProperty Final context returned after the paginator action
15
- * @param {string} mdcFieldId Final context returned after the paginator action
13
+ * @param newValue New value of the property.
14
+ * @param dataProperty Final context returned after the paginator action
15
+ * @param mdcFieldId Final context returned after the paginator action
16
16
  */
17
17
  contextPropertyChange: function (newValue, dataProperty, mdcFieldId) {
18
18
  // Called for
@@ -21,7 +21,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
21
21
  var source = Core.byId(mdcFieldId);
22
22
  var transCtx = source && source.getBindingContext();
23
23
  var fieldInfoModel = source && source.getModel("fieldsInfo");
24
- var values = fieldInfoModel.getProperty("/values/" + dataProperty) || fieldInfoModel.getProperty("/unitData/" + dataProperty) || [];
24
+ var values = fieldInfoModel.getProperty("/values/".concat(dataProperty)) || fieldInfoModel.getProperty("/unitData/".concat(dataProperty)) || [];
25
25
 
26
26
  if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
27
27
  MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, dataProperty);
@@ -42,8 +42,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
42
42
  * This is not called on change of the dropdown as we are using a custom MassEditSelect control and not general Select.
43
43
  *
44
44
  * @function
45
- * @param {object} event Event object for change.
46
- * @param {string} propertyName Property path.
45
+ * @param event Event object for change.
46
+ * @param propertyName Property path.
47
47
  */
48
48
  handleMDCFieldChange: function (event, propertyName) {
49
49
  // Called for
@@ -57,7 +57,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
57
57
  }
58
58
 
59
59
  changePromise.then(MassEditHandlers._updateSelectKeyForMDCFieldChange.bind(MassEditHandlers, source, propertyName)).catch(function (err) {
60
- Log.warning("VHD selection couldn't be populated in the mass edit field." + err);
60
+ Log.warning("VHD selection couldn't be populated in the mass edit field.".concat(err));
61
61
  });
62
62
  },
63
63
 
@@ -65,7 +65,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
65
65
  * Called for selection change through the drop down.
66
66
  *
67
67
  * @function
68
- * @param {object} event Event object for change.
68
+ * @param event Event object for change.
69
69
  */
70
70
  handleSelectionChange: function (event) {
71
71
  // Called for Manual selection from dropdown(comboBox or select)
@@ -100,14 +100,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
100
100
  * Update selections to results and the suggests in drop downs.
101
101
  *
102
102
  * @function
103
- * @param {MDCField} source MDC field that was changed.
104
- * @param {string} propertyName Property path.
105
- * @param {any} value New value.
103
+ * @param source MDC field that was changed.
104
+ * @param propertyName Property path.
105
+ * @param value New value.
106
106
  */
107
107
  _updateSelectKeyForMDCFieldChange: function (source, propertyName, value) {
108
108
  var transCtx = source && source.getBindingContext();
109
109
  var fieldInfoModel = source && source.getModel("fieldsInfo");
110
- var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
110
+ var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
111
111
 
112
112
  if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
113
113
  MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, propertyName);
@@ -126,10 +126,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
126
126
  * Update suggests for all drop downs with InParameter as the propertyName.
127
127
  *
128
128
  * @function
129
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
130
- * @param {string} propertyName Property path.
131
- * @param {boolean} resetValues Should the values be reset to original state.
132
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
129
+ * @param fieldInfoModel Runtime model with parameters store information.
130
+ * @param propertyName Property path.
131
+ * @param resetValues Should the values be reset to original state.
132
+ * @param keepExistingSelection Should the existing selection before update remain.
133
133
  */
134
134
  _updateSuggestionForFieldsWithInParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
135
135
  var values = fieldInfoModel.getProperty("/values");
@@ -144,15 +144,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
144
144
  * Update suggests for a drop down with InParameter as the srcPropertyName.
145
145
  *
146
146
  * @function
147
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
148
- * @param {string} pathPrefix Path in the runtime model.
149
- * @param {string} srcPropertyName The InParameter Property path.
150
- * @param {boolean} resetValues Should the values be reset to original state.
151
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
152
- * @param {string} propertyName Property path that needs update of suggestions.
147
+ * @param fieldInfoModel Runtime model with parameters store information.
148
+ * @param pathPrefix Path in the runtime model.
149
+ * @param srcPropertyName The InParameter Property path.
150
+ * @param resetValues Should the values be reset to original state.
151
+ * @param keepExistingSelection Should the existing selection before update remain.
152
+ * @param propertyName Property path that needs update of suggestions.
153
153
  */
154
154
  _updateInParameterSuggetions: function (fieldInfoModel, pathPrefix, srcPropertyName, resetValues, keepExistingSelection, propertyName) {
155
- var valueListInfo = fieldInfoModel.getProperty(pathPrefix + propertyName + "/valueListInfo");
155
+ var valueListInfo = fieldInfoModel.getProperty("".concat(pathPrefix + propertyName, "/valueListInfo"));
156
156
 
157
157
  if (valueListInfo && srcPropertyName != propertyName) {
158
158
  var inParameters = valueListInfo.inParameters;
@@ -167,23 +167,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
167
167
  * Update suggests for all OutParameter's drop downs of the propertyName.
168
168
  *
169
169
  * @function
170
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
171
- * @param {string} propertyName Property path.
172
- * @param {boolean} resetValues Should the values be reset to original state.
173
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
170
+ * @param fieldInfoModel Runtime model with parameters store information.
171
+ * @param propertyName Property path.
172
+ * @param resetValues Should the values be reset to original state.
173
+ * @param keepExistingSelection Should the existing selection before update remain.
174
174
  */
175
175
  _updateSuggestionForFieldsWithOutParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
176
- var valueListInfo = fieldInfoModel.getProperty("/values/" + propertyName + "/valueListInfo") || fieldInfoModel.getProperty("/unitData/" + propertyName + "/valueListInfo");
176
+ var valueListInfo = fieldInfoModel.getProperty("/values/".concat(propertyName, "/valueListInfo")) || fieldInfoModel.getProperty("/unitData/".concat(propertyName, "/valueListInfo"));
177
177
 
178
178
  if (valueListInfo && valueListInfo.outParameters) {
179
179
  var outParameters = valueListInfo.outParameters;
180
180
 
181
- MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
181
+ if (outParameters.length && outParameters.length > 0) {
182
+ MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
182
183
 
183
- var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
184
+ var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
184
185
 
185
- if (pathPrefix) {
186
- MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
186
+ if (pathPrefix) {
187
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
188
+ }
187
189
  }
188
190
  }
189
191
  },
@@ -192,10 +194,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
192
194
  * Update suggests for a drop down with InParameter as the srcPropertyName.
193
195
  *
194
196
  * @function
195
- * @param {string} outParameters String arrary of OutParameter property paths.
196
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
197
- * @param {boolean} resetValues Should the values be reset to original state.
198
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
197
+ * @param outParameters String arrary of OutParameter property paths.
198
+ * @param fieldInfoModel Runtime model with parameters store information.
199
+ * @param resetValues Should the values be reset to original state.
200
+ * @param keepExistingSelection Should the existing selection before update remain.
199
201
  */
200
202
  _updateOutParameterSuggetions: function (outParameters, fieldInfoModel, resetValues, keepExistingSelection) {
201
203
  var values = fieldInfoModel.getProperty("/values");
@@ -204,9 +206,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
204
206
  var unitFieldPaths = Object.keys(unitData);
205
207
  outParameters.forEach(function (outParameter) {
206
208
  if (fieldPaths.includes(outParameter)) {
207
- MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/" + outParameter, resetValues, keepExistingSelection);
209
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(outParameter), resetValues, keepExistingSelection);
208
210
  } else if (unitFieldPaths.includes(outParameter)) {
209
- MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/unitData/" + outParameter, resetValues, keepExistingSelection);
211
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/unitData/".concat(outParameter), resetValues, keepExistingSelection);
210
212
  }
211
213
  });
212
214
  },
@@ -215,15 +217,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
215
217
  * Update suggests for a drop down of a field.
216
218
  *
217
219
  * @function
218
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
219
- * @param {string} fieldPathAbsolute Complete runtime property path.
220
- * @param {boolean} resetValues Should the values be reset to original state.
221
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
220
+ * @param fieldInfoModel Runtime model with parameters store information.
221
+ * @param fieldPathAbsolute Complete runtime property path.
222
+ * @param resetValues Should the values be reset to original state.
223
+ * @param keepExistingSelection Should the existing selection before update remain.
222
224
  */
223
225
  _updateFieldPathSuggestions: function (fieldInfoModel, fieldPathAbsolute, resetValues, keepExistingSelection) {
224
226
  var options = fieldInfoModel.getProperty(fieldPathAbsolute);
225
227
  var defaultOptions = options.defaultOptions;
226
- var selectedKey = fieldInfoModel.getProperty(fieldPathAbsolute + "/selectedKey");
228
+ var selectedKey = fieldInfoModel.getProperty("".concat(fieldPathAbsolute, "/selectedKey"));
227
229
  var existingSelection = keepExistingSelection && options.find(function (option) {
228
230
  return option.key === selectedKey;
229
231
  });
@@ -248,7 +250,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
248
250
 
249
251
  if (existingSelection && !options.includes(existingSelection)) {
250
252
  options.push(existingSelection);
251
- fieldInfoModel.setProperty(fieldPathAbsolute + "/selectedKey", selectedKey);
253
+ fieldInfoModel.setProperty("".concat(fieldPathAbsolute, "/selectedKey"), selectedKey);
252
254
  }
253
255
  },
254
256
 
@@ -256,13 +258,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
256
258
  * Update In and Out Parameters in the MED.
257
259
  *
258
260
  * @function
259
- * @param {Context} transCtx The transient context of the MED.
260
- * @param {MDCField} source MDC field.
261
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
262
- * @param {string} propertyName Property path.
261
+ * @param transCtx The transient context of the MED.
262
+ * @param source MDC field.
263
+ * @param fieldInfoModel Runtime model with parameters store information.
264
+ * @param propertyName Property path.
263
265
  */
264
266
  _setValueListInfo: function (transCtx, source, fieldInfoModel, propertyName) {
265
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
267
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
266
268
 
267
269
  if (fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"))) {
268
270
  return;
@@ -299,14 +301,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
299
301
  * Request and update In and Out Parameters in the MED.
300
302
  *
301
303
  * @function
302
- * @param {Context} transCtx The transient context of the MED.
303
- * @param {MDCField} source MDC field.
304
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
305
- * @param {string} propertyName Property path.
304
+ * @param transCtx The transient context of the MED.
305
+ * @param source MDC field.
306
+ * @param fieldInfoModel Runtime model with parameters store information.
307
+ * @param propertyName Property path.
306
308
  */
307
309
  _requestValueList: function (transCtx, source, fieldInfoModel, propertyName) {
308
310
  var metaPath = ModelHelper.getMetaPathForContext(transCtx);
309
- var propertyPath = metaPath && metaPath + "/" + propertyName;
311
+ var propertyPath = metaPath && "".concat(metaPath, "/").concat(propertyName);
310
312
  var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
311
313
  var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
312
314
  var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
@@ -321,7 +323,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
321
323
  ValueListHelper.createVHUIModel(propertyPath, fieldValueHelp);
322
324
  var valueListInfo = ValueListHelper.getValueListInfo(fieldValueHelp, metaModel, propertyPath);
323
325
  valueListInfo.then(function (vLinfo) {
324
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
326
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
325
327
  var info = {
326
328
  inParameters: vLinfo.inParameters.map(function (inParam) {
327
329
  return inParam.getFieldPath();
@@ -344,32 +346,31 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
344
346
  * Get field help control from MDC field.
345
347
  *
346
348
  * @function
347
- * @param {Context} transCtx The transient context of the MED.
348
- * @param {MDCField} source MDC field.
349
+ * @param transCtx The transient context of the MED.
350
+ * @param source MDC field.
349
351
  * @returns Field Help control.
350
352
  */
351
353
  _getValueHelp: function (transCtx, source) {
352
354
  var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
353
355
  var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
354
- var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
356
+ return dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
355
357
  return dependent.getId() === fieldHelp;
356
358
  });
357
- return fieldValueHelp;
358
359
  },
359
360
 
360
361
  /**
361
362
  * Colled on drop down selection of VHD option.
362
363
  *
363
364
  * @function
364
- * @param {MassEditSelect} source Custom Mass Edit Select control.
365
- * @param {string} propertyName Property path.
366
- * @param {string} selectKey Previous key before the VHD was selected.
365
+ * @param source Custom Mass Edit Select control.
366
+ * @param propertyName Property path.
367
+ * @param selectKey Previous key before the VHD was selected.
367
368
  */
368
369
  _onVHSelect: function (source, propertyName, selectKey) {
369
370
  // Called for
370
371
  // 1. VHD selected.
371
372
  var fieldInfoModel = source && source.getModel("fieldsInfo");
372
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
373
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
373
374
  var transCtx = source.getBindingContext();
374
375
 
375
376
  var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source.getParent());
@@ -379,14 +380,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
379
380
  }
380
381
 
381
382
  source.fireValueHelpRequest();
382
- fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", selectKey);
383
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), selectKey);
383
384
  },
384
385
 
385
386
  /**
386
387
  * Gets Property name from selection key.
387
388
  *
388
389
  * @function
389
- * @param {string} key Selection key.
390
+ * @param key Selection key.
390
391
  * @returns Property name.
391
392
  */
392
393
  _getPropertyNameFromKey: function (key) {
@@ -405,23 +406,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
405
406
  * Update selection to Custom Mass Edit Select from MDC field.
406
407
  *
407
408
  * @function
408
- * @param {MDCField} source MDC field.
409
- * @param {string} propertyName Property path.
410
- * @param {string} value Value to update.
411
- * @param {string} fullText Full text to use.
409
+ * @param source MDC field.
410
+ * @param propertyName Property path.
411
+ * @param value Value to update.
412
+ * @param fullText Full text to use.
412
413
  */
413
414
  _updateSelectKey: function (source, propertyName, value, fullText) {
414
415
  // Called for
415
416
  // 1. VHD property change
416
417
  // 2. Out Parameters.
417
418
  // 3. Transient context property change.
418
- var massEditSelect = source.getContent();
419
+ var comboBox = source.getContent();
419
420
 
420
- if (!massEditSelect || !propertyName) {
421
+ if (!comboBox || !propertyName) {
421
422
  return;
422
423
  }
423
424
 
424
- var key = massEditSelect.getSelectedKey();
425
+ var key = comboBox.getSelectedKey();
425
426
 
426
427
  if ((key.startsWith("Default/") || key.startsWith("ClearFieldValue/")) && !value) {
427
428
  return;
@@ -429,8 +430,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
429
430
 
430
431
  var formattedText = MassEditHandlers._valueExists(fullText) ? fullText : value;
431
432
  var fieldInfoModel = source && source.getModel("fieldsInfo");
432
- var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
433
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
433
+ var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
434
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
434
435
  var relatedField = values.find(function (fieldData) {
435
436
  var _fieldData$textInfo;
436
437
 
@@ -446,13 +447,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
446
447
  }
447
448
 
448
449
  if (relatedField.key === key) {
449
- fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
450
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
450
451
  return;
451
452
  }
452
453
 
453
454
  key = relatedField.key;
454
455
  } else if ([undefined, null, ""].indexOf(value) === -1) {
455
- key = propertyName + "/" + value;
456
+ key = "".concat(propertyName, "/").concat(value);
456
457
  var selectionInfo = {
457
458
  text: formattedText,
458
459
  key: key,
@@ -470,20 +471,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
470
471
  values.selectOptions.push(selectionInfo);
471
472
  fieldInfoModel.setProperty(propPath + propertyName, values);
472
473
  } else {
473
- key = "Default/" + propertyName;
474
+ key = "Default/".concat(propertyName);
474
475
  }
475
476
 
476
- fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
477
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
477
478
 
478
- MassEditHandlers._updateResults(massEditSelect);
479
+ MassEditHandlers._updateResults(comboBox);
479
480
  },
480
481
 
481
482
  /**
482
483
  * Get Value from Drop down.
483
484
  *
484
485
  * @function
485
- * @param {Control} source Drop down control.
486
- * @returns {string} Value of selection.
486
+ * @param source Drop down control.
487
+ * @returns Value of selection.
487
488
  */
488
489
  _getValue: function (source) {
489
490
  var _getSelectedItem;
@@ -498,7 +499,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
498
499
  value = 0;
499
500
  oSource.setValue(value);
500
501
  } else if (values.inputType === "CheckBox") {
501
- value = null;
502
+ value = false;
502
503
  }
503
504
  }
504
505
 
@@ -512,9 +513,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
512
513
  * Updates selections to runtime model.
513
514
  *
514
515
  * @function
515
- * @param {Control} oSource Drop down control.
516
- * @param {Array} aParams Parts of key in runtime model.
517
- * @param {boolean} updateTransCtx Should transient context be updated with the value.
516
+ * @param oSource Drop down control.
517
+ * @param aParams Parts of key in runtime model.
518
+ * @param updateTransCtx Should transient context be updated with the value.
518
519
  */
519
520
  _updateResults: function (oSource) {
520
521
  var aParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
@@ -552,7 +553,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
552
553
  };
553
554
  } else {
554
555
  var propertyName = aParams.slice(0, -1).join("/");
555
- var propertyValues = fieldsInfoModel.getProperty("/values/" + propertyName) || fieldsInfoModel.getProperty("/unitData/" + propertyName) || [];
556
+ var propertyValues = fieldsInfoModel.getProperty("/values/".concat(propertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
556
557
  var relatedField = (propertyValues || []).find(function (oFieldData) {
557
558
  var _oFieldData$textInfo;
558
559
 
@@ -578,7 +579,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
578
579
  oFieldsInfoData.results.push(oDataObject);
579
580
  }
580
581
 
581
- if (updateTransCtx) {
582
+ if (updateTransCtx && !oDataObject.keyValue.includes("/")) {
582
583
  var transCtx = oSource.getBindingContext();
583
584
 
584
585
  if (aParams[0] === "Default" || aParams[0] === "ClearFieldValue") {
@@ -591,4 +592,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
591
592
  };
592
593
  return MassEditHandlers;
593
594
  }, false);
594
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImNvbnRleHRQcm9wZXJ0eUNoYW5nZSIsIm5ld1ZhbHVlIiwiZGF0YVByb3BlcnR5IiwibWRjRmllbGRJZCIsInNvdXJjZSIsIkNvcmUiLCJieUlkIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImZpZWxkSW5mb01vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZXMiLCJnZXRQcm9wZXJ0eSIsImlucHV0VHlwZSIsInZhbHVlTGlzdEluZm8iLCJfc2V0VmFsdWVMaXN0SW5mbyIsImlzRGlhbG9nT3BlbiIsImdldFZpc2libGUiLCJfdXBkYXRlU2VsZWN0S2V5IiwiaGFuZGxlTURDRmllbGRDaGFuZ2UiLCJldmVudCIsInByb3BlcnR5TmFtZSIsImdldFNvdXJjZSIsImNoYW5nZVByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJjb21ib0JveCIsImdldENvbnRlbnQiLCJ0aGVuIiwiX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlIiwiYmluZCIsImNhdGNoIiwiZXJyIiwiTG9nIiwid2FybmluZyIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZSIsImtleSIsImdldFNlbGVjdGVkS2V5IiwicGFyYW1zIiwic3BsaXQiLCJwcmV2SXRlbSIsInNlbGVjdEtleSIsImdldEtleSIsInNsaWNlIiwiam9pbiIsIl9vblZIU2VsZWN0IiwiX2dldFByb3BlcnR5TmFtZUZyb21LZXkiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnMiLCJzdGFydHNXaXRoIiwiX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVycyIsIl91cGRhdGVSZXN1bHRzIiwidmFsdWUiLCJmb3JtYXR0ZWRWYWx1ZSIsImdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSIsInJlc2V0VmFsdWVzIiwia2VlcEV4aXN0aW5nU2VsZWN0aW9uIiwidW5pdERhdGEiLCJmaWVsZFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsInVuaXRGaWVsZFBhdGhzIiwiZm9yRWFjaCIsIl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMiLCJwYXRoUHJlZml4Iiwic3JjUHJvcGVydHlOYW1lIiwiaW5QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMiLCJvdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnMiLCJvdXRQYXJhbWV0ZXIiLCJmaWVsZFBhdGhBYnNvbHV0ZSIsIm9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdGVkS2V5IiwiZXhpc3RpbmdTZWxlY3Rpb24iLCJmaW5kIiwib3B0aW9uIiwic2VsZWN0T3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJwdXNoIiwic2VsZWN0T3B0aW9uIiwic2V0UHJvcGVydHkiLCJwcm9wUGF0aCIsImZpZWxkVmFsdWVIZWxwIiwiX2dldFZhbHVlSGVscCIsImdldERpYWxvZ0NvbnRlbnQiLCJnZXRUYWJsZSIsImdldEluUGFyYW1ldGVycyIsIm1hcCIsImluUGFyYW0iLCJnZXRGaWVsZFBhdGgiLCJvdXRQYXJhbSIsImluZm8iLCJfcmVxdWVzdFZhbHVlTGlzdCIsIm1ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJkZXBlbmRlbnRzIiwiZ2V0RGVwZW5kZW50cyIsImZpZWxkSGVscCIsImdldEZpZWxkSGVscCIsImRlcGVuZGVudCIsImdldElkIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsIm1hc3NFZGl0U2VsZWN0IiwiZm9ybWF0dGVkVGV4dCIsIl92YWx1ZUV4aXN0cyIsInJlbGF0ZWRGaWVsZCIsImZpZWxkRGF0YSIsInRleHRJbmZvIiwidGV4dCIsImRlc2NyaXB0aW9uUGF0aCIsImRlc2NyaXB0aW9uIiwiZ2V0QWRkaXRpb25hbFZhbHVlIiwidW5kZWZpbmVkIiwic2VsZWN0aW9uSW5mbyIsInRleHRBcnJhbmdlbWVudCIsImdldERpc3BsYXkiLCJnZXRWYWx1ZSIsInZhbHVlUGF0aCIsIl9nZXRWYWx1ZSIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImdldFNlbGVjdGVkSXRlbSIsImdldFRleHQiLCJfZ2V0VmFsdWVPbkVtcHR5Iiwib1NvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsInNQcm9wZXJ0eU5hbWUiLCJ1bml0UHJvcGVydHkiLCJzZXRWYWx1ZSIsImFQYXJhbXMiLCJ1cGRhdGVUcmFuc0N0eCIsIm9GaWVsZHNJbmZvRGF0YSIsImdldERhdGEiLCJvRGF0YU9iamVjdCIsImtleVZhbHVlIiwicHJvcGVydHlWYWx1ZXMiLCJvRmllbGREYXRhIiwiYkV4aXN0aW5nRWxlbWVudGluZGV4IiwiaSIsInJlc3VsdHMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFxQkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSxxQkFBcUIsRUFBRSxVQUFVQyxRQUFWLEVBQXlCQyxZQUF6QixFQUErQ0MsVUFBL0MsRUFBbUU7QUFDekY7QUFDQTtBQUNBO0FBRUEsVUFBTUMsTUFBTSxHQUFHQyxJQUFJLENBQUNDLElBQUwsQ0FBVUgsVUFBVixDQUFmO0FBQ0EsVUFBTUksUUFBUSxHQUFHSCxNQUFNLElBQUtBLE1BQU0sQ0FBQ0ksaUJBQVAsRUFBNUI7QUFDQSxVQUFNQyxjQUFjLEdBQUdMLE1BQU0sSUFBS0EsTUFBTSxDQUFDTSxRQUFQLENBQWdCLFlBQWhCLENBQWxDO0FBQ0EsVUFB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TUFBNUMsRUFBb0R5RixDQUFDLEVBQXJELEVBQXlEO0FBQ3hELFlBQUlQLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0JELENBQXhCLEVBQTJCSixRQUEzQixLQUF3Q0QsV0FBVyxDQUFDQyxRQUF4RCxFQUFrRTtBQUNqRUcsVUFBQUEscUJBQXFCLEdBQUdDLENBQXhCO0FBQ0E7QUFDRDs7QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDTixRQUFBQSxlQUFlLENBQUNRLE9BQWhCLENBQXdCRixxQkFBeEIsSUFBaURKLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05GLFFBQUFBLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0IzRSxJQUF4QixDQUE2QnFFLFdBQTdCO0FBQ0E7O0FBQ0QsVUFBSUgsY0FBSixFQUFvQjtBQUNuQixZQUFNM0ksUUFBUSxHQUFHcUksT0FBTyxDQUFDcEksaUJBQVIsRUFBakI7O0FBQ0EsWUFBSXlJLE9BQU8sQ0FBQyxDQUFELENBQVAsS0FBZSxTQUFmLElBQTRCQSxPQUFPLENBQUMsQ0FBRCxDQUFQLEtBQWUsaUJBQS9DLEVBQWtFO0FBQ2pFMUksVUFBQUEsUUFBUSxDQUFDMkUsV0FBVCxDQUFxQm1FLFdBQVcsQ0FBQ0MsUUFBakMsRUFBMkMsSUFBM0M7QUFDQSxTQUZELE1BRU8sSUFBSUQsV0FBSixFQUFpQjtBQUN2QjlJLFVBQUFBLFFBQVEsQ0FBQzJFLFdBQVQsQ0FBcUJtRSxXQUFXLENBQUNDLFFBQWpDLEVBQTJDRCxXQUFXLENBQUNuRyxLQUF2RDtBQUNBO0FBQ0Q7QUFDRDtBQXBtQjRCLEdBQTlCO1NBdW1CZW5ELGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgQ29tYm9Cb3ggZnJvbSBcInNhcC9tL0NvbWJvQm94XCI7XG5pbXBvcnQgU2VsZWN0IGZyb20gXCJzYXAvbS9TZWxlY3RcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgSW5QYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvSW5QYXJhbWV0ZXJcIjtcbmltcG9ydCBPdXRQYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvT3V0UGFyYW1ldGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBkYXRhUHJvcGVydHkpIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgZGF0YVByb3BlcnR5KSB8fCBbXTtcblxuXHRcdGlmICh0cmFuc0N0eCAmJiAodmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhWYWx1ZUhlbHBcIiB8fCB2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFVuaXRcIikgJiYgIXZhbHVlcy52YWx1ZUxpc3RJbmZvKSB7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl9zZXRWYWx1ZUxpc3RJbmZvKHRyYW5zQ3R4LCBzb3VyY2UsIGZpZWxkSW5mb01vZGVsLCBkYXRhUHJvcGVydHkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzRGlhbG9nT3BlbiA9IGZpZWxkSW5mb01vZGVsICYmIGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL2lzT3BlblwiKTtcblx0XHRpZiAoIWlzRGlhbG9nT3BlbiB8fCAhc291cmNlLmdldFZpc2libGUoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIGRhdGFQcm9wZXJ0eSwgbmV3VmFsdWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIGNoYW5nZSBpbiB0aGUgTURDIGZpZWxkLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBvbiBzZWxlY3Rpb24gZG9uZSB0aHJvdWdoIFZIRC5cblx0ICogVGhpcyBpcyBub3QgY2FsbGVkIG9uIGNoYW5nZSBvZiB0aGUgZHJvcGRvd24gYXMgd2UgYXJlIHVzaW5nIGEgY3VzdG9tIE1hc3NFZGl0U2VsZWN0IGNvbnRyb2wgYW5kIG5vdCBnZW5lcmFsIFNlbGVjdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3QgZm9yIGNoYW5nZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0aGFuZGxlTURDRmllbGRDaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgY2hhbmdlUHJvbWlzZSA9IGV2ZW50ICYmIGV2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpO1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNoYW5nZVByb21pc2Vcblx0XHRcdC50aGVuKE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlLmJpbmQoTWFzc0VkaXRIYW5kbGVycywgc291cmNlLCBwcm9wZXJ0eU5hbWUpKVxuXHRcdFx0LmNhdGNoKChlcnI6IGFueSkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZIRCBzZWxlY3Rpb24gY291bGRuJ3QgYmUgcG9wdWxhdGVkIGluIHRoZSBtYXNzIGVkaXQgZmllbGQuXCIgKyBlcnIpO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IChldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKSkgYXMgYW55O1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQgdGhhdCB3YXMgY2hhbmdlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgTmV3IHZhbHVlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlOiBmdW5jdGlvbiAoc291cmNlOiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UgJiYgc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgKHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIikgYXMgSlNPTk1vZGVsKTtcblx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdGZpZWxkUGF0aHMuZm9yRWFjaChcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucy5iaW5kKFxuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLFxuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XCIvdmFsdWVzL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHRcdHVuaXRGaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3VuaXREYXRhL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhQcmVmaXggUGF0aCBpbiB0aGUgcnVudGltZSBtb2RlbC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNyY1Byb3BlcnR5TmFtZSBUaGUgSW5QYXJhbWV0ZXIgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aCB0aGF0IG5lZWRzIHVwZGF0ZSBvZiBzdWdnZXN0aW9ucy5cblx0ICovXG5cdF91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHBhdGhQcmVmaXg6IHN0cmluZyxcblx0XHRzcmNQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW4sXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmdcblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KHBhdGhQcmVmaXggKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpIHx8XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSArIFwiL3ZhbHVlTGlzdEluZm9cIik7XG5cblx0XHRpZiAodmFsdWVMaXN0SW5mbyAmJiB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IG91dFBhcmFtZXRlcnMgPSB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnM7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGNvbnN0IHBhdGhQcmVmaXggPVxuXHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgfHxcblx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdGlmIChwYXRoUHJlZml4KSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBwYXRoUHJlZml4LCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVzZXRWYWx1ZXMgU2hvdWxkIHRoZSB2YWx1ZXMgYmUgcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRvdXRQYXJhbWV0ZXJzOiBzdHJpbmdbXSxcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdG91dFBhcmFtZXRlcnMuZm9yRWFjaCgob3V0UGFyYW1ldGVyOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmIChmaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIFwiL3ZhbHVlcy9cIiArIG91dFBhcmFtZXRlciwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9IGVsc2UgaWYgKHVuaXRGaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoXG5cdFx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFx0XCIvdW5pdERhdGEvXCIgKyBvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdGZpZWxkUGF0aEFic29sdXRlOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCkge1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSk7XG5cdFx0Y29uc3QgZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zLmRlZmF1bHRPcHRpb25zO1xuXHRcdGNvbnN0IHNlbGVjdGVkS2V5ID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUgKyBcIi9zZWxlY3RlZEtleVwiKTtcblx0XHRjb25zdCBleGlzdGluZ1NlbGVjdGlvbiA9IGtlZXBFeGlzdGluZ1NlbGVjdGlvbiAmJiBvcHRpb25zLmZpbmQoKG9wdGlvbjogYW55KSA9PiBvcHRpb24ua2V5ID09PSBzZWxlY3RlZEtleSk7XG5cdFx0aWYgKHJlc2V0VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBzZWxlY3RPcHRpb25zID0gb3B0aW9ucy5zZWxlY3RPcHRpb25zO1xuXHRcdFx0b3B0aW9ucy5sZW5ndGggPSAwO1xuXHRcdFx0ZGVmYXVsdE9wdGlvbnMuZm9yRWFjaCgoZGVmYXVsdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goZGVmYXVsdE9wdGlvbikpO1xuXHRcdFx0c2VsZWN0T3B0aW9ucy5mb3JFYWNoKChzZWxlY3RPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKHNlbGVjdE9wdGlvbikpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0fVxuXG5cdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUsIG9wdGlvbnMpO1xuXG5cdFx0aWYgKGV4aXN0aW5nU2VsZWN0aW9uICYmICFvcHRpb25zLmluY2x1ZGVzKGV4aXN0aW5nU2VsZWN0aW9uKSkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKGV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGZpZWxkUGF0aEFic29sdXRlICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXG5cdFx0aWYgKGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZSk7XG5cdFx0aWYgKGZpZWxkVmFsdWVIZWxwICYmIGZpZWxkVmFsdWVIZWxwLmdldERpYWxvZ0NvbnRlbnQoKS5nZXRUYWJsZSgpKSB7XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlcnMgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0SW5QYXJhbWV0ZXJzKCkgfHwgW10pLm1hcCgoaW5QYXJhbTogSW5QYXJhbWV0ZXIpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IChmaWVsZFZhbHVlSGVscC5nZXRJblBhcmFtZXRlcnMoKSB8fCBbXSkubWFwKChvdXRQYXJhbTogT3V0UGFyYW1ldGVyKSA9PiBvdXRQYXJhbS5nZXRGaWVsZFBhdGgoKSk7XG5cdFx0XHRjb25zdCBpbmZvOiBhbnkgPSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyczogaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbTogYW55KSA9PiBpblBhcmFtLmdldEZpZWxkUGF0aCgpKSxcblx0XHRcdFx0b3V0UGFyYW1ldGVyczogb3V0UGFyYW1ldGVycy5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmdldEZpZWxkUGF0aCgpKVxuXHRcdFx0fTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWAsIGZhbHNlLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udGV4dH0gdHJhbnNDdHggVGhlIHRyYW5zaWVudCBjb250ZXh0IG9mIHRoZSBNRUQuXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIG1ldGFQYXRoICsgXCIvXCIgKyBwcm9wZXJ0eU5hbWUpIGFzIHN0cmluZztcblx0XHRjb25zdCBkZXBlbmRlbnRzID0gKHNvdXJjZSBhcyBhbnkpPy5nZXREZXBlbmRlbnRzKCk7XG5cdFx0Y29uc3QgZmllbGRIZWxwID0gc291cmNlPy5nZXRGaWVsZEhlbHAoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0cmFuc0N0eC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFZhbHVlTGlzdEhlbHBlci5jcmVhdGVWSFVJTW9kZWwocHJvcGVydHlQYXRoLCBmaWVsZFZhbHVlSGVscCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBtZXRhTW9kZWwsIHByb3BlcnR5UGF0aCkgYXMgUHJvbWlzZTxhbnk+O1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6IHZMaW5mby5pblBhcmFtZXRlcnMubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6IHZMaW5mby5vdXRQYXJhbWV0ZXJzLm1hcCgob3V0UGFyYW06IGFueSkgPT4gb3V0UGFyYW0uZ2V0RmllbGRQYXRoKCkpXG5cdFx0XHRcdH07XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRcdGlmIChpbmZvLm91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhgTWFzcyBFZGl0OiBDb3VsZG4ndCBsb2FkIHZhbHVlTGlzdCBpbmZvIGZvciAke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgZmllbGQgaGVscCBjb250cm9sIGZyb20gTURDIGZpZWxkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHJldHVybnMgRmllbGQgSGVscCBjb250cm9sLlxuXHQgKi9cblx0X2dldFZhbHVlSGVscDogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IGFueSk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCk7XG5cdFx0cmV0dXJuIGZpZWxkVmFsdWVIZWxwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb2xsZWQgb24gZHJvcCBkb3duIHNlbGVjdGlvbiBvZiBWSEQgb3B0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtNYXNzRWRpdFNlbGVjdH0gc291cmNlIEN1c3RvbSBNYXNzIEVkaXQgU2VsZWN0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdEtleSBQcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBWSEQgd2FzIHNlbGVjdGVkLlxuXHQgKi9cblx0X29uVkhTZWxlY3Q6IGZ1bmN0aW9uIChzb3VyY2U6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHNlbGVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBzZWxlY3RlZC5cblxuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3ZhbHVlcy9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlSGVscCh0cmFuc0N0eCwgc291cmNlLmdldFBhcmVudCgpKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRzb3VyY2UuZmlyZVZhbHVlSGVscFJlcXVlc3QoKTtcblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0S2V5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyBQcm9wZXJ0eSBuYW1lIGZyb20gc2VsZWN0aW9uIGtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgU2VsZWN0aW9uIGtleS5cblx0ICogQHJldHVybnMgUHJvcGVydHkgbmFtZS5cblx0ICovXG5cdF9nZXRQcm9wZXJ0eU5hbWVGcm9tS2V5OiBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRsZXQgcHJvcGVydHlOYW1lID0gXCJcIjtcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIikpIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzZWxlY3Rpb24gdG8gQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge01EQ0ZpZWxkfSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgbWFzc0VkaXRTZWxlY3QgPSAoc291cmNlLmdldENvbnRlbnQoKSBhcyBhbnkpIGFzIFNlbGVjdDtcblx0XHRpZiAoIW1hc3NFZGl0U2VsZWN0IHx8ICFwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGtleTogc3RyaW5nID0gbWFzc0VkaXRTZWxlY3QuZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRpZiAoKGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpKSAmJiAhdmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0ID0gTWFzc0VkaXRIYW5kbGVycy5fdmFsdWVFeGlzdHMoZnVsbFRleHQpID8gZnVsbFRleHQgOiB2YWx1ZTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoKHNvdXJjZSBhcyBhbnkpLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSB8fCBbXTtcblx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGEvXCIgKyBwcm9wZXJ0eU5hbWUpICYmIFwiL3VuaXREYXRhL1wiKTtcblxuXHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IHZhbHVlcy5maW5kKChmaWVsZERhdGE6IGFueSkgPT4gZmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IGZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZSk7XG5cblx0XHRpZiAocmVsYXRlZEZpZWxkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bGxUZXh0ICYmXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoICYmXG5cdFx0XHRcdChyZWxhdGVkRmllbGQudGV4dCAhPSBmb3JtYXR0ZWRUZXh0IHx8IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby5mdWxsVGV4dCAhPSBmb3JtYXR0ZWRUZXh0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgZnVsbCB0ZXh0IG9ubHkgd2hlbiBwcm92aWRlZC5cblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb24gPSBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZEZpZWxkLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwga2V5KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0a2V5ID0gcmVsYXRlZEZpZWxkLmtleTtcblx0XHR9IGVsc2UgaWYgKFt1bmRlZmluZWQsIG51bGwsIFwiXCJdLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuXHRcdFx0a2V5ID0gcHJvcGVydHlOYW1lICsgXCIvXCIgKyB2YWx1ZTtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkluZm8gPSB7XG5cdFx0XHRcdHRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dGV4dEluZm86IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogdmFsdWVzICYmIHZhbHVlcy50ZXh0SW5mbyAmJiB2YWx1ZXMudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdGZ1bGxUZXh0OiBmb3JtYXR0ZWRUZXh0LFxuXHRcdFx0XHRcdHRleHRBcnJhbmdlbWVudDogc291cmNlLmdldERpc3BsYXkoKSxcblx0XHRcdFx0XHR2YWx1ZTogc291cmNlLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBwcm9wZXJ0eU5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHZhbHVlcy5wdXNoKHNlbGVjdGlvbkluZm8pO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMgPSB2YWx1ZXMuc2VsZWN0T3B0aW9ucyB8fCBbXTtcblx0XHRcdHZhbHVlcy5zZWxlY3RPcHRpb25zLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSwgdmFsdWVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5ID0gXCJEZWZhdWx0L1wiICsgcHJvcGVydHlOYW1lO1xuXHRcdH1cblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwga2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVSZXN1bHRzKG1hc3NFZGl0U2VsZWN0KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IFZhbHVlIGZyb20gRHJvcCBkb3duLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250cm9sfSBzb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFZhbHVlIG9mIHNlbGVjdGlvbi5cblx0ICovXG5cdF9nZXRWYWx1ZTogZnVuY3Rpb24gKHNvdXJjZTogQ29udHJvbCkge1xuXHRcdHJldHVybiBzb3VyY2UuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLmZlLmNvcmUuY29udHJvbHMuTWFzc0VkaXRTZWxlY3RcIlxuXHRcdFx0PyAoc291cmNlIGFzIFNlbGVjdCkuZ2V0U2VsZWN0ZWRJdGVtKCk/LmdldFRleHQoKVxuXHRcdFx0OiAoc291cmNlIGFzIENvbWJvQm94KS5nZXRWYWx1ZSgpO1xuXHR9LFxuXG5cdF9nZXRWYWx1ZU9uRW1wdHk6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGZpZWxkc0luZm9Nb2RlbDogSlNPTk1vZGVsLCB2YWx1ZTogYW55LCBzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtzUHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblx0XHRcdGlmICh2YWx1ZXMudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlID0gMDtcblx0XHRcdFx0b1NvdXJjZS5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHR2YWx1ZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblxuXHRfdmFsdWVFeGlzdHM6IGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG5cdFx0cmV0dXJuIHZhbHVlICE9IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPSBudWxsO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHNlbGVjdGlvbnMgdG8gcnVudGltZSBtb2RlbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udHJvbH0gb1NvdXJjZSBEcm9wIGRvd24gY29udHJvbC5cblx0ICogQHBhcmFtIHtBcnJheX0gYVBhcmFtcyBQYXJ0cyBvZiBrZXkgaW4gcnVudGltZSBtb2RlbC5cblx0ICogQHBhcmFtIHtib29sZWFufSB1cGRhdGVUcmFuc0N0eCBTaG91bGQgdHJhbnNpZW50IGNvbnRleHQgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVSZXN1bHRzOiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBhUGFyYW1zOiBBcnJheTxzdHJpbmc+ID0gW10sIHVwZGF0ZVRyYW5zQ3R4OiBib29sZWFuKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Ly8gMi4gT3V0IHBhcmFtZXRlci5cblx0XHQvLyAzLiB0cmFuc2llbnQgY29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Y29uc3QgZmllbGRzSW5mb01vZGVsID0gb1NvdXJjZSAmJiBvU291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBmaWVsZHNJbmZvTW9kZWwgJiYgZmllbGRzSW5mb01vZGVsLmdldERhdGEoKTtcblx0XHRsZXQgdmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZShvU291cmNlIGFzIENvbnRyb2wpO1xuXHRcdGFQYXJhbXMgPSBhUGFyYW1zLmxlbmd0aCA+IDAgPyBhUGFyYW1zIDogb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblxuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5nZXRJZCgpLnN1YnN0cmluZyhvU291cmNlLmdldElkKCkubGFzdEluZGV4T2YoXCI6XCIpICsgMSk7XG5cblx0XHRpZiAoYVBhcmFtc1swXSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1sxXSxcblx0XHRcdFx0dmFsdWU6IGFQYXJhbXNbMF1cblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmIChhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHR2YWx1ZSA9IFwiXCI7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogYVBhcmFtc1sxXSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoIWFQYXJhbXMpIHtcblx0XHRcdHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVPbkVtcHR5KG9Tb3VyY2UsIGZpZWxkc0luZm9Nb2RlbCwgdmFsdWUsIHNQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBzUHJvcGVydHlOYW1lLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGFQYXJhbXMuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGEvXCIgKyBwcm9wZXJ0eU5hbWUpIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4KSB7XG5cdFx0XHRjb25zdCB0cmFuc0N0eCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGlmIChhUGFyYW1zWzBdID09PSBcIkRlZmF1bHRcIiB8fCBhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHRcdHRyYW5zQ3R4LnNldFByb3BlcnR5KG9EYXRhT2JqZWN0LmtleVZhbHVlLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAob0RhdGFPYmplY3QpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG9EYXRhT2JqZWN0LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGFuZGxlcnM7XG4iXX0=
595
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImNvbnRleHRQcm9wZXJ0eUNoYW5nZSIsIm5ld1ZhbHVlIiwiZGF0YVByb3BlcnR5IiwibWRjRmllbGRJZCIsInNvdXJjZSIsIkNvcmUiLCJieUlkIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImZpZWxkSW5mb01vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZXMiLCJnZXRQcm9wZXJ0eSIsImlucHV0VHlwZSIsInZhbHVlTGlzdEluZm8iLCJfc2V0VmFsdWVMaXN0SW5mbyIsImlzRGlhbG9nT3BlbiIsImdldFZpc2libGUiLCJfdXBkYXRlU2VsZWN0S2V5IiwiaGFuZGxlTURDRmllbGRDaGFuZ2UiLCJldmVudCIsInByb3BlcnR5TmFtZSIsImdldFNvdXJjZSIsImNoYW5nZVByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJjb21ib0JveCIsImdldENvbnRlbnQiLCJ0aGVuIiwiX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlIiwiYmluZCIsImNhdGNoIiwiZXJyIiwiTG9nIiwid2FybmluZyIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZSIsImtleSIsImdldFNlbGVjdGVkS2V5IiwicGFyYW1zIiwic3BsaXQiLCJwcmV2SXRlbSIsInNlbGVjdEtleSIsImdldEtleSIsInNsaWNlIiwiam9pbiIsIl9vblZIU2VsZWN0IiwiX2dldFByb3BlcnR5TmFtZUZyb21LZXkiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnMiLCJzdGFydHNXaXRoIiwiX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVycyIsIl91cGRhdGVSZXN1bHRzIiwidmFsdWUiLCJmb3JtYXR0ZWRWYWx1ZSIsImdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSIsInJlc2V0VmFsdWVzIiwia2VlcEV4aXN0aW5nU2VsZWN0aW9uIiwidW5pdERhdGEiLCJmaWVsZFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsInVuaXRGaWVsZFBhdGhzIiwiZm9yRWFjaCIsIl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMiLCJwYXRoUHJlZml4Iiwic3JjUHJvcGVydHlOYW1lIiwiaW5QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMiLCJvdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnMiLCJvdXRQYXJhbWV0ZXIiLCJmaWVsZFBhdGhBYnNvbHV0ZSIsIm9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdGVkS2V5IiwiZXhpc3RpbmdTZWxlY3Rpb24iLCJmaW5kIiwib3B0aW9uIiwic2VsZWN0T3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJwdXNoIiwic2VsZWN0T3B0aW9uIiwic2V0UHJvcGVydHkiLCJwcm9wUGF0aCIsImZpZWxkVmFsdWVIZWxwIiwiX2dldFZhbHVlSGVscCIsImdldERpYWxvZ0NvbnRlbnQiLCJnZXRUYWJsZSIsImdldEluUGFyYW1ldGVycyIsIm1hcCIsImluUGFyYW0iLCJnZXRGaWVsZFBhdGgiLCJvdXRQYXJhbSIsImluZm8iLCJfcmVxdWVzdFZhbHVlTGlzdCIsIm1ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJkZXBlbmRlbnRzIiwiZ2V0RGVwZW5kZW50cyIsImZpZWxkSGVscCIsImdldEZpZWxkSGVscCIsImRlcGVuZGVudCIsImdldElkIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsImZvcm1hdHRlZFRleHQiLCJfdmFsdWVFeGlzdHMiLCJyZWxhdGVkRmllbGQiLCJmaWVsZERhdGEiLCJ0ZXh0SW5mbyIsInRleHQiLCJkZXNjcmlwdGlvblBhdGgiLCJkZXNjcmlwdGlvbiIsImdldEFkZGl0aW9uYWxWYWx1ZSIsInVuZGVmaW5lZCIsInNlbGVjdGlvbkluZm8iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJnZXREaXNwbGF5IiwiZ2V0VmFsdWUiLCJ2YWx1ZVBhdGgiLCJfZ2V0VmFsdWUiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRTZWxlY3RlZEl0ZW0iLCJnZXRUZXh0IiwiX2dldFZhbHVlT25FbXB0eSIsIm9Tb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJzUHJvcGVydHlOYW1lIiwidW5pdFByb3BlcnR5Iiwic2V0VmFsdWUiLCJhUGFyYW1zIiwidXBkYXRlVHJhbnNDdHgiLCJvRmllbGRzSW5mb0RhdGEiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJrZXlWYWx1ZSIsInByb3BlcnR5VmFsdWVzIiwib0ZpZWxkRGF0YSIsImJFeGlzdGluZ0VsZW1lbnRpbmRleCIsImkiLCJyZXN1bHRzIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBcUJBLE1BQU1BLGdCQUFxQixHQUFHO0FBQzdCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEscUJBQXFCLEVBQUUsVUFBVUMsUUFBVixFQUF5QkMsWUFBekIsRUFBK0NDLFVBQS9DLEVBQW1FO0FBQ3pGO0FBQ0E7QUFDQTtBQUVBLFVBQU1DLE1BQU0sR0FBR0MsSUFBSSxDQUFDQyxJQUFMLENBQVVILFVBQVYsQ0FBZjtBQUNBLFVBQU1JLFFBQVEsR0FBR0gsTUFBTSxJQUFLQSxNQUFNLENBQUNJLGlCQUFQLEVBQTVCO0FBQ0EsVUFBTUMsY0FBYyxHQUFHTCxNQUFNLElBQUtBLE1BQU0sQ0FBQ00sUUFBUCxDQUFnQixZQUFoQixDQUFsQztBQUNBLFVBQU1DLE1BQU0sR0FDWEYsY0FB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QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDTixRQUFBQSxlQUFlLENBQUNRLE9BQWhCLENBQXdCRixxQkFBeEIsSUFBaURKLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05GLFFBQUFBLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0IxRSxJQUF4QixDQUE2Qm9FLFdBQTdCO0FBQ0E7O0FBQ0QsVUFBSUgsY0FBYyxJQUFJLENBQUNHLFdBQVcsQ0FBQ0MsUUFBWixDQUFxQm5GLFFBQXJCLENBQThCLEdBQTlCLENBQXZCLEVBQTJEO0FBQzFELFlBQU0zRCxRQUFRLEdBQUdvSSxPQUFPLENBQUNuSSxpQkFBUixFQUFqQjs7QUFDQSxZQUFJd0ksT0FBTyxDQUFDLENBQUQsQ0FBUCxLQUFlLFNBQWYsSUFBNEJBLE9BQU8sQ0FBQyxDQUFELENBQVAsS0FBZSxpQkFBL0MsRUFBa0U7QUFDakV6SSxVQUFBQSxRQUFRLENBQUMyRSxXQUFULENBQXFCa0UsV0FBVyxDQUFDQyxRQUFqQyxFQUEyQyxJQUEzQztBQUNBLFNBRkQsTUFFTyxJQUFJRCxXQUFKLEVBQWlCO0FBQ3ZCN0ksVUFBQUEsUUFBUSxDQUFDMkUsV0FBVCxDQUFxQmtFLFdBQVcsQ0FBQ0MsUUFBakMsRUFBMkNELFdBQVcsQ0FBQ2xHLEtBQXZEO0FBQ0E7QUFDRDtBQUNEO0FBcm1CNEIsR0FBOUI7U0F3bUJlbkQsZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uc3RydWN0b3IgZm9yIGEgbmV3IFZpc3VhbCBGaWx0ZXIgQ29udGFpbmVyLlxuICogVXNlZCBmb3IgdmlzdWFsIGZpbHRlcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NJZF0gSUQgZm9yIHRoZSBuZXcgY29udHJvbCwgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbm8gSUQgaXMgZ2l2ZW5cbiAqIEBleHRlbmRzIHNhcC51aS5tZGMuZmlsdGVyYmFyLklGaWx0ZXJDb250YWluZXJcbiAqIEBjbGFzc1xuICogQHByaXZhdGVcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9scy5maWx0ZXJiYXIuVmlzdWFsRmlsdGVyQ29udGFpbmVyXG4gKi9cbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgVmFsdWVMaXN0SGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbWJvQm94IGZyb20gXCJzYXAvbS9Db21ib0JveFwiO1xuaW1wb3J0IHR5cGUgU2VsZWN0IGZyb20gXCJzYXAvbS9TZWxlY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgSW5QYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvSW5QYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIE91dFBhcmFtZXRlciBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9PdXRQYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7ZGF0YVByb3BlcnR5fWApIHx8IFtdO1xuXG5cdFx0aWYgKHRyYW5zQ3R4ICYmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFZhbHVlSGVscFwiIHx8IHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVW5pdFwiKSAmJiAhdmFsdWVzLnZhbHVlTGlzdEluZm8pIHtcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3NldFZhbHVlTGlzdEluZm8odHJhbnNDdHgsIHNvdXJjZSwgZmllbGRJbmZvTW9kZWwsIGRhdGFQcm9wZXJ0eSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNEaWFsb2dPcGVuID0gZmllbGRJbmZvTW9kZWwgJiYgZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvaXNPcGVuXCIpO1xuXHRcdGlmICghaXNEaWFsb2dPcGVuIHx8ICFzb3VyY2UuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5KHNvdXJjZSwgZGF0YVByb3BlcnR5LCBuZXdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3IgY2hhbmdlIGluIHRoZSBNREMgZmllbGQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIG9uIHNlbGVjdGlvbiBkb25lIHRocm91Z2ggVkhELlxuXHQgKiBUaGlzIGlzIG5vdCBjYWxsZWQgb24gY2hhbmdlIG9mIHRoZSBkcm9wZG93biBhcyB3ZSBhcmUgdXNpbmcgYSBjdXN0b20gTWFzc0VkaXRTZWxlY3QgY29udHJvbCBhbmQgbm90IGdlbmVyYWwgU2VsZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGV2ZW50IEV2ZW50IG9iamVjdCBmb3IgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRoYW5kbGVNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKGV2ZW50OiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cblx0XHRjb25zdCBzb3VyY2UgPSBldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBjaGFuZ2VQcm9taXNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRjb25zdCBjb21ib0JveCA9IHNvdXJjZS5nZXRDb250ZW50KCk7XG5cdFx0aWYgKCFjb21ib0JveCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlUHJvbWlzZVxuXHRcdFx0LnRoZW4oTWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UuYmluZChNYXNzRWRpdEhhbmRsZXJzLCBzb3VyY2UsIHByb3BlcnR5TmFtZSkpXG5cdFx0XHQuY2F0Y2goKGVycjogYW55KSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBWSEQgc2VsZWN0aW9uIGNvdWxkbid0IGJlIHBvcHVsYXRlZCBpbiB0aGUgbWFzcyBlZGl0IGZpZWxkLiR7ZXJyfWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50ICYmIGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkIHRoYXQgd2FzIGNoYW5nZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXlGb3JNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRmaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3ZhbHVlcy9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0XHR1bml0RmllbGRQYXRocy5mb3JFYWNoKFxuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlSW5QYXJhbWV0ZXJTdWdnZXRpb25zLmJpbmQoXG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMsXG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0XHRcIi91bml0RGF0YS9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhIGRyb3AgZG93biB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBzcmNQcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwYXRoUHJlZml4IFBhdGggaW4gdGhlIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIEluUGFyYW1ldGVyIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoIHRoYXQgbmVlZHMgdXBkYXRlIG9mIHN1Z2dlc3Rpb25zLlxuXHQgKi9cblx0X3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9uczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cGF0aFByZWZpeDogc3RyaW5nLFxuXHRcdHNyY1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhbixcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuXHQpIHtcblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cGF0aFByZWZpeCArIHByb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVyczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSB8fFxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXG5cdFx0aWYgKHZhbHVlTGlzdEluZm8gJiYgdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdFx0Y29uc3QgcGF0aFByZWZpeCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0aWYgKHBhdGhQcmVmaXgpIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICovXG5cdF91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyczogc3RyaW5nW10sXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRvdXRQYXJhbWV0ZXJzLmZvckVhY2goKG91dFBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoZmllbGRQYXRocy5pbmNsdWRlcyhvdXRQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke291dFBhcmFtZXRlcn1gLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodW5pdEZpZWxkUGF0aHMuaW5jbHVkZXMob3V0UGFyYW1ldGVyKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhcblx0XHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XHRgL3VuaXREYXRhLyR7b3V0UGFyYW1ldGVyfWAsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRmaWVsZFBhdGhBYnNvbHV0ZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBvcHRpb25zID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gb3B0aW9ucy5kZWZhdWx0T3B0aW9ucztcblx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke2ZpZWxkUGF0aEFic29sdXRlfS9zZWxlY3RlZEtleWApO1xuXHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uICYmIG9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5rZXkgPT09IHNlbGVjdGVkS2V5KTtcblx0XHRpZiAocmVzZXRWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLnNlbGVjdE9wdGlvbnM7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0XHRzZWxlY3RPcHRpb25zLmZvckVhY2goKHNlbGVjdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goc2VsZWN0T3B0aW9uKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMubGVuZ3RoID0gMDtcblx0XHRcdGRlZmF1bHRPcHRpb25zLmZvckVhY2goKGRlZmF1bHRPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKGRlZmF1bHRPcHRpb24pKTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAoZXhpc3RpbmdTZWxlY3Rpb24gJiYgIW9wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdTZWxlY3Rpb24pKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goZXhpc3RpbmdTZWxlY3Rpb24pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7ZmllbGRQYXRoQWJzb2x1dGV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRpZiAoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlSGVscCh0cmFuc0N0eCwgc291cmNlKTtcblx0XHRpZiAoZmllbGRWYWx1ZUhlbHAgJiYgZmllbGRWYWx1ZUhlbHAuZ2V0RGlhbG9nQ29udGVudCgpLmdldFRhYmxlKCkpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IChmaWVsZFZhbHVlSGVscC5nZXRJblBhcmFtZXRlcnMoKSB8fCBbXSkubWFwKChpblBhcmFtOiBJblBhcmFtZXRlcikgPT4gaW5QYXJhbS5nZXRGaWVsZFBhdGgoKSk7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gKGZpZWxkVmFsdWVIZWxwLmdldEluUGFyYW1ldGVycygpIHx8IFtdKS5tYXAoKG91dFBhcmFtOiBPdXRQYXJhbWV0ZXIpID0+IG91dFBhcmFtLmdldEZpZWxkUGF0aCgpKTtcblx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJzOiBpblBhcmFtZXRlcnMubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpLFxuXHRcdFx0XHRvdXRQYXJhbWV0ZXJzOiBvdXRQYXJhbWV0ZXJzLm1hcCgob3V0UGFyYW06IGFueSkgPT4gb3V0UGFyYW0uZ2V0RmllbGRQYXRoKCkpXG5cdFx0XHR9O1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gLCBpbmZvKTtcblx0XHRcdGlmIChpbmZvLm91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl9yZXF1ZXN0VmFsdWVMaXN0KHRyYW5zQ3R4LCBzb3VyY2UsIGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUmVxdWVzdCBhbmQgdXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfcmVxdWVzdFZhbHVlTGlzdDogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSAobWV0YVBhdGggJiYgYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlOYW1lfWApIGFzIHN0cmluZztcblx0XHRjb25zdCBkZXBlbmRlbnRzID0gc291cmNlPy5nZXREZXBlbmRlbnRzKCk7XG5cdFx0Y29uc3QgZmllbGRIZWxwID0gc291cmNlPy5nZXRGaWVsZEhlbHAoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0cmFuc0N0eC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFZhbHVlTGlzdEhlbHBlci5jcmVhdGVWSFVJTW9kZWwocHJvcGVydHlQYXRoLCBmaWVsZFZhbHVlSGVscCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBtZXRhTW9kZWwsIHByb3BlcnR5UGF0aCkgYXMgUHJvbWlzZTxhbnk+O1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblx0XHRcdFx0Y29uc3QgaW5mbzogYW55ID0ge1xuXHRcdFx0XHRcdGluUGFyYW1ldGVyczogdkxpbmZvLmluUGFyYW1ldGVycy5tYXAoKGluUGFyYW06IGFueSkgPT4gaW5QYXJhbS5nZXRGaWVsZFBhdGgoKSksXG5cdFx0XHRcdFx0b3V0UGFyYW1ldGVyczogdkxpbmZvLm91dFBhcmFtZXRlcnMubWFwKChvdXRQYXJhbTogYW55KSA9PiBvdXRQYXJhbS5nZXRGaWVsZFBhdGgoKSlcblx0XHRcdFx0fTtcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gLCBpbmZvKTtcblx0XHRcdFx0aWYgKGluZm8ub3V0UGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWAsIGZhbHNlLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBNYXNzIEVkaXQ6IENvdWxkbid0IGxvYWQgdmFsdWVMaXN0IGluZm8gZm9yICR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBmaWVsZCBoZWxwIGNvbnRyb2wgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gdHJhbnNDdHggVGhlIHRyYW5zaWVudCBjb250ZXh0IG9mIHRoZSBNRUQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcmV0dXJucyBGaWVsZCBIZWxwIGNvbnRyb2wuXG5cdCAqL1xuXHRfZ2V0VmFsdWVIZWxwOiBmdW5jdGlvbiAodHJhbnNDdHg6IENvbnRleHQsIHNvdXJjZTogRmllbGQpOiBhbnkge1xuXHRcdGNvbnN0IGRlcGVuZGVudHMgPSBzb3VyY2U/LmdldERlcGVuZGVudHMoKTtcblx0XHRjb25zdCBmaWVsZEhlbHAgPSBzb3VyY2U/LmdldEZpZWxkSGVscCgpO1xuXHRcdHJldHVybiBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbGxlZCBvbiBkcm9wIGRvd24gc2VsZWN0aW9uIG9mIFZIRCBvcHRpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIEN1c3RvbSBNYXNzIEVkaXQgU2VsZWN0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHNlbGVjdEtleSBQcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBWSEQgd2FzIHNlbGVjdGVkLlxuXHQgKi9cblx0X29uVkhTZWxlY3Q6IGZ1bmN0aW9uIChzb3VyY2U6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHNlbGVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBzZWxlY3RlZC5cblxuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblx0XHRjb25zdCB0cmFuc0N0eCA9IHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkVmFsdWVIZWxwID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVIZWxwKHRyYW5zQ3R4LCBzb3VyY2UuZ2V0UGFyZW50KCkpO1xuXHRcdGlmICghZmllbGRWYWx1ZUhlbHA/LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdGZpZWxkVmFsdWVIZWxwPy5zZXRCaW5kaW5nQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0fVxuXHRcdHNvdXJjZS5maXJlVmFsdWVIZWxwUmVxdWVzdCgpO1xuXG5cdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGggKyBwcm9wZXJ0eU5hbWV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0S2V5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyBQcm9wZXJ0eSBuYW1lIGZyb20gc2VsZWN0aW9uIGtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBrZXkgU2VsZWN0aW9uIGtleS5cblx0ICogQHJldHVybnMgUHJvcGVydHkgbmFtZS5cblx0ICovXG5cdF9nZXRQcm9wZXJ0eU5hbWVGcm9tS2V5OiBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRsZXQgcHJvcGVydHlOYW1lID0gXCJcIjtcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIikpIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzZWxlY3Rpb24gdG8gQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gZnVsbFRleHQgRnVsbCB0ZXh0IHRvIHVzZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXk6IGZ1bmN0aW9uIChzb3VyY2U6IEZpZWxkLCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgZnVsbFRleHQ/OiBhbnkpOiB2b2lkIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHByb3BlcnR5IGNoYW5nZVxuXHRcdC8vIDIuIE91dCBQYXJhbWV0ZXJzLlxuXHRcdC8vIDMuIFRyYW5zaWVudCBjb250ZXh0IHByb3BlcnR5IGNoYW5nZS5cblxuXHRcdGNvbnN0IGNvbWJvQm94ID0gc291cmNlLmdldENvbnRlbnQoKSBhcyBDb21ib0JveDtcblx0XHRpZiAoIWNvbWJvQm94IHx8ICFwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGtleTogc3RyaW5nID0gY29tYm9Cb3guZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRpZiAoKGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpKSAmJiAhdmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0ID0gTWFzc0VkaXRIYW5kbGVycy5fdmFsdWVFeGlzdHMoZnVsbFRleHQpID8gZnVsbFRleHQgOiB2YWx1ZTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRjb25zdCByZWxhdGVkRmllbGQgPSB2YWx1ZXMuZmluZCgoZmllbGREYXRhOiBhbnkpID0+IGZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBmaWVsZERhdGEudGV4dCA9PT0gdmFsdWUpO1xuXG5cdFx0aWYgKHJlbGF0ZWRGaWVsZCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRmdWxsVGV4dCAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8gJiZcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uUGF0aCAmJlxuXHRcdFx0XHQocmVsYXRlZEZpZWxkLnRleHQgIT0gZm9ybWF0dGVkVGV4dCB8fCByZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgIT0gZm9ybWF0dGVkVGV4dClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBVcGRhdGUgdGhlIGZ1bGwgdGV4dCBvbmx5IHdoZW4gcHJvdmlkZWQuXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmZ1bGxUZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uID0gc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRGaWVsZC5rZXkgPT09IGtleSkge1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBrZXkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRrZXkgPSByZWxhdGVkRmllbGQua2V5O1xuXHRcdH0gZWxzZSBpZiAoW3VuZGVmaW5lZCwgbnVsbCwgXCJcIl0uaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG5cdFx0XHRrZXkgPSBgJHtwcm9wZXJ0eU5hbWV9LyR7dmFsdWV9YDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkluZm8gPSB7XG5cdFx0XHRcdHRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dGV4dEluZm86IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogdmFsdWVzICYmIHZhbHVlcy50ZXh0SW5mbyAmJiB2YWx1ZXMudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdGZ1bGxUZXh0OiBmb3JtYXR0ZWRUZXh0LFxuXHRcdFx0XHRcdHRleHRBcnJhbmdlbWVudDogc291cmNlLmdldERpc3BsYXkoKSxcblx0XHRcdFx0XHR2YWx1ZTogc291cmNlLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBwcm9wZXJ0eU5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHZhbHVlcy5wdXNoKHNlbGVjdGlvbkluZm8pO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMgPSB2YWx1ZXMuc2VsZWN0T3B0aW9ucyB8fCBbXTtcblx0XHRcdHZhbHVlcy5zZWxlY3RPcHRpb25zLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSwgdmFsdWVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5ID0gYERlZmF1bHQvJHtwcm9wZXJ0eU5hbWV9YDtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBrZXkpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoY29tYm9Cb3gpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgVmFsdWUgZnJvbSBEcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIERyb3AgZG93biBjb250cm9sLlxuXHQgKiBAcmV0dXJucyBWYWx1ZSBvZiBzZWxlY3Rpb24uXG5cdCAqL1xuXHRfZ2V0VmFsdWU6IGZ1bmN0aW9uIChzb3VyY2U6IENvbnRyb2wpIHtcblx0XHRyZXR1cm4gc291cmNlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC5mZS5jb3JlLmNvbnRyb2xzLk1hc3NFZGl0U2VsZWN0XCJcblx0XHRcdD8gKHNvdXJjZSBhcyBTZWxlY3QpLmdldFNlbGVjdGVkSXRlbSgpPy5nZXRUZXh0KClcblx0XHRcdDogKHNvdXJjZSBhcyBDb21ib0JveCkuZ2V0VmFsdWUoKTtcblx0fSxcblxuXHRfZ2V0VmFsdWVPbkVtcHR5OiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBmaWVsZHNJbmZvTW9kZWw6IEpTT05Nb2RlbCwgdmFsdWU6IGFueSwgc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCF2YWx1ZSkge1xuXHRcdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3NQcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0XHRpZiAodmFsdWVzLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHR2YWx1ZSA9IDA7XG5cdFx0XHRcdG9Tb3VyY2Uuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdFx0dmFsdWUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXG5cdF92YWx1ZUV4aXN0czogZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRyZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGw7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgc2VsZWN0aW9ucyB0byBydW50aW1lIG1vZGVsLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIG9Tb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBhUGFyYW1zIFBhcnRzIG9mIGtleSBpbiBydW50aW1lIG1vZGVsLlxuXHQgKiBAcGFyYW0gdXBkYXRlVHJhbnNDdHggU2hvdWxkIHRyYW5zaWVudCBjb250ZXh0IGJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWUuXG5cdCAqL1xuXHRfdXBkYXRlUmVzdWx0czogZnVuY3Rpb24gKG9Tb3VyY2U6IGFueSwgYVBhcmFtczogQXJyYXk8c3RyaW5nPiA9IFtdLCB1cGRhdGVUcmFuc0N0eDogYm9vbGVhbikge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlLlxuXHRcdC8vIDIuIE91dCBwYXJhbWV0ZXIuXG5cdFx0Ly8gMy4gdHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IG9Tb3VyY2UgJiYgb1NvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3Qgb0ZpZWxkc0luZm9EYXRhID0gZmllbGRzSW5mb01vZGVsICYmIGZpZWxkc0luZm9Nb2RlbC5nZXREYXRhKCk7XG5cdFx0bGV0IHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWUob1NvdXJjZSBhcyBDb250cm9sKTtcblx0XHRhUGFyYW1zID0gYVBhcmFtcy5sZW5ndGggPiAwID8gYVBhcmFtcyA6IG9Tb3VyY2UgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpICYmIG9Tb3VyY2UuZ2V0U2VsZWN0ZWRLZXkoKS5zcGxpdChcIi9cIik7XG5cblx0XHRsZXQgb0RhdGFPYmplY3Q7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IG9Tb3VyY2UuZ2V0SWQoKS5zdWJzdHJpbmcob1NvdXJjZS5nZXRJZCgpLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpO1xuXG5cdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiBhUGFyYW1zWzBdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYVBhcmFtc1swXSA9PT0gXCJDbGVhckZpZWxkVmFsdWVcIikge1xuXHRcdFx0dmFsdWUgPSBcIlwiO1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogc1Byb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhUGFyYW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4ICYmICFvRGF0YU9iamVjdC5rZXlWYWx1ZS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdGNvbnN0IHRyYW5zQ3R4ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiIHx8IGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvRGF0YU9iamVjdCkge1xuXHRcdFx0XHR0cmFuc0N0eC5zZXRQcm9wZXJ0eShvRGF0YU9iamVjdC5rZXlWYWx1ZSwgb0RhdGFPYmplY3QudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdfQ==