@sapui5/sap.fe.core 1.124.2 → 1.126.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 (300) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +5 -1
  3. package/src/sap/fe/core/ActionRuntime.js +2 -2
  4. package/src/sap/fe/core/ActionRuntime.ts +4 -4
  5. package/src/sap/fe/core/AppComponent.js +2 -2
  6. package/src/sap/fe/core/AppComponent.ts +1 -1
  7. package/src/sap/fe/core/AppStateHandler.js +2 -2
  8. package/src/sap/fe/core/AppStateHandler.ts +1 -1
  9. package/src/sap/fe/core/BaseController.js +2 -2
  10. package/src/sap/fe/core/BaseController.ts +1 -1
  11. package/src/sap/fe/core/CommonUtils.js +3 -3
  12. package/src/sap/fe/core/CommonUtils.ts +12 -15
  13. package/src/sap/fe/core/ExtensionAPI.js +2 -2
  14. package/src/sap/fe/core/ExtensionAPI.ts +4 -3
  15. package/src/sap/fe/core/PageController.js +2 -2
  16. package/src/sap/fe/core/PageController.ts +1 -1
  17. package/src/sap/fe/core/ResourceModel.js +2 -2
  18. package/src/sap/fe/core/ResourceModel.ts +1 -1
  19. package/src/sap/fe/core/ReuseComponent.js +172 -0
  20. package/src/sap/fe/core/ReuseComponent.ts +165 -0
  21. package/src/sap/fe/core/TemplateComponent.js +2 -2
  22. package/src/sap/fe/core/TemplateComponent.ts +5 -1
  23. package/src/sap/fe/core/TemplateModel.js +2 -2
  24. package/src/sap/fe/core/TemplateModel.ts +1 -1
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +92 -6
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +90 -10
  27. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  28. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -1
  29. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +30 -3
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +28 -4
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +10 -16
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +19 -16
  33. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +3 -3
  34. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +5 -5
  35. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +2 -2
  36. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +1 -1
  37. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +17 -5
  38. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +14 -6
  39. package/src/sap/fe/core/controllerextensions/ContextSharing.js +2 -2
  40. package/src/sap/fe/core/controllerextensions/ContextSharing.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/EditFlow.js +57 -43
  42. package/src/sap/fe/core/controllerextensions/EditFlow.ts +61 -46
  43. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
  44. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
  45. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -11
  46. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +8 -16
  47. package/src/sap/fe/core/controllerextensions/InternalRouting.js +10 -7
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +5 -5
  49. package/src/sap/fe/core/controllerextensions/KPIManagement.js +22 -18
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +28 -23
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +4 -1
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +21 -15
  54. package/src/sap/fe/core/controllerextensions/PageReady.ts +29 -20
  55. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  56. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  57. package/src/sap/fe/core/controllerextensions/Placeholder.js +12 -6
  58. package/src/sap/fe/core/controllerextensions/Placeholder.ts +15 -1
  59. package/src/sap/fe/core/controllerextensions/Recommendations.js +26 -8
  60. package/src/sap/fe/core/controllerextensions/Recommendations.ts +29 -3
  61. package/src/sap/fe/core/controllerextensions/Routing.js +5 -7
  62. package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/Share.js +4 -4
  64. package/src/sap/fe/core/controllerextensions/Share.ts +10 -6
  65. package/src/sap/fe/core/controllerextensions/SideEffects.js +20 -5
  66. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -2
  67. package/src/sap/fe/core/controllerextensions/Telemetry.js +2 -2
  68. package/src/sap/fe/core/controllerextensions/Telemetry.ts +1 -1
  69. package/src/sap/fe/core/controllerextensions/ViewState.js +79 -81
  70. package/src/sap/fe/core/controllerextensions/ViewState.ts +117 -105
  71. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +3 -3
  72. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +1 -1
  73. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  74. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +2 -2
  75. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +17 -8
  76. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +8 -2
  77. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  78. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +10 -9
  79. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +15 -10
  80. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
  82. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +130 -158
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +240 -275
  84. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +2 -2
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +1 -1
  86. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +46 -28
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +60 -32
  88. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +2 -2
  89. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -1
  90. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +2 -2
  91. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +27 -3
  92. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  93. package/src/sap/fe/core/controls/CommandExecution.ts +2 -2
  94. package/src/sap/fe/core/controls/ComponentLoader.js +3 -3
  95. package/src/sap/fe/core/controls/ComponentLoader.ts +2 -2
  96. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +3 -3
  97. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +2 -2
  98. package/src/sap/fe/core/controls/EventDelegateHook.js +2 -2
  99. package/src/sap/fe/core/controls/EventDelegateHook.ts +2 -2
  100. package/src/sap/fe/core/controls/FormElementWrapper.js +51 -6
  101. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -2
  102. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +3 -3
  103. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +3 -3
  104. package/src/sap/fe/core/converters/ConverterContext.js +4 -2
  105. package/src/sap/fe/core/converters/ConverterContext.ts +5 -2
  106. package/src/sap/fe/core/converters/ManifestSettings.js +8 -2
  107. package/src/sap/fe/core/converters/ManifestSettings.ts +25 -3
  108. package/src/sap/fe/core/converters/ManifestWrapper.js +12 -3
  109. package/src/sap/fe/core/converters/ManifestWrapper.ts +11 -1
  110. package/src/sap/fe/core/converters/MetaModelConverter.js +7 -6
  111. package/src/sap/fe/core/converters/MetaModelConverter.ts +6 -2
  112. package/src/sap/fe/core/converters/annotations/DataField.js +56 -16
  113. package/src/sap/fe/core/converters/annotations/DataField.ts +74 -25
  114. package/src/sap/fe/core/converters/common/AnnotationConverter.js +19 -18
  115. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -5
  116. package/src/sap/fe/core/converters/controls/Common/Action.ts +14 -14
  117. package/src/sap/fe/core/converters/controls/Common/Chart.js +40 -7
  118. package/src/sap/fe/core/converters/controls/Common/Chart.ts +56 -20
  119. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +8 -11
  120. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +23 -27
  121. package/src/sap/fe/core/converters/controls/Common/Form.js +10 -3
  122. package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -4
  123. package/src/sap/fe/core/converters/controls/Common/KPI.js +3 -2
  124. package/src/sap/fe/core/converters/controls/Common/KPI.ts +6 -2
  125. package/src/sap/fe/core/converters/controls/Common/Table.js +137 -48
  126. package/src/sap/fe/core/converters/controls/Common/Table.ts +174 -52
  127. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +73 -21
  128. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +91 -20
  129. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +4 -4
  130. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +2 -2
  131. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +2 -2
  132. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +2 -2
  133. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -3
  134. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +1 -1
  135. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -16
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +18 -17
  137. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +2 -2
  138. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +1 -1
  139. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +9 -9
  140. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +12 -12
  141. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -7
  142. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -5
  143. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +9 -73
  144. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +4 -74
  145. package/src/sap/fe/core/designtime/AppComponent.designtime.js +5 -10
  146. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +3 -12
  147. package/src/sap/fe/core/formatters/CriticalityFormatter.js +4 -7
  148. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +3 -3
  149. package/src/sap/fe/core/formatters/FiscalFormat.js +5 -3
  150. package/src/sap/fe/core/formatters/FiscalFormat.ts +4 -2
  151. package/src/sap/fe/core/formatters/StandardFormatter.js +2 -2
  152. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
  153. package/src/sap/fe/core/fpm/Component.js +3 -3
  154. package/src/sap/fe/core/fpm/Component.ts +3 -3
  155. package/src/sap/fe/core/fpm/manifest.json +1 -1
  156. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +2 -2
  157. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +1 -1
  158. package/src/sap/fe/core/helpers/BindingHelper.js +2 -2
  159. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -2
  160. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +2 -2
  161. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +2 -2
  162. package/src/sap/fe/core/helpers/DeleteHelper.js +7 -4
  163. package/src/sap/fe/core/helpers/DeleteHelper.ts +9 -3
  164. package/src/sap/fe/core/helpers/MetaModelFunction.js +5 -5
  165. package/src/sap/fe/core/helpers/MetaModelFunction.ts +2 -2
  166. package/src/sap/fe/core/helpers/MetaPath.js +9 -3
  167. package/src/sap/fe/core/helpers/MetaPath.ts +8 -2
  168. package/src/sap/fe/core/helpers/ModelHelper.js +149 -3
  169. package/src/sap/fe/core/helpers/ModelHelper.ts +202 -6
  170. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +3 -3
  171. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +2 -2
  172. package/src/sap/fe/core/helpers/TitleHelper.js +4 -4
  173. package/src/sap/fe/core/helpers/TitleHelper.ts +4 -4
  174. package/src/sap/fe/core/library.js +4 -4
  175. package/src/sap/fe/core/library.ts +2 -1
  176. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +11 -3
  177. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +10 -2
  178. package/src/sap/fe/core/messagebundle.properties +8 -57
  179. package/src/sap/fe/core/messagebundle_ar.properties +2 -0
  180. package/src/sap/fe/core/messagebundle_bg.properties +2 -0
  181. package/src/sap/fe/core/messagebundle_ca.properties +2 -0
  182. package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
  183. package/src/sap/fe/core/messagebundle_cs.properties +2 -0
  184. package/src/sap/fe/core/messagebundle_cy.properties +4 -2
  185. package/src/sap/fe/core/messagebundle_da.properties +2 -0
  186. package/src/sap/fe/core/messagebundle_de.properties +2 -0
  187. package/src/sap/fe/core/messagebundle_el.properties +2 -0
  188. package/src/sap/fe/core/messagebundle_en.properties +6 -57
  189. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  190. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +3 -36
  191. package/src/sap/fe/core/messagebundle_es.properties +2 -0
  192. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
  193. package/src/sap/fe/core/messagebundle_et.properties +2 -0
  194. package/src/sap/fe/core/messagebundle_fi.properties +2 -0
  195. package/src/sap/fe/core/messagebundle_fr.properties +2 -0
  196. package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
  197. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  198. package/src/sap/fe/core/messagebundle_hr.properties +2 -0
  199. package/src/sap/fe/core/messagebundle_hu.properties +3 -1
  200. package/src/sap/fe/core/messagebundle_id.properties +2 -0
  201. package/src/sap/fe/core/messagebundle_it.properties +2 -0
  202. package/src/sap/fe/core/messagebundle_iw.properties +3 -1
  203. package/src/sap/fe/core/messagebundle_ja.properties +2 -0
  204. package/src/sap/fe/core/messagebundle_kk.properties +2 -0
  205. package/src/sap/fe/core/messagebundle_ko.properties +2 -0
  206. package/src/sap/fe/core/messagebundle_lt.properties +2 -0
  207. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  208. package/src/sap/fe/core/messagebundle_mk.properties +2 -0
  209. package/src/sap/fe/core/messagebundle_ms.properties +2 -0
  210. package/src/sap/fe/core/messagebundle_nl.properties +2 -0
  211. package/src/sap/fe/core/messagebundle_no.properties +2 -0
  212. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  213. package/src/sap/fe/core/messagebundle_pt.properties +2 -0
  214. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
  215. package/src/sap/fe/core/messagebundle_ro.properties +2 -0
  216. package/src/sap/fe/core/messagebundle_ru.properties +2 -0
  217. package/src/sap/fe/core/messagebundle_sh.properties +64 -62
  218. package/src/sap/fe/core/messagebundle_sk.properties +2 -0
  219. package/src/sap/fe/core/messagebundle_sl.properties +2 -0
  220. package/src/sap/fe/core/messagebundle_sr.properties +2 -0
  221. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  222. package/src/sap/fe/core/messagebundle_th.properties +2 -0
  223. package/src/sap/fe/core/messagebundle_tr.properties +2 -0
  224. package/src/sap/fe/core/messagebundle_uk.properties +3 -1
  225. package/src/sap/fe/core/messagebundle_vi.properties +2 -0
  226. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  227. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
  228. package/src/sap/fe/core/operationsHelper.js +3 -3
  229. package/src/sap/fe/core/operationsHelper.ts +2 -2
  230. package/src/sap/fe/core/rootView/Fcl.controller.js +3 -3
  231. package/src/sap/fe/core/rootView/Fcl.controller.ts +2 -2
  232. package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
  233. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  234. package/src/sap/fe/core/rootView/RootViewBaseController.js +114 -92
  235. package/src/sap/fe/core/rootView/RootViewBaseController.ts +120 -106
  236. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +2 -2
  237. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +1 -1
  238. package/src/sap/fe/core/services/NavigationServiceFactory.js +6 -4
  239. package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -3
  240. package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
  241. package/src/sap/fe/core/services/RoutingServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  243. package/src/sap/fe/core/services/ShellServicesFactory.ts +12 -2
  244. package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -2
  245. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +7 -1
  246. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +16 -9
  247. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +22 -11
  248. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +2 -2
  249. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  251. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  252. package/src/sap/fe/core/templating/ActionHelper.js +2 -2
  253. package/src/sap/fe/core/templating/ActionHelper.ts +2 -2
  254. package/src/sap/fe/core/templating/CommonFormatters.js +2 -2
  255. package/src/sap/fe/core/templating/CommonFormatters.ts +3 -3
  256. package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
  257. package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
  258. package/src/sap/fe/core/templating/DataFieldFormatters.js +4 -4
  259. package/src/sap/fe/core/templating/DataFieldFormatters.ts +2 -2
  260. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
  261. package/src/sap/fe/core/templating/DataModelPathHelper.ts +2 -2
  262. package/src/sap/fe/core/templating/EntityTypeHelper.js +2 -2
  263. package/src/sap/fe/core/templating/EntityTypeHelper.ts +2 -2
  264. package/src/sap/fe/core/templating/FieldControlHelper.js +2 -2
  265. package/src/sap/fe/core/templating/FieldControlHelper.ts +2 -2
  266. package/src/sap/fe/core/templating/SemanticObjectHelper.js +2 -2
  267. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +2 -2
  268. package/src/sap/fe/core/templating/UIFormatters.js +7 -7
  269. package/src/sap/fe/core/templating/UIFormatters.ts +6 -6
  270. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  271. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +1 -1
  272. package/src/sap/fe/core/type/Email.js +2 -2
  273. package/src/sap/fe/core/type/Email.ts +1 -1
  274. package/src/sap/fe/core/type/FiscalDate.js +2 -2
  275. package/src/sap/fe/core/type/FiscalDate.ts +1 -1
  276. package/src/sap/fe/core/type/InputMask.js +124 -0
  277. package/src/sap/fe/core/type/InputMask.ts +131 -0
  278. package/ui5.yaml +19 -0
  279. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +0 -81
  280. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +0 -117
  281. package/src/sap/fe/core/helpers/AnnotationEnum.js +0 -33
  282. package/src/sap/fe/core/helpers/AnnotationEnum.ts +0 -21
  283. package/src/sap/fe/core/helpers/BindingToolkit.js +0 -1813
  284. package/src/sap/fe/core/helpers/BindingToolkit.ts +0 -2450
  285. package/src/sap/fe/core/helpers/ClassSupport.js +0 -584
  286. package/src/sap/fe/core/helpers/ClassSupport.ts +0 -697
  287. package/src/sap/fe/core/jsx-runtime/Fragment.js +0 -14
  288. package/src/sap/fe/core/jsx-runtime/Fragment.ts +0 -3
  289. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +0 -93
  290. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +0 -86
  291. package/src/sap/fe/core/jsx-runtime/jsx-control.js +0 -177
  292. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +0 -197
  293. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +0 -237
  294. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +0 -246
  295. package/src/sap/fe/core/jsx-runtime/jsx.js +0 -47
  296. package/src/sap/fe/core/jsx-runtime/jsx.ts +0 -71
  297. package/src/sap/fe/core/jsx-runtime/jsxs.js +0 -10
  298. package/src/sap/fe/core/jsx-runtime/jsxs.ts +0 -3
  299. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +0 -172
  300. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +0 -194
@@ -8,7 +8,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
8
8
  var isNavigationProperty = TypeGuards.isNavigationProperty;
9
9
  var getCreatePopupFields = MetaModelFunction.getCreatePopupFields;
10
10
  var isDataFieldForAction = DataField.isDataFieldForAction;
11
- var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
12
11
  var getCoreUIFactory = UIProvider.getCoreUIFactory;
13
12
  const CreationMode = FELibrary.CreationMode;
14
13
  const ProgrammingModel = FELibrary.ProgrammingModel;
@@ -85,7 +84,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
85
84
  const model = listBinding.getModel();
86
85
  const metaModel = model.getMetaModel();
87
86
  const metaContext = metaModel.getMetaContext(listBinding.getResolvedPath());
88
- const listBindingObjectPath = getInvolvedDataModelObjects(metaContext);
87
+ const listBindingObjectPath = MetaModelConverter.getInvolvedDataModelObjects(metaContext);
89
88
  const defaultFuncOnTargetObject = (_annotations$Common = listBindingObjectPath.targetObject.annotations.Common) === null || _annotations$Common === void 0 ? void 0 : _annotations$Common.DefaultValuesFunction;
90
89
  const defaultFuncOnTargetEntitySet = (_listBindingObjectPat = listBindingObjectPath.targetEntitySet) === null || _listBindingObjectPat === void 0 ? void 0 : (_listBindingObjectPat2 = _listBindingObjectPat.annotations.Common) === null || _listBindingObjectPat2 === void 0 ? void 0 : _listBindingObjectPat2.DefaultValuesFunction;
91
90
  const defaultFunctionName = defaultFuncOnTargetObject ?? defaultFuncOnTargetEntitySet;
@@ -99,7 +98,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
99
98
  return undefined;
100
99
  }
101
100
  const defaultFunctionPath = `${metaModel.getMetaPath(defaultFunctionContext.getPath())}/${defaultFunctionName}`;
102
- const defaultFunctionObjectPath = getInvolvedDataModelObjects(metaModel.getMetaContext(defaultFunctionPath));
101
+ const defaultFunctionObjectPath = MetaModelConverter.getInvolvedDataModelObjects(metaModel.getMetaContext(defaultFunctionPath));
103
102
  const defaultFunctionResult = (_defaultFunctionObjec = defaultFunctionObjectPath.targetObject) !== null && _defaultFunctionObjec !== void 0 && _defaultFunctionObjec.isBound ? await operations.callBoundFunction(defaultFunctionName.toString(), defaultFunctionContext, model) : await operations.callFunctionImport(defaultFunctionName.toString(), model);
104
103
  return defaultFunctionResult.getObject();
105
104
  }
@@ -153,7 +152,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
153
152
  // Add the parent path in the initial data if a parent is provided
154
153
  if (options.parentContext) {
155
154
  var _objectPath$targetEnt, _objectPath$targetEnt2;
156
- const objectPath = getInvolvedDataModelObjects(metaModel.getMetaContext(listBinding.getPath()));
155
+ const objectPath = MetaModelConverter.getInvolvedDataModelObjects(metaModel.getMetaContext(listBinding.getPath()));
157
156
  const hierarchyQualifier = listBinding.getAggregation().hierarchyQualifier;
158
157
  const parentNavigation = (_objectPath$targetEnt = objectPath.targetEntityType.annotations.Aggregation) === null || _objectPath$targetEnt === void 0 ? void 0 : (_objectPath$targetEnt2 = _objectPath$targetEnt[`RecursiveHierarchy#${hierarchyQualifier}`]) === null || _objectPath$targetEnt2 === void 0 ? void 0 : _objectPath$targetEnt2.ParentNavigationProperty.value;
159
158
  if (!parentNavigation) {
@@ -711,7 +710,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
711
710
  const messagesReceived = messageHandling.getMessages().concat(messageHandling.getMessages(true, true)); // get unbound and bound messages present in the model
712
711
  if (!(messagesReceived.length === 1 && messagesReceived[0].getType() === coreLibrary.MessageType.Success)) {
713
712
  // show our object creation toast only if it is not coming from backend
714
- MessageToast.show(isNewObject ? resourceModel.getText("C_TRANSACTION_HELPER_OBJECT_CREATED") : resourceModel.getText("C_TRANSACTION_HELPER_OBJECT_SAVED"));
713
+ const metaModel = context.getModel().getMetaModel();
714
+ const metaContext = metaModel.getMetaContext(context.getPath());
715
+ const entitySet = MetaModelConverter.getInvolvedDataModelObjects(metaContext).targetObject;
716
+ MessageToast.show(isNewObject ? resourceModel.getText("C_TRANSACTION_HELPER_OBJECT_CREATED", undefined, entitySet.name) : resourceModel.getText("C_TRANSACTION_HELPER_OBJECT_SAVED", undefined, entitySet.name));
715
717
  }
716
718
  return oActiveDocument;
717
719
  } catch (err) {
@@ -773,7 +775,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
773
775
  // and the acions it refers to present outside the entitycontainer, hence to obtain kind of the action
774
776
  // split() on its name was required
775
777
  const sName = sActionName.split("/")[1];
776
- sActionName = sName || sActionName;
777
778
  contextToProcess = sName ? undefined : mParameters.contexts;
778
779
  //checking whether the context is an array with more than 0 length or not an array(create action)
779
780
  if (contextToProcess && (Array.isArray(contextToProcess) && contextToProcess.length || !Array.isArray(contextToProcess))) {
@@ -789,10 +790,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
789
790
  // get the binding parameters $select and $expand for the side effect on this action
790
791
  // also gather additional property paths to be requested such as text associations
791
792
  // ensure deepClone so the original SideEffects mapping is not modified (BCP: 2380117956)
792
- const mSideEffectsParameters = deepClone(appComponent.getSideEffectsService().getODataActionSideEffects(sActionName, contextToProcess)) || {};
793
+ const mSideEffectsParameters = deepClone(appComponent.getSideEffectsService().getODataActionSideEffects(sName || sActionName, contextToProcess)) || {};
793
794
  try {
794
795
  let oResult;
795
- if (contextToProcess && oModel) {
796
+ if (contextToProcess) {
796
797
  oResult = await operations.callBoundAction(sActionName, mParameters.contexts, oModel, appComponent, {
797
798
  parameterValues: mParameters.parameterValues,
798
799
  invocationGrouping: mParameters.invocationGrouping,
@@ -1151,4 +1152,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUti
1151
1152
  const singleton = new TransactionHelper();
1152
1153
  return singleton;
1153
1154
  }, false);
1154
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJkZWZhdWx0RnVuY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uUmVzdWx0IiwiaXNCb3VuZCIsIm9wZXJhdGlvbnMiLCJjYWxsQm91bmRGdW5jdGlvbiIsInRvU3RyaW5nIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiY3JlYXRlQ29udGV4dCIsImluaXRpYWxEYXRhIiwib3B0aW9ucyIsImRhdGFGb3JDcmVhdGlvbiIsImxpc3RCaW5kaW5nRm9yQ3JlYXRpb24iLCJwYXJlbnRDb250ZXh0IiwiaXNFeHBhbmRlZCIsImV4cGFuZCIsIk9iamVjdCIsImFzc2lnbiIsImJpbmRMaXN0IiwiJCRncm91cElkIiwiZ2V0R3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvYmplY3RQYXRoIiwicGFyZW50TmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJBZ2dyZWdhdGlvbiIsIlBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eSIsInZhbHVlIiwiRXJyb3IiLCJwYXJlbnRCaW5kaW5nRGF0YSIsImNyZWF0ZSIsImNyZWF0ZUF0RW5kIiwiY3JlYXRlSW5hY3RpdmUiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJjcmVhdGVEYXRhIiwibWV0YVBhdGgiLCJub25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJnZXRDcmVhdGVQb3B1cEZpZWxkcyIsImZpbHRlciIsImZpZWxkTmFtZSIsImNyZWF0ZURvY3VtZW50IiwibWFpbkxpc3RCaW5kaW5nIiwiaW5QYXJhbWV0ZXJzIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwibmV3RG9jdW1lbnRDb250ZXh0IiwicGFyYW1ldGVycyIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRCdXN5UGF0aCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiaW5hY3RpdmUiLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJwZXJmb3JtQWN0aW9uT3JDcmVhdGlvbiIsInNob3dNZXNzYWdlRGlhbG9nIiwiY29udHJvbCIsInBhcmVudENvbnRyb2wiLCJlcnJvciIsIkNvbnN0YW50cyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImlzVHJhbnNpZW50IiwiZGVsZXRlIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJjcmVhdGVEb2N1bWVudENvbnRleHQiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiZW50cmllcyIsIm1hcCIsImtleSIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiTG9nIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJyZWR1Y2UiLCJyZXN1bHQiLCJjdXJyZW50T2JqZWN0IiwibWVzc2FnZXNQYXRoIiwiZ2V0TWVzc2FnZXNQYXRoIiwiY3JlYXRlSGFzaCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsImNvbXBvbmVudERhdGEiLCJnZXRDb21wb25lbnREYXRhIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJuZXdBY3Rpb24iLCJfZ2V0TmV3QWN0aW9uIiwiYmluZGluZ1BhcmFtZXRlcnMiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJiSXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhIiwiaXNOZXdQYWdlQ3JlYXRpb24iLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIklubGluZSIsIm5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsImNyZWF0ZVdpdGhEaWFsb2ciLCJ3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbiIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJtc2ciLCJtZXNzYWdlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwicmVzb3VyY2VNb2RlbCIsImNvbnRleHRzVG9EZWxldGUiLCJBcnJheSIsImlzQXJyYXkiLCJyZWplY3QiLCJkcmFmdEVuYWJsZWQiLCJzZWxlY3RlZENvbnRleHRzIiwiaXRlbXMiLCJ1blNhdmVkQ29udGV4dCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxvY2tlZENvbnRleHQiLCJmaW5kIiwiY29udGV4dCIsImNvbnRleHREYXRhIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwibG9ja2luZ1VzZXJOYW1lIiwiTWVzc2FnZUJveCIsInNob3ciLCJnZXRUZXh0IiwidGl0bGUiLCJvbkNsb3NlIiwibm9uVGFibGVUeHQiLCJ1blNhdmVkQ29udGV4dFVzZXIiLCJlbnRpdHlTZXROYW1lIiwiZGVzY3JpcHRpb24iLCJwdXNoIiwidHlwZSIsImRlbGV0YWJsZUNvbnRleHRzIiwidGV4dCIsInNlbGVjdGVkIiwiVEVYVCIsInRvdGFsRGVsZXRhYmxlIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJ1blNhdmVkQ29udGV4dHMiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJnZXROb25EZWxldGFibGVUZXh0Iiwib3B0aW9uc0RlbGV0YWJsZVRleHRzIiwiZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwiY29tbW9uQmluZGluZyIsImdldEJpbmRpbmciLCJpblRyZWVUYWJsZSIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJmbkNvbmZpcm0iLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwib0Vycm9yIiwiZGlhbG9nIiwiY3JlYXRlRGVsZXRlRGlhbG9nIiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImZuUmVqZWN0IiwiZGlhbG9nQ29uZmlybWVkIiwidkJveCIsIlZCb3giLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJhcmlhTGFiZWxsZWRCeSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZWRpdERvY3VtZW50IiwiZ3JvdXBJZCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9OZXdDb250ZXh0IiwiZHJhZnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJlcnIiLCJzaG93TWVzc2FnZXMiLCJjb25jdXJyZW50RWRpdEZsYWciLCJjYW5jZWxEb2N1bWVudCIsIm1JblBhcmFtZXRlcnMiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJvTW9kZWwiLCJyZXR1cm5lZFZhbHVlIiwiZHJhZnREYXRhQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRBZG1pbkRhdGEiLCJyZXF1ZXN0T2JqZWN0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9jb25maXJtRGlzY2FyZCIsImNhbmNlbEJ1dHRvbiIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZURyYWZ0Iiwib1NpYmxpbmdDb250ZXh0Iiwic0Nhbm9uaWNhbFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJvQWN0aXZlRG9jdW1lbnQiLCJhY3RpdmF0ZURvY3VtZW50IiwibWVzc2FnZXNSZWNlaXZlZCIsImdldE1lc3NhZ2VzIiwiY29uY2F0IiwiZ2V0VHlwZSIsImNvcmVMaWJyYXJ5IiwiTWVzc2FnZVR5cGUiLCJTdWNjZXNzIiwiTWVzc2FnZVRvYXN0IiwiZm9yRWFjaCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNBY3Rpb25OYW1lIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiY29udGV4dFRvUHJvY2VzcyIsIm1CaW5kaW5nUGFyYW1ldGVycyIsInNOYW1lIiwic3BsaXQiLCJtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzIiwiZGVlcENsb25lIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsIm9SZXN1bHQiLCJjYWxsQm91bmRBY3Rpb24iLCJwYXJhbWV0ZXJWYWx1ZXMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsIm9uU3VibWl0dGVkIiwib25SZXNwb25zZSIsImNvbnRyb2xJZCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYkdldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwic2VsZWN0ZWRJdGVtcyIsImlnbm9yZUVUYWciLCJjYWxsQWN0aW9uSW1wb3J0IiwiX2hhbmRsZUFjdGlvblJlc3BvbnNlIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwiYWN0aW9uTmFtZSIsInNldFByb3BlcnR5IiwiYnlJZCIsImhhbmRsZVZhbGlkYXRpb25FcnJvciIsImVycm9yVG9SZW1vdmUiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwiX2NyZWF0ZVBvcG92ZXIiLCJzZXR0aW5ncyIsIlBvcG92ZXIiLCJpc01vZGlmaWVkIiwic2V0RW5hYmxlZCIsImNvbmZpcm1hdGlvblBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiVGV4dCIsImNvbmZpcm1CdXR0b24iLCJ3aWR0aCIsImFkZENvbnRlbnQiLCJhdHRhY2hCZWZvcmVPcGVuIiwic2V0SW5pdGlhbEZvY3VzIiwiYXR0YWNoQWZ0ZXJDbG9zZSIsIm9wZW5CeSIsImZpZWxkTmFtZXMiLCJsaXN0TWV0YVBhdGgiLCJ0cmFuc2llbnRMaXN0QmluZGluZyIsInJlZnJlc2hJbnRlcm5hbCIsInRyYW5zaWVudENvbnRleHQiLCJmaWVsZE1ldGFDb250ZXh0cyIsIm5hbWUiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNyZWF0ZURpYWxvZyIsImdldENvcmVVSUZhY3RvcnkiLCJuZXdDcmVhdGVEaWFsb2ciLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJvcGVuRGlhbG9nIiwiZSIsInJlc3VsdFByb21pc2VLZWVwZXIiLCJQcm9taXNlS2VlcGVyIiwib25FeGl0RGlhbG9nIiwiZXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJjbG9zZURpYWxvZyIsInNldEJ1c3kiLCJiSXNDcmVhdGVEaWFsb2ciLCJ0cmFuc2llbnREYXRhIiwia2V5cyIsInByb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwic3RhcnRzV2l0aCIsImNyZWF0ZURhdGFBc0FycmF5IiwiVWlNb2RlbENvbnN0YW50cyIsIkRvY3VtZW50TW9kaWZpZWQiLCJuZXdDb250ZXh0IiwiY3JlYXRpb25TdWNjZXNzIiwiQ3JlYXRpb25GYWlsZWQiLCJhdHRhY2hFeGl0RGlhbG9nIiwicHJvbWlzZSIsInByb21pc2VLZWVwZXIiLCJwYXJlbnRMaXN0QmluZGluZyIsIm9uQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRlZENvbnRleHQiLCJzdWNjZXNzIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwiYXR0YWNoQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRpb25TdWNjZXNzZnVsIiwiY3JlYXRlZCIsImNhdGNoIiwiY29udGV4dEVycm9yIiwidHJhY2UiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzQ3JlYXRlSGFzaCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJzTmV3QWN0aW9uIiwicHJlZmVycmVkTW9kZSIsInRvVXBwZXJDYXNlIiwiaW5jbHVkZXMiLCJzUHJlZmVycmVkTW9kZSIsIm9SZXNvdXJjZUJ1bmRsZUNvcmUiLCJsaW5lSXRlbXMiLCJsaW5lSXRlbSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiLCJzaW5nbGV0b24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uLCBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBMaW5lSXRlbSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXhpdERpYWxvZ0V2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB7IGdldENvcmVVSUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzRGF0YUZpZWxkRm9yQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZU9wdGlvbiwgRGVsZXRlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IGRlbGV0ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRDcmVhdGVQb3B1cEZpZWxkcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IHRvRVM2UHJvbWlzZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Ub0VTNlByb21pc2VcIjtcbmltcG9ydCB7IGlzTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCB0eXBlIHsgJFBvcG92ZXJTZXR0aW5ncyB9IGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuXG4vL0VudW1zIGZvciBkZWxldGUgdGV4dCBjYWxjdWxhdGlvbnMgZm9yIGRlbGV0ZSBjb25maXJtIGRpYWxvZy5cbmNvbnN0IERlbGV0ZU9wdGlvblR5cGVzID0gZGVsZXRlSGVscGVyLkRlbGV0ZU9wdGlvblR5cGVzO1xuY29uc3QgRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wgPSBkZWxldGVIZWxwZXIuRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2w7XG5cbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVyczxUPihtUGFyYW1ldGVycz86IEV2ZW50IHwgVCk6IFQge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSAmJiAobVBhcmFtZXRlcnMgYXMgRXZlbnQpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9IGFzIFQ7XG5cdH1cblx0cmV0dXJuIChtUGFyYW1ldGVycyBhcyBUKSB8fCAoe30gYXMgVCk7XG59XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdGJ1c3lJZD86IHN0cmluZztcblx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGluYWN0aXZlPzogYm9vbGVhbjtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZT86IHN0cmluZztcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG59O1xuXG5leHBvcnQgdHlwZSBDYW5jZWxQYXJhbWV0ZXJzID0geyBjYW5jZWxCdXR0b246IEJ1dHRvbjsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuOyBiZWZvcmVDYW5jZWxDYWxsQmFjaz86IEZ1bmN0aW9uIH07XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMgPSBEZWxldGVQYXJhbWV0ZXJzICYge1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdG5vRGlhbG9nPzogYm9vbGVhbjtcbn07XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0YnVzeUxvY2soYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGJ1c3lQYXRoPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRidXN5VW5sb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogT0RhdGFWNENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGxldCBwYXRoOiBzdHJpbmc7XG5cdFx0aWYgKHNvdXJjZS5pc0E8T0RhdGFWNENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdHBhdGggPSBzb3VyY2UuZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoID0gKHNvdXJjZS5pc1JlbGF0aXZlKCkgPyBzb3VyY2UuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBzb3VyY2UuZ2V0UGF0aCgpKSA/PyBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBwYXRoKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0fSBlbHNlIGlmIChtZXRhTW9kZWwgJiYgTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG1ldGFNb2RlbCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyB2YWxpZGF0ZURvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtUGFyYW1ldGVyczogeyBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24/OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG5cdFx0b1ZpZXc6IFZpZXdcblx0KTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGRlZmF0dWwgdmFsdWVzIGZyb20gdGhlIERlZmF1bHRWYWx1ZSBmdW5jdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdG8gYmUgdXNlZCBmb3IgY3JlYXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIChvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTxvYmplY3QgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgYXMgc3RyaW5nKTtcblx0XHRjb25zdCBsaXN0QmluZGluZ09iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA9IChsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSB8IEVudGl0eVNldCkuYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0IHwgdW5kZWZpbmVkKT8uYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25OYW1lID0gZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA/PyBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0O1xuXG5cdFx0aWYgKCFkZWZhdWx0RnVuY3Rpb25OYW1lKSB7XG5cdFx0XHQvLyBObyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZ1bmN0aW9uT25OYXZQcm9wID0gaXNOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldE9iamVjdCkgJiYgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbkNvbnRleHQgPSBmdW5jdGlvbk9uTmF2UHJvcCA/IGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSA6IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRpZiAoIWRlZmF1bHRGdW5jdGlvbkNvbnRleHQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoZGVmYXVsdEZ1bmN0aW9uQ29udGV4dC5nZXRQYXRoKCkpfS8ke2RlZmF1bHRGdW5jdGlvbk5hbWV9YDtcblxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGRlZmF1bHRGdW5jdGlvblBhdGgpKTtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25SZXN1bHQgPSAoZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgQWN0aW9uKT8uaXNCb3VuZFxuXHRcdFx0PyBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKGRlZmF1bHRGdW5jdGlvbk5hbWUudG9TdHJpbmcoKSwgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCwgbW9kZWwpXG5cdFx0XHQ6ICgoYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBtb2RlbCkpIGFzIE9EYXRhVjRDb250ZXh0KTtcblxuXHRcdHJldHVybiBkZWZhdWx0RnVuY3Rpb25SZXN1bHQuZ2V0T2JqZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbGlzdCBiaW5kaW5nIGNvcnJlc3BvbmRzIHRvIGEgaGllcmFyY2h5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGlzdCBiaW5kaW5nIGlzIGhpZXJhcmNoaWNhbC5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmhpZXJhcmNoeVF1YWxpZmllciA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW4gYSBsaXN0IGJpbmRpbmcuIEhhbmRsZXMgYm90aCBmbGF0IGFuZCBoaWVyYXJjaGljYWwgY2FzZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gaW5pdGlhbERhdGEgSW5pdGlhbCBkYXRhIHRvIGNyZWF0ZSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wdGlvbnMgQ3JlYXRpb24gb3B0aW9ucy5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYVx0IGNoaWxkIG9mIHRoaXMgY29udGV4dCAob255IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5pdGlhbERhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCxcblx0XHRvcHRpb25zOiB7IGNyZWF0ZUF0RW5kPzogYm9vbGVhbjsgY3JlYXRlSW5hY3RpdmU/OiBib29sZWFuOyBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQgfVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgZGF0YUZvckNyZWF0aW9uID0gaW5pdGlhbERhdGEgPz8ge307XG5cblx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0bGV0IGxpc3RCaW5kaW5nRm9yQ3JlYXRpb246IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0Py5pc0V4cGFuZGVkKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCBhbHJlYWR5IGhhcyBjaGlsZHJlbiBhbmQgaXMgY29sbGFwc2VkLCB3ZSBleHBhbmQgaXQgZmlyc3Rcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcuZXhwYW5kKG9wdGlvbnMucGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHsgXCJAJHVpNS5ub2RlLnBhcmVudFwiOiBvcHRpb25zLnBhcmVudENvbnRleHQgfSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBsaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFic29sdXRlIGJpbmRpbmc6IGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnRcblx0XHRcdFx0Ly8gV2UgdXNlIGEgdGVtcG9yYXJ5IGZsYXQgbGlzdEJpbmRpbmcgZm9yIHRoZSBjcmVhdGlvbiwgdG8gYXZvaWQgYWRkaW5nIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgdGFibGUgKHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBpdCB1bnRpbCBpdCdzIHNhdmVkKVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIHRoZSBwYXJlbnQgcGF0aCBpbiB0aGUgaW5pdGlhbCBkYXRhIGlmIGEgcGFyZW50IGlzIHByb3ZpZGVkXG5cdFx0XHRcdGlmIChvcHRpb25zLnBhcmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0XHRjb25zdCBoaWVyYXJjaHlRdWFsaWZpZXIgPSAobGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcjogc3RyaW5nIH0pLmhpZXJhcmNoeVF1YWxpZmllcjtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnROYXZpZ2F0aW9uID1cblx0XHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5BZ2dyZWdhdGlvbj8uW2BSZWN1cnNpdmVIaWVyYXJjaHkjJHtoaWVyYXJjaHlRdWFsaWZpZXJ9YF1cblx0XHRcdFx0XHRcdFx0Py5QYXJlbnROYXZpZ2F0aW9uUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdFx0aWYgKCFwYXJlbnROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHBhcmVudCBuYXZpZ2F0aW9uIHByb3BlcnR5IGZvciAke2xpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50QmluZGluZ0RhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRcdFx0XHRwYXJlbnRCaW5kaW5nRGF0YVtgJHtwYXJlbnROYXZpZ2F0aW9ufUBvZGF0YS5iaW5kYF0gPSBvcHRpb25zLnBhcmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2UoL15cXC8vLCBcIlwiKTsgLy8gUmVtb3ZlIGxlYWRpbmcgXCIvXCIgZnJvbSB0aGUgcGF0aFxuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oZGF0YUZvckNyZWF0aW9uLCBwYXJlbnRCaW5kaW5nRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24uY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBsaXN0QmluZGluZy5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlLCBvcHRpb25zLmNyZWF0ZUF0RW5kLCBvcHRpb25zLmNyZWF0ZUluYWN0aXZlKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cblx0XHRjb25zdCBub25Db21wdXRlZFZpc2libGVGaWVsZHMgPSBnZXRDcmVhdGVQb3B1cEZpZWxkcyhtZXRhTW9kZWwsIG1ldGFQYXRoLCBhcHBDb21wb25lbnQpO1xuXHRcdC8vIERvIG5vdCBjb25zaWRlciBmaWVsZHMgZm9yIHdoaWNoIHdlIHByb3ZpZGUgc29tZSBpbml0aWFsIGRhdGFcblx0XHRyZXR1cm4gbm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzLmZpbHRlcigoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdHJldHVybiAhKGZpZWxkTmFtZSBpbiAoY3JlYXRlRGF0YSA/PyB7fSkpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmJ1c3lNb2RlXSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZSBUT0RPOiB0byBiZSByZWZhY3RvcmVkXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmJ1c3lJZF0gSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRdIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuaW5hY3RpdmVdIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRsZXQgbmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhpblBhcmFtZXRlcnMpO1xuXHRcdGlmICghbWFpbkxpc3RCaW5kaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIHJlcXVpcmVkIGZvciBuZXcgZG9jdW1lbnQgY3JlYXRpb25cIik7XG5cdFx0fVxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ3JlYXRlIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHRjb25zdCBidXN5UGF0aCA9IHRoaXMuZ2V0QnVzeVBhdGgocGFyYW1ldGVycyk7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGZyb21Db3B5UGFzdGUgPyB1bmRlZmluZWQgOiBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXHRcdGlmICghaW5QYXJhbWV0ZXJzPy5pbmFjdGl2ZSkge1xuXHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQsIGJ1c3lQYXRoKTtcblx0XHR9XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGVDb3JlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHR0cnkge1xuXHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQWN0aW9uT3JDcmVhdGlvbihcblx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRyZXNvdXJjZUJ1bmRsZUNvcmUsXG5cdFx0XHRcdGZyb21Db3B5UGFzdGVcblx0XHRcdCk7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCB9KTtcblx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQhO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCB9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCB8fCBlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpICYmXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dD8uaXNUcmFuc2llbnQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBtb2RlbCBhcyBDb250ZXh0LmRlbGV0ZSByZXN1bHRzIGluIGFuIGVycm9yXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSB0aGUgJGRpcmVjdCBvbmNlIG1vZGVsIHJlc29sdmVzIHRoaXMgaXNzdWVcblx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoIWluUGFyYW1ldGVycz8uaW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCwgYnVzeVBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0QnVzeVBhdGgobVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMpOiBzdHJpbmcge1xuXHRcdHJldHVybiBtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiID8gYC9idXN5TG9jYWwvJHttUGFyYW1ldGVycy5idXN5SWR9YCA6IFwiL2J1c3lcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5TW9kZSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5SWQgSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmluYWN0aXZlIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIENyZWF0ZSB0aGUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVJbmFjdGl2ZSBDcmVhdGUgdGhlIGNvbnRleHQgYXMgaW5hY3RpdmUgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGEgY2hpbGQgb2YgdGhpcyBjb250ZXh0IChvbmx5IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZURvY3VtZW50Q29udGV4dChtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdC8vYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgZXhwZWN0cyBjcmVhdGVQYXJhbWV0ZXJzIG9mIHR5cGUgYW55W11cblx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmRhdGEgPyBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzLmRhdGEpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBba2V5XTogdmFsdWUgfSkpIDogW107XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0b0VTNlByb21pc2UoXG5cdFx0XHRcdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbWFpbkxpc3RCaW5kaW5nICYmIG1haW5MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBjcmVhdGVQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cGFyYW1ldGVycy5kYXRhID0gY3JlYXRlUGFyYW1ldGVycy5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAuLi5yZXN1bHQsIC4uLmN1cnJlbnRPYmplY3QgfTtcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29udGV4dChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMuZGF0YSwge1xuXHRcdFx0Y3JlYXRlQXRFbmQ6ICEhcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdGNyZWF0ZUluYWN0aXZlOiAhIXBhcmFtZXRlcnMuaW5hY3RpdmUsXG5cdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGVpdGhlciB2aWEgbmV3IEFjdGlvbiBvciBjcmVhdGVEb2N1bWVudENvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVDb3JlIENvcmUgcmVzb3VyY2UgYnVuZGxlXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwZXJmb3JtQWN0aW9uT3JDcmVhdGlvbihcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0cmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZSxcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCBtb2RlbCA9IG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0bWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpLFxuXHRcdFx0bWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG1ldGFNb2RlbCwgbWV0YVBhdGgpLFxuXHRcdFx0Y3JlYXRlSGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdGNvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpLFxuXHRcdFx0c3RhcnR1cFBhcmFtZXRlcnMgPSAoY29tcG9uZW50RGF0YSAmJiBjb21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fSxcblx0XHRcdG5ld0FjdGlvbiA9ICFtYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpID8gdGhpcy5fZ2V0TmV3QWN0aW9uKHN0YXJ0dXBQYXJhbWV0ZXJzLCBjcmVhdGVIYXNoLCBtZXRhTW9kZWwsIG1ldGFQYXRoKSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyczogQmluZENvbnRleHRQYXJhbWV0ZXJzID0geyAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlIH07XG5cblx0XHRpZiAobWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVyc1tcIiRzZWxlY3RcIl0gPSBtZXNzYWdlc1BhdGg7XG5cdFx0fVxuXHRcdGxldCByZXN1bHQ6IHVua25vd247XG5cdFx0aWYgKG5ld0FjdGlvbikge1xuXHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0XHRuZXdBY3Rpb24sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb250ZXh0czogbWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG1ldGFNb2RlbCwgbWV0YVBhdGgsIG5ld0FjdGlvbiwgcmVzb3VyY2VCdW5kbGVDb3JlKSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0cGFyZW50Q29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2dcblx0XHRcdFx0fSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiByZXN1bHQgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxldCBuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRjb25zdCBpbml0aWFsRGF0YSA9IHBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdFx0aWYgKCFmcm9tQ29weVBhc3RlKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKG1haW5MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0cGFyYW1ldGVycy5kYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhLCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0XHRkZWxldGUgcGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0Y29uc3Qgbm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gaXNOZXdQYWdlQ3JlYXRpb25cblx0XHRcdFx0XHQ/IHRoaXMuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKG1haW5MaXN0QmluZGluZywgaW5pdGlhbERhdGEsIGFwcENvbXBvbmVudClcblx0XHRcdFx0XHQ6IFtdO1xuXHRcdFx0XHRpZiAobm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVdpdGhEaWFsb2coXG5cdFx0XHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRub25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMsXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlRG9jdW1lbnRDb250ZXh0KG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0aWYgKCFwYXJhbWV0ZXJzLmluYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0RvY3VtZW50Q29udGV4dCwgcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID09PSB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdGNvbnN0IG1zZyA9IHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIiA/IGVycm9yIDogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID8/IGVycm9yO1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIG1zZyk7XG5cdFx0XHRcdHRocm93IG1zZztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfaXNEcmFmdEVuYWJsZWQodkNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29udGV4dEZvckRyYWZ0TW9kZWwgPSB2Q29udGV4dHNbMF07XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dEZvckRyYWZ0TW9kZWwpO1xuXHRcdHJldHVybiBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgTnVtYmVyIG9mIG9iamVjdHMgc2VsZWN0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm5vRGlhbG9nIFRvIGRpc2FibGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVEb2N1bWVudChcblx0XHRjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdG1QYXJhbWV0ZXJzOiBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gZGVsZXRlIGRvY3VtZW50IGxvY2tcblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRjb25zdCBjb250ZXh0c1RvRGVsZXRlID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBbLi4uY29udGV4dHNdIDogW2NvbnRleHRzXTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkcmFmdEVuYWJsZWQgPSB0aGlzLl9pc0RyYWZ0RW5hYmxlZChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIHx8IGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0XHRjb25zdCBpdGVtczogQ29udHJvbFtdID0gW107XG5cdFx0XHRcdGxldCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSA9IFtdO1xuXHRcdFx0XHRsZXQgdW5TYXZlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRcdFx0Ly8gaXRlbXModGV4dHMpIGFuZCBvcHRpb25zKGNoZWNrQm94ZXMgYW5kIHNpbmdsZSBkZWZhdWx0IG9wdGlvbikgZm9yIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0Ly8gbm9uLVRhYmxlXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIDEgb2YgdGhlIGRyYWZ0cyBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0RGF0YSA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IWNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkRyYWZ0SXNDcmVhdGVkQnlNZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAobG9ja2VkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNob3cgbWVzc2FnZSBib3ggd2l0aCB0aGUgbmFtZSBvZiB0aGUgbG9ja2luZyB1c2VyIGFuZCByZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBsb2NraW5nVXNlck5hbWUgPSBsb2NrZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3coXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bG9ja2luZ1VzZXJOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogcmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5TYXZlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHsgSXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB9ID0gY29udGV4dC5nZXRPYmplY3QoKSB8fCB7fTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBJc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJiBIYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJiAhIURyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhPy5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRsZXQgbm9uVGFibGVUeHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0aWYgKHVuU2F2ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHVuU2F2ZWRDb250ZXh0VXNlciA9IHVuU2F2ZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLFxuXHRcdFx0XHRcdFx0XHRcdFt1blNhdmVkQ29udGV4dFVzZXJdLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMudGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLnRpdGxlLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9PTkxZXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGVdLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdHRleHQ6IG5vblRhYmxlVHh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0Y29udHJvbDogRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wuVEVYVFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRhYmxlXG5cdFx0XHRcdFx0XHRsZXQgdG90YWxEZWxldGFibGUgPSBjb250ZXh0c1RvRGVsZXRlLmxlbmd0aDtcblxuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSArPVxuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM/Lmxlbmd0aCA/PyAwKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUsXG5cdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRpdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBub25EZWxldGFibGVUZXh0ID0gZGVsZXRlSGVscGVyLmdldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHRvdGFsRGVsZXRhYmxlLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0aWYgKG5vbkRlbGV0YWJsZVRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtcy5wdXNoKG5vbkRlbGV0YWJsZVRleHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IG9wdGlvbnNEZWxldGFibGVUZXh0cyA9IGRlbGV0ZUhlbHBlci5nZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b3B0aW9ucyA9IFsuLi5vcHRpb25zLCAuLi5vcHRpb25zRGVsZXRhYmxlVGV4dHNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGNvbW1vbkJpbmRpbmcgPSAobVBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyA/PyBjb250ZXh0c1RvRGVsZXRlKVswXS5nZXRCaW5kaW5nKCkgYXMgQmluZGluZztcblx0XHRcdFx0Y29uc3QgaW5UcmVlVGFibGUgPVxuXHRcdFx0XHRcdGNvbW1vbkJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiZcblx0XHRcdFx0XHR0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwoY29tbW9uQmluZGluZyk7XG5cblx0XHRcdFx0Ly8gQ29udGVudCBvZiBEZWxldGUgRGlhbG9nXG5cdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnMsIGl0ZW1zKTtcblx0XHRcdFx0Y29uc3QgZm5Db25maXJtID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkZWxldGVIZWxwZXIuZGVsZXRlQ29uZmlybUhhbmRsZXIoXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRkcmFmdEVuYWJsZWQsXG5cdFx0XHRcdFx0XHRcdGluVHJlZVRhYmxlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCBkaWFsb2cgPSB0aGlzLmNyZWF0ZURlbGV0ZURpYWxvZyhpdGVtcywgbVBhcmFtZXRlcnMsIHJlc291cmNlTW9kZWwsIGZuQ29uZmlybSwgcmVqZWN0KTtcblxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0ZGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Ly8gZGVsZXRlIGRvY3VtZW50IHVubG9ja1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgZm8gdGhlIGRlbGV0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbXMgQW4gYXJyYXkgb2YgY29udHJvbHMgdXNlZCBmb3IgdGhlIGRpYWxvZyBjb250ZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCBQYXJlbnQgY29udHJvbCBvZiB0aGUgZGVsZXRlIGJ1dHRvbiBpZiBhbnlcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBjdXJyZW50IGVudGl0eVNldFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZm5Db25maXJtIEZ1bmN0aW9uIGV4ZWN1dGVkIHVwb24gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRlbGV0aW9uXG5cdCAqIEBwYXJhbSBmblJlamVjdCBGdW5jdGlvbiBleGVjdXRlZCBpZiB0aGUgZGlhbG9nIGlzIGNsb3NlZCB2aWEgQ2FuY2VsIG9yIEVzY2FwZSBidXR0b25cblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgZGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICovXG5cdGNyZWF0ZURlbGV0ZURpYWxvZyhcblx0XHRpdGVtczogQ29udHJvbFtdLFxuXHRcdHBhcmFtZXRlcnM6IFBhcnRpYWw8eyBwYXJlbnRDb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkOyBlbnRpdHlTZXROYW1lOiBzdHJpbmcgfT4sXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRmbkNvbmZpcm06IEZ1bmN0aW9uLFxuXHRcdGZuUmVqZWN0OiBGdW5jdGlvblxuXHQpOiBEaWFsb2cge1xuXHRcdGxldCBkaWFsb2dDb25maXJtZWQgPSBmYWxzZTtcblx0XHRjb25zdCB2Qm94ID0gbmV3IFZCb3goeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGVDb3JlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRsZXQgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy5wYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aXRsZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIk1fQ09NTU9OX1RBQkxFX0RFTEVURVwiLCB1bmRlZmluZWQsIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRpdGxlID0gcmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGRpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IHRpdGxlLFxuXHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0Y29udGVudDogW3ZCb3hdLFxuXHRcdFx0YXJpYUxhYmVsbGVkQnk6IGl0ZW1zLFxuXHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiB0aXRsZSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0ZGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdGRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0ZGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdGlmICghZGlhbG9nQ29uZmlybWVkKSB7XG5cdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBkaWFsb2c7XG5cdH1cblxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBlZGl0RG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG9WaWV3OiBGRVZpZXcsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGdyb3VwSWQ6IHN0cmluZ1xuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdFx0fVxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5jcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGJQcmVzZXJ2ZUNoYW5nZXM6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0b1ZpZXc6IG9WaWV3XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBjb25jdXJyZW50RWRpdEZsYWc6IHRydWUgfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYW5jZWwgJ2VkaXQnIG1vZGUgb2YgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGNhbmNlbGVkIG9yIGRlbGV0ZWRcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gQ2FuY2VsIEJ1dHRvbiBvZiB0aGUgZGlzY2FyZCBwb3BvdmVyIChtYW5kYXRvcnkgZm9yIG5vdylcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBpbmNhc2Ugb2YgZHJhZnQgYXBwbGljYXRpb25zIHdoaWxlIG5hdmlnYXRpbmcgb3V0IG9mIE9QXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBpc09iamVjdE1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgdXNlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG1JblBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW4sXG5cdFx0aXNPYmplY3RNb2RpZmllZDogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGxldCByZXR1cm5lZFZhbHVlOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmICFpc09iamVjdE1vZGlmaWVkKSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGF3YWl0IGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpc09iamVjdE1vZGlmaWVkID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSAhPT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3Zlcikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9jb25maXJtRGlzY2FyZChtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24sIGlzT2JqZWN0TW9kaWZpZWQsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9Db250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIGNvbnRleHQgaXMga2VwdCBhbGl2ZSB3ZSBzZXQgaXQgYWdhaW4gdG8gZGV0YWNoIHRoZSBvbkJlZm9yZURlc3Ryb3kgY2FsbGJhY2sgYW5kIGhhbmRsZSBuYXZpZ2F0aW9uIGhlcmVcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgbmVlZHMgdG8gc3RpbGwgYmUga2VwdCBhbGl2ZSB0byBiZSBhYmxlIHRvIHJlc2V0IGNoYW5nZXMgcHJvcGVybHlcblx0XHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKHRydWUsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRpZiAoaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvU2libGluZ0NvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gYXdhaXQgb1NpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gb01vZGVsLmJpbmRDb250ZXh0KHNDYW5vbmljYWxQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IGRpc2NhcmRlZENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRyZXR1cm4gcmV0dXJuZWRWYWx1ZTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBzYXZlZFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgVHJ1ZSBpZiB3ZSBzaG91bGQgZXhlY3V0ZSBzaWRlIGVmZmVjdHMgaW4gY2FzZSBvZiBhbiBlcnJvclxuXHQgKiBAcGFyYW0gYmluZGluZ3NGb3JTaWRlRWZmZWN0cyBUaGUgbGlzdEJpbmRpbmdzIHRvIGJlIHVzZWQgZm9yIGV4ZWN1dGluZyBzaWRlIGVmZmVjdHMgb24gZXJyb3Jcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgc2F2ZURvY3VtZW50KFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYm9vbGVhbixcblx0XHRiaW5kaW5nc0ZvclNpZGVFZmZlY3RzOiBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIHt9LCBtZXNzYWdlSGFuZGxlcilcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cblx0XHRcdGNvbnN0IG1lc3NhZ2VzUmVjZWl2ZWQgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXMoKS5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTsgLy8gZ2V0IHVuYm91bmQgYW5kIGJvdW5kIG1lc3NhZ2VzIHByZXNlbnQgaW4gdGhlIG1vZGVsXG5cdFx0XHRpZiAoIShtZXNzYWdlc1JlY2VpdmVkLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlc1JlY2VpdmVkWzBdLmdldFR5cGUoKSA9PT0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGUuU3VjY2VzcykpIHtcblx0XHRcdFx0Ly8gc2hvdyBvdXIgb2JqZWN0IGNyZWF0aW9uIHRvYXN0IG9ubHkgaWYgaXQgaXMgbm90IGNvbWluZyBmcm9tIGJhY2tlbmRcblx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdFx0aXNOZXdPYmplY3Rcblx0XHRcdFx0XHRcdD8gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX0NSRUFURURcIilcblx0XHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAoZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciAmJiBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMuZm9yRWFjaCgobGlzdEJpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb246IEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0XSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gcHJvbWlzZSByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXBcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ncm91cElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5pZ25vcmVFVGFnXSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGRpc2FibGVTdHJpY3RIYW5kbGluZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYWxsQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGJHZXRCb3VuZENvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0XHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSxcblx0XHRvVmlldzogVmlldyB8IG51bGwsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRsZXQgY29udGV4dFRvUHJvY2Vzcztcblx0XHRsZXQgb01vZGVsOiBPRGF0YU1vZGVsIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdGlmICghc0FjdGlvbk5hbWUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlByb3ZpZGUgbmFtZSBvZiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcIik7XG5cdFx0fVxuXHRcdC8vIGFjdGlvbiBpbXBvcnRzIGFyZSBub3QgZGlyZWN0bHkgb2J0YWluZWQgZnJvbSB0aGUgbWV0YU1vZGVsIGJ5IGl0IGlzIHByZXNlbnQgaW5zaWRlIHRoZSBlbnRpdHlDb250YWluZXJcblx0XHQvLyBhbmQgdGhlIGFjaW9ucyBpdCByZWZlcnMgdG8gcHJlc2VudCBvdXRzaWRlIHRoZSBlbnRpdHljb250YWluZXIsIGhlbmNlIHRvIG9idGFpbiBraW5kIG9mIHRoZSBhY3Rpb25cblx0XHQvLyBzcGxpdCgpIG9uIGl0cyBuYW1lIHdhcyByZXF1aXJlZFxuXHRcdGNvbnN0IHNOYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIvXCIpWzFdO1xuXHRcdHNBY3Rpb25OYW1lID0gc05hbWUgfHwgc0FjdGlvbk5hbWU7XG5cblx0XHRjb250ZXh0VG9Qcm9jZXNzID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgKChBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpICYmIGNvbnRleHRUb1Byb2Nlc3MubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSkpIHtcblx0XHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpID8gY29udGV4dFRvUHJvY2Vzc1swXSA6IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0XHRvTW9kZWwgPSBjb250ZXh0VG9Qcm9jZXNzLmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Ly8gZW5zdXJlIGRlZXBDbG9uZSBzbyB0aGUgb3JpZ2luYWwgU2lkZUVmZmVjdHMgbWFwcGluZyBpcyBub3QgbW9kaWZpZWQgKEJDUDogMjM4MDExNzk1Nilcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzID1cblx0XHRcdGRlZXBDbG9uZShhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgY29udGV4dFRvUHJvY2VzcyBhcyBPRGF0YVY0Q29udGV4dCkpIHx8XG5cdFx0XHR7fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRsZXQgb1Jlc3VsdDogdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD5bXTtcblx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmIG9Nb2RlbCkge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQm91bmRBY3Rpb24oc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLmNvbnRleHRzIGFzIE9EYXRhVjRDb250ZXh0W10sIG9Nb2RlbCwgYXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXSxcblx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyxcblx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0OiBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdG9uU3VibWl0dGVkOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcj8ucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQ6IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdFx0XHRzZWxlY3RlZEl0ZW1zOiBtUGFyYW1ldGVycy5jb250ZXh0cyBhcyBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdFx0XHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZyxcblx0XHRcdFx0XHRncm91cElkOiBtUGFyYW1ldGVycy5ncm91cElkLFxuXHRcdFx0XHRcdGlnbm9yZUVUYWc6IG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0KHNBY3Rpb25OYW1lLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0OiBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdG9uU3VibWl0dGVkOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UsXG5cdFx0XHRcdFx0aWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgbWVzc2FnZXMgZm9yIGFjdGlvbiBjYWxsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIGFjdGlvbi5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmxhYmVsXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGFmdGVyIG1lc3NhZ2UgZGlhbG9nIGlzIG9wZW5lZCBpZiByZXF1aXJlZC5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfaGFuZGxlQWN0aW9uUmVzcG9uc2UoXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdG1QYXJhbWV0ZXJzOiB7IGxhYmVsPzogc3RyaW5nOyBpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDsgY29udHJvbElkPzogc3RyaW5nOyBwYXJlbnRDb250cm9sPzogQ29udHJvbCB9LFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmdcblx0KTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbiB8IERpYWxvZz4ge1xuXHRcdGNvbnN0IGFUcmFuc2llbnRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0XHRjb25zdCBhY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChhVHJhbnNpZW50TWVzc2FnZXMubGVuZ3RoID4gMCAmJiBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBtUGFyYW1ldGVycy5sYWJlbCA/IG1QYXJhbWV0ZXJzLmxhYmVsIDogc0FjdGlvbk5hbWUpO1xuXHRcdH1cblx0XHRsZXQgY29udHJvbDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkICYmIG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgJiYgbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5pc0E8Vmlldz4oXCJzYXAudWkuY29yZS5tdmMuVmlld1wiKSkge1xuXHRcdFx0Y29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIGFzIENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgc0FjdGlvbk5hbWU6IGFjdGlvbk5hbWUsIGNvbnRyb2w6IGNvbnRyb2wgfSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xuXHRcdGNvbnN0IGVycm9yVG9SZW1vdmUgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKGVycm9yOiBNZXNzYWdlKSA9PiBlcnJvci52YWxpZGF0aW9uKTsgLy8gb25seSBuZWVkcyB0byBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGVjaG5pY2FsIGFuZCBwZXJzaXN0ZW50IGVycm9ycyBuZWVkcyBub3QgdG8gYmUgY2hlY2tlZCBoZXJlLlxuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFBvcG92ZXIuIEZhY3RvcnkgbWV0aG9kIHRvIG1ha2UgdW5pdCB0ZXN0cyBlYXNpZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBzZXR0aW5ncyBJbml0aWFsIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3BvdmVyXG5cdCAqIEByZXR1cm5zIEEgbmV3IFBvcG92ZXJcblx0ICovXG5cdF9jcmVhdGVQb3BvdmVyKHNldHRpbmdzPzogJFBvcG92ZXJTZXR0aW5ncyk6IFBvcG92ZXIge1xuXHRcdHJldHVybiBuZXcgUG9wb3ZlcihzZXR0aW5ncyk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIHRvIGNvbmZpcm0gZGlzY2FyZCBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBpc01vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBhbmQgYSBjb25maXJtYXRpb24gcG9wb3ZlciBtdXN0IGJlIHNob3duXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBjb25maXJtcyBkaXNjYXJkLCByZWplY3RzIGlmIG90aGVyd2lzZSwgcmVqZWN0cyBpZiBubyBjb250cm9sIHBhc3NlZCB0byBvcGVuIHBvcG92ZXJcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfY29uZmlybURpc2NhcmQoY2FuY2VsQnV0dG9uOiBCdXR0b24sIGlzTW9kaWZpZWQ6IGJvb2xlYW4sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBJZiB0aGUgZGF0YSBpc24ndCBtb2RpZmllZCwgZG8gbm90IHNob3cgYW55IGNvbmZpcm1hdGlvbiBwb3BvdmVyXG5cdFx0aWYgKCFpc01vZGlmaWVkKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgY29uZmlybWF0aW9uUG9wb3ZlciA9IHRoaXMuX2NyZWF0ZVBvcG92ZXIoe1xuXHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0cGxhY2VtZW50OiBcIlRvcFwiXG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgY29udGVudCBvZiB0aGUgcG9wb3ZlclxuXHRcdFx0Y29uc3QgdGl0bGUgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiKVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjb25maXJtQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpLFxuXHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkQ29udGVudChuZXcgVkJveCh7IGl0ZW1zOiBbdGl0bGUsIGNvbmZpcm1CdXR0b25dIH0pKTtcblxuXHRcdFx0Ly8gQXR0YWNoIGhhbmRsZXJcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYXR0YWNoQmVmb3JlT3BlbigoKSA9PiB7XG5cdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuc2V0SW5pdGlhbEZvY3VzKGNvbmZpcm1CdXR0b24pO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEFmdGVyQ2xvc2UoKCkgPT4ge1xuXHRcdFx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0aWYgKGNvbmZpcm1hdGlvblBvcG92ZXIuZGF0YShcImNvbnRpbnVlRGlzY2FyZFwiKSkge1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIub3BlbkJ5KGNhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlV2l0aERpYWxvZyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRmaWVsZE5hbWVzOiBzdHJpbmdbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdGJJc0NyZWF0ZURpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdH0sXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBsaXN0TWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkhKTtcblxuXHRcdC8vIENyZWF0ZSBhIGZha2UgKHRyYW5zaWVudCkgbGlzdEJpbmRpbmcgYW5kIGNvbnRleHQsIGp1c3QgZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIGRpYWxvZ1xuXHRcdGNvbnN0IHRyYW5zaWVudExpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdH0pO1xuXHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdC8qICovXG5cdFx0fTtcblx0XHRjb25zdCB0cmFuc2llbnRDb250ZXh0ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHBhcmFtZXRlcnMuZGF0YSwgdHJ1ZSk7XG5cdFx0Y29uc3QgZmllbGRNZXRhQ29udGV4dHMgPSBmaWVsZE5hbWVzLm1hcCgobmFtZSkgPT4ge1xuXHRcdFx0cmV0dXJuIG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtsaXN0TWV0YVBhdGh9LyR7bmFtZX1gKSBhcyBDb250ZXh0O1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgY3JlYXRlRGlhbG9nID0gZ2V0Q29yZVVJRmFjdG9yeSgpLm5ld0NyZWF0ZURpYWxvZyh0cmFuc2llbnRDb250ZXh0LCBmaWVsZE5hbWVzLCBhcHBDb21wb25lbnQsIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdGZpZWxkTWV0YUNvbnRleHRzLFxuXHRcdFx0XHR0cmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdHBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0KTtcblx0XHRcdGNyZWF0ZURpYWxvZy5vcGVuRGlhbG9nKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdFByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxPRGF0YVY0Q29udGV4dD4oKTtcblxuXHRcdGNvbnN0IG9uRXhpdERpYWxvZyA9IGFzeW5jIChldmVudDogRXhpdERpYWxvZ0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRpZiAoIWV2ZW50LmdldFBhcmFtZXRlcihcImFjY2VwdFwiKSkge1xuXHRcdFx0XHQvLyBVc2VyIGhhcyBjYW5jZWxsZWQgY3JlYXRpb246IGRlc3RyeSB0aGUgdHJhbnNpZW50IGxpc3QgYmluZGluZyBhbmQgY2xvc2UgdGhlIGRpYWxvZ1xuXHRcdFx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRyZXN1bHRQcm9taXNlS2VlcGVyLnJlamVjdChGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3kodHJ1ZSk7XG5cdFx0XHRwYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZyA9IHRydWU7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB0cmFuc2llbnREYXRhID0gdHJhbnNpZW50Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0bGV0IGNyZWF0ZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdE9iamVjdC5rZXlzKHRyYW5zaWVudERhdGEpLmZvckVhY2goKHByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bGlzdE1ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHQvLyBFbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgYXMgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdC8vIEFuZCByZW1vdmUgYW55IHByb3BlcnR5IHN0YXJ0aW5nIGJ5IEAkdWk1IGFzIHRoZXkgYXJlIG5vdCBwcm9wZXJ0eSBjcmVhdGVkIGJ5IGZpbGxpbmcgdGhlIGZvcm1cblx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiAhcHJvcGVydHlQYXRoPy5zdGFydHNXaXRoKFwiQCR1aTVcIikpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZURhdGFbcHJvcGVydHlQYXRoXSA9IHRyYW5zaWVudERhdGFbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0Ly9iZWZvcmVDcmVhdGVDYWxsQmFjayBleHBlY3RzIGNyZWF0ZVBhcmFtZXRlcnMgb2YgdHlwZSBhbnlbXVxuXHRcdFx0XHRcdGNvbnN0IGNyZWF0ZURhdGFBc0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY3JlYXRlRGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IGxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBjcmVhdGVEYXRhQXNBcnJheVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y3JlYXRlRGF0YSA9IGNyZWF0ZURhdGFBc0FycmF5LnJlZHVjZSgocmVzdWx0LCBjdXJyZW50T2JqZWN0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5yZXN1bHQsIC4uLmN1cnJlbnRPYmplY3QgfTtcblx0XHRcdFx0XHR9LCB7fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKGNyZWF0ZURhdGEpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHtcblx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRjcmVhdGVJbmFjdGl2ZTogcGFyYW1ldGVycy5pbmFjdGl2ZSxcblx0XHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y29uc3QgY3JlYXRpb25TdWNjZXNzID0gYXdhaXQgdGhpcy53YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0LCBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPT09IHRydWUpO1xuXHRcdFx0XHRpZiAoY3JlYXRpb25TdWNjZXNzKSB7XG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVzb2x2ZShuZXdDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjcmVhdGlvbiBmYWlsZWQsIGRpYWxvZyBzaG91bGQgc3RheSBvcGVuIC0gdG8gYWNoaWV2ZSB0aGUgc2FtZSwgbm90aGluZyBoYXMgdG8gYmUgZG9uZSAobGlrZSBpbiBjYXNlIG9mIHN1Y2Nlc3Mgd2l0aCBiS2VlcERpYWxvZ09wZW4pXG5cdFx0XHRcdGlmIChlcnJvciAhPT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCAmJiBlcnJvciAhPSBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkKSB7XG5cdFx0XHRcdFx0Ly8gb3RoZXIgZXJyb3JzIGFyZSBub3QgZXhwZWN0ZWRcblx0XHRcdFx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdFx0cmVzdWx0UHJvbWlzZUtlZXBlci5yZWplY3QoZXJyb3IgYXMgc3RyaW5nIHwgRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRjcmVhdGVEaWFsb2cuc2V0QnVzeShmYWxzZSk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjcmVhdGVEaWFsb2cuYXR0YWNoRXhpdERpYWxvZyh7fSwgb25FeGl0RGlhbG9nKTtcblxuXHRcdHJldHVybiByZXN1bHRQcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdHMgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIGNvbnRleHQgdG8gYmUgZmluaXNoZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuZXdDb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGNyZWF0ZWRcblx0ICogQHBhcmFtIGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWxcblx0ICovXG5cdGFzeW5jIHdhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgcHJvbWlzZUtlZXBlciA9IG5ldyBQcm9taXNlS2VlcGVyPGJvb2xlYW4+KCk7XG5cdFx0Y29uc3QgcGFyZW50TGlzdEJpbmRpbmcgPSBuZXdDb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXG5cdFx0Y29uc3Qgb25DcmVhdGVDb21wbGV0ZWQgPSAoZXZlbnQ6IE9EYXRhTGlzdEJpbmRpbmckQ3JlYXRlQ29tcGxldGVkRXZlbnQpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKGNyZWF0ZWRDb250ZXh0ID09PSBuZXdDb250ZXh0KSB7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLmRldGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cdFx0XHRcdHByb21pc2VLZWVwZXIucmVzb2x2ZShzdWNjZXNzID09PSB0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cGFyZW50TGlzdEJpbmRpbmcuYXR0YWNoQ3JlYXRlQ29tcGxldGVkKG9uQ3JlYXRlQ29tcGxldGVkKTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uU3VjY2Vzc2Z1bCA9IGF3YWl0IHByb21pc2VLZWVwZXIucHJvbWlzZTtcblx0XHRpZiAoIWNyZWF0aW9uU3VjY2Vzc2Z1bCkge1xuXHRcdFx0aWYgKCFrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcGVuZGluZyBQT1NUIGFuZCBkZWxldGUgdGhlIGNvbnRleHQgaW4gdGhlIGxpc3RCaW5kaW5nXG5cdFx0XHRcdChuZXdDb250ZXh0LmNyZWF0ZWQoKSA/PyBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goZnVuY3Rpb24gKGNvbnRleHRFcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0aW9uIGVycm9yXCIsIGNvbnRleHRFcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGFyZW50TGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLmdldE1vZGVsKCkucmVzZXRDaGFuZ2VzKHBhcmVudExpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF3YWl0IG5ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgTmV3QWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwbGljYXRpb25cblx0ICogQHBhcmFtIFtvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZV1cblx0ICogQHBhcmFtIHNDcmVhdGVIYXNoIEhhc2ggdG8gYmUgY2hlY2tlZCBmb3IgYWN0aW9uIHR5cGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0TmV3QWN0aW9uKFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczoge1xuXHRcdFx0cHJlZmVycmVkTW9kZT86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0c0NyZWF0ZUhhc2g6IHN0cmluZyxcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZ1xuXHQpOiBzdHJpbmcge1xuXHRcdGxldCBzTmV3QWN0aW9uO1xuXG5cdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049Q1JFQVRFV0lUSFwiKSkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPSBzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiQ1JFQVRFV0lUSDpcIilcblx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHJpbmcoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiZcblx0XHRcdHNDcmVhdGVIYXNoLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJJLUFDVElPTj1BVVRPQ1JFQVRFV0lUSFwiKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPSBzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiQVVUT0NSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKSB8fFxuXHRcdFx0XHRcdCAgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbGFiZWwgZm9yIHRoZSB0aXRsZSBvZiBhIHNwZWNpZmljIGNyZWF0ZSBhY3Rpb24gZGlhbG9nLCBlLmcuIENyZWF0ZSBTYWxlcyBPcmRlciBmcm9tIFF1b3RhdGlvbi5cblx0ICpcblx0ICogVGhlIGZvbGxvd2luZyBwcmlvcml0eSBpcyBhcHBsaWVkOlxuXHQgKiAxLiBsYWJlbCBvZiBsaW5lLWl0ZW0gYW5ub3RhdGlvbi5cblx0ICogMi4gbGFiZWwgYW5ub3RhdGVkIGluIHRoZSBhY3Rpb24uXG5cdCAqIDMuIFwiQ3JlYXRlXCIgYXMgYSBjb25zdGFudCBmcm9tIGkxOG4uXG5cdCAqXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlQ29yZSBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwoXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmcsXG5cdFx0c05ld0FjdGlvbjogc3RyaW5nLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZUNvcmU6IFJlc291cmNlQnVuZGxlIHwgdW5kZWZpbmVkXG5cdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbGluZUl0ZW1zID0gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkgYXMgTGluZUl0ZW0gfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBsYWJlbCA9IGxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGlzRGF0YUZpZWxkRm9yQWN0aW9uKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIsIDEpWzBdID09PSBzTmV3QWN0aW9uKVxuXHRcdFx0Py5MYWJlbDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRsYWJlbCB8fFxuXHRcdFx0b01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSB8fFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlQ29yZT8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIilcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IHNpbmdsZXRvbiA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcigpO1xuZXhwb3J0IGRlZmF1bHQgc2luZ2xldG9uO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7RUF1REEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0MsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCOztFQUVuRDtFQUNBLE1BQU1DLGlCQUFpQixHQUFHQyxZQUFZLENBQUNELGlCQUFpQjtFQUN4RCxNQUFNRSwwQkFBMEIsR0FBR0QsWUFBWSxDQUFDQywwQkFBMEI7O0VBRTFFO0VBQ0EsU0FBU0MsYUFBYSxDQUFJQyxXQUF1QixFQUFLO0lBQ3JELElBQUlBLFdBQVcsSUFBS0EsV0FBVyxDQUFXQyxXQUFXLElBQUtELFdBQVcsQ0FBV0MsV0FBVyxFQUFFLENBQUNDLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFFO01BQ2hJRixXQUFXLEdBQUcsQ0FBQyxDQUFNO0lBQ3RCO0lBQ0EsT0FBUUEsV0FBVyxJQUFXLENBQUMsQ0FBTztFQUN2QztFQUFDLElBdUJLRyxpQkFBaUI7SUFBQTtJQUFBO0lBQUEsT0FDdEJDLFFBQVEsR0FBUixrQkFBU0MsWUFBMEIsRUFBRUMsUUFBaUIsRUFBUTtNQUM3REMsVUFBVSxDQUFDQyxJQUFJLENBQUNILFlBQVksQ0FBQ0ksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFSCxRQUFRLENBQUM7SUFDdkQsQ0FBQztJQUFBLE9BRURJLFVBQVUsR0FBVixvQkFBV0wsWUFBMEIsRUFBRUMsUUFBaUIsRUFBUTtNQUMvREMsVUFBVSxDQUFDSSxNQUFNLENBQUNOLFlBQVksQ0FBQ0ksUUFBUSxDQUFDLElBQUksQ0FB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
1155
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJkZWZhdWx0RnVuY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uUmVzdWx0IiwiaXNCb3VuZCIsIm9wZXJhdGlvbnMiLCJjYWxsQm91bmRGdW5jdGlvbiIsInRvU3RyaW5nIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiY3JlYXRlQ29udGV4dCIsImluaXRpYWxEYXRhIiwib3B0aW9ucyIsImRhdGFGb3JDcmVhdGlvbiIsImxpc3RCaW5kaW5nRm9yQ3JlYXRpb24iLCJwYXJlbnRDb250ZXh0IiwiaXNFeHBhbmRlZCIsImV4cGFuZCIsIk9iamVjdCIsImFzc2lnbiIsImJpbmRMaXN0IiwiJCRncm91cElkIiwiZ2V0R3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvYmplY3RQYXRoIiwicGFyZW50TmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJBZ2dyZWdhdGlvbiIsIlBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eSIsInZhbHVlIiwiRXJyb3IiLCJwYXJlbnRCaW5kaW5nRGF0YSIsImNyZWF0ZSIsImNyZWF0ZUF0RW5kIiwiY3JlYXRlSW5hY3RpdmUiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJjcmVhdGVEYXRhIiwibWV0YVBhdGgiLCJub25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJnZXRDcmVhdGVQb3B1cEZpZWxkcyIsImZpbHRlciIsImZpZWxkTmFtZSIsImNyZWF0ZURvY3VtZW50IiwibWFpbkxpc3RCaW5kaW5nIiwiaW5QYXJhbWV0ZXJzIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwibmV3RG9jdW1lbnRDb250ZXh0IiwicGFyYW1ldGVycyIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRCdXN5UGF0aCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiaW5hY3RpdmUiLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJwZXJmb3JtQWN0aW9uT3JDcmVhdGlvbiIsInNob3dNZXNzYWdlRGlhbG9nIiwiY29udHJvbCIsInBhcmVudENvbnRyb2wiLCJlcnJvciIsIkNvbnN0YW50cyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImlzVHJhbnNpZW50IiwiZGVsZXRlIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJjcmVhdGVEb2N1bWVudENvbnRleHQiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiZW50cmllcyIsIm1hcCIsImtleSIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiTG9nIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJyZWR1Y2UiLCJyZXN1bHQiLCJjdXJyZW50T2JqZWN0IiwibWVzc2FnZXNQYXRoIiwiZ2V0TWVzc2FnZXNQYXRoIiwiY3JlYXRlSGFzaCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsImNvbXBvbmVudERhdGEiLCJnZXRDb21wb25lbnREYXRhIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJuZXdBY3Rpb24iLCJfZ2V0TmV3QWN0aW9uIiwiYmluZGluZ1BhcmFtZXRlcnMiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJiSXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhIiwiaXNOZXdQYWdlQ3JlYXRpb24iLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIklubGluZSIsIm5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsImNyZWF0ZVdpdGhEaWFsb2ciLCJ3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbiIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJtc2ciLCJtZXNzYWdlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwicmVzb3VyY2VNb2RlbCIsImNvbnRleHRzVG9EZWxldGUiLCJBcnJheSIsImlzQXJyYXkiLCJyZWplY3QiLCJkcmFmdEVuYWJsZWQiLCJzZWxlY3RlZENvbnRleHRzIiwiaXRlbXMiLCJ1blNhdmVkQ29udGV4dCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxvY2tlZENvbnRleHQiLCJmaW5kIiwiY29udGV4dCIsImNvbnRleHREYXRhIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwibG9ja2luZ1VzZXJOYW1lIiwiTWVzc2FnZUJveCIsInNob3ciLCJnZXRUZXh0IiwidGl0bGUiLCJvbkNsb3NlIiwibm9uVGFibGVUeHQiLCJ1blNhdmVkQ29udGV4dFVzZXIiLCJlbnRpdHlTZXROYW1lIiwiZGVzY3JpcHRpb24iLCJwdXNoIiwidHlwZSIsImRlbGV0YWJsZUNvbnRleHRzIiwidGV4dCIsInNlbGVjdGVkIiwiVEVYVCIsInRvdGFsRGVsZXRhYmxlIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJ1blNhdmVkQ29udGV4dHMiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJnZXROb25EZWxldGFibGVUZXh0Iiwib3B0aW9uc0RlbGV0YWJsZVRleHRzIiwiZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwiY29tbW9uQmluZGluZyIsImdldEJpbmRpbmciLCJpblRyZWVUYWJsZSIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJmbkNvbmZpcm0iLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwib0Vycm9yIiwiZGlhbG9nIiwiY3JlYXRlRGVsZXRlRGlhbG9nIiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImZuUmVqZWN0IiwiZGlhbG9nQ29uZmlybWVkIiwidkJveCIsIlZCb3giLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJhcmlhTGFiZWxsZWRCeSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZWRpdERvY3VtZW50IiwiZ3JvdXBJZCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9OZXdDb250ZXh0IiwiZHJhZnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJlcnIiLCJzaG93TWVzc2FnZXMiLCJjb25jdXJyZW50RWRpdEZsYWciLCJjYW5jZWxEb2N1bWVudCIsIm1JblBhcmFtZXRlcnMiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJvTW9kZWwiLCJyZXR1cm5lZFZhbHVlIiwiZHJhZnREYXRhQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRBZG1pbkRhdGEiLCJyZXF1ZXN0T2JqZWN0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9jb25maXJtRGlzY2FyZCIsImNhbmNlbEJ1dHRvbiIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZURyYWZ0Iiwib1NpYmxpbmdDb250ZXh0Iiwic0Nhbm9uaWNhbFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJvQWN0aXZlRG9jdW1lbnQiLCJhY3RpdmF0ZURvY3VtZW50IiwibWVzc2FnZXNSZWNlaXZlZCIsImdldE1lc3NhZ2VzIiwiY29uY2F0IiwiZ2V0VHlwZSIsImNvcmVMaWJyYXJ5IiwiTWVzc2FnZVR5cGUiLCJTdWNjZXNzIiwiZW50aXR5U2V0IiwiTWVzc2FnZVRvYXN0IiwibmFtZSIsImZvckVhY2giLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQWN0aW9uTmFtZSIsImRpc2FibGVTdHJpY3RIYW5kbGluZyIsImNvbnRleHRUb1Byb2Nlc3MiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCJzTmFtZSIsInNwbGl0IiwibVNpZGVFZmZlY3RzUGFyYW1ldGVycyIsImRlZXBDbG9uZSIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJvUmVzdWx0IiwiY2FsbEJvdW5kQWN0aW9uIiwicGFyYW1ldGVyVmFsdWVzIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJvblN1Ym1pdHRlZCIsIm9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImJHZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsInNlbGVjdGVkSXRlbXMiLCJpZ25vcmVFVGFnIiwiY2FsbEFjdGlvbkltcG9ydCIsIl9oYW5kbGVBY3Rpb25SZXNwb25zZSIsImFUcmFuc2llbnRNZXNzYWdlcyIsImFjdGlvbk5hbWUiLCJzZXRQcm9wZXJ0eSIsImJ5SWQiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJlcnJvclRvUmVtb3ZlIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJmaWVsZE5hbWVzIiwibGlzdE1ldGFQYXRoIiwidHJhbnNpZW50TGlzdEJpbmRpbmciLCJyZWZyZXNoSW50ZXJuYWwiLCJ0cmFuc2llbnRDb250ZXh0IiwiZmllbGRNZXRhQ29udGV4dHMiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNyZWF0ZURpYWxvZyIsImdldENvcmVVSUZhY3RvcnkiLCJuZXdDcmVhdGVEaWFsb2ciLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJvcGVuRGlhbG9nIiwiZSIsInJlc3VsdFByb21pc2VLZWVwZXIiLCJQcm9taXNlS2VlcGVyIiwib25FeGl0RGlhbG9nIiwiZXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJjbG9zZURpYWxvZyIsInNldEJ1c3kiLCJiSXNDcmVhdGVEaWFsb2ciLCJ0cmFuc2llbnREYXRhIiwia2V5cyIsInByb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwic3RhcnRzV2l0aCIsImNyZWF0ZURhdGFBc0FycmF5IiwiVWlNb2RlbENvbnN0YW50cyIsIkRvY3VtZW50TW9kaWZpZWQiLCJuZXdDb250ZXh0IiwiY3JlYXRpb25TdWNjZXNzIiwiQ3JlYXRpb25GYWlsZWQiLCJhdHRhY2hFeGl0RGlhbG9nIiwicHJvbWlzZSIsInByb21pc2VLZWVwZXIiLCJwYXJlbnRMaXN0QmluZGluZyIsIm9uQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRlZENvbnRleHQiLCJzdWNjZXNzIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwiYXR0YWNoQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRpb25TdWNjZXNzZnVsIiwiY3JlYXRlZCIsImNhdGNoIiwiY29udGV4dEVycm9yIiwidHJhY2UiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzQ3JlYXRlSGFzaCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJzTmV3QWN0aW9uIiwicHJlZmVycmVkTW9kZSIsInRvVXBwZXJDYXNlIiwiaW5jbHVkZXMiLCJzUHJlZmVycmVkTW9kZSIsIm9SZXNvdXJjZUJ1bmRsZUNvcmUiLCJsaW5lSXRlbXMiLCJsaW5lSXRlbSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiLCJzaW5nbGV0b24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uLCBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBMaW5lSXRlbSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXhpdERpYWxvZ0V2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB7IGdldENvcmVVSUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBpc0RhdGFGaWVsZEZvckFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHR5cGUgeyBEZWxldGVPcHRpb24sIERlbGV0ZVBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBkZWxldGVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0Q3JlYXRlUG9wdXBGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBQcm9taXNlS2VlcGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Byb21pc2VLZWVwZXJcIjtcbmltcG9ydCB0b0VTNlByb21pc2UgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVG9FUzZQcm9taXNlXCI7XG5pbXBvcnQgeyBpc05hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgdHlwZSB7ICRQb3BvdmVyU2V0dGluZ3MgfSBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFMaXN0QmluZGluZyRDcmVhdGVDb21wbGV0ZWRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblxuLy9FbnVtcyBmb3IgZGVsZXRlIHRleHQgY2FsY3VsYXRpb25zIGZvciBkZWxldGUgY29uZmlybSBkaWFsb2cuXG5jb25zdCBEZWxldGVPcHRpb25UeXBlcyA9IGRlbGV0ZUhlbHBlci5EZWxldGVPcHRpb25UeXBlcztcbmNvbnN0IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sID0gZGVsZXRlSGVscGVyLkRlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sO1xuXG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnM8VD4obVBhcmFtZXRlcnM/OiBFdmVudCB8IFQpOiBUIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIChtUGFyYW1ldGVycyBhcyBFdmVudCkuZ2V0TWV0YWRhdGEgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkuYmFzZS5FdmVudFwiKSB7XG5cdFx0bVBhcmFtZXRlcnMgPSB7fSBhcyBUO1xuXHR9XG5cdHJldHVybiAobVBhcmFtZXRlcnMgYXMgVCkgfHwgKHt9IGFzIFQpO1xufVxuXG5leHBvcnQgdHlwZSBDcmVhdGVQYXJhbWV0ZXJzID0ge1xuXHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRidXN5SWQ/OiBzdHJpbmc7XG5cdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250cm9sOiBWaWV3O1xuXHRpbmFjdGl2ZT86IGJvb2xlYW47XG5cdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU/OiBzdHJpbmc7XG5cdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgQ2FuY2VsUGFyYW1ldGVycyA9IHsgY2FuY2VsQnV0dG9uOiBCdXR0b247IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbjsgYmVmb3JlQ2FuY2VsQ2FsbEJhY2s/OiBGdW5jdGlvbiB9O1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25EZWxldGVQYXJhbWV0ZXJzID0gRGVsZXRlUGFyYW1ldGVycyAmIHtcblx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdHRpdGxlPzogc3RyaW5nO1xuXHRub0RpYWxvZz86IGJvb2xlYW47XG59O1xuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdGJ1c3lMb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0YnVzeVVubG9jayhhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgYnVzeVBhdGg/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IE9EYXRhVjRDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRsZXQgcGF0aDogc3RyaW5nO1xuXHRcdGlmIChzb3VyY2UuaXNBPE9EYXRhVjRDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRwYXRoID0gc291cmNlLmdldFBhdGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGF0aCA9IChzb3VyY2UuaXNSZWxhdGl2ZSgpID8gc291cmNlLmdldFJlc29sdmVkUGF0aCgpIDogc291cmNlLmdldFBhdGgoKSkgPz8gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1ldGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgcGF0aCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdH0gZWxzZSBpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLk5vbkRyYWZ0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25dIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuXHRcdG9WaWV3OiBWaWV3XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBkZWZhdHVsIHZhbHVlcyBmcm9tIHRoZSBEZWZhdWx0VmFsdWUgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkZWZhdWx0IHZhbHVlcyAob3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm8gZGVmYXVsdCB2YWx1ZSBmdW5jdGlvbilcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0RGF0YUZyb21EZWZhdWx0VmFsdWVGdW5jdGlvbihsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8b2JqZWN0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpIGFzIHN0cmluZyk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdPYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgTmF2aWdhdGlvblByb3BlcnR5IHwgRW50aXR5U2V0KS5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jT25UYXJnZXRFbnRpdHlTZXQgPSAobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQpPy5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk5hbWUgPSBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ID8/IGRlZmF1bHRGdW5jT25UYXJnZXRFbnRpdHlTZXQ7XG5cblx0XHRpZiAoIWRlZmF1bHRGdW5jdGlvbk5hbWUpIHtcblx0XHRcdC8vIE5vIGRlZmF1bHQgdmFsdWUgZnVuY3Rpb25cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZnVuY3Rpb25Pbk5hdlByb3AgPSBpc05hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCA9IGZ1bmN0aW9uT25OYXZQcm9wID8gbGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpIDogbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdGlmICghZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uUGF0aCA9IGAke21ldGFNb2RlbC5nZXRNZXRhUGF0aChkZWZhdWx0RnVuY3Rpb25Db250ZXh0LmdldFBhdGgoKSl9LyR7ZGVmYXVsdEZ1bmN0aW9uTmFtZX1gO1xuXG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGRlZmF1bHRGdW5jdGlvblBhdGgpKTtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25SZXN1bHQgPSAoZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgQWN0aW9uKT8uaXNCb3VuZFxuXHRcdFx0PyBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKGRlZmF1bHRGdW5jdGlvbk5hbWUudG9TdHJpbmcoKSwgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCwgbW9kZWwpXG5cdFx0XHQ6ICgoYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBtb2RlbCkpIGFzIE9EYXRhVjRDb250ZXh0KTtcblxuXHRcdHJldHVybiBkZWZhdWx0RnVuY3Rpb25SZXN1bHQuZ2V0T2JqZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbGlzdCBiaW5kaW5nIGNvcnJlc3BvbmRzIHRvIGEgaGllcmFyY2h5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGlzdCBiaW5kaW5nIGlzIGhpZXJhcmNoaWNhbC5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmhpZXJhcmNoeVF1YWxpZmllciA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW4gYSBsaXN0IGJpbmRpbmcuIEhhbmRsZXMgYm90aCBmbGF0IGFuZCBoaWVyYXJjaGljYWwgY2FzZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gaW5pdGlhbERhdGEgSW5pdGlhbCBkYXRhIHRvIGNyZWF0ZSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wdGlvbnMgQ3JlYXRpb24gb3B0aW9ucy5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYVx0IGNoaWxkIG9mIHRoaXMgY29udGV4dCAob255IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5pdGlhbERhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCxcblx0XHRvcHRpb25zOiB7IGNyZWF0ZUF0RW5kPzogYm9vbGVhbjsgY3JlYXRlSW5hY3RpdmU/OiBib29sZWFuOyBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQgfVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgZGF0YUZvckNyZWF0aW9uID0gaW5pdGlhbERhdGEgPz8ge307XG5cblx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0bGV0IGxpc3RCaW5kaW5nRm9yQ3JlYXRpb246IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0Py5pc0V4cGFuZGVkKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCBhbHJlYWR5IGhhcyBjaGlsZHJlbiBhbmQgaXMgY29sbGFwc2VkLCB3ZSBleHBhbmQgaXQgZmlyc3Rcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcuZXhwYW5kKG9wdGlvbnMucGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHsgXCJAJHVpNS5ub2RlLnBhcmVudFwiOiBvcHRpb25zLnBhcmVudENvbnRleHQgfSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBsaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFic29sdXRlIGJpbmRpbmc6IGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnRcblx0XHRcdFx0Ly8gV2UgdXNlIGEgdGVtcG9yYXJ5IGZsYXQgbGlzdEJpbmRpbmcgZm9yIHRoZSBjcmVhdGlvbiwgdG8gYXZvaWQgYWRkaW5nIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgdGFibGUgKHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBpdCB1bnRpbCBpdCdzIHNhdmVkKVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIHRoZSBwYXJlbnQgcGF0aCBpbiB0aGUgaW5pdGlhbCBkYXRhIGlmIGEgcGFyZW50IGlzIHByb3ZpZGVkXG5cdFx0XHRcdGlmIChvcHRpb25zLnBhcmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdFx0Y29uc3QgaGllcmFyY2h5UXVhbGlmaWVyID0gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI6IHN0cmluZyB9KS5oaWVyYXJjaHlRdWFsaWZpZXI7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50TmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0XHRvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQWdncmVnYXRpb24/LltgUmVjdXJzaXZlSGllcmFyY2h5IyR7aGllcmFyY2h5UXVhbGlmaWVyfWBdXG5cdFx0XHRcdFx0XHRcdD8uUGFyZW50TmF2aWdhdGlvblByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHRcdGlmICghcGFyZW50TmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBwYXJlbnQgbmF2aWdhdGlvbiBwcm9wZXJ0eSBmb3IgJHtsaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEJpbmRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRcdFx0cGFyZW50QmluZGluZ0RhdGFbYCR7cGFyZW50TmF2aWdhdGlvbn1Ab2RhdGEuYmluZGBdID0gb3B0aW9ucy5wYXJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKC9eXFwvLywgXCJcIik7IC8vIFJlbW92ZSBsZWFkaW5nIFwiL1wiIGZyb20gdGhlIHBhdGhcblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKGRhdGFGb3JDcmVhdGlvbiwgcGFyZW50QmluZGluZ0RhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsaXN0QmluZGluZ0ZvckNyZWF0aW9uLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmcuY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSwgb3B0aW9ucy5jcmVhdGVBdEVuZCwgb3B0aW9ucy5jcmVhdGVJbmFjdGl2ZSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpO1xuXG5cdFx0Y29uc3Qgbm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzID0gZ2V0Q3JlYXRlUG9wdXBGaWVsZHMobWV0YU1vZGVsLCBtZXRhUGF0aCwgYXBwQ29tcG9uZW50KTtcblx0XHQvLyBEbyBub3QgY29uc2lkZXIgZmllbGRzIGZvciB3aGljaCB3ZSBwcm92aWRlIHNvbWUgaW5pdGlhbCBkYXRhXG5cdFx0cmV0dXJuIG5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcy5maWx0ZXIoKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gIShmaWVsZE5hbWUgaW4gKGNyZWF0ZURhdGEgPz8ge30pKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5TW9kZV0gR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmUgVE9ETzogdG8gYmUgcmVmYWN0b3JlZFxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5idXN5SWRdIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmluYWN0aXZlXSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXSBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGZyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGluUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyB8IHVuZGVmaW5lZCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0bGV0IG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW1haW5MaXN0QmluZGluZykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG1haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgcHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNyZWF0ZSBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0Y29uc3QgYnVzeVBhdGggPSB0aGlzLmdldEJ1c3lQYXRoKHBhcmFtZXRlcnMpO1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBmcm9tQ29weVBhc3RlID8gdW5kZWZpbmVkIDogcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRpZiAoIWluUGFyYW1ldGVycz8uaW5hY3RpdmUpIHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50LCBidXN5UGF0aCk7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlQ29yZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0dHJ5IHtcblx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMucGVyZm9ybUFjdGlvbk9yQ3JlYXRpb24oXG5cdFx0XHRcdG1haW5MaXN0QmluZGluZyxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0cmVzb3VyY2VCdW5kbGVDb3JlLFxuXHRcdFx0XHRmcm9tQ29weVBhc3RlXG5cdFx0XHQpO1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgfSk7XG5cdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0ITtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgfSk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQgfHwgZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSAmJlxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQ/LmlzVHJhbnNpZW50KClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgdGhlICRkaXJlY3Qgb25jZSBtb2RlbCByZXNvbHZlcyB0aGlzIGlzc3VlXG5cdFx0XHRcdC8vIHRoaXMgbGluZSBzaG93cyB0aGUgZXhwZWN0ZWQgY29uc29sZSBlcnJvciBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IFJlcXVlc3QgY2FuY2VsZWQ6IFBPU1QgVHJhdmVsOyBncm91cDogc3VibWl0TGF0ZXJcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKCFpblBhcmFtZXRlcnM/LmluYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQsIGJ1c3lQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEJ1c3lQYXRoKG1QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gbVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIiA/IGAvYnVzeUxvY2FsLyR7bVBhcmFtZXRlcnMuYnVzeUlkfWAgOiBcIi9idXN5XCI7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3QuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVEb2N1bWVudENvbnRleHQobWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5kYXRhID8gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycy5kYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKSA6IFtdO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG1haW5MaXN0QmluZGluZyAmJiBtYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVyczogY3JlYXRlUGFyYW1ldGVyc1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZDtcblx0XHRcdH1cblx0XHRcdHBhcmFtZXRlcnMuZGF0YSA9IGNyZWF0ZVBhcmFtZXRlcnMucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4ucmVzdWx0LCAuLi5jdXJyZW50T2JqZWN0IH07XG5cdFx0XHR9LCB7fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbnRleHQobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLmRhdGEsIHtcblx0XHRcdGNyZWF0ZUF0RW5kOiAhIXBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRjcmVhdGVJbmFjdGl2ZTogISFwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBlaXRoZXIgdmlhIG5ldyBBY3Rpb24gb3IgY3JlYXRlRG9jdW1lbnRDb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lNb2RlIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lJZCBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW5hY3RpdmUgSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYSBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ubHkgdXNlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIHJlc291cmNlQnVuZGxlQ29yZSBDb3JlIHJlc291cmNlIGJ1bmRsZVxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbk9yQ3JlYXRpb24oXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdHJlc291cmNlQnVuZGxlQ29yZTogUmVzb3VyY2VCdW5kbGUsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgbW9kZWwgPSBtYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSxcblx0XHRcdG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKSxcblx0XHRcdG1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChtZXRhTW9kZWwsIG1ldGFQYXRoKSxcblx0XHRcdGNyZWF0ZUhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCksXG5cdFx0XHRjb21wb25lbnREYXRhID0gYXBwQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKSxcblx0XHRcdHN0YXJ0dXBQYXJhbWV0ZXJzID0gKGNvbXBvbmVudERhdGEgJiYgY29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0XHRuZXdBY3Rpb24gPSAhbWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSA/IHRoaXMuX2dldE5ld0FjdGlvbihzdGFydHVwUGFyYW1ldGVycywgY3JlYXRlSGFzaCwgbWV0YU1vZGVsLCBtZXRhUGF0aCkgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHsgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZSB9O1xuXG5cdFx0aWYgKG1lc3NhZ2VzUGF0aCkge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnNbXCIkc2VsZWN0XCJdID0gbWVzc2FnZXNQYXRoO1xuXHRcdH1cblx0XHRsZXQgcmVzdWx0OiB1bmtub3duO1xuXHRcdGlmIChuZXdBY3Rpb24pIHtcblx0XHRcdHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdFx0bmV3QWN0aW9uLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29udGV4dHM6IG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCksXG5cdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRsYWJlbDogdGhpcy5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChtZXRhTW9kZWwsIG1ldGFQYXRoLCBuZXdBY3Rpb24sIHJlc291cmNlQnVuZGxlQ29yZSksXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IGJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0IGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRsZXQgbmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgaW5pdGlhbERhdGEgPSBwYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRcdGlmICghZnJvbUNvcHlQYXN0ZSkge1xuXHRcdFx0XHRcdGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21EZWZhdWx0VmFsdWVGdW5jdGlvbihtYWluTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdHBhcmFtZXRlcnMuZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSwgcGFyYW1ldGVycy5kYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocGFyYW1ldGVycy5kYXRhKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHBhcmFtZXRlcnMuZGF0YVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRcdGNvbnN0IG5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGlzTmV3UGFnZUNyZWF0aW9uXG5cdFx0XHRcdFx0PyB0aGlzLmdldENyZWF0aW9uUGFyYW1ldGVycyhtYWluTGlzdEJpbmRpbmcsIGluaXRpYWxEYXRhLCBhcHBDb21wb25lbnQpXG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdFx0aWYgKG5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVXaXRoRGlhbG9nKFxuXHRcdFx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0bm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZURvY3VtZW50Q29udGV4dChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdGlmICghcGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy53YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdEb2N1bWVudENvbnRleHQsIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9PT0gdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRjb25zdCBtc2cgPSB0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIgPyBlcnJvciA6IChlcnJvciBhcyBFcnJvcikubWVzc2FnZSA/PyBlcnJvcjtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBtc2cpO1xuXHRcdFx0XHR0aHJvdyBtc2c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2lzRHJhZnRFbmFibGVkKHZDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHRGb3JEcmFmdE1vZGVsID0gdkNvbnRleHRzWzBdO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHRGb3JEcmFmdE1vZGVsKTtcblx0XHRyZXR1cm4gc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlIG9uZSBvciBtdWx0aXBsZSBkb2N1bWVudChzKS5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIE51bWJlciBvZiBvYmplY3RzIHNlbGVjdGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ub0RpYWxvZyBUbyBkaXNhYmxlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSxcblx0XHRtUGFyYW1ldGVyczogVHJhbnNhY3Rpb25EZWxldGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIGRlbGV0ZSBkb2N1bWVudCBsb2NrXG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXG5cdFx0Y29uc3QgY29udGV4dHNUb0RlbGV0ZSA9IEFycmF5LmlzQXJyYXkoY29udGV4dHMpID8gWy4uLmNvbnRleHRzXSA6IFtjb250ZXh0c107XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZHJhZnRFbmFibGVkID0gdGhpcy5faXNEcmFmdEVuYWJsZWQobVBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyB8fCBjb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0Y29uc3QgaXRlbXM6IENvbnRyb2xbXSA9IFtdO1xuXHRcdFx0XHRsZXQgb3B0aW9uczogRGVsZXRlT3B0aW9uW10gPSBbXTtcblx0XHRcdFx0bGV0IHVuU2F2ZWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0XHRcdC8vIGl0ZW1zKHRleHRzKSBhbmQgb3B0aW9ucyhjaGVja0JveGVzIGFuZCBzaW5nbGUgZGVmYXVsdCBvcHRpb24pIGZvciBjb25maXJtIGRpYWxvZy5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdC8vIG5vbi1UYWJsZVxuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBDaGVjayBpZiAxIG9mIHRoZSBkcmFmdHMgaXMgbG9ja2VkIGJ5IGFub3RoZXIgdXNlclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsb2NrZWRDb250ZXh0ID0gY29udGV4dHNUb0RlbGV0ZS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dERhdGEgPSBjb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5EcmFmdElzQ3JlYXRlZEJ5TWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKGxvY2tlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBTaG93IG1lc3NhZ2UgYm94IHdpdGggdGhlIG5hbWUgb2YgdGhlIGxvY2tpbmcgdXNlciBhbmQgcmV0dXJuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbG9ja2luZ1VzZXJOYW1lID0gbG9ja2VkQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9TSU5HTEVfT0JKRUNUX0xPQ0tFRFwiLCBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxvY2tpbmdVc2VyTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XSksXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U6IHJlamVjdFxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHVuU2F2ZWRDb250ZXh0ID0gY29udGV4dHNUb0RlbGV0ZS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB7IElzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgfSA9IGNvbnRleHQuZ2V0T2JqZWN0KCkgfHwge307XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiYgSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiYgISFEcmFmdEFkbWluaXN0cmF0aXZlRGF0YT8uSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0bGV0IG5vblRhYmxlVHh0ID0gXCJcIjtcblx0XHRcdFx0XHRcdGlmICh1blNhdmVkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB1blNhdmVkQ29udGV4dFVzZXIgPSB1blNhdmVkQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRbdW5TYXZlZENvbnRleHRVc2VyXSxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kZXNjcmlwdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy50aXRsZSwgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb25dLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfT05MWVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLnRpdGxlXSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHR0ZXh0OiBub25UYWJsZVR4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBUYWJsZVxuXHRcdFx0XHRcdFx0bGV0IHRvdGFsRGVsZXRhYmxlID0gY29udGV4dHNUb0RlbGV0ZS5sZW5ndGg7XG5cblx0XHRcdFx0XHRcdGlmIChkcmFmdEVuYWJsZWQpIHtcblx0XHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUgKz1cblx0XHRcdFx0XHRcdFx0XHQobVBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT8ubGVuZ3RoID8/IDApICtcblx0XHRcdFx0XHRcdFx0XHQobVBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZT8ubGVuZ3RoID8/IDApICtcblx0XHRcdFx0XHRcdFx0XHQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzPy5sZW5ndGggPz8gMCk7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbXMsXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgbm9uRGVsZXRhYmxlVGV4dCA9IGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB0b3RhbERlbGV0YWJsZSwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdFx0XHRcdGlmIChub25EZWxldGFibGVUZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aXRlbXMucHVzaChub25EZWxldGFibGVUZXh0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCBvcHRpb25zRGVsZXRhYmxlVGV4dHMgPSBkZWxldGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdG9wdGlvbnMgPSBbLi4ub3B0aW9ucywgLi4ub3B0aW9uc0RlbGV0YWJsZVRleHRzXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBjb21tb25CaW5kaW5nID0gKG1QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgPz8gY29udGV4dHNUb0RlbGV0ZSlbMF0uZ2V0QmluZGluZygpIGFzIEJpbmRpbmc7XG5cdFx0XHRcdGNvbnN0IGluVHJlZVRhYmxlID1cblx0XHRcdFx0XHRjb21tb25CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpICYmXG5cdFx0XHRcdFx0dGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGNvbW1vbkJpbmRpbmcpO1xuXG5cdFx0XHRcdC8vIENvbnRlbnQgb2YgRGVsZXRlIERpYWxvZ1xuXHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyhvcHRpb25zLCBpdGVtcyk7XG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZGVsZXRlSGVscGVyLmRlbGV0ZUNvbmZpcm1IYW5kbGVyKFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0ZHJhZnRFbmFibGVkLFxuXHRcdFx0XHRcdFx0XHRpblRyZWVUYWJsZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgZGlhbG9nID0gdGhpcy5jcmVhdGVEZWxldGVEaWFsb2coaXRlbXMsIG1QYXJhbWV0ZXJzLCByZXNvdXJjZU1vZGVsLCBmbkNvbmZpcm0sIHJlamVjdCk7XG5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vRGlhbG9nKSB7XG5cdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRcdGRpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdC8vIGRlbGV0ZSBkb2N1bWVudCB1bmxvY2tcblx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZvIHRoZSBkZWxldGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGl0ZW1zIEFuIGFycmF5IG9mIGNvbnRyb2xzIHVzZWQgZm9yIHRoZSBkaWFsb2cgY29udGVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgUGFyZW50IGNvbnRyb2wgb2YgdGhlIGRlbGV0ZSBidXR0b24gaWYgYW55XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgY3VycmVudCBlbnRpdHlTZXRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIGZuQ29uZmlybSBGdW5jdGlvbiBleGVjdXRlZCB1cG9uIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkZWxldGlvblxuXHQgKiBAcGFyYW0gZm5SZWplY3QgRnVuY3Rpb24gZXhlY3V0ZWQgaWYgdGhlIGRpYWxvZyBpcyBjbG9zZWQgdmlhIENhbmNlbCBvciBFc2NhcGUgYnV0dG9uXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGRlbGV0ZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqL1xuXHRjcmVhdGVEZWxldGVEaWFsb2coXG5cdFx0aXRlbXM6IENvbnRyb2xbXSxcblx0XHRwYXJhbWV0ZXJzOiBQYXJ0aWFsPHsgcGFyZW50Q29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDsgZW50aXR5U2V0TmFtZTogc3RyaW5nIH0+LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0Zm5Db25maXJtOiBGdW5jdGlvbixcblx0XHRmblJlamVjdDogRnVuY3Rpb25cblx0KTogRGlhbG9nIHtcblx0XHRsZXQgZGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Y29uc3QgdkJveCA9IG5ldyBWQm94KHsgaXRlbXM6IGl0ZW1zIH0pO1xuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlQ29yZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0bGV0IHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMucGFyZW50Q29udHJvbD8uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGl0bGUgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJNX0NPTU1PTl9UQUJMRV9ERUxFVEVcIiwgdW5kZWZpbmVkLCBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aXRsZSA9IHJlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpO1xuXHRcdH1cblx0XHRjb25zdCBkaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHRpdGxlOiB0aXRsZSxcblx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdGNvbnRlbnQ6IFt2Qm94XSxcblx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBpdGVtcyxcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogdGl0bGUsXG5cdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiKSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdGRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdC8vIGlmIGRpYWxvZyBpcyBjbG9zZWQgdW5jb25maXJtZWQgKGUuZy4gdmlhIFwiQ2FuY2VsXCIgb3IgRXNjYXBlIGJ1dHRvbiksIGVuc3VyZSB0byByZWplY3QgcHJvbWlzZVxuXHRcdFx0XHRpZiAoIWRpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gZGlhbG9nO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVkaXRzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG9WaWV3IEN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgZWRpdERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRvVmlldzogRkVWaWV3LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRncm91cElkOiBzdHJpbmdcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0Ly8gYmVmb3JlIHRyaWdnZXJpbmcgdGhlIGVkaXQgYWN0aW9uIHdlJ2xsIGhhdmUgdG8gcmVtb3ZlIGFsbCBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb05ld0NvbnRleHQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdG9WaWV3OiBvVmlld1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRncm91cElkXG5cdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uKG9Db250ZXh0LCBhcHBDb21wb25lbnQpO1xuXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29uY3VycmVudEVkaXRGbGFnOiB0cnVlIH0pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FuY2VsICdlZGl0JyBtb2RlIG9mIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgaW5jYXNlIG9mIGRyYWZ0IGFwcGxpY2F0aW9ucyB3aGlsZSBuYXZpZ2F0aW5nIG91dCBvZiBPUFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcGFyYW0gaXNPYmplY3RNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhlIHVzZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtSW5QYXJhbWV0ZXJzOiBDYW5jZWxQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuLFxuXHRcdGlzT2JqZWN0TW9kaWZpZWQ6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vY29udGV4dCBtdXN0IGFsd2F5cyBiZSBwYXNzZWQgLSBtYW5kYXRvcnkgcGFyYW1ldGVyXG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gY29udGV4dCBleGlzdHMuIFBhc3MgYSBtZWFuaW5nZnVsIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobUluUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5jZWwgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRsZXQgcmV0dXJuZWRWYWx1ZTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhaXNPYmplY3RNb2RpZmllZCkge1xuXHRcdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0aXNPYmplY3RNb2RpZmllZCA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fY29uZmlybURpc2NhcmQobVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uLCBpc09iamVjdE1vZGlmaWVkLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdH1cblx0XHRcdGlmIChvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBjb250ZXh0IGlzIGtlcHQgYWxpdmUgd2Ugc2V0IGl0IGFnYWluIHRvIGRldGFjaCB0aGUgb25CZWZvcmVEZXN0cm95IGNhbGxiYWNrIGFuZCBoYW5kbGUgbmF2aWdhdGlvbiBoZXJlXG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IG5lZWRzIHRvIHN0aWxsIGJlIGtlcHQgYWxpdmUgdG8gYmUgYWJsZSB0byByZXNldCBjaGFuZ2VzIHByb3Blcmx5XG5cdFx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZSh0cnVlLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKSB7XG5cdFx0XHRcdGF3YWl0IG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0aWYgKGlzTmV3T2JqZWN0KSB7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1NpYmxpbmdDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQ2Fub25pY2FsUGF0aCA9IGF3YWl0IG9TaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IG9Nb2RlbC5iaW5kQ29udGV4dChzQ2Fub25pY2FsUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIWlzTmV3T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBkaXNjYXJkZWRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1vdmUgZXhpc3RpbmcgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0cmV0dXJuIHJldHVybmVkVmFsdWU7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgc2F2ZWRcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIFRydWUgaWYgd2Ugc2hvdWxkIGV4ZWN1dGUgc2lkZSBlZmZlY3RzIGluIGNhc2Ugb2YgYW4gZXJyb3Jcblx0ICogQHBhcmFtIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMgVGhlIGxpc3RCaW5kaW5ncyB0byBiZSB1c2VkIGZvciBleGVjdXRpbmcgc2lkZSBlZmZlY3RzIG9uIGVycm9yXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIHNhdmVEb2N1bWVudChcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGJvb2xlYW4sXG5cdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0czogT0RhdGFMaXN0QmluZGluZ1tdLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2F2ZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQoY29udGV4dCwgYXBwQ29tcG9uZW50LCB7fSwgbWVzc2FnZUhhbmRsZXIpXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQpO1xuXG5cdFx0XHRjb25zdCBtZXNzYWdlc1JlY2VpdmVkID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCkuY29uY2F0KG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7IC8vIGdldCB1bmJvdW5kIGFuZCBib3VuZCBtZXNzYWdlcyBwcmVzZW50IGluIHRoZSBtb2RlbFxuXHRcdFx0aWYgKCEobWVzc2FnZXNSZWNlaXZlZC5sZW5ndGggPT09IDEgJiYgbWVzc2FnZXNSZWNlaXZlZFswXS5nZXRUeXBlKCkgPT09IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlLlN1Y2Nlc3MpKSB7XG5cdFx0XHRcdC8vIHNob3cgb3VyIG9iamVjdCBjcmVhdGlvbiB0b2FzdCBvbmx5IGlmIGl0IGlzIG5vdCBjb21pbmcgZnJvbSBiYWNrZW5kXG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRPYmplY3QgYXNcblx0XHRcdFx0XHR8IEVudGl0eVNldFxuXHRcdFx0XHRcdHwgTmF2aWdhdGlvblByb3BlcnR5O1xuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRpc05ld09iamVjdFxuXHRcdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiLCB1bmRlZmluZWQsIGVudGl0eVNldC5uYW1lKVxuXHRcdFx0XHRcdFx0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfU0FWRURcIiwgdW5kZWZpbmVkLCBlbnRpdHlTZXQubmFtZSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yICYmIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0cy5mb3JFYWNoKChsaXN0QmluZGluZykgPT4ge1xuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBjb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmdyb3VwSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmlnbm9yZUVUYWddIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBFVGFnIGhhbmRsaW5nXG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZGlzYWJsZVN0cmljdEhhbmRsaW5nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbGxBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0YkdldEJvdW5kQ29udGV4dD86IGJvb2xlYW47XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCBudWxsO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cGFyZW50Q29udHJvbDogVmlldztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0XHRcdGJJc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0XHR9LFxuXHRcdG9WaWV3OiBWaWV3IHwgbnVsbCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+W10+IHtcblx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdGxldCBjb250ZXh0VG9Qcm9jZXNzO1xuXHRcdGxldCBvTW9kZWw6IE9EYXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cblx0XHRjb250ZXh0VG9Qcm9jZXNzID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgKChBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpICYmIGNvbnRleHRUb1Byb2Nlc3MubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSkpIHtcblx0XHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpID8gY29udGV4dFRvUHJvY2Vzc1swXSA6IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0XHRvTW9kZWwgPSBjb250ZXh0VG9Qcm9jZXNzLmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Ly8gZW5zdXJlIGRlZXBDbG9uZSBzbyB0aGUgb3JpZ2luYWwgU2lkZUVmZmVjdHMgbWFwcGluZyBpcyBub3QgbW9kaWZpZWQgKEJDUDogMjM4MDExNzk1Nilcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzID1cblx0XHRcdGRlZXBDbG9uZShcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc05hbWUgfHwgc0FjdGlvbk5hbWUsIGNvbnRleHRUb1Byb2Nlc3MgYXMgT0RhdGFWNENvbnRleHQpXG5cdFx0XHQpIHx8IHt9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGxldCBvUmVzdWx0OiB1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0PltdO1xuXHRcdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MpIHtcblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycy5jb250ZXh0cyBhcyBPRGF0YVY0Q29udGV4dFtdLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0bUJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvblN1Ym1pdHRlZDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI/LnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25SZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGNvbnRyb2xJZDogbVBhcmFtZXRlcnMuY29udHJvbElkLFxuXHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0c2VsZWN0ZWRJdGVtczogbVBhcmFtZXRlcnMuY29udGV4dHMgYXMgT0RhdGFWNENvbnRleHRbXSxcblx0XHRcdFx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmcsXG5cdFx0XHRcdFx0Z3JvdXBJZDogbVBhcmFtZXRlcnMuZ3JvdXBJZCxcblx0XHRcdFx0XHRpZ25vcmVFVGFnOiBtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZSwgb01vZGVsLCBhcHBDb21wb25lbnQsIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM6IG1QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdLFxuXHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvblN1Ym1pdHRlZDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25SZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlLFxuXHRcdFx0XHRcdGlnbm9yZUVUYWc6IG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlciwgbVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIG1lc3NhZ2VzIGZvciBhY3Rpb24gY2FsbC5cblx0ICpcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQYXJhbWV0ZXJzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBhY3Rpb24uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5sYWJlbFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBhZnRlciBtZXNzYWdlIGRpYWxvZyBpcyBvcGVuZWQgaWYgcmVxdWlyZWQuXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX2hhbmRsZUFjdGlvblJlc3BvbnNlKFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRtUGFyYW1ldGVyczogeyBsYWJlbD86IHN0cmluZzsgaW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7IGNvbnRyb2xJZD86IHN0cmluZzsgcGFyZW50Q29udHJvbD86IENvbnRyb2wgfSxcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nXG5cdCk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4gfCBEaWFsb2c+IHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0Y29uc3QgYWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZTtcblx0XHRpZiAoYVRyYW5zaWVudE1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIiwgbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lKTtcblx0XHR9XG5cdFx0bGV0IGNvbnRyb2w7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCAmJiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sICYmIG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuaXNBPFZpZXc+KFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIikpIHtcblx0XHRcdGNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sIHwgdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IHNBY3Rpb25OYW1lOiBhY3Rpb25OYW1lLCBjb250cm9sOiBjb250cm9sIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpOiB2b2lkIHtcblx0XHRjb25zdCBlcnJvclRvUmVtb3ZlID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChlcnJvcjogTWVzc2FnZSkgPT4gZXJyb3IudmFsaWRhdGlvbik7IC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBQb3BvdmVyLiBGYWN0b3J5IG1ldGhvZCB0byBtYWtlIHVuaXQgdGVzdHMgZWFzaWVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgSW5pdGlhbCBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3ZlclxuXHQgKiBAcmV0dXJucyBBIG5ldyBQb3BvdmVyXG5cdCAqL1xuXHRfY3JlYXRlUG9wb3ZlcihzZXR0aW5ncz86ICRQb3BvdmVyU2V0dGluZ3MpOiBQb3BvdmVyIHtcblx0XHRyZXR1cm4gbmV3IFBvcG92ZXIoc2V0dGluZ3MpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciB0byBjb25maXJtIGRpc2NhcmQgaWYgbmVlZGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gY2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gaXNNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYW5kIGEgY29uZmlybWF0aW9uIHBvcG92ZXIgbXVzdCBiZSBzaG93blxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX2NvbmZpcm1EaXNjYXJkKGNhbmNlbEJ1dHRvbjogQnV0dG9uLCBpc01vZGlmaWVkOiBib29sZWFuLCByZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gSWYgdGhlIGRhdGEgaXNuJ3QgbW9kaWZpZWQsIGRvIG5vdCBzaG93IGFueSBjb25maXJtYXRpb24gcG9wb3ZlclxuXHRcdGlmICghaXNNb2RpZmllZCkge1xuXHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cblx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IGNvbmZpcm1hdGlvblBvcG92ZXIgPSB0aGlzLl9jcmVhdGVQb3BvdmVyKHtcblx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJUb3BcIlxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcG92ZXJcblx0XHRcdGNvbnN0IHRpdGxlID0gbmV3IFRleHQoe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX01FU1NBR0VcIilcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgY29uZmlybUJ1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSxcblx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5kYXRhKFwiY29udGludWVEaXNjYXJkXCIsIHRydWUpO1xuXHRcdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZENvbnRlbnQobmV3IFZCb3goeyBpdGVtczogW3RpdGxlLCBjb25maXJtQnV0dG9uXSB9KSk7XG5cblx0XHRcdC8vIEF0dGFjaCBoYW5kbGVyXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEJlZm9yZU9wZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhjb25maXJtQnV0dG9uKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKCgpID0+IHtcblx0XHRcdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdGlmIChjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIikpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLm9wZW5CeShjYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGNyZWF0ZVdpdGhEaWFsb2coXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZmllbGROYW1lczogc3RyaW5nW10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRiSXNDcmVhdGVEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGluYWN0aXZlPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHR9LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbGlzdE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGxpc3RCaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpISk7XG5cblx0XHQvLyBDcmVhdGUgYSBmYWtlICh0cmFuc2llbnQpIGxpc3RCaW5kaW5nIGFuZCBjb250ZXh0LCBqdXN0IGZvciB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBkaWFsb2dcblx0XHRjb25zdCB0cmFuc2llbnRMaXN0QmluZGluZyA9IG1vZGVsLmJpbmRMaXN0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgbGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuXHRcdFx0JCR1cGRhdGVHcm91cElkOiBcInN1Ym1pdExhdGVyXCJcblx0XHR9KTtcblx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHQvKiAqL1xuXHRcdH07XG5cdFx0Y29uc3QgdHJhbnNpZW50Q29udGV4dCA9IHRyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZShwYXJhbWV0ZXJzLmRhdGEsIHRydWUpO1xuXHRcdGNvbnN0IGZpZWxkTWV0YUNvbnRleHRzID0gZmllbGROYW1lcy5tYXAoKG5hbWUpID0+IHtcblx0XHRcdHJldHVybiBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7bGlzdE1ldGFQYXRofS8ke25hbWV9YCkgYXMgQ29udGV4dDtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGNyZWF0ZURpYWxvZyA9IGdldENvcmVVSUZhY3RvcnkoKS5uZXdDcmVhdGVEaWFsb2codHJhbnNpZW50Q29udGV4dCwgZmllbGROYW1lcywgYXBwQ29tcG9uZW50LCBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRmaWVsZE1ldGFDb250ZXh0cyxcblx0XHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdCk7XG5cdFx0XHRjcmVhdGVEaWFsb2cub3BlbkRpYWxvZygpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHRQcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8T0RhdGFWNENvbnRleHQ+KCk7XG5cblx0XHRjb25zdCBvbkV4aXREaWFsb2cgPSBhc3luYyAoZXZlbnQ6IEV4aXREaWFsb2dFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0aWYgKCFldmVudC5nZXRQYXJhbWV0ZXIoXCJhY2NlcHRcIikpIHtcblx0XHRcdFx0Ly8gVXNlciBoYXMgY2FuY2VsbGVkIGNyZWF0aW9uOiBkZXN0cnkgdGhlIHRyYW5zaWVudCBsaXN0IGJpbmRpbmcgYW5kIGNsb3NlIHRoZSBkaWFsb2dcblx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRjcmVhdGVEaWFsb2cuY2xvc2VEaWFsb2coKTtcblx0XHRcdFx0cmVzdWx0UHJvbWlzZUtlZXBlci5yZWplY3QoRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNyZWF0ZURpYWxvZy5zZXRCdXN5KHRydWUpO1xuXHRcdFx0cGFyYW1ldGVycy5iSXNDcmVhdGVEaWFsb2cgPSB0cnVlO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgdHJhbnNpZW50RGF0YSA9IHRyYW5zaWVudENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGxldCBjcmVhdGVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdFx0XHRPYmplY3Qua2V5cyh0cmFuc2llbnREYXRhKS5mb3JFYWNoKChwcm9wZXJ0eVBhdGgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke2xpc3RNZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0Ly8gRW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGFzIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHQvLyBBbmQgcmVtb3ZlIGFueSBwcm9wZXJ0eSBzdGFydGluZyBieSBAJHVpNSBhcyB0aGV5IGFyZSBub3QgcHJvcGVydHkgY3JlYXRlZCBieSBmaWxsaW5nIHRoZSBmb3JtXG5cdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgIXByb3BlcnR5UGF0aD8uc3RhcnRzV2l0aChcIkAkdWk1XCIpKSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVEYXRhW3Byb3BlcnR5UGF0aF0gPSB0cmFuc2llbnREYXRhW3Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAocGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdC8vYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgZXhwZWN0cyBjcmVhdGVQYXJhbWV0ZXJzIG9mIHR5cGUgYW55W11cblx0XHRcdFx0XHRjb25zdCBjcmVhdGVEYXRhQXNBcnJheSA9IE9iamVjdC5lbnRyaWVzKGNyZWF0ZURhdGEpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBba2V5XTogdmFsdWUgfSkpO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0b0VTNlByb21pc2UoXG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBsaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVyczogY3JlYXRlRGF0YUFzQXJyYXlcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNyZWF0ZURhdGEgPSBjcmVhdGVEYXRhQXNBcnJheS5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgLi4ucmVzdWx0LCAuLi5jdXJyZW50T2JqZWN0IH07XG5cdFx0XHRcdFx0fSwge30pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhjcmVhdGVEYXRhKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIikuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB7XG5cdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0Y3JlYXRlSW5hY3RpdmU6IHBhcmFtZXRlcnMuaW5hY3RpdmUsXG5cdFx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGNvbnN0IGNyZWF0aW9uU3VjY2VzcyA9IGF3YWl0IHRoaXMud2FpdEZvckNyZWF0ZUNvbXBsZXRpb24obmV3Q29udGV4dCwgcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID09PSB0cnVlKTtcblx0XHRcdFx0aWYgKGNyZWF0aW9uU3VjY2Vzcykge1xuXHRcdFx0XHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRjcmVhdGVEaWFsb2cuY2xvc2VEaWFsb2coKTtcblx0XHRcdFx0XHRyZXN1bHRQcm9taXNlS2VlcGVyLnJlc29sdmUobmV3Q29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdC8vIGluIGNhc2Ugb2YgY3JlYXRpb24gZmFpbGVkLCBkaWFsb2cgc2hvdWxkIHN0YXkgb3BlbiAtIHRvIGFjaGlldmUgdGhlIHNhbWUsIG5vdGhpbmcgaGFzIHRvIGJlIGRvbmUgKGxpa2UgaW4gY2FzZSBvZiBzdWNjZXNzIHdpdGggYktlZXBEaWFsb2dPcGVuKVxuXHRcdFx0XHRpZiAoZXJyb3IgIT09IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQgJiYgZXJyb3IgIT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZCkge1xuXHRcdFx0XHRcdC8vIG90aGVyIGVycm9ycyBhcmUgbm90IGV4cGVjdGVkXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KGVycm9yIGFzIHN0cmluZyB8IEVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3koZmFsc2UpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y3JlYXRlRGlhbG9nLmF0dGFjaEV4aXREaWFsb2coe30sIG9uRXhpdERpYWxvZyk7XG5cblx0XHRyZXR1cm4gcmVzdWx0UHJvbWlzZUtlZXBlci5wcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXRzIGZvciB0aGUgY3JlYXRpb24gb2YgYSBjb250ZXh0IHRvIGJlIGZpbmlzaGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbmV3Q29udGV4dCBUaGUgY29udGV4dCBiZWluZyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxib29sZWFuPigpO1xuXHRcdGNvbnN0IHBhcmVudExpc3RCaW5kaW5nID0gbmV3Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblxuXHRcdGNvbnN0IG9uQ3JlYXRlQ29tcGxldGVkID0gKGV2ZW50OiBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChjcmVhdGVkQ29udGV4dCA9PT0gbmV3Q29udGV4dCkge1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQob25DcmVhdGVDb21wbGV0ZWQpO1xuXHRcdFx0XHRwcm9taXNlS2VlcGVyLnJlc29sdmUoc3VjY2VzcyA9PT0gdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHBhcmVudExpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cblx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3NmdWwgPSBhd2FpdCBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdFx0aWYgKCFjcmVhdGlvblN1Y2Nlc3NmdWwpIHtcblx0XHRcdGlmICgha2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHBlbmRpbmcgUE9TVCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHQobmV3Q29udGV4dC5jcmVhdGVkKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCkpLmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhwYXJlbnRMaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIE5ld0FjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICpcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBTdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uXG5cdCAqIEBwYXJhbSBbb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVdXG5cdCAqIEBwYXJhbSBzQ3JlYXRlSGFzaCBIYXNoIHRvIGJlIGNoZWNrZWQgZm9yIGFjdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldE5ld0FjdGlvbihcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IHtcblx0XHRcdHByZWZlcnJlZE1vZGU/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdHNDcmVhdGVIYXNoOiBzdHJpbmcsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmdcblx0KTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0FjdGlvbjtcblxuXHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgc0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkktQUNUSU9OPUNSRUFURVdJVEhcIikpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkNSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmXG5cdFx0XHRzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049QVVUT0NSRUFURVdJVEhcIilcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkFVVE9DUkVBVEVXSVRIOlwiKVxuXHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cmluZyhzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCkgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEBwYXJhbSBzTmV3QWN0aW9uIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZUNvcmUgUmVzb3VyY2VCdW5kbGUgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IENyZWF0ZSBsYWJlbFxuXHQgKiBAcmV0dXJucyBUaGUgbGFiZWwgZm9yIHRoZSBDcmVhdGUgQWN0aW9uIERpYWxvZ1xuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZSB8IHVuZGVmaW5lZFxuXHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGxpbmVJdGVtcyA9IG9NZXRhTW9kZWw/LmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApIGFzIExpbmVJdGVtIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgbGFiZWwgPSBsaW5lSXRlbXM/LmZpbmQoKGxpbmVJdGVtKSA9PiBpc0RhdGFGaWVsZEZvckFjdGlvbihsaW5lSXRlbSkgJiYgbGluZUl0ZW0uQWN0aW9uLnNwbGl0KFwiKFwiLCAxKVswXSA9PT0gc05ld0FjdGlvbilcblx0XHRcdD8uTGFiZWw7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bGFiZWwgfHxcblx0XHRcdG9NZXRhTW9kZWw/LmdldE9iamVjdChgJHtzTWV0YVBhdGh9LyR7c05ld0FjdGlvbn1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsYCkgfHxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZUNvcmU/LmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIpXG5cdFx0KTtcblx0fVxufVxuXG5jb25zdCBzaW5nbGV0b24gPSBuZXcgVHJhbnNhY3Rpb25IZWxwZXIoKTtcbmV4cG9ydCBkZWZhdWx0IHNpbmdsZXRvbjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7RUF1REEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0MsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCOztFQUVuRDtFQUNBLE1BQU1DLGlCQUFpQixHQUFHQyxZQUFZLENBQUNELGlCQUFpQjtFQUN4RCxNQUFNRSwwQkFBMEIsR0FBR0QsWUFBWSxDQUFDQywwQkFBMEI7O0VBRTFFO0VBQ0EsU0FBU0MsYUFBYSxDQUFJQyxXQUF1QixFQUFLO0lBQ3JELElBQUlBLFdBQVcsSUFBS0EsV0FBVyxDQUFXQyxXQUFXLElBQUtELFdB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