@sapui5/sap.fe.core 1.134.0 → 1.136.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 (395) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +6 -62
  4. package/src/sap/fe/core/ActionRuntime.ts +14 -65
  5. package/src/sap/fe/core/AppComponent.js +10 -2
  6. package/src/sap/fe/core/AppComponent.ts +6 -0
  7. package/src/sap/fe/core/AppStateHandler.js +9 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/BaseController.js +1 -1
  10. package/src/sap/fe/core/CommonUtils.js +8 -4
  11. package/src/sap/fe/core/CommonUtils.ts +19 -4
  12. package/src/sap/fe/core/ExtensionAPI.js +7 -5
  13. package/src/sap/fe/core/ExtensionAPI.ts +5 -3
  14. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +1 -1
  16. package/src/sap/fe/core/PageController.js +36 -6
  17. package/src/sap/fe/core/PageController.ts +30 -0
  18. package/src/sap/fe/core/ResourceModel.js +1 -1
  19. package/src/sap/fe/core/ReuseComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.js +1 -1
  21. package/src/sap/fe/core/TemplateModel.js +1 -1
  22. package/src/sap/fe/core/UIProvider.js +2 -2
  23. package/src/sap/fe/core/UIProvider.ts +3 -32
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +34 -16
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +39 -18
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +1 -1
  27. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  28. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -2
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -0
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +7 -7
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +9 -9
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
  35. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -3
  36. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  37. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  38. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +15 -15
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +19 -19
  40. package/src/sap/fe/core/controllerextensions/ContextSharing.js +1 -1
  41. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -93
  42. package/src/sap/fe/core/controllerextensions/EditFlow.ts +89 -108
  43. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +355 -0
  45. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +387 -0
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +36 -11
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +36 -10
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +36 -6
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +5 -2
  54. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -0
  55. package/src/sap/fe/core/controllerextensions/Paginator.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/Placeholder.js +1 -1
  57. package/src/sap/fe/core/controllerextensions/Recommendations.js +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +9 -9
  59. package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
  60. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  61. package/src/sap/fe/core/controllerextensions/Share.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/SideEffects.js +13 -6
  63. package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -6
  64. package/src/sap/fe/core/controllerextensions/Telemetry.js +1 -1
  65. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +14 -11
  67. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +20 -14
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +4 -12
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  70. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +12 -2
  71. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  72. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  74. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +111 -89
  75. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +140 -105
  76. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +137 -79
  77. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +133 -120
  78. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -3
  79. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  80. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +26 -17
  82. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +32 -23
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +3 -3
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  85. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +103 -23
  86. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +144 -53
  87. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +29 -11
  88. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +39 -15
  89. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +24 -22
  90. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +28 -26
  91. package/src/sap/fe/core/controllerextensions/editFlow/operations/actionHelper.js +1 -1
  92. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -572
  93. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +25 -873
  94. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  95. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +98 -56
  96. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -80
  97. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +5 -3
  98. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -4
  99. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +1 -1
  100. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +1 -1
  101. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -1
  102. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  103. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  104. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  105. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +1 -1
  106. package/src/sap/fe/core/controls/Any.js +1 -1
  107. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  108. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  109. package/src/sap/fe/core/controls/ComponentLoader.js +1 -1
  110. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +3 -3
  111. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  112. package/src/sap/fe/core/controls/DataWatcher.js +4 -3
  113. package/src/sap/fe/core/controls/DataWatcher.tsx +4 -1
  114. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  115. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +10 -4
  116. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +13 -2
  117. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  118. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +1 -1
  119. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  120. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  121. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  122. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  123. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  124. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  125. package/src/sap/fe/core/converters/ConverterContext.js +1 -1
  126. package/src/sap/fe/core/converters/ManifestSettings.js +3 -2
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +42 -20
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +8 -2
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +8 -0
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  131. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  132. package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
  133. package/src/sap/fe/core/converters/annotations/DataField.ts +2 -1
  134. package/src/sap/fe/core/converters/controls/Common/Action.js +55 -6
  135. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  136. package/src/sap/fe/core/converters/controls/Common/Chart.js +45 -6
  137. package/src/sap/fe/core/converters/controls/Common/Chart.ts +60 -9
  138. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  139. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  140. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -5
  141. package/src/sap/fe/core/converters/controls/Common/Form.ts +25 -5
  142. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  143. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -1686
  144. package/src/sap/fe/core/converters/controls/Common/Table.ts +254 -2513
  145. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +1701 -0
  146. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2377 -0
  147. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +64 -15
  148. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +76 -14
  149. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -36
  150. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +8 -46
  151. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  152. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  153. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +10 -5
  154. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  155. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  156. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -3
  157. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +11 -4
  158. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +7 -2
  159. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  161. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
  162. package/src/sap/fe/core/converters/helpers/ID.js +1 -1
  163. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -1
  164. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  165. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  166. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  167. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  168. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +30 -8
  169. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  170. package/src/sap/fe/core/converters/templates/ListReportConverter.js +5 -3
  171. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +5 -1
  172. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  173. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +184 -0
  174. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +240 -0
  175. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  176. package/src/sap/fe/core/designtime/messagebundle.properties +11 -0
  177. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  178. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  179. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  180. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  181. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  182. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  183. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  184. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  185. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  186. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  187. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  188. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  189. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  190. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  191. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  192. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  193. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  194. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  195. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  196. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  197. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  198. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  199. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  200. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  201. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  202. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  203. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  204. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  205. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  206. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  207. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  208. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  209. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  210. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  211. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  212. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  213. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  214. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  215. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  216. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  217. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  218. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  219. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  220. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  221. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  222. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  223. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  224. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  225. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  226. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  227. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  228. package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
  229. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  230. package/src/sap/fe/core/formatters/StandardFormatter.js +1 -1
  231. package/src/sap/fe/core/formatters/ValueFormatter.js +27 -12
  232. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -11
  233. package/src/sap/fe/core/fpm/Component.js +1 -1
  234. package/src/sap/fe/core/fpm/manifest.json +1 -1
  235. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +1 -1
  236. package/src/sap/fe/core/helpers/AppStartupHelper.js +25 -4
  237. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  238. package/src/sap/fe/core/helpers/BindingHelper.js +4 -3
  239. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  240. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -1
  241. package/src/sap/fe/core/helpers/DeleteHelper.js +6 -12
  242. package/src/sap/fe/core/helpers/DeleteHelper.ts +4 -9
  243. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  244. package/src/sap/fe/core/helpers/EditState.js +1 -1
  245. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  246. package/src/sap/fe/core/helpers/FPMHelper.js +9 -3
  247. package/src/sap/fe/core/helpers/FPMHelper.ts +13 -1
  248. package/src/sap/fe/core/helpers/HTTP503Handler.js +1 -1
  249. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  250. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  251. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  252. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -1
  253. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  254. package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
  255. package/src/sap/fe/core/helpers/MetaPath.js +1 -1
  256. package/src/sap/fe/core/helpers/ModelHelper.js +15 -5
  257. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  258. package/src/sap/fe/core/helpers/PasteHelper.js +39 -40
  259. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  260. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  261. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -1
  262. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
  263. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  264. package/src/sap/fe/core/helpers/SizeHelper.js +1 -1
  265. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  266. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -1
  267. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  268. package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
  269. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -1
  270. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  271. package/src/sap/fe/core/helpers/WebSocket.js +11 -2
  272. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  273. package/src/sap/fe/core/library.js +16 -4
  274. package/src/sap/fe/core/library.support.js +1 -1
  275. package/src/sap/fe/core/library.ts +1 -0
  276. package/src/sap/fe/core/manifestMerger/AddNewPage.js +1 -1
  277. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  278. package/src/sap/fe/core/messagebundle.properties +41 -2
  279. package/src/sap/fe/core/messagebundle_ar.properties +25 -4
  280. package/src/sap/fe/core/messagebundle_bg.properties +25 -4
  281. package/src/sap/fe/core/messagebundle_ca.properties +24 -3
  282. package/src/sap/fe/core/messagebundle_cnr.properties +25 -4
  283. package/src/sap/fe/core/messagebundle_cs.properties +23 -2
  284. package/src/sap/fe/core/messagebundle_cy.properties +24 -3
  285. package/src/sap/fe/core/messagebundle_da.properties +25 -4
  286. package/src/sap/fe/core/messagebundle_de.properties +28 -7
  287. package/src/sap/fe/core/messagebundle_el.properties +23 -2
  288. package/src/sap/fe/core/messagebundle_en.properties +25 -4
  289. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -4
  290. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -5
  291. package/src/sap/fe/core/messagebundle_es.properties +23 -2
  292. package/src/sap/fe/core/messagebundle_es_MX.properties +23 -2
  293. package/src/sap/fe/core/messagebundle_et.properties +23 -2
  294. package/src/sap/fe/core/messagebundle_fi.properties +23 -2
  295. package/src/sap/fe/core/messagebundle_fr.properties +26 -5
  296. package/src/sap/fe/core/messagebundle_fr_CA.properties +23 -2
  297. package/src/sap/fe/core/messagebundle_hi.properties +24 -3
  298. package/src/sap/fe/core/messagebundle_hr.properties +27 -6
  299. package/src/sap/fe/core/messagebundle_hu.properties +23 -2
  300. package/src/sap/fe/core/messagebundle_id.properties +23 -2
  301. package/src/sap/fe/core/messagebundle_it.properties +25 -4
  302. package/src/sap/fe/core/messagebundle_iw.properties +24 -3
  303. package/src/sap/fe/core/messagebundle_ja.properties +24 -3
  304. package/src/sap/fe/core/messagebundle_kk.properties +23 -2
  305. package/src/sap/fe/core/messagebundle_ko.properties +25 -4
  306. package/src/sap/fe/core/messagebundle_lt.properties +23 -2
  307. package/src/sap/fe/core/messagebundle_lv.properties +25 -4
  308. package/src/sap/fe/core/messagebundle_mk.properties +23 -2
  309. package/src/sap/fe/core/messagebundle_ms.properties +24 -3
  310. package/src/sap/fe/core/messagebundle_nl.properties +23 -2
  311. package/src/sap/fe/core/messagebundle_no.properties +23 -2
  312. package/src/sap/fe/core/messagebundle_pl.properties +25 -4
  313. package/src/sap/fe/core/messagebundle_pt.properties +25 -4
  314. package/src/sap/fe/core/messagebundle_pt_PT.properties +24 -3
  315. package/src/sap/fe/core/messagebundle_ro.properties +25 -4
  316. package/src/sap/fe/core/messagebundle_ru.properties +24 -3
  317. package/src/sap/fe/core/messagebundle_sh.properties +25 -4
  318. package/src/sap/fe/core/messagebundle_sk.properties +24 -3
  319. package/src/sap/fe/core/messagebundle_sl.properties +28 -7
  320. package/src/sap/fe/core/messagebundle_sr.properties +25 -4
  321. package/src/sap/fe/core/messagebundle_sv.properties +23 -2
  322. package/src/sap/fe/core/messagebundle_th.properties +25 -4
  323. package/src/sap/fe/core/messagebundle_tr.properties +23 -2
  324. package/src/sap/fe/core/messagebundle_uk.properties +25 -4
  325. package/src/sap/fe/core/messagebundle_vi.properties +25 -4
  326. package/src/sap/fe/core/messagebundle_zh_CN.properties +26 -5
  327. package/src/sap/fe/core/messagebundle_zh_TW.properties +24 -3
  328. package/src/sap/fe/core/rootView/Fcl.controller.js +11 -7
  329. package/src/sap/fe/core/rootView/Fcl.controller.ts +16 -7
  330. package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -3
  331. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  332. package/src/sap/fe/core/rootView/RootViewBaseController.js +87 -35
  333. package/src/sap/fe/core/rootView/RootViewBaseController.ts +113 -57
  334. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  335. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  336. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +29 -13
  337. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  338. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  339. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +1 -1
  340. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +8 -2
  341. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  342. package/src/sap/fe/core/services/InlineEditServiceFactory.js +11 -5
  343. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +9 -3
  344. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  345. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  346. package/src/sap/fe/core/services/RoutingServiceFactory.js +14 -7
  347. package/src/sap/fe/core/services/RoutingServiceFactory.ts +11 -5
  348. package/src/sap/fe/core/services/ShellServicesFactory.js +5 -4
  349. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  350. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +28 -4
  351. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  352. package/src/sap/fe/core/services/TelemetryServiceFactory.js +1 -1
  353. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  354. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +1 -1
  355. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
  356. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -1
  357. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  358. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  359. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  360. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  361. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  362. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  363. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  364. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  365. package/src/sap/fe/core/templating/ActionHelper.js +1 -1
  366. package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
  367. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  368. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  369. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +199 -59
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
  374. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  375. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  376. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  377. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  378. package/src/sap/fe/core/templating/SemanticObjectHelper.js +8 -10
  379. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +11 -10
  380. package/src/sap/fe/core/templating/UIFormatters.js +5 -2
  381. package/src/sap/fe/core/templating/UIFormatters.ts +3 -0
  382. package/src/sap/fe/core/type/Date.js +1 -1
  383. package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
  384. package/src/sap/fe/core/type/EDM.js +1 -1
  385. package/src/sap/fe/core/type/Email.js +1 -1
  386. package/src/sap/fe/core/type/FiscalDate.js +1 -1
  387. package/src/sap/fe/core/type/InputMask.js +1 -1
  388. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +0 -288
  389. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.tsx +0 -208
  390. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +0 -404
  391. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +0 -502
  392. package/src/sap/fe/core/designtime/TextArrangementChangeAction.js +0 -100
  393. package/src/sap/fe/core/designtime/TextArrangementChangeAction.ts +0 -134
  394. package/src/sap/fe/core/operationsHelper.js +0 -192
  395. package/src/sap/fe/core/operationsHelper.ts +0 -277
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BaseControllerExtension", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/Feedback", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/m/Text", "sap/ui/core/Element", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/Filter", "sap/ui/model/Sorter", "../ActionRuntime", "../controls/Recommendations/ConfirmRecommendationDialog", "../converters/ManifestSettings", "../helpers/TypeGuards", "./routing/NavigationReason"], function (Log, ClassSupport, HookSupport, CommonUtils, BaseControllerExtension, BusyLocker, Feedback, CollaborationCommon, TransactionHelper, draft, UiModelConstants, sticky, MetaModelConverter, EditState, ModelHelper, ResourceModelHelper, SemanticKeyHelper, FELibrary, Button, Dialog, MessageToast, Text, Element, Library, Messaging, Message, MessageType, OverrideExecution, Filter, Sorter, ActionRuntime, $ConfirmRecommendationDialog, ManifestSettings, TypeGuards, NavigationReason) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BaseControllerExtension", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/Feedback", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/m/Text", "sap/ui/core/Element", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/Filter", "sap/ui/model/Sorter", "../ActionRuntime", "../controls/Recommendations/ConfirmRecommendationDialog", "../converters/ManifestSettings", "../helpers/TypeGuards", "./routing/NavigationReason"], function (Log, ClassSupport, CommonUtils, BaseControllerExtension, BusyLocker, Feedback, CollaborationCommon, TransactionHelper, draft, UiModelConstants, sticky, MetaModelConverter, EditState, ModelHelper, ResourceModelHelper, SemanticKeyHelper, FELibrary, Button, Dialog, MessageToast, Text, Element, Library, Messaging, Message, MessageType, OverrideExecution, Filter, Sorter, ActionRuntime, $ConfirmRecommendationDialog, ManifestSettings, TypeGuards, NavigationReason) {
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, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _dec35, _dec36, _dec37, _dec38, _dec39, _dec40, _dec41, _dec42, _dec43, _dec44, _dec45, _dec46, _class, _class2;
@@ -14,11 +14,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
14
14
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
15
15
  var convertTypes = MetaModelConverter.convertTypes;
16
16
  var shareObject = CollaborationCommon.shareObject;
17
+ var CollaborationUtils = CollaborationCommon.CollaborationUtils;
17
18
  var Activity = CollaborationCommon.Activity;
18
19
  var triggerConfiguredSurvey = Feedback.triggerConfiguredSurvey;
19
20
  var TriggerType = Feedback.TriggerType;
20
21
  var StandardActions = Feedback.StandardActions;
21
- var hookable = HookSupport.hookable;
22
22
  var publicExtension = ClassSupport.publicExtension;
23
23
  var methodOverride = ClassSupport.methodOverride;
24
24
  var finalExtension = ClassSupport.finalExtension;
@@ -38,7 +38,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
38
38
  * @public
39
39
  * @since 1.90.0
40
40
  */
41
- let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = extensible(OverrideExecution.After), _dec11 = publicExtension(), _dec12 = extensible("AfterAsync"), _dec13 = publicExtension(), _dec14 = extensible("AfterAsync"), _dec15 = publicExtension(), _dec16 = extensible(OverrideExecution.After), _dec17 = publicExtension(), _dec18 = extensible(OverrideExecution.After), _dec19 = publicExtension(), _dec20 = extensible(OverrideExecution.After), _dec21 = publicExtension(), _dec22 = extensible(OverrideExecution.After), _dec23 = publicExtension(), _dec24 = extensible(OverrideExecution.After), _dec25 = publicExtension(), _dec26 = extensible(OverrideExecution.After), _dec27 = publicExtension(), _dec28 = extensible(OverrideExecution.After), _dec29 = publicExtension(), _dec30 = finalExtension(), _dec31 = publicExtension(), _dec32 = finalExtension(), _dec33 = publicExtension(), _dec34 = finalExtension(), _dec35 = publicExtension(), _dec36 = finalExtension(), _dec37 = publicExtension(), _dec38 = finalExtension(), _dec39 = publicExtension(), _dec40 = extensible(OverrideExecution.After), _dec41 = publicExtension(), _dec42 = extensible(OverrideExecution.Instead), _dec43 = publicExtension(), _dec44 = finalExtension(), _dec45 = hookable("After"), _dec46 = hookable("After"), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseControllerExtens) {
41
+ let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = extensible(OverrideExecution.After), _dec11 = publicExtension(), _dec12 = extensible("AfterAsync"), _dec13 = publicExtension(), _dec14 = extensible("AfterAsync"), _dec15 = publicExtension(), _dec16 = extensible(OverrideExecution.After), _dec17 = publicExtension(), _dec18 = extensible(OverrideExecution.After), _dec19 = publicExtension(), _dec20 = extensible("AfterAsync"), _dec21 = publicExtension(), _dec22 = extensible(OverrideExecution.After), _dec23 = publicExtension(), _dec24 = extensible(OverrideExecution.After), _dec25 = publicExtension(), _dec26 = extensible(OverrideExecution.After), _dec27 = publicExtension(), _dec28 = extensible(OverrideExecution.After), _dec29 = publicExtension(), _dec30 = extensible(OverrideExecution.After), _dec31 = publicExtension(), _dec32 = finalExtension(), _dec33 = publicExtension(), _dec34 = finalExtension(), _dec35 = publicExtension(), _dec36 = finalExtension(), _dec37 = publicExtension(), _dec38 = finalExtension(), _dec39 = publicExtension(), _dec40 = finalExtension(), _dec41 = publicExtension(), _dec42 = extensible(OverrideExecution.After), _dec43 = publicExtension(), _dec44 = extensible(OverrideExecution.Instead), _dec45 = publicExtension(), _dec46 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseControllerExtens) {
42
42
  function EditFlow() {
43
43
  var _this;
44
44
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -225,6 +225,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
225
225
  }
226
226
  let overrideMessageUIDecision = false;
227
227
  if (newDocumentContext) {
228
+ if (programmingModel !== ProgrammingModel.Sticky && ModelHelper.isCollaborationDraftSupported(model.getMetaModel())) {
229
+ // according to UX in case of enabled collaboration draft we share the object immediately
230
+ shareObject(newDocumentContext);
231
+ this.fetchCollaborativeDraftUsersPromise = newDocumentContext.requestSideEffects(["DraftAdministrativeData/DraftAdministrativeUser"], "$auto.Workers");
232
+ }
228
233
  await this.base.editFlow.onAfterEdit({
229
234
  context: contextToNavigate
230
235
  });
@@ -244,9 +249,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
244
249
  stickyContext = newDocumentContext;
245
250
  }
246
251
  await this.handleStickyOn(stickyContext);
247
- } else if (ModelHelper.isCollaborationDraftSupported(model.getMetaModel())) {
248
- // according to UX in case of enabled collaboration draft we share the object immediately
249
- shareObject(newDocumentContext);
250
252
  }
251
253
  overrideMessageUIDecision = true;
252
254
 
@@ -704,7 +706,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
704
706
  // currently not fully supported
705
707
  busyMode: "Local",
706
708
  // busy handling shall be done locally only
707
- busyId: table?.getId(),
709
+ busyId: table?.getParent()?.getTableDefinition()?.annotation.id,
708
710
  parentControl: this.getView(),
709
711
  beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
710
712
  skipParameterDialog: appComponent.getStartupMode() === StartupMode.AutoCreate,
@@ -776,6 +778,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
776
778
  }
777
779
  }
778
780
  });
781
+ } else {
782
+ table = undefined;
779
783
  }
780
784
 
781
785
  // take care on message handling, draft indicator (in case of draft)
@@ -787,7 +791,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
787
791
  // currently not fully supported
788
792
  busyMode: "Local",
789
793
  // busy handling shall be done locally only
790
- busyId: table?.getId(),
794
+ busyId: table?.getParent()?.getTableDefinition()?.annotation.id,
791
795
  parentControl: this.getView(),
792
796
  beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
793
797
  skipParameterDialog: this.getAppComponent().getStartupMode() === StartupMode.AutoCreate,
@@ -872,7 +876,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
872
876
  // currently not fully supported
873
877
  busyMode: "Local",
874
878
  // busy handling shall be done locally only
875
- busyId: table?.getId(),
879
+ busyId: table?.getParent()?.getTableDefinition()?.annotation.id,
876
880
  parentControl: this.getView(),
877
881
  beforeCreateCallBack: this.base.editFlow.onBeforeCreate,
878
882
  afterCreateCallBack: afterCreateInDialog,
@@ -987,7 +991,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
987
991
  // the switch-statement above seems to indicate that this happens in creationModes deferred and async. But in fact, in these cases after the navigation from routeMatched in OP component
988
992
  // createDeferredDocument is triggered, which calls this method (createDocument) again - this time with creationMode sync. Therefore, also in that mode we need to trigger back navigation.
989
993
  // The other cases might still be needed in case the navigation fails.
990
- if ([Constants.CancelActionDialog, Constants.ActionExecutionFailed, Constants.CreationFailed, Constants.OnBeforeCreateFailed].includes(error)) {
994
+ if ([Constants.CancelActionDialog, Constants.ActionExecutionFailed, Constants.CreationFailed, Constants.OnBeforeCreateFailed].includes(error instanceof Error ? error.message : error)) {
991
995
  this.getInternalRouting().navigateBackFromTransientState();
992
996
  }
993
997
  throw error;
@@ -1217,6 +1221,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1217
1221
  return Promise.resolve();
1218
1222
  }
1219
1223
 
1224
+ /**
1225
+ * This function can be used to intercept the action execution. You can execute custom coding in this function.
1226
+ * The framework waits for the returned promise to be resolved before continuing the action.
1227
+ * If you reject the promise, the action is stopped.
1228
+ *
1229
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
1230
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1231
+ * @param _mParameters Object containing the parameters passed to onBeforeExecuteAction
1232
+ * @param _mParameters.contexts An array of contexts that are going to be used for the action execution
1233
+ * @returns A promise to be returned by the overridden method. If resolved, the 'Delete' action is triggered. If rejected, the action is not triggered.
1234
+ */;
1235
+ _proto.onBeforeExecuteAction = async function onBeforeExecuteAction(_mParameters) {
1236
+ // to be overridden
1237
+ return Promise.resolve();
1238
+ }
1239
+
1220
1240
  /**
1221
1241
  * This function can be used to execute code after the 'Save' action.
1222
1242
  * You can execute custom coding in this function.
@@ -1317,6 +1337,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1317
1337
  * @since 1.90.0
1318
1338
  */;
1319
1339
  _proto.saveDocument = async function saveDocument(oContext, mParameters) {
1340
+ // saveDocument is called from inline edit keyboard shortcut
1341
+ if (!this.getGlobalUIModel().getProperty("/isEditable") && this.base.inlineEditFlow?.isInlineEditPossible() && this.getGlobalUIModel().getProperty("/isInlineEditActive")) {
1342
+ this.base.inlineEditFlow.inlineEditSave();
1343
+ return;
1344
+ }
1320
1345
  mParameters = mParameters || {};
1321
1346
  const bExecuteSideEffectsOnError = mParameters.bExecuteSideEffectsOnError || undefined;
1322
1347
  const transactionHelper = this.getTransactionHelper();
@@ -1441,8 +1466,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1441
1466
  siblingInfo = await this._computeSiblingInformation(oContext, oContext, ProgrammingModel.Draft, false);
1442
1467
  }
1443
1468
  if (siblingInfo) {
1444
- this.setEditMode(editable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
1445
-
1446
1469
  if (oRootViewController.isFclEnabled()) {
1447
1470
  const lastSemanticMapping = this._getSemanticMapping();
1448
1471
  if (lastSemanticMapping?.technicalPath === oContext.getPath()) {
@@ -1590,6 +1613,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1590
1613
  });
1591
1614
  return !rootContext.getObject("HasActiveEntity") && !rootContext.getObject("IsActiveEntity");
1592
1615
  }
1616
+
1593
1617
  /**
1594
1618
  * Brings up a message toast when a draft is discarded.
1595
1619
  * @param isNewDocument This is a Boolean flag that determines whether the document is new or already exists.
@@ -1638,7 +1662,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1638
1662
  * @param mInParameters Can contain the following attributes:
1639
1663
  * @param mInParameters.title Title of the object being deleted
1640
1664
  * @param mInParameters.description Description of the object being deleted
1641
- * @param mInParameters.entitySetName PRIVATE
1642
1665
  * @returns Promise resolves once document has been deleted
1643
1666
  * @public
1644
1667
  * @since 1.90.0
@@ -1746,7 +1769,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1746
1769
  await this.getMessageHandler().showMessageDialog({
1747
1770
  unHoldKey: messageHandlingKey
1748
1771
  });
1749
- await this.getInternalRouting().navigateBackFromContext(oContext);
1772
+ await this.getInternalRouting().navigateBackFromContext(oContext, {
1773
+ callExtension: true
1774
+ });
1750
1775
  } finally {
1751
1776
  if (BusyLocker.isLocked(oLockObject)) {
1752
1777
  BusyLocker.unlock(oLockObject);
@@ -1779,6 +1804,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1779
1804
  * @param mInParameters.notApplicableContexts PRIVATE
1780
1805
  * @param mInParameters.enableAutoScroll PRIVATE
1781
1806
  * @param mInParameters.defaultValuesExtensionFunction PRIVATE
1807
+ * @param mInParameters.feFrameworkCall PRIVATE - Indicates whether the action is called internally or by a custom code
1782
1808
  * @param mExtraParams PRIVATE
1783
1809
  * @returns A promise which resolves once the action has been executed. If resolved, the promise returns:
1784
1810
  * - If the parameter contexts is an array: an array of objects, each object containing a key "status", as well as "value" referencing the action status and the context
@@ -1809,9 +1835,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1809
1835
  }
1810
1836
  const mParameters = {
1811
1837
  ...mInParameters,
1812
- parentControl: this.base.getView()
1838
+ view: this.base.getView()
1813
1839
  } || {
1814
- parentControl: this.base.getView()
1840
+ view: this.base.getView()
1815
1841
  };
1816
1842
  mParameters.isNavigable = mParameters.requiresNavigation || mParameters.isNavigable;
1817
1843
 
@@ -1865,11 +1891,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
1865
1891
  oCurrentActionCallBacks = this.createActionPromise(sActionName, oControl.getId());
1866
1892
  }
1867
1893
  }
1868
- // Need to know that the action is called from ObjectPage for changeSet Isolated workaround
1869
- mParameters.bObjectPage = oView.getViewData().converterType === "ObjectPage";
1870
1894
  try {
1871
1895
  await this.syncTask();
1872
- const response = await transactionHelper.callAction(sActionName, mParameters, this.getView(), this.getAppComponent(), this.getMessageHandler());
1896
+ await this.base.editFlow.onBeforeExecuteAction({
1897
+ contexts: mParameters.contexts
1898
+ });
1899
+ const response = await transactionHelper.callAction(sActionName, mParameters, this.getAppComponent(), this.getMessageHandler());
1873
1900
  const successFullExecution = response.filter(isFulfilled);
1874
1901
  if (response.length !== successFullExecution.length) {
1875
1902
  // Keep the same workflow than before
@@ -2059,11 +2086,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
2059
2086
  _proto.handlePatchSent = function handlePatchSent(oEvent) {
2060
2087
  // In collaborative draft or sticky session, disable ETag check for PATCH requests
2061
2088
  const internalContext = this.getView()?.getBindingContext("internal");
2089
+ const uiContext = this.getView()?.getBindingContext("ui");
2062
2090
  const ignoreETag = this.base.collaborativeDraft.isConnected() || internalContext.getProperty("/sessionOn");
2063
2091
  if (ignoreETag) {
2064
2092
  oEvent.getSource().getModel().setIgnoreETag(true);
2065
2093
  }
2066
- if (!internalContext?.getProperty("skipPatchHandlers")) {
2094
+ if (uiContext?.getProperty("isEditable") === false) {
2095
+ // the view is not in edit mode this must be inline edit
2096
+ this.base.inlineEditFlow.handleInlineEditPatchSent(oEvent);
2097
+ } else if (!internalContext?.getProperty("skipPatchHandlers")) {
2067
2098
  const sourceBinding = oEvent.getSource(); // FIXME: UI5 type says this should be an ODataContextBinding
2068
2099
  // Create a promise that will be resolved or rejected when the path is completed
2069
2100
  const oPatchPromise = new Promise((resolve, reject) => {
@@ -2133,8 +2164,26 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
2133
2164
  this.setDraftStatus(DraftStatus.Clear);
2134
2165
  const globalModel = this.getGlobalUIModel();
2135
2166
  globalModel.setProperty("/isEditablePending", true, undefined, true);
2167
+ const model = this.getView().getModel();
2168
+ const isCollaborationDraftSupported = ModelHelper.isCollaborationDraftSupported(model.getMetaModel());
2169
+ let forceDisplayMode = false;
2136
2170
  const isActiveEntity = await context.requestObject("IsActiveEntity");
2137
- if (isActiveEntity === false) {
2171
+ if (isCollaborationDraftSupported && isActiveEntity === false) {
2172
+ await this.fetchCollaborativeDraftUsersPromise;
2173
+ const usersInvited = await context.requestObject("DraftAdministrativeData/DraftAdministrativeUser");
2174
+ const me = CollaborationUtils.getMe(this.getAppComponent()),
2175
+ hasMe = usersInvited?.filter(singleUser => singleUser.UserID === me.id) ?? [];
2176
+ if (hasMe.length > 0) {
2177
+ globalModel.setProperty("/hasCollaborationAuthorization", true);
2178
+ } else {
2179
+ forceDisplayMode = true;
2180
+ globalModel.setProperty("/hasCollaborationAuthorization", false);
2181
+ }
2182
+ } else {
2183
+ globalModel.setProperty("/hasCollaborationAuthorization", undefined);
2184
+ }
2185
+ this.fetchCollaborativeDraftUsersPromise = undefined;
2186
+ if (isActiveEntity === false && !forceDisplayMode) {
2138
2187
  // in case the document is draft set it in edit mode
2139
2188
  this.setEditMode(EditMode.Editable);
2140
2189
  const hasActiveEntity = await context.requestObject("HasActiveEntity");
@@ -2179,7 +2228,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
2179
2228
  * @param parameters.noDialog
2180
2229
  * @param parameters.title
2181
2230
  * @param parameters.description
2182
- * @param parameters.entitySetName
2183
2231
  * @param parameters.numberOfSelectedContexts
2184
2232
  * @param parameters.unSavedContexts
2185
2233
  * @param parameters.lockedContexts
@@ -2682,7 +2730,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
2682
2730
  * So we check the first inactive row first, then we set the focus on it when we press the button.
2683
2731
  * This doesn't impact the GridTable because they appear at the end, and we already focus the before-the-last row (because 2 empty rows exist)
2684
2732
  */
2685
- const allRowContexts = rowBinding.getContexts();
2733
+ const allRowContexts = rowBinding.getAllCurrentContexts();
2686
2734
  if (!allRowContexts?.length) {
2687
2735
  table.focusRow(activeRowIndex, true);
2688
2736
  return;
@@ -2998,73 +3046,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
2998
3046
  return recommendationOptionChoosen;
2999
3047
  }
3000
3048
 
3001
- /**
3002
- * Method to know if there can be inline edit on the page.
3003
- * @returns True if inline edit is possible
3004
- */;
3005
- _proto.isInlineEditPossible = function isInlineEditPossible() {
3006
- return this.base.getAppComponent().getInlineEditService().doesPageHaveInlineEdit(this.base.getRoutingTargetName());
3007
- }
3008
-
3009
- /**
3010
- * Save the inline edit changes.
3011
- * @returns A promise that resolved once the batch has returned.
3012
- */;
3013
- _proto.inlineEditSave = async function inlineEditSave() {
3014
- try {
3015
- await this.base.getView().getModel().submitBatch(CommonUtils.INLINEEDIT_UPDATEGROUPID);
3016
- this.inlineEditEnd();
3017
- } catch (error) {
3018
- Log.warning("Error while saving inline edit changes");
3019
- }
3020
- }
3021
-
3022
- /**
3023
- * Discard the inline edit changes.
3024
- */;
3025
- _proto.inlineEditDiscard = function inlineEditDiscard() {
3026
- this.base.getView().getModel().resetChanges(CommonUtils.INLINEEDIT_UPDATEGROUPID);
3027
- this.inlineEditEnd();
3028
- }
3029
-
3030
- /**
3031
- * End the inline edit.
3032
- */;
3033
- _proto.inlineEditEnd = function inlineEditEnd() {
3034
- // inline edit controls will have code that react to this hook
3035
- }
3036
-
3037
- /**
3038
- * Start the inline edit on the bindingContextPath for the propertyFullyQualifiedName.
3039
- * @param propertyFullyQualifiedName
3040
- * @param bindingContextPath
3041
- */;
3042
- _proto.startInlineEdit = function startInlineEdit(propertyFullyQualifiedName, bindingContextPath) {
3043
- const inlineEditService = this.base.getAppComponent().getInlineEditService();
3044
- const dependentProperties = inlineEditService.getInlineConnectedProperties(this.base.getRoutingTargetName(), propertyFullyQualifiedName);
3045
- this.inlineEditStart(dependentProperties?.length ? dependentProperties : [propertyFullyQualifiedName], bindingContextPath);
3046
- }
3047
-
3048
- /**
3049
- * Confirm the start of the inline edit on the binding ContextPath for the properties.
3050
- * @param properties
3051
- * @param bindingContextPath
3052
- */;
3053
- _proto.
3054
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
3055
- inlineEditStart = function inlineEditStart(properties, bindingContextPath) {
3056
- // inline edit controls will have code that react to this hook
3057
- }
3058
-
3059
- /**
3060
- * Convenience method to determine if a property should be considered for inline edit.
3061
- * @param propertyFullyQualifiedName
3062
- * @returns True when the property is considered for Inline edit.
3063
- */;
3064
- _proto.isPropertyConsideredForInlineEdit = function isPropertyConsideredForInlineEdit(propertyFullyQualifiedName) {
3065
- return this.base.getAppComponent().getInlineEditService().isPropertyConsideredForInlineEdit(this.base.getRoutingTargetName(), propertyFullyQualifiedName);
3066
- }
3067
-
3068
3049
  /**
3069
3050
  * Create Next Document.
3070
3051
  * @returns A promise that resolved once create next happens.
@@ -3077,7 +3058,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/base/HookSupp
3077
3058
  });
3078
3059
  };
3079
3060
  return EditFlow;
3080
- }(BaseControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "customMassEditSave", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "customMassEditSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "inlineEditEnd", [_dec45], Object.getOwnPropertyDescriptor(_class2.prototype, "inlineEditEnd"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "inlineEditStart", [_dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "inlineEditStart"), _class2.prototype), _class2)) || _class);
3061
+ }(BaseControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeExecuteAction", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeExecuteAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "customMassEditSave", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "customMassEditSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _class2)) || _class);
3081
3062
  return EditFlow;
3082
3063
  }, false);
3083
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiSW5zdGVhZCIsIl9kZWM0MyIsIl9kZWM0NCIsIl9kZWM0NSIsImhvb2thYmxlIiwiX2RlYzQ2IiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9CYXNlQ29udHJvbGxlckV4dGVucyIsIl90aGlzIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwic3luY1Rhc2tzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYW5kbGVTaWRlRWZmZWN0cyIsImxpc3RCaW5kaW5nIiwiY3JlYXRpb25Qcm9taXNlIiwidmlld0JpbmRpbmdDb250ZXh0IiwiZ2V0VmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwibmV3Q29udGV4dCIsImNyZWF0ZWQiLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJnZXRQYXRoIiwiZXJyb3IiLCJMb2ciLCJjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMiLCJ2YWxpZGF0aW9uTWVzc2FnZXMiLCJ0YWJsZSIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImdldENyZWF0aW9uUm93IiwiZGF0YSIsImN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJjdXN0b21NZXNzYWdlcyIsImZpZWxkQ29udHJvbCIsImZpbmFsVGFyZ2V0Iiwib2xkTWVzc2FnZXMiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZmlsdGVyIiwibWVzc2FnZSIsImdldENvZGUiLCJyZW1vdmVNZXNzYWdlcyIsImZvckVhY2giLCJ2YWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJmaWVsZElkIiwiZ2V0QmluZGluZ1BhdGgiLCJnZXRUYXJnZXRzIiwic29tZSIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwiZ2V0TW9kZWwiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJFcnJvciIsImNvZGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJyZXNvbHZlQ3JlYXRpb25Nb2RlIiwiaW5pdGlhbENyZWF0aW9uTW9kZSIsImNyZWF0ZURhdGEiLCJDcmVhdGlvbk1vZGUiLCJOZXdQYWdlIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJpc1JlbGF0aXZlIiwiZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJEcmFmdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsInRhcmdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwicGFyYW1ldGVycyIsIkRlZmVycmVkIiwiY3JlYXRpb25QYXJhbWV0ZXJzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJBc3luYyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwib25Jbml0IiwiX2hpZGRlbkRyYWZ0IiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJIaWRkZW5EcmFmdCIsImdldEludGVyZmFjZSIsImJhc2UiLCJlZGl0RG9jdW1lbnQiLCJjb250ZXh0IiwidHJhbnNhY3Rpb25IZWxwZXIiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJ2aWV3RGF0YSIsImdldFZpZXdEYXRhIiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGluZ0tleSIsInJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMiLCJyb290Q29udGV4dCIsImdldFJvb3RDb250ZXh0IiwiZWRpdEZsb3ciLCJvbkJlZm9yZUVkaXQiLCJyaWdodG1vc3RDb250ZXh0IiwiX2lzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJ1bmRlZmluZWQiLCJuZXdEb2N1bWVudENvbnRleHRQcm9taXNlIiwicm9vdENvbnRleHRJbmZvIiwicm9vdFNpYmxpbmdQYXRoUHJvbWlzZSIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwic2libGluZ0luZm9Qcm9taXNlIiwiY29tcHV0ZVNpYmxpbmdJbmZvIiwidmlld0xldmVsIiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzdWJtaXRCYXRjaCIsInNpYmxpbmdJbmZvIiwibmV3RG9jdW1lbnRDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQiLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uIiwib25BZnRlckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsImVkaXRhYmxlIiwicmVjcmVhdGVDb250ZXh0IiwiZm9yY2VGb2N1cyIsIlN0aWNreSIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiaGFuZGxlU3RpY2t5T24iLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwic2hhcmVPYmplY3QiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsInVuSG9sZEtleSIsIm92ZXJyaWRlVUlEZWNpc2lvbiIsInJlamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJpc0luYWN0aXZlIiwiZ2V0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiQnVzeUxvY2tlciIsImxvY2siLCJzZWxlY3RlZENvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwicmVmcmVzaExpc3RCaW5kaW5nIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsInRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJyZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyIsInNldFVwRW1wdHlSb3dzIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiRGVsZXRlIiwidW5sb2NrIiwidXBkYXRlRG9jdW1lbnQiLCJ1cGRhdGVkQ29udGV4dCIsInVwZGF0ZVByb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiaXNEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInN5bmNUYXNrIiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24iLCJjcmVhdGVEb2N1bWVudCIsInNvdXJjZSIsIm1JblBhcmFtZXRlcnMiLCJvRGF0YUxpc3RCaW5kaW5nIiwiZm5MaXN0QmluZGluZyIsImluc3RhbmNlIiwibGlzdEJpbmRpbmdQYXRoIiwiZGF0YU1vZGVsIiwiYmluZExpc3QiLCJFeHRlcm5hbCIsImxpc3RCaW5kaW5nRnJvbVBhdGgiLCJjcmVhdGVBdEVuZCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzaW5nbGVEcmFmdEZvckNyZWF0ZSIsImdldE1hbmlmZXN0IiwiYXBwIiwiZ2V0Um9vdEJpbmRpbmciLCJnZXRIZWFkZXJDb250ZXh0IiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwidkxpc3RCaW5kaW5nIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50IiwidGFibGVJZCIsIkNyZWF0aW9uRGlhbG9nIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJjcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQiLCJTeW5jIiwiY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQiLCJiRnJvbURlZmVycmVkIiwiY3JlYXRlQWN0aW9uIiwicG9zdERvY3VtZW50Q3JlYXRpb24iLCJwcmVyZXF1aXNpdGUiLCJwYXJhbXMiLCJvbkFmdGVyQ3JlYXRlIiwibWV0YUNvbnRleHQiLCJzdGFydGluZ0VudGl0eVNldCIsImdldEludGVybmFsTW9kZWwiLCJzZXRQcm9wZXJ0eSIsImlzTGlzdEJpbmRpbmdBbmFseXRpY2FsIiwiZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJDcmVhdGUiLCJpc0RyYWZ0Um9vdCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiY3JlYXRpb24iLCJhcHBDb21wb25lbnQiLCJuYXZpZ2F0aW9uIiwiY3JlYXRpb25Sb3dDb250ZXh0IiwiZG9jdW1lbnRWYWxpZGF0aW9uIiwiZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24iLCJlbnRpdHlUeXBlIiwiY3JlYXRpb25Sb3dQYXlsb2FkIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImF0dGFjaEV2ZW50T25jZSIsInNjcm9sbFRvSW5kZXgiLCJnZXRMZW5ndGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJPYmplY3QiLCJhc3NpZ24iLCJrZXlzIiwicHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJmaW5kSW5kZXgiLCJwcm9wZXJ0eSIsIm5hbWUiLCJtYXAiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRJZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiX2dldFJlc291cmNlTW9kZWwiLCJjcmVhdGlvblJvd0xpc3RCaW5kaW5nIiwibmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImFsbCIsImlzTG9ja2VkIiwiY29udGV4dEluZGV4IiwiZ2V0SW5kZXgiLCJhZ2dyZWdhdGlvbkRhdGEiLCJnZXRBZ2dyZWdhdGlvbiIsImlzQ3JlYXRlSW5QbGFjZSIsImNyZWF0ZUluUGxhY2UiLCJmb2N1c1JvdyIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJnZXRUZXh0IiwicGFyZW50SW5kZXgiLCJzYXZlZERvY3VtZW50Q29udGV4dCIsImFmdGVyQ3JlYXRlSW5EaWFsb2ciLCJvbkJlZm9yZVNhdmUiLCJzYXZlRG9jdW1lbnQiLCJvbkFmdGVyU2F2ZSIsInJlZnJlc2giLCJpdGVtSW5kZXgiLCJhZnRlckNyZWF0ZUNhbGxCYWNrIiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMiLCJtb2RlIiwicm91dGluZ0xpc3RlbmVyIiwiY3JlYXRlQ29udGV4dFByb21pc2UiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibmF2UGFyYW1ldGVycyIsInRyYW5zaWVudCIsIm5hdmlnYXRlVG9Db250ZXh0IiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ3JlYXRpb25GYWlsZWQiLCJPbkJlZm9yZUNyZWF0ZUZhaWxlZCIsImluY2x1ZGVzIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJjcmVhdGVQYXRoIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInZhbGlkYXRlRG9jdW1lbnQiLCJjcmVhdGlvblJvd09iamVjdHMiLCJjcmVhdGVNdWx0aXBsZURvY3VtZW50cyIsImRhdGFGb3JDcmVhdGUiLCJpc0Zyb21Db3B5UGFzdGUiLCJjcmVhdGVBc0luYWN0aXZlIiwidGFyZ2V0TGlzdEJpbmRpbmciLCJtZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwiJGtpbmQiLCJjcmVhdGVkQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsImVyciIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsIm9uQWZ0ZXJEaXNjYXJkIiwib0NvbnRleHQiLCJtUGFyYW1ldGVycyIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJtZXJnZVBhdGNoRHJhZnQiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4iLCJjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uIiwic1Byb2dyYW1taW5nTW9kZWwiLCJpc0ZjbEVuYWJsZWQiLCJfc2lkZUVmZmVjdHMiLCJoYW5kbGVQYWdlQ2hhbmdlQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiZ2V0Q3JlYXRpb25Nb2RlIiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsImRpc2Nvbm5lY3QiLCJfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJTdGFuZGFyZEFjdGlvbnMiLCJzYXZlIiwiVHJpZ2dlclR5cGUiLCJzdGFuZGFyZEFjdGlvbiIsIkRpc3BsYXkiLCJzdG9yZURhdGFGb3JUZWxlbWV0cnkiLCJfY3JlYXRlU2libGluZ0luZm8iLCJwcmV2aW91c1NlbWFudGljUGF0aCIsIm5ld1NlbWFudGljUGF0aCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJzdGF5T25DdXJyZW50UGFnZUFmdGVyU2F2ZSIsInRhcmdldENvbnRleHQiLCJza2lwQmluZGluZ1RvVmlldyIsIm9FcnJvciIsImNhbmNlbGVkIiwidG9nZ2xlRHJhZnRBY3RpdmUiLCJvQ29udGV4dERhdGEiLCJiSXNEcmFmdCIsIklzQWN0aXZlRW50aXR5IiwiSGFzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJjYW5jZWxQYXJhbWV0ZXJzIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiY2FuY2VsQnV0dG9uIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInZpZXciLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJzdGF5T25DdXJyZW50UGFnZUFmdGVyQ2FuY2VsIiwiX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMiLCJzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSIsImJpbmRpbmdQYXJhbWV0ZXJzIiwiY3JlYXRlUm9vdENvbnRleHQiLCJpc1Jvb3RDb250ZXh0TmV3IiwiJHNlbGVjdCIsInJlc291cmNlTW9kZWwiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaEFmdGVyUm91dGVNYXRjaGVkIiwic2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0IiwiY2xvc2VPbkJyb3dzZXJOYXZpZ2F0aW9uIiwiZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJkZWxldGVEb2N1bWVudCIsIm9BcHBDb21wb25lbnQiLCJzaWJsaW5nQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRQYXRoIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJkcmFmdENvbnRleHRUb1JlbW92ZSIsInJlcGxhY2VXaXRoIiwiY29udGV4dEJpbmRpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsIm9Mb2NrT2JqZWN0IiwiaXNDb250aW51ZSIsInNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsImlzQXJyYXkiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZW50aXR5Q29udGFpbmVyIiwiaXNCb3VuZCIsIm9Db250cm9sIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpZ25vcmVFVGFnIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJiT2JqZWN0UGFnZSIsImNvbnZlcnRlclR5cGUiLCJyZXNwb25zZSIsImNhbGxBY3Rpb24iLCJzdWNjZXNzRnVsbEV4ZWN1dGlvbiIsImlzRnVsZmlsbGVkIiwibGlzdFJlZnJlc2hlZCIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiQWN0aW9uIiwidmFsdWUiLCJib3VuZENvbnRleHQiLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJfZ2V0Qm91bmRDb250ZXh0IiwicmV0dXJuZWRDb250ZXh0Iiwib01ldGFNb2RlbCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJvUmVzdWx0IiwiZlJlamVjdG9yIiwiX2FjdGlvbk5hbWUiLCJjdXN0b21NYXNzRWRpdFNhdmUiLCJzZWN1cmVkRXhlY3V0aW9uIiwiZm5GdW5jdGlvbiIsImJCdXN5U2V0IiwiYnVzeSIsInNldCIsImJCdXN5Q2hlY2siLCJjaGVjayIsImJVcGRhdGVzRG9jdW1lbnQiLCJ1cGRhdGVzRG9jdW1lbnQiLCJmaW5hbGx5IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50IiwiaW50ZXJuYWxDb250ZXh0IiwiZ2V0U291cmNlIiwic2V0SWdub3JlRVRhZyIsInNvdXJjZUJpbmRpbmciLCJvUGF0Y2hQcm9taXNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlU2VudCIsImV2ZW50IiwibmV3VGFzayIsImRlYnVnIiwiY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlIiwiZ2xvYmFsTW9kZWwiLCJpc0FjdGl2ZUVudGl0eSIsInJlcXVlc3RPYmplY3QiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsInNvdXJjZUNvbnRyb2wiLCJnZXRSZXNvdXJjZU1vZGVsIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJtZXNzYWdlSGFuZGxlciIsImdldFBhZ2VJbnRlcm5hbE1vZGVsIiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInBhZ2VJbnRlcm5hbENvbnRleHQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiQ3JlYXRlTW9kZSIsIkRvY3VtZW50TW9kaWZpZWQiLCJtb2RpZmllZCIsImJpbmRpbmciLCJhdHRhY2hFdmVudCIsInN1Y2Nlc3MiLCJkcmFmdFN0YXR1cyIsImVkaXRNb2RlIiwiaXNDcmVhdGlvbiIsImZvcmNlZCIsInNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiYmluZCIsImkxOG5Nb2RlbCIsInJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyIsImdldERpcnR5U3RhdGVQcm92aWRlciIsImdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJ1bnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyIsImdldEh0dHBIZWFkZXJzIiwibmF2aWdhdGlvbkNvbnRleHQiLCJ0YXJnZXRIYXNoIiwiaW5uZXJBcHBSb3V0ZSIsInJvdXRlclByb3h5IiwibGNsSGFzaFRyYWNrZXIiLCJpc0RpcnR5IiwiaXNTZXNzaW9uT24iLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyIiwic2V0RGlydHlGbGFnIiwid2FybmluZ0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJjdXJyZW50SGFzaCIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiY2xlYXJTZXNzaW9uQ29udGV4dCIsImRpc2NhcmRlZENvbnRleHQiLCJzdGlja3kiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZXNldENoYW5nZXMiLCJfcm91dGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJyZXNvbHZlRnVuY3Rpb24iLCJyZWplY3RGdW5jdGlvbiIsImFjdGlvblByb21pc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJtZXRhTW9kZWxBY3Rpb24iLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJpc1NhdmUiLCJjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInJlbGF0ZWRDb250ZXh0cyIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwic2VuZCIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJvTW9kZWwiLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiaGlzdG9yeSIsImJhY2siLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBlcnNpc3RPUFNjcm9sbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJFZGl0Rmxvd0FjdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInZpc2libGVWaWV3SWRzIiwiX2dldEFsbFZpc2libGVWaWV3cyIsImFNZXNzYWdlcyIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJvUmVzcG9uc2UiLCJvQmluZGluZyIsImFLZXlzIiwib0N1cnJlbnREYXRhIiwiYlJldHVybmVkQ29udGV4dElzU2FtZSIsImV2ZXJ5Iiwic0tleSIsInNFbnRpdHlTZXROYW1lIiwiYVNlbWFudGljS2V5cyIsInBhdGhzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyZXF1ZXN0UHJvcGVydHkiLCJvdmVybG9hZEVudGl0eVR5cGUiLCJjb250ZXh0U2VnbWVudHMiLCJjdXJyZW50Q29udGV4dCIsInBvcCIsInVuc2hpZnQiLCJwYXJlbnRDb250ZXh0cyIsInBhdGhTZWdtZW50IiwicmV2ZXJzZSIsIm92ZXJsb2FkQ29udGV4dCIsImZpbmQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwicmlnaHRNb3N0Q29udGV4dFRvVXNlIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJnZXRJbmxpbmVFZGl0U2VydmljZSIsImRvZXNQYWdlSGF2ZUlubGluZUVkaXQiLCJnZXRSb3V0aW5nVGFyZ2V0TmFtZSIsImlubGluZUVkaXRTYXZlIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwiaW5saW5lRWRpdEVuZCIsIndhcm5pbmciLCJpbmxpbmVFZGl0RGlzY2FyZCIsInN0YXJ0SW5saW5lRWRpdCIsInByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lIiwiYmluZGluZ0NvbnRleHRQYXRoIiwiaW5saW5lRWRpdFNlcnZpY2UiLCJkZXBlbmRlbnRQcm9wZXJ0aWVzIiwiZ2V0SW5saW5lQ29ubmVjdGVkUHJvcGVydGllcyIsImlubGluZUVkaXRTdGFydCIsInByb3BlcnRpZXMiLCJpc1Byb3BlcnR5Q29uc2lkZXJlZEZvcklubGluZUVkaXQiLCJjcmVhdGVOZXh0RG9jdW1lbnQiLCJsYXN0SW5kZXhPZiIsIkJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgSVJvd0JpbmRpbmdJbnRlcmZhY2UgZnJvbSBcInNhcC9mZS9jb3JlL0lSb3dCaW5kaW5nSW50ZXJmYWNlXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21NZXNzYWdlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSwgc2hhcmVPYmplY3QgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IENhbmNlbFBhcmFtZXRlcnMsIENyZWF0ZVBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCBUcmFuc2FjdGlvbkhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzLCBSb290Q29udGV4dEluZm8sIFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnRTaWJsaW5nUGFpciB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgUm9vdFZpZXdCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvUm9vdFZpZXdCYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMsIFNlbWFudGljTWFwcGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIE1hY3JvVGFibGUgZnJvbSBcInNhcC9mZS9tYWNyb3MvVGFibGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENyZWF0aW9uUm93IGZyb20gXCJzYXAvdWkvbWRjL3RhYmxlL0NyZWF0aW9uUm93XCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxFbnRpdHlUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcIi4uL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB7IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZywgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUsIHR5cGUgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBpc0Z1bGZpbGxlZCB9IGZyb20gXCIuLi9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vZWRpdEZsb3cvT0RhdGFPcGVyYXRpb25cIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCIuL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0U3RhcnR1cE1vZGUgPSBGRUxpYnJhcnkuU3RhcnR1cE1vZGU7XG5cbnR5cGUgU2F2ZURvY3VtZW50UGFyYW1ldGVycyA9IHtcblx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I/OiBib29sZWFuO1xuXHRtZXJnZVBhdGNoRHJhZnQ/OiBib29sZWFuO1xuXHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdGJpbmRpbmdzPzogT0RhdGFMaXN0QmluZGluZ1tdO1xufTtcblxudHlwZSBJbnRlcm5hbENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRidXN5TW9kZT86IHN0cmluZztcblx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0ZGF0YT86IG9iamVjdDtcblx0dGFibGVJZD86IHN0cmluZztcblx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiBvZmZlcmluZyBob29rcyBpbnRvIHRoZSBlZGl0IGZsb3cgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nO1xuXG5cdHByaXZhdGUgX2hpZGRlbkRyYWZ0OiBIaWRkZW5EcmFmdCB8IHVuZGVmaW5lZDtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5faGlkZGVuRHJhZnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQ7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQdWJsaWMgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdGdldEludGVyZmFjZSgpOiBCYXNlT2JqZWN0IHtcblx0XHRyZXR1cm4gc3VwZXIuZ2V0SW50ZXJmYWNlKCk7XG5cdH1cblxuXHRnZXRBcHBDb21wb25lbnQoKTogQXBwQ29tcG9uZW50IHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgdGhlIGV4aXN0aW5nIGFjdGl2ZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZWRpdGFibGUgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIHdpdGggdGhlIGVkaXRhYmxlIGNvbnRleHRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZWRpdERvY3VtZW50KGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGNvbnN0IGdyb3VwSWQgPSBcImVkaXRHcm91cFwiO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRSb290Q29udGV4dChjb250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiByb290Q29udGV4dCB9KTtcblxuXHRcdFx0bGV0IHJpZ2h0bW9zdENvbnRleHQgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKSA/IChyb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogY29udGV4dDtcblx0XHRcdGlmIChcblx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChyaWdodG1vc3RDb250ZXh0KSAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyB3ZSBjaGVjayB0aGUgcmlnaHRtb3N0Q29udGV4dCBjYW4gYmUgdXNlZCBpbiBkcmFmdFxuXHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2UgPSB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGdyb3VwSWRcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dEluZm8gPSB7XG5cdFx0XHRcdHJvb3RTaWJsaW5nUGF0aFByb21pc2U6IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2Vcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdC8vIHJpZ2h0bW9zdENvbnRleHQgPT09IHJvb3RDb250ZXh0ID0+IHdlJ3JlIGluIE9QLiBJZiBub3QsIHdlJ3JlIGluIG11bHRpLWNvbHVtbiBsYXlvdXQgb2YgRkNMXG5cdFx0XHRjb25zdCBjb21wdXRlU2libGluZ0luZm8gPSByaWdodG1vc3RDb250ZXh0ICE9PSByb290Q29udGV4dCB8fCAodmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMTtcblx0XHRcdGlmIChjb21wdXRlU2libGluZ0luZm8pIHtcblx0XHRcdFx0c2libGluZ0luZm9Qcm9taXNlID0gdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0Z3JvdXBJZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCBzaWJsaW5nSW5mb1Byb21pc2U7XG5cdFx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHQgPSAoYXdhaXQgbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSkgYXMgQ29udGV4dDtcblx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZCA9IG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdGlmIChjb21wdXRlU2libGluZ0luZm8gJiYgY29udGV4dFRvTmF2aWdhdGUpIHtcblx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRcdFwiJGF1dG9cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSB0aGlzLl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQsIHNpYmxpbmdJbmZvKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24gPSBmYWxzZTtcblx0XHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJFZGl0KHsgY29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUgYXMgQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHJlY3JlYXRlQ29udGV4dDogZmFsc2UsXG5cdFx0XHRcdFx0Zm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0bGV0IHN0aWNreUNvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG5ld0RvY3VtZW50Q29udGV4dD8uZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KG5ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0c2hhcmVPYmplY3QobmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uID0gdHJ1ZTtcblxuXHRcdFx0XHQvLyBXZSBjaGFuZ2UgdGhlIGVkaXQgbW9kZSBhZnRlciB0aGUgcGFnZSBiaW5kaW5nIGhhcyBiZWVuIGRvbmUsIG90aGVyd2lzZSB0aGUgY3JlYXRpb24gb2YgZW1wdHkgcm93cyBtaWdodCBmYWlsIChhcyB0aGUgdGFibGUgaXMgc3RpbGwgb24gdGhlIGFjdGl2ZSB2ZXJzaW9uKVxuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSwgb3ZlcnJpZGVVSURlY2lzaW9uOiBvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uIH0pO1xuXHRcdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgc2lkZSBlZmZlY3RzIHJlcXVpcmVkIGFmdGVyIGRlbGV0aW5nIGFuIG9iamVjdC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdGhlIGRlbGV0ZWQgb2JqZWN0IGJlbG9uZ3MgdG9cblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgcGFyZW50IG9iamVjdCBvZiB0aGUgZGVsZXRlZCBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgcmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCB1bmRlZmluZWQsIHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRpZiAoIWxpc3RCaW5kaW5nIHx8ICFwYXJlbnRDb250ZXh0IHx8IENvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNpZGVFZmZlY3RTZXJ2aWNlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBwYXJlbnRDb250ZXh0KTtcblxuXHRcdGNvbnN0IHN0YXRlTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHQvLyBJbiBjYXNlIG9mIGEgVHJlZVRhYmxlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggc3RhdGUgbWVzc2FnZXMgZm9yIHRoZSBPYmplY3RQYWdlLCBhcyBzb21lIG9mIHRoZXNlIG1lc3NhZ2VzIG1pZ2h0IGJlIGF0dGFjaGVkXG5cdFx0Ly8gdG8gY2hpbGRyZW4gb2YgYSBkZWxldGVkIHJvdyB3aGljaCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQgeWV0LCBhbmQgdGhlcmVmb3JlIHRoZSBtb2RlbCB3b3VsZG4ndCBjbGVhbiB1cCB0aGVzZSBtZXNzYWdlc1xuXHRcdGlmIChzdGF0ZU1lc3NhZ2VzUGF0aCAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbc3RhdGVNZXNzYWdlc1BhdGhdLCBwYXJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGNvbnRleHRzVG9EZWxldGUgVGhlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRjb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ6IHN0cmluZztcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblxuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBwYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkgPz8gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0bGV0IGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdID0gW107XG5cdFx0aWYgKHBhcmVudENvbnRyb2w/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUgPSBjb250ZXh0c1RvRGVsZXRlLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdH1cblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2wgYXMgQ29udHJvbDtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSAocGFyZW50Q29udHJvbC5nZXRCaW5kaW5nKFwiaXRlbXNcIikgfHwgKHBhcmVudENvbnRyb2wgYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHBhcmFtZXRlcnM/LnNlbGVjdGVkQ29udGV4dHM/LlswXSA/PyBjb250ZXh0c1RvRGVsZXRlWzBdKSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRsZXQgcmVzdWx0O1xuXG5cdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0cGFyZW50Q29udHJvbC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0cmVzdWx0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmcsIHZpZXdCaW5kaW5nQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSB9KTtcblxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBwYXJlbnRDb250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlLmxlbmd0aCA+IDBcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMoaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyhwYXJlbnRDb250cm9sLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgY29udGV4dHNUb0RlbGV0ZSk7XG5cblx0XHRcdHJldHVybiBhd2FpdCByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFdlIHN0aWxsIHdhbnQgdG8gcmVmcmVzaCB0aGUgbGlzdGJpbmRpbmcgaW4gY2FzZSB3ZSBkZWxldGVkIHNvbWUgaW5mb3JtYXRpb24gYnV0IG5vdCBldmVyeXRoaW5nIChEcmFmdHMgZm9yIGV4YW1wbGUpXG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZywgdmlld0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKiBAcGFyYW0gdXBkYXRlZENvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gdXBkYXRlUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IEJpbmRpbmcgfCBDb250ZXh0LCB1cGRhdGVQcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNlbWFudGljS2V5cz8ubGVuZ3RoICYmXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmIC8vIFdlIGRvbid0IHVzZSB0aGUgc2VtYW50aWMga2V5IGZvciBhIG5ldyBkb2N1bWVudCAoY3JlYXRpb24pXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNQYXRoID0gY3VycmVudFNlbWFudGljTWFwcGluZz8uc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gY3VycmVudFNlbWFudGljUGF0aCBjb3VsZCBiZSBudWxsIGlmIHdlIGhhdmUgbmF2aWdhdGVkIHZpYSBkZWVwIGxpbmsgdGhlbiB0aGVyZSBhcmUgbm8gc2VtYW50aWNNYXBwaW5ncyB0byBjYWxjdWxhdGUgaXQgZnJvbVxuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VtYW50aWNQYXRoICYmIGN1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQsIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0aWYgKGlzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQpOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNlbGVjdGVkQ29udGV4dHMgJiYgc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBPbmUgcGFyZW50IGF0IG1vc3QgISFcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhIG5ldyBkb2N1bWVudCBpbiBhIFRyZWVUYWJsZSB3aXRoICR7c2VsZWN0ZWRDb250ZXh0cy5sZW5ndGh9IHBhcmVudHNgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb250ZXh0cz8ubGVuZ3RoID09PSAxID8gc2VsZWN0ZWRDb250ZXh0c1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gc291cmNlICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIG9yIGEgdGFibGUgYnVpbGRpbmcgYmxvY2sgZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzo8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJywgb3IgJ0RlZmVycmVkJyBpcyB1c2VkPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIHdpdGhpbiB0aGUgdGFibGUuIE5vdCBzdXBwb3J0ZWQgb24gYSBMaXN0IFJlcG9ydDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCc8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EaWFsb2cgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBpbiB0aGUgdGFibGUsIHdpdGggYSBkaWFsb2cgYWxsb3dpbmcgdG8gc3BlY2lmeSBzb21lIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzICh0aGUgcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIGBjcmVhdGlvbkRpYWxvZ0ZpZWxkc2ApXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRhYmxlSWQgSUQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5idXN5TW9kZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgVGhlIGNvbnRleHRzIHRoYXQgYXJlIHNlbGVjdGVkIGluIHRoZSB0YWJsZSBpbml0aWF0aW5nIHRoZSBjcmVhdGlvbi4gVXNlZCBpbiBjYXNlIG9mIGEgVHJlZVRhYmxlIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGNvbnRleHQgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgV2hlbiBlbmFibGVkLCBhbiBleHRyYSByZXF1ZXN0IGNoZWNrcyBpZiBhbnkgZHJhZnRzIGV4aXN0IHRoYXQgd2VyZSBuZXZlciBzYXZlZC4gSWYgdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCB0aGUgbmV3ZXN0IG9uZSBpcyBvcGVuZWQuIElmIG5vIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgRGVmaW5lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGUgY3JlYXRpb24gZGlhbG9nIHdoZW4gdGhlIGNyZWF0aW9uIG1vZGUgaXMgc2V0IHRvICdDcmVhdGlvbkRpYWxvZycuPGJyLz5UaGUgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHNvdXJjZTogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyB8IE1hY3JvVGFibGUsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0c2luZ2xlRHJhZnRGb3JDcmVhdGU/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvRGF0YUxpc3RCaW5kaW5nITogT0RhdGFMaXN0QmluZGluZztcblx0XHRsZXQgcGFyZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBmbkxpc3RCaW5kaW5nID0gZnVuY3Rpb24gKGluc3RhbmNlOiBFZGl0RmxvdywgbGlzdEJpbmRpbmdQYXRoOiBzdHJpbmcpOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IGRhdGFNb2RlbCA9IGluc3RhbmNlLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0aWYgKCFkYXRhTW9kZWwpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkYXRhTW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmdQYXRoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdH07XG5cblx0XHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIiAmJiBzb3VyY2UuaXNBICYmIHNvdXJjZS5pc0E8SVJvd0JpbmRpbmdJbnRlcmZhY2U+KFwic2FwLmZlLmNvcmUuSVJvd0JpbmRpbmdJbnRlcmZhY2VcIikpIHtcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBzb3VyY2UuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0c291cmNlID0gb0RhdGFMaXN0QmluZGluZztcblx0XHR9XG5cblx0XHRpZiAobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmdGcm9tUGF0aCA9IGZuTGlzdEJpbmRpbmcodGhpcywgc291cmNlKTtcblx0XHRcdFx0aWYgKCFsaXN0QmluZGluZ0Zyb21QYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZ0Zyb21QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRlbGV0ZSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZS5pc0EgJiYgc291cmNlLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPSBzb3VyY2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIG9iamVjdCBvciBwYXRoIGV4cGVjdGVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwob0RhdGFMaXN0QmluZGluZykpIHtcblx0XHRcdFx0cGFyZW50Q29udGV4dCA9IHRoaXMuZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24obUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByZXNvbHZlZENyZWF0aW9uTW9kZSA9IHRoaXMucmVzb2x2ZUNyZWF0aW9uTW9kZShtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSwgb0RhdGFMaXN0QmluZGluZywgbUluUGFyYW1ldGVycy5kYXRhKTtcblxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChcblx0XHRcdChtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlXG5cdFx0XHRcdDogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNYW5pZmVzdCgpW1wic2FwLmZlXCJdPy5hcHA/LnNpbmdsZURyYWZ0Rm9yQ3JlYXRlKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9PT0gb0RhdGFMaXN0QmluZGluZy5nZXRSb290QmluZGluZygpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAhPT0gbnVsbFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgbmV3QmluZGluZyA9IG9EYXRhTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKT8uYmluZExpc3QoXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldENvbnRleHQoKSxcblx0XHRcdFx0bmV3IFNvcnRlcihcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0xhc3RDaGFuZ2VEYXRlVGltZVwiLCB0cnVlKSxcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0ZmlsdGVyczogW1xuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJIYXNBY3RpdmVFbnRpdHlcIixcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdGFuZDogdHJ1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ld0JpbmRpbmc/LnJlcXVlc3RDb250ZXh0cygwLCAxKTtcblx0XHRcdGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlTmV3Q29udGV4dChyZXN1bHRbMF0sIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSkudGhlbigoKSA9PiBuZXdCaW5kaW5nPy5kZXN0cm95KCkpO1xuXHRcdFx0fVxuXHRcdFx0bmV3QmluZGluZz8uZGVzdHJveSgpO1xuXHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRcdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHNvdXJjZSBhcyBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRzb3VyY2UgYXMgc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0cGFyZW50Q29udGV4dFxuXHRcdCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlOiBzdHJpbmcsXG5cdFx0dkxpc3RCaW5kaW5nOiBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRvRGF0YUxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWRcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3RvcnkoW10pO1xuXHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkV4dGVybmFsOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFeHRlcm5hbERvY3VtZW50KHZMaXN0QmluZGluZywgcGFyYW1ldGVycy5vdXRib3VuZCk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5EZWZlcnJlZDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGVmZXJyZWREb2N1bWVudChvRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0LCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93XG5cdFx0XHRcdFx0PyB0aGlzLmNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50KHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Sb3c6IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kXG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuSW5saW5lOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nOlxuXHRcdFx0XHRpZiAob0RhdGFMaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHQvLyBDcmVhdGlvbiB3aXRoIGRpYWxvZyBpbiBhbiBPYmplY3RQYWdlXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nSW5saW5lRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nLFxuXHRcdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpb24gd2l0aCBkaWFsb2cgaW4gYSBMaXN0UmVwb3J0XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWJsZUlkOiBwYXJhbWV0ZXJzLnRhYmxlSWQsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVTeW5jQXN5bmNEb2N1bWVudChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRcdFx0YkZyb21EZWZlcnJlZDogcGFyYW1ldGVycy5iRnJvbURlZmVycmVkLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNyZWF0ZUFjdGlvbjogcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpFeGVjdXRlcyB0aGUgbWFuZGF0b3J5IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqIEBwYXJhbSBwcmVyZXF1aXNpdGUgUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgY3JlYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgcG9zdERvY3VtZW50Q3JlYXRpb24ocHJlcmVxdWlzaXRlOiBQcm9taXNlPFtDb250ZXh0LCB1bmtub3duXT4sIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0gYXdhaXQgcHJlcmVxdWlzaXRlO1xuXHRcdGNvbnN0IG5ld0RvY3VtZW50Q29udGV4dCA9IHBhcmFtc1swXTtcblx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGVcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgbmV3QWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSB8fFxuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0FuYWx5dGljYWwobGlzdEJpbmRpbmcpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgaXRlbSBpbiBhIGhpZXJhcmNoeS9hbmFseXRpY2FsIHRhYmxlIGZyb20gdGhlIExpc3RSZXBvcnQgKHNpbmNlIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUpXG5cdFx0XHRcdC8vIC0tPiB3ZSB3YW50IHRvIGZvcmNlIHRoZSB1c2VyIHRvIGVpdGhlciBzYXZlIG9yIGRpc2NhcmQgdGhlIGRyYWZ0IGJlZm9yZSBsZWF2aW5nIHRoZSBPUFxuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZyk7XG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgbmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3QobmV3RG9jdW1lbnRDb250ZXh0KSAmJlxuXHRcdFx0XHQhdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gdGhlIHNoYXJlIGFjdGlvbiB3aWxsIGJlIGV4ZWN1ZWQgbGF0ZXIgYXMgc29vbiAgYXMgdGhlIHBhZ2UgaXMgYm91bmRcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvZXhlY3V0ZVNoYXJlQWN0aW9uRm9yQ29sbGFib3JhdGlvblwiLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB2aWEgdGhlIGNyZWF0aW9uUm93LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFRoZSBuZXcgZG9jdW1lbnQgaXMgY3JlYXRlZCBhdCB0aGUgZW5kLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvblJvdyBUaGUgY3JlYXRpb24gcm93XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50KHBhcmFtZXRlcnM6IHtcblx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0Y3JlYXRpb25Sb3c6IENyZWF0aW9uUm93O1xuXHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgY3JlYXRpb246IFByb21pc2U8Q29udGV4dD47XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBjcmVhdGlvblJvdyA9IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0Y29uc3QgdGFibGUgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpIGFzIFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBuYXZpZ2F0aW9uID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKCF0YWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhYmxlLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkNyZWF0aW9uUm93XCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdH1cblx0XHRjb25zdCBjcmVhdGlvblJvd0NvbnRleHQgPSBjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgZG9jdW1lbnRWYWxpZGF0aW9uID0gdGhpcy5nZXRDcmVhdGlvblJvd1ZhbGlkYXRpb25GdW5jdGlvbih0YWJsZSk7XG5cdFx0Ly8gZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBpcyBzZXQgdG8gZmFsc2UgaW4gbWFuaWZlc3QgY29udmVydGVyIChUYWJsZS50cykgaWYgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIGV4aXN0c1xuXHRcdGlmIChjcmVhdGlvblJvdy5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHR9XG5cblx0XHRjb25zdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnN5bmNUYXNrKGRvY3VtZW50VmFsaWRhdGlvbik7XG5cdFx0aWYgKHZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyh2YWxpZGF0aW9uTWVzc2FnZXMsIHRhYmxlKTtcblx0XHRcdExvZy5lcnJvcihcIkN1c3RvbSBWYWxpZGF0aW9uIGZhaWxlZFwiKTtcblx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpKS50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93UGF5bG9hZCA9IGNyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblxuXHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXG5cdFx0Ly9tb3ZlZCBhZnRlciBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzIHRvIGF2b2lkIFwiJ2NyZWF0aW9uJyB1c2UgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIgY29uc29sZSBlcnJvcnNcblx0XHQvL2FmdGVyIHZhbGlkYXRpb24gZXJyb3JzIG9jY3VycmVkXG5cdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID8gdGFibGUuZ2V0Um93QmluZGluZygpLmdldExlbmd0aCgpIDogMCk7XG5cdFx0fSk7XG5cblx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhsaXN0QmluZGluZyk7XG5cdFx0dHJ5IHtcblx0XHRcdGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHRcdC4uLk9iamVjdC5rZXlzKGNyZWF0aW9uUm93UGF5bG9hZClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUgPT09IHByb3BlcnR5UGF0aCkgPT09IC0xXG5cdFx0XHRcdFx0XHRcdCkgLy8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0Lm1hcCgocGF0aCkgPT4gKHsgW3BhdGhdOiBjcmVhdGlvblJvd1BheWxvYWRbcGF0aF0gfSkpXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdFx0YnVzeUlkOiB0YWJsZT8uZ2V0SWQoKSxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IGFwcENvbXBvbmVudC5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0Ly8gU2lkZUVmZmVjdHMgb24gQ3JlYXRlXG5cdFx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIElubGluZSBtb2RlIG9yIHdpdGggYSBjcmVhdGlvbiBpbmxpbmUgZGlhbG9nIChPYmplY3QgcGFnZSBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IFBhcmVudCBjb250ZXh0IChmb3IgVHJlZVRhYmxlKVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEludGlhbCBkYXRhIGZvciBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBGaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUgfCBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cdFx0aWYgKHRhYmxlPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNyZWF0ZUNvbXBsZXRlZFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCBjcmVhdGlvbjtcblx0XHRcdFx0Y29uc3QgY29udGV4dEluZGV4ID0gbmV3Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRhdGEgPSBsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgY3JlYXRlSW5QbGFjZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgaXNDcmVhdGVJblBsYWNlID0gYWdncmVnYXRpb25EYXRhPy5jcmVhdGVJblBsYWNlID8/IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChjb250ZXh0SW5kZXggIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdHRhYmxlPy5mb2N1c1Jvdyhjb250ZXh0SW5kZXgsIHRydWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEZvciBjcmVhdGUgaW4tcGxhY2UgbW9kZSAoc2VydmVyIHBvc2l0aW9uKSwgZGlzcGxheSBhIHdhcm5pbmcgbWVzc2FnZSBpbiBjYXNlIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUgaXNuJ3QgdmlzaWJsZVxuXHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHRoaXMuX2dldFJlc291cmNlTW9kZWwoKS5nZXRUZXh0KFwiQ19ORVdfRUxFTUVOVF9OT1RfRElTUExBWUVEXCIpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykgJiYgIWlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSB0cmVlIHRhYmxlLCB3ZSBhbHNvIHNjcm9sbCB0byBrZWVwIHRoZSBwYXJlbnQgdmlzaWJsZVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBuZXdDb250ZXh0LmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50Q29udGV4dD8uZ2V0SW5kZXgoKTtcblx0XHRcdFx0XHRpZiAocGFyZW50SW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChwYXJlbnRJbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhsaXN0QmluZGluZyk7XG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0Ly9DaGVjayBpZiBBbGwgcGFyYW1ldGVycyBhcmUgbmVlZGVkXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogdGFibGU/LmdldElkKCksXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQsXG5cdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXG5cdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIHRoaXMuc3luY1Rhc2soY3JlYXRpb24pXSksIGxpc3RCaW5kaW5nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSBhIGRpYWxvZyBhbmQgc2F2ZXMgaXQgaW1tZWRpYXRlbHkgKExpc3RSZXBvcnQgY2FzZSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IFBhcmVudCBjb250ZXh0IChmb3IgVHJlZVRhYmxlKVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEludGlhbCBkYXRhIGZvciBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBGaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRkYXRhPzogb2JqZWN0O1xuXHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCB0YWJsZTogVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0dGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpICE9PSB0cnVlKSB7XG5cdFx0XHRcdHRhYmxlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzYXZlZERvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBhZnRlckNyZWF0ZUluRGlhbG9nID0gYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQ3JlYXRlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gRXJyb3JzIGluIG9uQWZ0ZXJDcmVhdGUgYXJlIG5vdCBjYXVzaW5nIHRoZSBvdmVyYWxsIGZsb3cgdG8gZmFpbFxuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciBhZnRlciBjcmVhdGlvbjogXCIgKyBlcnJvcik7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0XHRzYXZlZERvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0W10sXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KTtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJTYXZlKHtcblx0XHRcdFx0XHRjb250ZXh0OiBzYXZlZERvY3VtZW50Q29udGV4dFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdC8vIEVycm9ycyBpbiBvbkFmdGVyU2F2ZSBhcmUgbm90IGNhdXNpbmcgdGhlIG92ZXJhbGwgZmxvdyB0byBmYWlsXG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGFmdGVyIHNhdmU6IFwiICsgZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBUcmVlVGFibGUsIHdlIGRvbid0IHVzZSB0aGUgbGlzdEJpbmRpbmcgZnJvbSB0aGUgTGlzdFJlcG9ydCB0byBjcmVhdGUgdGhlIG5ldyBpdGVtLFxuXHRcdFx0XHQvLyBTbyB3ZSBjYW4ndCBrbm93IHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGl0ZW0gaW4gdGhlIGxpc3RCaW5kaW5nXG5cdFx0XHRcdC8vIC0tPiBXZSByZWZyZXNoIHRoZSB0YWJsZSBhbmQgc2Nyb2xsIHRvIHRoZSBwYXJlbnQgcG9zaXRpb25cblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh0YWJsZUFQSSkge1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEluZGV4ID0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0Py5nZXRJbmRleCgpO1xuXHRcdFx0XHRcdHRhYmxlQVBJLnJlZnJlc2goKTtcblx0XHRcdFx0XHRpZiAocGFyZW50SW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChwYXJlbnRJbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgZmxhdCB0YWJsZSwgd2UgY2FuIHNjcm9sbCB0byB0aGUgbmV3bHkgY3JlYXRlZCBpdGVtXG5cdFx0XHRcdGNvbnN0IGl0ZW1JbmRleCA9IHNhdmVkRG9jdW1lbnRDb250ZXh0LmdldEluZGV4KCk7XG5cdFx0XHRcdGlmIChpdGVtSW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVtSW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KGl0ZW1JbmRleCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0Ly9DaGVjayBpZiBBbGwgcGFyYW1ldGVycyBhcmUgbmVlZGVkXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogdGFibGU/LmdldElkKCksXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRhZnRlckNyZWF0ZUNhbGxCYWNrOiBhZnRlckNyZWF0ZUluRGlhbG9nLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZyxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKTtcblx0XHRpZiAoc2F2ZWREb2N1bWVudENvbnRleHQgJiYgcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgIT09IHRydWUpIHtcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBzYXZlZERvY3VtZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkZWZmZXJlZCBkb2N1bWVudC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IE9wdGlvbmFsIHBhcmVudCBjb250ZXh0IHdoZW4gY3JlYXRpbmcgYSBub2RlIGluIFRyZWVUYWJsZVxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGVmZXJyZWREb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0LCBkYXRhPzogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJEZWZlcnJlZFwiLCBwYXJlbnRDb250ZXh0LCBsaXN0QmluZGluZywgZGF0YSB9LFxuXHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0fSk7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN5bmMgb3IgYXN5bmMgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBzeW5jIG9yIGFzeW5jIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBUaGlzIGRvY3VtZW50IGlzIGNyZWF0ZWQgYWZ0ZXIgYSBkZWZmZXJlZCBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gIFRoZSBjcmVhdGUgaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgY3JlYXRlIGFjdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhICBEYXRhIHRvIHNhdmUgb24gdGhlIG5ldyBkb2N1bWVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0ZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBuYXZpZ2F0aW9uOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCByb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldEludGVybmFsUm91dGluZygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpXG5cdFx0XHQuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHQuLi57XG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkgJiYgbmV3RG9jdW1lbnRDb250ZXh0ICYmIG5ld0RvY3VtZW50Q29udGV4dC5nZXRCaW5kaW5nKCkgIT09IGxpc3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0Ly8gSW4gRkNMIGNhc2UsIGlmIHRoZSBuZXcgY29udGV4dCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYW4gYWN0aW9uIChub3Qgd2l0aCB0aGUgc3RhbmRhcmQgUE9TVCBjcmVhdGUpLCB3ZSBuZWVkIHRvIHJlZnJlc2hcblx0XHRcdFx0XHQvLyB0aGUgb3JpZ2luYWwgbGlzdEJpbmRpbmcgc28gdGhhdCBpdCBjb250YWlucyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgKHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBsaXN0QmluZGluZyBmb3Igc3RhbmRhcmQgY3JlYXRlKVxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblxuXHRcdC8vIERvbid0IGRvIHRoaXMgaWYgdGhlIGludm9jYXRpb24gY29tZXMgZnJvbSBhIGRlZmVycmVkIGNyZWF0aW9uIG9yIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvd1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgIT09IHRydWUgJiYgIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmMpIHtcblx0XHRcdG5hdmlnYXRpb24gPSByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiQXN5bmNcIiwgY3JlYXRlQ29udGV4dFByb21pc2U6IGNyZWF0aW9uIH0sXG5cdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uLnRoZW4oYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoIW5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdFx0cmV0dXJuIHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfRURJVEZMT1dfU0FQRkVfQ1JFQVRJT05fRkFJTEVEX0RFU0NSSVBUSU9OXCIpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgU3luYyBjcmVhdGlvbiB3YXMgdHJpZ2dlcmVkIGZvciBhIGRlZmVycmVkIGNyZWF0aW9uLCB3ZSBkb24ndCBuYXZpZ2F0ZSBmb3J3YXJkXG5cdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0Y29uc3QgbmF2UGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0dHJhbnNpZW50OlxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHQ/IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdC8vIGNyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB1c2VyIG9yIGZhaWxlZCBpbiBiYWNrZW5kID0+IGluIGNhc2Ugd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdHJhbnNpZW50IGNvbnRleHQgYmVmb3JlLCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHQvLyB0aGUgc3dpdGNoLXN0YXRlbWVudCBhYm92ZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaGFwcGVucyBpbiBjcmVhdGlvbk1vZGVzIGRlZmVycmVkIGFuZCBhc3luYy4gQnV0IGluIGZhY3QsIGluIHRoZXNlIGNhc2VzIGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGZyb20gcm91dGVNYXRjaGVkIGluIE9QIGNvbXBvbmVudFxuXHRcdFx0Ly8gY3JlYXRlRGVmZXJyZWREb2N1bWVudCBpcyB0cmlnZ2VyZWQsIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIChjcmVhdGVEb2N1bWVudCkgYWdhaW4gLSB0aGlzIHRpbWUgd2l0aCBjcmVhdGlvbk1vZGUgc3luYy4gVGhlcmVmb3JlLCBhbHNvIGluIHRoYXQgbW9kZSB3ZSBuZWVkIHRvIHRyaWdnZXIgYmFjayBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gVGhlIG90aGVyIGNhc2VzIG1pZ2h0IHN0aWxsIGJlIG5lZWRlZCBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyxcblx0XHRcdFx0XHRDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWRcblx0XHRcdFx0XS5pbmNsdWRlcyhlcnJvcilcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGV4dGVybmFsIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIG91dGJvdW5kIFRoZSBvdXRib3VuZCBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXh0ZXJuYWxEb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZywgb3V0Ym91bmQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRpZiAob3V0Ym91bmQpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdEJpbmRpbmcgIT09IFwic3RyaW5nXCIgJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSBcIkV4dGVybmFsXCIgd2l0aCBhIFRyZWVUYWJsZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXHRcdFx0Y29uc3QgY3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmJhc2UuZ2V0VmlldygpLCBsaXN0QmluZGluZyk7XG5cdFx0XHRjb250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKGNvbnRyb2xsZXIsIG91dGJvdW5kLCB1bmRlZmluZWQsIGNyZWF0ZVBhdGgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB0byBleGVjdXRlIGFmdGVyIHRoZSBkb2N1bWVudCBjcmVhdGlvbi5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjcmVhdGlvblByb21pc2UgVGhlIHByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIFNpZGVFZmZlY3RzIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0aGFuZGxlU2lkZUVmZmVjdHMgPSBhc3luYyAobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0Pik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uUHJvbWlzZTtcblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgbmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSAmJiB2aWV3QmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhlIGNyZWF0aW9uUm93LlxuXHQgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2VzIFRoZSBlcnJvciBtZXNzYWdlcyBmb3JtIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRhcmdldGVkIGJ5IHRoZSBtZXNzYWdlc1xuXHQgKi9cblx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKHZhbGlkYXRpb25NZXNzYWdlczogeyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXSwgdGFibGU6IFRhYmxlKTogdm9pZCA9PiB7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpO1xuXHRcdGNvbnN0IGN1c3RvbVZhbGlkaXR5ID0gdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpO1xuXHRcdGNvbnN0IGN1c3RvbU1lc3NhZ2VzOiBDdXN0b21NZXNzYWdlW10gPSBbXTtcblx0XHRsZXQgZmllbGRDb250cm9sO1xuXHRcdGxldCBmaW5hbFRhcmdldDogc3RyaW5nO1xuXG5cdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdGNvbnN0IG9sZE1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldENvZGUoKSA9PT0gY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKTtcblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMob2xkTWVzc2FnZXMpO1xuXG5cdFx0dmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKHZhbGlkYXRpb25NZXNzYWdlKSA9PiB7XG5cdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRpZiAodmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRmaWVsZENvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGN1c3RvbVZhbGlkaXR5W3ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdGZpbmFsVGFyZ2V0ID0gYCR7ZmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ1BhdGgoXCJ2YWx1ZVwiKX1gO1xuXHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCFNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0ID09PSBmaW5hbFRhcmdldCkpLmxlbmd0aFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRNZXNzYWdpbmcuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdFx0XHRcdFx0XHRjb2RlOiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IGZpbmFsVGFyZ2V0XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0ID09PSBmaW5hbFRhcmdldCkpO1xuXHRcdFx0XHRleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlc1swXS5hZGRDb250cm9sSWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdXN0b21NZXNzYWdlcy5wdXNoKHtcblx0XHRcdFx0XHRjb2RlOiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0dGV4dDogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChjdXN0b21NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBjdXN0b21NZXNzYWdlc1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXNvbHZlcyB0aGUgY3JlYXRpb24gbW9kZVxuXHQgKiBQcm92aWRlcyB0aGUgZXhwZWN0ZWQgY3JlYXRpb24gbW9kZTpcblx0ICogLSBwcmVzZXJ2ZXMgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlIHdoZW4gdGhpcyBvbmUgaXMgbm90IGEgTmV3UGFnZVxuXHQgKiAtIGNhbGN1bGF0ZXMgdGhlIG5ldyBvbmUgaWYgdGhlIGNyZWF0aW9uIG1vZGUgaXMgYSBOZXdQYWdlLlxuXHQgKiBAcGFyYW0gaW5pdGlhbENyZWF0aW9uTW9kZSBUaGUgaW5pdGlhbCBjcmVhdGlvbiBtb2RlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBjcmVhdGVEYXRhIFRoZSBpbml0aWFsIGRhdGEgZm9yIG9iamVjdCBjcmVhdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgbmV3IGNyZWF0aW9uIG1vZGVcblx0ICovXG5cdHJlc29sdmVDcmVhdGlvbk1vZGUgPSAoaW5pdGlhbENyZWF0aW9uTW9kZTogc3RyaW5nLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcblx0XHRpZiAoaW5pdGlhbENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdHJldHVybiBpbml0aWFsQ3JlYXRpb25Nb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGxpc3RCaW5kaW5nKTtcblx0XHRcdC8vIE5ld0FjdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTmF2aWdhdGlvblByb3BlcnR5IGNvbGxlY3Rpb25cblx0XHRcdGlmICghbGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0IHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0Ly8gaW4gdGhlIGFic2VuY2Ugb2YgTmV3QWN0aW9uIG9yIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMsIGNyZWF0aW9uIGlzIGFzeW5jXG5cdFx0XHRcdFx0bmV3QWN0aW9uID0gKFxuXHRcdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdFx0XHQ/IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0OiBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcblx0XHRcdFx0XHQpPy5OZXdBY3Rpb24/LnRvU3RyaW5nKCk7XG5cblx0XHRcdFx0aWYgKG5ld0FjdGlvbiAmJiBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgudGFyZ2V0RW50aXR5VHlwZS5hY3Rpb25zW25ld0FjdGlvbl0ucGFyYW1ldGVycy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0Ly8gYmluZGluZyBwYXJhbWV0ZXIgKGVnOiBfaXQpIGlzIG5vdCBjb25zaWRlcmVkXG5cdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY3JlYXRpb25QYXJhbWV0ZXJzID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldENyZWF0aW9uUGFyYW1ldGVycyhsaXN0QmluZGluZywgY3JlYXRlRGF0YSwgdGhpcy5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHRpZiAoY3JlYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKi9cblxuXHRhc3luYyB2YWxpZGF0ZURvY3VtZW50KFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0cGFyYW1ldGVyczogeyBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24/OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH1cblx0KTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS52YWxpZGF0ZURvY3VtZW50KGNvbnRleHQsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgdGhlIHJlc3VsdCBvZlxuXHQgKiBhIGNyZWF0aW9uIHJvdydzIGN1c3RvbSB2YWxpZGF0aW9uIGFzIGEgcHJvbWlzZS4gSWYgbm8gY3JlYXRpb24gcm93IGlzIGludm9sdmVkXG5cdCAqIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gcmV0dXJucyBhIHJlc29sdmVkIHByb21pc2UuXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgd2l0aCB0aGUgY3JlYXRpb25Sb3dcblx0ICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlXG5cdCAqL1xuXHRnZXRDcmVhdGlvblJvd1ZhbGlkYXRpb25GdW5jdGlvbih0YWJsZTogVGFibGUgfCB1bmRlZmluZWQpOiAoKSA9PiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRjb25zdCBjcmVhdGlvblJvdyA9IHRhYmxlPy5nZXRDcmVhdGlvblJvdygpO1xuXHRcdGlmIChjcmVhdGlvblJvdyAmJiB0YWJsZSkge1xuXHRcdFx0cmV0dXJuIGFzeW5jICgpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+ID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRpb25Sb3dPYmplY3RzID0gKGNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCkuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGRlbGV0ZSBjcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZURvY3VtZW50KHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCwge1xuXHRcdFx0XHRcdGRhdGE6IGNyZWF0aW9uUm93T2JqZWN0cyxcblx0XHRcdFx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IHRhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBhc3luYyAoKSA9PiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgdXNlZCB0byBjcmVhdGUgdGhlIGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gZGF0YUZvckNyZWF0ZSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgbmV3IGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gY3JlYXRlQXRFbmQgVHJ1ZSBpZiB0aGUgbmV3IGNvbnRleHRzIG5lZWQgdG8gYmUgY3JlYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGlzRnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHBhcmFtIGJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBjcmVhdGVBc0luYWN0aXZlIFRydWUgaWYgdGhlIGNvbnRleHRzIG5lZWQgdG8gYmUgY3JlYXRlZCBhcyBpbmFjdGl2ZVxuXHQgKiBAcGFyYW0gcmVxdWVzdFNpZGVFZmZlY3RzIFRydWUgYnkgZGVmYXVsdCwgZmFsc2UgaWYgU2lkZUVmZmVjdHMgc2hvdWxkIG5vdCBiZSByZXF1ZXN0ZWRcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dHMuXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRkYXRhRm9yQ3JlYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuXHRcdGNyZWF0ZUF0RW5kOiBib29sZWFuLFxuXHRcdGlzRnJvbUNvcHlQYXN0ZTogYm9vbGVhbixcblx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uLFxuXHRcdGNyZWF0ZUFzSW5hY3RpdmUgPSBmYWxzZSxcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Q29udGV4dFtdPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHRhcmdldExpc3RCaW5kaW5nID0gbGlzdEJpbmRpbmc7XG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzID0gcmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblxuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGxldCBtZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRpZiAodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3RhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCl9LyR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHModGFyZ2V0TGlzdEJpbmRpbmcpO1xuXG5cdFx0XHQvLyBJdGVyYXRlIG9uIGFsbCBpdGVtcyBhbmQgc3RvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRpb24gcHJvbWlzZVxuXHRcdFx0Y29uc3QgY3JlYXRpb25Qcm9taXNlcyA9IGRhdGFGb3JDcmVhdGUubWFwKGFzeW5jIChwcm9wZXJ0eVZhbHVlcykgPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzID0geyBkYXRhOiB7fSwgcGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCkgfTtcblxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSBjcmVhdGVBdEVuZDtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5pbmFjdGl2ZSA9IGNyZWF0ZUFzSW5hY3RpdmU7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBiZWZvcmVDcmVhdGVDYWxsQmFjaztcblxuXHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHByb3BlcnR5ICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdFx0XHRcdFx0IXByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF1cblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuZGF0YSFbcHJvcGVydHlQYXRoXSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHR0YXJnZXRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRpc0Zyb21Db3B5UGFzdGVcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dHMgPSBhd2FpdCBQcm9taXNlLmFsbChjcmVhdGlvblByb21pc2VzKTtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSh0YXJnZXRMaXN0QmluZGluZyk7XG5cdFx0XHR9XG5cdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdGNvbnN0IGFjdGl2ZUNvbnRleHRzID0gY3JlYXRlZENvbnRleHRzLmZpbHRlcigobmV3Q29udGV4dCkgPT4gIW5ld0NvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKGFjdGl2ZUNvbnRleHRzLm1hcChhc3luYyAobmV3Q29udGV4dCkgPT4gbmV3Q29udGV4dC5jcmVhdGVkKCkpKTtcblxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdGlmIChyZXF1ZXN0U2lkZUVmZmVjdHMgJiYgIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQodGFyZ2V0TGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpICYmIGFjdGl2ZUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgYWN0aXZlQ29udGV4dHMpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY3JlYXRlZENvbnRleHRzO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzLlwiKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dFBhdGggUGF0aCBwb2ludGluZyB0byB0aGUgY29udGV4dCBvbiB3aGljaCBDcmVhdGUgYWN0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNyZWF0ZVBhcmFtZXRlcnMgQXJyYXkgb2YgdmFsdWVzIHRoYXQgYXJlIGZpbGxlZCBpbiB0aGUgQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IHVua25vd25bXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVFZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZUVkaXQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ1NhdmUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBzYXZlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdGFzeW5jIG9uQmVmb3JlU2F2ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgY29udGV4dCB3ZSBvYnRhaW5lZCBhZnRlciBzYXZpbmdcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyU2F2ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJFZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckVkaXQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IG9idGFpbmVkIGFmdGVyIGRpc2NhcmRpbmcgdGhlIG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIHdlIGRpc2NhcmRlZCBhIG5ldyBvYmplY3Rcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckRlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNhdmVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbVBhcmFtZXRlcnM6IFNhdmVEb2N1bWVudFBhcmFtZXRlcnMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIGFzIE9EYXRhTGlzdEJpbmRpbmdbXTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdC8vIGluIGNhc2Ugb2Ygc2F2aW5nIC8gYWN0aXZhdGluZyB0aGUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBzaGFsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgUEFUQ0gvUE9TVFxuXHRcdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm1lcmdlUGF0Y2hEcmFmdCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuID0gYXdhaXQgdGhpcy5jaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0XHRyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHx8XG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0XG5cdFx0XHQpIHtcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gb0NvbnRleHQgOiAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEV4ZWN1dGUgdGhlIHJlZ2lzdGVyZWQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgd2hpY2ggaGF2ZSBub3QgYmUgZXhlY3V0ZWQgeWV0IGZvciB0aGUgcGFnZSBjb250ZXh0XG5cdFx0XHQvLyBDYW4gb2NjdXIgd2hlbiBzaG9ydGN1dCBpcyB1c2VkIHRvIHNhdmUgdGhlIGRvY3VtZW50LlxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLl9zaWRlRWZmZWN0cy5oYW5kbGVQYWdlQ2hhbmdlQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRcdC8vIFRoZSAkYXV0byBxdWV1ZSBjYW4gb25seSBoYXZlIHBlbmRpbmcgY2hhbmdlcyBhdCB0aGlzIHBvaW50IHdoZW4gU0FWRSB3YXMgY2xpY2tlZCBpbW1lZGlhdGVseSBhZnRlciBjaGFuZ2luZyBhIGZpZWxkLlxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlIHRoZSAkYXV0byBxdWV1ZSBpcyBsb2NrZWQgdGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgc3VibWl0IGJhdGNoIHNob3VsZCBub3QgY3JlYXRlIGEgc2VwYXJhdGUgYmF0Y2ggcmVxdWVzdC5cblx0XHRcdC8vIEl0IGlzIGRvbmUgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgcGF0Y2gsIGRyYWZ0cHJlcGFyZSwgZHJhZnRhY3RpdmF0ZSBlYWNoIGhhdmUgdGhlaXIgb3duIGNoYW5nZXNldFxuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSAmJiBtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQpIHtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBhcyBib29sZWFuLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoU3RhbmRhcmRBY3Rpb25zLnNhdmUsIFRyaWdnZXJUeXBlLnN0YW5kYXJkQWN0aW9uKTtcblxuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdGNvbnRleHQ6IGFjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHVwZGF0ZSB0ZWxlbWV0cnkgZGF0YSBmb3IgaG93IHBhZ2Ugd2FzIHNhdmVkIGFuZCB0aGVuIGRvIHN0b3Jpbmcgb2YgdGhpcyBkYXRhIHRvIGJhY2tlbmQgdGhyb3VnaCB0aGUgc3RvcmVEYXRhIGZ1bmN0aW9uXG5cdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLnN0b3JlRGF0YUZvclRlbGVtZXRyeShyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4pO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBzYXZpbmcsIHRoZSBzZW1hbnRpYyBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIG5lZWQgdG8gbWFuYWdlIHRoZSBzZW1hbnRpYyBVUkwgY2hhbmdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChhY3RpdmVEb2N1bWVudENvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGlmIChwcmV2aW91c1NlbWFudGljUGF0aCAmJiBuZXdTZW1hbnRpY1BhdGggJiYgcHJldmlvdXNTZW1hbnRpY1BhdGggIT09IG5ld1NlbWFudGljUGF0aCkge1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IHByZXZpb3VzU2VtYW50aWNQYXRoLCBuZXdQYXRoOiBuZXdTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAocm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpIHx8IHRoaXMuX2hpZGRlbkRyYWZ0Py5zdGF5T25DdXJyZW50UGFnZUFmdGVyU2F2ZSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldyAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdGlmICghKG9FcnJvciAmJiAob0Vycm9yIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuIH0pLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzYXZpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyB0aGUgVUkgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gc3dpdGNoIGZyb21cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBzd2l0Y2ggaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgZWRpdGFibGU6IGJvb2xlYW47XG5cdFx0Y29uc3QgYklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0Ly90b2dnbGUgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlZGl0IGRyYWZ0cyBhbmQgYWN0aXZlIGRvY3VtZW50cyB3aXRoIGRyYWZ0KVxuXHRcdGlmIChcblx0XHRcdCFiSXNEcmFmdCB8fFxuXHRcdFx0IShcblx0XHRcdFx0KCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkgfHxcblx0XHRcdFx0KG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0Ly9zdGFydCBQb2ludDogZWRpdCBkcmFmdFxuXHRcdFx0ZWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRlZGl0YWJsZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnN0IG9SaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb0NvbnRleHQ7XG5cdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvUmlnaHRtb3N0Q29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0aWYgKCFzaWJsaW5nSW5mbyAmJiBvQ29udGV4dCAhPT0gb1JpZ2h0bW9zdENvbnRleHQpIHtcblx0XHRcdFx0Ly8gVHJ5IHRvIGNvbXB1dGUgc2libGluZyBpbmZvIGZvciB0aGUgcm9vdCBjb250ZXh0IGlmIGl0IGZhaWxzIGZvciB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdFx0Ly8gLS0+IEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSB0cnkgdG8gc3dpdGNoIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBidXQgYSBjaGlsZCBlbnRpdHkgaGFzIG5vIHNpYmxpbmcsIHRoZSBzd2l0Y2ggd2lsbCBjbG9zZSB0aGUgY2hpbGQgY29sdW1uXG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKGVkaXRhYmxlID8gRWRpdE1vZGUuRWRpdGFibGUgOiBFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7IC8vc3dpdGNoIHRvIGVkaXQgbW9kZSBvbmx5IGlmIGEgZHJhZnQgaXMgYXZhaWxhYmxlXG5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIHsgZWRpdGFibGUsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjb250cm9sPzogQnV0dG9uO1xuXHRcdFx0Y2FuY2VsQnV0dG9uPzogQnV0dG9uO1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbjtcblx0XHRcdHNraXBCYWNrTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0Y29uc3QgY2FuY2VsUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyID09PSB0cnVlLFxuXHRcdFx0Y2FuY2VsQnV0dG9uOiAobVBhcmFtZXRlcnMuY29udHJvbCB8fCBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24pISxcblx0XHRcdGJlZm9yZUNhbmNlbENhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkXG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHx8XG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0XG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnQgPyBvQ29udGV4dCA6IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbmNlbFJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0Y2FuY2VsUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSAmJiAhcm9vdENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgOiB0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpIHx8IHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAvLyBJbiBzdGlja3kgbW9kZSB3ZSBhbHdheXMgYXNrIGZvciBjb25maXJtYXRpb25cblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHQuZm9yRWFjaCgodmlldykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChjb250ZXh0Py5pc0tlZXBBbGl2ZSgpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEaXNjYXJkKHtcblx0XHRcdFx0Y29udGV4dDogY2FuY2VsUmVzdWx0XG5cdFx0XHR9KTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9Db250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHJvb3RDb250ZXh0KTtcblx0XHRcdFx0XHRpc05ld0RvY3VtZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdDtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCh0aGlzLl9pc0ZjbEVuYWJsZWQoKSB8fCB0aGlzLl9oaWRkZW5EcmFmdD8uc3RheU9uQ3VycmVudFBhZ2VBZnRlckNhbmNlbCkgJiZcblx0XHRcdFx0XHRzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnQsIGFuZCBpdCdzIHRoZSBzYW1lIGFzIHRoZSBlZGl0ZWQgY29udGV4dFxuXHRcdFx0XHRcdC8vIFNvLCB3ZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBhcyBpdCBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZCB3aGVuIGNhbGxpbmcgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiBhbGwgdmlldydzIGNvbnRleHRzXG5cdFx0XHRcdFx0Ly8gZWFybGllciBpbiB0aGlzIG1ldGhvZFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhdGhpcy5faGlkZGVuRHJhZnQpIHtcblx0XHRcdFx0Ly9zaG93IERyYWZ0IGRpc2NhcmRlZCBtZXNzYWdlIHRvYXN0IG9ubHkgZm9yIGRyYWZ0IGVuYWJsZWQgYXBwc1xuXHRcdFx0XHR0aGlzLnNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0Um9vdENvbnRleHQoY29udGV4dDogQ29udGV4dCwgYmluZGluZ1BhcmFtZXRlcnM/OiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mb1tcInBhcmFtZXRlcnNcIl0pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0IHx8IHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHJldHVybiAoYXdhaXQgQ29tbW9uVXRpbHMuY3JlYXRlUm9vdENvbnRleHQoXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzXG5cdFx0XHRcdCkpIGFzIENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0O1xuXHR9XG5cblx0YXN5bmMgaXNSb290Q29udGV4dE5ldyhjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KGNvbnRleHQsIHsgJHNlbGVjdDogXCJIYXNBY3RpdmVFbnRpdHksSXNBY3RpdmVFbnRpdHlcIiB9KTtcblx0XHRyZXR1cm4gIXJvb3RDb250ZXh0LmdldE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKSAmJiAhcm9vdENvbnRleHQuZ2V0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdH1cblx0LyoqXG5cdCAqIEJyaW5ncyB1cCBhIG1lc3NhZ2UgdG9hc3Qgd2hlbiBhIGRyYWZ0IGlzIGRpc2NhcmRlZC5cblx0ICogQHBhcmFtIGlzTmV3RG9jdW1lbnQgVGhpcyBpcyBhIEJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgbmV3IG9yIGFscmVhZHkgZXhpc3RzLlxuXHQgKi9cblx0c2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudD86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGlmIChpc05ld0RvY3VtZW50ID09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gaW4gc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2Ugd2hlbiBubyBjb250ZXh0IGlzIHBhc3NlZC5cblx0ICovXG5cdHNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCgpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSwgeyBjbG9zZU9uQnJvd3Nlck5hdmlnYXRpb246IGZhbHNlIH0pO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqL1xuXHRwcml2YXRlIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzPzogeyBlbnRpdHlTZXROYW1lOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGJvb2xlYW47XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCBiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZSwgYmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZSB9LFxuXHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdC8vIEV2ZW4gaW4gdGhlIEZDTCBjYXNlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGxpc3RiaW5kaW5nIGluIHRoZSBMUiAobm90IE9QKSB0byB1cGRhdGUgdGhlIGNvdW50cyBpbiB0aGUgdGFicyBhbmQgcXVpY2tmaWx0ZXJzXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGNvbnRleHRCaW5kaW5nLCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUoY29udGV4dEJpbmRpbmcsIGNvbnRleHRCaW5kaW5nLmdldENvbnRleHQoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0YXdhaXQgb0FwcENvbXBvbmVudD8uZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKFtvQ29udGV4dF0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IFtvQ29udGV4dF0gfSk7XG5cblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdC8vIHRvIHRoZSBhcHAgd2UgY2FtZSBmcm9tIChleGNlcHQgZm9yIEZDTCwgd2hlcmUgd2UgbmF2aWdhdGUgdG8gTFIgYXMgdXN1YWwpXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmV4aXRGcm9tQXBwKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRWxzZSBuYXZpZ2F0ZSBiYWNrIGZyb20gdGhlIHBhZ2UuIEluIEZDTCwgdGhpcyBpcyBkb25lIHdoZW4gdGhlIGtlcHQtYWxpdmUgY29udGV4dCBpcyBkZXN0cm95ZWQgKGNhbGxiYWNrKVxuXHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc0NvbnRpbnVlID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhmYWxzZSk7XG5cdFx0XHRpZiAoaXNDb250aW51ZSA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pc05hdmlnYWJsZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250cm9sSWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBJZiByZXNvbHZlZCwgdGhlIHByb21pc2UgcmV0dXJuczpcblx0ICogIC0gSWYgdGhlIHBhcmFtZXRlciBjb250ZXh0cyBpcyBhbiBhcnJheTogYW4gYXJyYXkgb2Ygb2JqZWN0cywgZWFjaCBvYmplY3QgY29udGFpbmluZyBhIGtleSBcInN0YXR1c1wiLCBhcyB3ZWxsIGFzIFwidmFsdWVcIiByZWZlcmVuY2luZyB0aGUgYWN0aW9uIHN0YXR1cyBhbmQgdGhlIGNvbnRleHRcblx0ICogIC0gSWYgdGhlIHBhcmFtZXRlciBjb250ZXh0cyBpcyBub3QgYW4gYXJyYXk6IGEgc2luZ2xlIGNvbnRleHRcblx0ICogVGhlIGNvbnRleHQocykgcHJvdmlkZWQgaW4gdGhlIHByb21pc2UgaXMgKGFyZSkgZWl0aGVyIHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCBvZiB0aGUgYWN0aW9uIG9yIHRoZSBib3VuZCBjb250ZXh0IGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0bUV4dHJhUGFyYW1zPzoge31cblx0KTogUHJvbWlzZTxcblx0XHR8IHtcblx0XHRcdFx0dmFsdWU6IENvbnRleHQ7XG5cdFx0XHRcdHN0YXR1czogXCJmdWxmaWxsZWRcIjtcblx0XHQgIH1bXVxuXHRcdHwgQ29udGV4dFxuXHQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRsZXQgYVBhcnRzO1xuXHRcdGxldCBzT3ZlcmxvYWRFbnRpdHlUeXBlO1xuXHRcdGxldCBvQ3VycmVudEFjdGlvbkNhbGxCYWNrczpcblx0XHRcdHwge1xuXHRcdFx0XHRcdGZSZXNvbHZlcjogRnVuY3Rpb247XG5cdFx0XHRcdFx0ZlJlamVjdG9yOiBGdW5jdGlvbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXG5cdFx0Ly8gRHVlIHRvIGEgbWlzdGFrZSB0aGUgaW52b2tlQWN0aW9uIGluIHRoZSBleHRlbnNpb25BUEkgaGFkIGEgZGlmZmVyZW50IEFQSSB0aGFuIHRoaXMgb25lLlxuXHRcdC8vIFRoZSBvbmUgZnJvbSB0aGUgZXh0ZW5zaW9uQVBJIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBhcyB3ZSBleHBvc2UgdGhlIGZ1bGwgZWRpdCBmbG93IG5vdyBidXRcblx0XHQvLyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIHNpZ25hdHVyZVxuXHRcdGlmIChcblx0XHRcdCgobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBICYmIChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHxcblx0XHRcdEFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkID0gbUluUGFyYW1ldGVycyBhcyBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRtSW5QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1JblBhcmFtZXRlcnMubW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHBhcmVudENvbnRyb2w6IEZFVmlldztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0XHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRpc0JvdW5kPzogYm9vbGVhbjtcblx0XHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIHBhcmVudENvbnRyb2w6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfSB8fCB7IHBhcmVudENvbnRyb2w6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfTtcblxuXHRcdG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlID0gbVBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIHx8IG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHRoZSByZWZlcmVuY2VkIGFjdGlvbiBpcyBib3VuZCBvciB1bmJvdW5kXG5cdFx0Y29uc3QgY29udmVydGVkTWV0YWRhdGEgPSBjb252ZXJ0VHlwZXModGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdC8vIFRoZSBFbnRpdHlDb250YWluZXIgbWF5IE5PVCBiZSBtaXNzaW5nLCBzbyBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgdW5kZWZpbmVkLCBidXQgc2luY2UgaW4gb3VyIGNvbnZlcnRlZCBNZXRhZGF0YVxuXHRcdC8vIGl0IGNhbiBiZSB1bmRlZmluZWQsIEkgbmVlZCB0aGlzIHdvcmthcm91bmQgaGVyZSBvZiBhZGRpbmcgXCJcIiBzaW5jZSBpbmRleE9mIGRvZXMgbm90IGFjY2VwdCBzb21ldGhpbmcgdGhhdCdzXG5cdFx0Ly8gdW5kZWZpbmVkLlxuXHRcdGlmIChzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpKSB7XG5cdFx0XHQvLyBVbmJvdW5kIGFjdGlvbnMgYXJlIGFsd2F5cyByZWZlcmVuY2VkIHZpYSB0aGUgYWN0aW9uIGltcG9ydCBhbmQgd2UgZm91bmQgdGhlIEVudGl0eUNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUgc29cblx0XHRcdC8vIGFuIHVuYm91bmQgYWN0aW9uIGlzIHJlZmVyZW5jZWQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE5vIGVudGl0eSBjb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lLCBzbyBlaXRoZXIgYSBib3VuZCBvciBzdGF0aWMgYWN0aW9uIGlzIHJlZmVyZW5jZWQgd2hpY2ggaXMgYWxzbyBib3VuZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSAmJiBtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSA9IG1QYXJhbWV0ZXJzLm1vZGVsXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQoKEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cykuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgc3RpY2t5IHNlc3Npb24gaXMgZW5hYmxlZCB3ZSB0cmlnZ2VyIGFjdGlvbnMgd2l0aG91dCBlVGFnXG5cdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZyA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCIoXCIpKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0ucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gJiYgb0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IG9Db250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRhYmxlQVBJLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gb1ZpZXcuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uID0gcmVzcG9uc2UuZmlsdGVyKGlzRnVsZmlsbGVkKTtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggIT09IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBLZWVwIHRoZSBzYW1lIHdvcmtmbG93IHRoYW4gYmVmb3JlXG5cdFx0XHRcdC8vIElmIGF0IGxlYXN0IG9uZSBwcm9taXNlIGlzIHJlamVjdGVkLCB3ZSByZWplY3QgdGhlIHdob2xlIHByb21pc2Vcblx0XHRcdFx0dGhyb3cgcmVzcG9uc2U7XG5cdFx0XHR9XG5cdFx0XHRsZXQgbGlzdFJlZnJlc2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSAmJiBtUGFyYW1ldGVycy5pc0JvdW5kID09PSB0cnVlKSB7XG5cdFx0XHRcdGxpc3RSZWZyZXNoZWQgPSBhd2FpdCB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0XHRcdFx0dGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBzdWNjZXNzRnVsbEV4ZWN1dGlvbiksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KFxuXHRcdFx0XHRcdEFjdGl2aXR5LkFjdGlvbixcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyxcblx0XHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0XHRsaXN0UmVmcmVzaGVkLFxuXHRcdFx0XHRcdE9iamVjdC5rZXlzKHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dC5nZXRPYmplY3QoKSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKHN1Y2Nlc3NGdWxsRXhlY3V0aW9uKTtcblx0XHRcdH1cblx0XHRcdC8qXG5cdFx0XHRcdFx0V2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHRUT0RPOiBnZXQgcmlkIG9mIHRoaXMgd29ya2Fyb3VuZFxuXHRcdFx0XHRcdFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0T25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHRpcyBhbHJlYWR5IHJlZnJlc2hlZCAoaXQncyBqdXN0IG5vdCByZWZsZWN0ZWQgaW4gdGhlIG9iamVjdCBwYWdlKVxuXHRcdFx0XHRcdHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0YXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdHdlIGNhbiBsaXZlIHdpdGggdGhpc1xuXHRcdFx0XHRcdHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0Zmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCovXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlICE9PSBcIkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRpZiAoc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dCA9IHRoaXMuX2dldEJvdW5kQ29udGV4dChvVmlldywgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dFxuXHRcdFx0XHRcdFx0OiBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0O1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBDb250ZXh0W10sIGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXSk6IENvbnRleHRbXSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChhcHBsaWNhYmxlQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYXBwbGljYWJsZUNvbnRleHRzLmluY2x1ZGVzKGVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cylbMF1cblx0XHRcdFx0XHRcdDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRNZXRhUGF0aCA9IG9BY3Rpb25Db250ZXh0ICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRcdFx0XHRcdGlmIChzQ29udGV4dE1ldGFQYXRoICE9IHVuZGVmaW5lZCAmJiBzQ29udGV4dE1ldGFQYXRoID09PSBzQWN0aW9uQ29udGV4dE1ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQ/LmdldFBhdGgoKSAhPT0gY29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBhY3Rpb24gcmV0dXJucyBhIGRyYWZ0IGNvbnRleHQsIHdlIGFscmVhZHkgdGFrZSBjYXJlIGR1cmluZyBuYXZpZ2F0aW9uIHRvIGVpdGhlciBjcmVhdGUgYSBuZXdcblx0XHRcdFx0XHRcdFx0Ly8gKGZ1bGwgc2NyZWVuKSBvciB0byB1c2UgdGhlIGxpc3QgYmluZGluZyBjb250ZXh0IGFmdGVyIHJlZnJlc2ggKGFuZCBub3QgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0KS5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGRyYWZ0IGlzIGRpc2NhcmRlZCBvciBhY3RpdmF0ZWQsIGhhdmluZyB0aGUgY29udGV4dCBzdGlsbCBhcyBkZXBlbmRlbnQgY29udGV4dCBjYXVzZSBpc3N1ZXNcblx0XHRcdFx0XHRcdFx0Ly8gKGUuZy4gaWYgYSBzaWRlIGVmZmVjdCBpcyB0cmlnZ2VyZWQpLiBUaGVyZWZvcmUsIHdlIGRlc3Ryb3kgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0IGhlcmUsXG5cdFx0XHRcdFx0XHRcdC8vIGFuZCB0byBiZSBjb21wYXRpYmxlIHdlIHJldHVybiBhIG5ldyBjb250ZXh0IHdpdGggdGhlIHNhbWUgcGF0aC5cblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJlxuXHRcdFx0XHRcdFx0XHRcdChjb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlIHx8IHRoaXMuX2lzRmNsRW5hYmxlZCgpKVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0LmdldEJpbmRpbmcoKS5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oc0FjdGlvbk5hbWUpO1xuXG5cdFx0XHQvLyBLZWVwIHRoaXMgd2VpcmQgcmV0dXJuZWQgdmFsdWUgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29uc1xuXHRcdFx0Ly8gaW52b2tlQWN0aW9uIGlzIHB1YmxpYyBhbmQgd2UgY2FuJ3QgY2hhbmdlIHRoZSByZXR1cm5lZCB2YWx1ZSBmb3IgdGhlIGFjdGlvblxuXHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KG1JblBhcmFtZXRlcnM/LmNvbnRleHRzKSAmJiBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubWFwKChvUmVzdWx0KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7IC4uLm9SZXN1bHQsIC4uLnsgdmFsdWU6IG9SZXN1bHQudmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IG9SZXN1bHQudmFsdWUuYm91bmRDb250ZXh0IH0gfTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVyciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJEaWFsb2cgY2FuY2VsbGVkXCIpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGFmdGVyIHRoZSBhY3Rpb24gZXhlY3V0aW9uLlxuXHQgKiBAcGFyYW0gX2FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oX2FjdGlvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIG9uIHRoZSBtYXNzIGVkaXQgc2F2ZS5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogSWYgeW91IGRlY2lkZSB0byBkbyB5b3VyIG93biBzYXZlIHByb2Nlc3NpbmcsIHlvdSBjYW4gcmV0dXJuIGB0cnVlYCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IHNhdmUgYmVoYXZpb3IuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWR9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBjdXN0b21NYXNzRWRpdFNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5hQ29udGV4dHMgQXJyYXkgY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dHMgZm9yIHRoZSBtYXNzIGVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5vVXBkYXRlRGF0YSBBIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgcHJvcGVydHlQYXRoIGFuZCBpdHMgdmFsdWVcblx0ICogQHJldHVybnMgYHRydWVgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgZXhlY3V0aW9uLCBgZmFsc2VgIHRvIGtlZXAgdGhlIHN0YW5kYXJkIGJlaGF2aW9yXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTMwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkKVxuXHRhc3luYyBjdXN0b21NYXNzRWRpdFNhdmUoX21QYXJhbWV0ZXJzOiB7IGFDb250ZXh0czogQ29udGV4dFtdOyBvVXBkYXRlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWN1cmVkIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24uIEVuc3VyZXMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCB3aGVuIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgZnVsZmlsbGVkLlxuXHQgKiBAcGFyYW0gZm5GdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIFNob3VsZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgc2V0dGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24uIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQsIGltbWVkaWF0ZSBjb21wbGV0aW9uIGlzIGFzc3VtZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWZpbml0aW9ucyBvZiB0aGUgcHJlY29uZGl0aW9ucyB0byBiZSBjaGVja2VkIGJlZm9yZSBleGVjdXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kgRGVmaW5lcyB0aGUgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0IFRyaWdnZXJzIGEgYnVzeSBpbmRpY2F0b3Igd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnVwZGF0ZXNEb2N1bWVudCBUaGlzIG9wZXJhdGlvbiB1cGRhdGVzIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgdXNpbmcgdGhlIGJvdW5kIG1vZGVsIGFuZCBjb250ZXh0LiBBcyBhIHJlc3VsdCwgdGhlIGRyYWZ0IHN0YXR1cyBpcyB1cGRhdGVkIGlmIGEgZHJhZnQgZG9jdW1lbnQgZXhpc3RzLCBhbmQgdGhlIHVzZXIgaGFzIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgZWRpdGluZyBwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCBpZiB0aGUgZXhlY3V0aW9uIGlzIHByb2hpYml0ZWQgYW5kIHJlc29sdmVkIGJ5IHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBmbkZ1bmN0aW9uLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzZWN1cmVkRXhlY3V0aW9uKFxuXHRcdGZuRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRcdG1QYXJhbWV0ZXJzPzoge1xuXHRcdFx0YnVzeT86IHtcblx0XHRcdFx0c2V0PzogYm9vbGVhbjtcblx0XHRcdFx0Y2hlY2s/OiBib29sZWFuO1xuXHRcdFx0fTtcblx0XHRcdHVwZGF0ZXNEb2N1bWVudD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiQnVzeVNldCA9IG1QYXJhbWV0ZXJzPy5idXN5Py5zZXQgPz8gdHJ1ZSxcblx0XHRcdGJCdXN5Q2hlY2sgPSBtUGFyYW1ldGVycz8uYnVzeT8uY2hlY2sgPz8gdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSBtUGFyYW1ldGVycz8udXBkYXRlc0RvY3VtZW50ID8/IGZhbHNlLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0IGFzIENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LFxuXHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPilcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKG9FcnJvcjogdW5rbm93bik6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBPRGF0YUNvbnRleHRCaW5kaW5nJFBhdGNoU2VudEV2ZW50KTogdm9pZCB7XG5cdFx0Ly8gSW4gY29sbGFib3JhdGl2ZSBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiwgZGlzYWJsZSBFVGFnIGNoZWNrIGZvciBQQVRDSCByZXF1ZXN0c1xuXHRcdGNvbnN0IGludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IGlnbm9yZUVUYWcgPSB0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHwgaW50ZXJuYWxDb250ZXh0LmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdGlmIChpZ25vcmVFVGFnKSB7XG5cdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLnNldElnbm9yZUVUYWcodHJ1ZSk7XG5cdFx0fVxuXHRcdGlmICghaW50ZXJuYWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIHVua25vd24gYXMgT0RhdGFMaXN0QmluZGluZzsgLy8gRklYTUU6IFVJNSB0eXBlIHNheXMgdGhpcyBzaG91bGQgYmUgYW4gT0RhdGFDb250ZXh0QmluZGluZ1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaChcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChzb3VyY2VCaW5kaW5nLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZUNyZWF0ZVNlbnQoZXZlbnQ6IFVJNUV2ZW50PHsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBjb250ZXh0LmdldFBhdGgoKSk7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqL1xuXHRhc3luYyBzeW5jVGFzazxUPihuZXdUYXNrPzogKCgpID0+IFQpIHwgUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcyBhcyBQcm9taXNlPFQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIHVwZGF0ZXMgdGhlIFVJIGFuZCBpbnRlcm5hbCBtb2RlbHMgYWNjb3JkaW5nIHRoZSBlZGl0IG1vZGUgLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0YXN5bmMgY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdGlmICh0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9leGVjdXRlU2hhcmVBY3Rpb25Gb3JDb2xsYWJvcmF0aW9uXCIpKSB7XG5cdFx0XHRcdHNoYXJlT2JqZWN0KGNvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9leGVjdXRlU2hhcmVBY3Rpb25Gb3JDb2xsYWJvcmF0aW9uXCIsIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgbGFzdEludm9rZWRBY3Rpb25OYW1lID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIik7XG5cdFx0XHRpZiAobGFzdEludm9rZWRBY3Rpb25OYW1lICYmIHRoaXMuaXNOZXdBY3Rpb25Gb3JTdGlja3kobGFzdEludm9rZWRBY3Rpb25OYW1lLCBjb250ZXh0KSkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24oY29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXModGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpLCBjb250ZXh0LmdldE1vZGVsKCkpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50aXRsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kZXNjcmlwdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy51blNhdmVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oXG5cdFx0Y29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nIH07XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRcdFx0dW5TYXZlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bG9ja2VkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdC8vIGFzIHNlbGVjdGVkIGNvbnRleHRzIG1heSBpbmNsdWRlIGluYWN0aXZlIGNvbnRleHQgd2UgbmVlZCB0byBjb21wdXRlIHRoaXMgcGFyYW1ldGVyIGFnYWluIHRvIGVuc3VyZSBkZWxldGUgaGVscGVyIHdvcmtzIHByb3Blcmx5XG5cdFx0XHRwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3Qgc291cmNlQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0aWYgKHNvdXJjZUNvbnRyb2wgJiYgIXNvdXJjZUNvbnRyb2wuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBkZWxldGUgaXMgdHJpZ2dlcmVkIGZyb20gYSBNdWx0aVZhbHVlRmllbGQsIHdlIGRvbid0IHVzZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhcyB0aGUgTVZGIGRvZXNuJ3QgaGF2ZVxuXHRcdFx0XHQvLyBzdWNoIGEgY29udGV4dCBvZiBpdHMgb3duLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXRzIHBhcmVudCBjb250ZXh0IChlLmcuIGZyb20gdGhlIGVtYmVkZGluZyBUYWJsZSlcblx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IHNvdXJjZUNvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCk6IHR5cGVvZiBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpOiBNZXNzYWdlSGFuZGxlciB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhZ2VJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwicGFnZUludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcGFnZUludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRQYWdlSW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgYkNyZWF0aW9uTW9kZSwgcGFnZUludGVybmFsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhZ2VJbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXBhZ2VJbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cdFx0bGV0IG1lc3NhZ2VIYW5kbGluZ0tleTogc3RyaW5nO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKCkgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbiB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhzdWNjZXNzID8gRHJhZnRTdGF0dXMuU2F2ZWQgOiBEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKTogdm9pZCB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRpZiAoZWRpdE1vZGUgIT09IFwiRWRpdGFibGVcIikge1xuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmbGFnIHRvIGZvcmNlIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdC5cblx0ICogQHBhcmFtIGZvcmNlZFxuXHQgKi9cblx0cHJpdmF0ZSBmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiLCBmb3JjZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHdlIHNob3VsZCBmb3JjZSB0aGUgdXNlciB0byBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQsIG9yIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIGFsbG93ZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgbm90IGFsbG93ZWRcblx0ICovXG5cdHNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIpID09PSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5jbHVkZXMoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBBdHRhY2ggc3RpY2t5IHNlc3Npb24gY2FsbGJhY2tzXG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyhcblx0XHRcdFx0XHR0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKSxcblx0XHRcdFx0XHR0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKSxcblx0XHRcdFx0XHR0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LnVucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQudW5yZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXNDcmVhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCk7IC8vIFN0b3JlIHRoaXMgdmFsdWUgaW4gYSB2YXJpYWJsZSwgYXMgaXQgd2lsbCBiZSByZXNldCBpbiBoYW5kbGVTdGlja3lPZmZcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpOyAvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBiZWZvcmUgY2FsbGluZyB0aGUgYXN5bmMgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSB0aGV5IHdpbGwgY29uZmxpY3Qgd2l0aCBSb3V0ZVByb3h5LnJlc3RvcmVIaXN0b3J5IHRoYXQgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIWlzQ3JlYXRpb24pIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk6IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpOiB7IGZSZXNvbHZlcjogRnVuY3Rpb247IGZSZWplY3RvcjogRnVuY3Rpb24gfSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbjogRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uOiBGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTxQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKHJlc3BvbnNlOiBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKGFjdGlvbk5hbWUsIHJlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U6IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID49IDEpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbERhdGEgPSAoY3VycmVudFZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXREYXRhKCkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFjdGlvblJldHVyblR5cGUgPSBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZSA/IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlLiRUeXBlIDogbnVsbDtcblx0XHRcdGNvbnN0IGtleXMgPVxuXHRcdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdFx0PyAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kS2V5XG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG9EYXRhOiByZXNwb25zZVswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdGtleXNcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coaXNTYXZlOiBib29sZWFuKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cpIHtcblx0XHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyA9IG5ldyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2coe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRDb250ZXh0cygpO1xuXHRcdFx0aWYgKCFhbGxSb3dDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGZvY3VzUm93ID0gYWN0aXZlUm93SW5kZXgsXG5cdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdGZvciAoY29uc3Qgc2luZ2xlQ29udGV4dCBvZiBhbGxSb3dDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2luZ2xlQ29udGV4dC5pc0luYWN0aXZlKCkgJiYgaW5kZXggPCBmb2N1c1Jvdykge1xuXHRcdFx0XHRcdGZvY3VzUm93ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHRcdGlmIChmb2N1c1JvdyA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChmb2N1c1Jvdyk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1Jvdyhmb2N1c1JvdywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXModGFibGU6IFRhYmxlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoXG5cdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlICYmXG5cdFx0XHQhdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiKVxuXHRcdCkge1xuXHRcdFx0Ly8gV2l0aCB0aGUgcGFyYW1ldGVyLCB3ZSBkb24ndCBoYXZlIGVtcHR5IHJvd3MgaW4gRWRpdCBtb2RlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZSBzZXR0aW5nIHRoZSBmb2N1cyBvbiB0aGVtXG5cdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyh0YWJsZSwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHRoaXMuX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZSk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KFxuXHRcdGFjdGlvbjogQWN0aXZpdHksXG5cdFx0cmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHR0cmlnZ2VyZWRBY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LnNlbmQoeyBhY3Rpb24sIGNvbnRlbnQsIHRyaWdnZXJlZEFjdGlvbk5hbWUsIHJlZnJlc2hMaXN0QmluZGluZywgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyB9KTtcblx0fVxuXG5cdF90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZTogc3RyaW5nLCB0cmlnZ2VyVHlwZTogVHJpZ2dlclR5cGUpOiB2b2lkIHtcblx0XHR0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSh0aGlzLmJhc2UuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gU3VibWl0IGFueSBsZWZ0b3ZlciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCB5ZXQgc3VibWl0dGVkXG5cdFx0XHQvLyBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG9ubHkgMSB1cGRhdGVHcm91cElkLCBoZW5jZSBzdWJtaXR0aW5nIHRoZSBiYXRjaCBkaXJlY3RseSBoZXJlXG5cdFx0XHRhd2FpdCBvTW9kZWwuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIGNoYW5nZXNcblx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZyB3ZSBhZ3JlZWQgd2l0aCB0aGUgdjQgbW9kZWwgdGVhbSB0byB1c2UgYW4gaW50ZXJuYWwgbWV0aG9kLiBXZSdsbCByZXBsYWNlIGl0IG9uY2Vcblx0XHRcdC8vIGEgcHVibGljIG9yIHJlc3RyaWN0ZWQgbWV0aG9kIHdhcyBwcm92aWRlZFxuXHRcdFx0YXdhaXQgKG9Nb2RlbC5vUmVxdWVzdG9yIGFzIHVua25vd24gYXMgeyB3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzOiBGdW5jdGlvbiB9KS53YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIENoZWNrIGlmIGFsbCBjaGFuZ2VzIHdlcmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkaXNwbGF5IGEgJ2Rpc2NhcmQnIHBvcG92ZXIgd2hlbiBleGl0aW5nIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIG9uQmFja05hdmlnYXRpb25JblNlc3Npb24oY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHJvdXRlclByb3h5ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKHJvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRQcm9ncmFtbWluZ01vZGVsLlN0aWNreVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVOZXdDb250ZXh0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzOiB7IGVkaXRhYmxlOiBib29sZWFuOyByZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW47IGZvcmNlRm9jdXM/OiBib29sZWFuIH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRlZGl0YWJsZTogbmF2aWdhdGlvblBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLnJlY3JlYXRlQ29udGV4dCxcblx0XHRcdHJlYXNvbjogTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRmb3JjZUZvY3VzOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5mb3JjZUZvY3VzID8/IGZhbHNlLFxuXHRcdFx0a2VlcEN1cnJlbnRMYXlvdXQ6IHRydWVcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIHZpZXcgVGhlIHZpZXdcblx0ICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1zLmNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtcy5pc05hdmlnYWJsZSBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgbmF2aWdhYmxlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjdGlvbiBuZWVkcyB0byByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0LCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdF9nZXRCb3VuZENvbnRleHQodmlldzogRkVWaWV3LCBwYXJhbXM6IHsgY29udHJvbElkPzogc3RyaW5nOyBpc05hdmlnYWJsZT86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuXHRcdC8vVGhpcyB3ZWlyZCBjb25kaXRpb24gaXMgbmVlZGVkIHRvIGF2b2lkIG5hdmlnYXRpb24gaW4gY2FzZSBvZiBzb21lIGFjdGlvbnMgaW50byB0aGUgdGFibGVcblx0XHQvLyB0aGlzIGRlZmluaXRlbHkgbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCB0byBnZXQgY2xlYXIgY29uZGl0aW9uIHdoZXJlIG5hdmlnYXRpb24gbmVlZHMgdG8gYmUgZG9uZSBvciBub3Rcblx0XHQvLyBTTk9XOiBESU5DMDI3ODQ5MFxuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXcuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0Y29uc3QgYlJlZnJlc2hBZnRlckFjdGlvbiA9IHZpZXdMZXZlbCA+IDEgfHwgKHZpZXdMZXZlbCA9PT0gMSAmJiBwYXJhbXMuY29udHJvbElkKTtcblx0XHRyZXR1cm4gIXBhcmFtcy5pc05hdmlnYWJsZSB8fCAhIWJSZWZyZXNoQWZ0ZXJBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0YXN5bmMgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZCB8IHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3QgdmlzaWJsZVZpZXdJZHMgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0XHQ/ICh0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBGY2xDb250cm9sbGVyKS5fZ2V0QWxsVmlzaWJsZVZpZXdzKCkubWFwKCh2aWV3KSA9PiB2aWV3LmdldElkKCkpXG5cdFx0XHRcdDogW3RoaXMuZ2V0VmlldygpLmdldElkKCldO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBtZXNzYWdlIG9mIGFNZXNzYWdlcykge1xuXHRcdFx0XHRpZiAobWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKHZpc2libGVWaWV3SWRzLmluY2x1ZGVzKG9Db250cm9sLmdldElkKCkpKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uub0RhdGFcblx0ICogQHBhcmFtIG9SZXNwb25zZS5rZXlzXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYm91bmQgY29udGV4dCBvbiB3aGljaCB0aGUgYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIFByb21pc2UgaWYgdGhlIGxpc3Qgd2FzIHJlZnJlc2hlZFxuXHQgKi9cblx0YXN5bmMgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRvUmVzcG9uc2U/OiB7IG9EYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM/OiBzdHJpbmdbXSB8IG51bGwgfSxcblx0XHRvQ29udGV4dD86IENvbnRleHRcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCFvQ29udGV4dCB8fCAhb1Jlc3BvbnNlIHx8ICFvUmVzcG9uc2Uub0RhdGEgfHwgIW9SZXNwb25zZS5rZXlzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcob0JpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHBhdGhzID0gYVNlbWFudGljS2V5cy5tYXAoKG9LZXkpID0+IG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHRhd2FpdCBvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocGF0aHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgbGF0ZXN0IGNvbnRleHQgaW4gdGhlIG1ldGFkYXRhIGhpZXJhcmNoeSBmcm9tIHJvb3RCaW5kaW5nIHRvIGdpdmVuIGNvbnRleHQgcG9pbnRpbmcgdG8gZ2l2ZW4gZW50aXR5VHlwZVxuXHQgKiBpZiBhbnkgc3VjaCBjb250ZXh0IGV4aXN0cy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBvcmlnaW5hbCBjb250ZXh0LlxuXHQgKiBOb3RlOiBJdCBpcyBvbmx5IG5lZWRlZCBhcyB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZy4gQ29ycmVjdCBtb2RlbGxpbmcgd291bGQgaW1wbHkgYSBEYXRhRmllbGRGb3JBY3Rpb24gaW4gYSBMaW5lSXRlbVxuXHQgKiB0byBwb2ludCB0byBhbiBvdmVybG9hZCBkZWZpbmVkIGVpdGhlciBvbiB0aGUgY29ycmVzcG9uZGluZyBFbnRpdHlUeXBlIG9yIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZS5cblx0ICogQHBhcmFtIHJvb3RDb250ZXh0IFRoZSBjb250ZXh0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBvdmVybG9hZEVudGl0eVR5cGUgVGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eSB0eXBlIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5XG5cdCAqL1xuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChyb290Q29udGV4dDogQ29udGV4dCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIG92ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB7XG5cdFx0Y29uc3QgbW9kZWw6IE9EYXRhTW9kZWwgPSByb290Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgY29udGV4dFNlZ21lbnRzOiBzdHJpbmdbXSA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGN1cnJlbnRDb250ZXh0OiBDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cblx0XHQvLyBXZSBleHBlY3QgdGhhdCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBsaXN0QmluZGluZyBpcyB0aGUgTGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlLiBSZW1vdmUgdGhpcyBmcm9tIGNvbnRleHRTZWdtZW50c1xuXHRcdC8vIGJlY2F1c2UgaXQgaXMgaW5jb3JyZWN0IHRvIGV4ZWN1dGUgYmluZENvbnRleHQgb24gYSBsaXN0LiBXZSBkbyBub3QgYW55d2F5IG5lZWQgdG8gc2VhcmNoIHRoaXMgY29udGV4dCBmb3IgdGhlIG92ZXJsb2FkLlxuXHRcdGNvbnRleHRTZWdtZW50cy5wb3AoKTtcblx0XHRpZiAoY29udGV4dFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzID0gW1wiXCJdOyAvLyBEb24ndCBsZWF2ZSBjb250ZXh0U2VnbWVudHMgdW5kZWZpbmVkXG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRleHRTZWdtZW50c1swXSAhPT0gXCJcIikge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzLnVuc2hpZnQoXCJcIik7IC8vIHRvIGFsc28gZ2V0IHRoZSByb290IGNvbnRleHQsIGkuZS4gdGhlIGJpbmRpbmdDb250ZXh0IG9mIHRoZSB0YWJsZVxuXHRcdH1cblx0XHQvLyBsb2FkIGFsbCB0aGUgcGFyZW50IGNvbnRleHRzIGludG8gYW4gYXJyYXlcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0czogQ29udGV4dFtdID0gY29udGV4dFNlZ21lbnRzXG5cdFx0XHQubWFwKChwYXRoU2VnbWVudDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGlmIChwYXRoU2VnbWVudCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocGF0aFNlZ21lbnQsIGN1cnJlbnRDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHVzaW5nIGJpbmRDb250ZXh0KC4uLikuZ2V0Qm91bmRDb250ZXh0KCkgZG9lcyBub3Qgd29yayBpZiB0aGUgZXRhZyBpcyBuZWVkZWQuIEFjY29yZGluZyB0byBtb2RlbCBjb2xsZWFndWVzLFxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBhbHdheXMgdXNlIGFuIGV4aXN0aW5nIGNvbnRleHQgaWYgcG9zc2libGUuXG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5LCB0aGUgb25seSBleGFtcGxlIHdlIGtub3cgYWJvdXQgaXMgdXNpbmcgdGhlIHJvb3RDb250ZXh0IC0gYW5kIGluIHRoaXMgY2FzZSwgd2UgY2FuIG9idmlvdXNseSByZXVzZSB0aGF0IGV4aXN0aW5nIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gSWYgb3RoZXIgZXhhbXBsZXMgc2hvdWxkIGNvbWUgdXAsIHRoZSBiZXN0IHBvc3NpYmxlIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIHJlcXVlc3Qgc29tZSBkYXRhIHRvIGdldCBhbiBleGlzdGluZyBjb250ZXh0LiBUbyBrZWVwIHRoZVxuXHRcdFx0XHRcdC8vIHJlcXVlc3QgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUsIHdlIHNob3VsZCByZXF1ZXN0IG9ubHkgdGhlIGZpcnN0IGtleSBwcm9wZXJ0eS4gQXMgdGhpcyB3b3VsZCBpbnRyb2R1Y2UgYXN5bmNocm9uaXNtLCBhbmQgYW55d2F5XG5cdFx0XHRcdFx0Ly8gdGhlIHdob2xlIGxvZ2ljIGlzIG9ubHkgcGFydCBvZiB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZywgd2Ugd2FpdCB1bnRpbCB3ZSBoYXZlIGFuIGV4YW1wbGUgbmVlZGluZyBpdCBiZWZvcmUgaW1wbGVtZW50aW5nIHRoaXMuXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSByb290Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY3VycmVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJldmVyc2UoKTtcblx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgYmFja3dhcmRzXG5cdFx0Y29uc3Qgb3ZlcmxvYWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gcGFyZW50Q29udGV4dHMuZmluZChcblx0XHRcdChwYXJlbnRDb250ZXh0OiBDb250ZXh0KSA9PlxuXHRcdFx0XHQobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSBhcyB1bmtub3duIGFzIHN0cmluZykgPT09IG92ZXJsb2FkRW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0cmV0dXJuIG92ZXJsb2FkQ29udGV4dCB8fCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhO1xuXHR9XG5cblx0X2NyZWF0ZVNpYmxpbmdJbmZvKGN1cnJlbnRDb250ZXh0OiBDb250ZXh0LCBuZXdDb250ZXh0OiBDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdF9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkXG5cdCk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IGNvbnRleHQuZ2V0UGF0aCgpID09PSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSA/IGNvbnRleHQgOiBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dFRvTmF2aWdhdGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSwgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGhcblx0ICogZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHMgYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0XG5cdCAqIEBwYXJhbSBzUHJvZ3JhbW1pbmdNb2RlbCBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHBhcmFtIGRvTm90Q29tcHV0ZUlmUm9vdCBJZiB0cnVlLCB3ZSBkb24ndCBjb21wdXRlIHNpYmxpbmdJbmZvIGlmIHRoZSByb290IGFuZCB0aGUgcmlnaHRtb3N0IGNvbnRleHRzIGFyZSB0aGUgc2FtZVxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSByb290IGNvbnRleHQgaW5mb3JtYXRpb24gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdGRvTm90Q29tcHV0ZUlmUm9vdDogYm9vbGVhbixcblx0XHRyb290Q29udGV4dEluZm8/OiBSb290Q29udGV4dEluZm8sXG5cdFx0Z3JvdXBJZD86IHN0cmluZ1xuXHQpOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgPz8gcm9vdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0bGV0IHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q3VycmVudENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHQvLyB3ZSBjaGVjayB0aGUgcmlnaHRNb3N0Q3VycmVudENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHR9XG5cdFx0aWYgKGRvTm90Q29tcHV0ZUlmUm9vdCAmJiByaWdodE1vc3RDb250ZXh0VG9Vc2UuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRNb3N0Q29udGV4dFRvVXNlLCByb290Q29udGV4dEluZm8sIGdyb3VwSWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxuXG5cdGFzeW5jIGNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9UaGUgZXhpc3RpbmcgcmVjb21tZW5kYXRpb25zIGNoZWNrIGlzIG5vdyBwcmVzZW50IGZ1cnRoZXIgaW4gdGhlIGZsb3cgZm9yIHNob3dpbmcgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2codHJ1ZSk7XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIHRoZXJlIGNhbiBiZSBpbmxpbmUgZWRpdCBvbiB0aGUgcGFnZS5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBpbmxpbmUgZWRpdCBpcyBwb3NzaWJsZVxuXHQgKi9cblx0aXNJbmxpbmVFZGl0UG9zc2libGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRJbmxpbmVFZGl0U2VydmljZSgpLmRvZXNQYWdlSGF2ZUlubGluZUVkaXQodGhpcy5iYXNlLmdldFJvdXRpbmdUYXJnZXROYW1lKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmUgdGhlIGlubGluZSBlZGl0IGNoYW5nZXMuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVkIG9uY2UgdGhlIGJhdGNoIGhhcyByZXR1cm5lZC5cblx0ICovXG5cdGFzeW5jIGlubGluZUVkaXRTYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKCkuc3VibWl0QmF0Y2goQ29tbW9uVXRpbHMuSU5MSU5FRURJVF9VUERBVEVHUk9VUElEKTtcblx0XHRcdHRoaXMuaW5saW5lRWRpdEVuZCgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIHNhdmluZyBpbmxpbmUgZWRpdCBjaGFuZ2VzXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBpbmxpbmUgZWRpdCBjaGFuZ2VzLlxuXHQgKi9cblx0aW5saW5lRWRpdERpc2NhcmQoKTogdm9pZCB7XG5cdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpO1xuXHRcdHRoaXMuaW5saW5lRWRpdEVuZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuZCB0aGUgaW5saW5lIGVkaXQuXG5cdCAqL1xuXHRAaG9va2FibGUoXCJBZnRlclwiKVxuXHRpbmxpbmVFZGl0RW5kKCk6IHZvaWQge1xuXHRcdC8vIGlubGluZSBlZGl0IGNvbnRyb2xzIHdpbGwgaGF2ZSBjb2RlIHRoYXQgcmVhY3QgdG8gdGhpcyBob29rXG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIGlubGluZSBlZGl0IG9uIHRoZSBiaW5kaW5nQ29udGV4dFBhdGggZm9yIHRoZSBwcm9wZXJ0eUZ1bGx5UXVhbGlmaWVkTmFtZS5cblx0ICogQHBhcmFtIHByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dFBhdGhcblx0ICovXG5cdHN0YXJ0SW5saW5lRWRpdChwcm9wZXJ0eUZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nLCBiaW5kaW5nQ29udGV4dFBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IGlubGluZUVkaXRTZXJ2aWNlID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldElubGluZUVkaXRTZXJ2aWNlKCk7XG5cdFx0Y29uc3QgZGVwZW5kZW50UHJvcGVydGllcyA9IGlubGluZUVkaXRTZXJ2aWNlLmdldElubGluZUNvbm5lY3RlZFByb3BlcnRpZXMoXG5cdFx0XHR0aGlzLmJhc2UuZ2V0Um91dGluZ1RhcmdldE5hbWUoKSxcblx0XHRcdHByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0KTtcblx0XHR0aGlzLmlubGluZUVkaXRTdGFydChkZXBlbmRlbnRQcm9wZXJ0aWVzPy5sZW5ndGggPyBkZXBlbmRlbnRQcm9wZXJ0aWVzIDogW3Byb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lXSwgYmluZGluZ0NvbnRleHRQYXRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25maXJtIHRoZSBzdGFydCBvZiB0aGUgaW5saW5lIGVkaXQgb24gdGhlIGJpbmRpbmcgQ29udGV4dFBhdGggZm9yIHRoZSBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0gcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHRQYXRoXG5cdCAqL1xuXHRAaG9va2FibGUoXCJBZnRlclwiKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGlubGluZUVkaXRTdGFydChwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgYmluZGluZ0NvbnRleHRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBpbmxpbmUgZWRpdCBjb250cm9scyB3aWxsIGhhdmUgY29kZSB0aGF0IHJlYWN0IHRvIHRoaXMgaG9va1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgYSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3IgaW5saW5lIGVkaXQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eUZ1bGx5UXVhbGlmaWVkTmFtZVxuXHQgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQgZm9yIElubGluZSBlZGl0LlxuXHQgKi9cblx0aXNQcm9wZXJ0eUNvbnNpZGVyZWRGb3JJbmxpbmVFZGl0KHByb3BlcnR5RnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlXG5cdFx0XHQuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdC5nZXRJbmxpbmVFZGl0U2VydmljZSgpXG5cdFx0XHQuaXNQcm9wZXJ0eUNvbnNpZGVyZWRGb3JJbmxpbmVFZGl0KHRoaXMuYmFzZS5nZXRSb3V0aW5nVGFyZ2V0TmFtZSgpLCBwcm9wZXJ0eUZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIE5leHQgRG9jdW1lbnQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVkIG9uY2UgY3JlYXRlIG5leHQgaGFwcGVucy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU5leHREb2N1bWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiaW5kaW5nQ29udGV4dFBhdGggPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nUGF0aCA9IGJpbmRpbmdDb250ZXh0UGF0aD8uc3Vic3RyaW5nKDAsIGJpbmRpbmdDb250ZXh0UGF0aC5sYXN0SW5kZXhPZihcIihcIikpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZURvY3VtZW50KGxpc3RCaW5kaW5nUGF0aCBhcyBzdHJpbmcsIHsgY3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuTmV3UGFnZSB9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF5RUEsTUFBTUEsZ0JBQWdCLEdBQUdDLFNBQVMsQ0FBQ0QsZ0JBQWdCO0lBQ2xERSxTQUFTLEdBQUdELFNBQVMsQ0FBQ0MsU0FBUztJQUMvQkMsV0FBVyxHQUFHRixTQUFTLENBQUNFLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0gsU0FBUyxDQUFDRyxRQUFRO0lBQzdCQyxXQUFXLEdBQUdKLFNBQVMsQ0FBQ0ksV0FBVztFQTBCcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEEsSUFPTUMsUUFBUSxJQUFBQyxJQUFBLEdBRGJDLGNBQWMsQ0FBQywyQ0FBMkMsQ0FBQyxFQUFBQyxLQUFBLEdBWTFEQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBd0JoQkMsZUFBZSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUNqQkMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQW9QaEJILGVBQWUsQ0FBQyxDQUFDLEVBQUFJLEtB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
3064
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiX2RlYzQzIiwiX2RlYzQ0IiwiSW5zdGVhZCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsInN5bmNUYXNrcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJsaXN0QmluZGluZyIsImNyZWF0aW9uUHJvbWlzZSIsInZpZXdCaW5kaW5nQ29udGV4dCIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5ld0NvbnRleHQiLCJjcmVhdGVkIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0UGF0aCIsImVycm9yIiwiTG9nIiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwidGFibGUiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsImRhdGEiLCJjdXN0b21WYWxpZGl0eSIsImdldFByb3BlcnR5IiwiY3VzdG9tTWVzc2FnZXMiLCJmaWVsZENvbnRyb2wiLCJmaW5hbFRhcmdldCIsIm9sZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRDb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJmb3JFYWNoIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZ2V0VGFyZ2V0cyIsInNvbWUiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsIk1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJjb2RlIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJnZXRNZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlRGlhbG9nIiwicmVzb2x2ZUNyZWF0aW9uTW9kZSIsImluaXRpYWxDcmVhdGlvbk1vZGUiLCJjcmVhdGVEYXRhIiwiQ3JlYXRpb25Nb2RlIiwiTmV3UGFnZSIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwiaXNSZWxhdGl2ZSIsImRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwibmV3QWN0aW9uIiwiRHJhZnQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYWN0aW9ucyIsInBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsImNyZWF0aW9uUGFyYW1ldGVycyIsImdldFRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzIiwiQXN5bmMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uSW5pdCIsIl9oaWRkZW5EcmFmdCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJnZXRJbnRlcmZhY2UiLCJiYXNlIiwiZWRpdERvY3VtZW50IiwiY29udGV4dCIsInRyYW5zYWN0aW9uSGVscGVyIiwicm9vdFZpZXdDb250cm9sbGVyIiwiX2dldFJvb3RWaWV3Q29udHJvbGxlciIsIm1vZGVsIiwidmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsImdyb3VwSWQiLCJtZXNzYWdlSGFuZGxpbmdLZXkiLCJyZWdpc3RlclRvSG9sZE1lc3NhZ2VzIiwicm9vdENvbnRleHQiLCJnZXRSb290Q29udGV4dCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwicmlnaHRtb3N0Q29udGV4dCIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwidW5kZWZpbmVkIiwibmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSIsInJvb3RDb250ZXh0SW5mbyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsInNpYmxpbmdJbmZvUHJvbWlzZSIsImNvbXB1dGVTaWJsaW5nSW5mbyIsInZpZXdMZXZlbCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic3VibWl0QmF0Y2giLCJzaWJsaW5nSW5mbyIsIm5ld0RvY3VtZW50Q29udGV4dCIsImNvbnRleHRUb05hdmlnYXRlIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5Iiwib3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiIsIlN0aWNreSIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaGFyZU9iamVjdCIsImZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib25BZnRlckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsImVkaXRhYmxlIiwicmVjcmVhdGVDb250ZXh0IiwiZm9yY2VGb2N1cyIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiaGFuZGxlU3RpY2t5T24iLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsInVuSG9sZEtleSIsIm92ZXJyaWRlVUlEZWNpc2lvbiIsInJlamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJpc0luYWN0aXZlIiwiZ2V0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiQnVzeUxvY2tlciIsImxvY2siLCJzZWxlY3RlZENvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwicmVmcmVzaExpc3RCaW5kaW5nIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsInRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJyZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyIsInNldFVwRW1wdHlSb3dzIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiRGVsZXRlIiwidW5sb2NrIiwidXBkYXRlRG9jdW1lbnQiLCJ1cGRhdGVkQ29udGV4dCIsInVwZGF0ZVByb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiaXNEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInN5bmNUYXNrIiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24iLCJjcmVhdGVEb2N1bWVudCIsInNvdXJjZSIsIm1JblBhcmFtZXRlcnMiLCJvRGF0YUxpc3RCaW5kaW5nIiwiZm5MaXN0QmluZGluZyIsImluc3RhbmNlIiwibGlzdEJpbmRpbmdQYXRoIiwiZGF0YU1vZGVsIiwiYmluZExpc3QiLCJFeHRlcm5hbCIsImxpc3RCaW5kaW5nRnJvbVBhdGgiLCJjcmVhdGVBdEVuZCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJzaW5nbGVEcmFmdEZvckNyZWF0ZSIsImdldE1hbmlmZXN0IiwiYXBwIiwiZ2V0Um9vdEJpbmRpbmciLCJnZXRIZWFkZXJDb250ZXh0IiwibmV3QmluZGluZyIsImdldENvbnRleHQiLCJTb3J0ZXIiLCJGaWx0ZXIiLCJmaWx0ZXJzIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUxIiwiYW5kIiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsImRlc3Ryb3kiLCJfaGFuZGxlQ3JlYXRpb25Nb2RlIiwidkxpc3RCaW5kaW5nIiwiY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCIsIm91dGJvdW5kIiwiY3JlYXRlRGVmZXJyZWREb2N1bWVudCIsIkNyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVDcmVhdGVSb3dEb2N1bWVudCIsInNraXBTaWRlRWZmZWN0cyIsIklubGluZSIsImNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50IiwidGFibGVJZCIsIkNyZWF0aW9uRGlhbG9nIiwiY3JlYXRpb25EaWFsb2dGaWVsZHMiLCJjcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQiLCJTeW5jIiwiY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQiLCJiRnJvbURlZmVycmVkIiwiY3JlYXRlQWN0aW9uIiwicG9zdERvY3VtZW50Q3JlYXRpb24iLCJwcmVyZXF1aXNpdGUiLCJwYXJhbXMiLCJvbkFmdGVyQ3JlYXRlIiwibWV0YUNvbnRleHQiLCJzdGFydGluZ0VudGl0eVNldCIsImdldEludGVybmFsTW9kZWwiLCJzZXRQcm9wZXJ0eSIsImlzTGlzdEJpbmRpbmdBbmFseXRpY2FsIiwiZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJDcmVhdGUiLCJpc0RyYWZ0Um9vdCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiY3JlYXRpb24iLCJhcHBDb21wb25lbnQiLCJuYXZpZ2F0aW9uIiwiY3JlYXRpb25Sb3dDb250ZXh0IiwiZG9jdW1lbnRWYWxpZGF0aW9uIiwiZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24iLCJlbnRpdHlUeXBlIiwiY3JlYXRpb25Sb3dQYXlsb2FkIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImF0dGFjaEV2ZW50T25jZSIsInNjcm9sbFRvSW5kZXgiLCJnZXRMZW5ndGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJPYmplY3QiLCJhc3NpZ24iLCJrZXlzIiwicHJvcGVydHlQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJmaW5kSW5kZXgiLCJwcm9wZXJ0eSIsIm5hbWUiLCJtYXAiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsIl9nZXRSZXNvdXJjZU1vZGVsIiwiY3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm5ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNhdGNoIiwidHJhY2UiLCJkZWxldGUiLCJhbGwiLCJpc0xvY2tlZCIsImNvbnRleHRJbmRleCIsImdldEluZGV4IiwiYWdncmVnYXRpb25EYXRhIiwiZ2V0QWdncmVnYXRpb24iLCJpc0NyZWF0ZUluUGxhY2UiLCJjcmVhdGVJblBsYWNlIiwiZm9jdXNSb3ciLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VGV4dCIsInBhcmVudEluZGV4Iiwic2F2ZWREb2N1bWVudENvbnRleHQiLCJhZnRlckNyZWF0ZUluRGlhbG9nIiwib25CZWZvcmVTYXZlIiwic2F2ZURvY3VtZW50Iiwib25BZnRlclNhdmUiLCJyZWZyZXNoIiwiaXRlbUluZGV4IiwiYWZ0ZXJDcmVhdGVDYWxsQmFjayIsImdldEludGVybmFsUm91dGluZyIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsInJvdXRpbmdMaXN0ZW5lciIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY29yZVJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm5hdlBhcmFtZXRlcnMiLCJ0cmFuc2llbnQiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJpbmNsdWRlcyIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwiY3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiY3JlYXRpb25Sb3dPYmplY3RzIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImNyZWF0aW9uUHJvbWlzZXMiLCJwcm9wZXJ0eVZhbHVlcyIsImNyZWF0ZVBhcmFtZXRlcnMiLCJpbmFjdGl2ZSIsIiRraW5kIiwiY3JlYXRlZENvbnRleHRzIiwiYWN0aXZlQ29udGV4dHMiLCJlcnIiLCJfbVBhcmFtZXRlcnMiLCJvbkJlZm9yZURpc2NhcmQiLCJvbkJlZm9yZUV4ZWN1dGVBY3Rpb24iLCJvbkFmdGVyRGlzY2FyZCIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJpbmxpbmVFZGl0RmxvdyIsImlzSW5saW5lRWRpdFBvc3NpYmxlIiwiaW5saW5lRWRpdFNhdmUiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwibWVyZ2VQYXRjaERyYWZ0IiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwicmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuIiwiY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbiIsInNQcm9ncmFtbWluZ01vZGVsIiwiaXNGY2xFbmFibGVkIiwiX3NpZGVFZmZlY3RzIiwiaGFuZGxlUGFnZUNoYW5nZUNvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImFjdGl2ZURvY3VtZW50Q29udGV4dCIsImdldENyZWF0aW9uTW9kZSIsIl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiQWN0aXZhdGUiLCJkaXNjb25uZWN0IiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiU3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsIlRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5Iiwic3RvcmVEYXRhRm9yVGVsZW1ldHJ5IiwiX2NyZWF0ZVNpYmxpbmdJbmZvIiwicHJldmlvdXNTZW1hbnRpY1BhdGgiLCJuZXdTZW1hbnRpY1BhdGgiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwic3RheU9uQ3VycmVudFBhZ2VBZnRlclNhdmUiLCJ0YXJnZXRDb250ZXh0Iiwic2tpcEJpbmRpbmdUb1ZpZXciLCJvRXJyb3IiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld0RvY3VtZW50IiwiY2FuY2VsUGFyYW1ldGVycyIsInNraXBEaXNjYXJkUG9wb3ZlciIsImNhbmNlbEJ1dHRvbiIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJ2aWV3IiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJEaXNjYXJkIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic3RheU9uQ3VycmVudFBhZ2VBZnRlckNhbmNlbCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJiaW5kaW5nUGFyYW1ldGVycyIsImNyZWF0ZVJvb3RDb250ZXh0IiwiaXNSb290Q29udGV4dE5ldyIsIiRzZWxlY3QiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsImNsb3NlT25Ccm93c2VyTmF2aWdhdGlvbiIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiZGVsZXRlRG9jdW1lbnQiLCJvQXBwQ29tcG9uZW50Iiwic2libGluZ0NvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImNvbnRleHRCaW5kaW5nIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJvTG9ja09iamVjdCIsImlzQ29udGludWUiLCJzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIlJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24iLCJDb250aW51ZSIsImNhbGxFeHRlbnNpb24iLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiaXNBcnJheSIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJpc0JvdW5kIiwib0NvbnRyb2wiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImlnbm9yZUVUYWciLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsImdldElkIiwicmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwic3VjY2Vzc0Z1bGxFeGVjdXRpb24iLCJpc0Z1bGZpbGxlZCIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsIkFjdGlvbiIsInZhbHVlIiwiYm91bmRDb250ZXh0IiwiYWN0aW9uIiwiZlJlc29sdmVyIiwiY29udmVydGVyVHlwZSIsIl9nZXRCb3VuZENvbnRleHQiLCJyZXR1cm5lZENvbnRleHQiLCJvTWV0YU1vZGVsIiwic0NvbnRleHRNZXRhUGF0aCIsIl9mblZhbGlkQ29udGV4dHMiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJlbGVtZW50Iiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJpbmZvIiwib25BZnRlckFjdGlvbkV4ZWN1dGlvbiIsIm9SZXN1bHQiLCJmUmVqZWN0b3IiLCJfYWN0aW9uTmFtZSIsImN1c3RvbU1hc3NFZGl0U2F2ZSIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsImZpbmFsbHkiLCJoYW5kbGVQYXRjaFNlbnQiLCJvRXZlbnQiLCJpbnRlcm5hbENvbnRleHQiLCJ1aUNvbnRleHQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwiaGFuZGxlSW5saW5lRWRpdFBhdGNoU2VudCIsInNvdXJjZUJpbmRpbmciLCJvUGF0Y2hQcm9taXNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlU2VudCIsImV2ZW50IiwibmV3VGFzayIsImRlYnVnIiwiY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlIiwiZ2xvYmFsTW9kZWwiLCJmb3JjZURpc3BsYXlNb2RlIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXF1ZXN0T2JqZWN0IiwidXNlcnNJbnZpdGVkIiwibWUiLCJDb2xsYWJvcmF0aW9uVXRpbHMiLCJnZXRNZSIsImhhc01lIiwic2luZ2xlVXNlciIsIlVzZXJJRCIsImhhc0FjdGl2ZUVudGl0eSIsImxhc3RJbnZva2VkQWN0aW9uTmFtZSIsImlzTmV3QWN0aW9uRm9yU3RpY2t5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwic291cmNlQ29udHJvbCIsImdldFJlc291cmNlTW9kZWwiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm1lc3NhZ2VIYW5kbGVyIiwiZ2V0UGFnZUludGVybmFsTW9kZWwiLCJzZXRDcmVhdGlvbk1vZGUiLCJiQ3JlYXRpb25Nb2RlIiwicGFnZUludGVybmFsQ29udGV4dCIsIlVpTW9kZWxDb25zdGFudHMiLCJDcmVhdGVNb2RlIiwiRG9jdW1lbnRNb2RpZmllZCIsIm1vZGlmaWVkIiwiYmluZGluZyIsImF0dGFjaEV2ZW50Iiwic3VjY2VzcyIsImRyYWZ0U3RhdHVzIiwiZWRpdE1vZGUiLCJpc0NyZWF0aW9uIiwiZm9yY2VkIiwic2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsImFjdGlvbk5hbWUiLCJzdGlja3lTZXNzaW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJpbnRlcm5hbE1vZGVsIiwic2V0VGltZW91dCIsInNldE5hdmlnYXRpb25HdWFyZCIsInN1YnN0cmluZyIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJiaW5kIiwiaTE4bk1vZGVsIiwicmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwiZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbiIsImdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uIiwiaGFuZGxlU3RpY2t5T2ZmIiwiZGlzY2FyZE5hdmlnYXRpb25HdWFyZCIsInVucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzIiwiZ2V0SHR0cEhlYWRlcnMiLCJuYXZpZ2F0aW9uQ29udGV4dCIsInRhcmdldEhhc2giLCJpbm5lckFwcFJvdXRlIiwicm91dGVyUHJveHkiLCJsY2xIYXNoVHJhY2tlciIsImlzRGlydHkiLCJpc1Nlc3Npb25PbiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJ3YXJuaW5nRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsInJlc2V0Q2hhbmdlcyIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsImN1cnJlbnRWaWV3IiwibWV0YU1vZGVsRGF0YSIsIm1ldGFNb2RlbEFjdGlvbiIsImFjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiJEtleSIsIm9EYXRhIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImlzU2F2ZSIsImNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2ciLCJDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2ciLCJfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInJlbGF0ZWRDb250ZXh0cyIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwic2VuZCIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJvTW9kZWwiLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiaGlzdG9yeSIsImJhY2siLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBlcnNpc3RPUFNjcm9sbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJFZGl0Rmxvd0FjdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInZpc2libGVWaWV3SWRzIiwiX2dldEFsbFZpc2libGVWaWV3cyIsImFNZXNzYWdlcyIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJvUmVzcG9uc2UiLCJvQmluZGluZyIsImFLZXlzIiwib0N1cnJlbnREYXRhIiwiYlJldHVybmVkQ29udGV4dElzU2FtZSIsImV2ZXJ5Iiwic0tleSIsInNFbnRpdHlTZXROYW1lIiwiYVNlbWFudGljS2V5cyIsInBhdGhzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyZXF1ZXN0UHJvcGVydHkiLCJvdmVybG9hZEVudGl0eVR5cGUiLCJjb250ZXh0U2VnbWVudHMiLCJjdXJyZW50Q29udGV4dCIsInBvcCIsInVuc2hpZnQiLCJwYXJlbnRDb250ZXh0cyIsInBhdGhTZWdtZW50IiwicmV2ZXJzZSIsIm92ZXJsb2FkQ29udGV4dCIsImZpbmQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwicmlnaHRNb3N0Q29udGV4dFRvVXNlIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiY3JlYXRlTmV4dERvY3VtZW50IiwiYmluZGluZ0NvbnRleHRQYXRoIiwibGFzdEluZGV4T2YiLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgSVJvd0JpbmRpbmdJbnRlcmZhY2UgZnJvbSBcInNhcC9mZS9jb3JlL0lSb3dCaW5kaW5nSW50ZXJmYWNlXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21NZXNzYWdlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSwgQ29sbGFib3JhdGlvblV0aWxzLCBzaGFyZU9iamVjdCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgQ2FuY2VsUGFyYW1ldGVycywgQ3JlYXRlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IFRyYW5zYWN0aW9uSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMsIFJvb3RDb250ZXh0SW5mbywgU2libGluZ0luZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgVWlNb2RlbENvbnN0YW50cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IHR5cGUgeyBIaWRkZW5EcmFmdCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBEcmFmdFNpYmxpbmdQYWlyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBSb290Vmlld0Jhc2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9Sb290Vmlld0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgTWFjcm9UYWJsZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGQgZnJvbSBcInNhcC91aS9tZGMvTXVsdGlWYWx1ZUZpZWxkXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ3JlYXRpb25Sb3cgZnJvbSBcInNhcC91aS9tZGMvdGFibGUvQ3JlYXRpb25Sb3dcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQsIGRlZmF1bHQgYXMgT0RhdGFWNENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEVudGl0eVR5cGUgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHsgQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLCBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIH0gZnJvbSBcIi4uL2NvbnRyb2xzL1JlY29tbWVuZGF0aW9ucy9Db25maXJtUmVjb21tZW5kYXRpb25EaWFsb2dcIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgdHlwZSBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGlzRnVsZmlsbGVkIH0gZnJvbSBcIi4uL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25SZXN1bHQgfSBmcm9tIFwiLi9lZGl0Rmxvdy9vcGVyYXRpb25zL09EYXRhT3BlcmF0aW9uXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwiLi9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZTtcblxudHlwZSBTYXZlRG9jdW1lbnRQYXJhbWV0ZXJzID0ge1xuXHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcj86IGJvb2xlYW47XG5cdG1lcmdlUGF0Y2hEcmFmdD86IGJvb2xlYW47XG5cdHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbjtcblx0YmluZGluZ3M/OiBPRGF0YUxpc3RCaW5kaW5nW107XG59O1xuXG50eXBlIEludGVybmFsQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRkYXRhPzogb2JqZWN0O1xuXHR0YWJsZUlkPzogc3RyaW5nO1xuXHRvdXRib3VuZD86IHN0cmluZztcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjkwLjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcIilcbmNsYXNzIEVkaXRGbG93IGV4dGVuZHMgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgc3luY1Rhc2tzOiBQcm9taXNlPHVua25vd24+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0cHJpdmF0ZSBhY3Rpb25Qcm9taXNlPzogUHJvbWlzZTx7IGNvbnRyb2xJZD86IHN0cmluZzsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9PjtcblxuXHRwcml2YXRlIGNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/OiBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2c7XG5cblx0cHJpdmF0ZSBfaGlkZGVuRHJhZnQ6IEhpZGRlbkRyYWZ0IHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2U6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRJbnRlcmZhY2UoKTogQmFzZU9iamVjdCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldEludGVyZmFjZSgpO1xuXHR9XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIHRoZSBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBlZGl0YWJsZSBjb250ZXh0XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRjb25zdCBncm91cElkID0gXCJlZGl0R3JvdXBcIjtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQoY29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogcm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGxldCByaWdodG1vc3RDb250ZXh0ID0gdGhpcy5faXNGY2xFbmFibGVkKCkgPyAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IGNvbnRleHQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q29udGV4dCkgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0bW9zdENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlID0gdHJhbnNhY3Rpb25IZWxwZXIuZWRpdERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRncm91cElkXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHRJbmZvID0ge1xuXHRcdFx0XHRyb290U2libGluZ1BhdGhQcm9taXNlOiBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mb1Byb21pc2U7XG5cdFx0XHQvLyByaWdodG1vc3RDb250ZXh0ID09PSByb290Q29udGV4dCA9PiB3ZSdyZSBpbiBPUC4gSWYgbm90LCB3ZSdyZSBpbiBtdWx0aS1jb2x1bW4gbGF5b3V0IG9mIEZDTFxuXHRcdFx0Y29uc3QgY29tcHV0ZVNpYmxpbmdJbmZvID0gcmlnaHRtb3N0Q29udGV4dCAhPT0gcm9vdENvbnRleHQgfHwgKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDE7XG5cdFx0XHRpZiAoY29tcHV0ZVNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHNpYmxpbmdJbmZvUHJvbWlzZSA9IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gKGF3YWl0IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2UpIGFzIENvbnRleHQ7XG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRpZiAoY29tcHV0ZVNpYmxpbmdJbmZvICYmIGNvbnRleHRUb05hdmlnYXRlKSB7XG5cdFx0XHRcdGlmIChzaWJsaW5nSW5mbyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0XHRcIiRhdXRvXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gdGhpcy5fZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoY29udGV4dCwgbmV3RG9jdW1lbnRDb250ZXh0LCBzaWJsaW5nSW5mbyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShbXSk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uID0gZmFsc2U7XG5cdFx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAmJiBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdHNoYXJlT2JqZWN0KG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5mZXRjaENvbGxhYm9yYXRpdmVEcmFmdFVzZXJzUHJvbWlzZSA9IG5ld0RvY3VtZW50Q29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiXSxcblx0XHRcdFx0XHRcdFwiJGF1dG8uV29ya2Vyc1wiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckVkaXQoeyBjb250ZXh0OiBjb250ZXh0VG9OYXZpZ2F0ZSB9KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0cmVjcmVhdGVDb250ZXh0OiBmYWxzZSxcblx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHQvLyBUaGUgc3RpY2t5T24gaGFuZGxlciBtdXN0IGJlIHNldCBhZnRlciB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiBkb25lLFxuXHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRsZXQgc3RpY2t5Q29udGV4dDogQ29udGV4dDtcblx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgdXNlZCB0byBiaW5kIHRoZSBwYWdlXG5cdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlU3RpY2t5T24oc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gV2UgY2hhbmdlIHRoZSBlZGl0IG1vZGUgYWZ0ZXIgdGhlIHBhZ2UgYmluZGluZyBoYXMgYmVlbiBkb25lLCBvdGhlcndpc2UgdGhlIGNyZWF0aW9uIG9mIGVtcHR5IHJvd3MgbWlnaHQgZmFpbCAoYXMgdGhlIHRhYmxlIGlzIHN0aWxsIG9uIHRoZSBhY3RpdmUgdmVyc2lvbilcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXksIG92ZXJyaWRlVUlEZWNpc2lvbjogb3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiB9KTtcblx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIHNpZGUgZWZmZWN0cyByZXF1aXJlZCBhZnRlciBkZWxldGluZyBhbiBvYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRoZSBkZWxldGVkIG9iamVjdCBiZWxvbmdzIHRvXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHBhcmVudCBvYmplY3Qgb2YgdGhlIGRlbGV0ZWQgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIHJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0aWYgKCFsaXN0QmluZGluZyB8fCAhcGFyZW50Q29udGV4dCB8fCBDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBzaWRlRWZmZWN0U2VydmljZSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgcGFyZW50Q29udGV4dCk7XG5cblx0XHRjb25zdCBzdGF0ZU1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBwYXJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgbmVlZCB0byByZWZyZXNoIHN0YXRlIG1lc3NhZ2VzIGZvciB0aGUgT2JqZWN0UGFnZSwgYXMgc29tZSBvZiB0aGVzZSBtZXNzYWdlcyBtaWdodCBiZSBhdHRhY2hlZFxuXHRcdC8vIHRvIGNoaWxkcmVuIG9mIGEgZGVsZXRlZCByb3cgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkIHlldCwgYW5kIHRoZXJlZm9yZSB0aGUgbW9kZWwgd291bGRuJ3QgY2xlYW4gdXAgdGhlc2UgbWVzc2FnZXNcblx0XHRpZiAoc3RhdGVNZXNzYWdlc1BhdGggJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3N0YXRlTWVzc2FnZXNQYXRoXSwgcGFyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqIEBwYXJhbSBjb250ZXh0c1RvRGVsZXRlIFRoZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0Y29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkOiBzdHJpbmc7XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0cGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpID8/IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdGxldCBpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSA9IFtdO1xuXHRcdGlmIChwYXJlbnRDb250cm9sPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlID0gY29udGV4dHNUb0RlbGV0ZS5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHR9XG5cdFx0aWYgKCFwYXJlbnRDb250cm9sKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBwYXJlbnRDb250cm9sIGFzIENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChwYXJhbWV0ZXJzPy5zZWxlY3RlZENvbnRleHRzPy5bMF0gPz8gY29udGV4dHNUb0RlbGV0ZVswXSkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0c1RvRGVsZXRlLCBwYXJhbWV0ZXJzKTtcblxuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRyb2wuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUgfSk7XG5cblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gcGFyZW50Q29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZS5sZW5ndGggPiAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRhYmxlQVBJLnJlbW92ZUVtcHR5Um93c01lc3NhZ2VzKGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3MocGFyZW50Q29udHJvbCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIGNvbnRleHRzVG9EZWxldGUpO1xuXG5cdFx0XHRyZXR1cm4gYXdhaXQgcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBXZSBzdGlsbCB3YW50IHRvIHJlZnJlc2ggdGhlIGxpc3RiaW5kaW5nIGluIGNhc2Ugd2UgZGVsZXRlZCBzb21lIGluZm9ybWF0aW9uIGJ1dCBub3QgZXZlcnl0aGluZyAoRHJhZnRzIGZvciBleGFtcGxlKVxuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmcsIHZpZXdCaW5kaW5nQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICogQHBhcmFtIHVwZGF0ZWRDb250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHVwZGF0ZVByb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHVwZGF0ZURvY3VtZW50KHVwZGF0ZWRDb250ZXh0OiBCaW5kaW5nIHwgQ29udGV4dCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9yaWdpbmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGlzRHJhZnQgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodXBkYXRlZENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB1cGRhdGVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCFpc0RyYWZ0IHx8ICFjdXJyZW50QmluZGluZ0NvbnRleHQgfHwgY3VycmVudEJpbmRpbmdDb250ZXh0ICE9PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UncmUgc3RpbGwgb24gdGhlIHNhbWUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0TmFtZSA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKTtcblx0XHRcdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG1ldGFNb2RlbCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzZW1hbnRpY0tleXM/Lmxlbmd0aCAmJlxuXHRcdFx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSAmJiAvLyBXZSBkb24ndCB1c2UgdGhlIHNlbWFudGljIGtleSBmb3IgYSBuZXcgZG9jdW1lbnQgKGNyZWF0aW9uKVxuXHRcdFx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljUGF0aCA9IGN1cnJlbnRTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChjdXJyZW50QmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdC8vIGN1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRpZiAoY3VycmVudFNlbWFudGljUGF0aCAmJiBjdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkKTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChzZWxlY3RlZENvbnRleHRzICYmIHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gT25lIHBhcmVudCBhdCBtb3N0ICEhXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgaW4gYSBUcmVlVGFibGUgd2l0aCAke3NlbGVjdGVkQ29udGV4dHMubGVuZ3RofSBwYXJlbnRzYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29udGV4dHM/Lmxlbmd0aCA9PT0gMSA/IHNlbGVjdGVkQ29udGV4dHNbMF0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIHNvdXJjZSAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBvciBhIHRhYmxlIGJ1aWxkaW5nIGJsb2NrIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6PGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycsIG9yICdEZWZlcnJlZCcgaXMgdXNlZDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSB3aXRoaW4gdGhlIHRhYmxlLiBOb3Qgc3VwcG9ydGVkIG9uIGEgTGlzdCBSZXBvcnQ8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uRGlhbG9nIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gdGhlIHRhYmxlLCB3aXRoIGEgZGlhbG9nIGFsbG93aW5nIHRvIHNwZWNpZnkgc29tZSBpbml0aWFsIHByb3BlcnR5IHZhbHVlcyAodGhlIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiBgY3JlYXRpb25EaWFsb2dGaWVsZHNgKVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50YWJsZUlkIElEIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYnVzeU1vZGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvblJvdyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIFRoZSBjb250ZXh0cyB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUgaW5pdGlhdGluZyB0aGUgY3JlYXRpb24uIFVzZWQgaW4gY2FzZSBvZiBhIFRyZWVUYWJsZSB0byBkZXRlcm1pbmUgdGhlIHBhcmVudCBjb250ZXh0IG9mIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlIFdoZW4gZW5hYmxlZCwgYW4gZXh0cmEgcmVxdWVzdCBjaGVja3MgaWYgYW55IGRyYWZ0cyBleGlzdCB0aGF0IHdlcmUgbmV2ZXIgc2F2ZWQuIElmIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgdGhlIG5ld2VzdCBvbmUgaXMgb3BlbmVkLiBJZiBubyB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIERlZmluZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZyB3aGVuIHRoZSBjcmVhdGlvbiBtb2RlIGlzIHNldCB0byAnQ3JlYXRpb25EaWFsb2cnLjxici8+VGhlIHZhbHVlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRzb3VyY2U6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcgfCBNYWNyb1RhYmxlLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdHNpbmdsZURyYWZ0Rm9yQ3JlYXRlPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0RhdGFMaXN0QmluZGluZyE6IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0bGV0IHBhcmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZm5MaXN0QmluZGluZyA9IGZ1bmN0aW9uIChpbnN0YW5jZTogRWRpdEZsb3csIGxpc3RCaW5kaW5nUGF0aDogc3RyaW5nKTogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRjb25zdCBkYXRhTW9kZWwgPSBpbnN0YW5jZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdGlmICghZGF0YU1vZGVsKSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGF0YU1vZGVsLmJpbmRMaXN0KGxpc3RCaW5kaW5nUGF0aCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHR9O1xuXG5cdFx0aWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlLmlzQSAmJiBzb3VyY2UuaXNBPElSb3dCaW5kaW5nSW50ZXJmYWNlPihcInNhcC5mZS5jb3JlLklSb3dCaW5kaW5nSW50ZXJmYWNlXCIpKSB7XG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gc291cmNlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdHNvdXJjZSA9IG9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0fVxuXG5cdFx0aWYgKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nRnJvbVBhdGggPSBmbkxpc3RCaW5kaW5nKHRoaXMsIHNvdXJjZSk7XG5cdFx0XHRcdGlmICghbGlzdEJpbmRpbmdGcm9tUGF0aCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gbGlzdEJpbmRpbmdGcm9tUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRkZWxldGUgbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIiAmJiBzb3VyY2UuaXNBICYmIHNvdXJjZS5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nID0gc291cmNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKG9EYXRhTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRleHQgPSB0aGlzLmdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKG1JblBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSB0aGlzLnJlc29sdmVDcmVhdGlvbk1vZGUobUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsIG9EYXRhTGlzdEJpbmRpbmcsIG1JblBhcmFtZXRlcnMuZGF0YSk7XG5cblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAoXG5cdFx0XHQobUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gbUluUGFyYW1ldGVycy5zaW5nbGVEcmFmdEZvckNyZWF0ZVxuXHRcdFx0XHQ6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3QoKVtcInNhcC5mZVwiXT8uYXBwPy5zaW5nbGVEcmFmdEZvckNyZWF0ZSkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcgPT09IG9EYXRhTGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSAmJlxuXHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkgIT09IG51bGxcblx0XHQpIHtcblx0XHRcdGNvbnN0IG5ld0JpbmRpbmcgPSBvRGF0YUxpc3RCaW5kaW5nLmdldE1vZGVsKCk/LmJpbmRMaXN0KFxuXHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRDb250ZXh0KCksXG5cdFx0XHRcdG5ldyBTb3J0ZXIoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9MYXN0Q2hhbmdlRGF0ZVRpbWVcIiwgdHJ1ZSksXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdGZpbHRlcnM6IFtcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIklzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiSGFzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRhbmQ6IHRydWVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXdCaW5kaW5nPy5yZXF1ZXN0Q29udGV4dHMoMCwgMSk7XG5cdFx0XHRpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZU5ld0NvbnRleHQocmVzdWx0WzBdLCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pLnRoZW4oKCkgPT4gbmV3QmluZGluZz8uZGVzdHJveSgpKTtcblx0XHRcdH1cblx0XHRcdG5ld0JpbmRpbmc/LmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRzb3VyY2UgYXMgc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyxcblx0XHRcdFx0cGFyZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlLFxuXHRcdFx0c291cmNlIGFzIHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0b0RhdGFMaXN0QmluZGluZyxcblx0XHRcdHBhcmVudENvbnRleHRcblx0XHQpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZUNyZWF0aW9uTW9kZShcblx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZTogc3RyaW5nLFxuXHRcdHZMaXN0QmluZGluZzogc3RyaW5nIHwgT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBJbnRlcm5hbENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0b0RhdGFMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5FeHRlcm5hbDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXh0ZXJuYWxEb2N1bWVudCh2TGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMub3V0Ym91bmQpO1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURlZmVycmVkRG9jdW1lbnQob0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dCwgcGFyYW1ldGVycy5kYXRhKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5jcmVhdGlvblJvd1xuXHRcdFx0XHRcdD8gdGhpcy5jcmVhdGVDcmVhdGVSb3dEb2N1bWVudCh7XG5cdFx0XHRcdFx0XHRcdGNyZWF0aW9uUm93OiBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93LFxuXHRcdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZFxuXHRcdFx0XHRcdCAgfSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRGlhbG9nSW5saW5lRG9jdW1lbnQoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuSW5saW5lLFxuXHRcdFx0XHRcdFx0dGFibGVJZDogcGFyYW1ldGVycy50YWJsZUlkLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpO1xuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZzpcblx0XHRcdFx0aWYgKG9EYXRhTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpb24gd2l0aCBkaWFsb2cgaW4gYW4gT2JqZWN0UGFnZVxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZyxcblx0XHRcdFx0XHRcdFx0dGFibGVJZDogcGFyYW1ldGVycy50YWJsZUlkLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkczogcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW9uIHdpdGggZGlhbG9nIGluIGEgTGlzdFJlcG9ydFxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURpYWxvZ0FuZFNhdmVEb2N1bWVudChcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFibGVJZDogcGFyYW1ldGVycy50YWJsZUlkLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkczogcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiByZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0XHRcdGJGcm9tRGVmZXJyZWQ6IHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCxcblx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjcmVhdGVBY3Rpb246IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udGV4dFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZ1xuXHRcdFx0XHQpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlICR7cmVzb2x2ZWRDcmVhdGlvbk1vZGV9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqRXhlY3V0ZXMgdGhlIG1hbmRhdG9yeSBjb25maWd1cmF0aW9uIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkLlxuXHQgKiBAcGFyYW0gcHJlcmVxdWlzaXRlIFByb21pc2Ugb2YgdGhlIGRvY3VtZW50IGNyZWF0aW9uIGFuZCB0aGUgZm9sbG93aW5nIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHBvc3REb2N1bWVudENyZWF0aW9uKHByZXJlcXVpc2l0ZTogUHJvbWlzZTxbQ29udGV4dCwgdW5rbm93bl0+LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmFtcyA9IGF3YWl0IHByZXJlcXVpc2l0ZTtcblx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHQgPSBwYXJhbXNbMF07XG5cdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7IC8vIFRoZSBjcmVhdGVNb2RlIGZsYWcgd2lsbCBiZSBzZXQgaW4gY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHQvLyBXb3JrYXJvdW5kIHRvIHRlbGwgdGhlIE9QIHRoYXQgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgTFJcblx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdFx0Y29uc3QgbmV3QWN0aW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIG5ld0FjdGlvbik7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykgfHxcblx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGxpc3RCaW5kaW5nKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGl0ZW0gaW4gYSBoaWVyYXJjaHkvYW5hbHl0aWNhbCB0YWJsZSBmcm9tIHRoZSBMaXN0UmVwb3J0IChzaW5jZSB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlKVxuXHRcdFx0XHQvLyAtLT4gd2Ugd2FudCB0byBmb3JjZSB0aGUgdXNlciB0byBlaXRoZXIgc2F2ZSBvciBkaXNjYXJkIHRoZSBkcmFmdCBiZWZvcmUgbGVhdmluZyB0aGUgT1Bcblx0XHRcdFx0dGhpcy5mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmcpO1xuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG5ld0RvY3VtZW50Q29udGV4dCkgJiZcblx0XHRcdFx0IXRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIHRoZSBzaGFyZSBhY3Rpb24gd2lsbCBiZSBleGVjdWVkIGxhdGVyIGFzIHNvb24gIGFzIHRoZSBwYWdlIGlzIGJvdW5kXG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2V4ZWN1dGVTaGFyZUFjdGlvbkZvckNvbGxhYm9yYXRpb25cIiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdmlhIHRoZSBjcmVhdGlvblJvdy5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgVGhlIGNyZWF0aW9uIHJvd1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVDcmVhdGVSb3dEb2N1bWVudChwYXJhbWV0ZXJzOiB7XG5cdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdGNyZWF0aW9uUm93OiBDcmVhdGlvblJvdztcblx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHR9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IGNyZWF0aW9uOiBQcm9taXNlPENvbnRleHQ+O1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdGNvbnN0IHRhYmxlID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRsZXQgbmF2aWdhdGlvbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdGlmICghdGFibGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YWJsZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRpZiAodGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJDcmVhdGlvblJvd1wiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dDb250ZXh0ID0gY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGRvY3VtZW50VmFsaWRhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGUpO1xuXHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRpZiAoY3JlYXRpb25Sb3cuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zeW5jVGFzayhkb2N1bWVudFZhbGlkYXRpb24pO1xuXHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5jcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXModmFsaWRhdGlvbk1lc3NhZ2VzLCB0YWJsZSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKSkudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBjcmVhdGlvblJvd1BheWxvYWQgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cblx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdC8vbW92ZWQgYWZ0ZXIgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyB0byBhdm9pZCBcIidjcmVhdGlvbicgdXNlIGJlZm9yZSBpbml0aWFsaXphdGlvblwiIGNvbnNvbGUgZXJyb3JzXG5cdFx0Ly9hZnRlciB2YWxpZGF0aW9uIGVycm9ycyBvY2N1cnJlZFxuXHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgocGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDApO1xuXHRcdH0pO1xuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdHRyeSB7XG5cdFx0XHRjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHQuLi5PYmplY3Qua2V5cyhjcmVhdGlvblJvd1BheWxvYWQpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0KHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eVBhdGgpID09PSAtMVxuXHRcdFx0XHRcdFx0XHQpIC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdC5tYXAoKHBhdGgpID0+ICh7IFtwYXRoXTogY3JlYXRpb25Sb3dQYXlsb2FkW3BhdGhdIH0pKVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogYXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCk7XG5cdFx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHRcdC8vIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvdywgbm8gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHRcdFx0aWYgKCFwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0Y29uc3QgY3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IGNyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdGNvbnN0IG5ld1RyYW5zaWVudENvbnRleHQgPSBjcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0Y3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRuZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKT8uY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHR9KTtcblx0XHRcdG5hdmlnYXRpb24gPSBjcmVhdGlvblJvd0NvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdHJldHVybiBhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0fVxuXHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgaW4gSW5saW5lIG1vZGUgb3Igd2l0aCBhIGNyZWF0aW9uIGlubGluZSBkaWFsb2cgKE9iamVjdCBwYWdlIGNhc2UpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGFibGVJZCBUaGUgaWQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgUGFyZW50IGNvbnRleHQgKGZvciBUcmVlVGFibGUpXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgSW50aWFsIGRhdGEgZm9yIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIEZpZWxkcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSB8IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZztcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblx0XHRpZiAodGFibGU/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0YWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY3JlYXRlQ29tcGxldGVkXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IGNyZWF0aW9uO1xuXHRcdFx0XHRjb25zdCBjb250ZXh0SW5kZXggPSBuZXdDb250ZXh0LmdldEluZGV4KCk7XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGF0YSA9IGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBjcmVhdGVJblBsYWNlPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRjb25zdCBpc0NyZWF0ZUluUGxhY2UgPSBhZ2dyZWdhdGlvbkRhdGE/LmNyZWF0ZUluUGxhY2UgPz8gZmFsc2U7XG5cblx0XHRcdFx0aWYgKGNvbnRleHRJbmRleCAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0dGFibGU/LmZvY3VzUm93KGNvbnRleHRJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNDcmVhdGVJblBsYWNlKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIGNyZWF0ZSBpbi1wbGFjZSBtb2RlIChzZXJ2ZXIgcG9zaXRpb24pLCBkaXNwbGF5IGEgd2FybmluZyBtZXNzYWdlIGluIGNhc2UgdGhlIG5ld2x5IGNyZWF0ZWQgbm9kZSBpc24ndCB2aXNpYmxlXG5cdFx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3codGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLmdldFRleHQoXCJDX05FV19FTEVNRU5UX05PVF9ESVNQTEFZRURcIikpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSAmJiAhaXNDcmVhdGVJblBsYWNlKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIHRyZWUgdGFibGUsIHdlIGFsc28gc2Nyb2xsIHRvIGtlZXAgdGhlIHBhcmVudCB2aXNpYmxlXG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IG5ld0NvbnRleHQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRDb250ZXh0Py5nZXRJbmRleCgpO1xuXHRcdFx0XHRcdGlmIChwYXJlbnRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KHBhcmVudEluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YWJsZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhsaXN0QmluZGluZyk7XG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdHtcblx0XHRcdFx0Ly9DaGVjayBpZiBBbGwgcGFyYW1ldGVycyBhcmUgbmVlZGVkXG5cdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRidXN5TW9kZTogXCJMb2NhbFwiLCAvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdGJ1c3lJZDogKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkLFxuXHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCB0aGlzLnN5bmNUYXNrKGNyZWF0aW9uKV0pLCBsaXN0QmluZGluZyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB2aWEgYSBkaWFsb2cgYW5kIHNhdmVzIGl0IGltbWVkaWF0ZWx5IChMaXN0UmVwb3J0IGNhc2UpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFRoZSBuZXcgZG9jdW1lbnQgaXMgY3JlYXRlZCBhdCB0aGUgZW5kXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50YWJsZUlkIFRoZSBpZCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBQYXJlbnQgY29udGV4dCAoZm9yIFRyZWVUYWJsZSlcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBJbnRpYWwgZGF0YSBmb3IgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgRmllbGRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY3JlYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fSxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgdGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdHRhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHRhYmxlPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHR0YWJsZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc2F2ZWREb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgYWZ0ZXJDcmVhdGVJbkRpYWxvZyA9IGFzeW5jIChuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckNyZWF0ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdC8vIEVycm9ycyBpbiBvbkFmdGVyQ3JlYXRlIGFyZSBub3QgY2F1c2luZyB0aGUgb3ZlcmFsbCBmbG93IHRvIGZhaWxcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgYWZ0ZXIgY3JlYXRpb246IFwiICsgZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdFx0c2F2ZWREb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFtdLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRydWVcblx0XHRcdCk7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdFx0Y29udGV4dDogc2F2ZWREb2N1bWVudENvbnRleHRcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBFcnJvcnMgaW4gb25BZnRlclNhdmUgYXJlIG5vdCBjYXVzaW5nIHRoZSBvdmVyYWxsIGZsb3cgdG8gZmFpbFxuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciBhZnRlciBzYXZlOiBcIiArIGVycm9yKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgVHJlZVRhYmxlLCB3ZSBkb24ndCB1c2UgdGhlIGxpc3RCaW5kaW5nIGZyb20gdGhlIExpc3RSZXBvcnQgdG8gY3JlYXRlIHRoZSBuZXcgaXRlbSxcblx0XHRcdFx0Ly8gU28gd2UgY2FuJ3Qga25vdyB0aGUgcG9zaXRpb24gb2YgdGhlIG5ldyBpdGVtIGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHQvLyAtLT4gV2UgcmVmcmVzaCB0aGUgdGFibGUgYW5kIHNjcm9sbCB0byB0aGUgcGFyZW50IHBvc2l0aW9uXG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRJbmRleCA9IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dD8uZ2V0SW5kZXgoKTtcblx0XHRcdFx0XHR0YWJsZUFQSS5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0aWYgKHBhcmVudEluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgocGFyZW50SW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIGZsYXQgdGFibGUsIHdlIGNhbiBzY3JvbGwgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbVxuXHRcdFx0XHRjb25zdCBpdGVtSW5kZXggPSBzYXZlZERvY3VtZW50Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRpZiAoaXRlbUluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlbUluZGV4ID49IDApIHtcblx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChpdGVtSW5kZXgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdGFmdGVyQ3JlYXRlQ2FsbEJhY2s6IGFmdGVyQ3JlYXRlSW5EaWFsb2csXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nLFxuXHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQsXG5cdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdH0sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCB0aGlzLnN5bmNUYXNrKGNyZWF0aW9uKV0pO1xuXHRcdGlmIChzYXZlZERvY3VtZW50Q29udGV4dCAmJiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyAhPT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHNhdmVkRG9jdW1lbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRlZmZlcmVkIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgT3B0aW9uYWwgcGFyZW50IGNvbnRleHQgd2hlbiBjcmVhdGluZyBhIG5vZGUgaW4gVHJlZVRhYmxlXG5cdCAqIEBwYXJhbSBkYXRhXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEZWZlcnJlZERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQsIGRhdGE/OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVyczogeyBtb2RlOiBcIkRlZmVycmVkXCIsIHBhcmVudENvbnRleHQsIGxpc3RCaW5kaW5nLCBkYXRhIH0sXG5cdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHR9KTtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3luYyBvciBhc3luYyBkb2N1bWVudC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIHN5bmMgb3IgYXN5bmMgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFRoaXMgZG9jdW1lbnQgaXMgY3JlYXRlZCBhZnRlciBhIGRlZmZlcmVkIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiAgVGhlIGNyZWF0ZSBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBjcmVhdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgIERhdGEgdG8gc2F2ZSBvbiB0aGUgbmV3IGRvY3VtZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBUaGUgc2lkZUVmZmVjdHMgYXJlIHJlcXVlc3RlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlU3luY0FzeW5jRG9jdW1lbnQoXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG5hdmlnYXRpb246IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHJvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0Y29uc3QgY3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKClcblx0XHRcdC5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQuLi5wYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdC4uLntcblx0XHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZSxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0XHQudGhlbigobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJiBuZXdEb2N1bWVudENvbnRleHQgJiYgbmV3RG9jdW1lbnRDb250ZXh0LmdldEJpbmRpbmcoKSAhPT0gbGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBJbiBGQ0wgY2FzZSwgaWYgdGhlIG5ldyBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBhbiBhY3Rpb24gKG5vdCB3aXRoIHRoZSBzdGFuZGFyZCBQT1NUIGNyZWF0ZSksIHdlIG5lZWQgdG8gcmVmcmVzaFxuXHRcdFx0XHRcdC8vIHRoZSBvcmlnaW5hbCBsaXN0QmluZGluZyBzbyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdCAodGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGxpc3RCaW5kaW5nIGZvciBzdGFuZGFyZCBjcmVhdGUpXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW52b2NhdGlvbiBjb21lcyBmcm9tIGEgZGVmZXJyZWQgY3JlYXRpb24gb3IgaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93XG5cdFx0aWYgKHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCAhPT0gdHJ1ZSAmJiAhcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2lkZUVmZmVjdHMobGlzdEJpbmRpbmcsIGNyZWF0aW9uKTtcblx0XHR9XG5cblx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5Bc3luYykge1xuXHRcdFx0bmF2aWdhdGlvbiA9IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJBc3luY1wiLCBjcmVhdGVDb250ZXh0UHJvbWlzZTogY3JlYXRpb24gfSxcblx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb24udGhlbihhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdGlmICghbmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3QgY29yZVJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRcdFx0XHRyZXR1cm4gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHQvLyBhcyB3ZSdyZSBhbHJlYWR5IG9uIHRoZSBjb3JyZXNwb25kaW5nIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRjb25zdCBuYXZQYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWUsXG5cdFx0XHRcdFx0XHR0cmFuc2llbnQ6XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZykgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gPyB0cnVlIDogdW5kZWZpbmVkXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWRcblx0XHRcdFx0XHRcdD8gcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG5ld0RvY3VtZW50Q29udGV4dCwgbmF2UGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogcm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMucG9zdERvY3VtZW50Q3JlYXRpb24oUHJvbWlzZS5hbGwoW2NyZWF0aW9uLCBuYXZpZ2F0aW9uXSksIGxpc3RCaW5kaW5nKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0Ly8gY3JlYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHVzZXIgb3IgZmFpbGVkIGluIGJhY2tlbmQgPT4gaW4gY2FzZSB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0cmFuc2llbnQgY29udGV4dCBiZWZvcmUsIG5hdmlnYXRlIGJhY2tcblx0XHRcdC8vIHRoZSBzd2l0Y2gtc3RhdGVtZW50IGFib3ZlIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgdGhpcyBoYXBwZW5zIGluIGNyZWF0aW9uTW9kZXMgZGVmZXJyZWQgYW5kIGFzeW5jLiBCdXQgaW4gZmFjdCwgaW4gdGhlc2UgY2FzZXMgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gZnJvbSByb3V0ZU1hdGNoZWQgaW4gT1AgY29tcG9uZW50XG5cdFx0XHQvLyBjcmVhdGVEZWZlcnJlZERvY3VtZW50IGlzIHRyaWdnZXJlZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nLFxuXHRcdFx0XHRcdENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQsXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZFxuXHRcdFx0XHRdLmluY2x1ZGVzKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBleHRlcm5hbCBkb2N1bWVudC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBvdXRib3VuZCBUaGUgb3V0Ym91bmQgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZUV4dGVybmFsRG9jdW1lbnQobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsIG91dGJvdW5kPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0aWYgKG91dGJvdW5kKSB7XG5cdFx0XHRpZiAodHlwZW9mIGxpc3RCaW5kaW5nICE9PSBcInN0cmluZ1wiICYmIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgXCJFeHRlcm5hbFwiIHdpdGggYSBUcmVlVGFibGVgKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcjtcblx0XHRcdGNvbnN0IGNyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5iYXNlLmdldFZpZXcoKSwgbGlzdEJpbmRpbmcpO1xuXHRcdFx0Y29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChjb250cm9sbGVyLCBvdXRib3VuZCwgdW5kZWZpbmVkLCBjcmVhdGVQYXRoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgU2lkZUVmZmVjdHMgdG8gZXhlY3V0ZSBhZnRlciB0aGUgZG9jdW1lbnQgY3JlYXRpb24uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gY3JlYXRpb25Qcm9taXNlIFRoZSBwcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBTaWRlRWZmZWN0cyBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGhhbmRsZVNpZGVFZmZlY3RzID0gYXN5bmMgKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCBjcmVhdGlvblByb21pc2U7XG5cdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdGF3YWl0IG5ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykgJiYgdmlld0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgY3VzdG9tIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIHRoZSBjcmVhdGlvblJvdy5cblx0ICogQHBhcmFtIHZhbGlkYXRpb25NZXNzYWdlcyBUaGUgZXJyb3IgbWVzc2FnZXMgZm9ybSB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0YXJnZXRlZCBieSB0aGUgbWVzc2FnZXNcblx0ICovXG5cdGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyA9ICh2YWxpZGF0aW9uTWVzc2FnZXM6IHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10sIHRhYmxlOiBUYWJsZSk6IHZvaWQgPT4ge1xuXHRcdGNvbnN0IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKTtcblx0XHRjb25zdCBjdXN0b21WYWxpZGl0eSA9IHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRjb25zdCBjdXN0b21NZXNzYWdlczogQ3VzdG9tTWVzc2FnZVtdID0gW107XG5cdFx0bGV0IGZpZWxkQ29udHJvbDtcblx0XHRsZXQgZmluYWxUYXJnZXQ6IHN0cmluZztcblxuXHRcdC8vIFJlbW92ZSBleGlzdGluZyBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRjb25zdCBvbGRNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRDb2RlKCkgPT09IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbik7XG5cdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKG9sZE1lc3NhZ2VzKTtcblxuXHRcdHZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKCh2YWxpZGF0aW9uTWVzc2FnZSkgPT4ge1xuXHRcdFx0Ly8gSGFuZGxlIEJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0aWYgKHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXQpIHtcblx0XHRcdFx0ZmllbGRDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRmaW5hbFRhcmdldCA9IGAke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7ZmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQhTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gZmluYWxUYXJnZXQpKS5sZW5ndGhcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlOiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0Y29kZTogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0ZW50OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBmaW5hbFRhcmdldFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIEFkZCBjb250cm9sSWQgaW4gb3JkZXIgdG8gZ2V0IHRoZSBmb2N1cyBoYW5kbGluZyBvZiB0aGUgZXJyb3IgcG9wb3ZlclxuXHRcdFx0XHRjb25zdCBleGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiBtZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gZmluYWxUYXJnZXQpKTtcblx0XHRcdFx0ZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKGN1c3RvbVZhbGlkaXR5W3ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSBVbmJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0Y29kZTogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdHRleHQ6IHZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3Jcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoY3VzdG9tTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRjdXN0b21NZXNzYWdlczogY3VzdG9tTWVzc2FnZXNcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogUmVzb2x2ZXMgdGhlIGNyZWF0aW9uIG1vZGVcblx0ICogUHJvdmlkZXMgdGhlIGV4cGVjdGVkIGNyZWF0aW9uIG1vZGU6XG5cdCAqIC0gcHJlc2VydmVzIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZSB3aGVuIHRoaXMgb25lIGlzIG5vdCBhIE5ld1BhZ2Vcblx0ICogLSBjYWxjdWxhdGVzIHRoZSBuZXcgb25lIGlmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGEgTmV3UGFnZS5cblx0ICogQHBhcmFtIGluaXRpYWxDcmVhdGlvbk1vZGUgVGhlIGluaXRpYWwgY3JlYXRpb24gbW9kZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gY3JlYXRlRGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciBvYmplY3QgY3JlYXRpb25cblx0ICogQHJldHVybnMgVGhlIG5ldyBjcmVhdGlvbiBtb2RlXG5cdCAqL1xuXHRyZXNvbHZlQ3JlYXRpb25Nb2RlID0gKGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZywgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG5cdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHQvLyB1c2UgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlXG5cdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChsaXN0QmluZGluZyk7XG5cdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBkYXRhTW9kZWxMaXN0QmluZGluZ1BhdGgudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCB8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHQvLyBpZiBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGlzIHByZXNlbnQsIHRoZW4gY3JlYXRpb24gaXMgJ0RlZmVycmVkJ1xuXHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdG5ld0FjdGlvbiA9IChcblx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0PyBlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdDogZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdFx0XHRcdFx0KT8uTmV3QWN0aW9uPy50b1N0cmluZygpO1xuXG5cdFx0XHRcdGlmIChuZXdBY3Rpb24gJiYgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVR5cGUuYWN0aW9uc1tuZXdBY3Rpb25dLnBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGNyZWF0aW9uUGFyYW1ldGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0aWYgKGNyZWF0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuQXN5bmM7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICovXG5cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkudmFsaWRhdGVEb2N1bWVudChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIHRoZSByZXN1bHQgb2Zcblx0ICogYSBjcmVhdGlvbiByb3cncyBjdXN0b20gdmFsaWRhdGlvbiBhcyBhIHByb21pc2UuIElmIG5vIGNyZWF0aW9uIHJvdyBpcyBpbnZvbHZlZFxuXHQgKiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlLlxuXHQgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHdpdGggdGhlIGNyZWF0aW9uUm93XG5cdCAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZVxuXHQgKi9cblx0Z2V0Q3JlYXRpb25Sb3dWYWxpZGF0aW9uRnVuY3Rpb24odGFibGU6IFRhYmxlIHwgdW5kZWZpbmVkKTogKCkgPT4gUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZT8uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRpZiAoY3JlYXRpb25Sb3cgJiYgdGFibGUpIHtcblx0XHRcdHJldHVybiBhc3luYyAoKTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0aW9uUm93T2JqZWN0cyA9IChjcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldE9iamVjdCgpO1xuXHRcdFx0XHRkZWxldGUgY3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVEb2N1bWVudCh0YWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRkYXRhOiBjcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIilcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gYXN5bmMgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBkb2N1bWVudHNcblx0ICogQHBhcmFtIGRhdGFGb3JDcmVhdGUgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudHNcblx0ICogQHBhcmFtIGNyZWF0ZUF0RW5kIFRydWUgaWYgdGhlIG5ldyBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBpc0Zyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBiZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gY3JlYXRlQXNJbmFjdGl2ZSBUcnVlIGlmIHRoZSBjb250ZXh0cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYXMgaW5hY3RpdmVcblx0ICogQHBhcmFtIHJlcXVlc3RTaWRlRWZmZWN0cyBUcnVlIGJ5IGRlZmF1bHQsIGZhbHNlIGlmIFNpZGVFZmZlY3RzIHNob3VsZCBub3QgYmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcblx0XHRjcmVhdGVBdEVuZDogYm9vbGVhbixcblx0XHRpc0Zyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbixcblx0XHRjcmVhdGVBc0luYWN0aXZlID0gZmFsc2UsXG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPENvbnRleHRbXT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cyA9IHJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhcmdldExpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgbWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0aWYgKHRhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHt0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpfS8ke3RhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKHRhcmdldExpc3RCaW5kaW5nKTtcblxuXHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdGNvbnN0IGNyZWF0aW9uUHJvbWlzZXMgPSBkYXRhRm9yQ3JlYXRlLm1hcChhc3luYyAocHJvcGVydHlWYWx1ZXMpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyA9IHsgZGF0YToge30sIHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpIH07XG5cblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuaW5hY3RpdmUgPSBjcmVhdGVBc0luYWN0aXZlO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke21ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0XHRcdCFwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmRhdGEhW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0dGFyZ2V0TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycyxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0aXNGcm9tQ29weVBhc3RlXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgY3JlYXRlZENvbnRleHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY3JlYXRpb25Qcm9taXNlcyk7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUodGFyZ2V0TGlzdEJpbmRpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGNyZWF0ZWRDb250ZXh0cy5maWx0ZXIoKG5ld0NvbnRleHQpID0+ICFuZXdDb250ZXh0LmlzSW5hY3RpdmUoKSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChhY3RpdmVDb250ZXh0cy5tYXAoYXN5bmMgKG5ld0NvbnRleHQpID0+IG5ld0NvbnRleHQuY3JlYXRlZCgpKSk7XG5cblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAocmVxdWVzdFNpZGVFZmZlY3RzICYmICFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2ZUNvbnRleHRzKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiB1bmtub3duW10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKFwiQWZ0ZXJBc3luY1wiKVxuXHRhc3luYyBvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURpc2NhcmQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSBhY3Rpb24gZXhlY3V0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRXhlY3V0ZUFjdGlvblxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBhY3Rpb24gZXhlY3V0aW9uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVFeGVjdXRlQWN0aW9uKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfCBDb250ZXh0IHwgbnVsbCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlclNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IHdlIG9idGFpbmVkIGFmdGVyIHNhdmluZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIGNvbnRleHQgb2J0YWluZWQgYWZ0ZXIgZGlzY2FyZGluZyB0aGUgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgd2UgZGlzY2FyZGVkIGEgbmV3IG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBJbmRpY2F0ZXMgd2hldGhlciBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGlnbm9yZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiBTYXZlIGR1cmluZyBhbiBJbmxpbmUgY3JlYXRpb25cblx0Ly8gQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIExpc3QgYmluZGluZ3Mgb2YgdGhlIHRhYmxlcyBpbiB0aGUgdmlldy5cblx0Ly8gQm90aCBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgZm9yIHRoZSBzYW1lIHB1cnBvc2UuIFVzZXIgY2FuIGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNyZWF0aW9uIHJvdyhzKSBidXQgZG9lcyBub3QgJ0FkZCByb3cnLCBpbnN0ZWFkIGNsaWNrcyBTYXZlLlxuXHQvLyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBpbiB0aGUgdmlldy5cblxuXHQvKipcblx0ICogU2F2ZXMgYSBuZXcgZG9jdW1lbnQgYWZ0ZXIgY2hlY2tpbmcgaXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogU2F2ZURvY3VtZW50UGFyYW1ldGVycyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHNhdmVEb2N1bWVudCBpcyBjYWxsZWQgZnJvbSBpbmxpbmUgZWRpdCBrZXlib2FyZCBzaG9ydGN1dFxuXHRcdGlmIChcblx0XHRcdCF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpICYmXG5cdFx0XHR0aGlzLmJhc2UuaW5saW5lRWRpdEZsb3c/LmlzSW5saW5lRWRpdFBvc3NpYmxlKCkgJiZcblx0XHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzSW5saW5lRWRpdEFjdGl2ZVwiKVxuXHRcdCkge1xuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmlubGluZUVkaXRTYXZlKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncyBhcyBPRGF0YUxpc3RCaW5kaW5nW107XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHRcdC8vIGlzIHNlbnQgdG8gdGhlIGJhY2tlbmRcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQgIT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbigpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiByb290Q29udGV4dCB9KTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB8fFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdFxuXHRcdFx0KSB7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdCA/IG9Db250ZXh0IDogKHJvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFeGVjdXRlIHRoZSByZWdpc3RlcmVkIGRlZmVycmVkIFNpZGVFZmZlY3RzIHdoaWNoIGhhdmUgbm90IGJlIGV4ZWN1dGVkIHlldCBmb3IgdGhlIHBhZ2UgY29udGV4dFxuXHRcdFx0Ly8gQ2FuIG9jY3VyIHdoZW4gc2hvcnRjdXQgaXMgdXNlZCB0byBzYXZlIHRoZSBkb2N1bWVudC5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5fc2lkZUVmZmVjdHMuaGFuZGxlUGFnZUNoYW5nZUNvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0XHQvLyBUaGUgJGF1dG8gcXVldWUgY2FuIG9ubHkgaGF2ZSBwZW5kaW5nIGNoYW5nZXMgYXQgdGhpcyBwb2ludCB3aGVuIFNBVkUgd2FzIGNsaWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hhbmdpbmcgYSBmaWVsZC5cblx0XHRcdC8vIEluIHRoaXMgY2FzZSB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHN1Ym1pdCBiYXRjaCBzaG91bGQgbm90IGNyZWF0ZSBhIHNlcGFyYXRlIGJhdGNoIHJlcXVlc3QuXG5cdFx0XHQvLyBJdCBpcyBkb25lIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHBhdGNoLCBkcmFmdHByZXBhcmUsIGRyYWZ0YWN0aXZhdGUgZWFjaCBoYXZlIHRoZWlyIG93biBjaGFuZ2VzZXRcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikgJiYgbVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0KSB7XG5cdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgYXMgYm9vbGVhbixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRjb250ZXh0OiBhY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyB1cGRhdGUgdGVsZW1ldHJ5IGRhdGEgZm9yIGhvdyBwYWdlIHdhcyBzYXZlZCBhbmQgdGhlbiBkbyBzdG9yaW5nIG9mIHRoaXMgZGF0YSB0byBiYWNrZW5kIHRocm91Z2ggdGhlIHN0b3JlRGF0YSBmdW5jdGlvblxuXHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5zdG9yZURhdGFGb3JUZWxlbWV0cnkocmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdoZW4gc2F2aW5nLCB0aGUgc2VtYW50aWMga2V5cyBtYXkgaGF2ZSBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBuZWVkIHRvIG1hbmFnZSB0aGUgc2VtYW50aWMgVVJMIGNoYW5nZSBpbiB0aGUgaGlzdG9yeVxuXHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRjb25zdCBuZXdTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoYWN0aXZlRG9jdW1lbnRDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRpZiAocHJldmlvdXNTZW1hbnRpY1BhdGggJiYgbmV3U2VtYW50aWNQYXRoICYmIHByZXZpb3VzU2VtYW50aWNQYXRoICE9PSBuZXdTZW1hbnRpY1BhdGgpIHtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBwcmV2aW91c1NlbWFudGljUGF0aCwgbmV3UGF0aDogbmV3U2VtYW50aWNQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSB8fCB0aGlzLl9oaWRkZW5EcmFmdD8uc3RheU9uQ3VycmVudFBhZ2VBZnRlclNhdmUpIHtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IGFjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHRydWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRpZiAoIShvRXJyb3IgJiYgKG9FcnJvciBhcyB7IGNhbmNlbGVkPzogYm9vbGVhbiB9KS5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGVkaXRhYmxlID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHN0YXJ0IHBvaW50IGFjdGl2ZSBkb2N1bWVudFxuXHRcdFx0ZWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmICghc2libGluZ0luZm8gJiYgb0NvbnRleHQgIT09IG9SaWdodG1vc3RDb250ZXh0KSB7XG5cdFx0XHRcdC8vIFRyeSB0byBjb21wdXRlIHNpYmxpbmcgaW5mbyBmb3IgdGhlIHJvb3QgY29udGV4dCBpZiBpdCBmYWlscyBmb3IgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHRcdC8vIC0tPiBJbiBjYXNlIG9mIEZDTCwgaWYgd2UgdHJ5IHRvIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgYnV0IGEgY2hpbGQgZW50aXR5IGhhcyBubyBzaWJsaW5nLCB0aGUgc3dpdGNoIHdpbGwgY2xvc2UgdGhlIGNoaWxkIGNvbHVtblxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIHsgZWRpdGFibGUsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjb250cm9sPzogQnV0dG9uO1xuXHRcdFx0Y2FuY2VsQnV0dG9uPzogQnV0dG9uO1xuXHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbjtcblx0XHRcdHNraXBCYWNrTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0Y29uc3QgY2FuY2VsUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyID09PSB0cnVlLFxuXHRcdFx0Y2FuY2VsQnV0dG9uOiAobVBhcmFtZXRlcnMuY29udHJvbCB8fCBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24pISxcblx0XHRcdGJlZm9yZUNhbmNlbENhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkXG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHx8XG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0XG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnQgPyBvQ29udGV4dCA6IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbmNlbFJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0Y2FuY2VsUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSAmJiAhcm9vdENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgOiB0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpIHx8IHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAvLyBJbiBzdGlja3kgbW9kZSB3ZSBhbHdheXMgYXNrIGZvciBjb25maXJtYXRpb25cblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHQuZm9yRWFjaCgodmlldykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChjb250ZXh0Py5pc0tlZXBBbGl2ZSgpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEaXNjYXJkKHtcblx0XHRcdFx0Y29udGV4dDogY2FuY2VsUmVzdWx0XG5cdFx0XHR9KTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9Db250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHJvb3RDb250ZXh0KTtcblx0XHRcdFx0XHRpc05ld0RvY3VtZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdDtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCh0aGlzLl9pc0ZjbEVuYWJsZWQoKSB8fCB0aGlzLl9oaWRkZW5EcmFmdD8uc3RheU9uQ3VycmVudFBhZ2VBZnRlckNhbmNlbCkgJiZcblx0XHRcdFx0XHRzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnQsIGFuZCBpdCdzIHRoZSBzYW1lIGFzIHRoZSBlZGl0ZWQgY29udGV4dFxuXHRcdFx0XHRcdC8vIFNvLCB3ZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBhcyBpdCBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZCB3aGVuIGNhbGxpbmcgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiBhbGwgdmlldydzIGNvbnRleHRzXG5cdFx0XHRcdFx0Ly8gZWFybGllciBpbiB0aGlzIG1ldGhvZFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhdGhpcy5faGlkZGVuRHJhZnQpIHtcblx0XHRcdFx0Ly9zaG93IERyYWZ0IGRpc2NhcmRlZCBtZXNzYWdlIHRvYXN0IG9ubHkgZm9yIGRyYWZ0IGVuYWJsZWQgYXBwc1xuXHRcdFx0XHR0aGlzLnNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0Um9vdENvbnRleHQoY29udGV4dDogQ29udGV4dCwgYmluZGluZ1BhcmFtZXRlcnM/OiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mb1tcInBhcmFtZXRlcnNcIl0pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0IHx8IHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHJldHVybiAoYXdhaXQgQ29tbW9uVXRpbHMuY3JlYXRlUm9vdENvbnRleHQoXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzXG5cdFx0XHRcdCkpIGFzIENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0O1xuXHR9XG5cblx0YXN5bmMgaXNSb290Q29udGV4dE5ldyhjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KGNvbnRleHQsIHsgJHNlbGVjdDogXCJIYXNBY3RpdmVFbnRpdHksSXNBY3RpdmVFbnRpdHlcIiB9KTtcblx0XHRyZXR1cm4gIXJvb3RDb250ZXh0LmdldE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKSAmJiAhcm9vdENvbnRleHQuZ2V0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdH1cblxuXHQvKipcblx0ICogQnJpbmdzIHVwIGEgbWVzc2FnZSB0b2FzdCB3aGVuIGEgZHJhZnQgaXMgZGlzY2FyZGVkLlxuXHQgKiBAcGFyYW0gaXNOZXdEb2N1bWVudCBUaGlzIGlzIGEgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBuZXcgb3IgYWxyZWFkeSBleGlzdHMuXG5cdCAqL1xuXHRzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50PzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0aWYgKGlzTmV3RG9jdW1lbnQgPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHt9LCB0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBpbiBzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSB3aGVuIG5vIGNvbnRleHQgaXMgcGFzc2VkLlxuXHQgKi9cblx0c2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0KCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlLCB7IGNsb3NlT25Ccm93c2VyTmF2aWdhdGlvbjogZmFsc2UgfSk7XG5cdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdHByaXZhdGUgaXNEcmFmdFJvb3QoY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5U2V0KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVycz86IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogYm9vbGVhbjtcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlLCBiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlIH0sXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5faXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChvQ29udGV4dCkgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIERlbGV0aW5nIGFuIGFjdGl2ZSBlbnRpdHkgd2hpY2ggaGFzIGEgZHJhZnQgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSBkaXNwbGF5ZWQgaW4gdGhlIExpc3RSZXBvcnQgKEZDTCBjYXNlKVxuXHRcdFx0XHQvLyAtLT4gbmVlZCB0byByZW1vdmUgdGhlIGRyYWZ0IGZyb20gdGhlIExSIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIGFjdGl2ZSB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBMaXN0QmluZGluZyBpcyBwcm9wZXJseSByZWZyZXNoZWRcblx0XHRcdFx0Ly8gVGhlIGNvbmRpdGlvbiAnb0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkJyBtYWtlcyBzdXJlIHRoZSBhY3RpdmUgdmVyc2lvbiBpc24ndCBhbHJlYWR5IGRpc3BsYXllZCBpbiB0aGUgTFJcblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSBhc3luYyAocGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZShwYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRQYXRoID0gYXdhaXQgc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0Q29udGV4dFRvUmVtb3ZlID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdFBhdGgpO1xuXHRcdFx0XHRcdFx0ZHJhZnRDb250ZXh0VG9SZW1vdmUucmVwbGFjZVdpdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXBsYWNpbmcgdGhlIGRyYWZ0IGluc3RhbmNlIGluIHRoZSBMUiBPRExCXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0Ly8gU2luZ2xlIG9iamV0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGFuIE9QIGhlYWRlciBidXR0b24gKG5vdCBmcm9tIGEgbGlzdClcblx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChjb250ZXh0QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdGlmIChjb250ZXh0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0Ly8gRXZlbiBpbiB0aGUgRkNMIGNhc2UsIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgbGlzdGJpbmRpbmcgaW4gdGhlIExSIChub3QgT1ApIHRvIHVwZGF0ZSB0aGUgY291bnRzIGluIHRoZSB0YWJzIGFuZCBxdWlja2ZpbHRlcnNcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcoY29udGV4dEJpbmRpbmcsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShjb250ZXh0QmluZGluZywgY29udGV4dEJpbmRpbmcuZ2V0Q29udGV4dCgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0YWNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50Py5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoW29Db250ZXh0XSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogW29Db250ZXh0XSB9KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudD8uZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuRGVlcGxpbmspIHtcblx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHAgaGFzIGJlZW4gbGF1bmNoZWQgd2l0aCBzZW1hbnRpYyBrZXlzLCBkZWxldGluZyB0aGUgb2JqZWN0IHdlJ3ZlIGxhbmRlZCBvbiBzaGFsbCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdFx0Ly8gdG8gdGhlIGFwcCB3ZSBjYW1lIGZyb20gKGV4Y2VwdCBmb3IgRkNMLCB3aGVyZSB3ZSBuYXZpZ2F0ZSB0byBMUiBhcyB1c3VhbClcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBFbHNlIG5hdmlnYXRlIGJhY2sgZnJvbSB0aGUgcGFnZS4gSW4gRkNMLCB0aGlzIGlzIGRvbmUgd2hlbiB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IGlzIGRlc3Ryb3llZCAoY2FsbGJhY2spXG5cdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdFx0Ly93ZSBuZWVkIHRvIHJlcXVlc3QgZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQgdGhlbiBicmluZyB0aGUgZGlhbG9nIGhlcmVcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzQ29udGludWUgPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKGZhbHNlKTtcblx0XHRcdGlmIChpc0NvbnRpbnVlID09PSBSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCB7IGNhbGxFeHRlbnNpb246IHRydWUgfSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pc05hdmlnYWJsZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250cm9sSWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmZlRnJhbWV3b3JrQ2FsbCBQUklWQVRFIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseSBvciBieSBhIGN1c3RvbSBjb2RlXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBJZiByZXNvbHZlZCwgdGhlIHByb21pc2UgcmV0dXJuczpcblx0ICogIC0gSWYgdGhlIHBhcmFtZXRlciBjb250ZXh0cyBpcyBhbiBhcnJheTogYW4gYXJyYXkgb2Ygb2JqZWN0cywgZWFjaCBvYmplY3QgY29udGFpbmluZyBhIGtleSBcInN0YXR1c1wiLCBhcyB3ZWxsIGFzIFwidmFsdWVcIiByZWZlcmVuY2luZyB0aGUgYWN0aW9uIHN0YXR1cyBhbmQgdGhlIGNvbnRleHRcblx0ICogIC0gSWYgdGhlIHBhcmFtZXRlciBjb250ZXh0cyBpcyBub3QgYW4gYXJyYXk6IGEgc2luZ2xlIGNvbnRleHRcblx0ICogVGhlIGNvbnRleHQocykgcHJvdmlkZWQgaW4gdGhlIHByb21pc2UgaXMgKGFyZSkgZWl0aGVyIHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCBvZiB0aGUgYWN0aW9uIG9yIHRoZSBib3VuZCBjb250ZXh0IGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0ZmVGcmFtZXdvcmtDYWxsPzogYm9vbGVhbjtcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IHt9XG5cdCk6IFByb21pc2U8XG5cdFx0fCB7XG5cdFx0XHRcdHZhbHVlOiBDb250ZXh0O1xuXHRcdFx0XHRzdGF0dXM6IFwiZnVsZmlsbGVkXCI7XG5cdFx0ICB9W11cblx0XHR8IENvbnRleHRcblx0PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRmUmVzb2x2ZXI6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdGZSZWplY3RvcjogRnVuY3Rpb247XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQoKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQSAmJiAobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHx8XG5cdFx0XHRBcnJheS5pc0FycmF5KG1JblBhcmFtZXRlcnMpIHx8XG5cdFx0XHRtRXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCA9IG1JblBhcmFtZXRlcnMgYXMgT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkO1xuXHRcdFx0bUluUGFyYW1ldGVycyA9IG1FeHRyYVBhcmFtcyB8fCB7fTtcblx0XHRcdGlmIChjb250ZXh0cykge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHR2aWV3OiBGRVZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRpc0JvdW5kPzogYm9vbGVhbjtcblx0XHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdFx0ZmVGcmFtZXdvcmtDYWxsPzogYm9vbGVhbjtcblx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCB2aWV3OiB0aGlzLmJhc2UuZ2V0VmlldygpIH0gfHwgeyB2aWV3OiB0aGlzLmJhc2UuZ2V0VmlldygpIH07XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCJcIiArIGNvbnZlcnRlZE1ldGFkYXRhLmVudGl0eUNvbnRhaW5lci5uYW1lKSkge1xuXHRcdFx0Ly8gVW5ib3VuZCBhY3Rpb25zIGFyZSBhbHdheXMgcmVmZXJlbmNlZCB2aWEgdGhlIGFjdGlvbiBpbXBvcnQgYW5kIHdlIGZvdW5kIHRoZSBFbnRpdHlDb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lIHNvXG5cdFx0XHQvLyBhbiB1bmJvdW5kIGFjdGlvbiBpcyByZWZlcmVuY2VkIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBObyBlbnRpdHkgY29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSwgc28gZWl0aGVyIGEgYm91bmQgb3Igc3RhdGljIGFjdGlvbiBpcyByZWZlcmVuY2VkIHdoaWNoIGlzIGFsc28gYm91bmQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgJiYgbVBhcmFtZXRlcnMuY29udGV4dHMgJiYgbVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgPSBtUGFyYW1ldGVycy5tb2RlbFxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0LmdldE1ldGFDb250ZXh0KChBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSA/IG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdIDogbVBhcmFtZXRlcnMuY29udGV4dHMpLmdldFBhdGgoKSlcblx0XHRcdFx0LmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdH1cblx0XHRsZXQgb0NvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH1cblxuXHRcdC8vIGlmIHN0aWNreSBzZXNzaW9uIGlzIGVuYWJsZWQgd2UgdHJpZ2dlciBhY3Rpb25zIHdpdGhvdXQgZVRhZ1xuXHRcdG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWcgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiKFwiKSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uICYmIG9Db250cm9sKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0YWJsZUFQSS5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgoXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCxcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCkge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyA9IHRoaXMuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuZ2V0SWQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUV4ZWN1dGVBY3Rpb24oeyBjb250ZXh0czogbVBhcmFtZXRlcnMuY29udGV4dHMgfSk7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHRcdFx0Y29uc3Qgc3VjY2Vzc0Z1bGxFeGVjdXRpb24gPSByZXNwb25zZS5maWx0ZXIoaXNGdWxmaWxsZWQpO1xuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCAhPT0gc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIEtlZXAgdGhlIHNhbWUgd29ya2Zsb3cgdGhhbiBiZWZvcmVcblx0XHRcdFx0Ly8gSWYgYXQgbGVhc3Qgb25lIHByb21pc2UgaXMgcmVqZWN0ZWQsIHdlIHJlamVjdCB0aGUgd2hvbGUgcHJvbWlzZVxuXHRcdFx0XHR0aHJvdyByZXNwb25zZTtcblx0XHRcdH1cblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uKSxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoXG5cdFx0XHRcdFx0QWN0aXZpdHkuQWN0aW9uLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzLFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRcdGxpc3RSZWZyZXNoZWQsXG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0LmdldE9iamVjdCgpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVzb2x2ZXIoc3VjY2Vzc0Z1bGxFeGVjdXRpb24pO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdFx0XHRXZSBzZXQgdGhlICh1cHBlcikgcGFnZXMgdG8gZGlydHkgYWZ0ZXIgYW4gZXhlY3V0aW9uIG9mIGFuIGFjdGlvblxuXHRcdFx0XHRcdFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0VGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHRPbmNlIHRoaXMgaXMgc3VwcG9ydGVkIHdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBwYWdlcyB0byBkaXJ0eSBhbnltb3JlIGFzIHRoZSBjb250ZXh0IGl0c2VsZlxuXHRcdFx0XHRcdGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0d2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHRhcyBpZiBpdCBpcyBjYWxsZWQgaW4gdGhlIGxpc3QgcmVwb3J0IGl0J3Mgbm90IG5lZWRlZCAtIGFzIHdlIGFueXdheSB3aWxsIHJlbW92ZSB0aGlzIGxvZ2ljXG5cdFx0XHRcdFx0d2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0d2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHRmaXJzdCBvbmUgYXMgdGhleSBhcmUgYW55d2F5IHNpYmxpbmdzXG5cdFx0XHRcdFx0Ki9cblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRpZiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgIT09IFwiTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlKSB7XG5cdFx0XHRcdGlmIChzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdD8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0XG5cdFx0XHRcdFx0XHQ6IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQ7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9mblZhbGlkQ29udGV4dHMgPSAoY29udGV4dHM6IENvbnRleHRbXSwgYXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdKTogQ29udGV4dFtdID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5jbHVkZXMoZWxlbWVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cylcblx0XHRcdFx0XHRcdD8gX2ZuVmFsaWRDb250ZXh0cyhtUGFyYW1ldGVycy5jb250ZXh0cywgbVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzKVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dD8uZ2V0UGF0aCgpICE9PSBjb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWVcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFjdGlvbiByZXR1cm5zIGEgZHJhZnQgY29udGV4dCwgd2UgYWxyZWFkeSB0YWtlIGNhcmUgZHVyaW5nIG5hdmlnYXRpb24gdG8gZWl0aGVyIGNyZWF0ZSBhIG5ld1xuXHRcdFx0XHRcdFx0XHQvLyAoZnVsbCBzY3JlZW4pIG9yIHRvIHVzZSB0aGUgbGlzdCBiaW5kaW5nIGNvbnRleHQgYWZ0ZXIgcmVmcmVzaCAoYW5kIG5vdCB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQpLlxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZHJhZnQgaXMgZGlzY2FyZGVkIG9yIGFjdGl2YXRlZCwgaGF2aW5nIHRoZSBjb250ZXh0IHN0aWxsIGFzIGRlcGVuZGVudCBjb250ZXh0IGNhdXNlIGlzc3Vlc1xuXHRcdFx0XHRcdFx0XHQvLyAoZS5nLiBpZiBhIHNpZGUgZWZmZWN0IGlzIHRyaWdnZXJlZCkuIFRoZXJlZm9yZSwgd2UgZGVzdHJveSB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgaGVyZSxcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRvIGJlIGNvbXBhdGlibGUgd2UgcmV0dXJuIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwYXRoLlxuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRcdFx0XHRcdFx0KGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgfHwgdGhpcy5faXNGY2xFbmFibGVkKCkpXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0QmluZGluZygpLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cblx0XHRcdC8vIEtlZXAgdGhpcyB3ZWlyZCByZXR1cm5lZCB2YWx1ZSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zXG5cdFx0XHQvLyBpbnZva2VBY3Rpb24gaXMgcHVibGljIGFuZCB3ZSBjYW4ndCBjaGFuZ2UgdGhlIHJldHVybmVkIHZhbHVlIGZvciB0aGUgYWN0aW9uXG5cdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycz8uY29udGV4dHMpICYmIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5tYXAoKG9SZXN1bHQpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4ub1Jlc3VsdCwgLi4ueyB2YWx1ZTogb1Jlc3VsdC52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gb1Jlc3VsdC52YWx1ZS5ib3VuZENvbnRleHQgfSB9O1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlamVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXJyID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBfYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckFjdGlvbkV4ZWN1dGlvbihfYWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly90byBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgb24gdGhlIG1hc3MgZWRpdCBzYXZlLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBJZiB5b3UgZGVjaWRlIHRvIGRvIHlvdXIgb3duIHNhdmUgcHJvY2Vzc2luZywgeW91IGNhbiByZXR1cm4gYHRydWVgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgc2F2ZSBiZWhhdmlvci5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZH0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGN1c3RvbU1hc3NFZGl0U2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmFDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0cyBmb3IgdGhlIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLm9VcGRhdGVEYXRhIEEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eVBhdGggYW5kIGl0cyB2YWx1ZVxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBleGVjdXRpb24sIGBmYWxzZWAgdG8ga2VlcCB0aGUgc3RhbmRhcmQgYmVoYXZpb3Jcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMzAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFzeW5jIGN1c3RvbU1hc3NFZGl0U2F2ZShfbVBhcmFtZXRlcnM6IHsgYUNvbnRleHRzOiBDb250ZXh0W107IG9VcGRhdGVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNlY3VyZWRFeGVjdXRpb24oXG5cdFx0Zm5GdW5jdGlvbjogRnVuY3Rpb24sXG5cdFx0bVBhcmFtZXRlcnM/OiB7XG5cdFx0XHRidXN5Pzoge1xuXHRcdFx0XHRzZXQ/OiBib29sZWFuO1xuXHRcdFx0XHRjaGVjaz86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0dXBkYXRlc0RvY3VtZW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJCdXN5U2V0ID0gbVBhcmFtZXRlcnM/LmJ1c3k/LnNldCA/PyB0cnVlLFxuXHRcdFx0YkJ1c3lDaGVjayA9IG1QYXJhbWV0ZXJzPy5idXN5Py5jaGVjayA/PyB0cnVlLFxuXHRcdFx0YlVwZGF0ZXNEb2N1bWVudCA9IG1QYXJhbWV0ZXJzPy51cGRhdGVzRG9jdW1lbnQgPz8gZmFsc2UsXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0YklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQgYXMgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhmbkZ1bmN0aW9uIGFzICgpID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQpOiB2b2lkIHtcblx0XHQvLyBJbiBjb2xsYWJvcmF0aXZlIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uLCBkaXNhYmxlIEVUYWcgY2hlY2sgZm9yIFBBVENIIHJlcXVlc3RzXG5cdFx0Y29uc3QgaW50ZXJuYWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3QgdWlDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwidWlcIik7XG5cdFx0Y29uc3QgaWdub3JlRVRhZyA9IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fCBpbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyh0cnVlKTtcblx0XHR9XG5cdFx0aWYgKHVpQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJpc0VkaXRhYmxlXCIpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gdGhlIHZpZXcgaXMgbm90IGluIGVkaXQgbW9kZSB0aGlzIG11c3QgYmUgaW5saW5lIGVkaXRcblx0XHRcdHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdy5oYW5kbGVJbmxpbmVFZGl0UGF0Y2hTZW50KG9FdmVudCk7XG5cdFx0fSBlbHNlIGlmICghaW50ZXJuYWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIHVua25vd24gYXMgT0RhdGFMaXN0QmluZGluZzsgLy8gRklYTUU6IFVJNSB0eXBlIHNheXMgdGhpcyBzaG91bGQgYmUgYW4gT0RhdGFDb250ZXh0QmluZGluZ1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaChcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChzb3VyY2VCaW5kaW5nLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZUNyZWF0ZVNlbnQoZXZlbnQ6IFVJNUV2ZW50PHsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBjb250ZXh0LmdldFBhdGgoKSk7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqL1xuXHRhc3luYyBzeW5jVGFzazxUPihuZXdUYXNrPzogKCgpID0+IFQpIHwgUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcyBhcyBQcm9taXNlPFQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIHVwZGF0ZXMgdGhlIFVJIGFuZCBpbnRlcm5hbCBtb2RlbHMgYWNjb3JkaW5nIHRoZSBlZGl0IG1vZGUgLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0YXN5bmMgY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdGlmICh0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9leGVjdXRlU2hhcmVBY3Rpb25Gb3JDb2xsYWJvcmF0aW9uXCIpKSB7XG5cdFx0XHRcdHNoYXJlT2JqZWN0KGNvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9leGVjdXRlU2hhcmVBY3Rpb25Gb3JDb2xsYWJvcmF0aW9uXCIsIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsIS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRcdGxldCBmb3JjZURpc3BsYXlNb2RlID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cblx0XHRcdFx0aWYgKGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkICYmIGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2U7XG5cdFx0XHRcdFx0Y29uc3QgdXNlcnNJbnZpdGVkID0gKGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyXCIpKSBhcyB7XG5cdFx0XHRcdFx0XHREcmFmdEVudGl0eVR5cGU6IHN0cmluZztcblx0XHRcdFx0XHRcdERyYWZ0VVVJRDogc3RyaW5nO1xuXHRcdFx0XHRcdFx0VXNlcklEOiBzdHJpbmc7XG5cdFx0XHRcdFx0fVtdO1xuXHRcdFx0XHRcdGNvbnN0IG1lID0gQ29sbGFib3JhdGlvblV0aWxzLmdldE1lKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpLFxuXHRcdFx0XHRcdFx0aGFzTWUgPSB1c2Vyc0ludml0ZWQ/LmZpbHRlcigoc2luZ2xlVXNlcikgPT4gc2luZ2xlVXNlci5Vc2VySUQgPT09IG1lLmlkKSA/PyBbXTtcblx0XHRcdFx0XHRpZiAoaGFzTWUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZvcmNlRGlzcGxheU1vZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9oYXNDb2xsYWJvcmF0aW9uQXV0aG9yaXphdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZmV0Y2hDb2xsYWJvcmF0aXZlRHJhZnRVc2Vyc1Byb21pc2UgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0aWYgKGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSAmJiAhZm9yY2VEaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0IHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBoYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFoYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCksIGNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIEludGVybmFsIG1ldGhvZCB0byBkZWxldGUgYSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGNvbnRleHQocykgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciBkZWxldGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRpdGxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy51blNhdmVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oXG5cdFx0Y29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nIH07XG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHM/OiBudW1iZXI7XG5cdFx0XHR1blNhdmVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRsb2NrZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/OiBEcmFmdFNpYmxpbmdQYWlyW107XG5cdFx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0Ly8gYXMgc2VsZWN0ZWQgY29udGV4dHMgbWF5IGluY2x1ZGUgaW5hY3RpdmUgY29udGV4dCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyBwYXJhbWV0ZXIgYWdhaW4gdG8gZW5zdXJlIGRlbGV0ZSBoZWxwZXIgd29ya3MgcHJvcGVybHlcblx0XHRcdHBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHR9XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgc2V0dGluZyBhbmQgcmVtb3Zpbmcgb2YgY29udGV4dHMgc2hvdWxkbid0IGJlIGluIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgYXQgYWxsXG5cdFx0Ly8gZm9yIHRoZSB0aW1lIGJlaW5nIEkga2VwdCBpdCBhbmQgcHJvdmlkZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB0byBub3QgYnJlYWsgc29tZXRoaW5nXG5cdFx0aWYgKHBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAoc291cmNlQ29udHJvbCAmJiAhc291cmNlQ29udHJvbC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGRlbGV0ZSBpcyB0cmlnZ2VyZWQgZnJvbSBhIE11bHRpVmFsdWVGaWVsZCwgd2UgZG9uJ3QgdXNlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IGFzIHRoZSBNVkYgZG9lc24ndCBoYXZlXG5cdFx0XHRcdC8vIHN1Y2ggYSBjb250ZXh0IG9mIGl0cyBvd24sIGFuZCB3ZSBkb24ndCB3YW50IHRvIHVzZSBpdHMgcGFyZW50IGNvbnRleHQgKGUuZy4gZnJvbSB0aGUgZW1iZWRkaW5nIFRhYmxlKVxuXHRcdFx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gc291cmNlQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5kZWxldGVEb2N1bWVudChjb250ZXh0cywgcGFyYW1ldGVycywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSwgcmVzb3VyY2VNb2RlbCwgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZU1vZGVsKCk6IFJlc291cmNlTW9kZWwge1xuXHRcdHJldHVybiBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTogdHlwZW9mIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0XHRyZXR1cm4gVHJhbnNhY3Rpb25IZWxwZXI7XG5cdH1cblxuXHRwcml2YXRlIGdldE1lc3NhZ2VIYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyIHtcblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UGFnZUludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJwYWdlSW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAqIEBwYXJhbSBiQ3JlYXRpb25Nb2RlIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdHByaXZhdGUgc2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBwYWdlSW50ZXJuYWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIikgYXMgQ29udGV4dDtcblx0XHR0aGlzLmdldFBhZ2VJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlLCBiQ3JlYXRpb25Nb2RlLCBwYWdlSW50ZXJuYWxDb250ZXh0LCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Qgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRnZXRDcmVhdGlvbk1vZGUoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGFnZUludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpIGFzIENvbnRleHQ7XG5cdFx0cmV0dXJuICEhcGFnZUludGVybmFsQ29udGV4dC5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkNyZWF0ZU1vZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZCBvciBub3QuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0aXNEb2N1bWVudE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZC5cblx0ICogQHBhcmFtIG1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkKG1vZGlmaWVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCBtb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGNyZWF0aW5nIGEgc3ViLW9iamVjdC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgb24gd2hpY2ggdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdC8vIFNldCB0aGUgbW9kaWZpZWQgZmxhZyBvbmx5IG9uIHJlbGF0aXZlIGxpc3RCaW5kaW5ncywgaS5lLiB3aGVuIGNyZWF0aW5nIGEgc3ViLW9iamVjdFxuXHRcdC8vIElmIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUsIHRoZW4gaXQncyBhIGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnQsIGFuZCBieSBkZWZhdWx0IGEgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBpc24ndCBjb25zaWRlcmVkIGFzIG1vZGlmaWVkXG5cdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICogQHBhcmFtIGJpbmRpbmcgT0RhdGEgbGlzdCBiaW5kaW5nIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGVFdmVudHMoYmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IHZvaWQge1xuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChiaW5kaW5nKTtcblx0XHRsZXQgbWVzc2FnZUhhbmRsaW5nS2V5OiBzdHJpbmc7XG5cblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdH0pO1xuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlIChkaXNwbGF5ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSkuXG5cdCAqIEBwYXJhbSBkcmFmdFN0YXR1cyBUaGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2Vcblx0ICovXG5cdHNldERyYWZ0U3RhdHVzKGRyYWZ0U3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIGRyYWZ0U3RhdHVzLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb2dyYW1taW5nIG1vZGVsIGZyb20gYSBiaW5kaW5nIG9yIGEgY29udGV4dC5cblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYmluZGluZyBvciBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogQ29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZWRpdCBtb2RlLlxuXHQgKiBAcGFyYW0gZWRpdE1vZGUgVGhlIGVkaXQgbW9kZVxuXHQgKiBAcGFyYW0gaXNDcmVhdGlvbiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbmV3bHkgY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRFZGl0TW9kZShlZGl0TW9kZT86IHN0cmluZywgaXNDcmVhdGlvbj86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoZWRpdE1vZGUpIHtcblx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIiwgZWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdGlmIChlZGl0TW9kZSAhPT0gXCJFZGl0YWJsZVwiKSB7XG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpc0NyZWF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoaXNDcmVhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGZsYWcgdG8gZm9yY2UgU2F2ZSBvciBEaXNjYXJkIHdoZW4gbGVhdmluZyBhIGRyYWZ0LlxuXHQgKiBAcGFyYW0gZm9yY2VkXG5cdCAqL1xuXHRwcml2YXRlIGZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZvcmNlZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIsIGZvcmNlZCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgd2Ugc2hvdWxkIGZvcmNlIHRoZSB1c2VyIHRvIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdCwgb3IgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgYWxsb3dlZC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBrZWVwaW5nIHRoZSBkcmFmdCBpcyBub3QgYWxsb3dlZFxuXHQgKi9cblx0c2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvZm9yY2VEcmFmdFNhdmVPckRpc2NhcmRcIikgPT09IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGFuIGFjdGlvbiBjb3JyZXNwb25kcyB0byBhIGNyZWF0ZSBhY3Rpb24gZm9yIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjdGlvbiBpcyBhIGNyZWF0ZSBhY3Rpb25cblx0ICovXG5cdHByaXZhdGUgaXNOZXdBY3Rpb25Gb3JTdGlja3koYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0Y29uc3Qgc3RpY2t5U2Vzc2lvbiA9IGVudGl0eVNldC5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkO1xuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/Lk5ld0FjdGlvbiA9PT0gYWN0aW9uTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucyAmJiBzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucy5pbmNsdWRlcyhhY3Rpb25OYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBUT0RPIE1vdmUgYWxsIHN0aWNreS1yZWxhdGVkIGJlbG93IHRvIGEgc3RpY2t5IHNlc3Npb24gbWFuYWdlciBjbGFzc1xuXG5cdC8qKlxuXHQgKiBFbmFibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBoYW5kbGVTdGlja3lPbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3QgaGFzaFRyYWNrZXIgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblxuXHRcdFx0XHQvLyBTZXQgYSBndWFyZCBpbiB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0Ly8gQSB0aW1lb3V0IGlzIG5lY2Vzc2FyeSwgYXMgd2l0aCBkZWZlcnJlZCBjcmVhdGlvbiB0aGUgaGFzaENoYW5nZXIgaXMgbm90IHVwZGF0ZWQgeWV0IHdpdGhcblx0XHRcdFx0Ly8gdGhlIG5ldyBoYXNoLCBhbmQgdGhlIGd1YXJkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IG9mIHRoZSByb3V0ZXIgcHJveHlcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0TmF2aWdhdGlvbkd1YXJkKGNvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdC8vIFNldHRpbmcgYmFjayBuYXZpZ2F0aW9uIG9uIHNoZWxsIHNlcnZpY2UsIHRvIGdldCB0aGUgZGljYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0XHRcdGF3YWl0IGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcywgY29udGV4dCkpO1xuXG5cdFx0XHRcdC8vIEF0dGFjaCBzdGlja3kgc2Vzc2lvbiBjYWxsYmFja3Ncblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHRhcHBDb21wb25lbnQucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzKFxuXHRcdFx0XHRcdHRoaXMuZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbCwgaGFzaFRyYWNrZXIpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihjb250ZXh0LCBpMThuTW9kZWwpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dCwgYXBwQ29tcG9uZW50KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9mZigpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5kaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQudW5yZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC51bnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcygpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsKTogdm9pZCB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCB0cnVlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIG1vZGVsLmdldEh0dHBIZWFkZXJzKHRydWUpW1wiU0FQLUNvbnRleHRJZFwiXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgRGlydHlTdGF0ZVByb3ZpZGVyIGluIHRoZSBTaGVsbC5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgbW9kZWwgXCJpbnRlcm5hbFwiXG5cdCAqIEBwYXJhbSBoYXNoVHJhY2tlciBIYXNoIHRyYWNrZXJcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBoYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChuYXZpZ2F0aW9uQ29udGV4dDogeyBpbm5lckFwcFJvdXRlOiBzdHJpbmcgfSk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG5hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIERpcnR5U3RhdGVQcm92aWRlciBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHRhcmdldEhhc2ggPSBuYXZpZ2F0aW9uQ29udGV4dC5pbm5lckFwcFJvdXRlO1xuXHRcdFx0XHRjb25zdCByb3V0ZXJQcm94eSA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgbGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgaXNEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgaXNTZXNzaW9uT24gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWlzU2Vzc2lvbk9uKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHN0aWNreSBzZXNzaW9uIHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBoYW5kLlxuXHRcdFx0XHRcdC8vIEV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghcm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaGFzaFRyYWNrZXIgPT09IHRhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChyb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQodGFyZ2V0SGFzaCkgfHwgcm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGFwcCwgZm9yIGV4YW1wbGUgYmFjayB0byB0aGUgbGlzdCByZXBvcnRcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RpcnR5KSB7XG5cdFx0XHRcdFx0Ly8gdGhlIEZMUCBkb2Vzbid0IGNhbGwgdGhlIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGFueW1vcmUgb25jZSBpdCdzIGRpcnR5LCBhcyB0aGV5IGNhbid0XG5cdFx0XHRcdFx0Ly8gY2hhbmdlIHRoaXMgZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzZXQgaXQgYmFjayB0byBub3QtZGlydHlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0RGlydHlGbGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYXNoVHJhY2tlciA9IGxjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGlzRGlydHk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBhIHN0aWNreSBzZXNzaW9uIHRpbWVzIG91dC5cblx0ICogQHBhcmFtIHN0aWNreUNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcGFyYW0gaTE4bk1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uKHN0aWNreUNvbnRleHQ6IENvbnRleHQsIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRyZXR1cm4gKCk6IHVuZGVmaW5lZCB8IGJvb2xlYW4gPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKHN0aWNreUNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgbWlzc2luZyBmb3IgU2Vzc2lvblRpbWVvdXQgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmVtb3ZlIHRyYW5zaWVudCBtZXNzYWdlcyBzaW5jZSB3ZSB3aWxsIHNob3dpbmcgb3VyIG93biBtZXNzYWdlXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0XHRjb25zdCB3YXJuaW5nRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19USVRMRX1cIixcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfTUVTU0FHRX1cIiB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0NPTU1PTl9ESUFMT0dfT0t9XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdHdhcm5pbmdEaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQod2FybmluZ0RpYWxvZyk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgb25Sb3V0ZU1hdGNoZWQgZXZlbnQgaW4gY2FzZSBvZiBzdGlja3kgZWRpdGlvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dDogQ29udGV4dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gKCk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3QgY3VycmVudEhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHQvLyBlaXRoZXIgY3VycmVudCBoYXNoIGlzIGVtcHR5IHNvIHRoZSB1c2VyIGxlZnQgdGhlIGFwcCBvciBoZSBuYXZpZ2F0ZWQgYXdheSBmcm9tIHRoZSBvYmplY3Rcblx0XHRcdGlmICghY3VycmVudEhhc2ggfHwgIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChjdXJyZW50SGFzaCkpIHtcblx0XHRcdFx0dGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpLmNsZWFyU2Vzc2lvbkNvbnRleHQoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuZHMgYSBzdGlja3kgc2Vzc2lvbiBieSBkaXNjYXJkaW5nIGNoYW5nZXMuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBpc0NyZWF0aW9uID0gdGhpcy5nZXRDcmVhdGlvbk1vZGUoKTsgLy8gU3RvcmUgdGhpcyB2YWx1ZSBpbiBhIHZhcmlhYmxlLCBhcyBpdCB3aWxsIGJlIHJlc2V0IGluIGhhbmRsZVN0aWNreU9mZlxuXHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7IC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGJlZm9yZSBjYWxsaW5nIHRoZSBhc3luYyBtZXRob2Qgb24gdGhlIHNlcnZlciwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBjb25mbGljdCB3aXRoIFJvdXRlUHJveHkucmVzdG9yZUhpc3RvcnkgdGhhdCBpcyBjYWxsZWQgc3luY2hyb25vdXNseSBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cblx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChjb250ZXh0KTtcblx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHRcdGlmICghaXNDcmVhdGlvbikge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dD8ucmVmcmVzaCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvbi5cblx0ICogQHJldHVybnMgVGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldEludGVybmFsUm91dGluZygpOiBJbnRlcm5hbFJvdXRpbmcge1xuXHRcdGlmICh0aGlzLmJhc2UuX3JvdXRpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UuX3JvdXRpbmc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiByb3V0aW5nIGxpc3RlbmVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTogUm9vdFZpZXdCYXNlQ29udHJvbGxlciB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbElkIFRoZSBJRCBvZiB0aGUgY29udHJvbFxuXHQgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIGNyZWF0ZUFjdGlvblByb21pc2UoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250cm9sSWQ6IHN0cmluZyk6IHsgZlJlc29sdmVyOiBGdW5jdGlvbjsgZlJlamVjdG9yOiBGdW5jdGlvbiB9IHtcblx0XHRsZXQgcmVzb2x2ZUZ1bmN0aW9uOiBGdW5jdGlvbiwgcmVqZWN0RnVuY3Rpb246IEZ1bmN0aW9uO1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlRnVuY3Rpb24gPSByZXNvbHZlO1xuXHRcdFx0cmVqZWN0RnVuY3Rpb24gPSByZWplY3Q7XG5cdFx0fSkudGhlbigocmVzcG9uc2U6IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdKSA9PiB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7IGNvbnRyb2xJZCB9LCB0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoYWN0aW9uTmFtZSwgcmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IHJlc29sdmVGdW5jdGlvbiEsIGZSZWplY3RvcjogcmVqZWN0RnVuY3Rpb24hIH07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0cHJpdmF0ZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKFxuXHRcdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRyZXNwb25zZTogUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W11cblx0KTogeyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuXHRcdGlmIChyZXNwb25zZS5sZW5ndGggPj0gMSkge1xuXHRcdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsRGF0YSA9IChjdXJyZW50Vmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldERhdGEoKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRjb25zdCBtZXRhTW9kZWxBY3Rpb24gPSBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdIGFzIE1ldGFNb2RlbEFjdGlvbltdIHwgdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgYWN0aW9uUmV0dXJuVHlwZSA9IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlID8gbWV0YU1vZGVsQWN0aW9uPy5bMF0uJFJldHVyblR5cGUuJFR5cGUgOiBudWxsO1xuXHRcdFx0Y29uc3Qga2V5cyA9XG5cdFx0XHRcdGFjdGlvblJldHVyblR5cGUgJiYgKG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0gYXMgTWV0YU1vZGVsRW50aXR5VHlwZSlcblx0XHRcdFx0XHQ/IChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpLiRLZXlcblx0XHRcdFx0XHQ6IFtdO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0b0RhdGE6IHJlc3BvbnNlWzBdLnZhbHVlLmJvdW5kQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdFx0a2V5c1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIGdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCk6IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfSB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiB0aGlzLmFjdGlvblByb21pc2U7XG5cdH1cblxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiB2b2lkIHtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBzaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhpc1NhdmU6IGJvb2xlYW4pOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIXRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZykge1xuXHRcdFx0dGhpcy5jb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nID0gbmV3IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZyh7XG5cdFx0XHRcdHZpZXc6IHRoaXMuZ2V0VmlldygpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZz8ub3Blbihpc1NhdmUpO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGNvbnN0IGFjdGl2ZVJvd0luZGV4OiBudW1iZXIgPSByb3dCaW5kaW5nLmdldENvdW50KCkgfHwgMDtcblx0XHRpZiAodGFibGUuZGF0YShcInRhYmxlVHlwZVwiKSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0aWYgKGFjdGl2ZVJvd0luZGV4ID4gMCkge1xuXHRcdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KGFjdGl2ZVJvd0luZGV4IC0gMSk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIEluIGEgcmVzcG9uc2l2ZSB0YWJsZSwgdGhlIGVtcHR5IHJvd3MgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYmxlLiBCdXQgd2hlbiB3ZSBjcmVhdGUgbW9yZSwgdGhleSBhcHBlYXIgYmVsb3cgdGhlIG5ldyBsaW5lLlxuXHRcdFx0ICogU28gd2UgY2hlY2sgdGhlIGZpcnN0IGluYWN0aXZlIHJvdyBmaXJzdCwgdGhlbiB3ZSBzZXQgdGhlIGZvY3VzIG9uIGl0IHdoZW4gd2UgcHJlc3MgdGhlIGJ1dHRvbi5cblx0XHRcdCAqIFRoaXMgZG9lc24ndCBpbXBhY3QgdGhlIEdyaWRUYWJsZSBiZWNhdXNlIHRoZXkgYXBwZWFyIGF0IHRoZSBlbmQsIGFuZCB3ZSBhbHJlYWR5IGZvY3VzIHRoZSBiZWZvcmUtdGhlLWxhc3Qgcm93IChiZWNhdXNlIDIgZW1wdHkgcm93cyBleGlzdClcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgYWxsUm93Q29udGV4dHMgPSByb3dCaW5kaW5nLmdldEFsbEN1cnJlbnRDb250ZXh0cygpO1xuXHRcdFx0aWYgKCFhbGxSb3dDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGZvY3VzUm93ID0gYWN0aXZlUm93SW5kZXgsXG5cdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdGZvciAoY29uc3Qgc2luZ2xlQ29udGV4dCBvZiBhbGxSb3dDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2luZ2xlQ29udGV4dC5pc0luYWN0aXZlKCkgJiYgaW5kZXggPCBmb2N1c1Jvdykge1xuXHRcdFx0XHRcdGZvY3VzUm93ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHRcdGlmIChmb2N1c1JvdyA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChmb2N1c1Jvdyk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1Jvdyhmb2N1c1JvdywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXModGFibGU6IFRhYmxlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRpZiAoXG5cdFx0XHR0YWJsZUFQST8udGFibGVEZWZpbml0aW9uPy5jb250cm9sPy5pbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlICYmXG5cdFx0XHQhdGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiKVxuXHRcdCkge1xuXHRcdFx0Ly8gV2l0aCB0aGUgcGFyYW1ldGVyLCB3ZSBkb24ndCBoYXZlIGVtcHR5IHJvd3MgaW4gRWRpdCBtb2RlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZSBzZXR0aW5nIHRoZSBmb2N1cyBvbiB0aGVtXG5cdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyh0YWJsZSwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHRoaXMuX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZSk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KFxuXHRcdGFjdGlvbjogQWN0aXZpdHksXG5cdFx0cmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHR0cmlnZ2VyZWRBY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LnNlbmQoeyBhY3Rpb24sIGNvbnRlbnQsIHRyaWdnZXJlZEFjdGlvbk5hbWUsIHJlZnJlc2hMaXN0QmluZGluZywgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyB9KTtcblx0fVxuXG5cdF90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZTogc3RyaW5nLCB0cmlnZ2VyVHlwZTogVHJpZ2dlclR5cGUpOiB2b2lkIHtcblx0XHR0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSh0aGlzLmJhc2UuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gU3VibWl0IGFueSBsZWZ0b3ZlciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCB5ZXQgc3VibWl0dGVkXG5cdFx0XHQvLyBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG9ubHkgMSB1cGRhdGVHcm91cElkLCBoZW5jZSBzdWJtaXR0aW5nIHRoZSBiYXRjaCBkaXJlY3RseSBoZXJlXG5cdFx0XHRhd2FpdCBvTW9kZWwuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIGNoYW5nZXNcblx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZyB3ZSBhZ3JlZWQgd2l0aCB0aGUgdjQgbW9kZWwgdGVhbSB0byB1c2UgYW4gaW50ZXJuYWwgbWV0aG9kLiBXZSdsbCByZXBsYWNlIGl0IG9uY2Vcblx0XHRcdC8vIGEgcHVibGljIG9yIHJlc3RyaWN0ZWQgbWV0aG9kIHdhcyBwcm92aWRlZFxuXHRcdFx0YXdhaXQgKG9Nb2RlbC5vUmVxdWVzdG9yIGFzIHVua25vd24gYXMgeyB3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzOiBGdW5jdGlvbiB9KS53YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIENoZWNrIGlmIGFsbCBjaGFuZ2VzIHdlcmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkaXNwbGF5IGEgJ2Rpc2NhcmQnIHBvcG92ZXIgd2hlbiBleGl0aW5nIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIG9uQmFja05hdmlnYXRpb25JblNlc3Npb24oY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHJvdXRlclByb3h5ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKHJvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRQcm9ncmFtbWluZ01vZGVsLlN0aWNreVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVOZXdDb250ZXh0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzOiB7IGVkaXRhYmxlOiBib29sZWFuOyByZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW47IGZvcmNlRm9jdXM/OiBib29sZWFuIH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRlZGl0YWJsZTogbmF2aWdhdGlvblBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLnJlY3JlYXRlQ29udGV4dCxcblx0XHRcdHJlYXNvbjogTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRmb3JjZUZvY3VzOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5mb3JjZUZvY3VzID8/IGZhbHNlLFxuXHRcdFx0a2VlcEN1cnJlbnRMYXlvdXQ6IHRydWVcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIHZpZXcgVGhlIHZpZXdcblx0ICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1zLmNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtcy5pc05hdmlnYWJsZSBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgbmF2aWdhYmxlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjdGlvbiBuZWVkcyB0byByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0LCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdF9nZXRCb3VuZENvbnRleHQodmlldzogRkVWaWV3LCBwYXJhbXM6IHsgY29udHJvbElkPzogc3RyaW5nOyBpc05hdmlnYWJsZT86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuXHRcdC8vVGhpcyB3ZWlyZCBjb25kaXRpb24gaXMgbmVlZGVkIHRvIGF2b2lkIG5hdmlnYXRpb24gaW4gY2FzZSBvZiBzb21lIGFjdGlvbnMgaW50byB0aGUgdGFibGVcblx0XHQvLyB0aGlzIGRlZmluaXRlbHkgbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCB0byBnZXQgY2xlYXIgY29uZGl0aW9uIHdoZXJlIG5hdmlnYXRpb24gbmVlZHMgdG8gYmUgZG9uZSBvciBub3Rcblx0XHQvLyBTTk9XOiBESU5DMDI3ODQ5MFxuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXcuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0Y29uc3QgYlJlZnJlc2hBZnRlckFjdGlvbiA9IHZpZXdMZXZlbCA+IDEgfHwgKHZpZXdMZXZlbCA9PT0gMSAmJiBwYXJhbXMuY29udHJvbElkKTtcblx0XHRyZXR1cm4gIXBhcmFtcy5pc05hdmlnYWJsZSB8fCAhIWJSZWZyZXNoQWZ0ZXJBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0YXN5bmMgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZCB8IHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3QgdmlzaWJsZVZpZXdJZHMgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0XHQ/ICh0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBGY2xDb250cm9sbGVyKS5fZ2V0QWxsVmlzaWJsZVZpZXdzKCkubWFwKCh2aWV3KSA9PiB2aWV3LmdldElkKCkpXG5cdFx0XHRcdDogW3RoaXMuZ2V0VmlldygpLmdldElkKCldO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBtZXNzYWdlIG9mIGFNZXNzYWdlcykge1xuXHRcdFx0XHRpZiAobWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKHZpc2libGVWaWV3SWRzLmluY2x1ZGVzKG9Db250cm9sLmdldElkKCkpKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uub0RhdGFcblx0ICogQHBhcmFtIG9SZXNwb25zZS5rZXlzXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYm91bmQgY29udGV4dCBvbiB3aGljaCB0aGUgYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIFByb21pc2UgaWYgdGhlIGxpc3Qgd2FzIHJlZnJlc2hlZFxuXHQgKi9cblx0YXN5bmMgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRvUmVzcG9uc2U/OiB7IG9EYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM/OiBzdHJpbmdbXSB8IG51bGwgfSxcblx0XHRvQ29udGV4dD86IENvbnRleHRcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCFvQ29udGV4dCB8fCAhb1Jlc3BvbnNlIHx8ICFvUmVzcG9uc2Uub0RhdGEgfHwgIW9SZXNwb25zZS5rZXlzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcob0JpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHBhdGhzID0gYVNlbWFudGljS2V5cy5tYXAoKG9LZXkpID0+IG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHRhd2FpdCBvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocGF0aHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgbGF0ZXN0IGNvbnRleHQgaW4gdGhlIG1ldGFkYXRhIGhpZXJhcmNoeSBmcm9tIHJvb3RCaW5kaW5nIHRvIGdpdmVuIGNvbnRleHQgcG9pbnRpbmcgdG8gZ2l2ZW4gZW50aXR5VHlwZVxuXHQgKiBpZiBhbnkgc3VjaCBjb250ZXh0IGV4aXN0cy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBvcmlnaW5hbCBjb250ZXh0LlxuXHQgKiBOb3RlOiBJdCBpcyBvbmx5IG5lZWRlZCBhcyB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZy4gQ29ycmVjdCBtb2RlbGxpbmcgd291bGQgaW1wbHkgYSBEYXRhRmllbGRGb3JBY3Rpb24gaW4gYSBMaW5lSXRlbVxuXHQgKiB0byBwb2ludCB0byBhbiBvdmVybG9hZCBkZWZpbmVkIGVpdGhlciBvbiB0aGUgY29ycmVzcG9uZGluZyBFbnRpdHlUeXBlIG9yIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZS5cblx0ICogQHBhcmFtIHJvb3RDb250ZXh0IFRoZSBjb250ZXh0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBvdmVybG9hZEVudGl0eVR5cGUgVGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eSB0eXBlIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5XG5cdCAqL1xuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChyb290Q29udGV4dDogQ29udGV4dCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIG92ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB7XG5cdFx0Y29uc3QgbW9kZWw6IE9EYXRhTW9kZWwgPSByb290Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgY29udGV4dFNlZ21lbnRzOiBzdHJpbmdbXSA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGN1cnJlbnRDb250ZXh0OiBDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cblx0XHQvLyBXZSBleHBlY3QgdGhhdCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBsaXN0QmluZGluZyBpcyB0aGUgTGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlLiBSZW1vdmUgdGhpcyBmcm9tIGNvbnRleHRTZWdtZW50c1xuXHRcdC8vIGJlY2F1c2UgaXQgaXMgaW5jb3JyZWN0IHRvIGV4ZWN1dGUgYmluZENvbnRleHQgb24gYSBsaXN0LiBXZSBkbyBub3QgYW55d2F5IG5lZWQgdG8gc2VhcmNoIHRoaXMgY29udGV4dCBmb3IgdGhlIG92ZXJsb2FkLlxuXHRcdGNvbnRleHRTZWdtZW50cy5wb3AoKTtcblx0XHRpZiAoY29udGV4dFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzID0gW1wiXCJdOyAvLyBEb24ndCBsZWF2ZSBjb250ZXh0U2VnbWVudHMgdW5kZWZpbmVkXG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRleHRTZWdtZW50c1swXSAhPT0gXCJcIikge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzLnVuc2hpZnQoXCJcIik7IC8vIHRvIGFsc28gZ2V0IHRoZSByb290IGNvbnRleHQsIGkuZS4gdGhlIGJpbmRpbmdDb250ZXh0IG9mIHRoZSB0YWJsZVxuXHRcdH1cblx0XHQvLyBsb2FkIGFsbCB0aGUgcGFyZW50IGNvbnRleHRzIGludG8gYW4gYXJyYXlcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0czogQ29udGV4dFtdID0gY29udGV4dFNlZ21lbnRzXG5cdFx0XHQubWFwKChwYXRoU2VnbWVudDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGlmIChwYXRoU2VnbWVudCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocGF0aFNlZ21lbnQsIGN1cnJlbnRDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHVzaW5nIGJpbmRDb250ZXh0KC4uLikuZ2V0Qm91bmRDb250ZXh0KCkgZG9lcyBub3Qgd29yayBpZiB0aGUgZXRhZyBpcyBuZWVkZWQuIEFjY29yZGluZyB0byBtb2RlbCBjb2xsZWFndWVzLFxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBhbHdheXMgdXNlIGFuIGV4aXN0aW5nIGNvbnRleHQgaWYgcG9zc2libGUuXG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5LCB0aGUgb25seSBleGFtcGxlIHdlIGtub3cgYWJvdXQgaXMgdXNpbmcgdGhlIHJvb3RDb250ZXh0IC0gYW5kIGluIHRoaXMgY2FzZSwgd2UgY2FuIG9idmlvdXNseSByZXVzZSB0aGF0IGV4aXN0aW5nIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gSWYgb3RoZXIgZXhhbXBsZXMgc2hvdWxkIGNvbWUgdXAsIHRoZSBiZXN0IHBvc3NpYmxlIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIHJlcXVlc3Qgc29tZSBkYXRhIHRvIGdldCBhbiBleGlzdGluZyBjb250ZXh0LiBUbyBrZWVwIHRoZVxuXHRcdFx0XHRcdC8vIHJlcXVlc3QgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUsIHdlIHNob3VsZCByZXF1ZXN0IG9ubHkgdGhlIGZpcnN0IGtleSBwcm9wZXJ0eS4gQXMgdGhpcyB3b3VsZCBpbnRyb2R1Y2UgYXN5bmNocm9uaXNtLCBhbmQgYW55d2F5XG5cdFx0XHRcdFx0Ly8gdGhlIHdob2xlIGxvZ2ljIGlzIG9ubHkgcGFydCBvZiB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZywgd2Ugd2FpdCB1bnRpbCB3ZSBoYXZlIGFuIGV4YW1wbGUgbmVlZGluZyBpdCBiZWZvcmUgaW1wbGVtZW50aW5nIHRoaXMuXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSByb290Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY3VycmVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJldmVyc2UoKTtcblx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgYmFja3dhcmRzXG5cdFx0Y29uc3Qgb3ZlcmxvYWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gcGFyZW50Q29udGV4dHMuZmluZChcblx0XHRcdChwYXJlbnRDb250ZXh0OiBDb250ZXh0KSA9PlxuXHRcdFx0XHQobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSBhcyB1bmtub3duIGFzIHN0cmluZykgPT09IG92ZXJsb2FkRW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0cmV0dXJuIG92ZXJsb2FkQ29udGV4dCB8fCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhO1xuXHR9XG5cblx0X2NyZWF0ZVNpYmxpbmdJbmZvKGN1cnJlbnRDb250ZXh0OiBDb250ZXh0LCBuZXdDb250ZXh0OiBDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdF9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkXG5cdCk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IGNvbnRleHQuZ2V0UGF0aCgpID09PSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSA/IGNvbnRleHQgOiBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dFRvTmF2aWdhdGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSwgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGhcblx0ICogZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHMgYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0XG5cdCAqIEBwYXJhbSBzUHJvZ3JhbW1pbmdNb2RlbCBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHBhcmFtIGRvTm90Q29tcHV0ZUlmUm9vdCBJZiB0cnVlLCB3ZSBkb24ndCBjb21wdXRlIHNpYmxpbmdJbmZvIGlmIHRoZSByb290IGFuZCB0aGUgcmlnaHRtb3N0IGNvbnRleHRzIGFyZSB0aGUgc2FtZVxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSByb290IGNvbnRleHQgaW5mb3JtYXRpb24gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdGRvTm90Q29tcHV0ZUlmUm9vdDogYm9vbGVhbixcblx0XHRyb290Q29udGV4dEluZm8/OiBSb290Q29udGV4dEluZm8sXG5cdFx0Z3JvdXBJZD86IHN0cmluZ1xuXHQpOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgPz8gcm9vdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0bGV0IHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocmlnaHRtb3N0Q3VycmVudENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHQvLyB3ZSBjaGVjayB0aGUgcmlnaHRNb3N0Q3VycmVudENvbnRleHQgY2FuIGJlIHVzZWQgaW4gZHJhZnRcblx0XHRcdHJpZ2h0TW9zdENvbnRleHRUb1VzZSA9IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHR9XG5cdFx0aWYgKGRvTm90Q29tcHV0ZUlmUm9vdCAmJiByaWdodE1vc3RDb250ZXh0VG9Vc2UuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRNb3N0Q29udGV4dFRvVXNlLCByb290Q29udGV4dEluZm8sIGdyb3VwSWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxuXG5cdGFzeW5jIGNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9UaGUgZXhpc3RpbmcgcmVjb21tZW5kYXRpb25zIGNoZWNrIGlzIG5vdyBwcmVzZW50IGZ1cnRoZXIgaW4gdGhlIGZsb3cgZm9yIHNob3dpbmcgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2codHJ1ZSk7XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBOZXh0IERvY3VtZW50LlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlZCBvbmNlIGNyZWF0ZSBuZXh0IGhhcHBlbnMuXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVOZXh0RG9jdW1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHRQYXRoID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRjb25zdCBsaXN0QmluZGluZ1BhdGggPSBiaW5kaW5nQ29udGV4dFBhdGg/LnN1YnN0cmluZygwLCBiaW5kaW5nQ29udGV4dFBhdGgubGFzdEluZGV4T2YoXCIoXCIpKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEb2N1bWVudChsaXN0QmluZGluZ1BhdGggYXMgc3RyaW5nLCB7IGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgfSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUVBLE1BQU1BLGdCQUFnQixHQUFHQyxTQUFTLENBQUNELGdCQUFnQjtJQUNsREUsU0FBUyxHQUFHRCxTQUFTLENBQUNDLFNBQVM7SUFDL0JDLFdBQVcsR0FBR0YsU0FBUyxDQUFDRSxXQUFXO0lBQ25DQyxRQUFRLEdBQUdILFNBQVMsQ0FBQ0csUUFBUTtJQUM3QkMsV0FBVyxHQUFHSixTQUFTLENBQUNJLFdBQVc7RUEwQnBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBLElBT01DLFFBQVEsSUFBQUMsSUFBQSxHQURiQyxjQUFjLENBQUMsMkNBQTJDLENBQUMsRUFBQUMsS0FBQSxHQWMxREMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQXdCaEJDLGVBQWUsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FDakJDLGNBQWMsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0F5UGhCSCxlQUFlLENBQUMsQ0FBQyxFQUFBSSxLQUFBLEdBQ2pCRixjQUFjLENBQUMsQ0FBQyxFQUFBRyxLQUFBLEdBcUdoQkwsZUFBZSxDQUFDLENBQUMsRUFBQU0sS0FBQSxHQUNqQkosY0FBYyxDQUFDLENBQUMsRUFBQUssS0FBQSxHQTI5QmhCUCxlQUFlLENBQUMsQ0FBQyxFQUFBUSxNQUFBLEdBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsRUFBQUMsTUFBQSxHQW1CbkNaLGVBQWUsQ0FBQyxDQUFDLEVBQUFhLE1BQUEsR0FDakJKLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBQUssTUFBQSxHQW1CeEJkLGVBQWUsQ0FBQyxDQUFDLEVBQUFlLE1BQUEsR0FDakJOLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBQU8sTUFBQSxHQW1CeEJoQixlQUFlLENBQUMsQ0FBQyxFQUFBaUIsTUFBQSxHQUNq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