@sapui5/sap.fe.core 1.127.2 → 1.129.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 (393) 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 +3 -9
  4. package/src/sap/fe/core/ActionRuntime.ts +3 -7
  5. package/src/sap/fe/core/AppComponent.js +9 -19
  6. package/src/sap/fe/core/AppComponent.ts +2 -12
  7. package/src/sap/fe/core/AppStateHandler.js +3 -11
  8. package/src/sap/fe/core/AppStateHandler.ts +0 -7
  9. package/src/sap/fe/core/BaseController.js +4 -8
  10. package/src/sap/fe/core/BaseController.ts +0 -5
  11. package/src/sap/fe/core/CommonUtils.js +1 -9
  12. package/src/sap/fe/core/CommonUtils.ts +4 -8
  13. package/src/sap/fe/core/ExtensionAPI.js +10 -25
  14. package/src/sap/fe/core/ExtensionAPI.ts +4 -19
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +5 -3
  16. package/src/sap/fe/core/PageController.js +7 -10
  17. package/src/sap/fe/core/PageController.ts +0 -3
  18. package/src/sap/fe/core/ResourceModel.js +3 -5
  19. package/src/sap/fe/core/ResourceModel.ts +0 -2
  20. package/src/sap/fe/core/ReuseComponent.js +8 -14
  21. package/src/sap/fe/core/ReuseComponent.ts +0 -6
  22. package/src/sap/fe/core/TemplateComponent.js +37 -9
  23. package/src/sap/fe/core/TemplateComponent.ts +3 -2
  24. package/src/sap/fe/core/TemplateModel.js +5 -5
  25. package/src/sap/fe/core/TemplateModel.ts +0 -1
  26. package/src/sap/fe/core/UIProvider.js +1 -1
  27. package/src/sap/fe/core/UIProvider.ts +44 -1
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +7 -12
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +0 -5
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +61 -65
  31. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +60 -63
  32. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +3 -3
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +21 -5
  35. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +0 -4
  36. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +6 -18
  37. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -20
  38. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +5 -11
  39. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +0 -6
  40. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock.js +3 -3
  41. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +11 -10
  42. package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +0 -1
  43. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -7
  44. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +0 -1
  45. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  46. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +3 -10
  47. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +0 -7
  48. package/src/sap/fe/core/controllerextensions/ContextSharing.js +5 -8
  49. package/src/sap/fe/core/controllerextensions/ContextSharing.ts +0 -2
  50. package/src/sap/fe/core/controllerextensions/EditFlow.js +225 -155
  51. package/src/sap/fe/core/controllerextensions/EditFlow.ts +248 -164
  52. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -3
  53. package/src/sap/fe/core/controllerextensions/Feedback.ts +0 -2
  54. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +4 -7
  55. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -3
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -25
  57. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -21
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.js +22 -34
  59. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +25 -31
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.js +8 -21
  61. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +4 -15
  62. package/src/sap/fe/core/controllerextensions/MessageHandler.js +68 -31
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +78 -32
  64. package/src/sap/fe/core/controllerextensions/PageReady.js +4 -4
  65. package/src/sap/fe/core/controllerextensions/Paginator.js +4 -8
  66. package/src/sap/fe/core/controllerextensions/Paginator.ts +0 -4
  67. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -4
  68. package/src/sap/fe/core/controllerextensions/Recommendations.js +15 -24
  69. package/src/sap/fe/core/controllerextensions/Recommendations.ts +13 -20
  70. package/src/sap/fe/core/controllerextensions/Routing.js +4 -10
  71. package/src/sap/fe/core/controllerextensions/Routing.ts +0 -6
  72. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/Share.js +17 -11
  74. package/src/sap/fe/core/controllerextensions/Share.ts +10 -5
  75. package/src/sap/fe/core/controllerextensions/SideEffects.js +49 -45
  76. package/src/sap/fe/core/controllerextensions/SideEffects.ts +54 -41
  77. package/src/sap/fe/core/controllerextensions/Telemetry.js +4 -4
  78. package/src/sap/fe/core/controllerextensions/ViewState.js +10 -34
  79. package/src/sap/fe/core/controllerextensions/ViewState.ts +3 -49
  80. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +6 -8
  81. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +0 -1
  82. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -2
  83. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +0 -1
  84. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +4 -3
  85. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -1
  86. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +16 -12
  87. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +4 -1
  88. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  89. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +126 -74
  90. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +158 -91
  91. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -22
  92. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +0 -20
  93. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -20
  94. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +11 -17
  95. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  96. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +191 -767
  97. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +277 -1024
  98. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  99. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -6
  100. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +0 -5
  101. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +381 -250
  102. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +467 -301
  103. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +2 -6
  104. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +0 -5
  105. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +2 -6
  106. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +4 -6
  107. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -6
  108. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +0 -4
  109. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +4 -41
  111. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -37
  112. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  113. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +0 -1
  114. package/src/sap/fe/core/controls/Any.js +1 -2
  115. package/src/sap/fe/core/controls/Any.ts +0 -1
  116. package/src/sap/fe/core/controls/AnyElement.js +1 -2
  117. package/src/sap/fe/core/controls/AnyElement.ts +0 -1
  118. package/src/sap/fe/core/controls/CommandExecution.js +3 -3
  119. package/src/sap/fe/core/controls/ComponentLoader.js +23 -10
  120. package/src/sap/fe/core/controls/ComponentLoader.ts +0 -1
  121. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +10 -13
  122. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +0 -6
  123. package/src/sap/fe/core/controls/EventDelegateHook.js +8 -9
  124. package/src/sap/fe/core/controls/FormElementWrapper.js +7 -7
  125. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -1
  126. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +140 -24
  127. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +141 -10
  128. package/src/sap/fe/core/converters/ConverterContext.js +8 -30
  129. package/src/sap/fe/core/converters/ConverterContext.ts +7 -29
  130. package/src/sap/fe/core/converters/ManifestSettings.js +37 -1
  131. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -3
  132. package/src/sap/fe/core/converters/ManifestWrapper.js +12 -40
  133. package/src/sap/fe/core/converters/ManifestWrapper.ts +13 -46
  134. package/src/sap/fe/core/converters/MetaModelConverter.js +44 -48
  135. package/src/sap/fe/core/converters/MetaModelConverter.ts +50 -48
  136. package/src/sap/fe/core/converters/TemplateConverter.js +3 -2
  137. package/src/sap/fe/core/converters/TemplateConverter.ts +0 -1
  138. package/src/sap/fe/core/converters/annotations/DataField.js +1 -28
  139. package/src/sap/fe/core/converters/annotations/DataField.ts +0 -26
  140. package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -19
  141. package/src/sap/fe/core/converters/controls/Common/Action.js +13 -26
  142. package/src/sap/fe/core/converters/controls/Common/Action.ts +13 -31
  143. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -6
  144. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -5
  145. package/src/sap/fe/core/converters/controls/Common/Criticality.js +2 -4
  146. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +1 -2
  147. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -5
  148. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +0 -4
  149. package/src/sap/fe/core/converters/controls/Common/Form.js +3 -2
  150. package/src/sap/fe/core/converters/controls/Common/Form.ts +2 -1
  151. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -7
  152. package/src/sap/fe/core/converters/controls/Common/KPI.ts +11 -6
  153. package/src/sap/fe/core/converters/controls/Common/Table.js +159 -141
  154. package/src/sap/fe/core/converters/controls/Common/Table.ts +166 -122
  155. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +5 -30
  156. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +3 -29
  157. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +43 -55
  158. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +43 -47
  159. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -4
  160. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +0 -3
  161. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  162. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -8
  163. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +2 -7
  164. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -11
  165. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +0 -9
  166. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -10
  167. package/src/sap/fe/core/converters/helpers/Aggregation.ts +0 -9
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -7
  169. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +0 -6
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -9
  171. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +0 -8
  172. package/src/sap/fe/core/converters/helpers/ID.js +1 -2
  173. package/src/sap/fe/core/converters/helpers/ID.ts +0 -1
  174. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -2
  175. package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +0 -1
  176. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/Key.js +1 -5
  178. package/src/sap/fe/core/converters/helpers/Key.ts +0 -4
  179. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -2
  180. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +0 -1
  181. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  182. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -7
  183. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +0 -6
  184. package/src/sap/fe/core/converters/templates/ListReportConverter.js +6 -27
  185. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +9 -26
  186. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -16
  187. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +0 -15
  188. package/src/sap/fe/core/definition/FEDefinition.js +2550 -0
  189. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -12
  190. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +9 -10
  191. package/src/sap/fe/core/formatters/CollaborationFormatter.js +8 -2
  192. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +0 -2
  193. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  194. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -2
  195. package/src/sap/fe/core/formatters/FPMFormatter.ts +0 -1
  196. package/src/sap/fe/core/formatters/FiscalFormat.js +9 -14
  197. package/src/sap/fe/core/formatters/FiscalFormat.ts +0 -11
  198. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -4
  199. package/src/sap/fe/core/formatters/KPIFormatter.ts +0 -3
  200. package/src/sap/fe/core/formatters/StandardFormatter.js +6 -3
  201. package/src/sap/fe/core/formatters/StandardFormatter.ts +6 -2
  202. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -4
  203. package/src/sap/fe/core/formatters/ValueFormatter.ts +0 -3
  204. package/src/sap/fe/core/fpm/Component.js +14 -17
  205. package/src/sap/fe/core/fpm/Component.ts +7 -10
  206. package/src/sap/fe/core/fpm/manifest.json +1 -1
  207. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +3 -10
  208. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +0 -9
  209. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -13
  210. package/src/sap/fe/core/helpers/AppStartupHelper.ts +0 -11
  211. package/src/sap/fe/core/helpers/BindingHelper.js +1 -4
  212. package/src/sap/fe/core/helpers/BindingHelper.ts +0 -3
  213. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -2
  214. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +0 -1
  215. package/src/sap/fe/core/helpers/DeleteHelper.js +61 -32
  216. package/src/sap/fe/core/helpers/DeleteHelper.ts +79 -33
  217. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -2
  218. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +0 -1
  219. package/src/sap/fe/core/helpers/EditState.js +1 -1
  220. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -2
  221. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +0 -1
  222. package/src/sap/fe/core/helpers/FPMHelper.js +1 -2
  223. package/src/sap/fe/core/helpers/FPMHelper.ts +0 -1
  224. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -8
  225. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +0 -7
  226. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +7 -1
  227. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  228. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -3
  229. package/src/sap/fe/core/helpers/ManifestHelper.ts +0 -2
  230. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  231. package/src/sap/fe/core/helpers/MetaModelFunction.js +3 -8
  232. package/src/sap/fe/core/helpers/MetaModelFunction.ts +0 -5
  233. package/src/sap/fe/core/helpers/MetaPath.js +1 -7
  234. package/src/sap/fe/core/helpers/MetaPath.ts +0 -6
  235. package/src/sap/fe/core/helpers/ModelHelper.js +55 -35
  236. package/src/sap/fe/core/helpers/ModelHelper.ts +64 -38
  237. package/src/sap/fe/core/helpers/PasteHelper.js +77 -24
  238. package/src/sap/fe/core/helpers/PasteHelper.ts +105 -23
  239. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -3
  240. package/src/sap/fe/core/helpers/PromiseKeeper.ts +0 -2
  241. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -4
  242. package/src/sap/fe/core/helpers/RecommendationHelper.ts +0 -3
  243. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -3
  244. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +3 -4
  245. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -2
  246. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +0 -1
  247. package/src/sap/fe/core/helpers/SizeHelper.js +1 -2
  248. package/src/sap/fe/core/helpers/SizeHelper.ts +0 -1
  249. package/src/sap/fe/core/helpers/StableIdHelper.js +7 -17
  250. package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -17
  251. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -12
  252. package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +0 -11
  253. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  254. package/src/sap/fe/core/helpers/TitleHelper.js +1 -10
  255. package/src/sap/fe/core/helpers/TitleHelper.ts +0 -9
  256. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -2
  257. package/src/sap/fe/core/helpers/ToES6Promise.ts +0 -1
  258. package/src/sap/fe/core/helpers/TypeGuards.js +1 -15
  259. package/src/sap/fe/core/helpers/TypeGuards.ts +0 -14
  260. package/src/sap/fe/core/helpers/WebSocket.js +1 -1
  261. package/src/sap/fe/core/library.js +10 -44
  262. package/src/sap/fe/core/library.support.js +1 -1
  263. package/src/sap/fe/core/library.ts +8 -45
  264. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -6
  265. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -5
  266. package/src/sap/fe/core/messagebundle.properties +12 -1
  267. package/src/sap/fe/core/messagebundle_ar.properties +8 -0
  268. package/src/sap/fe/core/messagebundle_bg.properties +8 -0
  269. package/src/sap/fe/core/messagebundle_ca.properties +8 -0
  270. package/src/sap/fe/core/messagebundle_cnr.properties +8 -0
  271. package/src/sap/fe/core/messagebundle_cs.properties +9 -1
  272. package/src/sap/fe/core/messagebundle_cy.properties +8 -0
  273. package/src/sap/fe/core/messagebundle_da.properties +8 -0
  274. package/src/sap/fe/core/messagebundle_de.properties +8 -0
  275. package/src/sap/fe/core/messagebundle_el.properties +8 -0
  276. package/src/sap/fe/core/messagebundle_en.properties +8 -0
  277. package/src/sap/fe/core/messagebundle_en_GB.properties +8 -0
  278. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +144 -65
  279. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -0
  280. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +273 -194
  281. package/src/sap/fe/core/messagebundle_es.properties +9 -1
  282. package/src/sap/fe/core/messagebundle_es_MX.properties +8 -0
  283. package/src/sap/fe/core/messagebundle_et.properties +8 -0
  284. package/src/sap/fe/core/messagebundle_fi.properties +8 -0
  285. package/src/sap/fe/core/messagebundle_fr.properties +8 -0
  286. package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -0
  287. package/src/sap/fe/core/messagebundle_hi.properties +9 -1
  288. package/src/sap/fe/core/messagebundle_hr.properties +8 -0
  289. package/src/sap/fe/core/messagebundle_hu.properties +8 -0
  290. package/src/sap/fe/core/messagebundle_id.properties +12 -4
  291. package/src/sap/fe/core/messagebundle_it.properties +8 -0
  292. package/src/sap/fe/core/messagebundle_iw.properties +8 -0
  293. package/src/sap/fe/core/messagebundle_ja.properties +8 -0
  294. package/src/sap/fe/core/messagebundle_kk.properties +8 -0
  295. package/src/sap/fe/core/messagebundle_ko.properties +8 -0
  296. package/src/sap/fe/core/messagebundle_lt.properties +8 -0
  297. package/src/sap/fe/core/messagebundle_lv.properties +8 -0
  298. package/src/sap/fe/core/messagebundle_mk.properties +8 -0
  299. package/src/sap/fe/core/messagebundle_ms.properties +8 -0
  300. package/src/sap/fe/core/messagebundle_nl.properties +16 -8
  301. package/src/sap/fe/core/messagebundle_no.properties +8 -0
  302. package/src/sap/fe/core/messagebundle_pl.properties +8 -0
  303. package/src/sap/fe/core/messagebundle_pt.properties +8 -0
  304. package/src/sap/fe/core/messagebundle_pt_PT.properties +8 -0
  305. package/src/sap/fe/core/messagebundle_ro.properties +8 -0
  306. package/src/sap/fe/core/messagebundle_ru.properties +8 -0
  307. package/src/sap/fe/core/messagebundle_sh.properties +8 -0
  308. package/src/sap/fe/core/messagebundle_sk.properties +8 -0
  309. package/src/sap/fe/core/messagebundle_sl.properties +8 -0
  310. package/src/sap/fe/core/messagebundle_sr.properties +8 -0
  311. package/src/sap/fe/core/messagebundle_sv.properties +8 -0
  312. package/src/sap/fe/core/messagebundle_th.properties +12 -4
  313. package/src/sap/fe/core/messagebundle_tr.properties +8 -0
  314. package/src/sap/fe/core/messagebundle_uk.properties +10 -2
  315. package/src/sap/fe/core/messagebundle_vi.properties +8 -0
  316. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -0
  317. package/src/sap/fe/core/messagebundle_zh_TW.properties +8 -0
  318. package/src/sap/fe/core/operationsHelper.js +22 -7
  319. package/src/sap/fe/core/operationsHelper.ts +24 -5
  320. package/src/sap/fe/core/rootView/Fcl.controller.js +7 -27
  321. package/src/sap/fe/core/rootView/Fcl.controller.ts +0 -18
  322. package/src/sap/fe/core/rootView/NavContainer.controller.js +7 -12
  323. package/src/sap/fe/core/rootView/NavContainer.controller.ts +0 -5
  324. package/src/sap/fe/core/rootView/RootViewBaseController.js +10 -24
  325. package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -16
  326. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  327. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -3
  328. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +4 -4
  329. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +3 -3
  330. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +3 -4
  331. package/src/sap/fe/core/services/ContextSharingServiceFactory.ts +0 -1
  332. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +13 -20
  333. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +11 -17
  334. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -21
  335. package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -17
  336. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  337. package/src/sap/fe/core/services/RoutingServiceFactory.js +7 -19
  338. package/src/sap/fe/core/services/RoutingServiceFactory.ts +0 -12
  339. package/src/sap/fe/core/services/ShellServicesFactory.js +8 -44
  340. package/src/sap/fe/core/services/ShellServicesFactory.ts +1 -41
  341. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +19 -60
  342. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +14 -57
  343. package/src/sap/fe/core/services/TelemetryServiceFactory.js +6 -14
  344. package/src/sap/fe/core/services/TelemetryServiceFactory.ts +2 -10
  345. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +17 -7
  346. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +17 -3
  347. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +11 -24
  348. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +0 -19
  349. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +3 -31
  350. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +0 -27
  351. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -4
  352. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.ts +0 -3
  353. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +7 -7
  354. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  355. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  356. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  357. package/src/sap/fe/core/support/CommonHelper.js +4 -1
  358. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  359. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  360. package/src/sap/fe/core/templating/ActionHelper.js +1 -2
  361. package/src/sap/fe/core/templating/ActionHelper.ts +0 -1
  362. package/src/sap/fe/core/templating/CommonFormatters.js +1 -2
  363. package/src/sap/fe/core/templating/CommonFormatters.ts +0 -1
  364. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -6
  365. package/src/sap/fe/core/templating/CriticalityFormatters.ts +0 -5
  366. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -2
  367. package/src/sap/fe/core/templating/DataFieldFormatters.ts +0 -1
  368. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -18
  369. package/src/sap/fe/core/templating/DataModelPathHelper.ts +0 -17
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +6 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -4
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +0 -3
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +4 -5
  374. package/src/sap/fe/core/templating/EntityTypeHelper.ts +3 -4
  375. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -9
  376. package/src/sap/fe/core/templating/FieldControlHelper.ts +3 -9
  377. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  378. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  379. package/src/sap/fe/core/templating/PropertyHelper.js +1 -31
  380. package/src/sap/fe/core/templating/PropertyHelper.ts +0 -30
  381. package/src/sap/fe/core/templating/SemanticObjectHelper.js +1 -7
  382. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +0 -6
  383. package/src/sap/fe/core/templating/UIFormatters.js +18 -14
  384. package/src/sap/fe/core/templating/UIFormatters.ts +30 -18
  385. package/src/sap/fe/core/type/Date.js +3 -6
  386. package/src/sap/fe/core/type/Date.ts +0 -3
  387. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -3
  388. package/src/sap/fe/core/type/EDM.js +1 -1
  389. package/src/sap/fe/core/type/Email.js +3 -3
  390. package/src/sap/fe/core/type/FiscalDate.js +3 -9
  391. package/src/sap/fe/core/type/FiscalDate.ts +0 -6
  392. package/src/sap/fe/core/type/InputMask.js +3 -7
  393. package/src/sap/fe/core/type/InputMask.ts +0 -4
@@ -22,8 +22,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
22
22
  var isComplexType = TypeGuards.isComplexType;
23
23
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
24
24
  var convertTypes = MetaModelConverter.convertTypes;
25
- function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
26
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
26
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
27
+ //TODO fix this type in the ux vocabularies
28
+ //TODO: Source Events are still experimental, remove once public
27
29
  let SideEffectsService = /*#__PURE__*/function (_Service) {
28
30
  _inheritsLoose(SideEffectsService, _Service);
29
31
  function SideEffectsService() {
@@ -71,7 +73,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
71
73
 
72
74
  /**
73
75
  * This method is called whenever the connected WebSocket sends a message.
74
- *
75
76
  * @param event The event with the relevant sideEffect information
76
77
  */;
77
78
  _proto.onSideEffectsEventReceived = async function onSideEffectsEventReceived(event) {
@@ -126,7 +127,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
126
127
 
127
128
  /**
128
129
  * Retrieve the side effects interaction type from the manifest.
129
- *
130
130
  * @param event The side effects event name
131
131
  * @returns The side effects interaction type
132
132
  */;
@@ -159,7 +159,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
159
159
  * - Only SideEffects source properties are recognized and used to trigger SideEffects
160
160
  *
161
161
  * Ensure the sourceControlId matches the associated SAPUI5 control ID.
162
- *
163
162
  * @param entityType Name of the entity type
164
163
  * @param sideEffect SideEffects definition
165
164
  */;
@@ -177,7 +176,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
177
176
 
178
177
  /**
179
178
  * Executes SideEffects action.
180
- *
181
179
  * @param triggerAction Name of the action
182
180
  * @param context Context
183
181
  * @param groupId The group ID to be used for the request
@@ -193,7 +191,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
193
191
 
194
192
  /**
195
193
  * Gets converted OData metaModel.
196
- *
197
194
  * @returns Converted OData metaModel
198
195
  */;
199
196
  _proto.getConvertedMetaModel = function getConvertedMetaModel() {
@@ -202,7 +199,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
202
199
 
203
200
  /**
204
201
  * Gets the entity type of a context.
205
- *
206
202
  * @param context Context
207
203
  * @returns Entity Type
208
204
  */;
@@ -215,7 +211,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
215
211
 
216
212
  /**
217
213
  * Gets the SideEffects that come from an OData service.
218
- *
219
214
  * @param entityTypeName Name of the entity type
220
215
  * @returns SideEffects dictionary
221
216
  */;
@@ -225,7 +220,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
225
220
 
226
221
  /**
227
222
  * Is a SideEffects generated by a control.
228
- *
229
223
  * @param sideEffects The SideEffects
230
224
  * @returns True if the SideEffects is generated by a control, otherwise false
231
225
  */;
@@ -235,7 +229,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
235
229
 
236
230
  /**
237
231
  * Gets the global SideEffects that come from an OData service.
238
- *
239
232
  * @param entityTypeName Name of the entity type
240
233
  * @returns Global SideEffects
241
234
  */;
@@ -253,7 +246,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
253
246
 
254
247
  /**
255
248
  * Gets the SideEffects that come from an OData service.
256
- *
257
249
  * @param actionName Name of the action
258
250
  * @param context Context
259
251
  * @returns SideEffects definition
@@ -346,7 +338,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
346
338
  /**
347
339
  * This function will return true if field is part of Recommendation's input mapping and from the same entity.
348
340
  * Otherwise return false.
349
- *
350
341
  * @param field
351
342
  * @returns True if field is has recommendation role - Input annotation
352
343
  */;
@@ -376,7 +367,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
376
367
 
377
368
  /**
378
369
  * Method returns the properties in a specific entity type which are marked as RecommendationRole Output.
379
- *
380
370
  * @param entityTypeName Entity type for which recommendation Output fields needs to be figured
381
371
  * @returns Array of property names which are marked RecommendationRole Output
382
372
  */;
@@ -392,7 +382,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
392
382
 
393
383
  /**
394
384
  * Removes all SideEffects related to a control.
395
- *
396
385
  * @param controlId Control Id
397
386
  */;
398
387
  _proto.removeControlSideEffects = function removeControlSideEffects(controlId) {
@@ -405,7 +394,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
405
394
 
406
395
  /**
407
396
  * Requests the SideEffects on a specific context.
408
- *
409
397
  * @param pathExpressions Targets of SideEffects to be executed
410
398
  * @param context Context where SideEffects need to be executed
411
399
  * @param groupId The group ID to be used for the request
@@ -418,7 +406,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
418
406
 
419
407
  /**
420
408
  * Requests the SideEffects for an OData action.
421
- *
422
409
  * @param sideEffects SideEffects definition
423
410
  * @param context Context where SideEffects need to be executed
424
411
  * @returns Promise on SideEffects requests and action execution
@@ -441,7 +428,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
441
428
 
442
429
  /**
443
430
  * Requests the SideEffects for a navigation property on a specific context.
444
- *
445
431
  * @param navigationProperty Navigation property
446
432
  * @param context Context where SideEffects need to be executed
447
433
  * @param groupId Batch group for the query
@@ -488,7 +474,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
488
474
 
489
475
  /**
490
476
  * Gets the SideEffects that come from controls.
491
- *
492
477
  * @param entityTypeName Entity type Name
493
478
  * @returns SideEffects dictionary
494
479
  */;
@@ -498,7 +483,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
498
483
 
499
484
  /**
500
485
  * Gets SideEffects' qualifier and owner entity where this entity is used as source.
501
- *
502
486
  * @param entityTypeName Entity type fully qualified name
503
487
  * @returns Array of sideEffects info
504
488
  */;
@@ -508,7 +492,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
508
492
 
509
493
  /**
510
494
  * Gets SideEffects' qualifiers where this event is used as source.
511
- *
512
495
  * @param entityTypeName Entity type fully qualified
513
496
  * @param eventName Side Effect event name
514
497
  * @returns Array of sideEffects info
@@ -520,7 +503,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
520
503
 
521
504
  /**
522
505
  * Requests the SideEffects for a sideEffect event on a specific context.
523
- *
524
506
  * @param event SideEffects event which should be
525
507
  * @param context Context where SideEffects need to be executed
526
508
  * @param groupId The group ID to be used for the request
@@ -554,7 +536,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
554
536
 
555
537
  /**
556
538
  * Common method to get the field groupIds for a source entity and a source property.
557
- *
558
539
  * @param sourceEntityType
559
540
  * @param sourceProperty
560
541
  * @returns A collection of fieldGroupIds
@@ -566,7 +547,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
566
547
 
567
548
  /**
568
549
  * Gets SideEffects' qualifier and owner entity where this property is used as source.
569
- *
570
550
  * @param propertyName Property fully qualified name
571
551
  * @returns Array of sideEffects info
572
552
  */;
@@ -592,7 +572,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
592
572
 
593
573
  /**
594
574
  * Returns updated side effects definition with all text related properties.
595
- *
596
575
  * @param sideEffectsTargets The targets of the side effect
597
576
  * @param entityType Name of the entity where the side effect is registered
598
577
  * @returns Updated side effects' targets with added text properties or entities
@@ -622,9 +601,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
622
601
  /**
623
602
  * Adds text related property to the side effects targets
624
603
  * If the property has an associated text then this text needs to be added if it's not already reflected in the side effects definition:
625
- * - as targetProperties if the property and its associated text are on the same entitySet
626
- * - as targetEntities if they are defined on different entitySets.
627
- *
604
+ * - as targetProperties if the property and its associated text are on the same entitySet
605
+ * - as targetEntities if they are defined on different entitySets.
628
606
  * @param dataModelPropertyPath The model object path of the property
629
607
  * @param propertyPath The property path
630
608
  * @param associatedTextPath The associated text property path
@@ -647,9 +625,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
647
625
 
648
626
  /**
649
627
  * Checks if the associated text property needs to be added if it's not already reflected in the side effects definition:
650
- * - as targetProperties if the property and its associated text are on the same entitySet
651
- * - as targetEntities if they are defined on different entitySets.
652
- *
628
+ * - as targetProperties if the property and its associated text are on the same entitySet
629
+ * - as targetEntities if they are defined on different entitySets.
653
630
  * @param dataModelTextPath The model object path of the associated text
654
631
  * @param relativeNavigation The navigation to the text property
655
632
  * @param targetPath The associated text property path
@@ -668,7 +645,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
668
645
 
669
646
  /**
670
647
  * Checks if the property and its associated text property are on different entitySet.
671
- *
672
648
  * @param dataModelPropertyPath The model object path of the property
673
649
  * @param dataModelTextPath The model object path of the associated text property
674
650
  * @returns True if the entitySet is different
@@ -679,12 +655,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
679
655
 
680
656
  /**
681
657
  * Converts the SideEffects to expected format
682
- * - Set TriggerAction as string
683
- * - Converts SideEffects targets to expected format
684
- * - Removes binding parameter from SideEffects targets properties
685
- * - Adds the text properties
686
- * - Replaces TargetProperties having reference to Source Properties for a SideEffects.
687
- *
658
+ * - Set TriggerAction as string
659
+ * - Converts SideEffects targets to expected format
660
+ * - Removes binding parameter from SideEffects targets properties
661
+ * - Adds the text properties
662
+ * - Replaces TargetProperties having reference to Source Properties for a SideEffects.
688
663
  * @param sideEffects SideEffects definition
689
664
  * @param entityType Entity type
690
665
  * @param bindingParameter Name of the binding parameter
@@ -712,9 +687,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
712
687
 
713
688
  /**
714
689
  * Converts the SideEffects targets (TargetEntities and TargetProperties) to expected format
715
- * - TargetProperties as array of string
716
- * - TargetEntities as array of object with property $NavigationPropertyPath.
717
- *
690
+ * - TargetProperties as array of string
691
+ * - TargetEntities as array of object with property $NavigationPropertyPath.
718
692
  * @param sideEffects SideEffects definition
719
693
  * @returns Converted SideEffects
720
694
  */;
@@ -759,10 +733,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
759
733
  * Gets all dataModelObjectPath related to properties listed by a path
760
734
  *
761
735
  * The path can be:
762
- * - a path targeting a property on a complexType or an EntityType
763
- * - a path with a star targeting all properties on a complexType or an EntityType.
764
- * - absolute.
765
- *
736
+ * - a path targeting a property on a complexType or an EntityType
737
+ * - a path with a star targeting all properties on a complexType or an EntityType.
738
+ * - absolute.
766
739
  * @param propertyPath The path to analyze
767
740
  * @param entityType Entity type
768
741
  * @returns Array of dataModelObjectPath representing the properties
@@ -811,7 +784,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
811
784
 
812
785
  /**
813
786
  * Gets the Odata metamodel.
814
- *
815
787
  * @returns The OData metamodel
816
788
  */;
817
789
  _proto.getMetaModel = function getMetaModel() {
@@ -822,7 +794,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
822
794
  * Gets the SideEffects related to an entity type or action that come from an OData Service
823
795
  * Internal routine to get, from converted oData metaModel, SideEffects related to a specific entity type or action
824
796
  * and to convert these SideEffects with expected format.
825
- *
826
797
  * @param source Entity type or action
827
798
  * @returns Array of SideEffects
828
799
  */;
@@ -846,7 +817,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
846
817
  /**
847
818
  * Gets the SideEffects related to an entity type or action that come from an OData Service
848
819
  * Internal routine to get, from converted oData metaModel, SideEffects related to a specific entity type or action.
849
- *
850
820
  * @param source Entity type or action
851
821
  * @returns Array of SideEffects
852
822
  */;
@@ -865,7 +835,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
865
835
 
866
836
  /**
867
837
  * Checks if the annotation is a SideEffects annotation.
868
- *
869
838
  * @param annotation Annotation
870
839
  * @returns Boolean
871
840
  */;
@@ -875,7 +844,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
875
844
 
876
845
  /**
877
846
  * Logs the SideEffects request.
878
- *
879
847
  * @param pathExpressions SideEffects targets
880
848
  * @param context Context
881
849
  */;
@@ -888,7 +856,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
888
856
 
889
857
  /**
890
858
  * Removes the name of the binding parameter on the SideEffects targets.
891
- *
892
859
  * @param sideEffectsTargets SideEffects Targets
893
860
  * @param bindingParameterName Name of binding parameter
894
861
  * @returns SideEffects definition
@@ -915,7 +882,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
915
882
 
916
883
  /**
917
884
  * Remove duplicates in SideEffects targets.
918
- *
919
885
  * @param sideEffectsTargets SideEffects Targets
920
886
  * @returns SideEffects targets without duplicates
921
887
  */;
@@ -939,7 +905,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
939
905
  * Internal routine to get, from converted oData metaModel, SideEffects on actions
940
906
  * related to a specific entity type and to convert these SideEffects with
941
907
  * expected format.
942
- *
943
908
  * @param action Action
944
909
  * @returns Entity type SideEffects dictionary
945
910
  */;
@@ -974,7 +939,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
974
939
  * Internal routine to get, from converted oData metaModel, SideEffects
975
940
  * related to a specific entity type and to convert these SideEffects with
976
941
  * expected format.
977
- *
978
942
  * @param entityType Entity type
979
943
  * @returns Entity type SideEffects dictionary
980
944
  */;
@@ -988,7 +952,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
988
952
 
989
953
  /**
990
954
  * Defines a map for the Sources of sideEffect on the entity to track where those sources are used in SideEffects annotation.
991
- *
992
955
  * @param entityType The entityType we look for side Effects annotation
993
956
  * @param sideEffectsSources The mapping object in construction
994
957
  * @param sideEffectsSources.entities
@@ -1005,7 +968,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
1005
968
 
1006
969
  /**
1007
970
  * Fills the map for the Sources of sideEffect with source entities.
1008
- *
1009
971
  * @param entityType The entityType we look for side Effects annotation
1010
972
  * @param sideEffectsSources The mapping object in construction
1011
973
  * @param sideEffectsSources.entities
@@ -1031,7 +993,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
1031
993
 
1032
994
  /**
1033
995
  * Fills the map for the Sources of sideEffect with source properties.
1034
- *
1035
996
  * @param entityType The entityType we look for side Effects annotation
1036
997
  * @param sideEffectsSources The mapping object in construction
1037
998
  * @param sideEffectsSources.entities
@@ -1058,7 +1019,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
1058
1019
 
1059
1020
  /**
1060
1021
  * Fills the map for the Sources of sideEffect with source events.
1061
- *
1062
1022
  * @param entityType The entityType we look for side Effects annotation
1063
1023
  * @param sideEffectsSources The mapping object in construction
1064
1024
  * @param sideEffectsSources.entities
@@ -1080,7 +1040,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
1080
1040
 
1081
1041
  /**
1082
1042
  * Get the fieldGroupId based on the stored information on th side effect.
1083
- *
1084
1043
  * @param sideEffectInfo
1085
1044
  * @param isImmediate
1086
1045
  * @returns A string for the fieldGroupId.
@@ -1110,4 +1069,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
1110
1069
  }(ServiceFactory);
1111
1070
  return SideEffectsServiceFactory;
1112
1071
  }, false);
1113
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2UiLCJpbml0IiwiY29udGV4dCIsImdldENvbnRleHQiLCJhcHBDb21wb25lbnQiLCJzY29wZU9iamVjdCIsInNpZGVFZmZlY3RzUmVnaXN0cnkiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImJvdW5kQWN0aW9ucyIsInVuQm91bmRBY3Rpb25zIiwiY29udHJvbCIsInJlY29tbWVuZGF0aW9uUmVnaXN0cnkiLCJyb2xlcyIsInRhcmdldENhbGxiYWNrcyIsImluaXRpYWxpemVXZWJTb2NrZXRDb25uZWN0aW9uIiwibW9kZWwiLCJnZXRNb2RlbCIsInVybCIsImdldFdlYlNvY2tldEJhc2VVcmwiLCJjaGFubmVsIiwiZ2V0V2ViU29ja2V0Q2hhbm5lbFVybCIsIkNoYW5uZWxUeXBlIiwiU2lkZUVmZmVjdHNFdmVudHMiLCJ3ZWJTb2NrZXQiLCJjcmVhdGVXZWJTb2NrZXQiLCJhdHRhY2hNZXNzYWdlIiwib25TaWRlRWZmZWN0c0V2ZW50UmVjZWl2ZWQiLCJiaW5kIiwiZXZlbnQiLCJtZXNzYWdlIiwiZ2V0UGFyYW1ldGVyIiwic2VydmVyQWN0aW9uIiwic2lkZUVmZmVjdEV2ZW50TmFtZSIsInNpZGVFZmZlY3RTb3VyY2UiLCJtZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFDb250ZXh0IiwiZGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwicmVsZXZhbnRTaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RXaGVyZUV2ZW50SXNTb3VyY2UiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibGVuZ3RoIiwicmVsZXZhbnRQYWdlcyIsInBhZ2VzIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0VmlzaWJsZVZpZXdzIiwicGFnZSIsInBhZ2VDb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImlzQSIsIl9zaWRlRWZmZWN0cyIsImlzRGF0YVBhdGhSZWxldmFudCIsInB1c2giLCJzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24iLCJpbnRlcmFjdGlvblR5cGUiLCJnZXRTaWRlRWZmZWN0c0ludGVyYWN0aW9uVHlwZSIsImNvbmZpcm1EYXRhUmVmcmVzaCIsImVycm9yIiwibm90aWZ5RGF0YVJlZnJlc2giLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudCIsImludGVyYWN0aW9uVHlwZURlZmluaXRpb24iLCJnZXRNYW5pZmVzdEVudHJ5IiwiYXBwIiwic2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvblR5cGUiLCJldmVudHMiLCJkZWZhdWx0IiwiYWRkQ29udHJvbFNpZGVFZmZlY3RzIiwiZW50aXR5VHlwZSIsInNpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJjb250cm9sU2lkZUVmZmVjdCIsImVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyIsImV4ZWN1dGVBY3Rpb24iLCJ0cmlnZ2VyQWN0aW9uIiwiZ3JvdXBJZCIsImFjdGlvbiIsImJpbmRDb250ZXh0IiwiZ2V0QmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJzdWJtaXRCYXRjaCIsImV4ZWN1dGUiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJjYXBhYmlsaXRpZXMiLCJnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJnZXRPYmplY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiZW50aXR5VHlwZU5hbWUiLCJpc0NvbnRyb2xTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiZ2V0R2xvYmFsT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImVudGl0eVNpZGVFZmZlY3RzIiwiZ2xvYmFsU2lkZUVmZmVjdHMiLCJrZXkiLCJzb3VyY2VFbnRpdGllcyIsInNvdXJjZVByb3BlcnRpZXMiLCJzb3VyY2VFdmVudHMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiYWN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemUiLCJzaWRlRWZmZWN0U291cmNlcyIsInByb3BlcnRpZXMiLCJlbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2UiLCJnZXRTZXJ2aWNlIiwicmVxdWVzdE9iamVjdCIsImdldENhcGFiaWxpdGllcyIsImNvbnZlcnRlZE1ldGFNb2RlbCIsImVudGl0eVR5cGVzIiwiZm9yRWFjaCIsIm1hcEZpZWxkQW5ub3RhdGlvbnMiLCJyZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJtYXBTaWRlRWZmZWN0U291cmNlcyIsImlzQm91bmQiLCJzb3VyY2VFbnRpdHlUeXBlIiwicmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyIsIk9iamVjdCIsImtleXMiLCJzb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MiLCJzb3VyY2UiLCJhZGRSZWNvbW1lbmRhdGlvblJvbGVzIiwic291cmNlTmFtZSIsImhhc093blByb3BlcnR5IiwiaW5wdXQiLCJvdXRwdXQiLCJlbnRpdHlQcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJjb21tb25Bbm5vIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJSZWNvbW1lbmRhdGlvblJvbGUiLCJyb2xlVHlwZSIsInZhbHVlT2YiLCJpbmNsdWRlcyIsIm5hbWUiLCJnZXRSZWNvbW1lbmRhdGlvbnNNYXBwaW5nIiwiY2hlY2tJZkZpZWxkSXNSZWNvbW1lbmRhdGlvblJlbGV2YW50IiwiZmllbGQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInByb3BlcnR5TmFtZSIsImRhdGEiLCJzb3VyY2VQYXRoIiwic3BsaXQiLCJwb3AiLCJtZXRhQ29udGV4dCIsInRhcmdldERhdGFNb2RlbE9iamVjdCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGVOYW1lIiwiaXNFbnRpdHlTZXQiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsInRhcmdldFR5cGUiLCJyZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5IiwiZ2V0UmVjb21tZW5kYXRpb25PdXRwdXRGaWVsZHMiLCJyZW1vdmVDb250cm9sU2lkZUVmZmVjdHMiLCJjb250cm9sSWQiLCJzRW50aXR5VHlwZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInBhdGhFeHByZXNzaW9ucyIsImxvZ1JlcXVlc3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsInByb21pc2VzIiwidHJpZ2dlckFjdGlvbnMiLCJtYXAiLCJQcm9taXNlIiwiYWxsIiwicmVzb2x2ZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImlnbm9yZVRyaWdnZXJBY3Rpb25zIiwiYmFzZUVudGl0eVR5cGUiLCJuYXZpZ2F0aW9uUGF0aCIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsInNpZGVFZmZlY3RzVGFyZ2V0cyIsImZpbHRlciIsImFubm90YXRpb25OYW1lIiwic29tZSIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInByb3BlcnR5UGF0aCIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwic0Fubm90YXRpb25OYW1lIiwiY29uY2F0Iiwic2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uIiwicmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImNhdGNoIiwiTG9nIiwiZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzIiwiZ2V0U2lkZUVmZmVjdFdoZXJlRW50aXR5SXNTb3VyY2UiLCJldmVudE5hbWUiLCJlbnRpdHkiLCJhbm5vdGF0aW9uIiwicXVhbGlmaWVyIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJzb3VyY2VQcm9wZXJ0eSIsImVudGl0eUZpZWxkR3JvdXBJZHMiLCJzaWRlRWZmZWN0SW5mbyIsImdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3QiLCJnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlIiwicmVnaXN0ZXJUYXJnZXRDYWxsYmFjayIsInRhcmdldCIsImNhbGxiYWNrIiwiZGVyZWdpc3RlclRhcmdldENhbGxiYWNrIiwiZ2V0UmVnaXN0ZXJlZENhbGxiYWNrIiwiYWRkVGV4dFByb3BlcnRpZXMiLCJzZXRPZlByb3BlcnRpZXMiLCJTZXQiLCJzZXRPZkVudGl0aWVzIiwiZGF0YU1vZGVsUHJvcGVydHlQYXRoIiwiZ2V0RGF0YU1vZGVsUHJvcGVydGllc0Zyb21BUGF0aCIsImFzc29jaWF0ZWRUZXh0UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwiYWRkVGV4dFByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiZGF0YU1vZGVsVGV4dFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInJlbGF0aXZlTmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVNldCIsImdldFRhcmdldE5hdmlnYXRpb25QYXRoIiwidGFyZ2V0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyIsImlzUHJvcGVydHlBc3NvY2lhdGVkVGV4dE9uRGlmZmVyZW50RW50aXR5U2V0IiwiYWRkIiwiaXNQcm9wZXJ0eSIsImhhcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiY29udmVydFNpZGVFZmZlY3RzIiwiYmluZGluZ1BhcmFtZXRlciIsIlRyaWdnZXJBY3Rpb24iLCJuZXdTaWRlRWZmZWN0cyIsImNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdCIsInJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJmb3JtYXRQcm9wZXJ0aWVzIiwicmVkdWNlIiwicGF0aCIsImlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbiIsInZhbHVlIiwiZm9ybWF0RW50aXRpZXMiLCJ0YXJnZXRFbnRpdHkiLCJTb3VyY2VQcm9wZXJ0aWVzIiwiU291cmNlRW50aXRpZXMiLCJTb3VyY2VFdmVudHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJkYXRhTW9kZWxPYmplY3RQYXRocyIsImNvbnRhaW5lck5hbWUiLCJlbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eVJlbGF0aXZlUGF0aCIsInRlc3RFbnRpdHlUeXBlTmFtZSIsInJlZ2V4UGF0dGVybiIsIm1hdGNoIiwiUmVnRXhwIiwidGVzdEVudGl0eVR5cGUiLCJyZXNvbHZlUGF0aCIsImVudGl0eVNldCIsImVudGl0eVNldHMiLCJmaW5kIiwicmVsYXRlZEVudGl0eVNldCIsInNpbmdsZXRvbnMiLCJzaW5nbGV0b24iLCJlbnRpdHlTZXRDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJkYXRhTW9kZWxFbnRpdHlTZXQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNDb21wbGV4VHlwZSIsImlzRW50aXR5VHlwZSIsImVudGl0eVByb3BlcnR5IiwiZGVzdHJveSIsImdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZSIsImJpbmRpbmdBbGlhcyIsImlzU291cmNlRW50aXR5VHlwZSIsImNvbW1vbkFubm90YXRpb24iLCJwYXJhbWV0ZXJzIiwicGFyYW1ldGVyIiwidHlwZSIsImdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2UiLCJzaWRlRWZmZWN0QW5ubyIsImlzU2lkZUVmZmVjdHNBbm5vdGF0aW9uIiwiJFR5cGUiLCJ0YXJnZXRQYXRocyIsInBhdGhzIiwiZGVidWciLCJiaW5kaW5nUGFyYW1ldGVyTmFtZSIsInJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyIiwidGFyZ2V0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdGllc1BhdGhzIiwidW5pcXVlVGFyZ2V0ZWRFbnRpdGllc1BhdGgiLCJ1bmlxdWVUYXJnZXRQcm9wZXJ0aWVzIiwidW5pcXVlVGFyZ2V0ZWRFbnRpdGllcyIsImVudGl0eVBhdGgiLCJvRGF0YVNpZGVFZmZlY3QiLCJzaWRlRWZmZWN0c1NvdXJjZXMiLCJzaWRlRWZmZWN0RGVmaW5pdGlvbiIsIm1hcFNpZGVFZmZlY3RTb3VyY2VFbnRpdGllcyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VQcm9wZXJ0aWVzIiwibWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyIsInNvdXJjZUVudGl0eSIsIiR0YXJnZXQiLCJoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eSIsInNvdXJjZUV2ZW50IiwidG9TdHJpbmciLCJpc0ltbWVkaWF0ZSIsInNpZGVFZmZlY3RXaXRoUXVhbGlmaWVyIiwiZ2V0SW50ZXJmYWNlIiwiU2VydmljZSIsIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsIm9TZXJ2aWNlQ29udGV4dCIsIlNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG5cdEFjdGlvbixcblx0Q29udmVydGVkTWV0YWRhdGEsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0TmF2aWdhdGlvblByb3BlcnR5LFxuXHROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuXHRQcm9wZXJ0eSxcblx0UHJvcGVydHlQYXRoXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBFZG0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL0VkbVwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1R5cGUgYXMgQ29tbW9uU2lkZUVmZmVjdHNUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5QW5ub3RhdGlvbnNfQ29tbW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25fRWRtXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRTaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uTWFuaWZlc3RTZXR0aW5nLFxuXHRTaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgKiBhcyBNZXRhTW9kZWxDb252ZXJ0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHtcblx0aXNDb21wbGV4VHlwZSxcblx0aXNFbnRpdHlTZXQsXG5cdGlzRW50aXR5VHlwZSxcblx0aXNOYXZpZ2F0aW9uUHJvcGVydHksXG5cdGlzUHJvcGVydHksXG5cdGlzUHJvcGVydHlQYXRoRXhwcmVzc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgY3JlYXRlV2ViU29ja2V0LCBnZXRXZWJTb2NrZXRCYXNlVXJsLCBnZXRXZWJTb2NrZXRDaGFubmVsVXJsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvV2ViU29ja2V0XCI7XG5pbXBvcnQgeyBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgU2FwUGNwV2ViU29ja2V0IGZyb20gXCJzYXAvdWkvY29yZS93cy9TYXBQY3BXZWJTb2NrZXRcIjtcbmltcG9ydCB0eXBlIHsgV2ViU29ja2V0JE1lc3NhZ2VFdmVudCB9IGZyb20gXCJzYXAvdWkvY29yZS93cy9XZWJTb2NrZXRcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwiLi4vQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBlbmhhbmNlRGF0YU1vZGVsUGF0aCwgZ2V0VGFyZ2V0TmF2aWdhdGlvblBhdGgsIGdldFRhcmdldE9iamVjdFBhdGggfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzLCBFbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2UgfSBmcm9tIFwiLi9FbnZpcm9ubWVudFNlcnZpY2VGYWN0b3J5XCI7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5QW5ub3RhdGlvbnNXaXRoUmVjb21tZW5kYXRpb24gPSBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiAmIHtcblx0UmVjb21tZW5kYXRpb25Sb2xlPzogc3RyaW5nO1xufTtcblxudHlwZSBTaWRlRWZmZWN0c1NldHRpbmdzID0ge307XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzRW50aXR5VHlwZSA9IHtcblx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c1RhcmdldCA9IFNpZGVFZmZlY3RzRW50aXR5VHlwZSB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHR0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0dGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdO1xufTtcblxudHlwZSBCYXNlU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRzb3VyY2VQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHNvdXJjZUVudGl0aWVzPzogU2lkZUVmZmVjdHNFbnRpdHlUeXBlW107XG5cdHNvdXJjZUV2ZW50cz86IHN0cmluZ1tdO1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn0gJiBTaWRlRWZmZWN0c1RhcmdldFR5cGU7XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gQmFzZVNpZGVFZmZlY3RzVHlwZSAmIHtcblx0dHJpZ2dlckFjdGlvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0cGF0aEV4cHJlc3Npb25zPzogU2lkZUVmZmVjdHNUYXJnZXRbXTtcblx0dHJpZ2dlckFjdGlvbnM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSBQYXJ0aWFsPEJhc2VTaWRlRWZmZWN0c1R5cGU+ICYge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcblx0c291cmNlUHJvcGVydGllczogc3RyaW5nW107XG5cdHNvdXJjZUNvbnRyb2xJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUeXBlID0gQ29udHJvbFNpZGVFZmZlY3RzVHlwZSB8IE9EYXRhU2lkZUVmZmVjdHNUeXBlO1xuXG4vL1RPRE8gZml4IHRoaXMgdHlwZSBpbiB0aGUgdXggdm9jYWJ1bGFyaWVzXG4vL1RPRE86IFNvdXJjZSBFdmVudHMgYXJlIHN0aWxsIGV4cGVyaW1lbnRhbCwgcmVtb3ZlIG9uY2UgcHVibGljXG50eXBlIENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllciA9IENvbW1vblNpZGVFZmZlY3RzVHlwZSAmIHsgcXVhbGlmaWVyPzogc3RyaW5nOyBTb3VyY2VFdmVudHM/OiBFZG0uU3RyaW5nW10gfTtcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2UgPSB7IGVudGl0eTogc3RyaW5nOyBxdWFsaWZpZXI/OiBzdHJpbmc7IGhhc1VuaXF1ZVNvdXJjZVByb3BlcnR5PzogYm9vbGVhbiB9O1xuXG50eXBlIFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnkgPSB7XG5cdG9EYXRhOiB7XG5cdFx0ZW50aXRpZXM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdGJvdW5kQWN0aW9uczoge1xuXHRcdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuXHRcdFx0fTtcblx0XHRcdHVuQm91bmRBY3Rpb25zOiB7XG5cdFx0XHRcdFthY3Rpb246IHN0cmluZ106IEFjdGlvblNpZGVFZmZlY3RzVHlwZTtcblx0XHRcdH07XG5cdFx0fTtcblx0fTtcblx0Y29udHJvbDoge1xuXHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXHR9O1xufTtcblxudHlwZSBSZWNvbW1lbmRhdGlvbnNSb2xlcyA9IHtcblx0aW5wdXQ6IHN0cmluZ1tdO1xuXHRvdXRwdXQ6IHN0cmluZ1tdO1xuXHRyZXF1aXJlZD86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgUmVjb21tZW5kYXRpb25zUmVnaXN0cnkgPSB7XG5cdHJvbGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvbW1lbmRhdGlvbnNSb2xlcz47XG59O1xuXG50eXBlIFdlYlNvY2tldE1lc3NhZ2UgPSB7XG5cdHNlcnZlckFjdGlvbjogXCJSYWlzZVNpZGVFZmZlY3RcIjtcblx0c2lkZUVmZmVjdEV2ZW50TmFtZTogc3RyaW5nO1xuXHRzaWRlRWZmZWN0U291cmNlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGFwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblxuXHRwcml2YXRlIHNpZGVFZmZlY3RzUmVnaXN0cnkhOiBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5O1xuXG5cdHByaXZhdGUgcmVjb21tZW5kYXRpb25SZWdpc3RyeSE6IFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5O1xuXG5cdHByaXZhdGUgY2FwYWJpbGl0aWVzITogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBzb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MhOiB7XG5cdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdH07XG5cblx0Ly8gQ2FsbGJhY2sgbWV0aG9kcyB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBzaWRlIGVmZmVjdCB0YXJnZXQgaXMgaGl0XG5cdHByaXZhdGUgdGFyZ2V0Q2FsbGJhY2tzITogUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+O1xuXG5cdC8vIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHJldHJpZXZlIFNpZGVFZmZlY3RzIGV2ZW50c1xuXHRwcml2YXRlIHdlYlNvY2tldD86IFNhcFBjcFdlYlNvY2tldDtcblxuXHQvLyBJbnRlcmFjdGlvbiB0eXBlIGZvciBTaWRlRWZmZWN0cyBldmVudHNcblx0cHJpdmF0ZSBpbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uPzogU2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvbk1hbmlmZXN0U2V0dGluZztcblxuXHQvLyAhOiBtZWFucyB0aGF0IHdlIGtub3cgaXQgd2lsbCBiZSBhc3NpZ25lZCBiZWZvcmUgdXNhZ2Vcblx0aW5pdCgpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0dGhpcy5hcHBDb21wb25lbnQgPSBjb250ZXh0Py5zY29wZU9iamVjdCBhcyBBcHBDb21wb25lbnQ7XG5cdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5ID0ge1xuXHRcdFx0b0RhdGE6IHtcblx0XHRcdFx0ZW50aXRpZXM6IHt9LFxuXHRcdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdFx0Ym91bmRBY3Rpb25zOiB7fSxcblx0XHRcdFx0XHR1bkJvdW5kQWN0aW9uczoge31cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2w6IHt9XG5cdFx0fTtcblxuXHRcdHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeSA9IHtcblx0XHRcdHJvbGVzOiB7fVxuXHRcdH07XG5cdFx0dGhpcy50YXJnZXRDYWxsYmFja3MgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0cyB0byBhIGdpdmVuIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHJldHJpZXZlIFNpZGVFZmZlY3RzIGV2ZW50cy5cblx0ICpcblx0ICovXG5cdGluaXRpYWxpemVXZWJTb2NrZXRDb25uZWN0aW9uKCk6IHZvaWQge1xuXHRcdGNvbnN0IG1vZGVsID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB1cmwgPSBnZXRXZWJTb2NrZXRCYXNlVXJsKG1vZGVsKTtcblx0XHRjb25zdCBjaGFubmVsID0gZ2V0V2ViU29ja2V0Q2hhbm5lbFVybChDaGFubmVsVHlwZS5TaWRlRWZmZWN0c0V2ZW50cywgbW9kZWwpO1xuXG5cdFx0aWYgKHVybCAmJiBjaGFubmVsKSB7XG5cdFx0XHR0aGlzLndlYlNvY2tldCA9IGNyZWF0ZVdlYlNvY2tldChDaGFubmVsVHlwZS5TaWRlRWZmZWN0c0V2ZW50cywgbW9kZWwpO1xuXHRcdFx0dGhpcy53ZWJTb2NrZXQuYXR0YWNoTWVzc2FnZSh0aGlzLm9uU2lkZUVmZmVjdHNFdmVudFJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb25uZWN0ZWQgV2ViU29ja2V0IHNlbmRzIGEgbWVzc2FnZS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB3aXRoIHRoZSByZWxldmFudCBzaWRlRWZmZWN0IGluZm9ybWF0aW9uXG5cdCAqL1xuXHRhc3luYyBvblNpZGVFZmZlY3RzRXZlbnRSZWNlaXZlZChldmVudDogV2ViU29ja2V0JE1lc3NhZ2VFdmVudCAmIEV2ZW50PHsgcGNwRmllbGRzPzogV2ViU29ja2V0TWVzc2FnZSB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwY3BGaWVsZHNcIik7XG5cblx0XHRpZiAobWVzc2FnZT8uc2VydmVyQWN0aW9uICE9PSBcIlJhaXNlU2lkZUVmZmVjdFwiIHx8ICFtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUgfHwgIW1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSkge1xuXHRcdFx0Ly8gbWVzc2FnZSBpcyBub3QgcmVsZXZhbnRcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhUGF0aCA9IHRoaXMuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQobWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKTtcblx0XHRjb25zdCBkYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFQYXRoKTtcblx0XHRjb25zdCByZWxldmFudFNpZGVFZmZlY3RzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKFxuXHRcdFx0ZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0bWVzc2FnZS5zaWRlRWZmZWN0RXZlbnROYW1lXG5cdFx0KTtcblxuXHRcdGlmIChyZWxldmFudFNpZGVFZmZlY3RzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gbm8gc2lkZSBlZmZlY3QgZm9yIHRoaXMgc291cmNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVsZXZhbnRQYWdlczogUGFnZUNvbnRyb2xsZXJbXSA9IFtdO1xuXHRcdGNvbnN0IHBhZ2VzID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZ2V0VmlzaWJsZVZpZXdzKCk7XG5cdFx0Zm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG5cdFx0XHRjb25zdCBwYWdlQ29udHJvbGxlciA9IHBhZ2UuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwYWdlQ29udHJvbGxlci5pc0E8UGFnZUNvbnRyb2xsZXI+KFwic2FwLmZlLmNvcmUuUGFnZUNvbnRyb2xsZXJcIikgJiZcblx0XHRcdFx0cGFnZUNvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLmlzRGF0YVBhdGhSZWxldmFudChtZXNzYWdlLnNpZGVFZmZlY3RTb3VyY2UpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsZXZhbnRQYWdlcy5wdXNoKHBhZ2VDb250cm9sbGVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocmVsZXZhbnRQYWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIG5vIHJlbGV2YW50IHBhZ2UgZm91bmQgZm9yIHRoaXMgc291cmNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gd2UgYXNrIHRoZSB1c2VyIHRvIGNvbmZpcm0gdGhlIHJlZnJlc2ggb3Igbm90aWZ5IHRoZSB1c2VyLCB3ZSB1c2UgdGhlIG1vc3Qgc3BlY2lmaWMgcGFnZVxuXHRcdGNvbnN0IHNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiA9IHJlbGV2YW50UGFnZXNbcmVsZXZhbnRQYWdlcy5sZW5ndGggLSAxXS5fc2lkZUVmZmVjdHM7XG5cdFx0Y29uc3QgaW50ZXJhY3Rpb25UeXBlID0gdGhpcy5nZXRTaWRlRWZmZWN0c0ludGVyYWN0aW9uVHlwZShtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUpO1xuXG5cdFx0c3dpdGNoIChpbnRlcmFjdGlvblR5cGUpIHtcblx0XHRcdGNhc2UgXCJDb25maXJtYXRpb25cIjpcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24uY29uZmlybURhdGFSZWZyZXNoKCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdGlmaWNhdGlvblwiOlxuXHRcdFx0XHRzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24ubm90aWZ5RGF0YVJlZnJlc2goKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTm9uZVwiOlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBub3cgcmVmcmVzaCB0aGUgcGFnZXMsIGZvcndhcmQgdGhpcyB0YXNrIHRvIHRoZSBzaWRlIGVmZmVjdHMgY29udHJvbGxlciBleHRlbnNpb25zIHRvIGFsbG93IG92ZXJyaWRpbmcgcGVyIHBhZ2UgKGkuZS4gTFIpXG5cdFx0Zm9yIChjb25zdCBwYWdlIG9mIHJlbGV2YW50UGFnZXMpIHtcblx0XHRcdGF3YWl0IHBhZ2UuX3NpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KG1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZSwgbWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHNpZGUgZWZmZWN0cyBpbnRlcmFjdGlvbiB0eXBlIGZyb20gdGhlIG1hbmlmZXN0LlxuXHQgKlxuXHQgKiAgQHBhcmFtIGV2ZW50IFRoZSBzaWRlIGVmZmVjdHMgZXZlbnQgbmFtZVxuXHQgKiBAcmV0dXJucyBUaGUgc2lkZSBlZmZlY3RzIGludGVyYWN0aW9uIHR5cGVcblx0ICovXG5cdGdldFNpZGVFZmZlY3RzSW50ZXJhY3Rpb25UeXBlKGV2ZW50Pzogc3RyaW5nKTogU2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvblR5cGUge1xuXHRcdGlmICghdGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uKSB7XG5cdFx0XHR0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24gPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmZlXCIpPy5hcHA/LnNpZGVFZmZlY3RzRXZlbnRzSW50ZXJhY3Rpb25UeXBlO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHQvLyBhIGdsb2JhbCBpbnRlcmFjdGlvbiB0eXBlIGlzIGRlZmluZWRcblx0XHRcdHJldHVybiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb247XG5cdFx0fVxuXG5cdFx0aWYgKGV2ZW50ICYmIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbj8uZXZlbnRzPy5bZXZlbnRdKSB7XG5cdFx0XHQvLyBhbiBpbnRlcmFjdGlvbiB0eXBlIGlzIGRlZmluZWQgZm9yIHRoZSBldmVudFxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbi5ldmVudHNbZXZlbnRdO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24/LmRlZmF1bHQpIHtcblx0XHRcdC8vIGEgZGVmYXVsdCBpbnRlcmFjdGlvbiB0eXBlIGlzIGRlZmluZWQgZm9yIHRoZSBldmVudFxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbi5kZWZhdWx0O1xuXHRcdH1cblxuXHRcdHJldHVybiBcIk5vdGlmaWNhdGlvblwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoZW50aXR5VHlwZTogc3RyaW5nLCBzaWRlRWZmZWN0OiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0aWYgKHNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBjb250cm9sU2lkZUVmZmVjdDogQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0Li4uc2lkZUVmZmVjdCxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlUeXBlfS9TaWRlRWZmZWN0c0ZvckNvbnRyb2wvJHtzaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZH1gXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzID0gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbZW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRlbnRpdHlDb250cm9sU2lkZUVmZmVjdHNbY29udHJvbFNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXSA9IGNvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbZW50aXR5VHlwZV0gPSBlbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHRyaWdnZXJBY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGhvdXQgZGF0YSBvciB3aXRoIGEgcmV0dXJuIHZhbHVlIGNvbnRleHQgd2hlbiB0aGUgYWN0aW9uIGNhbGwgc3VjY2VlZHNcblx0ICovXG5cdHB1YmxpYyBhc3luYyBleGVjdXRlQWN0aW9uKHRyaWdnZXJBY3Rpb246IHN0cmluZywgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFjdGlvbiA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHt0cmlnZ2VyQWN0aW9ufSguLi4pYCwgY29udGV4dCk7XG5cdFx0Z3JvdXBJZCA9IGdyb3VwSWQgfHwgY29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdC8vIHRoZSB0cmlnZ2VyQWN0aW9uIGlzIGV4ZWN1dGVkIGluIHNhbWUgJGJhdGNoIGJ1dCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0Y29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRcdGF3YWl0IGFjdGlvbi5leGVjdXRlKGdyb3VwSWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHJldHVybnMgQ29udmVydGVkIE9EYXRhIG1ldGFNb2RlbFxuXHQgKi9cblx0cHVibGljIGdldENvbnZlcnRlZE1ldGFNb2RlbCgpOiBDb252ZXJ0ZWRNZXRhZGF0YSB7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyh0aGlzLmdldE1ldGFNb2RlbCgpLCB0aGlzLmNhcGFiaWxpdGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdGVudGl0eVR5cGUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KG1ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBlbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJcyBhIFNpZGVFZmZlY3RzIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBUaGUgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgU2lkZUVmZmVjdHMgaXMgZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCwgb3RoZXJ3aXNlIGZhbHNlXG5cdCAqL1xuXHRwdWJsaWMgaXNDb250cm9sU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSk6IHNpZGVFZmZlY3RzIGlzIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUge1xuXHRcdHJldHVybiAhIShzaWRlRWZmZWN0cyBhcyBDb250cm9sU2lkZUVmZmVjdHNUeXBlKS5zb3VyY2VDb250cm9sSWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2xvYmFsIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBHbG9iYWwgU2lkZUVmZmVjdHNcblx0ICovXG5cdHB1YmxpYyBnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRjb25zdCBlbnRpdHlTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZSk7XG5cdFx0Y29uc3QgZ2xvYmFsU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHlTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSBlbnRpdHlTaWRlRWZmZWN0c1trZXldO1xuXHRcdFx0aWYgKCFzaWRlRWZmZWN0cy5zb3VyY2VFbnRpdGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlUHJvcGVydGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlRXZlbnRzKSB7XG5cdFx0XHRcdGdsb2JhbFNpZGVFZmZlY3RzLnB1c2goc2lkZUVmZmVjdHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZ2xvYmFsU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0PzogQ29udGV4dCk6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGlmIChlbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbZW50aXR5VHlwZV0/LlthY3Rpb25OYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5hY3Rpb25zLnVuQm91bmRBY3Rpb25zPy5bYWN0aW9uTmFtZV07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqICBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB3aXRoIHRoZSBTaWRlRWZmZWN0cyBzZXJ2aWNlIG9uY2UgZGF0YSBoYXMgYmVlbiB3cml0dGVuXG5cdCAqL1xuXHRhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dGhpcz4ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSA9IHtcblx0XHRcdGVudGl0aWVzOiB7fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0ZXZlbnRzOiB7fVxuXHRcdH07XG5cdFx0Y29uc3QgZW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlID0gKGF3YWl0IHRoaXMuYXBwQ29tcG9uZW50LmdldFNlcnZpY2UoXG5cdFx0XHRcImVudmlyb25tZW50Q2FwYWJpbGl0aWVzXCJcblx0XHQpKSBhcyBFbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2U7XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHRcdGlmIChtb2RlbD8uaXNBPy48T0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgTWV0YU1vZGVsIHRvIGJlIHJlcXVlc3RlZFxuXHRcdFx0YXdhaXQgbW9kZWwuZ2V0TWV0YU1vZGVsKCkucmVxdWVzdE9iamVjdChcIi8kRW50aXR5Q29udGFpbmVyL1wiKTtcblx0XHRcdHRoaXMuY2FwYWJpbGl0aWVzID0gZW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlLmdldENhcGFiaWxpdGllcygpO1xuXG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmVudGl0eVR5cGVzLmZvckVhY2goKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpID0+IHtcblx0XHRcdFx0dGhpcy5tYXBGaWVsZEFubm90YXRpb25zKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuZW50aXRpZXNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gdGhpcy5yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7XG5cdFx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZXMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdFNvdXJjZXMpO1xuXHRcdFx0fSk7XG5cdFx0XHRjb252ZXJ0ZWRNZXRhTW9kZWwuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb246IEFjdGlvbikgPT4ge1xuXHRcdFx0XHRpZiAoYWN0aW9uLmlzQm91bmQpIHtcblx0XHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbYWN0aW9uLnNvdXJjZUVudGl0eVR5cGUhLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbYWN0aW9uLnNvdXJjZUVudGl0eVR5cGUhLmZ1bGx5UXVhbGlmaWVkTmFtZV0sXG5cdFx0XHRcdFx0XHQuLi50aGlzLnJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoYWN0aW9uKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMudW5Cb3VuZEFjdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy51bkJvdW5kQWN0aW9ucyxcblx0XHRcdFx0XHRcdC4uLnRoaXMucmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhhY3Rpb24pXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMoc2lkZUVmZmVjdFNvdXJjZXMuZXZlbnRzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuaW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5zb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MgPSBzaWRlRWZmZWN0U291cmNlcztcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByaXZhdGUgbWFwRmllbGRBbm5vdGF0aW9ucyhzb3VyY2U6IEVudGl0eVR5cGUpOiB2b2lkIHtcblx0XHRjb25zdCBhZGRSZWNvbW1lbmRhdGlvblJvbGVzID0gKHNvdXJjZU5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXMuaGFzT3duUHJvcGVydHkoYCR7c291cmNlTmFtZX1gKSkge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlTmFtZX1gXSA9IHtcblx0XHRcdFx0XHRpbnB1dDogW10sXG5cdFx0XHRcdFx0b3V0cHV0OiBbXVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0c291cmNlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGNvbW1vbkFubm8gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24gYXMgUHJvcGVydHlBbm5vdGF0aW9uc1dpdGhSZWNvbW1lbmRhdGlvbjtcblx0XHRcdGlmIChjb21tb25Bbm5vPy5SZWNvbW1lbmRhdGlvblJvbGUpIHtcblx0XHRcdFx0Y29uc3Qgcm9sZVR5cGUgPSBjb21tb25Bbm5vLlJlY29tbWVuZGF0aW9uUm9sZTtcblx0XHRcdFx0aWYgKHJvbGVUeXBlLnZhbHVlT2YoKS5pbmNsdWRlcyhcIklucHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0uaW5wdXQucHVzaChwcm9wZXJ0eS5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocm9sZVR5cGUudmFsdWVPZigpLmluY2x1ZGVzKFwiT3V0cHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0ub3V0cHV0LnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZWNvbW1lbmRhdGlvbnNNYXBwaW5nKCk6IFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5IHtcblx0XHRyZXR1cm4gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBpcyBwYXJ0IG9mIFJlY29tbWVuZGF0aW9uJ3MgaW5wdXQgbWFwcGluZyBhbmQgZnJvbSB0aGUgc2FtZSBlbnRpdHkuXG5cdCAqIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZpZWxkIGlzIGhhcyByZWNvbW1lbmRhdGlvbiByb2xlIC0gSW5wdXQgYW5ub3RhdGlvblxuXHQgKi9cblx0cHVibGljIGNoZWNrSWZGaWVsZElzUmVjb21tZW5kYXRpb25SZWxldmFudChmaWVsZDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGZpZWxkLmRhdGEoKS5zb3VyY2VQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dD8uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gKG1ldGFNb2RlbCBhcyBPRGF0YU1ldGFNb2RlbCk/LmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHRhcmdldERhdGFNb2RlbE9iamVjdCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8RW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5PihtZXRhQ29udGV4dClcblx0XHRcdFx0LnRhcmdldE9iamVjdCE7XG5cdFx0XHRsZXQgdGFyZ2V0RW50aXR5VHlwZU5hbWU7XG5cdFx0XHRpZiAoaXNFbnRpdHlTZXQodGFyZ2V0RGF0YU1vZGVsT2JqZWN0KSkge1xuXHRcdFx0XHR0YXJnZXRFbnRpdHlUeXBlTmFtZSA9IHRhcmdldERhdGFNb2RlbE9iamVjdC5lbnRpdHlUeXBlPy5uYW1lO1xuXHRcdFx0fSBlbHNlIGlmIChpc05hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXREYXRhTW9kZWxPYmplY3QpKSB7XG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGVOYW1lID0gdGFyZ2V0RGF0YU1vZGVsT2JqZWN0LnRhcmdldFR5cGU/Lm5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ID0gdGFyZ2V0RW50aXR5VHlwZU5hbWUgJiYgdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW3RhcmdldEVudGl0eVR5cGVOYW1lXTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ICYmIHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHk/LmlucHV0Py5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHJldHVybnMgdGhlIHByb3BlcnRpZXMgaW4gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSB3aGljaCBhcmUgbWFya2VkIGFzIFJlY29tbWVuZGF0aW9uUm9sZSBPdXRwdXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gT3V0cHV0IGZpZWxkcyBuZWVkcyB0byBiZSBmaWd1cmVkXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHdoaWNoIGFyZSBtYXJrZWQgUmVjb21tZW5kYXRpb25Sb2xlIE91dHB1dFxuXHQgKi9cblx0cHVibGljIGdldFJlY29tbWVuZGF0aW9uT3V0cHV0RmllbGRzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0Ly9UT0RPOiBXZSBoYXZlIHRvIGNvbnNpZGVyIDE6MSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2VsbC5cblx0XHRjb25zdCByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ID0gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2VudGl0eVR5cGVOYW1lXTtcblx0XHRpZiAocmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eT8ub3V0cHV0Py5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eS5vdXRwdXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoY29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbCkuZm9yRWFjaCgoc0VudGl0eVR5cGUpID0+IHtcblx0XHRcdGlmICh0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtzRW50aXR5VHlwZV1bY29udHJvbElkXSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbc0VudGl0eVR5cGVdW2NvbnRyb2xJZF07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhFeHByZXNzaW9ucyBUYXJnZXRzIG9mIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzKHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMubG9nUmVxdWVzdChwYXRoRXhwcmVzc2lvbnMsIGNvbnRleHQpO1xuXHRcdGF3YWl0IGNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKHBhdGhFeHByZXNzaW9ucywgZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIGZvciBhbiBPRGF0YSBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGFuZCBhY3Rpb24gZXhlY3V0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24oc2lkZUVmZmVjdHM6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8KHZvaWQgfCB1bmRlZmluZWQpW10+IHtcblx0XHRsZXQgcHJvbWlzZXM6IFByb21pc2U8dm9pZCB8IHVuZGVmaW5lZD5bXTtcblxuXHRcdGlmIChzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRwcm9taXNlcyA9IHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zLm1hcChhc3luYyAoYWN0aW9uTmFtZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5leGVjdXRlQWN0aW9uKGFjdGlvbk5hbWUsIGNvbnRleHQpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2VzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucywgY29udGV4dCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9taXNlcy5sZW5ndGggPyBQcm9taXNlLmFsbChwcm9taXNlcykgOiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBCYXRjaCBncm91cCBmb3IgdGhlIHF1ZXJ5XG5cdCAqIEBwYXJhbSBpZ25vcmVUcmlnZ2VyQWN0aW9ucyBJZiB0cnVlLCB3ZSBkbyBub3QgdHJpZ2dlciBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIHNpZGUgZWZmZWN0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHJlcXVlc3Qgb24gU0FQVUk1IGNvbnRleHRcblx0ICovXG5cdHB1YmxpYyBhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRncm91cElkPzogc3RyaW5nLFxuXHRcdGlnbm9yZVRyaWdnZXJBY3Rpb25zID0gZmFsc2Vcblx0KTogUHJvbWlzZTx2b2lkIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgYmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRpZiAoYmFzZUVudGl0eVR5cGUpIHtcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gYCR7bmF2aWdhdGlvblByb3BlcnR5fS9gO1xuXHRcdFx0Y29uc3QgZW50aXR5U2lkZUVmZmVjdHMgPSB0aGlzLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoYmFzZUVudGl0eVR5cGUpO1xuXHRcdFx0bGV0IHRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRsZXQgdGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdID0gW107XG5cdFx0XHRsZXQgc2lkZUVmZmVjdHNUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRPYmplY3Qua2V5cyhlbnRpdHlTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0Ly8gMS4gU291cmNlRW50aXRpZXMgbWF0Y2ggT1Jcblx0XHRcdFx0XHQvLyAyLiBPbmx5IDEgU291cmNlUHJvcGVydGllcyBhbmQgbWF0Y2hcblx0XHRcdFx0XHQoYW5ub3RhdGlvbk5hbWUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IGVudGl0eVNpZGVFZmZlY3RzW2Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChzaWRlRWZmZWN0cy5zb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHQobmF2aWdhdGlvbikgPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbmF2aWdhdGlvblByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdCkgfHxcblx0XHRcdFx0XHRcdFx0KHNpZGVFZmZlY3RzLnNvdXJjZVByb3BlcnRpZXM/Lmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzLnNvdXJjZVByb3BlcnRpZXMuc29tZShcblx0XHRcdFx0XHRcdFx0XHRcdChwcm9wZXJ0eVBhdGgpID0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aC5zdGFydHNXaXRoKG5hdmlnYXRpb25QYXRoKSAmJiAhcHJvcGVydHlQYXRoLnJlcGxhY2UobmF2aWdhdGlvblBhdGgsIFwiXCIpLmluY2x1ZGVzKFwiL1wiKVxuXHRcdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuZm9yRWFjaCgoc0Fubm90YXRpb25OYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSBlbnRpdHlTaWRlRWZmZWN0c1tzQW5ub3RhdGlvbk5hbWVdO1xuXHRcdFx0XHRcdGlmIChzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9uICYmICFpZ25vcmVUcmlnZ2VyQWN0aW9ucykge1xuXHRcdFx0XHRcdFx0dGhpcy5leGVjdXRlQWN0aW9uKHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb24sIGNvbnRleHQsIGdyb3VwSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzID0gdGFyZ2V0UHJvcGVydGllcy5jb25jYXQoc2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0XHRcdFx0dGFyZ2V0RW50aXRpZXMgPSB0YXJnZXRFbnRpdGllcy5jb25jYXQoc2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGUgdGFyZ2V0c1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHtcblx0XHRcdFx0dGFyZ2V0UHJvcGVydGllczogdGFyZ2V0UHJvcGVydGllcyxcblx0XHRcdFx0dGFyZ2V0RW50aXRpZXM6IHRhcmdldEVudGl0aWVzXG5cdFx0XHR9KTtcblx0XHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IFsuLi5zaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24udGFyZ2V0UHJvcGVydGllcywgLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldEVudGl0aWVzXTtcblx0XHRcdGlmIChzaWRlRWZmZWN0c1RhcmdldHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1RhcmdldHMsIGNvbnRleHQsIGdyb3VwSWQpLmNhdGNoKChlcnJvcikgPT5cblx0XHRcdFx0XHRMb2cuZXJyb3IoYFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgTmF2aWdhdGlvbiBQcm9wZXJ0eSAke25hdmlnYXRpb25Qcm9wZXJ0eX1gLCBlcnJvcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGNvbnRyb2xzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgTmFtZVxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW2VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzJyBxdWFsaWZpZXIgYW5kIG93bmVyIGVudGl0eSB3aGVyZSB0aGlzIGVudGl0eSBpcyB1c2VkIGFzIHNvdXJjZS5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIGZ1bGx5IHF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNpZGVFZmZlY3RzIGluZm9cblx0ICovXG5cdHB1YmxpYyBnZXRTaWRlRWZmZWN0V2hlcmVFbnRpdHlJc1NvdXJjZShlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzLmVudGl0aWVzW2VudGl0eVR5cGVOYW1lXSB8fCBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzJyBxdWFsaWZpZXJzIHdoZXJlIHRoaXMgZXZlbnQgaXMgdXNlZCBhcyBzb3VyY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmdWxseSBxdWFsaWZpZWRcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBTaWRlIEVmZmVjdCBldmVudCBuYW1lXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNpZGVFZmZlY3RzIGluZm9cblx0ICovXG5cdHB1YmxpYyBnZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nKTogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzLmV2ZW50c1tldmVudE5hbWVdPy5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5lbnRpdHkgPT09IGVudGl0eVR5cGVOYW1lKSB8fCBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgc2lkZUVmZmVjdCBldmVudCBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBTaWRlRWZmZWN0cyBldmVudCB3aGljaCBzaG91bGQgYmVcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0ICovXG5cdGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KGV2ZW50OiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBkYXRhTW9kZWwgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YVBhdGgpO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgZXZlbnQpO1xuXHRcdGxldCB0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCB0YXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNFbnRpdHlUeXBlW10gPSBbXTtcblxuXHRcdHNpZGVFZmZlY3RzLmZvckVhY2goKHNpZGVFZmZlY3QpID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb24gPVxuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuZW50aXRpZXNbZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXT8uW1xuXHRcdFx0XHRcdGAke3NpZGVFZmZlY3QuZW50aXR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMjJHtzaWRlRWZmZWN0LnF1YWxpZmllcn1gXG5cdFx0XHRcdF07XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzID0gdGFyZ2V0UHJvcGVydGllcy5jb25jYXQoYW5ub3RhdGlvbi50YXJnZXRQcm9wZXJ0aWVzKTtcblx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KGFubm90YXRpb24udGFyZ2V0RW50aXRpZXMpO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHR0YXJnZXRFbnRpdGllczogdGFyZ2V0RW50aXRpZXNcblx0XHR9KTtcblx0XHRjb25zdCBzaWRlRWZmZWN0c1RhcmdldHMgPSBbLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldFByb3BlcnRpZXMsIC4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRFbnRpdGllc107XG5cdFx0aWYgKHNpZGVFZmZlY3RzVGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzVGFyZ2V0cywgY29udGV4dCwgZ3JvdXBJZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgRXZlbnQgJHtldmVudH1gLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21tb24gbWV0aG9kIHRvIGdldCB0aGUgZmllbGQgZ3JvdXBJZHMgZm9yIGEgc291cmNlIGVudGl0eSBhbmQgYSBzb3VyY2UgcHJvcGVydHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2VFbnRpdHlUeXBlXG5cdCAqIEBwYXJhbSBzb3VyY2VQcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2YgZmllbGRHcm91cElkc1xuXHQgKi9cblx0cHVibGljIGNvbXB1dGVGaWVsZEdyb3VwSWRzKHNvdXJjZUVudGl0eVR5cGU6IHN0cmluZywgc291cmNlUHJvcGVydHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBlbnRpdHlGaWVsZEdyb3VwSWRzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFbnRpdHlJc1NvdXJjZShzb3VyY2VFbnRpdHlUeXBlKS5tYXAoKHNpZGVFZmZlY3RJbmZvKSA9PlxuXHRcdFx0dGhpcy5nZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvLCB0cnVlKVxuXHRcdCk7XG5cdFx0cmV0dXJuIGVudGl0eUZpZWxkR3JvdXBJZHMuY29uY2F0KFxuXHRcdFx0dGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlKHNvdXJjZVByb3BlcnR5KS5tYXAoKHNpZGVFZmZlY3RJbmZvKSA9PlxuXHRcdFx0XHR0aGlzLmdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3Qoc2lkZUVmZmVjdEluZm8pXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzJyBxdWFsaWZpZXIgYW5kIG93bmVyIGVudGl0eSB3aGVyZSB0aGlzIHByb3BlcnR5IGlzIHVzZWQgYXMgc291cmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IGZ1bGx5IHF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNpZGVFZmZlY3RzIGluZm9cblx0ICovXG5cdHB1YmxpYyBnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlKHByb3BlcnR5TmFtZTogc3RyaW5nKTogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSB8fCBbXTtcblx0fVxuXG5cdC8vIGNoZWNrIGlmIGNhbiBkZWZpbmUgd2hldGhlciBjYWxsYmFja3MgYXJlIGFzeW5jLiBPdGhlcndpc2UgY29tbWVudFxuXHQvLyBvbmx5IG9uZSBjYWxsYmFjayBmb3Igb25lIHRhcmdldFxuXHRwdWJsaWMgcmVnaXN0ZXJUYXJnZXRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy50YXJnZXRDYWxsYmFja3NbdGFyZ2V0XSA9IGNhbGxiYWNrO1xuXHR9XG5cblx0cHVibGljIGRlcmVnaXN0ZXJUYXJnZXRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGRlbGV0ZSB0aGlzLnRhcmdldENhbGxiYWNrc1t0YXJnZXRdO1xuXHR9XG5cblx0Ly8gcGFzcyBwYXJhbWV0ZXJcblx0cHVibGljIGdldFJlZ2lzdGVyZWRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZyk6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXRDYWxsYmFja3NbdGFyZ2V0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHVwZGF0ZWQgc2lkZSBlZmZlY3RzIGRlZmluaXRpb24gd2l0aCBhbGwgdGV4dCByZWxhdGVkIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1RhcmdldHMgVGhlIHRhcmdldHMgb2YgdGhlIHNpZGUgZWZmZWN0XG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgc2lkZSBlZmZlY3QgaXMgcmVnaXN0ZXJlZFxuXHQgKiBAcmV0dXJucyBVcGRhdGVkIHNpZGUgZWZmZWN0cycgdGFyZ2V0cyB3aXRoIGFkZGVkIHRleHQgcHJvcGVydGllcyBvciBlbnRpdGllc1xuXHQgKi9cblx0cHJpdmF0ZSBhZGRUZXh0UHJvcGVydGllcyhzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSwgZW50aXR5VHlwZT86IEVudGl0eVR5cGUpOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUge1xuXHRcdGNvbnN0IHNldE9mUHJvcGVydGllcyA9IG5ldyBTZXQoc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdGNvbnN0IHNldE9mRW50aXRpZXMgPSBuZXcgU2V0KHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcy5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSk7XG5cdFx0Ly8gR2VuZXJhdGUgYWxsIHBhdGhzIHJlbGF0ZWQgdG8gdGhlIHRleHQgcHJvcGVydGllcyBhbmQgbm90IGFscmVhZHkgY292ZXJlZCBieSB0aGUgU2lkZUVmZmVjdHNcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBvZiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcykge1xuXHRcdFx0Zm9yIChjb25zdCBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggb2YgdGhpcy5nZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoKHByb3BlcnR5UGF0aCwgZW50aXR5VHlwZSkpIHtcblx0XHRcdFx0Y29uc3QgYXNzb2NpYXRlZFRleHRQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgoZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdCk7XG5cdFx0XHRcdGlmIChhc3NvY2lhdGVkVGV4dFBhdGgpIHtcblx0XHRcdFx0XHR0aGlzLmFkZFRleHRQcm9wZXJ0eShkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIHByb3BlcnR5UGF0aCwgYXNzb2NpYXRlZFRleHRQYXRoLCBzZXRPZlByb3BlcnRpZXMsIHNldE9mRW50aXRpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKHNldE9mUHJvcGVydGllcyksXG5cdFx0XHR0YXJnZXRFbnRpdGllczogQXJyYXkuZnJvbShzZXRPZkVudGl0aWVzKS5tYXAoKG5hdmlnYXRpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG5hdmlnYXRpb24gfTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRleHQgcmVsYXRlZCBwcm9wZXJ0eSB0byB0aGUgc2lkZSBlZmZlY3RzIHRhcmdldHNcblx0ICogSWYgdGhlIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgaWYgaXQncyBub3QgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHNpZGUgZWZmZWN0cyBkZWZpbml0aW9uOlxuXHQgKiAgLSBhcyB0YXJnZXRQcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBhbmQgaXRzIGFzc29jaWF0ZWQgdGV4dCBhcmUgb24gdGhlIHNhbWUgZW50aXR5U2V0XG5cdCAqICAtIGFzIHRhcmdldEVudGl0aWVzIGlmIHRoZXkgYXJlIGRlZmluZWQgb24gZGlmZmVyZW50IGVudGl0eVNldHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhc3NvY2lhdGVkVGV4dFBhdGggVGhlIGFzc29jaWF0ZWQgdGV4dCBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBzZXRPZlByb3BlcnRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2V0T2ZFbnRpdGllcyBTZXQgb2YgZXhpc3Rpbmcgc2lkZUVmZmVjdCdzIHRhcmdldCBlbnRpdGllc1xuXHQgKi9cblx0cHJpdmF0ZSBhZGRUZXh0UHJvcGVydHkoXG5cdFx0ZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRhc3NvY2lhdGVkVGV4dFBhdGg6IHN0cmluZyxcblx0XHRzZXRPZlByb3BlcnRpZXM6IFNldDxzdHJpbmc+LFxuXHRcdHNldE9mRW50aXRpZXM6IFNldDxzdHJpbmc+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGRhdGFNb2RlbFRleHRQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgYXNzb2NpYXRlZFRleHRQYXRoKTtcblx0XHRjb25zdCByZWxhdGl2ZU5hdmlnYXRpb24gPVxuXHRcdFx0cHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG5cdFx0XHRkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQgJiZcblx0XHRcdGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldC5uYW1lICE9PSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGgudGFyZ2V0RW50aXR5U2V0Py5uYW1lXG5cdFx0XHRcdD8gYC8ke2RhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldD8uZnVsbHlRdWFsaWZpZWROYW1lfWBcblx0XHRcdFx0OiBnZXRUYXJnZXROYXZpZ2F0aW9uUGF0aChkYXRhTW9kZWxUZXh0UGF0aCwgdHJ1ZSk7XG5cdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHByb3BlcnR5UGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuXHRcdFx0PyBgLyR7ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5U2V0Py5mdWxseVF1YWxpZmllZE5hbWV9LyR7ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0T2JqZWN0IS5uYW1lfWBcblx0XHRcdDogZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxUZXh0UGF0aCwgdHJ1ZSk7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5pc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyhcblx0XHRcdFx0ZGF0YU1vZGVsVGV4dFBhdGgsXG5cdFx0XHRcdHJlbGF0aXZlTmF2aWdhdGlvbixcblx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0c2V0T2ZQcm9wZXJ0aWVzLFxuXHRcdFx0XHRzZXRPZkVudGl0aWVzXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRpZiAodGhpcy5pc1Byb3BlcnR5QXNzb2NpYXRlZFRleHRPbkRpZmZlcmVudEVudGl0eVNldChkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIGRhdGFNb2RlbFRleHRQYXRoKSkge1xuXHRcdFx0XHRzZXRPZkVudGl0aWVzLmFkZChyZWxhdGl2ZU5hdmlnYXRpb24pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0T2ZQcm9wZXJ0aWVzLmFkZCh0YXJnZXRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgbmVlZHMgdG8gYmUgYWRkZWQgaWYgaXQncyBub3QgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHNpZGUgZWZmZWN0cyBkZWZpbml0aW9uOlxuXHQgKiAgLSBhcyB0YXJnZXRQcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBhbmQgaXRzIGFzc29jaWF0ZWQgdGV4dCBhcmUgb24gdGhlIHNhbWUgZW50aXR5U2V0XG5cdCAqICAtIGFzIHRhcmdldEVudGl0aWVzIGlmIHRoZXkgYXJlIGRlZmluZWQgb24gZGlmZmVyZW50IGVudGl0eVNldHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxUZXh0UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIGFzc29jaWF0ZWQgdGV4dFxuXHQgKiBAcGFyYW0gcmVsYXRpdmVOYXZpZ2F0aW9uIFRoZSBuYXZpZ2F0aW9uIHRvIHRoZSB0ZXh0IHByb3BlcnR5XG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2V0T2ZQcm9wZXJ0aWVzIFNldCBvZiBleGlzdGluZyBzaWRlRWZmZWN0J3MgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNldE9mRW50aXRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgZW50aXRpZXNcblx0ICogQHJldHVybnMgVXBkYXRlZCBzaWRlIGVmZmVjdHMnIHRhcmdldHMgd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnR5IG9yIGVudGl0eVxuXHQgKi9cblx0cHJpdmF0ZSBpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyhcblx0XHRkYXRhTW9kZWxUZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdFx0cmVsYXRpdmVOYXZpZ2F0aW9uOiBzdHJpbmcsXG5cdFx0dGFyZ2V0UGF0aDogc3RyaW5nLFxuXHRcdHNldE9mUHJvcGVydGllczogU2V0PHN0cmluZz4sXG5cdFx0c2V0T2ZFbnRpdGllczogU2V0PHN0cmluZz5cblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGlzUHJvcGVydHkoZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0T2JqZWN0KSAmJlxuXHRcdFx0IXNldE9mUHJvcGVydGllcy5oYXModGFyZ2V0UGF0aCkgJiYgLy8gdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgbGlzdGVkXG5cdFx0XHQhc2V0T2ZQcm9wZXJ0aWVzLmhhcyhgJHtyZWxhdGl2ZU5hdmlnYXRpb259JHtkYXRhTW9kZWxUZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPyBcIi9cIiA6IFwiXCJ9KmApICYmIC8vIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGxpc3RlZCB0aGFua3MgdG8gdGhlIFwiKlwiXG5cdFx0XHQhc2V0T2ZFbnRpdGllcy5oYXMoYCR7cmVsYXRpdmVOYXZpZ2F0aW9ufWApIC8vIHRoZSBwcm9wZXJ0eSBpcyBub3QgcGFydCBvZiBhIFRhcmdldEVudGl0aWVzXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHByb3BlcnR5IGFuZCBpdHMgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5IGFyZSBvbiBkaWZmZXJlbnQgZW50aXR5U2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsUHJvcGVydHlQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIGRhdGFNb2RlbFRleHRQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5XG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVudGl0eVNldCBpcyBkaWZmZXJlbnRcblx0ICovXG5cdHByaXZhdGUgaXNQcm9wZXJ0eUFzc29jaWF0ZWRUZXh0T25EaWZmZXJlbnRFbnRpdHlTZXQoXG5cdFx0ZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRkYXRhTW9kZWxUZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT5cblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRFbnRpdHlTZXQgIT09IGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0ISFkYXRhTW9kZWxUZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcyAmJlxuXHRcdFx0ISFkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlUeXBlXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgU2lkZUVmZmVjdHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFNldCBUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZ1xuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVyIE5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgY29udmVydFNpZGVFZmZlY3RzKFxuXHRcdHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0ZW50aXR5VHlwZT86IEVudGl0eVR5cGUsXG5cdFx0YmluZGluZ1BhcmFtZXRlcj86IHN0cmluZ1xuXHQpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgdHJpZ2dlckFjdGlvbiA9IHNpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nO1xuXHRcdGNvbnN0IG5ld1NpZGVFZmZlY3RzID0gdGhpcy5jb252ZXJ0U2lkZUVmZmVjdHNGb3JtYXQoc2lkZUVmZmVjdHMpO1xuXHRcdGxldCBzaWRlRWZmZWN0c1RhcmdldHMgPSB7IHRhcmdldFByb3BlcnRpZXM6IG5ld1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMsIHRhcmdldEVudGl0aWVzOiBuZXdTaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcyB9O1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlQmluZGluZ1BhcmFtZXRlcihzaWRlRWZmZWN0c1RhcmdldHMsIGJpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMuYWRkVGV4dFByb3BlcnRpZXMoc2lkZUVmZmVjdHNUYXJnZXRzLCBlbnRpdHlUeXBlKTtcblx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoc2lkZUVmZmVjdHNUYXJnZXRzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4ubmV3U2lkZUVmZmVjdHMsXG5cdFx0XHQuLi57IHRhcmdldEVudGl0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMsIHRhcmdldFByb3BlcnRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLCB0cmlnZ2VyQWN0aW9uIH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBTaWRlRWZmZWN0cyB0YXJnZXRzIChUYXJnZXRFbnRpdGllcyBhbmQgVGFyZ2V0UHJvcGVydGllcykgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFRhcmdldFByb3BlcnRpZXMgYXMgYXJyYXkgb2Ygc3RyaW5nXG5cdCAqICAtIFRhcmdldEVudGl0aWVzIGFzIGFycmF5IG9mIG9iamVjdCB3aXRoIHByb3BlcnR5ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgY29udmVydFNpZGVFZmZlY3RzRm9ybWF0KHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGUpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgZm9ybWF0UHJvcGVydGllcyA9IChwcm9wZXJ0aWVzPzogKHN0cmluZyB8IFByb3BlcnR5UGF0aClbXSk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0XHRcdD8gcHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdLCB0YXJnZXQpID0+IHtcblx0XHRcdFx0XHRcdGxldCBwYXRoID0gXCJcIjtcblx0XHRcdFx0XHRcdGlmIChpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb24odGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdGFyZ2V0LnZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSB0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzLnB1c2gocGF0aCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0YFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0cyAke3NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0UHJvcGVydGllcztcblx0XHRcdFx0ICB9LCBbXSlcblx0XHRcdFx0OiBwcm9wZXJ0aWVzO1xuXHRcdH07XG5cdFx0Y29uc3QgZm9ybWF0RW50aXRpZXMgPSAoZW50aXRpZXM/OiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW10pOiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHJldHVybiBlbnRpdGllc1xuXHRcdFx0XHQ/IGVudGl0aWVzLm1hcCgodGFyZ2V0RW50aXR5KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdGFyZ2V0RW50aXR5LnZhbHVlIH07XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBlbnRpdGllcztcblx0XHR9O1xuXG5cdFx0Ly8gVE9ETzogU291cmNlRXZlbnRzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIHJlbW92ZSBvbmNlIHB1YmxpY1xuXHRcdHR5cGUgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoU291cmNlRXZlbnRzID0gQ29tbW9uU2lkZUVmZmVjdHNUeXBlICYgeyBTb3VyY2VFdmVudHM/OiBFZG0uU3RyaW5nW10gfTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdHNvdXJjZVByb3BlcnRpZXM6IGZvcm1hdFByb3BlcnRpZXMoc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyksXG5cdFx0XHRzb3VyY2VFbnRpdGllczogZm9ybWF0RW50aXRpZXMoc2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMpLFxuXHRcdFx0c291cmNlRXZlbnRzOiAoc2lkZUVmZmVjdHMgYXMgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoU291cmNlRXZlbnRzKS5Tb3VyY2VFdmVudHMgYXMgc3RyaW5nW10sXG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBmb3JtYXRQcm9wZXJ0aWVzKHNpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgKHN0cmluZyB8IFByb3BlcnR5UGF0aClbXSkgPz8gW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogZm9ybWF0RW50aXRpZXMoc2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMpID8/IFtdXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFsbCBkYXRhTW9kZWxPYmplY3RQYXRoIHJlbGF0ZWQgdG8gcHJvcGVydGllcyBsaXN0ZWQgYnkgYSBwYXRoXG5cdCAqXG5cdCAqIFRoZSBwYXRoIGNhbiBiZTpcblx0ICogIC0gYSBwYXRoIHRhcmdldGluZyBhIHByb3BlcnR5IG9uIGEgY29tcGxleFR5cGUgb3IgYW4gRW50aXR5VHlwZVxuXHQgKiAgLSBhIHBhdGggd2l0aCBhIHN0YXIgdGFyZ2V0aW5nIGFsbCBwcm9wZXJ0aWVzIG9uIGEgY29tcGxleFR5cGUgb3IgYW4gRW50aXR5VHlwZS5cblx0ICogIC0gYWJzb2x1dGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHBhdGggdG8gYW5hbHl6ZVxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBkYXRhTW9kZWxPYmplY3RQYXRoIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBnZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoKHByb3BlcnR5UGF0aDogc3RyaW5nLCBlbnRpdHlUeXBlPzogRW50aXR5VHlwZSk6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+W10ge1xuXHRcdGxldCBkYXRhTW9kZWxPYmplY3RQYXRoczogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT5bXSA9IFtdO1xuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFNb2RlbCA9IHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGFpbmVyTmFtZSA9IGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlDb250YWluZXIuZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdGxldCBwcm9wZXJ0eVJlbGF0aXZlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0dGVzdEVudGl0eVR5cGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0XHRyZWdleFBhdHRlcm46IFJlZ0V4cCxcblx0XHRcdG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbDtcblx0XHRpZiAocHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoYC8ke2NvbnRhaW5lck5hbWV9L2ApKSB7XG5cdFx0XHRyZWdleFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeXFxcXC8ke2NvbnRhaW5lck5hbWV9XFxcXC9bXi9dK1xcXFwvKC4rKT8kYCk7XG5cdFx0XHRtYXRjaCA9IHByb3BlcnR5UGF0aC5tYXRjaChyZWdleFBhdHRlcm4pO1xuXHRcdFx0cHJvcGVydHlSZWxhdGl2ZVBhdGggPSBtYXRjaCA/IG1hdGNoWzFdIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIWVudGl0eVR5cGUpIHtcblx0XHRcdHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4vJHtjb250YWluZXJOYW1lfS8oW14vXSspYCk7XG5cdFx0XHRtYXRjaCA9IHByb3BlcnR5UGF0aC5tYXRjaChyZWdleFBhdHRlcm4pO1xuXHRcdFx0dGVzdEVudGl0eVR5cGVOYW1lID0gbWF0Y2ggPyBtYXRjaFsxXSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgdGVzdEVudGl0eVR5cGUgPVxuXHRcdFx0ZW50aXR5VHlwZSA/P1xuXHRcdFx0KCh0ZXN0RW50aXR5VHlwZU5hbWUgPyBjb252ZXJ0ZWRNZXRhTW9kZWwucmVzb2x2ZVBhdGgoYC8ke3Rlc3RFbnRpdHlUeXBlTmFtZX0vYCkudGFyZ2V0IDogdW5kZWZpbmVkKSBhcyBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKTtcblx0XHRjb25zdCBlbnRpdHlTZXQgPVxuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmVudGl0eVNldHMuZmluZCgocmVsYXRlZEVudGl0eVNldCkgPT4gcmVsYXRlZEVudGl0eVNldC5lbnRpdHlUeXBlID09PSB0ZXN0RW50aXR5VHlwZSkgPz9cblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5zaW5nbGV0b25zLmZpbmQoKHNpbmdsZXRvbikgPT4gc2luZ2xldG9uLmVudGl0eVR5cGUgPT09IHRlc3RFbnRpdHlUeXBlKTtcblx0XHRpZiAoZW50aXR5U2V0KSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0aGlzLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRlbnRpdHlTZXRDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAvJHtlbnRpdHlTZXQubmFtZX1gKTtcblx0XHRcdGlmIChlbnRpdHlTZXRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbEVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhlbnRpdHlTZXRDb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5IHwgRW50aXR5VHlwZT4oXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxFbnRpdHlTZXQsXG5cdFx0XHRcdFx0XHQocHJvcGVydHlSZWxhdGl2ZVBhdGggfHwgcHJvcGVydHlQYXRoKS5yZXBsYWNlKFwiKlwiLCBcIlwiKSB8fCBcIi9cIlxuXHRcdFx0XHRcdCksIC8vIFwiKlwiIGlzIHJlcGxhY2VkIGJ5IFwiL1wiIHRvIHRhcmdldCB0aGUgY3VycmVudCBFbnRpdHlUeXBlXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0XHRcdGlmIChpc1Byb3BlcnR5KHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRpZiAoaXNDb21wbGV4VHlwZSh0YXJnZXRPYmplY3QudGFyZ2V0VHlwZSkpIHtcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzID0gZGF0YU1vZGVsT2JqZWN0UGF0aHMuY29uY2F0KFxuXHRcdFx0XHRcdFx0XHR0YXJnZXRPYmplY3QudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG5cdFx0XHRcdFx0XHRcdFx0ZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIHByb3BlcnR5Lm5hbWUpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzLnB1c2goZGF0YU1vZGVsT2JqZWN0UGF0aCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzRW50aXR5VHlwZSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRocy5jb25jYXQoXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKGVudGl0eVByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgZW50aXR5UHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZW50aXR5U2V0Q29udGV4dC5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBkYXRhTW9kZWxPYmplY3RQYXRocy5maWx0ZXIoKGRhdGFNb2RlbE9iamVjdFBhdGgpID0+IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBPZGF0YSBtZXRhbW9kZWwuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBPRGF0YSBtZXRhbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0TWV0YU1vZGVsKCk6IE9EYXRhTWV0YU1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGFuIGVudGl0eSB0eXBlIG9yIGFjdGlvbiB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aCBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIGdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShzb3VyY2U6IEVudGl0eVR5cGUgfCBBY3Rpb24pOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRsZXQgYmluZGluZ0FsaWFzID0gXCJcIjtcblx0XHRjb25zdCBpc1NvdXJjZUVudGl0eVR5cGUgPSBpc0VudGl0eVR5cGUoc291cmNlKTtcblx0XHRjb25zdCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkID0gaXNTb3VyY2VFbnRpdHlUeXBlID8gc291cmNlIDogc291cmNlLnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0Y29uc3QgY29tbW9uQW5ub3RhdGlvbiA9IHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIGFzIHVuZGVmaW5lZCB8IHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgQ29tbW9uQW5ub3RhdGlvblR5cGVzPjtcblx0XHRpZiAoY29tbW9uQW5ub3RhdGlvbikge1xuXHRcdFx0aWYgKGVudGl0eVR5cGUgJiYgIWlzU291cmNlRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyID0gc291cmNlLnBhcmFtZXRlcnM/LmZpbmQoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLnR5cGUgPT09IGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdFx0YmluZGluZ0FsaWFzID0gYmluZGluZ1BhcmFtZXRlcj8uZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA/PyBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0U2lkZUVmZmVjdHNBbm5vdGF0aW9uRnJvbVNvdXJjZShzb3VyY2UpLm1hcCgoc2lkZUVmZmVjdEFubm8pID0+XG5cdFx0XHRcdHRoaXMuY29udmVydFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RBbm5vLCBlbnRpdHlUeXBlLCBiaW5kaW5nQWxpYXMpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlIEVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlKHNvdXJjZTogRW50aXR5VHlwZSB8IEFjdGlvbik6IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllcltdIHtcblx0XHRjb25zdCBzaWRlRWZmZWN0czogQ29tbW9uU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRjb25zdCBjb21tb25Bbm5vdGF0aW9uID0gc291cmNlLmFubm90YXRpb25zPy5Db21tb24gYXMgdW5kZWZpbmVkIHwgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXI+O1xuXHRcdGZvciAoY29uc3Qga2V5IGluIGNvbW1vbkFubm90YXRpb24pIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb24gPSBjb21tb25Bbm5vdGF0aW9uW2tleV07XG5cdFx0XHRpZiAodGhpcy5pc1NpZGVFZmZlY3RzQW5ub3RhdGlvbihhbm5vdGF0aW9uKSkge1xuXHRcdFx0XHRzaWRlRWZmZWN0cy5wdXNoKGFubm90YXRpb24pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGEgU2lkZUVmZmVjdHMgYW5ub3RhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb24gQW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyBCb29sZWFuXG5cdCAqL1xuXHRwcml2YXRlIGlzU2lkZUVmZmVjdHNBbm5vdGF0aW9uKGFubm90YXRpb246IHVua25vd24pOiBhbm5vdGF0aW9uIGlzIENvbW1vblNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0cmV0dXJuIChhbm5vdGF0aW9uIGFzIENvbW1vblNpZGVFZmZlY3RzVHlwZSk/LiRUeXBlID09PSBDb21tb25Bbm5vdGF0aW9uVHlwZXMuU2lkZUVmZmVjdHNUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgdGhlIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoRXhwcmVzc2lvbnMgU2lkZUVmZmVjdHMgdGFyZ2V0c1xuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGxvZ1JlcXVlc3QocGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBjb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3QgdGFyZ2V0UGF0aHMgPSBwYXRoRXhwcmVzc2lvbnMucmVkdWNlKGZ1bmN0aW9uIChwYXRocywgdGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gYCR7cGF0aHN9XFxuXFx0XFx0JHsodGFyZ2V0IGFzIFNpZGVFZmZlY3RzRW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgdGFyZ2V0IHx8IFwiXCJ9YDtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoYFNpZGVFZmZlY3RzIC0gUmVxdWVzdDpcXG5cXHRDb250ZXh0IHBhdGggOiAke2NvbnRleHQuZ2V0UGF0aCgpfVxcblxcdFByb3BlcnR5IHBhdGhzIDoke3RhcmdldFBhdGhzfWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIG5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG9uIHRoZSBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNUYXJnZXRzIFNpZGVFZmZlY3RzIFRhcmdldHNcblx0ICogQHBhcmFtIGJpbmRpbmdQYXJhbWV0ZXJOYW1lIE5hbWUgb2YgYmluZGluZyBwYXJhbWV0ZXJcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHJpdmF0ZSByZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlLCBiaW5kaW5nUGFyYW1ldGVyTmFtZT86IHN0cmluZyk6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB7XG5cdFx0aWYgKGJpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCByZXBsYWNlQmluZGluZ1BhcmFtZXRlciA9IGZ1bmN0aW9uICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXiR7YmluZGluZ1BhcmFtZXRlck5hbWV9Lz9gKSwgXCJcIik7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0UHJvcGVydGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMubWFwKCh0YXJnZXRQcm9wZXJ0eSkgPT4gcmVwbGFjZUJpbmRpbmdQYXJhbWV0ZXIodGFyZ2V0UHJvcGVydHkpKSxcblx0XHRcdFx0dGFyZ2V0RW50aXRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcy5tYXAoKHRhcmdldEVudGl0eSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiByZXBsYWNlQmluZGluZ1BhcmFtZXRlcih0YXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpIH07XG5cdFx0XHRcdH0pXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHR0YXJnZXRFbnRpdGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgZHVwbGljYXRlcyBpbiBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNUYXJnZXRzIFNpZGVFZmZlY3RzIFRhcmdldHNcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgdGFyZ2V0cyB3aXRob3V0IGR1cGxpY2F0ZXNcblx0ICovXG5cdHByaXZhdGUgcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSk6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXRpZXNQYXRocyA9IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcy5tYXAoKHRhcmdldEVudGl0eSkgPT4gdGFyZ2V0RW50aXR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCB1bmlxdWVUYXJnZXRlZEVudGl0aWVzUGF0aCA9IG5ldyBTZXQ8c3RyaW5nPih0YXJnZXRFbnRpdGllc1BhdGhzKTtcblx0XHRjb25zdCB1bmlxdWVUYXJnZXRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzKTtcblxuXHRcdGNvbnN0IHVuaXF1ZVRhcmdldGVkRW50aXRpZXMgPSBBcnJheS5mcm9tKHVuaXF1ZVRhcmdldGVkRW50aXRpZXNQYXRoKS5tYXAoKGVudGl0eVBhdGgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBlbnRpdHlQYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHsgdGFyZ2V0UHJvcGVydGllczogQXJyYXkuZnJvbSh1bmlxdWVUYXJnZXRQcm9wZXJ0aWVzKSwgdGFyZ2V0RW50aXRpZXM6IHVuaXF1ZVRhcmdldGVkRW50aXRpZXMgfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIGFjdGlvbiB0eXBlIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgb24gYWN0aW9uc1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uXG5cdCAqIEByZXR1cm5zIEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhhY3Rpb246IEFjdGlvbik6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgdHJpZ2dlckFjdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRsZXQgdGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgdGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdID0gW107XG5cblx0XHR0aGlzLmdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShhY3Rpb24pLmZvckVhY2goKG9EYXRhU2lkZUVmZmVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgdHJpZ2dlckFjdGlvbiA9IG9EYXRhU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uO1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllcyA9IHRhcmdldFByb3BlcnRpZXMuY29uY2F0KG9EYXRhU2lkZUVmZmVjdC50YXJnZXRQcm9wZXJ0aWVzKTtcblx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KG9EYXRhU2lkZUVmZmVjdC50YXJnZXRFbnRpdGllcyk7XG5cdFx0XHRpZiAodHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5hZGQodHJpZ2dlckFjdGlvbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXRzID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHsgdGFyZ2V0UHJvcGVydGllcywgdGFyZ2V0RW50aXRpZXMgfSk7XG5cdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvbi5pc0JvdW5kID8gYWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5tYXRjaCgvXlteKF0rLyk/LlswXSA6IGFjdGlvbi5uYW1lO1xuXHRcdHNpZGVFZmZlY3RzW2FjdGlvbk5hbWUhXSA9IHtcblx0XHRcdHBhdGhFeHByZXNzaW9uczogWy4uLnNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLCAuLi5zaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXNdLFxuXHRcdFx0dHJpZ2dlckFjdGlvbnM6IEFycmF5LmZyb20odHJpZ2dlckFjdGlvbnMpXG5cdFx0fTtcblx0XHRyZXR1cm4gc2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBlbnRpdHkgdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSByZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3QgZW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKGVudGl0eVR5cGUpLmZvckVhY2goKHNpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRlbnRpdHlTaWRlRWZmZWN0c1tzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gc2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGVudGl0eVNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgYSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgb24gdGhlIGVudGl0eSB0byB0cmFjayB3aGVyZSB0aG9zZSBzb3VyY2VzIGFyZSB1c2VkIGluIFNpZGVFZmZlY3RzIGFubm90YXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHlUeXBlIHdlIGxvb2sgZm9yIHNpZGUgRWZmZWN0cyBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMgVGhlIG1hcHBpbmcgb2JqZWN0IGluIGNvbnN0cnVjdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1xuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH1cblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0RGVmaW5pdGlvbiBvZiB0aGlzLmdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2UoZW50aXR5VHlwZSkpIHtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZUVudGl0aWVzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RzU291cmNlcywgc2lkZUVmZmVjdERlZmluaXRpb24pO1xuXHRcdFx0dGhpcy5tYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmlsbHMgdGhlIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCB3aXRoIHNvdXJjZSBlbnRpdGllcy5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0RGVmaW5pdGlvbiBUaGUgc2lkZSBlZmZlY3QgZGVmaW5pdGlvbiB0byBiZSBldmFsdWF0ZWRcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZUVudGl0aWVzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSxcblx0XHRzaWRlRWZmZWN0RGVmaW5pdGlvbjogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc291cmNlRW50aXR5IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZUVudGl0aWVzID8/IFtdKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gc291cmNlRW50aXR5LnZhbHVlID8gc291cmNlRW50aXR5LiR0YXJnZXQ/LnRhcmdldFR5cGUgOiBlbnRpdHlUeXBlO1xuXHRcdFx0aWYgKHRhcmdldEVudGl0eVR5cGUpIHtcblx0XHRcdFx0aWYgKCFzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNbdGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzW3RhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1t0YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0ucHVzaCh7XG5cdFx0XHRcdFx0ZW50aXR5OiBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRxdWFsaWZpZXI6IHNpZGVFZmZlY3REZWZpbml0aW9uLnF1YWxpZmllclxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmlsbHMgdGhlIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCB3aXRoIHNvdXJjZSBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3REZWZpbml0aW9uIFRoZSBzaWRlIGVmZmVjdCBkZWZpbml0aW9uIHRvIGJlIGV2YWx1YXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0sXG5cdFx0c2lkZUVmZmVjdERlZmluaXRpb246IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllclxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eSA9IHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZVByb3BlcnRpZXM/Lmxlbmd0aCA9PT0gMTtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZVByb3BlcnR5IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZVByb3BlcnRpZXMgPz8gW10pIHtcblx0XHRcdGlmIChzb3VyY2VQcm9wZXJ0eS4kdGFyZ2V0KSB7XG5cdFx0XHRcdGlmICghc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdLnB1c2goe1xuXHRcdFx0XHRcdGVudGl0eTogZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXIsXG5cdFx0XHRcdFx0aGFzVW5pcXVlU291cmNlUHJvcGVydHlcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgd2l0aCBzb3VyY2UgZXZlbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3REZWZpbml0aW9uIFRoZSBzaWRlIGVmZmVjdCBkZWZpbml0aW9uIHRvIGJlIGV2YWx1YXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlRXZlbnRzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSxcblx0XHRzaWRlRWZmZWN0RGVmaW5pdGlvbjogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc291cmNlRXZlbnQgb2Ygc2lkZUVmZmVjdERlZmluaXRpb24uU291cmNlRXZlbnRzID8/IFtdKSB7XG5cdFx0XHRpZiAoIXNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNbc291cmNlRXZlbnQudG9TdHJpbmcoKV0pIHtcblx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1tzb3VyY2VFdmVudC50b1N0cmluZygpXSA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1tzb3VyY2VFdmVudC50b1N0cmluZygpXS5wdXNoKHtcblx0XHRcdFx0ZW50aXR5OiBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXJcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpZWxkR3JvdXBJZCBiYXNlZCBvbiB0aGUgc3RvcmVkIGluZm9ybWF0aW9uIG9uIHRoIHNpZGUgZWZmZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdEluZm9cblx0ICogQHBhcmFtIGlzSW1tZWRpYXRlXG5cdCAqIEByZXR1cm5zIEEgc3RyaW5nIGZvciB0aGUgZmllbGRHcm91cElkLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvOiBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZSwgaXNJbW1lZGlhdGUgPSBmYWxzZSk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdFdpdGhRdWFsaWZpZXIgPSBzaWRlRWZmZWN0SW5mby5xdWFsaWZpZXJcblx0XHRcdD8gYCR7c2lkZUVmZmVjdEluZm8uZW50aXR5fSMke3NpZGVFZmZlY3RJbmZvLnF1YWxpZmllcn1gXG5cdFx0XHQ6IHNpZGVFZmZlY3RJbmZvLmVudGl0eTtcblx0XHRyZXR1cm4gaXNJbW1lZGlhdGUgfHwgc2lkZUVmZmVjdEluZm8uaGFzVW5pcXVlU291cmNlUHJvcGVydHkgPT09IHRydWVcblx0XHRcdD8gYCR7c2lkZUVmZmVjdFdpdGhRdWFsaWZpZXJ9JCRJbW1lZGlhdGVSZXF1ZXN0YFxuXHRcdFx0OiBzaWRlRWZmZWN0V2l0aFF1YWxpZmllcjtcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBTaWRlRWZmZWN0c1NlcnZpY2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGFzeW5jIGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pOiBQcm9taXNlPFNpZGVFZmZlY3RzU2VydmljZT4ge1xuXHRcdGNvbnN0IFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UgPSBuZXcgU2lkZUVmZmVjdHNTZXJ2aWNlKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UuaW5pdGlhbGl6ZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BZ0lhQSxrQkFBa0I7SUFBQTtJQUFBO01BQUE7SUFBQTtJQUFBO0lBQUE7SUFlOUI7SUFHQTtJQUdBO0lBR0E7SUFBQSxPQUNBQyxJQUFJLEdBQUosZ0JBQWE7TUFDWixNQUFNQyxPQUFPLEdBQUcsSUFBSSxDQUFDQyxVQUFVLEVBQUU7TUFDakMsSUFBSSxDQUFDQyxZQUFZLEdBQUdGLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFRyxXQUEyQjtNQUN4RCxJQUFJLENBQUNDLG1CQUFtQixHQUFHO1FBQzFCQyxLQUFLLEVBQUU7VUFDTkMsUUFBUSxFQUFFLENBQUMsQ0FBQztVQUNaQyxPQUFPLEVBQUU7WUFDUkMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoQkMsY0FBYyxFQUFFLENBQUM7VUFDbEI7UUFDRCxDQUFDO1FBQ0RDLE9BQU8sRUFBRSxDQUFDO01BQ1gsQ0FBQztNQUVELElBQUksQ0FBQ0Msc0JBQXNCLEdBQUc7UUFDN0JDLEtBQUssRUFBRSxDQUFDO01BQ1QsQ0FBQztNQUNELElBQUksQ0FBQ0MsZUFBZSxHQUFH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
1072
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2UiLCJfU2VydmljZSIsIl9pbmhlcml0c0xvb3NlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfZXhwb3J0cyIsIl9wcm90byIsInByb3RvdHlwZSIsImluaXQiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsImFwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwic2lkZUVmZmVjdHNSZWdpc3RyeSIsIm9EYXRhIiwiZW50aXRpZXMiLCJhY3Rpb25zIiwiYm91bmRBY3Rpb25zIiwidW5Cb3VuZEFjdGlvbnMiLCJjb250cm9sIiwicmVjb21tZW5kYXRpb25SZWdpc3RyeSIsInJvbGVzIiwidGFyZ2V0Q2FsbGJhY2tzIiwiaW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24iLCJtb2RlbCIsImdldE1vZGVsIiwidXJsIiwiZ2V0V2ViU29ja2V0QmFzZVVybCIsImNoYW5uZWwiLCJnZXRXZWJTb2NrZXRDaGFubmVsVXJsIiwiQ2hhbm5lbFR5cGUiLCJTaWRlRWZmZWN0c0V2ZW50cyIsIndlYlNvY2tldCIsImNyZWF0ZVdlYlNvY2tldCIsImF0dGFjaE1lc3NhZ2UiLCJvblNpZGVFZmZlY3RzRXZlbnRSZWNlaXZlZCIsImJpbmQiLCJldmVudCIsIm1lc3NhZ2UiLCJnZXRQYXJhbWV0ZXIiLCJzZXJ2ZXJBY3Rpb24iLCJzaWRlRWZmZWN0RXZlbnROYW1lIiwic2lkZUVmZmVjdFNvdXJjZSIsIm1ldGFQYXRoIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YUNvbnRleHQiLCJkYXRhTW9kZWwiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJyZWxldmFudFNpZGVFZmZlY3RzIiwiZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZSIsInRhcmdldEVudGl0eVR5cGUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJsZW5ndGgiLCJyZWxldmFudFBhZ2VzIiwicGFnZXMiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRWaXNpYmxlVmlld3MiLCJwYWdlIiwicGFnZUNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwiaXNBIiwiX3NpZGVFZmZlY3RzIiwiaXNEYXRhUGF0aFJlbGV2YW50IiwicHVzaCIsInNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsImludGVyYWN0aW9uVHlwZSIsImdldFNpZGVFZmZlY3RzSW50ZXJhY3Rpb25UeXBlIiwiY29uZmlybURhdGFSZWZyZXNoIiwiZXJyb3IiLCJub3RpZnlEYXRhUmVmcmVzaCIsInJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50IiwiX3RoaXMkaW50ZXJhY3Rpb25UeXBlIiwiX3RoaXMkaW50ZXJhY3Rpb25UeXBlMiIsIl90aGlzJGludGVyYWN0aW9uVHlwZTMiLCJpbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uIiwiX3RoaXMkYXBwQ29tcG9uZW50JGdlIiwiX3RoaXMkYXBwQ29tcG9uZW50JGdlMiIsImdldE1hbmlmZXN0RW50cnkiLCJhcHAiLCJzaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZSIsImV2ZW50cyIsImRlZmF1bHQiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJlbnRpdHlUeXBlIiwic2lkZUVmZmVjdCIsInNvdXJjZUNvbnRyb2xJZCIsImNvbnRyb2xTaWRlRWZmZWN0IiwiZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwiZXhlY3V0ZUFjdGlvbiIsInRyaWdnZXJBY3Rpb24iLCJncm91cElkIiwiYWN0aW9uIiwiYmluZENvbnRleHQiLCJnZXRCaW5kaW5nIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInN1Ym1pdEJhdGNoIiwiZXhlY3V0ZSIsImdldENvbnZlcnRlZE1ldGFNb2RlbCIsImNvbnZlcnRUeXBlcyIsImNhcGFiaWxpdGllcyIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsIm1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJlbnRpdHlUeXBlTmFtZSIsImlzQ29udHJvbFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHMiLCJnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiZW50aXR5U2lkZUVmZmVjdHMiLCJnbG9iYWxTaWRlRWZmZWN0cyIsImtleSIsInNvdXJjZUVudGl0aWVzIiwic291cmNlUHJvcGVydGllcyIsInNvdXJjZUV2ZW50cyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhY3Rpb25OYW1lIiwiX3RoaXMkc2lkZUVmZmVjdHNSZWdpIiwiX3RoaXMkc2lkZUVmZmVjdHNSZWdpMiIsInVuZGVmaW5lZCIsImluaXRpYWxpemUiLCJfbW9kZWwkaXNBIiwic2lkZUVmZmVjdFNvdXJjZXMiLCJwcm9wZXJ0aWVzIiwiZW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlIiwiZ2V0U2VydmljZSIsImNhbGwiLCJyZXF1ZXN0T2JqZWN0IiwiZ2V0Q2FwYWJpbGl0aWVzIiwiY29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwibWFwRmllbGRBbm5vdGF0aW9ucyIsInJldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VzIiwiaXNCb3VuZCIsInNvdXJjZUVudGl0eVR5cGUiLCJyZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncyIsInNvdXJjZSIsImFkZFJlY29tbWVuZGF0aW9uUm9sZXMiLCJzb3VyY2VOYW1lIiwiaGFzT3duUHJvcGVydHkiLCJpbnB1dCIsIm91dHB1dCIsImVudGl0eVByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsImNvbW1vbkFubm8iLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlJlY29tbWVuZGF0aW9uUm9sZSIsInJvbGVUeXBlIiwidmFsdWVPZiIsImluY2x1ZGVzIiwibmFtZSIsImdldFJlY29tbWVuZGF0aW9uc01hcHBpbmciLCJjaGVja0lmRmllbGRJc1JlY29tbWVuZGF0aW9uUmVsZXZhbnQiLCJmaWVsZCIsImdldEJpbmRpbmdDb250ZXh0IiwicHJvcGVydHlOYW1lIiwiZGF0YSIsInNvdXJjZVBhdGgiLCJzcGxpdCIsInBvcCIsIl9yZWNvbW1lbmRhdGlvblJvbGVzRiIsIm1ldGFDb250ZXh0IiwidGFyZ2V0RGF0YU1vZGVsT2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZU5hbWUiLCJpc0VudGl0eVNldCIsIl90YXJnZXREYXRhTW9kZWxPYmplYyIsImlzTmF2aWdhdGlvblByb3BlcnR5IiwiX3RhcmdldERhdGFNb2RlbE9iamVjMiIsInRhcmdldFR5cGUiLCJyZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5IiwiZ2V0UmVjb21tZW5kYXRpb25PdXRwdXRGaWVsZHMiLCJfcmVjb21tZW5kYXRpb25Sb2xlc0YyIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiY29udHJvbElkIiwic0VudGl0eVR5cGUiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsb2dSZXF1ZXN0IiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJfc2lkZUVmZmVjdHMkdHJpZ2dlckEiLCJfc2lkZUVmZmVjdHMkcGF0aEV4cHIiLCJwcm9taXNlcyIsInRyaWdnZXJBY3Rpb25zIiwibWFwIiwiUHJvbWlzZSIsImFsbCIsInJlc29sdmUiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCJpZ25vcmVUcmlnZ2VyQWN0aW9ucyIsImJhc2VFbnRpdHlUeXBlIiwibmF2aWdhdGlvblBhdGgiLCJ0YXJnZXRQcm9wZXJ0aWVzIiwidGFyZ2V0RW50aXRpZXMiLCJzaWRlRWZmZWN0c1RhcmdldHMiLCJmaWx0ZXIiLCJhbm5vdGF0aW9uTmFtZSIsIl9zaWRlRWZmZWN0cyRzb3VyY2VQciIsInNvbWUiLCJuYXZpZ2F0aW9uIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVBhdGgiLCJzdGFydHNXaXRoIiwicmVwbGFjZSIsInNBbm5vdGF0aW9uTmFtZSIsImNvbmNhdCIsInNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiIsInJlbW92ZUR1cGxpY2F0ZVRhcmdldHMiLCJjYXRjaCIsIkxvZyIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RXaGVyZUVudGl0eUlzU291cmNlIiwiZXZlbnROYW1lIiwiX3RoaXMkc291cmNlc1RvU2lkZUVmIiwiZW50aXR5IiwiX3RoaXMkc2lkZUVmZmVjdHNSZWdpMyIsImFubm90YXRpb24iLCJxdWFsaWZpZXIiLCJjb21wdXRlRmllbGRHcm91cElkcyIsInNvdXJjZVByb3BlcnR5IiwiZW50aXR5RmllbGRHcm91cElkcyIsInNpZGVFZmZlY3RJbmZvIiwiZ2V0RmllbGRHcm91cElkRm9yU2lkZUVmZmVjdCIsImdldFNpZGVFZmZlY3RXaGVyZVByb3BlcnR5SXNTb3VyY2UiLCJyZWdpc3RlclRhcmdldENhbGxiYWNrIiwidGFyZ2V0IiwiY2FsbGJhY2siLCJkZXJlZ2lzdGVyVGFyZ2V0Q2FsbGJhY2siLCJnZXRSZWdpc3RlcmVkQ2FsbGJhY2siLCJhZGRUZXh0UHJvcGVydGllcyIsInNldE9mUHJvcGVydGllcyIsIlNldCIsInNldE9mRW50aXRpZXMiLCJkYXRhTW9kZWxQcm9wZXJ0eVBhdGgiLCJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoIiwiYXNzb2NpYXRlZFRleHRQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJhZGRUZXh0UHJvcGVydHkiLCJBcnJheSIsImZyb20iLCJfZGF0YU1vZGVsUHJvcGVydHlQYXQiLCJfZGF0YU1vZGVsVGV4dFBhdGgkdGEiLCJfZGF0YU1vZGVsVGV4dFBhdGgkdGEyIiwiZGF0YU1vZGVsVGV4dFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInJlbGF0aXZlTmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVNldCIsImdldFRhcmdldE5hdmlnYXRpb25QYXRoIiwidGFyZ2V0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyIsImlzUHJvcGVydHlBc3NvY2lhdGVkVGV4dE9uRGlmZmVyZW50RW50aXR5U2V0IiwiYWRkIiwiaXNQcm9wZXJ0eSIsImhhcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiY29udmVydFNpZGVFZmZlY3RzIiwiYmluZGluZ1BhcmFtZXRlciIsIlRyaWdnZXJBY3Rpb24iLCJuZXdTaWRlRWZmZWN0cyIsImNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdCIsInJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJmb3JtYXRQcm9wZXJ0aWVzIiwicmVkdWNlIiwicGF0aCIsImlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbiIsInZhbHVlIiwiZm9ybWF0RW50aXRpZXMiLCJ0YXJnZXRFbnRpdHkiLCJTb3VyY2VQcm9wZXJ0aWVzIiwiU291cmNlRW50aXRpZXMiLCJTb3VyY2VFdmVudHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJkYXRhTW9kZWxPYmplY3RQYXRocyIsImNvbnRhaW5lck5hbWUiLCJlbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eVJlbGF0aXZlUGF0aCIsInRlc3RFbnRpdHlUeXBlTmFtZSIsInJlZ2V4UGF0dGVybiIsIm1hdGNoIiwiUmVnRXhwIiwidGVzdEVudGl0eVR5cGUiLCJyZXNvbHZlUGF0aCIsImVudGl0eVNldCIsImVudGl0eVNldHMiLCJmaW5kIiwicmVsYXRlZEVudGl0eVNldCIsInNpbmdsZXRvbnMiLCJzaW5nbGV0b24iLCJlbnRpdHlTZXRDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJkYXRhTW9kZWxFbnRpdHlTZXQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNDb21wbGV4VHlwZSIsImlzRW50aXR5VHlwZSIsImVudGl0eVByb3BlcnR5IiwiZGVzdHJveSIsImdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZSIsIl9zb3VyY2UkYW5ub3RhdGlvbnMiLCJiaW5kaW5nQWxpYXMiLCJpc1NvdXJjZUVudGl0eVR5cGUiLCJjb21tb25Bbm5vdGF0aW9uIiwiX3NvdXJjZSRwYXJhbWV0ZXJzIiwicGFyYW1ldGVycyIsInBhcmFtZXRlciIsInR5cGUiLCJnZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlIiwic2lkZUVmZmVjdEFubm8iLCJfc291cmNlJGFubm90YXRpb25zMiIsImlzU2lkZUVmZmVjdHNBbm5vdGF0aW9uIiwiJFR5cGUiLCJ0YXJnZXRQYXRocyIsInBhdGhzIiwiZGVidWciLCJiaW5kaW5nUGFyYW1ldGVyTmFtZSIsInJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyIiwidGFyZ2V0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdGllc1BhdGhzIiwidW5pcXVlVGFyZ2V0ZWRFbnRpdGllc1BhdGgiLCJ1bmlxdWVUYXJnZXRQcm9wZXJ0aWVzIiwidW5pcXVlVGFyZ2V0ZWRFbnRpdGllcyIsImVudGl0eVBhdGgiLCJfYWN0aW9uJGZ1bGx5UXVhbGlmaWUiLCJvRGF0YVNpZGVFZmZlY3QiLCJzaWRlRWZmZWN0c1NvdXJjZXMiLCJzaWRlRWZmZWN0RGVmaW5pdGlvbiIsIm1hcFNpZGVFZmZlY3RTb3VyY2VFbnRpdGllcyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VQcm9wZXJ0aWVzIiwibWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyIsInNvdXJjZUVudGl0eSIsIl9zb3VyY2VFbnRpdHkkJHRhcmdldCIsIiR0YXJnZXQiLCJfc2lkZUVmZmVjdERlZmluaXRpb24iLCJoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eSIsInNvdXJjZUV2ZW50IiwidG9TdHJpbmciLCJpc0ltbWVkaWF0ZSIsInNpZGVFZmZlY3RXaXRoUXVhbGlmaWVyIiwiZ2V0SW50ZXJmYWNlIiwiU2VydmljZSIsIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkiLCJfU2VydmljZUZhY3RvcnkiLCJfcHJvdG8yIiwiY3JlYXRlSW5zdGFuY2UiLCJvU2VydmljZUNvbnRleHQiLCJTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlIiwiU2VydmljZUZhY3RvcnkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuXHRBY3Rpb24sXG5cdENvbnZlcnRlZE1ldGFkYXRhLFxuXHRFbnRpdHlTZXQsXG5cdEVudGl0eVR5cGUsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0TmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0UHJvcGVydHksXG5cdFByb3BlcnR5UGF0aFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlICogYXMgRWRtIGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUeXBlIGFzIENvbW1vblNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0U2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvbk1hbmlmZXN0U2V0dGluZyxcblx0U2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvblR5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdGlzQ29tcGxleFR5cGUsXG5cdGlzRW50aXR5U2V0LFxuXHRpc0VudGl0eVR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1Byb3BlcnR5LFxuXHRpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIGNyZWF0ZVdlYlNvY2tldCwgZ2V0V2ViU29ja2V0QmFzZVVybCwgZ2V0V2ViU29ja2V0Q2hhbm5lbFVybCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1dlYlNvY2tldFwiO1xuaW1wb3J0IHsgZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIFNhcFBjcFdlYlNvY2tldCBmcm9tIFwic2FwL3VpL2NvcmUvd3MvU2FwUGNwV2ViU29ja2V0XCI7XG5pbXBvcnQgdHlwZSB7IFdlYlNvY2tldCRNZXNzYWdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvd3MvV2ViU29ja2V0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldFRhcmdldE5hdmlnYXRpb25QYXRoLCBnZXRUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudENhcGFiaWxpdGllcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlIH0gZnJvbSBcIi4vRW52aXJvbm1lbnRTZXJ2aWNlRmFjdG9yeVwiO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eUFubm90YXRpb25zV2l0aFJlY29tbWVuZGF0aW9uID0gUHJvcGVydHlBbm5vdGF0aW9uc19Db21tb24gJiB7XG5cdFJlY29tbWVuZGF0aW9uUm9sZT86IHN0cmluZztcbn07XG5cbnR5cGUgU2lkZUVmZmVjdHNTZXR0aW5ncyA9IHt9O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0dGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXTtcbn07XG5cbnR5cGUgQmFzZVNpZGVFZmZlY3RzVHlwZSA9IHtcblx0c291cmNlUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRzb3VyY2VFbnRpdGllcz86IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdO1xuXHRzb3VyY2VFdmVudHM/OiBzdHJpbmdbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59ICYgU2lkZUVmZmVjdHNUYXJnZXRUeXBlO1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IEJhc2VTaWRlRWZmZWN0c1R5cGUgJiB7XG5cdHRyaWdnZXJBY3Rpb24/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9ucz86IFNpZGVFZmZlY3RzVGFyZ2V0W107XG5cdHRyaWdnZXJBY3Rpb25zPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdHNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuLy9UT0RPIGZpeCB0aGlzIHR5cGUgaW4gdGhlIHV4IHZvY2FidWxhcmllc1xuLy9UT0RPOiBTb3VyY2UgRXZlbnRzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIHJlbW92ZSBvbmNlIHB1YmxpY1xudHlwZSBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXIgPSBDb21tb25TaWRlRWZmZWN0c1R5cGUgJiB7IHF1YWxpZmllcj86IHN0cmluZzsgU291cmNlRXZlbnRzPzogRWRtLlN0cmluZ1tdIH07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlID0geyBlbnRpdHk6IHN0cmluZzsgcXVhbGlmaWVyPzogc3RyaW5nOyBoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eT86IGJvb2xlYW4gfTtcblxudHlwZSBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5ID0ge1xuXHRvRGF0YToge1xuXHRcdGVudGl0aWVzOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0XHRhY3Rpb25zOiB7XG5cdFx0XHRib3VuZEFjdGlvbnM6IHtcblx0XHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHRcdH07XG5cdFx0XHR1bkJvdW5kQWN0aW9uczoge1xuXHRcdFx0XHRbYWN0aW9uOiBzdHJpbmddOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH07XG5cdGNvbnRyb2w6IHtcblx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblx0fTtcbn07XG5cbnR5cGUgUmVjb21tZW5kYXRpb25zUm9sZXMgPSB7XG5cdGlucHV0OiBzdHJpbmdbXTtcblx0b3V0cHV0OiBzdHJpbmdbXTtcblx0cmVxdWlyZWQ/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5ID0ge1xuXHRyb2xlczogUmVjb3JkPHN0cmluZywgUmVjb21tZW5kYXRpb25zUm9sZXM+O1xufTtcblxudHlwZSBXZWJTb2NrZXRNZXNzYWdlID0ge1xuXHRzZXJ2ZXJBY3Rpb246IFwiUmFpc2VTaWRlRWZmZWN0XCI7XG5cdHNpZGVFZmZlY3RFdmVudE5hbWU6IHN0cmluZztcblx0c2lkZUVmZmVjdFNvdXJjZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIFNpZGVFZmZlY3RzU2VydmljZSBleHRlbmRzIFNlcnZpY2U8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRhcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBzaWRlRWZmZWN0c1JlZ2lzdHJ5ITogU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeTtcblxuXHRwcml2YXRlIHJlY29tbWVuZGF0aW9uUmVnaXN0cnkhOiBSZWNvbW1lbmRhdGlvbnNSZWdpc3RyeTtcblxuXHRwcml2YXRlIGNhcGFiaWxpdGllcyE6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzIToge1xuXHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHR9O1xuXG5cdC8vIENhbGxiYWNrIG1ldGhvZHMgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEgc2lkZSBlZmZlY3QgdGFyZ2V0IGlzIGhpdFxuXHRwcml2YXRlIHRhcmdldENhbGxiYWNrcyE6IFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPjtcblxuXHQvLyBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byByZXRyaWV2ZSBTaWRlRWZmZWN0cyBldmVudHNcblx0cHJpdmF0ZSB3ZWJTb2NrZXQ/OiBTYXBQY3BXZWJTb2NrZXQ7XG5cblx0Ly8gSW50ZXJhY3Rpb24gdHlwZSBmb3IgU2lkZUVmZmVjdHMgZXZlbnRzXG5cdHByaXZhdGUgaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbj86IFNpZGVFZmZlY3RzRXZlbnRzSW50ZXJhY3Rpb25NYW5pZmVzdFNldHRpbmc7XG5cblx0Ly8gITogbWVhbnMgdGhhdCB3ZSBrbm93IGl0IHdpbGwgYmUgYXNzaWduZWQgYmVmb3JlIHVzYWdlXG5cdGluaXQoKTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdHRoaXMuYXBwQ29tcG9uZW50ID0gY29udGV4dD8uc2NvcGVPYmplY3QgYXMgQXBwQ29tcG9uZW50O1xuXHRcdHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeSA9IHtcblx0XHRcdG9EYXRhOiB7XG5cdFx0XHRcdGVudGl0aWVzOiB7fSxcblx0XHRcdFx0YWN0aW9uczoge1xuXHRcdFx0XHRcdGJvdW5kQWN0aW9uczoge30sXG5cdFx0XHRcdFx0dW5Cb3VuZEFjdGlvbnM6IHt9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRjb250cm9sOiB7fVxuXHRcdH07XG5cblx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkgPSB7XG5cdFx0XHRyb2xlczoge31cblx0XHR9O1xuXHRcdHRoaXMudGFyZ2V0Q2FsbGJhY2tzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ29ubmVjdHMgdG8gYSBnaXZlbiBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byByZXRyaWV2ZSBTaWRlRWZmZWN0cyBldmVudHMuXG5cdCAqXG5cdCAqL1xuXHRpbml0aWFsaXplV2ViU29ja2V0Q29ubmVjdGlvbigpOiB2b2lkIHtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuYXBwQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgdXJsID0gZ2V0V2ViU29ja2V0QmFzZVVybChtb2RlbCk7XG5cdFx0Y29uc3QgY2hhbm5lbCA9IGdldFdlYlNvY2tldENoYW5uZWxVcmwoQ2hhbm5lbFR5cGUuU2lkZUVmZmVjdHNFdmVudHMsIG1vZGVsKTtcblxuXHRcdGlmICh1cmwgJiYgY2hhbm5lbCkge1xuXHRcdFx0dGhpcy53ZWJTb2NrZXQgPSBjcmVhdGVXZWJTb2NrZXQoQ2hhbm5lbFR5cGUuU2lkZUVmZmVjdHNFdmVudHMsIG1vZGVsKTtcblx0XHRcdHRoaXMud2ViU29ja2V0LmF0dGFjaE1lc3NhZ2UodGhpcy5vblNpZGVFZmZlY3RzRXZlbnRSZWNlaXZlZC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29ubmVjdGVkIFdlYlNvY2tldCBzZW5kcyBhIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgd2l0aCB0aGUgcmVsZXZhbnQgc2lkZUVmZmVjdCBpbmZvcm1hdGlvblxuXHQgKi9cblx0YXN5bmMgb25TaWRlRWZmZWN0c0V2ZW50UmVjZWl2ZWQoZXZlbnQ6IFdlYlNvY2tldCRNZXNzYWdlRXZlbnQgJiBFdmVudDx7IHBjcEZpZWxkcz86IFdlYlNvY2tldE1lc3NhZ2UgfT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtZXNzYWdlID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwicGNwRmllbGRzXCIpO1xuXG5cdFx0aWYgKG1lc3NhZ2U/LnNlcnZlckFjdGlvbiAhPT0gXCJSYWlzZVNpZGVFZmZlY3RcIiB8fCAhbWVzc2FnZS5zaWRlRWZmZWN0RXZlbnROYW1lIHx8ICFtZXNzYWdlLnNpZGVFZmZlY3RTb3VyY2UpIHtcblx0XHRcdC8vIG1lc3NhZ2UgaXMgbm90IHJlbGV2YW50XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YVBhdGggPSB0aGlzLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhUGF0aCk7XG5cdFx0Y29uc3QgcmVsZXZhbnRTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShcblx0XHRcdGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdG1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZVxuXHRcdCk7XG5cblx0XHRpZiAocmVsZXZhbnRTaWRlRWZmZWN0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIG5vIHNpZGUgZWZmZWN0IGZvciB0aGlzIHNvdXJjZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbGV2YW50UGFnZXM6IFBhZ2VDb250cm9sbGVyW10gPSBbXTtcblx0XHRjb25zdCBwYWdlcyA9IHRoaXMuYXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmdldFZpc2libGVWaWV3cygpO1xuXHRcdGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuXHRcdFx0Y29uc3QgcGFnZUNvbnRyb2xsZXIgPSBwYWdlLmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChcblx0XHRcdFx0cGFnZUNvbnRyb2xsZXIuaXNBPFBhZ2VDb250cm9sbGVyPihcInNhcC5mZS5jb3JlLlBhZ2VDb250cm9sbGVyXCIpICYmXG5cdFx0XHRcdHBhZ2VDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5pc0RhdGFQYXRoUmVsZXZhbnQobWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlbGV2YW50UGFnZXMucHVzaChwYWdlQ29udHJvbGxlcik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGV2YW50UGFnZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBubyByZWxldmFudCBwYWdlIGZvdW5kIGZvciB0aGlzIHNvdXJjZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIHdlIGFzayB0aGUgdXNlciB0byBjb25maXJtIHRoZSByZWZyZXNoIG9yIG5vdGlmeSB0aGUgdXNlciwgd2UgdXNlIHRoZSBtb3N0IHNwZWNpZmljIHBhZ2Vcblx0XHRjb25zdCBzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24gPSByZWxldmFudFBhZ2VzW3JlbGV2YW50UGFnZXMubGVuZ3RoIC0gMV0uX3NpZGVFZmZlY3RzO1xuXHRcdGNvbnN0IGludGVyYWN0aW9uVHlwZSA9IHRoaXMuZ2V0U2lkZUVmZmVjdHNJbnRlcmFjdGlvblR5cGUobWVzc2FnZS5zaWRlRWZmZWN0RXZlbnROYW1lKTtcblxuXHRcdHN3aXRjaCAoaW50ZXJhY3Rpb25UeXBlKSB7XG5cdFx0XHRjYXNlIFwiQ29uZmlybWF0aW9uXCI6XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgc2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uLmNvbmZpcm1EYXRhUmVmcmVzaCgpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RpZmljYXRpb25cIjpcblx0XHRcdFx0c2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uLm5vdGlmeURhdGFSZWZyZXNoKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vbmVcIjpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0Ly8gbm93IHJlZnJlc2ggdGhlIHBhZ2VzLCBmb3J3YXJkIHRoaXMgdGFzayB0byB0aGUgc2lkZSBlZmZlY3RzIGNvbnRyb2xsZXIgZXh0ZW5zaW9ucyB0byBhbGxvdyBvdmVycmlkaW5nIHBlciBwYWdlIChpLmUuIExSKVxuXHRcdGZvciAoY29uc3QgcGFnZSBvZiByZWxldmFudFBhZ2VzKSB7XG5cdFx0XHRhd2FpdCBwYWdlLl9zaWRlRWZmZWN0cy5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudChtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUsIG1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBzaWRlIGVmZmVjdHMgaW50ZXJhY3Rpb24gdHlwZSBmcm9tIHRoZSBtYW5pZmVzdC5cblx0ICogIEBwYXJhbSBldmVudCBUaGUgc2lkZSBlZmZlY3RzIGV2ZW50IG5hbWVcblx0ICogQHJldHVybnMgVGhlIHNpZGUgZWZmZWN0cyBpbnRlcmFjdGlvbiB0eXBlXG5cdCAqL1xuXHRnZXRTaWRlRWZmZWN0c0ludGVyYWN0aW9uVHlwZShldmVudD86IHN0cmluZyk6IFNpZGVFZmZlY3RzRXZlbnRzSW50ZXJhY3Rpb25UeXBlIHtcblx0XHRpZiAoIXRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbikge1xuXHRcdFx0dGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5mZVwiKT8uYXBwPy5zaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gYSBnbG9iYWwgaW50ZXJhY3Rpb24gdHlwZSBpcyBkZWZpbmVkXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uO1xuXHRcdH1cblxuXHRcdGlmIChldmVudCAmJiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24/LmV2ZW50cz8uW2V2ZW50XSkge1xuXHRcdFx0Ly8gYW4gaW50ZXJhY3Rpb24gdHlwZSBpcyBkZWZpbmVkIGZvciB0aGUgZXZlbnRcblx0XHRcdHJldHVybiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24uZXZlbnRzW2V2ZW50XTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uPy5kZWZhdWx0KSB7XG5cdFx0XHQvLyBhIGRlZmF1bHQgaW50ZXJhY3Rpb24gdHlwZSBpcyBkZWZpbmVkIGZvciB0aGUgZXZlbnRcblx0XHRcdHJldHVybiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24uZGVmYXVsdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gXCJOb3RpZmljYXRpb25cIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbFxuXHQgKiBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGlzIGFkZGVkIGJ5IGEgY29udHJvbCB0byBrZWVwIGRhdGEgdXAgdG8gZGF0ZVxuXHQgKiBUaGVzZSBTaWRlRWZmZWN0cyBnZXQgbGltaXRlZCBzY29wZSBjb21wYXJlZCB3aXRoIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGFuIE9EYXRhIHNlcnZpY2U6XG5cdCAqIC0gT25seSBvbmUgU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBjYW4gYmUgZGVmaW5lZCBmb3IgdGhlIGNvbWJpbmF0aW9uIGVudGl0eSB0eXBlIC0gY29udHJvbCBJZFxuXHQgKiAtIE9ubHkgU2lkZUVmZmVjdHMgc291cmNlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHVzZWQgdG8gdHJpZ2dlciBTaWRlRWZmZWN0c1xuXHQgKlxuXHQgKiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ29udHJvbFNpZGVFZmZlY3RzKGVudGl0eVR5cGU6IHN0cmluZywgc2lkZUVmZmVjdDogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdGlmIChzaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3QgY29udHJvbFNpZGVFZmZlY3Q6IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdC4uLnNpZGVFZmZlY3QsXG5cdFx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5VHlwZX0vU2lkZUVmZmVjdHNGb3JDb250cm9sLyR7c2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWR9YFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW2VudGl0eVR5cGVdIHx8IHt9O1xuXHRcdFx0ZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW2NvbnRyb2xTaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZF0gPSBjb250cm9sU2lkZUVmZmVjdDtcblx0XHRcdHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW2VudGl0eVR5cGVdID0gZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBTaWRlRWZmZWN0cyBhY3Rpb24uXG5cdCAqIEBwYXJhbSB0cmlnZ2VyQWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRob3V0IGRhdGEgb3Igd2l0aCBhIHJldHVybiB2YWx1ZSBjb250ZXh0IHdoZW4gdGhlIGFjdGlvbiBjYWxsIHN1Y2NlZWRzXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgZXhlY3V0ZUFjdGlvbih0cmlnZ2VyQWN0aW9uOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBjb250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYCR7dHJpZ2dlckFjdGlvbn0oLi4uKWAsIGNvbnRleHQpO1xuXHRcdGdyb3VwSWQgPSBncm91cElkIHx8IGNvbnRleHQuZ2V0QmluZGluZygpLmdldFVwZGF0ZUdyb3VwSWQoKTtcblx0XHQvLyB0aGUgdHJpZ2dlckFjdGlvbiBpcyBleGVjdXRlZCBpbiBzYW1lICRiYXRjaCBidXQgZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblx0XHRhd2FpdCBhY3Rpb24uZXhlY3V0ZShncm91cElkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGNvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWwuXG5cdCAqIEByZXR1cm5zIENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVkTWV0YWRhdGEge1xuXHRcdHJldHVybiBjb252ZXJ0VHlwZXModGhpcy5nZXRNZXRhTW9kZWwoKSwgdGhpcy5jYXBhYmlsaXRpZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGVudGl0eSB0eXBlIG9mIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyBFbnRpdHkgVHlwZVxuXHQgKi9cblx0cHVibGljIGdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSksXG5cdFx0XHRlbnRpdHlUeXBlID0gbWV0YU1vZGVsLmdldE9iamVjdChtZXRhUGF0aClbXCIkVHlwZVwiXTtcblx0XHRyZXR1cm4gZW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5lbnRpdGllc1tlbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogSXMgYSBTaWRlRWZmZWN0cyBnZW5lcmF0ZWQgYnkgYSBjb250cm9sLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgVGhlIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIFNpZGVFZmZlY3RzIGlzIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wsIG90aGVyd2lzZSBmYWxzZVxuXHQgKi9cblx0cHVibGljIGlzQ29udHJvbFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUpOiBzaWRlRWZmZWN0cyBpcyBDb250cm9sU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRyZXR1cm4gISEoc2lkZUVmZmVjdHMgYXMgQ29udHJvbFNpZGVFZmZlY3RzVHlwZSkuc291cmNlQ29udHJvbElkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGdsb2JhbCBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgR2xvYmFsIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0R2xvYmFsT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgZW50aXR5U2lkZUVmZmVjdHMgPSB0aGlzLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZU5hbWUpO1xuXHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gZW50aXR5U2lkZUVmZmVjdHMpIHtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gZW50aXR5U2lkZUVmZmVjdHNba2V5XTtcblx0XHRcdGlmICghc2lkZUVmZmVjdHMuc291cmNlRW50aXRpZXMgJiYgIXNpZGVFZmZlY3RzLnNvdXJjZVByb3BlcnRpZXMgJiYgIXNpZGVFZmZlY3RzLnNvdXJjZUV2ZW50cykge1xuXHRcdFx0XHRnbG9iYWxTaWRlRWZmZWN0cy5wdXNoKHNpZGVFZmZlY3RzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGdsb2JhbFNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRpZiAoZW50aXR5VHlwZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMuYm91bmRBY3Rpb25zW2VudGl0eVR5cGVdPy5bYWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy51bkJvdW5kQWN0aW9ucz8uW2FjdGlvbk5hbWVdO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIFNpZGVFZmZlY3RzLlxuXHQgKiAgQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgd2l0aCB0aGUgU2lkZUVmZmVjdHMgc2VydmljZSBvbmNlIGRhdGEgaGFzIGJlZW4gd3JpdHRlblxuXHQgKi9cblx0YXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHRoaXM+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0U291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0gPSB7XG5cdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGV2ZW50czoge31cblx0XHR9O1xuXHRcdGNvbnN0IGVudmlyb25tZW50Q2FwYWJpbGl0aWVzU2VydmljZSA9IChhd2FpdCB0aGlzLmFwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFxuXHRcdFx0XCJlbnZpcm9ubWVudENhcGFiaWxpdGllc1wiXG5cdFx0KSkgYXMgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlO1xuXHRcdGNvbnN0IG1vZGVsID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRpZiAobW9kZWw/LmlzQT8uPE9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIE1ldGFNb2RlbCB0byBiZSByZXF1ZXN0ZWRcblx0XHRcdGF3YWl0IG1vZGVsLmdldE1ldGFNb2RlbCgpLnJlcXVlc3RPYmplY3QoXCIvJEVudGl0eUNvbnRhaW5lci9cIik7XG5cdFx0XHR0aGlzLmNhcGFiaWxpdGllcyA9IGVudmlyb25tZW50Q2FwYWJpbGl0aWVzU2VydmljZS5nZXRDYXBhYmlsaXRpZXMoKTtcblxuXHRcdFx0Y29uc3QgY29udmVydGVkTWV0YU1vZGVsID0gdGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKChlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSA9PiB7XG5cdFx0XHRcdHRoaXMubWFwRmllbGRBbm5vdGF0aW9ucyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMucmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RTb3VyY2VzKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBBY3Rpb24pID0+IHtcblx0XHRcdFx0aWYgKGFjdGlvbi5pc0JvdW5kKSB7XG5cdFx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMuYm91bmRBY3Rpb25zW2FjdGlvbi5zb3VyY2VFbnRpdHlUeXBlIS5mdWxseVF1YWxpZmllZE5hbWVdID0ge1xuXHRcdFx0XHRcdFx0Li4udGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMuYm91bmRBY3Rpb25zW2FjdGlvbi5zb3VyY2VFbnRpdHlUeXBlIS5mdWxseVF1YWxpZmllZE5hbWVdLFxuXHRcdFx0XHRcdFx0Li4udGhpcy5yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKGFjdGlvbilcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5hY3Rpb25zLnVuQm91bmRBY3Rpb25zID0ge1xuXHRcdFx0XHRcdFx0Li4udGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMudW5Cb3VuZEFjdGlvbnMsXG5cdFx0XHRcdFx0XHQuLi50aGlzLnJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoYWN0aW9uKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKHNpZGVFZmZlY3RTb3VyY2VzLmV2ZW50cykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLmluaXRpYWxpemVXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzID0gc2lkZUVmZmVjdFNvdXJjZXM7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwcml2YXRlIG1hcEZpZWxkQW5ub3RhdGlvbnMoc291cmNlOiBFbnRpdHlUeXBlKTogdm9pZCB7XG5cdFx0Y29uc3QgYWRkUmVjb21tZW5kYXRpb25Sb2xlcyA9IChzb3VyY2VOYW1lOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRcdGlmICghdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzLmhhc093blByb3BlcnR5KGAke3NvdXJjZU5hbWV9YCkpIHtcblx0XHRcdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2Ake3NvdXJjZU5hbWV9YF0gPSB7XG5cdFx0XHRcdFx0aW5wdXQ6IFtdLFxuXHRcdFx0XHRcdG91dHB1dDogW11cblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHNvdXJjZS5lbnRpdHlQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBjb21tb25Bbm5vID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uIGFzIFByb3BlcnR5QW5ub3RhdGlvbnNXaXRoUmVjb21tZW5kYXRpb247XG5cdFx0XHRpZiAoY29tbW9uQW5ubz8uUmVjb21tZW5kYXRpb25Sb2xlKSB7XG5cdFx0XHRcdGNvbnN0IHJvbGVUeXBlID0gY29tbW9uQW5uby5SZWNvbW1lbmRhdGlvblJvbGU7XG5cdFx0XHRcdGlmIChyb2xlVHlwZS52YWx1ZU9mKCkuaW5jbHVkZXMoXCJJbnB1dFwiKSkge1xuXHRcdFx0XHRcdGFkZFJlY29tbWVuZGF0aW9uUm9sZXMoYCR7c291cmNlLm5hbWV9YCk7XG5cdFx0XHRcdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2Ake3NvdXJjZS5uYW1lfWBdLmlucHV0LnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJvbGVUeXBlLnZhbHVlT2YoKS5pbmNsdWRlcyhcIk91dHB1dFwiKSkge1xuXHRcdFx0XHRcdGFkZFJlY29tbWVuZGF0aW9uUm9sZXMoYCR7c291cmNlLm5hbWV9YCk7XG5cdFx0XHRcdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2Ake3NvdXJjZS5uYW1lfWBdLm91dHB1dC5wdXNoKHByb3BlcnR5Lm5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVjb21tZW5kYXRpb25zTWFwcGluZygpOiBSZWNvbW1lbmRhdGlvbnNSZWdpc3RyeSB7XG5cdFx0cmV0dXJuIHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgcGFydCBvZiBSZWNvbW1lbmRhdGlvbidzIGlucHV0IG1hcHBpbmcgYW5kIGZyb20gdGhlIHNhbWUgZW50aXR5LlxuXHQgKiBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuXHQgKiBAcGFyYW0gZmllbGRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiBmaWVsZCBpcyBoYXMgcmVjb21tZW5kYXRpb24gcm9sZSAtIElucHV0IGFubm90YXRpb25cblx0ICovXG5cdHB1YmxpYyBjaGVja0lmRmllbGRJc1JlY29tbWVuZGF0aW9uUmVsZXZhbnQoZmllbGQ6IENvbnRyb2wpOiBib29sZWFuIHtcblx0XHRjb25zdCBjb250ZXh0ID0gZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBmaWVsZC5kYXRhKCkuc291cmNlUGF0aC5zcGxpdChcIi9cIikucG9wKCk7XG5cdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQ/LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IChtZXRhTW9kZWwgYXMgT0RhdGFNZXRhTW9kZWwpPy5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCB0YXJnZXREYXRhTW9kZWxPYmplY3QgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eT4obWV0YUNvbnRleHQpXG5cdFx0XHRcdC50YXJnZXRPYmplY3QhO1xuXHRcdFx0bGV0IHRhcmdldEVudGl0eVR5cGVOYW1lO1xuXHRcdFx0aWYgKGlzRW50aXR5U2V0KHRhcmdldERhdGFNb2RlbE9iamVjdCkpIHtcblx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZU5hbWUgPSB0YXJnZXREYXRhTW9kZWxPYmplY3QuZW50aXR5VHlwZT8ubmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoaXNOYXZpZ2F0aW9uUHJvcGVydHkodGFyZ2V0RGF0YU1vZGVsT2JqZWN0KSkge1xuXHRcdFx0XHR0YXJnZXRFbnRpdHlUeXBlTmFtZSA9IHRhcmdldERhdGFNb2RlbE9iamVjdC50YXJnZXRUeXBlPy5uYW1lO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSA9IHRhcmdldEVudGl0eVR5cGVOYW1lICYmIHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeS5yb2xlc1t0YXJnZXRFbnRpdHlUeXBlTmFtZV07XG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSAmJiByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5Py5pbnB1dD8uaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCByZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGluIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgd2hpY2ggYXJlIG1hcmtlZCBhcyBSZWNvbW1lbmRhdGlvblJvbGUgT3V0cHV0LlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9uIE91dHB1dCBmaWVsZHMgbmVlZHMgdG8gYmUgZmlndXJlZFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB3aGljaCBhcmUgbWFya2VkIFJlY29tbWVuZGF0aW9uUm9sZSBPdXRwdXRcblx0ICovXG5cdHB1YmxpYyBnZXRSZWNvbW1lbmRhdGlvbk91dHB1dEZpZWxkcyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRcdC8vVE9ETzogV2UgaGF2ZSB0byBjb25zaWRlciAxOjEgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlbGwuXG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSA9IHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeS5yb2xlc1tlbnRpdHlUeXBlTmFtZV07XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHk/Lm91dHB1dD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHkub3V0cHV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBDb250cm9sIElkXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKGNvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2wpLmZvckVhY2goKHNFbnRpdHlUeXBlKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbc0VudGl0eVR5cGVdW2NvbnRyb2xJZF0pIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW3NFbnRpdHlUeXBlXVtjb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBwYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0cyhwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ1JlcXVlc3QocGF0aEV4cHJlc3Npb25zLCBjb250ZXh0KTtcblx0XHRhd2FpdCBjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhwYXRoRXhwcmVzc2lvbnMsIGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYW4gT0RhdGEgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0cyBhbmQgYWN0aW9uIGV4ZWN1dGlvblxuXHQgKi9cblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKHNpZGVFZmZlY3RzOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUsIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPCh2b2lkIHwgdW5kZWZpbmVkKVtdPiB7XG5cdFx0bGV0IHByb21pc2VzOiBQcm9taXNlPHZvaWQgfCB1bmRlZmluZWQ+W107XG5cblx0XHRpZiAoc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cHJvbWlzZXMgPSBzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9ucy5tYXAoYXN5bmMgKGFjdGlvbk5hbWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZUFjdGlvbihhY3Rpb25OYW1lLCBjb250ZXh0KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9taXNlcyA9IFtdO1xuXHRcdH1cblxuXHRcdGlmIChzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cHJvbWlzZXMucHVzaCh0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMsIGNvbnRleHQpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbWlzZXMpIDogUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHkgTmF2aWdhdGlvbiBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgQmF0Y2ggZ3JvdXAgZm9yIHRoZSBxdWVyeVxuXHQgKiBAcGFyYW0gaWdub3JlVHJpZ2dlckFjdGlvbnMgSWYgdHJ1ZSwgd2UgZG8gbm90IHRyaWdnZXIgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBzaWRlIGVmZmVjdFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0Z3JvdXBJZD86IHN0cmluZyxcblx0XHRpZ25vcmVUcmlnZ2VyQWN0aW9ucyA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IGJhc2VFbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0aWYgKGJhc2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aCA9IGAke25hdmlnYXRpb25Qcm9wZXJ0eX0vYDtcblx0XHRcdGNvbnN0IGVudGl0eVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGJhc2VFbnRpdHlUeXBlKTtcblx0XHRcdGxldCB0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0bGV0IHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXSA9IFtdO1xuXHRcdFx0bGV0IHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMoZW50aXR5U2lkZUVmZmVjdHMpXG5cdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWxldmFudCBTaWRlRWZmZWN0c1xuXHRcdFx0XHRcdC8vIDEuIFNvdXJjZUVudGl0aWVzIG1hdGNoIE9SXG5cdFx0XHRcdFx0Ly8gMi4gT25seSAxIFNvdXJjZVByb3BlcnRpZXMgYW5kIG1hdGNoXG5cdFx0XHRcdFx0KGFubm90YXRpb25OYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBlbnRpdHlTaWRlRWZmZWN0c1thbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQoc2lkZUVmZmVjdHMuc291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0KG5hdmlnYXRpb24pID0+IG5hdmlnYXRpb24uJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IG5hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpIHx8XG5cdFx0XHRcdFx0XHRcdChzaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzPy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGguc3RhcnRzV2l0aChuYXZpZ2F0aW9uUGF0aCkgJiYgIXByb3BlcnR5UGF0aC5yZXBsYWNlKG5hdmlnYXRpb25QYXRoLCBcIlwiKS5pbmNsdWRlcyhcIi9cIilcblx0XHRcdFx0XHRcdFx0XHQpKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goKHNBbm5vdGF0aW9uTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gZW50aXR5U2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAoc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbiAmJiAhaWdub3JlVHJpZ2dlckFjdGlvbnMpIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9uLCBjb250ZXh0LCBncm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGFyZ2V0UHJvcGVydGllcyA9IHRhcmdldFByb3BlcnRpZXMuY29uY2F0KHNpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdFx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KHNpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlIHRhcmdldHNcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7XG5cdFx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHRcdHRhcmdldEVudGl0aWVzOiB0YXJnZXRFbnRpdGllc1xuXHRcdFx0fSk7XG5cdFx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSBbLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldFByb3BlcnRpZXMsIC4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRFbnRpdGllc107XG5cdFx0XHRpZiAoc2lkZUVmZmVjdHNUYXJnZXRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNUYXJnZXRzLCBjb250ZXh0LCBncm91cElkKS5jYXRjaCgoZXJyb3IpID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgU2lkZUVmZmVjdHMgZm9yIE5hdmlnYXRpb24gUHJvcGVydHkgJHtuYXZpZ2F0aW9uUHJvcGVydHl9YCwgZXJyb3IpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBjb250cm9scy5cblx0ICogQHBhcmFtIGVudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtlbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVyIGFuZCBvd25lciBlbnRpdHkgd2hlcmUgdGhpcyBlbnRpdHkgaXMgdXNlZCBhcyBzb3VyY2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlRW50aXR5SXNTb3VyY2UoZW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5lbnRpdGllc1tlbnRpdHlUeXBlTmFtZV0gfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVycyB3aGVyZSB0aGlzIGV2ZW50IGlzIHVzZWQgYXMgc291cmNlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgZnVsbHkgcXVhbGlmaWVkXG5cdCAqIEBwYXJhbSBldmVudE5hbWUgU2lkZSBFZmZlY3QgZXZlbnQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShlbnRpdHlUeXBlTmFtZTogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5ldmVudHNbZXZlbnROYW1lXT8uZmlsdGVyKChldmVudCkgPT4gZXZlbnQuZW50aXR5ID09PSBlbnRpdHlUeXBlTmFtZSkgfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIGZvciBhIHNpZGVFZmZlY3QgZXZlbnQgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gZXZlbnQgU2lkZUVmZmVjdHMgZXZlbnQgd2hpY2ggc2hvdWxkIGJlXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudChldmVudDogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0LCBncm91cElkPzogc3RyaW5nKTogUHJvbWlzZTx1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFQYXRoKTtcblx0XHRjb25zdCBzaWRlRWZmZWN0cyA9IHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIGV2ZW50KTtcblx0XHRsZXQgdGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgdGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdID0gW107XG5cblx0XHRzaWRlRWZmZWN0cy5mb3JFYWNoKChzaWRlRWZmZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uID1cblx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2RhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0/Lltcblx0XHRcdFx0XHRgJHtzaWRlRWZmZWN0LmVudGl0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzIyR7c2lkZUVmZmVjdC5xdWFsaWZpZXJ9YFxuXHRcdFx0XHRdO1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllcyA9IHRhcmdldFByb3BlcnRpZXMuY29uY2F0KGFubm90YXRpb24udGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0XHR0YXJnZXRFbnRpdGllcyA9IHRhcmdldEVudGl0aWVzLmNvbmNhdChhbm5vdGF0aW9uLnRhcmdldEVudGl0aWVzKTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiB0YXJnZXRQcm9wZXJ0aWVzLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IHRhcmdldEVudGl0aWVzXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXRzID0gWy4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRQcm9wZXJ0aWVzLCAuLi5zaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24udGFyZ2V0RW50aXRpZXNdO1xuXHRcdGlmIChzaWRlRWZmZWN0c1RhcmdldHMubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1RhcmdldHMsIGNvbnRleHQsIGdyb3VwSWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgU2lkZUVmZmVjdHMgZm9yIEV2ZW50ICR7ZXZlbnR9YCwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29tbW9uIG1ldGhvZCB0byBnZXQgdGhlIGZpZWxkIGdyb3VwSWRzIGZvciBhIHNvdXJjZSBlbnRpdHkgYW5kIGEgc291cmNlIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gc291cmNlRW50aXR5VHlwZVxuXHQgKiBAcGFyYW0gc291cmNlUHJvcGVydHlcblx0ICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIGZpZWxkR3JvdXBJZHNcblx0ICovXG5cdHB1YmxpYyBjb21wdXRlRmllbGRHcm91cElkcyhzb3VyY2VFbnRpdHlUeXBlOiBzdHJpbmcsIHNvdXJjZVByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgZW50aXR5RmllbGRHcm91cElkcyA9IHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlRW50aXR5SXNTb3VyY2Uoc291cmNlRW50aXR5VHlwZSkubWFwKChzaWRlRWZmZWN0SW5mbykgPT5cblx0XHRcdHRoaXMuZ2V0RmllbGRHcm91cElkRm9yU2lkZUVmZmVjdChzaWRlRWZmZWN0SW5mbywgdHJ1ZSlcblx0XHQpO1xuXHRcdHJldHVybiBlbnRpdHlGaWVsZEdyb3VwSWRzLmNvbmNhdChcblx0XHRcdHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlUHJvcGVydHlJc1NvdXJjZShzb3VyY2VQcm9wZXJ0eSkubWFwKChzaWRlRWZmZWN0SW5mbykgPT5cblx0XHRcdFx0dGhpcy5nZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVyIGFuZCBvd25lciBlbnRpdHkgd2hlcmUgdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGFzIHNvdXJjZS5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlUHJvcGVydHlJc1NvdXJjZShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gfHwgW107XG5cdH1cblxuXHQvLyBjaGVjayBpZiBjYW4gZGVmaW5lIHdoZXRoZXIgY2FsbGJhY2tzIGFyZSBhc3luYy4gT3RoZXJ3aXNlIGNvbW1lbnRcblx0Ly8gb25seSBvbmUgY2FsbGJhY2sgZm9yIG9uZSB0YXJnZXRcblx0cHVibGljIHJlZ2lzdGVyVGFyZ2V0Q2FsbGJhY2sodGFyZ2V0OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdHRoaXMudGFyZ2V0Q2FsbGJhY2tzW3RhcmdldF0gPSBjYWxsYmFjaztcblx0fVxuXG5cdHB1YmxpYyBkZXJlZ2lzdGVyVGFyZ2V0Q2FsbGJhY2sodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRkZWxldGUgdGhpcy50YXJnZXRDYWxsYmFja3NbdGFyZ2V0XTtcblx0fVxuXG5cdC8vIHBhc3MgcGFyYW1ldGVyXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkQ2FsbGJhY2sodGFyZ2V0OiBzdHJpbmcpOiBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMudGFyZ2V0Q2FsbGJhY2tzW3RhcmdldF07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB1cGRhdGVkIHNpZGUgZWZmZWN0cyBkZWZpbml0aW9uIHdpdGggYWxsIHRleHQgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNUYXJnZXRzIFRoZSB0YXJnZXRzIG9mIHRoZSBzaWRlIGVmZmVjdFxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgd2hlcmUgdGhlIHNpZGUgZWZmZWN0IGlzIHJlZ2lzdGVyZWRcblx0ICogQHJldHVybnMgVXBkYXRlZCBzaWRlIGVmZmVjdHMnIHRhcmdldHMgd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnRpZXMgb3IgZW50aXRpZXNcblx0ICovXG5cdHByaXZhdGUgYWRkVGV4dFByb3BlcnRpZXMoc2lkZUVmZmVjdHNUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUsIGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlKTogU2lkZUVmZmVjdHNUYXJnZXRUeXBlIHtcblx0XHRjb25zdCBzZXRPZlByb3BlcnRpZXMgPSBuZXcgU2V0KHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzKTtcblx0XHRjb25zdCBzZXRPZkVudGl0aWVzID0gbmV3IFNldChzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMubWFwKCh0YXJnZXQpID0+IHRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkpO1xuXHRcdC8vIEdlbmVyYXRlIGFsbCBwYXRocyByZWxhdGVkIHRvIHRoZSB0ZXh0IHByb3BlcnRpZXMgYW5kIG5vdCBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIFNpZGVFZmZlY3RzXG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggb2Ygc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZGF0YU1vZGVsUHJvcGVydHlQYXRoIG9mIHRoaXMuZ2V0RGF0YU1vZGVsUHJvcGVydGllc0Zyb21BUGF0aChwcm9wZXJ0eVBhdGgsIGVudGl0eVR5cGUpKSB7XG5cdFx0XHRcdGNvbnN0IGFzc29jaWF0ZWRUZXh0UGF0aCA9IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRpZiAoYXNzb2NpYXRlZFRleHRQYXRoKSB7XG5cdFx0XHRcdFx0dGhpcy5hZGRUZXh0UHJvcGVydHkoZGF0YU1vZGVsUHJvcGVydHlQYXRoLCBwcm9wZXJ0eVBhdGgsIGFzc29jaWF0ZWRUZXh0UGF0aCwgc2V0T2ZQcm9wZXJ0aWVzLCBzZXRPZkVudGl0aWVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogQXJyYXkuZnJvbShzZXRPZlByb3BlcnRpZXMpLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IEFycmF5LmZyb20oc2V0T2ZFbnRpdGllcykubWFwKChuYXZpZ2F0aW9uKSA9PiB7XG5cdFx0XHRcdHJldHVybiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBuYXZpZ2F0aW9uIH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0ZXh0IHJlbGF0ZWQgcHJvcGVydHkgdG8gdGhlIHNpZGUgZWZmZWN0cyB0YXJnZXRzXG5cdCAqIElmIHRoZSBwcm9wZXJ0eSBoYXMgYW4gYXNzb2NpYXRlZCB0ZXh0IHRoZW4gdGhpcyB0ZXh0IG5lZWRzIHRvIGJlIGFkZGVkIGlmIGl0J3Mgbm90IGFscmVhZHkgcmVmbGVjdGVkIGluIHRoZSBzaWRlIGVmZmVjdHMgZGVmaW5pdGlvbjpcblx0ICogLSBhcyB0YXJnZXRQcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBhbmQgaXRzIGFzc29jaWF0ZWQgdGV4dCBhcmUgb24gdGhlIHNhbWUgZW50aXR5U2V0XG5cdCAqIC0gYXMgdGFyZ2V0RW50aXRpZXMgaWYgdGhleSBhcmUgZGVmaW5lZCBvbiBkaWZmZXJlbnQgZW50aXR5U2V0cy5cblx0ICogQHBhcmFtIGRhdGFNb2RlbFByb3BlcnR5UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIGFzc29jaWF0ZWRUZXh0UGF0aCBUaGUgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHNldE9mUHJvcGVydGllcyBTZXQgb2YgZXhpc3Rpbmcgc2lkZUVmZmVjdCdzIHRhcmdldCBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzZXRPZkVudGl0aWVzIFNldCBvZiBleGlzdGluZyBzaWRlRWZmZWN0J3MgdGFyZ2V0IGVudGl0aWVzXG5cdCAqL1xuXHRwcml2YXRlIGFkZFRleHRQcm9wZXJ0eShcblx0XHRkYXRhTW9kZWxQcm9wZXJ0eVBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdGFzc29jaWF0ZWRUZXh0UGF0aDogc3RyaW5nLFxuXHRcdHNldE9mUHJvcGVydGllczogU2V0PHN0cmluZz4sXG5cdFx0c2V0T2ZFbnRpdGllczogU2V0PHN0cmluZz5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgZGF0YU1vZGVsVGV4dFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsUHJvcGVydHlQYXRoLCBhc3NvY2lhdGVkVGV4dFBhdGgpO1xuXHRcdGNvbnN0IHJlbGF0aXZlTmF2aWdhdGlvbiA9XG5cdFx0XHRwcm9wZXJ0eVBhdGguc3RhcnRzV2l0aChcIi9cIikgJiZcblx0XHRcdGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5U2V0Lm5hbWUgIT09IGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRFbnRpdHlTZXQ/Lm5hbWVcblx0XHRcdFx0PyBgLyR7ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5U2V0Py5mdWxseVF1YWxpZmllZE5hbWV9YFxuXHRcdFx0XHQ6IGdldFRhcmdldE5hdmlnYXRpb25QYXRoKGRhdGFNb2RlbFRleHRQYXRoLCB0cnVlKTtcblx0XHRjb25zdCB0YXJnZXRQYXRoID0gcHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpXG5cdFx0XHQ/IGAvJHtkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRPYmplY3QhLm5hbWV9YFxuXHRcdFx0OiBnZXRUYXJnZXRPYmplY3RQYXRoKGRhdGFNb2RlbFRleHRQYXRoLCB0cnVlKTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLmlzQXNzb2NpYXRlZFRleHRMaXN0ZWRJblNpZGVFZmZlY3RUYXJnZXRzKFxuXHRcdFx0XHRkYXRhTW9kZWxUZXh0UGF0aCxcblx0XHRcdFx0cmVsYXRpdmVOYXZpZ2F0aW9uLFxuXHRcdFx0XHR0YXJnZXRQYXRoLFxuXHRcdFx0XHRzZXRPZlByb3BlcnRpZXMsXG5cdFx0XHRcdHNldE9mRW50aXRpZXNcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdGlmICh0aGlzLmlzUHJvcGVydHlBc3NvY2lhdGVkVGV4dE9uRGlmZmVyZW50RW50aXR5U2V0KGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgZGF0YU1vZGVsVGV4dFBhdGgpKSB7XG5cdFx0XHRcdHNldE9mRW50aXRpZXMuYWRkKHJlbGF0aXZlTmF2aWdhdGlvbik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXRPZlByb3BlcnRpZXMuYWRkKHRhcmdldFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGFzc29jaWF0ZWQgdGV4dCBwcm9wZXJ0eSBuZWVkcyB0byBiZSBhZGRlZCBpZiBpdCdzIG5vdCBhbHJlYWR5IHJlZmxlY3RlZCBpbiB0aGUgc2lkZSBlZmZlY3RzIGRlZmluaXRpb246XG5cdCAqIC0gYXMgdGFyZ2V0UHJvcGVydGllcyBpZiB0aGUgcHJvcGVydHkgYW5kIGl0cyBhc3NvY2lhdGVkIHRleHQgYXJlIG9uIHRoZSBzYW1lIGVudGl0eVNldFxuXHQgKiAtIGFzIHRhcmdldEVudGl0aWVzIGlmIHRoZXkgYXJlIGRlZmluZWQgb24gZGlmZmVyZW50IGVudGl0eVNldHMuXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxUZXh0UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIGFzc29jaWF0ZWQgdGV4dFxuXHQgKiBAcGFyYW0gcmVsYXRpdmVOYXZpZ2F0aW9uIFRoZSBuYXZpZ2F0aW9uIHRvIHRoZSB0ZXh0IHByb3BlcnR5XG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2V0T2ZQcm9wZXJ0aWVzIFNldCBvZiBleGlzdGluZyBzaWRlRWZmZWN0J3MgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNldE9mRW50aXRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgZW50aXRpZXNcblx0ICogQHJldHVybnMgVXBkYXRlZCBzaWRlIGVmZmVjdHMnIHRhcmdldHMgd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnR5IG9yIGVudGl0eVxuXHQgKi9cblx0cHJpdmF0ZSBpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyhcblx0XHRkYXRhTW9kZWxUZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdFx0cmVsYXRpdmVOYXZpZ2F0aW9uOiBzdHJpbmcsXG5cdFx0dGFyZ2V0UGF0aDogc3RyaW5nLFxuXHRcdHNldE9mUHJvcGVydGllczogU2V0PHN0cmluZz4sXG5cdFx0c2V0T2ZFbnRpdGllczogU2V0PHN0cmluZz5cblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGlzUHJvcGVydHkoZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0T2JqZWN0KSAmJlxuXHRcdFx0IXNldE9mUHJvcGVydGllcy5oYXModGFyZ2V0UGF0aCkgJiYgLy8gdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgbGlzdGVkXG5cdFx0XHQhc2V0T2ZQcm9wZXJ0aWVzLmhhcyhgJHtyZWxhdGl2ZU5hdmlnYXRpb259JHtkYXRhTW9kZWxUZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPyBcIi9cIiA6IFwiXCJ9KmApICYmIC8vIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGxpc3RlZCB0aGFua3MgdG8gdGhlIFwiKlwiXG5cdFx0XHQhc2V0T2ZFbnRpdGllcy5oYXMoYCR7cmVsYXRpdmVOYXZpZ2F0aW9ufWApIC8vIHRoZSBwcm9wZXJ0eSBpcyBub3QgcGFydCBvZiBhIFRhcmdldEVudGl0aWVzXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHByb3BlcnR5IGFuZCBpdHMgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5IGFyZSBvbiBkaWZmZXJlbnQgZW50aXR5U2V0LlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsUHJvcGVydHlQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIGRhdGFNb2RlbFRleHRQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5XG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVudGl0eVNldCBpcyBkaWZmZXJlbnRcblx0ICovXG5cdHByaXZhdGUgaXNQcm9wZXJ0eUFzc29jaWF0ZWRUZXh0T25EaWZmZXJlbnRFbnRpdHlTZXQoXG5cdFx0ZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRkYXRhTW9kZWxUZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT5cblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRFbnRpdHlTZXQgIT09IGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0ISFkYXRhTW9kZWxUZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcyAmJlxuXHRcdFx0ISFkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlUeXBlXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgU2lkZUVmZmVjdHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqIC0gU2V0IFRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nXG5cdCAqIC0gQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqIC0gQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqIC0gUmVwbGFjZXMgVGFyZ2V0UHJvcGVydGllcyBoYXZpbmcgcmVmZXJlbmNlIHRvIFNvdXJjZSBQcm9wZXJ0aWVzIGZvciBhIFNpZGVFZmZlY3RzLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0gYmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGNvbnZlcnRTaWRlRWZmZWN0cyhcblx0XHRzaWRlRWZmZWN0czogQ29tbW9uU2lkZUVmZmVjdHNUeXBlLFxuXHRcdGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlLFxuXHRcdGJpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmdcblx0KTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IHRyaWdnZXJBY3Rpb24gPSBzaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uIGFzIHN0cmluZztcblx0XHRjb25zdCBuZXdTaWRlRWZmZWN0cyA9IHRoaXMuY29udmVydFNpZGVFZmZlY3RzRm9ybWF0KHNpZGVFZmZlY3RzKTtcblx0XHRsZXQgc2lkZUVmZmVjdHNUYXJnZXRzID0geyB0YXJnZXRQcm9wZXJ0aWVzOiBuZXdTaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLCB0YXJnZXRFbnRpdGllczogbmV3U2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMgfTtcblx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSB0aGlzLnJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIoc2lkZUVmZmVjdHNUYXJnZXRzLCBiaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSB0aGlzLmFkZFRleHRQcm9wZXJ0aWVzKHNpZGVFZmZlY3RzVGFyZ2V0cywgZW50aXR5VHlwZSk7XG5cdFx0c2lkZUVmZmVjdHNUYXJnZXRzID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHNpZGVFZmZlY3RzVGFyZ2V0cyk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdC4uLm5ld1NpZGVFZmZlY3RzLFxuXHRcdFx0Li4ueyB0YXJnZXRFbnRpdGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzLCB0YXJnZXRQcm9wZXJ0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcywgdHJpZ2dlckFjdGlvbiB9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgU2lkZUVmZmVjdHMgdGFyZ2V0cyAoVGFyZ2V0RW50aXRpZXMgYW5kIFRhcmdldFByb3BlcnRpZXMpIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAtIFRhcmdldFByb3BlcnRpZXMgYXMgYXJyYXkgb2Ygc3RyaW5nXG5cdCAqIC0gVGFyZ2V0RW50aXRpZXMgYXMgYXJyYXkgb2Ygb2JqZWN0IHdpdGggcHJvcGVydHkgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEByZXR1cm5zIENvbnZlcnRlZCBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBjb252ZXJ0U2lkZUVmZmVjdHNGb3JtYXQoc2lkZUVmZmVjdHM6IENvbW1vblNpZGVFZmZlY3RzVHlwZSk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBmb3JtYXRQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXM/OiAoc3RyaW5nIHwgUHJvcGVydHlQYXRoKVtdKTogc3RyaW5nW10gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0cmV0dXJuIHByb3BlcnRpZXNcblx0XHRcdFx0PyBwcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10sIHRhcmdldCkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHBhdGggPSBcIlwiO1xuXHRcdFx0XHRcdFx0aWYgKGlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbih0YXJnZXQpKSB7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSB0YXJnZXQudmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IHRhcmdldDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChwYXRoKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldFByb3BlcnRpZXMucHVzaChwYXRoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFx0XHRgU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFRhcmdldFByb3BlcnRpZXMgZm9yIFNpZGVFZmZlY3RzICR7c2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lfWBcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiB0YXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0XHQgIH0sIFtdKVxuXHRcdFx0XHQ6IHByb3BlcnRpZXM7XG5cdFx0fTtcblx0XHRjb25zdCBmb3JtYXRFbnRpdGllcyA9IChlbnRpdGllcz86IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXSk6IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0cmV0dXJuIGVudGl0aWVzXG5cdFx0XHRcdD8gZW50aXRpZXMubWFwKCh0YXJnZXRFbnRpdHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiB0YXJnZXRFbnRpdHkudmFsdWUgfTtcblx0XHRcdFx0ICB9KVxuXHRcdFx0XHQ6IGVudGl0aWVzO1xuXHRcdH07XG5cblx0XHQvLyBUT0RPOiBTb3VyY2VFdmVudHMgYXJlIHN0aWxsIGV4cGVyaW1lbnRhbCwgcmVtb3ZlIG9uY2UgcHVibGljXG5cdFx0dHlwZSBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhTb3VyY2VFdmVudHMgPSBDb21tb25TaWRlRWZmZWN0c1R5cGUgJiB7IFNvdXJjZUV2ZW50cz86IEVkbS5TdHJpbmdbXSB9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0c291cmNlUHJvcGVydGllczogZm9ybWF0UHJvcGVydGllcyhzaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzKSxcblx0XHRcdHNvdXJjZUVudGl0aWVzOiBmb3JtYXRFbnRpdGllcyhzaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyksXG5cdFx0XHRzb3VyY2VFdmVudHM6IChzaWRlRWZmZWN0cyBhcyBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhTb3VyY2VFdmVudHMpLlNvdXJjZUV2ZW50cyBhcyBzdHJpbmdbXSxcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IGZvcm1hdFByb3BlcnRpZXMoc2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyAoc3RyaW5nIHwgUHJvcGVydHlQYXRoKVtdKSA/PyBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBmb3JtYXRFbnRpdGllcyhzaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcykgPz8gW11cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYWxsIGRhdGFNb2RlbE9iamVjdFBhdGggcmVsYXRlZCB0byBwcm9wZXJ0aWVzIGxpc3RlZCBieSBhIHBhdGhcblx0ICpcblx0ICogVGhlIHBhdGggY2FuIGJlOlxuXHQgKiAtIGEgcGF0aCB0YXJnZXRpbmcgYSBwcm9wZXJ0eSBvbiBhIGNvbXBsZXhUeXBlIG9yIGFuIEVudGl0eVR5cGVcblx0ICogLSBhIHBhdGggd2l0aCBhIHN0YXIgdGFyZ2V0aW5nIGFsbCBwcm9wZXJ0aWVzIG9uIGEgY29tcGxleFR5cGUgb3IgYW4gRW50aXR5VHlwZS5cblx0ICogLSBhYnNvbHV0ZS5cblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcGF0aCB0byBhbmFseXplXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIGRhdGFNb2RlbE9iamVjdFBhdGggcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIGdldERhdGFNb2RlbFByb3BlcnRpZXNGcm9tQVBhdGgocHJvcGVydHlQYXRoOiBzdHJpbmcsIGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlKTogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT5bXSB7XG5cdFx0bGV0IGRhdGFNb2RlbE9iamVjdFBhdGhzOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5PltdID0gW107XG5cdFx0Y29uc3QgY29udmVydGVkTWV0YU1vZGVsID0gdGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBjb250YWluZXJOYW1lID0gY29udmVydGVkTWV0YU1vZGVsLmVudGl0eUNvbnRhaW5lci5mdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0bGV0IHByb3BlcnR5UmVsYXRpdmVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0XHR0ZXN0RW50aXR5VHlwZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRcdHJlZ2V4UGF0dGVybjogUmVnRXhwLFxuXHRcdFx0bWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXkgfCBudWxsO1xuXHRcdGlmIChwcm9wZXJ0eVBhdGguc3RhcnRzV2l0aChgLyR7Y29udGFpbmVyTmFtZX0vYCkpIHtcblx0XHRcdHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF5cXFxcLyR7Y29udGFpbmVyTmFtZX1cXFxcL1teL10rXFxcXC8oLispPyRgKTtcblx0XHRcdG1hdGNoID0gcHJvcGVydHlQYXRoLm1hdGNoKHJlZ2V4UGF0dGVybik7XG5cdFx0XHRwcm9wZXJ0eVJlbGF0aXZlUGF0aCA9IG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICghZW50aXR5VHlwZSkge1xuXHRcdFx0cmVnZXhQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXi8ke2NvbnRhaW5lck5hbWV9LyhbXi9dKylgKTtcblx0XHRcdG1hdGNoID0gcHJvcGVydHlQYXRoLm1hdGNoKHJlZ2V4UGF0dGVybik7XG5cdFx0XHR0ZXN0RW50aXR5VHlwZU5hbWUgPSBtYXRjaCA/IG1hdGNoWzFdIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCB0ZXN0RW50aXR5VHlwZSA9XG5cdFx0XHRlbnRpdHlUeXBlID8/XG5cdFx0XHQoKHRlc3RFbnRpdHlUeXBlTmFtZSA/IGNvbnZlcnRlZE1ldGFNb2RlbC5yZXNvbHZlUGF0aChgLyR7dGVzdEVudGl0eVR5cGVOYW1lfS9gKS50YXJnZXQgOiB1bmRlZmluZWQpIGFzIEVudGl0eVR5cGUgfCB1bmRlZmluZWQpO1xuXHRcdGNvbnN0IGVudGl0eVNldCA9XG5cdFx0XHRjb252ZXJ0ZWRNZXRhTW9kZWwuZW50aXR5U2V0cy5maW5kKChyZWxhdGVkRW50aXR5U2V0KSA9PiByZWxhdGVkRW50aXR5U2V0LmVudGl0eVR5cGUgPT09IHRlc3RFbnRpdHlUeXBlKSA/P1xuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLnNpbmdsZXRvbnMuZmluZCgoc2luZ2xldG9uKSA9PiBzaW5nbGV0b24uZW50aXR5VHlwZSA9PT0gdGVzdEVudGl0eVR5cGUpO1xuXHRcdGlmIChlbnRpdHlTZXQpIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRoaXMuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdGVudGl0eVNldENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke2VudGl0eVNldC5uYW1lfWApO1xuXHRcdFx0aWYgKGVudGl0eVNldENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsRW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKGVudGl0eVNldENvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHkgfCBFbnRpdHlUeXBlPihcblx0XHRcdFx0XHRcdGRhdGFNb2RlbEVudGl0eVNldCxcblx0XHRcdFx0XHRcdChwcm9wZXJ0eVJlbGF0aXZlUGF0aCB8fCBwcm9wZXJ0eVBhdGgpLnJlcGxhY2UoXCIqXCIsIFwiXCIpIHx8IFwiL1wiXG5cdFx0XHRcdFx0KSwgLy8gXCIqXCIgaXMgcmVwbGFjZWQgYnkgXCIvXCIgdG8gdGFyZ2V0IHRoZSBjdXJyZW50IEVudGl0eVR5cGVcblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0XHRcdFx0aWYgKGlzUHJvcGVydHkodGFyZ2V0T2JqZWN0KSkge1xuXHRcdFx0XHRcdGlmIChpc0NvbXBsZXhUeXBlKHRhcmdldE9iamVjdC50YXJnZXRUeXBlKSkge1xuXHRcdFx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRocy5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdHRhcmdldE9iamVjdC50YXJnZXRUeXBlLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT5cblx0XHRcdFx0XHRcdFx0XHRlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgcHJvcGVydHkubmFtZSlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aHMucHVzaChkYXRhTW9kZWxPYmplY3RQYXRoIGFzIERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNFbnRpdHlUeXBlKHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRocyA9IGRhdGFNb2RlbE9iamVjdFBhdGhzLmNvbmNhdChcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgoZW50aXR5UHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCBlbnRpdHlQcm9wZXJ0eS5uYW1lKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbnRpdHlTZXRDb250ZXh0LmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRhdGFNb2RlbE9iamVjdFBhdGhzLmZpbHRlcigoZGF0YU1vZGVsT2JqZWN0UGF0aCkgPT4gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIE9kYXRhIG1ldGFtb2RlbC5cblx0ICogQHJldHVybnMgVGhlIE9EYXRhIG1ldGFtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRNZXRhTW9kZWwoKTogT0RhdGFNZXRhTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYW4gZW50aXR5IHR5cGUgb3IgYWN0aW9uIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoIGV4cGVjdGVkIGZvcm1hdC5cblx0ICogQHBhcmFtIHNvdXJjZSBFbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogQHJldHVybnMgQXJyYXkgb2YgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKHNvdXJjZTogRW50aXR5VHlwZSB8IEFjdGlvbik6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10ge1xuXHRcdGxldCBiaW5kaW5nQWxpYXMgPSBcIlwiO1xuXHRcdGNvbnN0IGlzU291cmNlRW50aXR5VHlwZSA9IGlzRW50aXR5VHlwZShzb3VyY2UpO1xuXHRcdGNvbnN0IGVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSBpc1NvdXJjZUVudGl0eVR5cGUgPyBzb3VyY2UgOiBzb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRjb25zdCBjb21tb25Bbm5vdGF0aW9uID0gc291cmNlLmFubm90YXRpb25zPy5Db21tb24gYXMgdW5kZWZpbmVkIHwgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBDb21tb25Bbm5vdGF0aW9uVHlwZXM+O1xuXHRcdGlmIChjb21tb25Bbm5vdGF0aW9uKSB7XG5cdFx0XHRpZiAoZW50aXR5VHlwZSAmJiAhaXNTb3VyY2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXIgPSBzb3VyY2UucGFyYW1ldGVycz8uZmluZCgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIudHlwZSA9PT0gZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0XHRiaW5kaW5nQWxpYXMgPSBiaW5kaW5nUGFyYW1ldGVyPy5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCIvXCIpWzFdID8/IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlKHNvdXJjZSkubWFwKChzaWRlRWZmZWN0QW5ubykgPT5cblx0XHRcdFx0dGhpcy5jb252ZXJ0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdEFubm8sIGVudGl0eVR5cGUsIGJpbmRpbmdBbGlhcylcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGFuIGVudGl0eSB0eXBlIG9yIGFjdGlvbiB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBvciBhY3Rpb24uXG5cdCAqIEBwYXJhbSBzb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIGdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2Uoc291cmNlOiBFbnRpdHlUeXBlIHwgQWN0aW9uKTogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyW10ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGNvbW1vbkFubm90YXRpb24gPSBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbiBhcyB1bmRlZmluZWQgfCB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllcj47XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gY29tbW9uQW5ub3RhdGlvbikge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbiA9IGNvbW1vbkFubm90YXRpb25ba2V5XTtcblx0XHRcdGlmICh0aGlzLmlzU2lkZUVmZmVjdHNBbm5vdGF0aW9uKGFubm90YXRpb24pKSB7XG5cdFx0XHRcdHNpZGVFZmZlY3RzLnB1c2goYW5ub3RhdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGFubm90YXRpb24gaXMgYSBTaWRlRWZmZWN0cyBhbm5vdGF0aW9uLlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvbiBBbm5vdGF0aW9uXG5cdCAqIEByZXR1cm5zIEJvb2xlYW5cblx0ICovXG5cdHByaXZhdGUgaXNTaWRlRWZmZWN0c0Fubm90YXRpb24oYW5ub3RhdGlvbjogdW5rbm93bik6IGFubm90YXRpb24gaXMgQ29tbW9uU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRyZXR1cm4gKGFubm90YXRpb24gYXMgQ29tbW9uU2lkZUVmZmVjdHNUeXBlKT8uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGU7XG5cdH1cblxuXHQvKipcblx0ICogTG9ncyB0aGUgU2lkZUVmZmVjdHMgcmVxdWVzdC5cblx0ICogQHBhcmFtIHBhdGhFeHByZXNzaW9ucyBTaWRlRWZmZWN0cyB0YXJnZXRzXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgbG9nUmVxdWVzdChwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB0YXJnZXRQYXRocyA9IHBhdGhFeHByZXNzaW9ucy5yZWR1Y2UoZnVuY3Rpb24gKHBhdGhzLCB0YXJnZXQpIHtcblx0XHRcdHJldHVybiBgJHtwYXRoc31cXG5cXHRcXHQkeyh0YXJnZXQgYXMgU2lkZUVmZmVjdHNFbnRpdHlUeXBlKS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCB0YXJnZXQgfHwgXCJcIn1gO1xuXHRcdH0sIFwiXCIpO1xuXHRcdExvZy5kZWJ1ZyhgU2lkZUVmZmVjdHMgLSBSZXF1ZXN0OlxcblxcdENvbnRleHQgcGF0aCA6ICR7Y29udGV4dC5nZXRQYXRoKCl9XFxuXFx0UHJvcGVydHkgcGF0aHMgOiR7dGFyZ2V0UGF0aHN9YCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbmFtZSBvZiB0aGUgYmluZGluZyBwYXJhbWV0ZXIgb24gdGhlIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1RhcmdldHMgU2lkZUVmZmVjdHMgVGFyZ2V0c1xuXHQgKiBAcGFyYW0gYmluZGluZ1BhcmFtZXRlck5hbWUgTmFtZSBvZiBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIHJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIoc2lkZUVmZmVjdHNUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUsIGJpbmRpbmdQYXJhbWV0ZXJOYW1lPzogc3RyaW5nKTogU2lkZUVmZmVjdHNUYXJnZXRUeXBlIHtcblx0XHRpZiAoYmluZGluZ1BhcmFtZXRlck5hbWUpIHtcblx0XHRcdGNvbnN0IHJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyID0gZnVuY3Rpb24gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeJHtiaW5kaW5nUGFyYW1ldGVyTmFtZX0vP2ApLCBcIlwiKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcy5tYXAoKHRhcmdldFByb3BlcnR5KSA9PiByZXBsYWNlQmluZGluZ1BhcmFtZXRlcih0YXJnZXRQcm9wZXJ0eSkpLFxuXHRcdFx0XHR0YXJnZXRFbnRpdGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzLm1hcCgodGFyZ2V0RW50aXR5KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyKHRhcmdldEVudGl0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfTtcblx0XHRcdFx0fSlcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcyxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXNcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZSBkdXBsaWNhdGVzIGluIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1RhcmdldHMgU2lkZUVmZmVjdHMgVGFyZ2V0c1xuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSByZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlKTogU2lkZUVmZmVjdHNUYXJnZXRUeXBlIHtcblx0XHRjb25zdCB0YXJnZXRFbnRpdGllc1BhdGhzID0gc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzLm1hcCgodGFyZ2V0RW50aXR5KSA9PiB0YXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHVuaXF1ZVRhcmdldGVkRW50aXRpZXNQYXRoID0gbmV3IFNldDxzdHJpbmc+KHRhcmdldEVudGl0aWVzUGF0aHMpO1xuXHRcdGNvbnN0IHVuaXF1ZVRhcmdldFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMpO1xuXG5cdFx0Y29uc3QgdW5pcXVlVGFyZ2V0ZWRFbnRpdGllcyA9IEFycmF5LmZyb20odW5pcXVlVGFyZ2V0ZWRFbnRpdGllc1BhdGgpLm1hcCgoZW50aXR5UGF0aCkgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGVudGl0eVBhdGhcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4geyB0YXJnZXRQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKHVuaXF1ZVRhcmdldFByb3BlcnRpZXMpLCB0YXJnZXRFbnRpdGllczogdW5pcXVlVGFyZ2V0ZWRFbnRpdGllcyB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICogQHBhcmFtIGFjdGlvbiBBY3Rpb25cblx0ICogQHJldHVybnMgRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSByZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKGFjdGlvbjogQWN0aW9uKTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4gPSB7fTtcblx0XHRjb25zdCB0cmlnZ2VyQWN0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGxldCB0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCB0YXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNFbnRpdHlUeXBlW10gPSBbXTtcblxuXHRcdHRoaXMuZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKGFjdGlvbikuZm9yRWFjaCgob0RhdGFTaWRlRWZmZWN0KSA9PiB7XG5cdFx0XHRjb25zdCB0cmlnZ2VyQWN0aW9uID0gb0RhdGFTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb247XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzID0gdGFyZ2V0UHJvcGVydGllcy5jb25jYXQob0RhdGFTaWRlRWZmZWN0LnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdFx0dGFyZ2V0RW50aXRpZXMgPSB0YXJnZXRFbnRpdGllcy5jb25jYXQob0RhdGFTaWRlRWZmZWN0LnRhcmdldEVudGl0aWVzKTtcblx0XHRcdGlmICh0cmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdHRyaWdnZXJBY3Rpb25zLmFkZCh0cmlnZ2VyQWN0aW9uKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRjb25zdCBzaWRlRWZmZWN0c1RhcmdldHMgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoeyB0YXJnZXRQcm9wZXJ0aWVzLCB0YXJnZXRFbnRpdGllcyB9KTtcblx0XHRjb25zdCBhY3Rpb25OYW1lID0gYWN0aW9uLmlzQm91bmQgPyBhY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lLm1hdGNoKC9eW14oXSsvKT8uWzBdIDogYWN0aW9uLm5hbWU7XG5cdFx0c2lkZUVmZmVjdHNbYWN0aW9uTmFtZSFdID0ge1xuXHRcdFx0cGF0aEV4cHJlc3Npb25zOiBbLi4uc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMsIC4uLnNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllc10sXG5cdFx0XHR0cmlnZ2VyQWN0aW9uczogQXJyYXkuZnJvbSh0cmlnZ2VyQWN0aW9ucylcblx0XHR9O1xuXHRcdHJldHVybiBzaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIGVudGl0eSB0eXBlIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHNcblx0ICogcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGhcblx0ICogZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIHJldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBlbnRpdHlTaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0dGhpcy5nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UoZW50aXR5VHlwZSkuZm9yRWFjaCgoc2lkZUVmZmVjdHMpID0+IHtcblx0XHRcdGVudGl0eVNpZGVFZmZlY3RzW3NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBzaWRlRWZmZWN0cztcblx0XHR9KTtcblx0XHRyZXR1cm4gZW50aXR5U2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyBhIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCBvbiB0aGUgZW50aXR5IHRvIHRyYWNrIHdoZXJlIHRob3NlIHNvdXJjZXMgYXJlIHVzZWQgaW4gU2lkZUVmZmVjdHMgYW5ub3RhdGlvbi5cblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqL1xuXHRwcml2YXRlIG1hcFNpZGVFZmZlY3RTb3VyY2VzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fVxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHNpZGVFZmZlY3REZWZpbml0aW9uIG9mIHRoaXMuZ2V0U2lkZUVmZmVjdHNBbm5vdGF0aW9uRnJvbVNvdXJjZShlbnRpdHlUeXBlKSkge1xuXHRcdFx0dGhpcy5tYXBTaWRlRWZmZWN0U291cmNlRW50aXRpZXMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdHNTb3VyY2VzLCBzaWRlRWZmZWN0RGVmaW5pdGlvbik7XG5cdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VQcm9wZXJ0aWVzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RzU291cmNlcywgc2lkZUVmZmVjdERlZmluaXRpb24pO1xuXHRcdFx0dGhpcy5tYXBTaWRlRWZmZWN0U291cmNlRXZlbnRzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RzU291cmNlcywgc2lkZUVmZmVjdERlZmluaXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGaWxscyB0aGUgbWFwIGZvciB0aGUgU291cmNlcyBvZiBzaWRlRWZmZWN0IHdpdGggc291cmNlIGVudGl0aWVzLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3REZWZpbml0aW9uIFRoZSBzaWRlIGVmZmVjdCBkZWZpbml0aW9uIHRvIGJlIGV2YWx1YXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlRW50aXRpZXMoXG5cdFx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRzaWRlRWZmZWN0c1NvdXJjZXM6IHtcblx0XHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHR9LFxuXHRcdHNpZGVFZmZlY3REZWZpbml0aW9uOiBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXJcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBzb3VyY2VFbnRpdHkgb2Ygc2lkZUVmZmVjdERlZmluaXRpb24uU291cmNlRW50aXRpZXMgPz8gW10pIHtcblx0XHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBzb3VyY2VFbnRpdHkudmFsdWUgPyBzb3VyY2VFbnRpdHkuJHRhcmdldD8udGFyZ2V0VHlwZSA6IGVudGl0eVR5cGU7XG5cdFx0XHRpZiAodGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdFx0XHRpZiAoIXNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1t0YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0pIHtcblx0XHRcdFx0XHRzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNbdGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzW3RhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXS5wdXNoKHtcblx0XHRcdFx0XHRlbnRpdHk6IGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdHF1YWxpZmllcjogc2lkZUVmZmVjdERlZmluaXRpb24ucXVhbGlmaWVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGaWxscyB0aGUgbWFwIGZvciB0aGUgU291cmNlcyBvZiBzaWRlRWZmZWN0IHdpdGggc291cmNlIHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHlUeXBlIHdlIGxvb2sgZm9yIHNpZGUgRWZmZWN0cyBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMgVGhlIG1hcHBpbmcgb2JqZWN0IGluIGNvbnN0cnVjdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdERlZmluaXRpb24gVGhlIHNpZGUgZWZmZWN0IGRlZmluaXRpb24gdG8gYmUgZXZhbHVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIG1hcFNpZGVFZmZlY3RTb3VyY2VQcm9wZXJ0aWVzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSxcblx0XHRzaWRlRWZmZWN0RGVmaW5pdGlvbjogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGhhc1VuaXF1ZVNvdXJjZVByb3BlcnR5ID0gc2lkZUVmZmVjdERlZmluaXRpb24uU291cmNlUHJvcGVydGllcz8ubGVuZ3RoID09PSAxO1xuXHRcdGZvciAoY29uc3Qgc291cmNlUHJvcGVydHkgb2Ygc2lkZUVmZmVjdERlZmluaXRpb24uU291cmNlUHJvcGVydGllcyA/PyBbXSkge1xuXHRcdFx0aWYgKHNvdXJjZVByb3BlcnR5LiR0YXJnZXQpIHtcblx0XHRcdFx0aWYgKCFzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1tzb3VyY2VQcm9wZXJ0eS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZV0pIHtcblx0XHRcdFx0XHRzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1tzb3VyY2VQcm9wZXJ0eS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1tzb3VyY2VQcm9wZXJ0eS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZV0ucHVzaCh7XG5cdFx0XHRcdFx0ZW50aXR5OiBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRxdWFsaWZpZXI6IHNpZGVFZmZlY3REZWZpbml0aW9uLnF1YWxpZmllcixcblx0XHRcdFx0XHRoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmlsbHMgdGhlIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCB3aXRoIHNvdXJjZSBldmVudHMuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHlUeXBlIHdlIGxvb2sgZm9yIHNpZGUgRWZmZWN0cyBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMgVGhlIG1hcHBpbmcgb2JqZWN0IGluIGNvbnN0cnVjdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdERlZmluaXRpb24gVGhlIHNpZGUgZWZmZWN0IGRlZmluaXRpb24gdG8gYmUgZXZhbHVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIG1hcFNpZGVFZmZlY3RTb3VyY2VFdmVudHMoXG5cdFx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRzaWRlRWZmZWN0c1NvdXJjZXM6IHtcblx0XHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHR9LFxuXHRcdHNpZGVFZmZlY3REZWZpbml0aW9uOiBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXJcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBzb3VyY2VFdmVudCBvZiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5Tb3VyY2VFdmVudHMgPz8gW10pIHtcblx0XHRcdGlmICghc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1tzb3VyY2VFdmVudC50b1N0cmluZygpXSkge1xuXHRcdFx0XHRzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzW3NvdXJjZUV2ZW50LnRvU3RyaW5nKCldID0gW107XG5cdFx0XHR9XG5cdFx0XHRzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzW3NvdXJjZUV2ZW50LnRvU3RyaW5nKCldLnB1c2goe1xuXHRcdFx0XHRlbnRpdHk6IGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRxdWFsaWZpZXI6IHNpZGVFZmZlY3REZWZpbml0aW9uLnF1YWxpZmllclxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZmllbGRHcm91cElkIGJhc2VkIG9uIHRoZSBzdG9yZWQgaW5mb3JtYXRpb24gb24gdGggc2lkZSBlZmZlY3QuXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0SW5mb1xuXHQgKiBAcGFyYW0gaXNJbW1lZGlhdGVcblx0ICogQHJldHVybnMgQSBzdHJpbmcgZm9yIHRoZSBmaWVsZEdyb3VwSWQuXG5cdCAqL1xuXHRwcml2YXRlIGdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3Qoc2lkZUVmZmVjdEluZm86IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlLCBpc0ltbWVkaWF0ZSA9IGZhbHNlKTogc3RyaW5nIHtcblx0XHRjb25zdCBzaWRlRWZmZWN0V2l0aFF1YWxpZmllciA9IHNpZGVFZmZlY3RJbmZvLnF1YWxpZmllclxuXHRcdFx0PyBgJHtzaWRlRWZmZWN0SW5mby5lbnRpdHl9IyR7c2lkZUVmZmVjdEluZm8ucXVhbGlmaWVyfWBcblx0XHRcdDogc2lkZUVmZmVjdEluZm8uZW50aXR5O1xuXHRcdHJldHVybiBpc0ltbWVkaWF0ZSB8fCBzaWRlRWZmZWN0SW5mby5oYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eSA9PT0gdHJ1ZVxuXHRcdFx0PyBgJHtzaWRlRWZmZWN0V2l0aFF1YWxpZmllcn0kJEltbWVkaWF0ZVJlcXVlc3RgXG5cdFx0XHQ6IHNpZGVFZmZlY3RXaXRoUXVhbGlmaWVyO1xuXHR9XG5cblx0Z2V0SW50ZXJmYWNlKCk6IFNpZGVFZmZlY3RzU2VydmljZSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSBleHRlbmRzIFNlcnZpY2VGYWN0b3J5PFNpZGVFZmZlY3RzU2V0dGluZ3M+IHtcblx0YXN5bmMgY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxTaWRlRWZmZWN0c1NldHRpbmdzPik6IFByb21pc2U8U2lkZUVmZmVjdHNTZXJ2aWNlPiB7XG5cdFx0Y29uc3QgU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSA9IG5ldyBTaWRlRWZmZWN0c1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZS5pbml0aWFsaXplKCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1RkE7RUFDQTtFQUFBLElBd0NhQSxr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