@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
@@ -2,19 +2,19 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/routing/ContextPathHelper", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/ui/core/Component", "sap/ui/core/Lib", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../converters/MetaModelConverter"], function (Log, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, ClassSupport, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/routing/ContextPathHelper", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/ui/core/Component", "sap/ui/core/Lib", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../converters/MetaModelConverter"], function (Log, ClassSupport, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _class, _class2;
9
9
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
10
+ var resolvePath = ContextPathHelper.resolvePath;
11
+ var isPathOnDraftRoot = ContextPathHelper.isPathOnDraftRoot;
12
+ var getDraftOrActiveContext = ContextPathHelper.getDraftOrActiveContext;
10
13
  var publicExtension = ClassSupport.publicExtension;
11
14
  var methodOverride = ClassSupport.methodOverride;
12
15
  var finalExtension = ClassSupport.finalExtension;
13
16
  var extensible = ClassSupport.extensible;
14
17
  var defineUI5Class = ClassSupport.defineUI5Class;
15
- var resolvePath = ContextPathHelper.resolvePath;
16
- var isPathOnDraftRoot = ContextPathHelper.isPathOnDraftRoot;
17
- var getDraftOrActiveContext = ContextPathHelper.getDraftOrActiveContext;
18
18
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
19
19
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
20
20
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
@@ -83,7 +83,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
83
83
  this._oAppComponent.getRootViewController().onContextBoundToView(bindingContext);
84
84
  };
85
85
  _proto.afterSetBindingContext = function afterSetBindingContext(bindingContext, _mParameters) {
86
- this.onAfterBinding(bindingContext, _mParameters);
86
+ this.onAfterBinding(bindingContext, {
87
+ ..._mParameters,
88
+ deferredCreation: true
89
+ });
87
90
  const oRouting = this.base.getView().getController().routing;
88
91
  if (oRouting && oRouting.onAfterBinding) {
89
92
  oRouting.onAfterBinding(bindingContext);
@@ -163,7 +166,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
163
166
  internalModel.setProperty("/paginatorCurrentContext", null);
164
167
 
165
168
  // Storing the selected context to use it in internal route navigation if neccessary.
166
- const overrideNav = this.base.getView().getController().routing.onBeforeNavigation({
169
+ const overrideNav = await this.base.getView().getController().routing.onBeforeNavigation({
167
170
  bindingContext: context
168
171
  });
169
172
  if (overrideNav) {
@@ -952,4 +955,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
952
955
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
953
956
  return InternalRouting;
954
957
  }, false);
955
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJkZWxheWVkVXNhZ2UiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImNvbnRleHQiLCJpc0EiLCJjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycyIsIm1vZGUiLCJhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJjcmVhdGVDb250ZXh0UHJvbWlzZSIsImNyZWF0ZWRDb250ZXh0IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsInBlcnNpc3RPUFNjcm9sbCIsInVwZGF0ZUZDTExldmVsIiwiZm9yY2VGb2N1cyIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiY2FsbEV4dGVuc2lvbiIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsInNldFByb3BlcnR5Iiwib3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIlJvd1ByZXNzIiwibW9kZWwiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJpc1BhdGhPbkRyYWZ0Um9vdCIsImdldFBhdGgiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lIiwibmFtZSIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJwYXJlbnRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFnZ3JlZ2F0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5jbHVkZXMiLCJuYXZCYWNrIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwic0Vycm9yTWVzc2FnZSIsIm1QYXJhbWV0ZXJzIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwic2V0VGltZW91dCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiZGlzY29ubmVjdCIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGF0aCIsInJlcGxhY2UiLCJkZWZlcnJlZCIsInNLZXkiLCJzVmFsdWUiLCJiVGFyZ2V0RWRpdGFibGUiLCJiQWN0aW9uQ3JlYXRlIiwib0V2ZW50IiwiZ2V0UGFyYW1ldGVyIiwiZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuIiwiY29udGV4dFBhdHRlcm4iLCJ1bmRlZmluZWQiLCJtQXJndW1lbnRzIiwiZ2V0UGFyYW1ldGVycyIsImFyZ3VtZW50cyIsIm9OYXZpZ2F0aW9uUGFyYW1ldGVycyIsImJpbmRQcm9taXNlIiwib01vZGVsIiwiX2JpbmREZWZlcnJlZCIsIkVkaXRGbG93QWN0aW9uIiwiaXNPcGVuSW5FZGl0TW9kZSIsIl9iaW5kUGFnZUZvckVkaXQiLCJfYmluZFBhZ2UiLCJmaW5hbGx5IiwidG9TdHJpbmciLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInRhcmdldFBhdGgiLCJjcmVhdGVEZWZlcnJlZENvbnRleHQiLCJsaXN0QmluZGluZyIsInBhcmVudENvbnRleHQiLCJkYXRhIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiX2dldEJpbmRpbmdDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJ0ZWNobmljYWxQYXRoIiwicmVzb2x2ZVBhdGgiLCJpc1N0aWNreUVkaXRNb2RlIiwiaXNTdGlja3kiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJhY3RpdmVDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwia2V5UHJvcGVydHkiLCJnZXRPYmplY3QiLCJyZXF1ZXN0UHJvcGVydHkiLCJlZGl0RmxvdyIsImVkaXREb2N1bWVudCIsIl9iaW5kUGFnZVRvUGF0aCIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwic1RhcmdldFBhdGgiLCJvQ3VycmVudENvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsInVzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic2hvdWxkUmVmcmVzaENvbnRleHQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0T2JqZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvUHJldmlvdXNCaW5kaW5nIiwiZ2V0VXBkYXRlR3JvdXBJZCIsImRlc3Ryb3kiLCJvSGlkZGVuQmluZGluZyIsImJpbmRDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwiQnVzeUxvY2tlciIsImxvY2siLCJvbkRhdGFSZWNlaXZlZCIsImdldEJvdW5kQ29udGV4dCIsInNFcnJvckRlc2NyaXB0aW9uIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJvUmVzb3VyY2VCdW5kbGUiLCJtZXNzYWdlSGFuZGxlciIsIm1QYXJhbXMiLCJzdGF0dXMiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwic2hvd01lc3NhZ2VzIiwib0JpbmRpbmdDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsImdldENvbnRleHQiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaXRlbSIsInB1c2giLCJpIiwibGVuZ3RoIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4IiwiaW5kZXhPZiIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0IiwiaXNLZWVwQWxpdmUiLCJiS2VlcEFsaXZlIiwiZm5CZWZvcmVEZXN0cm95IiwiYlJlcXVlc3RNZXNzYWdlcyIsImVuZHNXaXRoIiwic01ldGFQYXRoIiwic2V0S2VlcEFsaXZlIiwia2VwdEFsaXZlU2VnbWVudHMiLCJzcGxpdCIsImFkZGl0aW9ubmFsU2VnbWVudHMiLCJwb3AiLCJrZXB0QWxpdmVQYXRoIiwiam9pbiIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwibGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsInNMYXlvdXQiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHsgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQsIGlzUGF0aE9uRHJhZnRSb290LCByZXNvbHZlUGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL0NvbnRleHRQYXRoSGVscGVyXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1RhcmdldFR5cGUgfSBmcm9tIFwiLi4vc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFJvdXRlSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldHM/OiB1bmtub3duW107XG5cdHJvdXRlTGV2ZWw6IG51bWJlcjtcbn07XG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAc2luY2UgMS43NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1wiKVxuY2xhc3MgSW50ZXJuYWxSb3V0aW5nIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgX29WaWV3ITogRkVWaWV3O1xuXG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0cHJpdmF0ZSBfb1JvdXRpbmdTZXJ2aWNlITogUm91dGluZ1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBfb1RhcmdldEluZm9ybWF0aW9uITogUm91dGluZ1RhcmdldDtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0aW5nU2VydmljZSkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHt9LCB0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KSE7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpOiB2b2lkIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcoX2JpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge31cblxuXHRiZWZvcmVTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCwgX21QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcoYmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0YWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCBfbVBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHBhcmFtIGRlbGF5ZWRVc2FnZSBUcnVlIHRvIHJldHVybiBhIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgdGhlIG5hdmlnYXRpb24sIEZhbHNlIHRvIGV4ZWN1dGUgdGhlIG5hdmlnYXRpb24gaW1tZWRpYXRlbHlcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9UYXJnZXQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0c05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0ZGVsYXllZFVzYWdlPzogdHJ1ZVxuXHQpOiBQcm9taXNlPCgpID0+IHZvaWQ+O1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IGJvb2xlYW5cblx0KTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB2b2lkPiB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnksIGRlbGF5ZWRVc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3Qgb3ZlcnJpZGVOYXYgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbih7IGJpbmRpbmdDb250ZXh0OiBjb250ZXh0IH0pO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHQvLyBJbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgZnJvbSBhIHRhYmxlIGluIGEgTGlzdFJlcG9ydCB3aXRoIGRyYWZ0LCB0aGVyZSdzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbGxhYm9yYXRpb24gYW5kIHRyZWUgdGFibGUuXG5cdFx0Ly8gV2UgbWF5IG5vdCBuYXZpZ2F0ZSB0byB0aGUgY29udGV4dCB0aGUgdXNlciBjbGlja2VkIG9uLlxuXHRcdGlmIChwYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcyAmJiBjb250ZXh0LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0XHRpZiAoaXNQYXRoT25EcmFmdFJvb3QoY29udGV4dC5nZXRQYXRoKCksIG1ldGFNb2RlbCkpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEZvck5hdmlnYXRpb24gPVxuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oY29udGV4dCwgcGFyYW1ldGVycykpID8/XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZVRhYmxlKGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBVc2UgYW5vdGhlciBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRpZiAoY29udGV4dEZvck5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dEZvck5hdmlnYXRpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKFxuXHRcdG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gb3JpZ2luYWxDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24sIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIsXG5cdFx0XHQvLyBXZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBkcmFmdCBpbnN0YW5jZSBleGlzdHMgZmlyc3QuIE90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgb3JpZ2luYWwgKGRyYWZ0KSB2ZXJzaW9uLlxuXHRcdFx0Y29uc3QgZHJhZnRPckFjdGl2ZUNvbnRleHQgPSBhd2FpdCBnZXREcmFmdE9yQWN0aXZlQ29udGV4dChvcmlnaW5hbENvbnRleHQpO1xuXG5cdFx0XHRpZiAoZHJhZnRPckFjdGl2ZUNvbnRleHQgIT09IG51bGwgJiYgb3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSAhPT0gZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdC8vIE5vdGlmeSB0aGUgdXNlciB0aGF0IHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRoZSBzYXZlZCBpbnN0YW5jZVxuXHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdHBhcmFtZXRlcnMucmVkaXJlY3RlZFRvTm9uRHJhZnQgPVxuXHRcdFx0XHRcdChvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lIGFzIHVua25vd24gYXMgc3RyaW5nKSA/P1xuXHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYW1lO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gRkNMOiByZXBsYWNlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0VG9SZXBsYWNlV2l0aCA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRvcmlnaW5hbENvbnRleHQucmVwbGFjZVdpdGgoY29udGV4dFRvUmVwbGFjZVdpdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEZ1bGxzY3JlZW46IHRyaWdnZXIgYSByZWZyZXNoIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVzZSB0aGUgc2F2ZWQgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIGRyYWZ0T3JBY3RpdmVDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgY29udGV4dFxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBUcmVlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdGlmICghYWdncmVnYXRpb24/LmhpZXJhcmNoeVF1YWxpZmllcikge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWUpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgVHJlZVRhYmxlLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBoYXMgYSBkcmFmdCxcblx0XHRcdC8vIC0tPiBXZSB0cnkgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIChpZiBpdCBzdGlsbCBleGlzdHMpXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkcmFmdCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwiKC4uLilcIikpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGFuIGVycm9yIChpbGx1c3RyYXRlZCBtZXNzYWdlKSBpbiB0aGUgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHNFcnJvck1lc3NhZ2Vcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IHN0cmluZywgbVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1jcmVhdGVcIikgfHwgdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWF1dG9DcmVhdGVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYVRhcmdldHMgPSByb3V0ZUluZm9ybWF0aW9uPy50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgIWFUYXJnZXRzLmluY2x1ZGVzKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm1zIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0LCB0byBhdm9pZCB0aGlzIHZpZXcgdG8gaGF2ZSBkYXRhIGlmIHdlIG5hdmlnYXRlIHRvIGl0IGxhdGVyIG9uXG5cdFx0XHQvLyBUaGlzIGlzIGRvbmUgaW4gYSB0aW1lb3V0IHRvIGFsbG93IGZvciBmb2N1c291dCBldmVudHMgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBwcm9wZXJseSBpbiBjb2xsYWJvcmF0aXZlIGRyYWZ0XG5cdFx0XHRpZiAoKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkpIHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPT09IDAgJiYgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcm91dGUgaGFzIGxldmVsIDAgLS0+IHdlIG5lZWQgdG8gbGVhdmUgdGhlIGNvbGxhYm9yYXRpb24gc2Vzc2lvbiBhcyBubyBPUCBpcyBkaXNwbGF5ZWRcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTsgLy8gVGhpcyBhbHNvIGNhbGwgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgoXG5cdFx0cm91dGVBcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD4sXG5cdFx0YmluZGluZ1BhdHRlcm46IHN0cmluZyxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvXG5cdCk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cblx0XHRcdGlmICh0eXBlb2Ygc1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluY2x1ZGVzKGB7JHtzS2V5fX1gKSkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KT8uW1wiaS1hY3Rpb25cIl0/LmluY2x1ZGVzKFwiY3JlYXRlXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKFxuXHRcdG9FdmVudDogRXZlbnQ8e1xuXHRcdFx0cm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb247XG5cdFx0XHRyb3V0ZVBhdHRlcm46IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbmZvOiBSb3V0aW5nTmF2aWdhdGlvbkluZm87XG5cdFx0XHRhcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD47XG5cdFx0fT5cblx0KTogdm9pZCB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0bGV0IGJpbmRQcm9taXNlO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uICYmXG5cdFx0XHQodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWVkaXRcIikgfHwgKHRoaXMuX29QYWdlQ29tcG9uZW50Py5pc09wZW5JbkVkaXRNb2RlPy4oKSA/PyBmYWxzZSkpXG5cdFx0KSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlRm9yRWRpdChwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblxuXHRcdGJpbmRQcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHBhZ2UgYmluZGluZyBcIiArIGVycm9yLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQodGFyZ2V0UGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsLCB7IGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAoIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIHx8IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLm1vZGUgPT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5kYXRhLFxuXHRcdFx0XHRcdCEhbmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLCBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgcHJlZmVycmVkIG1vZGUgZWRpdC5cblx0ICpcblx0ICogSWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGFuIGFjdGl2ZSBlbnRpdHksIGl0IGlzIGRpcmVjdGx5IGNvbnZlcnRlZCB0byBkcmFmdCB1c2luZyB0aGUgRWRpdEZsb3cgY29udHJvbGxlciBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2VGb3JFZGl0KHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRlY2huaWNhbFBhdGg6IHN0cmluZyA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHQvLyBjaGVjayBmb3Igc3RpY2t5ICYgc3RpY2t5IGVkaXQgc2Vzc2lvblxuXHRcdFx0Y29uc3QgaXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0XHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpO1xuXHRcdFx0aWYgKHRlY2huaWNhbFBhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpIHx8IChpc1N0aWNreSAmJiAhaXNTdGlja3lFZGl0TW9kZSkpIHtcblx0XHRcdFx0Ly8gY3JlYXRlIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQodGVjaG5pY2FsUGF0aCwgbW9kZWwpO1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChhY3RpdmVDb250ZXh0LCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHQvLyBLZXkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBzdGlja3kgdXNlIGNhc2Vcblx0XHRcdFx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0ZWNobmljYWxQYXRoKTtcblx0XHRcdFx0XHRjb25zdCBrZXlQcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyRUeXBlLyRLZXlgKTtcblx0XHRcdFx0XHRhd2FpdCBhY3RpdmVDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShrZXlQcm9wZXJ0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSXNBY3RpdmVFbnRpdHkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBkcmFmdCB1c2UgY2FzZVxuXHRcdFx0XHRcdGF3YWl0IGFjdGl2ZUNvbnRleHQucmVxdWVzdFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZWRpdCBkb2N1bWVudFxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93LmVkaXREb2N1bWVudChhY3RpdmVDb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBvbiB0aGUgcGFnZSBpcyBzZXRcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpXG5cdFx0XHQudGhlbigodGVjaG5pY2FsUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBmb3IgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dCAodGhpcyBpcyBhIHBhdGggaW4gdGhlIG1vZGVsLCBzbyBvbmx5IHRlY2huaWNhbCBrZXlzIGFyZSBhbGxvd2VkKS5cblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdC8vIG9yIGlmIHdlIGhhdmUgYSBjb250ZXh0IGFscmVhZHkgc2VsZWN0ZWRcblx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0aWYgKG9Vc2VDb250ZXh0ICE9PSBvQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0bGV0IHNob3VsZFJlZnJlc2hDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHRcdC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgY29udGV4dCB0byBiZSB1c2VkLCBhbmQgaXQncyBub3QgdGhlIGN1cnJlbnQgb25lXG5cblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlJ3JlIHJldXNpbmcgYSBjb250ZXh0IGZyb20gYSB0YWJsZSAodGhyb3VnaCBuYXZpZ2F0aW9uKSwgd2UgcmVmcmVzaCBpdCB0byBhdm9pZCBvdXRkYXRlZCBkYXRhXG5cdFx0XHRcdC8vIFdlIGRvbid0IHdhaXQgZm9yIHRoZSByZWZyZXNoIHRvIGJlIGNvbXBsZXRlZCAocmVxdWVzdFJlZnJlc2gpLCBzbyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IGdvZXMgaW50byB0aGUgc2FtZVxuXHRcdFx0XHQvLyBiYXRjaCBhcyB0aGUgb25lcyBmcm9tIGNvbnRyb2xzIGluIHRoZSBwYWdlLlxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb1VzZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRpZiAoIW9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fFxuXHRcdFx0XHRcdFx0KE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBvVXNlQ29udGV4dC5nZXRQYXRoKCkpICYmXG5cdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGJ1dCB3ZSdyZSBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0LCB3ZSBmb3JjZSB0aGUgcmVmcmVzaCAoZGlzY2FyZGluZyBwZW5kaW5nIGNoYW5nZXMpIGFzIHdlIG5lZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24uXG5cdFx0XHRcdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgZnJvbSBMUiB0byBPUCwgdGhlIHZpZXcgaXMgbm90IGNvbm5lY3RlZCB5ZXQgLS0+IGNoZWNrIGlmIHdlJ3JlIGluIGRyYWZ0IHdpdGggY29sbGFib3JhdGlvbiBmcm9tIHRoZSBtZXRhbW9kZWxcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1VzZUNvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKHNob3VsZFJlZnJlc2hDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFtcIipcIl0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0b0RyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ/IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXVxuXHRcdFx0XHRcdFx0XHQ6IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUHJldmlvdXNCaW5kaW5nKSB7XG5cdFx0XHRcdFx0b01vZGVsLnJlc2V0Q2hhbmdlcyhvUHJldmlvdXNCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG9uRGF0YVJlY2VpdmVkKG9FdmVudDogRXZlbnQ8eyBlcnJvcjogeyBzdGF0dXM6IG51bWJlciB9IH0+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBCaW5kaW5nKTogdm9pZCB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IChvQmluZGluZy5nZXRDb250ZXh0KCk/LmdldFBhdGgoKSA/PyBcIlwiKS5yZXBsYWNlKHNSb290Q29udGV4dFBhdGgsIFwiXCIpOyAvLyBJZiBubyBjb250ZXh0LCB0aGlzIGlzIGFuIGFic29sdXRlIGJpbmRpbmcgc28gbm8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0Y29uc3Qgc1BhdGggPSAoc1JlbGF0aXZlUGF0aCA/IGAke3NSZWxhdGl2ZVBhdGguc2xpY2UoMSl9L2AgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQTxPRGF0YUNvbnRleHRCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGl0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhUHJvcGVydHlCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFQcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldHM6IHN0cmluZ1tdLCB0YXJnZXRQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdHRhcmdldHMucHVzaChpbmRleCA+IDAgPyB0YXJnZXRQcm9wZXJ0eS5zbGljZSgwLCBpbmRleCkgOiB0YXJnZXRQcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0cztcblx0XHR9LCBbXSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0Py5pc0tlZXBBbGl2ZSgpICYmIG9QcmV2aW91c0NvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKi9cblx0X2dldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7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
958
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwibmF2aWdhdGVUb1JvdXRlIiwic1RhcmdldFJvdXRlTmFtZSIsIm9QYXJhbWV0ZXJzIiwibmF2aWdhdGVUb0NvbnRleHQiLCJjb250ZXh0IiwiaXNBIiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjcmVhdGVkQ29udGV4dCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiZWRpdGFibGUiLCJwZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImZvcmNlRm9jdXMiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImNhbGxFeHRlbnNpb24iLCJpbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsIm92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJGQ0xMZXZlbCIsIl9nZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJnZXRQYXRoIiwiY29udGV4dEZvck5hdmlnYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uIiwiZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZVRhYmxlIiwiZ2V0Vmlld0RhdGEiLCJvcmlnaW5hbENvbnRleHQiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZ2V0UHJvcGVydHkiLCJkcmFmdE9yQWN0aXZlQ29udGV4dCIsImdldERyYWZ0T3JBY3RpdmVDb250ZXh0Iiwib2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwicmVkaXJlY3RlZFRvTm9uRHJhZnQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhlYWRlckluZm8iLCJUeXBlTmFtZSIsIm5hbWUiLCJpc0ZjbEVuYWJsZWQiLCJjb250ZXh0VG9SZXBsYWNlV2l0aCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXBsYWNlV2l0aCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwicGFyZW50QmluZGluZyIsImdldEJpbmRpbmciLCJhZ2dyZWdhdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsInNIYXNoIiwiZ2V0SGFzaCIsImluY2x1ZGVzIiwibmF2QmFjayIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsInNFcnJvck1lc3NhZ2UiLCJtUGFyYW1ldGVycyIsIm5hdlRvSGFzaCIsImdldERlZmF1bHRDcmVhdGVIYXNoIiwiZGlzcGxheUVycm9yUGFnZSIsImlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeSIsIl9pc1ZpZXdQYXJ0T2ZSb3V0ZSIsInJvdXRlSW5mb3JtYXRpb24iLCJhVGFyZ2V0cyIsInRhcmdldHMiLCJ0YXJnZXROYW1lIiwidmlld0xldmVsIiwicm91dGVMZXZlbCIsInNldFRpbWVvdXQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJpc0Nvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJfc2V0QmluZGluZ0NvbnRleHQiLCJfYnVpbGRCaW5kaW5nUGF0aCIsInJvdXRlQXJndW1lbnRzIiwiYmluZGluZ1BhdHRlcm4iLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBhdGgiLCJyZXBsYWNlIiwiZGVmZXJyZWQiLCJzS2V5Iiwic1ZhbHVlIiwiYlRhcmdldEVkaXRhYmxlIiwiYkFjdGlvbkNyZWF0ZSIsIm9FdmVudCIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJiaW5kUHJvbWlzZSIsIm9Nb2RlbCIsIl9iaW5kRGVmZXJyZWQiLCJFZGl0Rmxvd0FjdGlvbiIsImlzT3BlbkluRWRpdE1vZGUiLCJfYmluZFBhZ2VGb3JFZGl0IiwiX2JpbmRQYWdlIiwiZmluYWxseSIsInRvU3RyaW5nIiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJ0YXJnZXRQYXRoIiwiY3JlYXRlRGVmZXJyZWRDb250ZXh0IiwibGlzdEJpbmRpbmciLCJwYXJlbnRDb250ZXh0IiwiZGF0YSIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIl9nZXRCaW5kaW5nQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwidGVjaG5pY2FsUGF0aCIsInJlc29sdmVQYXRoIiwiaXNTdGlja3lFZGl0TW9kZSIsImlzU3RpY2t5IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiYWN0aXZlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImtleVByb3BlcnR5IiwiZ2V0T2JqZWN0IiwicmVxdWVzdFByb3BlcnR5IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJ1c2VDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInNob3VsZFJlZnJlc2hDb250ZXh0IiwiaXNEcmFmdFN1cHBvcnRlZCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImdldEdyb3VwSWQiLCJlcnIiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwiYlNob3dQbGFjZWhvbGRlciIsIkFwcFN0YXRlQ2hhbmdlZCIsIlJlc3RvcmVIaXN0b3J5IiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNFeGl0aW5nIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJzUGF0aCIsIm9QYWdlQ29tcG9uZW50Iiwic0VudGl0eVNldCIsImdldEVudGl0eVNldCIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwib01ldGFNb2RlbCIsIiQkZ3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJvRHJhZnRSb290Iiwib0RyYWZ0Tm9kZSIsIl9nZXRLZWVwQWxpdmVDb250ZXh0IiwicmVxdWVzdE9iamVjdCIsInNNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCIkc2VsZWN0Iiwib1ByZXZpb3VzQmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJkZXN0cm95Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib25EYXRhUmVjZWl2ZWQiLCJnZXRCb3VuZENvbnRleHQiLCJzRXJyb3JEZXNjcmlwdGlvbiIsImlzTG9ja2VkIiwidW5sb2NrIiwib1Jlc291cmNlQnVuZGxlIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsIm9CaW5kaW5nQ29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJ0YXJnZXRQcm9wZXJ0aWVzIiwidGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsIml0ZW0iLCJwdXNoIiwiaSIsImxlbmd0aCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwicmVkdWNlIiwidGFyZ2V0UHJvcGVydHkiLCJpbmRleCIsImluZGV4T2YiLCJvUHJldmlvdXNDb250ZXh0Iiwib1RhcmdldENvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzS2VlcEFsaXZlIiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwic3BsaXQiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsImpvaW4iLCJvS2VlcEFsaXZlQ29udGV4dCIsInJldmVyc2UiLCJhZGRpdGlvbm5hbFBhdGgiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfcm91dGluZyIsImxheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJzTGF5b3V0IiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHsgdHlwZSBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBnZXREcmFmdE9yQWN0aXZlQ29udGV4dCwgaXNQYXRoT25EcmFmdFJvb3QsIHJlc29sdmVQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvQ29udGV4dFBhdGhIZWxwZXJcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1RhcmdldFR5cGUgfSBmcm9tIFwiLi4vc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFJvdXRlSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldHM/OiB1bmtub3duW107XG5cdHJvdXRlTGV2ZWw6IG51bWJlcjtcbn07XG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAc2luY2UgMS43NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1wiKVxuY2xhc3MgSW50ZXJuYWxSb3V0aW5nIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgX29WaWV3ITogRkVWaWV3O1xuXG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0cHJpdmF0ZSBfb1JvdXRpbmdTZXJ2aWNlITogUm91dGluZ1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBfb1RhcmdldEluZm9ybWF0aW9uITogUm91dGluZ1RhcmdldDtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0aW5nU2VydmljZSkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHt9LCB0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KSE7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpOiB2b2lkIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcoX2JpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge31cblxuXHRiZWZvcmVTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCwgX21QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcoYmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0YWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IG9iamVjdCk6IHZvaWQge1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcoYmluZGluZ0NvbnRleHQsIHsgLi4uX21QYXJhbWV0ZXJzLCBkZWZlcnJlZENyZWF0aW9uOiB0cnVlIH0pO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHBhcmFtIGRlbGF5ZWRVc2FnZSBUcnVlIHRvIHJldHVybiBhIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgdGhlIG5hdmlnYXRpb24sIEZhbHNlIHRvIGV4ZWN1dGUgdGhlIG5hdmlnYXRpb24gaW1tZWRpYXRlbHlcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9UYXJnZXQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0c05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0ZGVsYXllZFVzYWdlPzogdHJ1ZVxuXHQpOiBQcm9taXNlPCgpID0+IHZvaWQ+O1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IGJvb2xlYW5cblx0KTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB2b2lkPiB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnksIGRlbGF5ZWRVc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3Qgb3ZlcnJpZGVOYXYgPSBhd2FpdCB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbih7IGJpbmRpbmdDb250ZXh0OiBjb250ZXh0IH0pO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHQvLyBJbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgZnJvbSBhIHRhYmxlIGluIGEgTGlzdFJlcG9ydCB3aXRoIGRyYWZ0LCB0aGVyZSdzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbGxhYm9yYXRpb24gYW5kIHRyZWUgdGFibGUuXG5cdFx0Ly8gV2UgbWF5IG5vdCBuYXZpZ2F0ZSB0byB0aGUgY29udGV4dCB0aGUgdXNlciBjbGlja2VkIG9uLlxuXHRcdGlmIChwYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcyAmJiBjb250ZXh0LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0XHRpZiAoaXNQYXRoT25EcmFmdFJvb3QoY29udGV4dC5nZXRQYXRoKCksIG1ldGFNb2RlbCkpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEZvck5hdmlnYXRpb24gPVxuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oY29udGV4dCwgcGFyYW1ldGVycykpID8/XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZVRhYmxlKGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBVc2UgYW5vdGhlciBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRpZiAoY29udGV4dEZvck5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dEZvck5hdmlnYXRpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKFxuXHRcdG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gb3JpZ2luYWxDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24sIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIsXG5cdFx0XHQvLyBXZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBkcmFmdCBpbnN0YW5jZSBleGlzdHMgZmlyc3QuIE90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgb3JpZ2luYWwgKGRyYWZ0KSB2ZXJzaW9uLlxuXHRcdFx0Y29uc3QgZHJhZnRPckFjdGl2ZUNvbnRleHQgPSBhd2FpdCBnZXREcmFmdE9yQWN0aXZlQ29udGV4dChvcmlnaW5hbENvbnRleHQpO1xuXG5cdFx0XHRpZiAoZHJhZnRPckFjdGl2ZUNvbnRleHQgIT09IG51bGwgJiYgb3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSAhPT0gZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdC8vIE5vdGlmeSB0aGUgdXNlciB0aGF0IHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRoZSBzYXZlZCBpbnN0YW5jZVxuXHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdHBhcmFtZXRlcnMucmVkaXJlY3RlZFRvTm9uRHJhZnQgPVxuXHRcdFx0XHRcdChvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lIGFzIHVua25vd24gYXMgc3RyaW5nKSA/P1xuXHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYW1lO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gRkNMOiByZXBsYWNlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0VG9SZXBsYWNlV2l0aCA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRvcmlnaW5hbENvbnRleHQucmVwbGFjZVdpdGgoY29udGV4dFRvUmVwbGFjZVdpdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEZ1bGxzY3JlZW46IHRyaWdnZXIgYSByZWZyZXNoIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVzZSB0aGUgc2F2ZWQgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIGRyYWZ0T3JBY3RpdmVDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgY29udGV4dFxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBUcmVlIHRhYmxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdGlmICghYWdncmVnYXRpb24/LmhpZXJhcmNoeVF1YWxpZmllcikge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWUpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgVHJlZVRhYmxlLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBoYXMgYSBkcmFmdCxcblx0XHRcdC8vIC0tPiBXZSB0cnkgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIChpZiBpdCBzdGlsbCBleGlzdHMpXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkcmFmdCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwiKC4uLilcIikpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGFuIGVycm9yIChpbGx1c3RyYXRlZCBtZXNzYWdlKSBpbiB0aGUgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHNFcnJvck1lc3NhZ2Vcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IHN0cmluZywgbVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1jcmVhdGVcIikgfHwgdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWF1dG9DcmVhdGVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYVRhcmdldHMgPSByb3V0ZUluZm9ybWF0aW9uPy50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgIWFUYXJnZXRzLmluY2x1ZGVzKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm1zIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0LCB0byBhdm9pZCB0aGlzIHZpZXcgdG8gaGF2ZSBkYXRhIGlmIHdlIG5hdmlnYXRlIHRvIGl0IGxhdGVyIG9uXG5cdFx0XHQvLyBUaGlzIGlzIGRvbmUgaW4gYSB0aW1lb3V0IHRvIGFsbG93IGZvciBmb2N1c291dCBldmVudHMgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBwcm9wZXJseSBpbiBjb2xsYWJvcmF0aXZlIGRyYWZ0XG5cdFx0XHRpZiAoKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkpIHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPT09IDAgJiYgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgcm91dGUgaGFzIGxldmVsIDAgLS0+IHdlIG5lZWQgdG8gbGVhdmUgdGhlIGNvbGxhYm9yYXRpb24gc2Vzc2lvbiBhcyBubyBPUCBpcyBkaXNwbGF5ZWRcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTsgLy8gVGhpcyBhbHNvIGNhbGwgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgoXG5cdFx0cm91dGVBcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD4sXG5cdFx0YmluZGluZ1BhdHRlcm46IHN0cmluZyxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvXG5cdCk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cblx0XHRcdGlmICh0eXBlb2Ygc1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluY2x1ZGVzKGB7JHtzS2V5fX1gKSkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KT8uW1wiaS1hY3Rpb25cIl0/LmluY2x1ZGVzKFwiY3JlYXRlXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKFxuXHRcdG9FdmVudDogRXZlbnQ8e1xuXHRcdFx0cm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb247XG5cdFx0XHRyb3V0ZVBhdHRlcm46IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbmZvOiBSb3V0aW5nTmF2aWdhdGlvbkluZm87XG5cdFx0XHRhcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD47XG5cdFx0fT5cblx0KTogdm9pZCB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0bGV0IGJpbmRQcm9taXNlO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uICYmXG5cdFx0XHQodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWVkaXRcIikgfHwgKHRoaXMuX29QYWdlQ29tcG9uZW50Py5pc09wZW5JbkVkaXRNb2RlPy4oKSA/PyBmYWxzZSkpXG5cdFx0KSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlRm9yRWRpdChwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblxuXHRcdGJpbmRQcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHBhZ2UgYmluZGluZyBcIiArIGVycm9yLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQodGFyZ2V0UGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsLCB7IGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAoIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIHx8IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLm1vZGUgPT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5kYXRhLFxuXHRcdFx0XHRcdCEhbmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLCBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgcHJlZmVycmVkIG1vZGUgZWRpdC5cblx0ICpcblx0ICogSWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGFuIGFjdGl2ZSBlbnRpdHksIGl0IGlzIGRpcmVjdGx5IGNvbnZlcnRlZCB0byBkcmFmdCB1c2luZyB0aGUgRWRpdEZsb3cgY29udHJvbGxlciBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2VGb3JFZGl0KHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRlY2huaWNhbFBhdGg6IHN0cmluZyA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHQvLyBjaGVjayBmb3Igc3RpY2t5ICYgc3RpY2t5IGVkaXQgc2Vzc2lvblxuXHRcdFx0Y29uc3QgaXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0XHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpO1xuXHRcdFx0aWYgKHRlY2huaWNhbFBhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpIHx8IChpc1N0aWNreSAmJiAhaXNTdGlja3lFZGl0TW9kZSkpIHtcblx0XHRcdFx0Ly8gY3JlYXRlIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQodGVjaG5pY2FsUGF0aCwgbW9kZWwpO1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChhY3RpdmVDb250ZXh0LCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoaXNTdGlja3kpIHtcblx0XHRcdFx0XHQvLyBLZXkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBzdGlja3kgdXNlIGNhc2Vcblx0XHRcdFx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0ZWNobmljYWxQYXRoKTtcblx0XHRcdFx0XHRjb25zdCBrZXlQcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyRUeXBlLyRLZXlgKTtcblx0XHRcdFx0XHRhd2FpdCBhY3RpdmVDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShrZXlQcm9wZXJ0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSXNBY3RpdmVFbnRpdHkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgZWRpdGluZyB0byB3b3JrIGluIHRoZSBkcmFmdCB1c2UgY2FzZVxuXHRcdFx0XHRcdGF3YWl0IGFjdGl2ZUNvbnRleHQucmVxdWVzdFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZWRpdCBkb2N1bWVudFxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93LmVkaXREb2N1bWVudChhY3RpdmVDb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBvbiB0aGUgcGFnZSBpcyBzZXRcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpXG5cdFx0XHQudGhlbigodGVjaG5pY2FsUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBmb3IgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dCAodGhpcyBpcyBhIHBhdGggaW4gdGhlIG1vZGVsLCBzbyBvbmx5IHRlY2huaWNhbCBrZXlzIGFyZSBhbGxvd2VkKS5cblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdC8vIG9yIGlmIHdlIGhhdmUgYSBjb250ZXh0IGFscmVhZHkgc2VsZWN0ZWRcblx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0aWYgKG9Vc2VDb250ZXh0ICE9PSBvQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0bGV0IHNob3VsZFJlZnJlc2hDb250ZXh0ID0gZmFsc2U7XG5cdFx0XHRcdC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgY29udGV4dCB0byBiZSB1c2VkLCBhbmQgaXQncyBub3QgdGhlIGN1cnJlbnQgb25lXG5cblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlJ3JlIHJldXNpbmcgYSBjb250ZXh0IGZyb20gYSB0YWJsZSAodGhyb3VnaCBuYXZpZ2F0aW9uKSwgd2UgcmVmcmVzaCBpdCB0byBhdm9pZCBvdXRkYXRlZCBkYXRhXG5cdFx0XHRcdC8vIFdlIGRvbid0IHdhaXQgZm9yIHRoZSByZWZyZXNoIHRvIGJlIGNvbXBsZXRlZCAocmVxdWVzdFJlZnJlc2gpLCBzbyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IGdvZXMgaW50byB0aGUgc2FtZVxuXHRcdFx0XHQvLyBiYXRjaCBhcyB0aGUgb25lcyBmcm9tIGNvbnRyb2xzIGluIHRoZSBwYWdlLlxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb1VzZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRpZiAoIW9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fFxuXHRcdFx0XHRcdFx0KE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBvVXNlQ29udGV4dC5nZXRQYXRoKCkpICYmXG5cdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGJ1dCB3ZSdyZSBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0LCB3ZSBmb3JjZSB0aGUgcmVmcmVzaCAoZGlzY2FyZGluZyBwZW5kaW5nIGNoYW5nZXMpIGFzIHdlIG5lZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24uXG5cdFx0XHRcdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgZnJvbSBMUiB0byBPUCwgdGhlIHZpZXcgaXMgbm90IGNvbm5lY3RlZCB5ZXQgLS0+IGNoZWNrIGlmIHdlJ3JlIGluIGRyYWZ0IHdpdGggY29sbGFib3JhdGlvbiBmcm9tIHRoZSBtZXRhbW9kZWxcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1VzZUNvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKHNob3VsZFJlZnJlc2hDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFtcIipcIl0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0b0RyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ/IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXVxuXHRcdFx0XHRcdFx0XHQ6IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUHJldmlvdXNCaW5kaW5nKSB7XG5cdFx0XHRcdFx0b01vZGVsLnJlc2V0Q2hhbmdlcyhvUHJldmlvdXNCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG9uRGF0YVJlY2VpdmVkKG9FdmVudDogRXZlbnQ8eyBlcnJvcjogeyBzdGF0dXM6IG51bWJlciB9IH0+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBCaW5kaW5nKTogdm9pZCB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IChvQmluZGluZy5nZXRDb250ZXh0KCk/LmdldFBhdGgoKSA/PyBcIlwiKS5yZXBsYWNlKHNSb290Q29udGV4dFBhdGgsIFwiXCIpOyAvLyBJZiBubyBjb250ZXh0LCB0aGlzIGlzIGFuIGFic29sdXRlIGJpbmRpbmcgc28gbm8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0Y29uc3Qgc1BhdGggPSAoc1JlbGF0aXZlUGF0aCA/IGAke3NSZWxhdGl2ZVBhdGguc2xpY2UoMSl9L2AgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQTxPRGF0YUNvbnRleHRCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGl0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhUHJvcGVydHlCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFQcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldHM6IHN0cmluZ1tdLCB0YXJnZXRQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdHRhcmdldHMucHVzaChpbmRleCA+IDAgPyB0YXJnZXRQcm9wZXJ0eS5zbGljZSgwLCBpbmRleCkgOiB0YXJnZXRQcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0cztcblx0XHR9LCBbXSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0Py5pc0tlZXBBbGl2ZSgpICYmIG9QcmV2aW91c0NvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKi9cblx0X2dldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91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