@sapui5/sap.fe.core 1.102.0 → 1.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +62 -26
  4. package/src/sap/fe/core/AppComponent.ts +56 -40
  5. package/src/sap/fe/core/AppStateHandler.js +10 -10
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +236 -109
  10. package/src/sap/fe/core/CommonUtils.ts +252 -136
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +8 -8
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
  26. package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
  27. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  28. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  29. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
  30. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
  31. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
  32. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
  33. package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
  34. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
  35. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  36. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  37. package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
  38. package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  47. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  49. package/src/sap/fe/core/controllerextensions/Share.js +22 -22
  50. package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  60. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  62. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
  69. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  70. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
  75. package/src/sap/fe/core/controls/Any.js +9 -5
  76. package/src/sap/fe/core/controls/Any.ts +10 -4
  77. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  78. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  81. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  82. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  83. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  84. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  85. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  89. package/src/sap/fe/core/controls/FileWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
  91. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  92. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  93. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  94. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  95. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  96. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  97. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  98. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  99. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  100. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  101. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  102. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
  103. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
  104. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  105. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  106. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  107. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  108. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  109. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  112. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  113. package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
  114. package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
  115. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  116. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  117. package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
  118. package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
  119. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  120. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  121. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  122. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  123. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
  124. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  125. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  126. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  127. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  128. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
  129. package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
  130. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  131. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  132. package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
  133. package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  135. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  137. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
  138. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  139. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  140. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  141. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  142. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  143. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  144. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
  145. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
  146. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  147. package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
  148. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  150. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  152. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  153. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  154. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  155. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  156. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  157. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  158. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  159. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  160. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  161. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  162. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  163. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  164. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  165. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  166. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  167. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  168. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  169. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  170. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  171. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  172. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  173. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  174. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  175. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  176. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  177. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  178. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  179. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  180. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  181. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  182. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  183. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
  184. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  185. package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
  186. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  187. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  188. package/src/sap/fe/core/helpers/EditState.js +1 -6
  189. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  190. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  191. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  192. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  194. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  195. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  196. package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
  197. package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
  198. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  199. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  200. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  201. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  202. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  203. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  204. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  205. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  206. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  207. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  208. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  209. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  210. package/src/sap/fe/core/library.js +42 -3
  211. package/src/sap/fe/core/library.ts +38 -0
  212. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  213. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  214. package/src/sap/fe/core/messagebundle.properties +49 -35
  215. package/src/sap/fe/core/messagebundle_ar.properties +13 -5
  216. package/src/sap/fe/core/messagebundle_bg.properties +13 -5
  217. package/src/sap/fe/core/messagebundle_ca.properties +13 -5
  218. package/src/sap/fe/core/messagebundle_cs.properties +13 -5
  219. package/src/sap/fe/core/messagebundle_cy.properties +14 -6
  220. package/src/sap/fe/core/messagebundle_da.properties +13 -5
  221. package/src/sap/fe/core/messagebundle_de.properties +15 -7
  222. package/src/sap/fe/core/messagebundle_el.properties +14 -6
  223. package/src/sap/fe/core/messagebundle_en.properties +9 -1
  224. package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
  225. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
  226. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
  227. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
  228. package/src/sap/fe/core/messagebundle_es.properties +13 -5
  229. package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
  230. package/src/sap/fe/core/messagebundle_et.properties +13 -5
  231. package/src/sap/fe/core/messagebundle_fi.properties +14 -6
  232. package/src/sap/fe/core/messagebundle_fr.properties +14 -6
  233. package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
  234. package/src/sap/fe/core/messagebundle_hi.properties +14 -6
  235. package/src/sap/fe/core/messagebundle_hr.properties +14 -6
  236. package/src/sap/fe/core/messagebundle_hu.properties +13 -5
  237. package/src/sap/fe/core/messagebundle_id.properties +13 -5
  238. package/src/sap/fe/core/messagebundle_it.properties +33 -25
  239. package/src/sap/fe/core/messagebundle_iw.properties +13 -5
  240. package/src/sap/fe/core/messagebundle_ja.properties +14 -6
  241. package/src/sap/fe/core/messagebundle_kk.properties +13 -5
  242. package/src/sap/fe/core/messagebundle_ko.properties +13 -5
  243. package/src/sap/fe/core/messagebundle_lt.properties +13 -5
  244. package/src/sap/fe/core/messagebundle_lv.properties +14 -6
  245. package/src/sap/fe/core/messagebundle_ms.properties +13 -5
  246. package/src/sap/fe/core/messagebundle_nl.properties +13 -5
  247. package/src/sap/fe/core/messagebundle_no.properties +13 -5
  248. package/src/sap/fe/core/messagebundle_pl.properties +13 -5
  249. package/src/sap/fe/core/messagebundle_pt.properties +13 -5
  250. package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
  251. package/src/sap/fe/core/messagebundle_ro.properties +13 -5
  252. package/src/sap/fe/core/messagebundle_ru.properties +13 -5
  253. package/src/sap/fe/core/messagebundle_sh.properties +13 -5
  254. package/src/sap/fe/core/messagebundle_sk.properties +13 -5
  255. package/src/sap/fe/core/messagebundle_sl.properties +17 -9
  256. package/src/sap/fe/core/messagebundle_sv.properties +14 -6
  257. package/src/sap/fe/core/messagebundle_th.properties +13 -5
  258. package/src/sap/fe/core/messagebundle_tr.properties +13 -5
  259. package/src/sap/fe/core/messagebundle_uk.properties +13 -5
  260. package/src/sap/fe/core/messagebundle_vi.properties +13 -5
  261. package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
  262. package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
  263. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  269. package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
  270. package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
  271. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
  276. package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  278. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
  281. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  282. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  285. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  288. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  289. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  290. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  291. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  292. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  294. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  295. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  296. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  297. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  298. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  299. package/src/sap/fe/core/templating/FilterHelper.js +10 -9
  300. package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
  301. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  302. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  303. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  304. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  305. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  306. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  307. package/src/sap/fe/core/templating/UIFormatters.js +148 -93
  308. package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
  309. package/src/sap/fe/core/type/Email.js +2 -2
  310. package/src/sap/fe/core/type/Email.ts +2 -2
  311. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -56,7 +56,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
56
56
  _proto.toExternal = function
57
57
  /*oNavArgumentsArr: Array<object>, oComponent: object*/
58
58
  toExternal() {
59
- return;
59
+ /* Do Nothing */
60
60
  };
61
61
 
62
62
  _proto.getStartupAppState = function
@@ -66,7 +66,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
66
66
  };
67
67
 
68
68
  _proto.backToPreviousApp = function backToPreviousApp() {
69
- return;
69
+ /* Do Nothing */
70
70
  };
71
71
 
72
72
  _proto.hrefForExternal = function
@@ -75,7 +75,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
75
75
  return "";
76
76
  };
77
77
 
78
- _proto.hrefForExternalAsync = function hrefForExternalAsync(oArgs, oComponent) {
78
+ _proto.hrefForExternalAsync = function
79
+ /*oArgs?: object, oComponent?: object*/
80
+ hrefForExternalAsync() {
79
81
  return Promise.resolve({});
80
82
  };
81
83
 
@@ -132,19 +134,19 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
132
134
  _proto.setDirtyFlag = function
133
135
  /*bDirty: boolean*/
134
136
  setDirtyFlag() {
135
- return;
137
+ /* Do Nothing */
136
138
  };
137
139
 
138
140
  _proto.registerDirtyStateProvider = function
139
141
  /*fnDirtyStateProvider: Function*/
140
142
  registerDirtyStateProvider() {
141
- return;
143
+ /* Do Nothing */
142
144
  };
143
145
 
144
146
  _proto.deregisterDirtyStateProvider = function
145
147
  /*fnDirtyStateProvider: Function*/
146
148
  deregisterDirtyStateProvider() {
147
- return;
149
+ /* Do Nothing */
148
150
  };
149
151
 
150
152
  _proto.createRenderer = function createRenderer() {
@@ -162,31 +164,31 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
162
164
  _proto.registerNavigationFilter = function
163
165
  /*fnNavFilter: Function*/
164
166
  registerNavigationFilter() {
165
- return;
167
+ /* Do Nothing */
166
168
  };
167
169
 
168
170
  _proto.unregisterNavigationFilter = function
169
171
  /*fnNavFilter: Function*/
170
172
  unregisterNavigationFilter() {
171
- return;
173
+ /* Do Nothing */
172
174
  };
173
175
 
174
176
  _proto.setBackNavigation = function
175
177
  /*fnCallBack?: Function*/
176
178
  setBackNavigation() {
177
- return;
179
+ /* Do Nothing */
178
180
  };
179
181
 
180
182
  _proto.setHierarchy = function
181
183
  /*aHierarchyLevels: Array<object>*/
182
184
  setHierarchy() {
183
- return;
185
+ /* Do Nothing */
184
186
  };
185
187
 
186
188
  _proto.setTitle = function
187
189
  /*sTitle: string*/
188
190
  setTitle() {
189
- return;
191
+ /* Do Nothing */
190
192
  };
191
193
 
192
194
  _proto.getContentDensity = function getContentDensity() {
@@ -218,8 +220,8 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
218
220
  * Wrap a JQuery Promise within a native {Promise}.
219
221
  *
220
222
  * @template {object} T
221
- * @param {jQuery.Promise<T>} jqueryPromise The original jquery promise
222
- * @returns {Promise<T>} A native promise wrapping the same object
223
+ * @param jqueryPromise The original jquery promise
224
+ * @returns A native promise wrapping the same object
223
225
  * @private
224
226
  */
225
227
  function wrapJQueryPromise(jqueryPromise) {
@@ -311,9 +313,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
311
313
  *
312
314
  * @private
313
315
  * @ui5-restricted
314
- * @param {object} oArgs Check the definition of
316
+ * @param oArgs Check the definition of
315
317
  * sap.ushell.services.CrossApplicationNavigation=>getLinks arguments
316
- * @returns {Promise} Promise which will be resolved to target links array
318
+ * @returns Promise which will be resolved to target links array
317
319
  */
318
320
  ;
319
321
 
@@ -323,7 +325,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
323
325
  return new Promise(function (resolve, reject) {
324
326
  // eslint-disable-next-line promise/catch-or-return
325
327
  _this2.crossAppNavService.getLinks(oArgs).fail(function (oError) {
326
- reject(new Error(oError + " sap.fe.core.services.NavigationServiceFactory.getLinks"));
328
+ reject(new Error("".concat(oError, " sap.fe.core.services.NavigationServiceFactory.getLinks")));
327
329
  }).then(resolve);
328
330
  });
329
331
  }
@@ -335,9 +337,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
335
337
  *
336
338
  * @private
337
339
  * @ui5-restricted
338
- * @param {object} oArgs Check the definition of
340
+ * @param oArgs Check the definition of
339
341
  * sap.ushell.services.CrossApplicationNavigation=>getLinks arguments
340
- * @returns {Promise} Promise which will be resolved to target links array
342
+ * @returns Promise which will be resolved to target links array
341
343
  */
342
344
  ;
343
345
 
@@ -356,7 +358,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
356
358
  } else {
357
359
  // eslint-disable-next-line promise/catch-or-return
358
360
  _this3.crossAppNavService.getLinks(oCacheResults.newArgs).fail(function (oError) {
359
- reject(new Error(oError + " sap.fe.core.services.NavigationServiceFactory.getLinksWithCache"));
361
+ reject(new Error("".concat(oError, " sap.fe.core.services.NavigationServiceFactory.getLinksWithCache")));
360
362
  }).then(function (aLinks) {
361
363
  if (aLinks.length !== 0) {
362
364
  var oSemanticObjectsLinks = {};
@@ -403,7 +405,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
403
405
  * @private
404
406
  * @ui5-restricted
405
407
  * sap.ushell.container
406
- * @returns {object} Object with predefined shellContainer methods
408
+ * @returns Object with predefined shellContainer methods
407
409
  */
408
410
  ;
409
411
 
@@ -415,10 +417,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
415
417
  *
416
418
  * @private
417
419
  * @ui5-restricted
418
- * @param {Array} oNavArgumentsArr And
419
- * @param {object} oComponent Check the definition of
420
+ * @param oNavArgumentsArr And
421
+ * @param oComponent Check the definition of
420
422
  * sap.ushell.services.CrossApplicationNavigation=>toExternal arguments
421
- * @returns {void}
422
423
  */
423
424
  ;
424
425
 
@@ -433,9 +434,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
433
434
  *
434
435
  * @private
435
436
  * @ui5-restricted
436
- * @param {object} oArgs Check the definition of
437
+ * @param oArgs Check the definition of
437
438
  * sap.ushell.services.CrossApplicationNavigation=>getStartupAppState arguments
438
- * @returns {Promise} Promise which will be resolved to Object
439
+ * @returns Promise which will be resolved to Object
439
440
  */
440
441
  ;
441
442
 
@@ -446,14 +447,14 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
446
447
  // JQuery Promise behaves differently
447
448
  // eslint-disable-next-line promise/catch-or-return
448
449
  _this4.crossAppNavService.getStartupAppState(oArgs).fail(function (oError) {
449
- reject(new Error(oError + " sap.fe.core.services.NavigationServiceFactory.getStartupAppState"));
450
+ reject(new Error("".concat(oError, " sap.fe.core.services.NavigationServiceFactory.getStartupAppState")));
450
451
  }).then(resolve);
451
452
  });
452
453
  }
453
454
  /**
454
455
  * Will call backToPreviousApp method of CrossApplicationNavigation service.
455
456
  *
456
- * @returns {void}
457
+ * @returns Something that indicate we've navigated
457
458
  * @private
458
459
  * @ui5-restricted
459
460
  */
@@ -467,11 +468,11 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
467
468
  *
468
469
  * @private
469
470
  * @ui5-restricted
470
- * @param {object} oArgs Check the definition of
471
- * @param {object} oComponent The appComponent
472
- * @param {boolean} bAsync Whether this call should be async or not
471
+ * @param oArgs Check the definition of
472
+ * @param oComponent The appComponent
473
+ * @param bAsync Whether this call should be async or not
473
474
  * sap.ushell.services.CrossApplicationNavigation=>hrefForExternal arguments
474
- * @returns {string} Promise which will be resolved to string
475
+ * @returns Promise which will be resolved to string
475
476
  */
476
477
  ;
477
478
 
@@ -483,10 +484,10 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
483
484
  *
484
485
  * @private
485
486
  * @ui5-restricted
486
- * @param {object} oArgs Check the definition of
487
- * @param {object} oComponent The appComponent
487
+ * @param oArgs Check the definition of
488
+ * @param oComponent The appComponent
488
489
  * sap.ushell.services.CrossApplicationNavigation=>hrefForExternalAsync arguments
489
- * @returns {string} Promise which will be resolved to string
490
+ * @returns Promise which will be resolved to string
490
491
  */
491
492
  ;
492
493
 
@@ -498,10 +499,10 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
498
499
  *
499
500
  * @private
500
501
  * @ui5-restricted
501
- * @param {object} oComponent
502
- * @param {string} sAppStateKey Check the definition of
502
+ * @param oComponent
503
+ * @param sAppStateKey Check the definition of
503
504
  * sap.ushell.services.CrossApplicationNavigation=>getAppState arguments
504
- * @returns {Promise} Promise which will be resolved to object
505
+ * @returns Promise which will be resolved to object
505
506
  */
506
507
  ;
507
508
 
@@ -513,9 +514,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
513
514
  *
514
515
  * @private
515
516
  * @ui5-restricted
516
- * @param {object} oComponent Check the definition of
517
+ * @param oComponent Check the definition of
517
518
  * sap.ushell.services.CrossApplicationNavigation=>createEmptyAppState arguments
518
- * @returns {Promise} Promise which will be resolved to object
519
+ * @returns Promise which will be resolved to object
519
520
  */
520
521
  ;
521
522
 
@@ -527,10 +528,10 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
527
528
  *
528
529
  * @private
529
530
  * @ui5-restricted
530
- * @param {Array} oNavArgumentsArr
531
- * @param {object} oComponent Check the definition of
531
+ * @param oNavArgumentsArr
532
+ * @param oComponent Check the definition of
532
533
  * sap.ushell.services.CrossApplicationNavigation=>isNavigationSupported arguments
533
- * @returns {Promise} Promise which will be resolved to object
534
+ * @returns Promise which will be resolved to object
534
535
  */
535
536
  ;
536
537
 
@@ -542,7 +543,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
542
543
  *
543
544
  * @private
544
545
  * @ui5-restricted
545
- * @returns {Promise} Promise which will be resolved to boolean
546
+ * @returns Promise which will be resolved to boolean
546
547
  */
547
548
  ;
548
549
 
@@ -554,7 +555,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
554
555
  *
555
556
  * @private
556
557
  * @ui5-restricted
557
- * @returns {Promise} Promise which will be resolved to boolean
558
+ * @returns Promise which will be resolved to boolean
558
559
  */
559
560
  ;
560
561
 
@@ -564,8 +565,8 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
564
565
  /**
565
566
  * Will call expandCompactHash method of CrossApplicationNavigation service.
566
567
  *
567
- * @param {string} sHashFragment An (internal format) shell hash
568
- * @returns {Promise} A promise the success handler of the resolve promise get an expanded shell hash as first argument
568
+ * @param sHashFragment An (internal format) shell hash
569
+ * @returns A promise the success handler of the resolve promise get an expanded shell hash as first argument
569
570
  * @private
570
571
  * @ui5-restricted
571
572
  */
@@ -579,9 +580,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
579
580
  *
580
581
  * @private
581
582
  * @ui5-restricted
582
- * @param {string} sHash Check the definition of
583
+ * @param sHash Check the definition of
583
584
  * sap.ushell.services.URLParsing=>parseShellHash arguments
584
- * @returns {object}
585
+ * @returns The parsed url
585
586
  */
586
587
  ;
587
588
 
@@ -593,9 +594,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
593
594
  *
594
595
  * @private
595
596
  * @ui5-restricted
596
- * @param {string} sHash Check the definition of
597
+ * @param sHash Check the definition of
597
598
  * sap.ushell.services.URLParsing=>splitHash arguments
598
- * @returns {Promise} Promise which will be resolved to object
599
+ * @returns Promise which will be resolved to object
599
600
  */
600
601
  ;
601
602
 
@@ -607,9 +608,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
607
608
  *
608
609
  * @private
609
610
  * @ui5-restricted
610
- * @param {object} oNewShellHash Check the definition of
611
+ * @param oNewShellHash Check the definition of
611
612
  * sap.ushell.services.URLParsing=>constructShellHash arguments
612
- * @returns {string} Shell Hash string
613
+ * @returns Shell Hash string
613
614
  */
614
615
  ;
615
616
 
@@ -621,7 +622,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
621
622
  *
622
623
  * @private
623
624
  * @ui5-restricted
624
- * @param {boolean} bDirty Check the definition of sap.ushell.Container.setDirtyFlag arguments
625
+ * @param bDirty Check the definition of sap.ushell.Container.setDirtyFlag arguments
625
626
  */
626
627
  ;
627
628
 
@@ -633,7 +634,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
633
634
  *
634
635
  * @private
635
636
  * @ui5-restricted
636
- * @param {Function} fnDirtyStateProvider Check the definition of sap.ushell.Container.registerDirtyStateProvider arguments
637
+ * @param fnDirtyStateProvider Check the definition of sap.ushell.Container.registerDirtyStateProvider arguments
637
638
  */
638
639
  ;
639
640
 
@@ -645,7 +646,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
645
646
  *
646
647
  * @private
647
648
  * @ui5-restricted
648
- * @param {Function} fnDirtyStateProvider Check the definition of sap.ushell.Container.deregisterDirtyStateProvider arguments
649
+ * @param fnDirtyStateProvider Check the definition of sap.ushell.Container.deregisterDirtyStateProvider arguments
649
650
  */
650
651
  ;
651
652
 
@@ -657,7 +658,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
657
658
  *
658
659
  * @private
659
660
  * @ui5-restricted
660
- * @returns {object} Returns renderer object
661
+ * @returns Returns renderer object
661
662
  */
662
663
  ;
663
664
 
@@ -669,7 +670,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
669
670
  *
670
671
  * @private
671
672
  * @ui5-restricted
672
- * @returns {object} Returns User object
673
+ * @returns Returns User object
673
674
  */
674
675
  ;
675
676
 
@@ -681,7 +682,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
681
682
  *
682
683
  * @private
683
684
  * @ui5-restricted
684
- * @returns {boolean} Returns true
685
+ * @returns Returns true
685
686
  */
686
687
  ;
687
688
 
@@ -691,8 +692,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
691
692
  /**
692
693
  * Will call registerNavigationFilter method of shellNavigation.
693
694
  *
694
- * @param {Function} fnNavFilter The filter function to register
695
- * @returns {void}
695
+ * @param fnNavFilter The filter function to register
696
696
  * @private
697
697
  * @ui5-restricted
698
698
  */
@@ -704,8 +704,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
704
704
  /**
705
705
  * Will call unregisterNavigationFilter method of shellNavigation.
706
706
  *
707
- * @param {Function} fnNavFilter The filter function to unregister
708
- * @returns {void}
707
+ * @param fnNavFilter The filter function to unregister
709
708
  * @private
710
709
  * @ui5-restricted
711
710
  */
@@ -718,8 +717,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
718
717
  * Will call setBackNavigation method of ShellUIService
719
718
  * that displays the back button in the shell header.
720
719
  *
721
- * @param {Function} [fnCallBack] A callback function called when the button is clicked in the UI.
722
- * @returns {void}
720
+ * @param [fnCallBack] A callback function called when the button is clicked in the UI.
723
721
  * @private
724
722
  * @ui5-restricted
725
723
  */
@@ -732,8 +730,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
732
730
  * Will call setHierarchy method of ShellUIService
733
731
  * that displays the given hierarchy in the shell header.
734
732
  *
735
- * @param {object[]} [aHierarchyLevels] An array representing hierarchies of the currently displayed app.
736
- * @returns {void}
733
+ * @param [aHierarchyLevels] An array representing hierarchies of the currently displayed app.
737
734
  * @private
738
735
  * @ui5-restricted
739
736
  */
@@ -746,8 +743,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
746
743
  * Will call setTitle method of ShellUIService
747
744
  * that displays the given title in the shell header.
748
745
  *
749
- * @param {string} [sTitle] The new title. The default title is set if this argument is not given.
750
- * @returns {void}
746
+ * @param [sTitle] The new title. The default title is set if this argument is not given.
751
747
  * @private
752
748
  * @ui5-restricted
753
749
  */
@@ -759,7 +755,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
759
755
  /**
760
756
  * Retrieves the currently defined content density.
761
757
  *
762
- * @returns {string} The content density value
758
+ * @returns The content density value
763
759
  */
764
760
  ;
765
761
 
@@ -773,9 +769,9 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
773
769
  *
774
770
  * @private
775
771
  * @ui5-restricted
776
- * @param {string} sSemanticObject Semantic object.
777
- * @param {object} mParameters See #CrossApplicationNavigation#getLinks for description.
778
- * @returns {Promise} Promise which will be resolved with an object containing the intent if it exists.
772
+ * @param sSemanticObject Semantic object.
773
+ * @param mParameters See #CrossApplicationNavigation#getLinks for description.
774
+ * @returns Promise which will be resolved with an object containing the intent if it exists.
779
775
  */
780
776
  ;
781
777
 
@@ -785,7 +781,7 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
785
781
  return new Promise(function (resolve, reject) {
786
782
  // eslint-disable-next-line promise/catch-or-return
787
783
  _this5.crossAppNavService.getPrimaryIntent(sSemanticObject, mParameters).fail(function (oError) {
788
- reject(new Error(oError + " sap.fe.core.services.NavigationServiceFactory.getPrimaryIntent"));
784
+ reject(new Error("".concat(oError, " sap.fe.core.services.NavigationServiceFactory.getPrimaryIntent")));
789
785
  }).then(resolve);
790
786
  });
791
787
  };
@@ -811,8 +807,8 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
811
807
  /**
812
808
  * Creates either a standard or a mock Shell service depending on the configuration.
813
809
  *
814
- * @param {ServiceContext<ShellServicesSettings>} oServiceContext The shellservice context
815
- * @returns {Promise<IShellServices>} A promise for a shell service implementation
810
+ * @param oServiceContext The shellservice context
811
+ * @returns A promise for a shell service implementation
816
812
  * @see ServiceFactory#createInstance
817
813
  */
818
814
  _proto3.createInstance = function createInstance(oServiceContext) {
@@ -833,4 +829,4 @@ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactor
833
829
 
834
830
  return ShellServicesFactory;
835
831
  }, false);
836
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNoZWxsU2VydmljZXNGYWN0b3J5LnRzIl0sIm5hbWVzIjpbIlNoZWxsU2VydmljZU1vY2siLCJpbml0IiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImluc3RhbmNlVHlwZSIsImdldExpbmtzIiwiZ2V0TGlua3NXaXRoQ2FjaGUiLCJ0b0V4dGVybmFsIiwiZ2V0U3RhcnR1cEFwcFN0YXRlIiwiYmFja1RvUHJldmlvdXNBcHAiLCJocmVmRm9yRXh0ZXJuYWwiLCJocmVmRm9yRXh0ZXJuYWxBc3luYyIsIm9BcmdzIiwib0NvbXBvbmVudCIsImdldEFwcFN0YXRlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsImlzSW5pdGlhbE5hdmlnYXRpb24iLCJpc0luaXRpYWxOYXZpZ2F0aW9uQXN5bmMiLCJleHBhbmRDb21wYWN0SGFzaCIsInBhcnNlU2hlbGxIYXNoIiwic3BsaXRIYXNoIiwiY29uc3RydWN0U2hlbGxIYXNoIiwic2V0RGlydHlGbGFnIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiY3JlYXRlUmVuZGVyZXIiLCJnZXRVc2VyIiwiaGFzVVNoZWxsIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsInNldEhpZXJhcmNoeSIsInNldFRpdGxlIiwiZ2V0Q29udGVudERlbnNpdHkiLCJkb2N1bWVudCIsImJvZHkiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImdldFByaW1hcnlJbnRlbnQiLCJTZXJ2aWNlIiwid3JhcEpRdWVyeVByb21pc2UiLCJqcXVlcnlQcm9taXNlIiwicmVqZWN0IiwiZG9uZSIsImZhaWwiLCJTaGVsbFNlcnZpY2VzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwic2NvcGVPYmplY3QiLCJvU2hlbGxDb250YWluZXIiLCJzZXR0aW5ncyIsInNoZWxsQ29udGFpbmVyIiwibGlua3NDYWNoZSIsImZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUiLCJfb0FyZ3MiLCJhQ2FjaGVkU2VtYW50aWNPYmplY3RzIiwiYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cyIsImkiLCJsZW5ndGgiLCJzZW1hbnRpY09iamVjdCIsInB1c2giLCJsaW5rcyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJvbGRBcmdzIiwibmV3QXJncyIsImNhY2hlZExpbmtzIiwicmVzb2x2ZUZuIiwicmVqZWN0Rm4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlUHJvbWlzZSIsImdldFNlcnZpY2VBc3luYyIsIm9VcmxQYXJzaW5nU2VydmljZVByb21pc2UiLCJvU2hlbGxOYXZpZ2F0aW9uU2VydmljZVByb21pc2UiLCJvU2hlbGxVSVNlcnZpY2VQcm9taXNlIiwiZ2V0U2VydmljZSIsImFsbCIsInRoZW4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlIiwib1VybFBhcnNpbmdTZXJ2aWNlIiwib1NoZWxsTmF2aWdhdGlvbiIsIm9TaGVsbFVJU2VydmljZSIsImNyb3NzQXBwTmF2U2VydmljZSIsInVybFBhcnNpbmdTZXJ2aWNlIiwic2hlbGxOYXZpZ2F0aW9uIiwic2hlbGxVSVNlcnZpY2UiLCJjYXRjaCIsIm9FcnJvciIsIkVycm9yIiwib0NhY2hlUmVzdWx0cyIsImFMaW5rcyIsIm9TZW1hbnRpY09iamVjdHNMaW5rcyIsInVuZGVmaW5lZCIsImFzc2lnbiIsImFNZXJnZWRMaW5rcyIsImoiLCJrIiwiZ2V0U2hlbGxDb250YWluZXIiLCJvTmF2QXJndW1lbnRzQXJyIiwiYkFzeW5jIiwic0FwcFN0YXRlS2V5Iiwic0hhc2hGcmFnbWVudCIsInNIYXNoIiwib05ld1NoZWxsSGFzaCIsImJEaXJ0eSIsImZuRGlydHlTdGF0ZVByb3ZpZGVyIiwiZm5OYXZGaWx0ZXIiLCJmbkNhbGxCYWNrIiwiYUhpZXJhcmNoeUxldmVscyIsInNUaXRsZSIsInNTZW1hbnRpY09iamVjdCIsIm1QYXJhbWV0ZXJzIiwiU2hlbGxTZXJ2aWNlc0ZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsIm9TZXJ2aWNlQ29udGV4dCIsInNhcCIsInVzaGVsbCIsIkNvbnRhaW5lciIsIm9TaGVsbFNlcnZpY2UiLCJnZXRTaGVsbFNlcnZpY2VzIiwiU2VydmljZUZhY3RvcnkiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUNNQSxnQjs7Ozs7Ozs7O1dBSUxDLEksR0FBQSxnQkFBTztBQUNOLFdBQUtDLFdBQUwsR0FBbUJDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUFuQjtBQUNBLFdBQUtDLFlBQUwsR0FBb0IsTUFBcEI7QUFDQSxLOztXQUVEQyxRLEdBQUE7QUFBUztBQUFULGVBQTRCO0FBQzNCLGFBQU9ILE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixFQUFoQixDQUFQO0FBQ0EsSzs7V0FFREcsaUIsR0FBQTtBQUFrQjtBQUFsQix3QkFBcUM7QUFDcEMsYUFBT0osT0FBTyxDQUFDQyxPQUFSLENBQWdCLEVBQWhCLENBQVA7QUFDQSxLOztXQUVESSxVLEdBQUE7QUFBVztBQUFYLGlCQUFvRTtBQUNuRTtBQUNBLEs7O1dBRURDLGtCLEdBQUE7QUFBbUI7QUFBbkIseUJBQXNDO0FBQ3JDLGFBQU9OLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUFQO0FBQ0EsSzs7V0FFRE0saUIsR0FBQSw2QkFBb0I7QUFDbkI7QUFDQSxLOztXQUVEQyxlLEdBQUE7QUFBZ0I7QUFBaEIsc0JBQTJFO0FBQzFFLGFBQU8sRUFBUDtBQUNBLEs7O1dBRURDLG9CLEdBQUEsOEJBQXFCQyxLQUFyQixFQUFxQ0MsVUFBckMsRUFBMEQ7QUFDekQsYUFBT1gsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEVBQWhCLENBQVA7QUFDQSxLOztXQUVEVyxXLEdBQUE7QUFBWTtBQUFaLGtCQUEwRDtBQUN6RCxhQUFPWixP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LElBQWVELEdBQUcsQ0FBQ0MsTUFBSixDQUFXQyxTQUFwRTtBQUNBLFVBQU1DLGFBQWEsR0FBR0osZUFBZSxDQUFDaEUsUUFBaEIsQ0FBeUJDLGNBQXpCLEdBQ25CLElBQUlOLGFBQUosQ0FBa0JxRSxlQUFsQixDQURtQixHQUVuQixJQUFJcEgsZ0JBQUosQ0FBcUJvSCxlQUFyQixDQUZIO0FBR0EsYUFBT0ksYUFBYSxDQUFDdEgsV0FBZCxDQUEwQjZFLElBQTFCLENBQStCLFlBQU07QUFDM0M7QUFDQ3FDLFFBQUFBLGVBQWUsQ0FBQ2xFLFdBQWpCLENBQXFDdUUsZ0JBQXJDLEdBQXdEO0FBQUEsaUJBQU1ELGFBQU47QUFBQSxTQUF4RDs7QUFDQSxlQUFPQSxhQUFQO0FBQ0EsT0FKTSxDQUFQO0FBS0EsSzs7O0lBbEJpQ0UsYzs7U0FxQnBCUixvQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBDb250YWluZXIgZnJvbSBcInNhcC91c2hlbGwvc2VydmljZXMvQ29udGFpbmVyXCI7XG5pbXBvcnQgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gZnJvbSBcInNhcC91c2hlbGwvc2VydmljZXMvQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cIjtcbmltcG9ydCBTaGVsbE5hdmlnYXRpb24gZnJvbSBcInNhcC91c2hlbGwvc2VydmljZXMvU2hlbGxOYXZpZ2F0aW9uXCI7XG5pbXBvcnQgVVJMUGFyc2luZyBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9VUkxQYXJzaW5nXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIElTaGVsbFNlcnZpY2VzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTaGVsbFNlcnZpY2VzIHtcblx0aW5pdFByb21pc2U6IFByb21pc2U8SVNoZWxsU2VydmljZXM+O1xuXHRpbnN0YW5jZVR5cGU6IHN0cmluZztcblx0Y3Jvc3NBcHBOYXZTZXJ2aWNlPzogQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb247XG5cdGdldExpbmtzKG9BcmdzOiBvYmplY3QpOiBQcm9taXNlPGFueT47XG5cblx0Z2V0TGlua3NXaXRoQ2FjaGUob0FyZ3M6IG9iamVjdCk6IFByb21pc2U8YW55W10+O1xuXG5cdHRvRXh0ZXJuYWwob05hdkFyZ3VtZW50c0FycjogQXJyYXk8b2JqZWN0Piwgb0NvbXBvbmVudDogb2JqZWN0KTogdm9pZDtcblxuXHRnZXRTdGFydHVwQXBwU3RhdGUob0FyZ3M6IG9iamVjdCk6IFByb21pc2U8YW55PjtcblxuXHRiYWNrVG9QcmV2aW91c0FwcCgpOiB2b2lkO1xuXG5cdGhyZWZGb3JFeHRlcm5hbChvQXJncz86IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCwgYkFzeW5jPzogYm9vbGVhbik6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcblxuXHRocmVmRm9yRXh0ZXJuYWxBc3luYyhvQXJncz86IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCk6IFByb21pc2U8YW55PjtcblxuXHRnZXRBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+O1xuXG5cdGNyZWF0ZUVtcHR5QXBwU3RhdGUob0NvbXBvbmVudDogQ29tcG9uZW50KTogb2JqZWN0O1xuXG5cdGlzTmF2aWdhdGlvblN1cHBvcnRlZChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50Pzogb2JqZWN0KTogUHJvbWlzZTxhbnk+O1xuXG5cdGlzSW5pdGlhbE5hdmlnYXRpb24oKTogYm9vbGVhbjtcblxuXHRpc0luaXRpYWxOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTxhbnk+O1xuXG5cdGV4cGFuZENvbXBhY3RIYXNoKHNIYXNoRnJhZ21lbnQ6IHN0cmluZyk6IGFueTtcblxuXHRwYXJzZVNoZWxsSGFzaChzSGFzaDogc3RyaW5nKTogYW55O1xuXG5cdHNwbGl0SGFzaChzSGFzaDogc3RyaW5nKTogb2JqZWN0O1xuXG5cdGNvbnN0cnVjdFNoZWxsSGFzaChvTmV3U2hlbGxIYXNoOiBvYmplY3QpOiBzdHJpbmc7XG5cblx0c2V0RGlydHlGbGFnKGJEaXJ0eTogYm9vbGVhbik6IHZvaWQ7XG5cblx0cmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKTogdm9pZDtcblxuXHRkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKGZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbik6IHZvaWQ7XG5cblx0Y3JlYXRlUmVuZGVyZXIoKTogb2JqZWN0O1xuXG5cdGdldFVzZXIoKTogYW55O1xuXG5cdGhhc1VTaGVsbCgpOiBib29sZWFuO1xuXG5cdHJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcihmbk5hdkZpbHRlcjogRnVuY3Rpb24pOiB2b2lkO1xuXG5cdHVucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKGZuTmF2RmlsdGVyOiBGdW5jdGlvbik6IHZvaWQ7XG5cblx0c2V0QmFja05hdmlnYXRpb24oZm5DYWxsQmFjaz86IEZ1bmN0aW9uKTogdm9pZDtcblxuXHRzZXRIaWVyYXJjaHkoYUhpZXJhcmNoeUxldmVsczogQXJyYXk8b2JqZWN0Pik6IHZvaWQ7XG5cblx0c2V0VGl0bGUoc1RpdGxlOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldENvbnRlbnREZW5zaXR5KCk6IHN0cmluZztcblxuXHRnZXRQcmltYXJ5SW50ZW50KHNTZW1hbnRpY09iamVjdDogc3RyaW5nLCBtUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8YW55Pjtcbn1cblxuLyoqXG4gKiBNb2NrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTaGVsbFNlcnZpY2UgZm9yIE9wZW5GRVxuICpcbiAqIEBpbXBsZW1lbnRzIHtJU2hlbGxTZXJ2aWNlc31cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNoZWxsU2VydmljZU1vY2sgZXh0ZW5kcyBTZXJ2aWNlPFNoZWxsU2VydmljZXNTZXR0aW5ncz4gaW1wbGVtZW50cyBJU2hlbGxTZXJ2aWNlcyB7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRpbnN0YW5jZVR5cGUhOiBzdHJpbmc7XG5cblx0aW5pdCgpIHtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHRcdHRoaXMuaW5zdGFuY2VUeXBlID0gXCJtb2NrXCI7XG5cdH1cblxuXHRnZXRMaW5rcygvKm9BcmdzOiBvYmplY3QqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0Z2V0TGlua3NXaXRoQ2FjaGUoLypvQXJnczogb2JqZWN0Ki8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdHRvRXh0ZXJuYWwoLypvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50OiBvYmplY3QqLykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGdldFN0YXJ0dXBBcHBTdGF0ZSgvKm9BcmdzOiBvYmplY3QqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdH1cblxuXHRiYWNrVG9QcmV2aW91c0FwcCgpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRocmVmRm9yRXh0ZXJuYWwoLypvQXJncz86IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCwgYkFzeW5jPzogYm9vbGVhbiovKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRocmVmRm9yRXh0ZXJuYWxBc3luYyhvQXJncz86IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0Z2V0QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QsIHNBcHBTdGF0ZUtleTogc3RyaW5nKi8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGNyZWF0ZUVtcHR5QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0aXNOYXZpZ2F0aW9uU3VwcG9ydGVkKC8qb05hdkFyZ3VtZW50c0FycjogQXJyYXk8b2JqZWN0Piwgb0NvbXBvbmVudDogb2JqZWN0Ki8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGlzSW5pdGlhbE5hdmlnYXRpb24oKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aXNJbml0aWFsTmF2aWdhdGlvbkFzeW5jKCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0ZXhwYW5kQ29tcGFjdEhhc2goLypzSGFzaEZyYWdtZW50OiBzdHJpbmcqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0cGFyc2VTaGVsbEhhc2goLypzSGFzaDogc3RyaW5nKi8pIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblxuXHRzcGxpdEhhc2goLypzSGFzaDogc3RyaW5nKi8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGNvbnN0cnVjdFNoZWxsSGFzaCgvKm9OZXdTaGVsbEhhc2g6IG9iamVjdCovKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRzZXREaXJ0eUZsYWcoLypiRGlydHk6IGJvb2xlYW4qLykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKC8qZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKi8pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKC8qZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKi8pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjcmVhdGVSZW5kZXJlcigpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblxuXHRnZXRVc2VyKCkge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdGhhc1VTaGVsbCgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoLypmbk5hdkZpbHRlcjogRnVuY3Rpb24qLyk6IHZvaWQge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHVucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKC8qZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKi8pOiB2b2lkIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzZXRCYWNrTmF2aWdhdGlvbigvKmZuQ2FsbEJhY2s/OiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0c2V0SGllcmFyY2h5KC8qYUhpZXJhcmNoeUxldmVsczogQXJyYXk8b2JqZWN0PiovKTogdm9pZCB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0c2V0VGl0bGUoLypzVGl0bGU6IHN0cmluZyovKTogdm9pZCB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Z2V0Q29udGVudERlbnNpdHkoKTogc3RyaW5nIHtcblx0XHQvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIHNoZWxsIHdlIHByb2JhYmx5IG5lZWQgdG8gbG9vayBhdCB0aGUgY2xhc3NlcyBiZWluZyBkZWZpbmVkIG9uIHRoZSBib2R5XG5cdFx0aWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FwVWlTaXplQ296eVwiKSkge1xuXHRcdFx0cmV0dXJuIFwiY296eVwiO1xuXHRcdH0gZWxzZSBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoXCJzYXBVaVNpemVDb21wYWN0XCIpKSB7XG5cdFx0XHRyZXR1cm4gXCJjb21wYWN0XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0fVxuXG5cdGdldFByaW1hcnlJbnRlbnQoLypzU2VtYW50aWNPYmplY3Q6IHN0cmluZywgbVBhcmFtZXRlcnM/OiBvYmplY3QqLyk6IFByb21pc2U8YW55PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG59XG5cbi8qKlxuICogQHR5cGVkZWYgU2hlbGxTZXJ2aWNlc1NldHRpbmdzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBTaGVsbFNlcnZpY2VzU2V0dGluZ3MgPSB7XG5cdHNoZWxsQ29udGFpbmVyPzogQ29udGFpbmVyO1xufTtcblxuLyoqXG4gKiBXcmFwIGEgSlF1ZXJ5IFByb21pc2Ugd2l0aGluIGEgbmF0aXZlIHtQcm9taXNlfS5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVFxuICogQHBhcmFtIHtqUXVlcnkuUHJvbWlzZTxUPn0ganF1ZXJ5UHJvbWlzZSBUaGUgb3JpZ2luYWwganF1ZXJ5IHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSBBIG5hdGl2ZSBwcm9taXNlIHdyYXBwaW5nIHRoZSBzYW1lIG9iamVjdFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gd3JhcEpRdWVyeVByb21pc2U8VD4oanF1ZXJ5UHJvbWlzZTogalF1ZXJ5LlByb21pc2UpOiBQcm9taXNlPFQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRqcXVlcnlQcm9taXNlLmRvbmUocmVzb2x2ZSBhcyBhbnkpLmZhaWwocmVqZWN0KTtcblx0fSk7XG59XG5cbi8qKlxuICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2hlbGxTZXJ2aWNlc1xuICpcbiAqIEBpbXBsZW1lbnRzIHtJU2hlbGxTZXJ2aWNlc31cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNoZWxsU2VydmljZXMgZXh0ZW5kcyBTZXJ2aWNlPFJlcXVpcmVkPFNoZWxsU2VydmljZXNTZXR0aW5ncz4+IGltcGxlbWVudHMgSVNoZWxsU2VydmljZXMge1xuXHRyZXNvbHZlRm46IGFueTtcblx0cmVqZWN0Rm46IGFueTtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRjcm9zc0FwcE5hdlNlcnZpY2UhOiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbjtcblx0dXJsUGFyc2luZ1NlcnZpY2UhOiBVUkxQYXJzaW5nO1xuXHRzaGVsbE5hdmlnYXRpb24hOiBTaGVsbE5hdmlnYXRpb247XG5cdG9TaGVsbENvbnRhaW5lciE6IENvbnRhaW5lcjtcblx0c2hlbGxVSVNlcnZpY2UhOiBhbnk7XG5cdGluc3RhbmNlVHlwZSE6IHN0cmluZztcblx0bGlua3NDYWNoZSE6IGFueTtcblx0Zm5GaW5kU2VtYW50aWNPYmplY3RzSW5DYWNoZTogYW55O1xuXG5cdGluaXQoKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3QgYXMgYW55O1xuXHRcdHRoaXMub1NoZWxsQ29udGFpbmVyID0gb0NvbnRleHQuc2V0dGluZ3Muc2hlbGxDb250YWluZXI7XG5cdFx0dGhpcy5pbnN0YW5jZVR5cGUgPSBcInJlYWxcIjtcblx0XHR0aGlzLmxpbmtzQ2FjaGUgPSB7fTtcblx0XHR0aGlzLmZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUgPSBmdW5jdGlvbiAob0FyZ3M6IGFueSk6IG9iamVjdCB7XG5cdFx0XHRjb25zdCBfb0FyZ3M6IGFueSA9IG9BcmdzO1xuXHRcdFx0Y29uc3QgYUNhY2hlZFNlbWFudGljT2JqZWN0cyA9IFtdO1xuXHRcdFx0Y29uc3QgYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cyA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBfb0FyZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKCEhX29BcmdzW2ldWzBdICYmICEhX29BcmdzW2ldWzBdLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMubGlua3NDYWNoZVtfb0FyZ3NbaV1bMF0uc2VtYW50aWNPYmplY3RdKSB7XG5cdFx0XHRcdFx0XHRhQ2FjaGVkU2VtYW50aWNPYmplY3RzLnB1c2godGhpcy5saW5rc0NhY2hlW19vQXJnc1tpXVswXS5zZW1hbnRpY09iamVjdF0ubGlua3MpO1xuXHRcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9BcmdzW2ldWzBdLCBcImxpbmtzXCIsIHtcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHRoaXMubGlua3NDYWNoZVtfb0FyZ3NbaV1bMF0uc2VtYW50aWNPYmplY3RdLmxpbmtzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cy5wdXNoKF9vQXJnc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4geyBvbGRBcmdzOiBvQXJncywgbmV3QXJnczogYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cywgY2FjaGVkTGlua3M6IGFDYWNoZWRTZW1hbnRpY09iamVjdHMgfTtcblx0XHR9O1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0aGlzLnJlc29sdmVGbiA9IHJlc29sdmU7XG5cdFx0XHR0aGlzLnJlamVjdEZuID0gcmVqZWN0O1xuXHRcdH0pO1xuXHRcdGNvbnN0IG9Dcm9zc0FwcE5hdlNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cIik7XG5cdFx0Y29uc3Qgb1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSA9IHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFNlcnZpY2VBc3luYyhcIlVSTFBhcnNpbmdcIik7XG5cdFx0Y29uc3Qgb1NoZWxsTmF2aWdhdGlvblNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiU2hlbGxOYXZpZ2F0aW9uXCIpO1xuXHRcdGNvbnN0IG9TaGVsbFVJU2VydmljZVByb21pc2UgPSBvQ29tcG9uZW50LmdldFNlcnZpY2UoXCJTaGVsbFVJU2VydmljZVwiKTtcblx0XHRQcm9taXNlLmFsbChbb0Nyb3NzQXBwTmF2U2VydmljZVByb21pc2UsIG9VcmxQYXJzaW5nU2VydmljZVByb21pc2UsIG9TaGVsbE5hdmlnYXRpb25TZXJ2aWNlUHJvbWlzZSwgb1NoZWxsVUlTZXJ2aWNlUHJvbWlzZV0pXG5cdFx0XHQudGhlbigoW29Dcm9zc0FwcE5hdlNlcnZpY2UsIG9VcmxQYXJzaW5nU2VydmljZSwgb1NoZWxsTmF2aWdhdGlvbiwgb1NoZWxsVUlTZXJ2aWNlXSkgPT4ge1xuXHRcdFx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2U7XG5cdFx0XHRcdHRoaXMudXJsUGFyc2luZ1NlcnZpY2UgPSBvVXJsUGFyc2luZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuc2hlbGxOYXZpZ2F0aW9uID0gb1NoZWxsTmF2aWdhdGlvbjtcblx0XHRcdFx0dGhpcy5zaGVsbFVJU2VydmljZSA9IG9TaGVsbFVJU2VydmljZTtcblx0XHRcdFx0dGhpcy5yZXNvbHZlRm4oKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2godGhpcy5yZWplY3RGbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB0YXJnZXQgbGlua3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QgJiBhY3Rpb25cblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0TGlua3MgbWV0aG9kLiBJbiBjYXNlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvciBhbnkgZXhjZXB0aW9uXG5cdCAqIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9uIGVycm9yIGluIGNvbnNvbGUuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0FyZ3MgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbj0+Z2V0TGlua3MgYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGFyZ2V0IGxpbmtzIGFycmF5XG5cdCAqL1xuXHRnZXRMaW5rcyhvQXJnczogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdFx0dGhpcy5jcm9zc0FwcE5hdlNlcnZpY2Vcblx0XHRcdFx0LmdldExpbmtzKG9BcmdzKVxuXHRcdFx0XHQuZmFpbCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKG9FcnJvciArIFwiIHNhcC5mZS5jb3JlLnNlcnZpY2VzLk5hdmlnYXRpb25TZXJ2aWNlRmFjdG9yeS5nZXRMaW5rc1wiKSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKHJlc29sdmUpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdGFyZ2V0IGxpbmtzIGNvbmZpZ3VyZWQgZm9yIGEgZ2l2ZW4gc2VtYW50aWMgb2JqZWN0ICYgYWN0aW9uIGluIGNhY2hlXG5cdCAqIFdpbGwgcmV0cmlldmUgdGhlIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXG5cdCAqIHNlcnZpY2UgcmVmZXJlbmNlIGNhbGwgdGhlIGdldExpbmtzIG1ldGhvZC4gSW4gY2FzZSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb3IgYW55IGV4Y2VwdGlvblxuXHQgKiBtZXRob2QgdGhyb3dzIGV4Y2VwdGlvbiBlcnJvciBpbiBjb25zb2xlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9BcmdzIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmdldExpbmtzIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHRhcmdldCBsaW5rcyBhcnJheVxuXHQgKi9cblx0Z2V0TGlua3NXaXRoQ2FjaGUob0FyZ3M6IG9iamVjdCk6IFByb21pc2U8YW55W10+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0XHRpZiAoKG9BcmdzIGFzIE9iamVjdFtdKS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmVzb2x2ZShbXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQ2FjaGVSZXN1bHRzID0gdGhpcy5mbkZpbmRTZW1hbnRpY09iamVjdHNJbkNhY2hlKG9BcmdzKTtcblxuXHRcdFx0XHRpZiAob0NhY2hlUmVzdWx0cy5uZXdBcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHJlc29sdmUob0NhY2hlUmVzdWx0cy5jYWNoZWRMaW5rcyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0XHRcdFx0dGhpcy5jcm9zc0FwcE5hdlNlcnZpY2Vcblx0XHRcdFx0XHRcdC5nZXRMaW5rcyhvQ2FjaGVSZXN1bHRzLm5ld0FyZ3MpXG5cdFx0XHRcdFx0XHQuZmFpbCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihvRXJyb3IgKyBcIiBzYXAuZmUuY29yZS5zZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZUZhY3RvcnkuZ2V0TGlua3NXaXRoQ2FjaGVcIikpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKChhTGlua3M6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYUxpbmtzLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9TZW1hbnRpY09iamVjdHNMaW5rczogYW55ID0ge307XG5cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFMaW5rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFMaW5rc1tpXS5sZW5ndGggPiAwICYmIG9DYWNoZVJlc3VsdHMubmV3QXJnc1tpXVswXS5saW5rcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdHNMaW5rc1tvQ2FjaGVSZXN1bHRzLm5ld0FyZ3NbaV1bMF0uc2VtYW50aWNPYmplY3RdID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxpbmtzOiBhTGlua3NbaV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5saW5rc0NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLmxpbmtzQ2FjaGUsIG9TZW1hbnRpY09iamVjdHNMaW5rcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9DYWNoZVJlc3VsdHMuY2FjaGVkTGlua3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhTGlua3MpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFNZXJnZWRMaW5rcyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBqID0gMDtcblxuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgb0NhY2hlUmVzdWx0cy5vbGRBcmdzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoaiA8IGFMaW5rcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFMaW5rc1tqXS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NhY2hlUmVzdWx0cy5vbGRBcmdzW2tdWzBdLnNlbWFudGljT2JqZWN0ID09PSBvQ2FjaGVSZXN1bHRzLm5ld0FyZ3Nbal1bMF0uc2VtYW50aWNPYmplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2goYUxpbmtzW2pdKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2gob0NhY2hlUmVzdWx0cy5vbGRBcmdzW2tdWzBdLmxpbmtzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2gob0NhY2hlUmVzdWx0cy5vbGRBcmdzW2tdWzBdLmxpbmtzKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhTWVyZ2VkTGlua3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgcmV0cmlldmUgdGhlIFNoZWxsQ29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogc2FwLnVzaGVsbC5jb250YWluZXJcblx0ICogQHJldHVybnMge29iamVjdH0gT2JqZWN0IHdpdGggcHJlZGVmaW5lZCBzaGVsbENvbnRhaW5lciBtZXRob2RzXG5cdCAqL1xuXHRnZXRTaGVsbENvbnRhaW5lcigpIHtcblx0XHRyZXR1cm4gdGhpcy5vU2hlbGxDb250YWluZXI7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHRvRXh0ZXJuYWwgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBOYXZpZ2F0aW9uIEFyZ3VtZW50cyBhbmQgb0NvbXBvbmVudC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IG9OYXZBcmd1bWVudHNBcnIgQW5kXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29tcG9uZW50IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PnRvRXh0ZXJuYWwgYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKi9cblx0dG9FeHRlcm5hbChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50OiBvYmplY3QpOiB2b2lkIHtcblx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZS50b0V4dGVybmFsKG9OYXZBcmd1bWVudHNBcnIsIG9Db21wb25lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdGFyZ2V0IHN0YXJ0dXBBcHBTdGF0ZVxuXHQgKiBXaWxsIGNoZWNrIHRoZSBleGlzdGFuY2Ugb2YgdGhlIFNoZWxsQ29udGFpbmVyIGFuZCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0U3RhcnR1cEFwcFN0YXRlIG1ldGhvZC4gSW4gY2FzZSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb3IgYW55IGV4Y2VwdGlvblxuXHQgKiBtZXRob2QgdGhyb3dzIGV4Y2VwdGlvbiBlcnJvciBpbiBjb25zb2xlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9BcmdzIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmdldFN0YXJ0dXBBcHBTdGF0ZSBhcmd1bWVudHNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBPYmplY3Rcblx0ICovXG5cdGdldFN0YXJ0dXBBcHBTdGF0ZShvQXJnczogQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdC8vIEpRdWVyeSBQcm9taXNlIGJlaGF2ZXMgZGlmZmVyZW50bHlcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdFx0KHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlIGFzIGFueSlcblx0XHRcdFx0LmdldFN0YXJ0dXBBcHBTdGF0ZShvQXJncylcblx0XHRcdFx0LmZhaWwoKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihvRXJyb3IgKyBcIiBzYXAuZmUuY29yZS5zZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZUZhY3RvcnkuZ2V0U3RhcnR1cEFwcFN0YXRlXCIpKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4ocmVzb2x2ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGJhY2tUb1ByZXZpb3VzQXBwIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRiYWNrVG9QcmV2aW91c0FwcCgpIHtcblx0XHRyZXR1cm4gdGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuYmFja1RvUHJldmlvdXNBcHAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgaHJlZkZvckV4dGVybmFsIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9BcmdzIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHtib29sZWFufSBiQXN5bmMgV2hldGhlciB0aGlzIGNhbGwgc2hvdWxkIGJlIGFzeW5jIG9yIG5vdFxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5ocmVmRm9yRXh0ZXJuYWwgYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBzdHJpbmdcblx0ICovXG5cdGhyZWZGb3JFeHRlcm5hbChvQXJnczogb2JqZWN0LCBvQ29tcG9uZW50Pzogb2JqZWN0LCBiQXN5bmM/OiBib29sZWFuKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlLmhyZWZGb3JFeHRlcm5hbChvQXJncywgb0NvbXBvbmVudCBhcyBvYmplY3QsICEhYkFzeW5jKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgaHJlZkZvckV4dGVybmFsIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9BcmdzIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbj0+aHJlZkZvckV4dGVybmFsQXN5bmMgYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBzdHJpbmdcblx0ICovXG5cdGhyZWZGb3JFeHRlcm5hbEFzeW5jKG9BcmdzOiBvYmplY3QsIG9Db21wb25lbnQ/OiBvYmplY3QpIHtcblx0XHRyZXR1cm4gdGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuaHJlZkZvckV4dGVybmFsQXN5bmMob0FyZ3MsIG9Db21wb25lbnQgYXMgb2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZ2V0QXBwU3RhdGUgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBvQ29tcG9uZW50IGFuZCBvQXBwU3RhdGVLZXkuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbXBvbmVudFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FwcFN0YXRlS2V5IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmdldEFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIG9iamVjdFxuXHQgKi9cblx0Z2V0QXBwU3RhdGUob0NvbXBvbmVudDogQ29tcG9uZW50LCBzQXBwU3RhdGVLZXk6IHN0cmluZykge1xuXHRcdHJldHVybiB3cmFwSlF1ZXJ5UHJvbWlzZSgodGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UgYXMgYW55KS5nZXRBcHBTdGF0ZShvQ29tcG9uZW50LCBzQXBwU3RhdGVLZXkpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgY3JlYXRlRW1wdHlBcHBTdGF0ZSBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZSB3aXRoIG9Db21wb25lbnQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbXBvbmVudCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5jcmVhdGVFbXB0eUFwcFN0YXRlIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIG9iamVjdFxuXHQgKi9cblx0Y3JlYXRlRW1wdHlBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gKHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlIGFzIGFueSkuY3JlYXRlRW1wdHlBcHBTdGF0ZShvQ29tcG9uZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlIHdpdGggTmF2aWdhdGlvbiBBcmd1bWVudHMgYW5kIG9Db21wb25lbnQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBvTmF2QXJndW1lbnRzQXJyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29tcG9uZW50IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmlzTmF2aWdhdGlvblN1cHBvcnRlZCBhcmd1bWVudHNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBvYmplY3Rcblx0ICovXG5cdGlzTmF2aWdhdGlvblN1cHBvcnRlZChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50OiBvYmplY3QpIHtcblx0XHRyZXR1cm4gd3JhcEpRdWVyeVByb21pc2UodGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKG9OYXZBcmd1bWVudHNBcnIsIG9Db21wb25lbnQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgaXNJbml0aWFsTmF2aWdhdGlvbiBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gYm9vbGVhblxuXHQgKi9cblx0aXNJbml0aWFsTmF2aWdhdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuaXNJbml0aWFsTmF2aWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBpc0luaXRpYWxOYXZpZ2F0aW9uQXN5bmMgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIGJvb2xlYW5cblx0ICovXG5cdGlzSW5pdGlhbE5hdmlnYXRpb25Bc3luYygpIHtcblx0XHRyZXR1cm4gdGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuaXNJbml0aWFsTmF2aWdhdGlvbkFzeW5jKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGV4cGFuZENvbXBhY3RIYXNoIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0hhc2hGcmFnbWVudCBBbiAoaW50ZXJuYWwgZm9ybWF0KSBzaGVsbCBoYXNoXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhlIHN1Y2Nlc3MgaGFuZGxlciBvZiB0aGUgcmVzb2x2ZSBwcm9taXNlIGdldCBhbiBleHBhbmRlZCBzaGVsbCBoYXNoIGFzIGZpcnN0IGFyZ3VtZW50XG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0ZXhwYW5kQ29tcGFjdEhhc2goc0hhc2hGcmFnbWVudDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlLmV4cGFuZENvbXBhY3RIYXNoKHNIYXNoRnJhZ21lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBwYXJzZVNoZWxsSGFzaCBtZXRob2Qgb2YgVVJMUGFyc2luZyBzZXJ2aWNlIHdpdGggZ2l2ZW4gc0hhc2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0hhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5wYXJzZVNoZWxsSGFzaCBhcmd1bWVudHNcblx0ICogQHJldHVybnMge29iamVjdH1cblx0ICovXG5cdHBhcnNlU2hlbGxIYXNoKHNIYXNoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy51cmxQYXJzaW5nU2VydmljZS5wYXJzZVNoZWxsSGFzaChzSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHNwbGl0SGFzaCBtZXRob2Qgb2YgVVJMUGFyc2luZyBzZXJ2aWNlIHdpdGggZ2l2ZW4gc0hhc2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0hhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5zcGxpdEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gb2JqZWN0XG5cdCAqL1xuXHRzcGxpdEhhc2goc0hhc2g6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnVybFBhcnNpbmdTZXJ2aWNlLnNwbGl0SGFzaChzSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGNvbnN0cnVjdFNoZWxsSGFzaCBtZXRob2Qgb2YgVVJMUGFyc2luZyBzZXJ2aWNlIHdpdGggZ2l2ZW4gc0hhc2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05ld1NoZWxsSGFzaCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLlVSTFBhcnNpbmc9PmNvbnN0cnVjdFNoZWxsSGFzaCBhcmd1bWVudHNcblx0ICogQHJldHVybnMge3N0cmluZ30gU2hlbGwgSGFzaCBzdHJpbmdcblx0ICovXG5cdGNvbnN0cnVjdFNoZWxsSGFzaChvTmV3U2hlbGxIYXNoOiBvYmplY3QpIHtcblx0XHRyZXR1cm4gdGhpcy51cmxQYXJzaW5nU2VydmljZS5jb25zdHJ1Y3RTaGVsbEhhc2gob05ld1NoZWxsSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHNldERpcnR5RmxhZyBtZXRob2Qgd2l0aCBnaXZlbiBkaXJ0eSBzdGF0ZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYkRpcnR5IENoZWNrIHRoZSBkZWZpbml0aW9uIG9mIHNhcC51c2hlbGwuQ29udGFpbmVyLnNldERpcnR5RmxhZyBhcmd1bWVudHNcblx0ICovXG5cdHNldERpcnR5RmxhZyhiRGlydHk6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm9TaGVsbENvbnRhaW5lci5zZXREaXJ0eUZsYWcoYkRpcnR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIgbWV0aG9kIHdpdGggZ2l2ZW4gZGlydHkgc3RhdGUgcHJvdmlkZXIgY2FsbGJhY2sgbWV0aG9kLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5EaXJ0eVN0YXRlUHJvdmlkZXIgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Ygc2FwLnVzaGVsbC5Db250YWluZXIucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIgYXJndW1lbnRzXG5cdCAqL1xuXHRyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihmbkRpcnR5U3RhdGVQcm92aWRlcjogRnVuY3Rpb24pIHtcblx0XHR0aGlzLm9TaGVsbENvbnRhaW5lci5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihmbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIgbWV0aG9kIHdpdGggZ2l2ZW4gZGlydHkgc3RhdGUgcHJvdmlkZXIgY2FsbGJhY2sgbWV0aG9kLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5EaXJ0eVN0YXRlUHJvdmlkZXIgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Ygc2FwLnVzaGVsbC5Db250YWluZXIuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciBhcmd1bWVudHNcblx0ICovXG5cdGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKSB7XG5cdFx0dGhpcy5vU2hlbGxDb250YWluZXIuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihmbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGNyZWF0ZVJlbmRlcmVyIG1ldGhvZCBvZiB1c2hlbGwgY29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gUmV0dXJucyByZW5kZXJlciBvYmplY3Rcblx0ICovXG5cdGNyZWF0ZVJlbmRlcmVyKCkge1xuXHRcdHJldHVybiB0aGlzLm9TaGVsbENvbnRhaW5lci5jcmVhdGVSZW5kZXJlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBnZXRVc2VyIG1ldGhvZCBvZiB1c2hlbGwgY29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gUmV0dXJucyBVc2VyIG9iamVjdFxuXHQgKi9cblx0Z2V0VXNlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMub1NoZWxsQ29udGFpbmVyIGFzIGFueSkuZ2V0VXNlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2hlY2sgaWYgdXNoZWxsIGNvbnRhaW5lciBpcyBhdmFpbGFibGUgb3Igbm90LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZVxuXHQgKi9cblx0aGFzVVNoZWxsKCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCByZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIgbWV0aG9kIG9mIHNoZWxsTmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5OYXZGaWx0ZXIgVGhlIGZpbHRlciBmdW5jdGlvbiB0byByZWdpc3RlclxuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKSB7XG5cdFx0KHRoaXMuc2hlbGxOYXZpZ2F0aW9uIGFzIGFueSkucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKGZuTmF2RmlsdGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgdW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIgbWV0aG9kIG9mIHNoZWxsTmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5OYXZGaWx0ZXIgVGhlIGZpbHRlciBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdHVucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKGZuTmF2RmlsdGVyOiBGdW5jdGlvbikge1xuXHRcdCh0aGlzLnNoZWxsTmF2aWdhdGlvbiBhcyBhbnkpLnVucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKGZuTmF2RmlsdGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgc2V0QmFja05hdmlnYXRpb24gbWV0aG9kIG9mIFNoZWxsVUlTZXJ2aWNlXG5cdCAqIHRoYXQgZGlzcGxheXMgdGhlIGJhY2sgYnV0dG9uIGluIHRoZSBzaGVsbCBoZWFkZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbkNhbGxCYWNrXSBBIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCBpbiB0aGUgVUkuXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdHNldEJhY2tOYXZpZ2F0aW9uKGZuQ2FsbEJhY2s/OiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdHRoaXMuc2hlbGxVSVNlcnZpY2Uuc2V0QmFja05hdmlnYXRpb24oZm5DYWxsQmFjayk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHNldEhpZXJhcmNoeSBtZXRob2Qgb2YgU2hlbGxVSVNlcnZpY2Vcblx0ICogdGhhdCBkaXNwbGF5cyB0aGUgZ2l2ZW4gaGllcmFyY2h5IGluIHRoZSBzaGVsbCBoZWFkZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IFthSGllcmFyY2h5TGV2ZWxzXSBBbiBhcnJheSByZXByZXNlbnRpbmcgaGllcmFyY2hpZXMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgYXBwLlxuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRzZXRIaWVyYXJjaHkoYUhpZXJhcmNoeUxldmVsczogQXJyYXk8b2JqZWN0Pik6IHZvaWQge1xuXHRcdHRoaXMuc2hlbGxVSVNlcnZpY2Uuc2V0SGllcmFyY2h5KGFIaWVyYXJjaHlMZXZlbHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzZXRUaXRsZSBtZXRob2Qgb2YgU2hlbGxVSVNlcnZpY2Vcblx0ICogdGhhdCBkaXNwbGF5cyB0aGUgZ2l2ZW4gdGl0bGUgaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzVGl0bGVdIFRoZSBuZXcgdGl0bGUuIFRoZSBkZWZhdWx0IHRpdGxlIGlzIHNldCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBnaXZlbi5cblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0c2V0VGl0bGUoc1RpdGxlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNoZWxsVUlTZXJ2aWNlLnNldFRpdGxlKHNUaXRsZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjdXJyZW50bHkgZGVmaW5lZCBjb250ZW50IGRlbnNpdHkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb250ZW50IGRlbnNpdHkgdmFsdWVcblx0ICovXG5cdGdldENvbnRlbnREZW5zaXR5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICgodGhpcy5vU2hlbGxDb250YWluZXIgYXMgYW55KS5nZXRVc2VyKCkgYXMgYW55KS5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZvciBhIGdpdmVuIHNlbWFudGljIG9iamVjdCwgdGhpcyBtZXRob2QgY29uc2lkZXJzIGFsbCBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VtYW50aWMgb2JqZWN0IGFuZFxuXHQgKiByZXR1cm5zIHRoZSBvbmUgdGFnZ2VkIGFzIGEgXCJwcmltYXJ5QWN0aW9uXCIuIElmIG5vIGluYm91bmQgdGFnZ2VkIGFzIFwicHJpbWFyeUFjdGlvblwiIGV4aXN0cywgdGhlbiBpdCByZXR1cm5zXG5cdCAqIHRoZSBpbnRlbnQgb2YgdGhlIGZpcnN0IGluYm91bmQgKGFmdGVyIHNvcnRpbmcgaGFzIGJlZW4gYXBwbGllZCkgbWF0Y2hpbmcgdGhlIGFjdGlvbiBcImRpc3BsYXlGYWN0U2hlZXRcIi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzU2VtYW50aWNPYmplY3QgU2VtYW50aWMgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgU2VlICNDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiNnZXRMaW5rcyBmb3IgZGVzY3JpcHRpb24uXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgaW50ZW50IGlmIGl0IGV4aXN0cy5cblx0ICovXG5cdGdldFByaW1hcnlJbnRlbnQoc1NlbWFudGljT2JqZWN0OiBzdHJpbmcsIG1QYXJhbWV0ZXJzPzogb2JqZWN0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZVxuXHRcdFx0XHQuZ2V0UHJpbWFyeUludGVudChzU2VtYW50aWNPYmplY3QsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHQuZmFpbCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKG9FcnJvciArIFwiIHNhcC5mZS5jb3JlLnNlcnZpY2VzLk5hdmlnYXRpb25TZXJ2aWNlRmFjdG9yeS5nZXRQcmltYXJ5SW50ZW50XCIpKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4ocmVzb2x2ZSk7XG5cdFx0fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIEZhY3RvcnkgZm9yIHRoZSBTaGVsbFNlcnZpY2VzXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU2hlbGxTZXJ2aWNlc0ZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+IHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgZWl0aGVyIGEgc3RhbmRhcmQgb3IgYSBtb2NrIFNoZWxsIHNlcnZpY2UgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1NlcnZpY2VDb250ZXh0PFNoZWxsU2VydmljZXNTZXR0aW5ncz59IG9TZXJ2aWNlQ29udGV4dCBUaGUgc2hlbGxzZXJ2aWNlIGNvbnRleHRcblx0ICogQHJldHVybnMge1Byb21pc2U8SVNoZWxsU2VydmljZXM+fSBBIHByb21pc2UgZm9yIGEgc2hlbGwgc2VydmljZSBpbXBsZW1lbnRhdGlvblxuXHQgKiBAc2VlIFNlcnZpY2VGYWN0b3J5I2NyZWF0ZUluc3RhbmNlXG5cdCAqL1xuXHRjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNoZWxsU2VydmljZXNTZXR0aW5ncz4pOiBQcm9taXNlPElTaGVsbFNlcnZpY2VzPiB7XG5cdFx0b1NlcnZpY2VDb250ZXh0LnNldHRpbmdzLnNoZWxsQ29udGFpbmVyID0gc2FwLnVzaGVsbCAmJiAoc2FwLnVzaGVsbC5Db250YWluZXIgYXMgQ29udGFpbmVyKTtcblx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlID0gb1NlcnZpY2VDb250ZXh0LnNldHRpbmdzLnNoZWxsQ29udGFpbmVyXG5cdFx0XHQ/IG5ldyBTaGVsbFNlcnZpY2VzKG9TZXJ2aWNlQ29udGV4dCBhcyBTZXJ2aWNlQ29udGV4dDxSZXF1aXJlZDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+Pilcblx0XHRcdDogbmV3IFNoZWxsU2VydmljZU1vY2sob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gb1NoZWxsU2VydmljZS5pbml0UHJvbWlzZS50aGVuKCgpID0+IHtcblx0XHRcdC8vIEVucmljaCB0aGUgYXBwQ29tcG9uZW50IHdpdGggdGhpcyBtZXRob2Rcblx0XHRcdChvU2VydmljZUNvbnRleHQuc2NvcGVPYmplY3QgYXMgYW55KS5nZXRTaGVsbFNlcnZpY2VzID0gKCkgPT4gb1NoZWxsU2VydmljZTtcblx0XHRcdHJldHVybiBvU2hlbGxTZXJ2aWNlO1xuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNoZWxsU2VydmljZXNGYWN0b3J5O1xuIl19
832
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNoZWxsU2VydmljZXNGYWN0b3J5LnRzIl0sIm5hbWVzIjpbIlNoZWxsU2VydmljZU1vY2siLCJpbml0IiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImluc3RhbmNlVHlwZSIsImdldExpbmtzIiwiZ2V0TGlua3NXaXRoQ2FjaGUiLCJ0b0V4dGVybmFsIiwiZ2V0U3RhcnR1cEFwcFN0YXRlIiwiYmFja1RvUHJldmlvdXNBcHAiLCJocmVmRm9yRXh0ZXJuYWwiLCJocmVmRm9yRXh0ZXJuYWxBc3luYyIsImdldEFwcFN0YXRlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsImlzSW5pdGlhbE5hdmlnYXRpb24iLCJpc0luaXRpYWxOYXZpZ2F0aW9uQXN5bmMiLCJleHBhbmRDb21wYWN0SGFzaCIsInBhcnNlU2hlbGxIYXNoIiwic3BsaXRIYXNoIiwiY29uc3RydWN0U2hlbGxIYXNoIiwic2V0RGlydHlGbGFnIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiY3JlYXRlUmVuZGVyZXIiLCJnZXRVc2VyIiwiaGFzVVNoZWxsIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsInNldEhpZXJhcmNoeSIsInNldFRpdGxlIiwiZ2V0Q29udGVudERlbnNpdHkiLCJkb2N1bWVudCIsImJvZHkiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImdldFByaW1hcnlJbnRlbnQiLCJTZXJ2aWNlIiwid3JhcEpRdWVyeVByb21pc2UiLCJqcXVlcnlQcm9taXNlIiwicmVqZWN0IiwiZG9uZSIsImZhaWwiLCJTaGVsbFNlcnZpY2VzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib1NoZWxsQ29udGFpbmVyIiwic2V0dGluZ3MiLCJzaGVsbENvbnRhaW5lciIsImxpbmtzQ2FjaGUiLCJmbkZpbmRTZW1hbnRpY09iamVjdHNJbkNhY2hlIiwib0FyZ3MiLCJfb0FyZ3MiLCJhQ2FjaGVkU2VtYW50aWNPYmplY3RzIiwiYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cyIsImkiLCJsZW5ndGgiLCJzZW1hbnRpY09iamVjdCIsInB1c2giLCJsaW5rcyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJvbGRBcmdzIiwibmV3QXJncyIsImNhY2hlZExpbmtzIiwicmVzb2x2ZUZuIiwicmVqZWN0Rm4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlUHJvbWlzZSIsImdldFNlcnZpY2VBc3luYyIsIm9VcmxQYXJzaW5nU2VydmljZVByb21pc2UiLCJvU2hlbGxOYXZpZ2F0aW9uU2VydmljZVByb21pc2UiLCJvU2hlbGxVSVNlcnZpY2VQcm9taXNlIiwiZ2V0U2VydmljZSIsImFsbCIsInRoZW4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlIiwib1VybFBhcnNpbmdTZXJ2aWNlIiwib1NoZWxsTmF2aWdhdGlvbiIsIm9TaGVsbFVJU2VydmljZSIsImNyb3NzQXBwTmF2U2VydmljZSIsInVybFBhcnNpbmdTZXJ2aWNlIiwic2hlbGxOYXZpZ2F0aW9uIiwic2hlbGxVSVNlcnZpY2UiLCJjYXRjaCIsIm9FcnJvciIsIkVycm9yIiwib0NhY2hlUmVzdWx0cyIsImFMaW5rcyIsIm9TZW1hbnRpY09iamVjdHNMaW5rcyIsInVuZGVmaW5lZCIsImFzc2lnbiIsImFNZXJnZWRMaW5rcyIsImoiLCJrIiwiZ2V0U2hlbGxDb250YWluZXIiLCJvTmF2QXJndW1lbnRzQXJyIiwiYkFzeW5jIiwic0FwcFN0YXRlS2V5Iiwic0hhc2hGcmFnbWVudCIsInNIYXNoIiwib05ld1NoZWxsSGFzaCIsImJEaXJ0eSIsImZuRGlydHlTdGF0ZVByb3ZpZGVyIiwiZm5OYXZGaWx0ZXIiLCJmbkNhbGxCYWNrIiwiYUhpZXJhcmNoeUxldmVscyIsInNUaXRsZSIsInNTZW1hbnRpY09iamVjdCIsIm1QYXJhbWV0ZXJzIiwiU2hlbGxTZXJ2aWNlc0ZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsIm9TZXJ2aWNlQ29udGV4dCIsInNhcCIsInVzaGVsbCIsIkNvbnRhaW5lciIsIm9TaGVsbFNlcnZpY2UiLCJnZXRTaGVsbFNlcnZpY2VzIiwiU2VydmljZUZhY3RvcnkiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUNNQSxnQjs7Ozs7Ozs7O1dBSUxDLEksR0FBQSxnQkFBTztBQUNOLFdBQUtDLFdBQUwsR0FBbUJDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUFuQjtBQUNBLFdBQUtDLFlBQUwsR0FBb0IsTUFBcEI7QUFDQSxLOztXQUVEQyxRLEdBQUE7QUFBUztBQUFULGVBQTRCO0FBQzNCLGFBQU9ILE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixFQUFoQixDQUFQO0FBQ0EsSzs7V0FFREcsaUIsR0FBQTtBQUFrQjtBQUFsQix3QkFBcUM7QUFDcEMsYUFBT0osT0FBTyxDQUFDQyxPQUFSLENBQWdCLEVBQWhCLENBQVA7QUFDQSxLOztXQUVESSxVLEdBQUE7QUFBVztBQUFYLGlCQUFvRTtBQUNuRTtBQUNBLEs7O1dBRURDLGtCLEdBQUE7QUFBbUI7QUFBbkIseUJBQXNDO0FBQ3JDLGFBQU9OLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUFQO0FBQ0EsSzs7V0FFRE0saUIsR0FBQSw2QkFBb0I7QUFDbkI7QUFDQSxLOztXQUVEQyxlLEdBQUE7QUFBZ0I7QUFBaEIsc0JBQTJFO0FBQzFFLGFBQU8sRUFBUDtBQUNBLEs7O1dBRURDLG9CLEdBQUE7QUFBcUI7QUFBckIsMkJBQThEO0FBQzdELGFBQU9ULE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixFQUFoQixDQUFQO0FBQ0EsSzs7V0FFRFMsVyxHQUFBO0FBQVk7QUFBWixrQkFBMEQ7QUFDekQsYUFBT1YsT0FBTyxDQUFDQyxPQUFS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SUFBSVAsYUFBSixDQUFrQnVFLGVBQWxCLENBRG1CLEdBRW5CLElBQUlwSCxnQkFBSixDQUFxQm9ILGVBQXJCLENBRkg7QUFHQSxhQUFPSSxhQUFhLENBQUN0SCxXQUFkLENBQTBCNkUsSUFBMUIsQ0FBK0IsWUFBTTtBQUMzQztBQUNDcUMsUUFBQUEsZUFBZSxDQUFDbkUsV0FBakIsQ0FBcUN3RSxnQkFBckMsR0FBd0Q7QUFBQSxpQkFBTUQsYUFBTjtBQUFBLFNBQXhEOztBQUNBLGVBQU9BLGFBQVA7QUFDQSxPQUpNLENBQVA7QUFLQSxLOzs7SUFsQmlDRSxjOztTQXFCcEJSLG9CIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBDb250YWluZXIgZnJvbSBcInNhcC91c2hlbGwvc2VydmljZXMvQ29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvblwiO1xuaW1wb3J0IHR5cGUgU2hlbGxOYXZpZ2F0aW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL1NoZWxsTmF2aWdhdGlvblwiO1xuaW1wb3J0IHR5cGUgVVJMUGFyc2luZyBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9VUkxQYXJzaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgSVNoZWxsU2VydmljZXNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNoZWxsU2VydmljZXMge1xuXHRpbml0UHJvbWlzZTogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz47XG5cdGluc3RhbmNlVHlwZTogc3RyaW5nO1xuXHRjcm9zc0FwcE5hdlNlcnZpY2U/OiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbjtcblx0Z2V0TGlua3Mob0FyZ3M6IG9iamVjdCk6IFByb21pc2U8YW55PjtcblxuXHRnZXRMaW5rc1dpdGhDYWNoZShvQXJnczogb2JqZWN0KTogUHJvbWlzZTxhbnlbXT47XG5cblx0dG9FeHRlcm5hbChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50OiBvYmplY3QpOiB2b2lkO1xuXG5cdGdldFN0YXJ0dXBBcHBTdGF0ZShvQXJnczogb2JqZWN0KTogUHJvbWlzZTxhbnk+O1xuXG5cdGJhY2tUb1ByZXZpb3VzQXBwKCk6IHZvaWQ7XG5cblx0aHJlZkZvckV4dGVybmFsKG9BcmdzPzogb2JqZWN0LCBvQ29tcG9uZW50Pzogb2JqZWN0LCBiQXN5bmM/OiBib29sZWFuKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuXG5cdGhyZWZGb3JFeHRlcm5hbEFzeW5jKG9BcmdzPzogb2JqZWN0LCBvQ29tcG9uZW50Pzogb2JqZWN0KTogUHJvbWlzZTxhbnk+O1xuXG5cdGdldEFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCwgc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT47XG5cblx0Y3JlYXRlRW1wdHlBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQpOiBvYmplY3Q7XG5cblx0aXNOYXZpZ2F0aW9uU3VwcG9ydGVkKG9OYXZBcmd1bWVudHNBcnI6IEFycmF5PG9iamVjdD4sIG9Db21wb25lbnQ/OiBvYmplY3QpOiBQcm9taXNlPGFueT47XG5cblx0aXNJbml0aWFsTmF2aWdhdGlvbigpOiBib29sZWFuO1xuXG5cdGlzSW5pdGlhbE5hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPGFueT47XG5cblx0ZXhwYW5kQ29tcGFjdEhhc2goc0hhc2hGcmFnbWVudDogc3RyaW5nKTogYW55O1xuXG5cdHBhcnNlU2hlbGxIYXNoKHNIYXNoOiBzdHJpbmcpOiBhbnk7XG5cblx0c3BsaXRIYXNoKHNIYXNoOiBzdHJpbmcpOiBvYmplY3Q7XG5cblx0Y29uc3RydWN0U2hlbGxIYXNoKG9OZXdTaGVsbEhhc2g6IG9iamVjdCk6IHN0cmluZztcblxuXHRzZXREaXJ0eUZsYWcoYkRpcnR5OiBib29sZWFuKTogdm9pZDtcblxuXHRyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihmbkRpcnR5U3RhdGVQcm92aWRlcjogRnVuY3Rpb24pOiB2b2lkO1xuXG5cdGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKTogdm9pZDtcblxuXHRjcmVhdGVSZW5kZXJlcigpOiBvYmplY3Q7XG5cblx0Z2V0VXNlcigpOiBhbnk7XG5cblx0aGFzVVNoZWxsKCk6IGJvb2xlYW47XG5cblx0cmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKGZuTmF2RmlsdGVyOiBGdW5jdGlvbik6IHZvaWQ7XG5cblx0dW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKTogdm9pZDtcblxuXHRzZXRCYWNrTmF2aWdhdGlvbihmbkNhbGxCYWNrPzogRnVuY3Rpb24pOiB2b2lkO1xuXG5cdHNldEhpZXJhcmNoeShhSGllcmFyY2h5TGV2ZWxzOiBBcnJheTxvYmplY3Q+KTogdm9pZDtcblxuXHRzZXRUaXRsZShzVGl0bGU6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0Q29udGVudERlbnNpdHkoKTogc3RyaW5nO1xuXG5cdGdldFByaW1hcnlJbnRlbnQoc1NlbWFudGljT2JqZWN0OiBzdHJpbmcsIG1QYXJhbWV0ZXJzPzogb2JqZWN0KTogUHJvbWlzZTxhbnk+O1xufVxuXG4vKipcbiAqIE1vY2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNoZWxsU2VydmljZSBmb3IgT3BlbkZFXG4gKlxuICogQGltcGxlbWVudHMge0lTaGVsbFNlcnZpY2VzfVxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU2hlbGxTZXJ2aWNlTW9jayBleHRlbmRzIFNlcnZpY2U8U2hlbGxTZXJ2aWNlc1NldHRpbmdzPiBpbXBsZW1lbnRzIElTaGVsbFNlcnZpY2VzIHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdGluc3RhbmNlVHlwZSE6IHN0cmluZztcblxuXHRpbml0KCkge1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdFx0dGhpcy5pbnN0YW5jZVR5cGUgPSBcIm1vY2tcIjtcblx0fVxuXG5cdGdldExpbmtzKC8qb0FyZ3M6IG9iamVjdCovKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHRnZXRMaW5rc1dpdGhDYWNoZSgvKm9BcmdzOiBvYmplY3QqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0dG9FeHRlcm5hbCgvKm9OYXZBcmd1bWVudHNBcnI6IEFycmF5PG9iamVjdD4sIG9Db21wb25lbnQ6IG9iamVjdCovKSB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0Z2V0U3RhcnR1cEFwcFN0YXRlKC8qb0FyZ3M6IG9iamVjdCovKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0fVxuXG5cdGJhY2tUb1ByZXZpb3VzQXBwKCkge1xuXHRcdC8qIERvIE5vdGhpbmcgKi9cblx0fVxuXG5cdGhyZWZGb3JFeHRlcm5hbCgvKm9BcmdzPzogb2JqZWN0LCBvQ29tcG9uZW50Pzogb2JqZWN0LCBiQXN5bmM/OiBib29sZWFuKi8pIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdGhyZWZGb3JFeHRlcm5hbEFzeW5jKC8qb0FyZ3M/OiBvYmplY3QsIG9Db21wb25lbnQ/OiBvYmplY3QqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0Z2V0QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QsIHNBcHBTdGF0ZUtleTogc3RyaW5nKi8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGNyZWF0ZUVtcHR5QXBwU3RhdGUoLypvQ29tcG9uZW50OiBvYmplY3QqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0aXNOYXZpZ2F0aW9uU3VwcG9ydGVkKC8qb05hdkFyZ3VtZW50c0FycjogQXJyYXk8b2JqZWN0Piwgb0NvbXBvbmVudDogb2JqZWN0Ki8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGlzSW5pdGlhbE5hdmlnYXRpb24oKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aXNJbml0aWFsTmF2aWdhdGlvbkFzeW5jKCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0ZXhwYW5kQ29tcGFjdEhhc2goLypzSGFzaEZyYWdtZW50OiBzdHJpbmcqLykge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuXHR9XG5cblx0cGFyc2VTaGVsbEhhc2goLypzSGFzaDogc3RyaW5nKi8pIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblxuXHRzcGxpdEhhc2goLypzSGFzaDogc3RyaW5nKi8pIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcblx0fVxuXG5cdGNvbnN0cnVjdFNoZWxsSGFzaCgvKm9OZXdTaGVsbEhhc2g6IG9iamVjdCovKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRzZXREaXJ0eUZsYWcoLypiRGlydHk6IGJvb2xlYW4qLykge1xuXHRcdC8qIERvIE5vdGhpbmcgKi9cblx0fVxuXG5cdHJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKC8qZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKi8pIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHRkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKC8qZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKi8pIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHRjcmVhdGVSZW5kZXJlcigpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblxuXHRnZXRVc2VyKCkge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdGhhc1VTaGVsbCgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoLypmbk5hdkZpbHRlcjogRnVuY3Rpb24qLyk6IHZvaWQge1xuXHRcdC8qIERvIE5vdGhpbmcgKi9cblx0fVxuXG5cdHVucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKC8qZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKi8pOiB2b2lkIHtcblx0XHQvKiBEbyBOb3RoaW5nICovXG5cdH1cblxuXHRzZXRCYWNrTmF2aWdhdGlvbigvKmZuQ2FsbEJhY2s/OiBGdW5jdGlvbiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0c2V0SGllcmFyY2h5KC8qYUhpZXJhcmNoeUxldmVsczogQXJyYXk8b2JqZWN0PiovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0c2V0VGl0bGUoLypzVGl0bGU6IHN0cmluZyovKTogdm9pZCB7XG5cdFx0LyogRG8gTm90aGluZyAqL1xuXHR9XG5cblx0Z2V0Q29udGVudERlbnNpdHkoKTogc3RyaW5nIHtcblx0XHQvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIHNoZWxsIHdlIHByb2JhYmx5IG5lZWQgdG8gbG9vayBhdCB0aGUgY2xhc3NlcyBiZWluZyBkZWZpbmVkIG9uIHRoZSBib2R5XG5cdFx0aWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FwVWlTaXplQ296eVwiKSkge1xuXHRcdFx0cmV0dXJuIFwiY296eVwiO1xuXHRcdH0gZWxzZSBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoXCJzYXBVaVNpemVDb21wYWN0XCIpKSB7XG5cdFx0XHRyZXR1cm4gXCJjb21wYWN0XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0fVxuXG5cdGdldFByaW1hcnlJbnRlbnQoLypzU2VtYW50aWNPYmplY3Q6IHN0cmluZywgbVBhcmFtZXRlcnM/OiBvYmplY3QqLyk6IFByb21pc2U8YW55PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG59XG5cbi8qKlxuICogQHR5cGVkZWYgU2hlbGxTZXJ2aWNlc1NldHRpbmdzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBTaGVsbFNlcnZpY2VzU2V0dGluZ3MgPSB7XG5cdHNoZWxsQ29udGFpbmVyPzogQ29udGFpbmVyO1xufTtcblxuLyoqXG4gKiBXcmFwIGEgSlF1ZXJ5IFByb21pc2Ugd2l0aGluIGEgbmF0aXZlIHtQcm9taXNlfS5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVFxuICogQHBhcmFtIGpxdWVyeVByb21pc2UgVGhlIG9yaWdpbmFsIGpxdWVyeSBwcm9taXNlXG4gKiBAcmV0dXJucyBBIG5hdGl2ZSBwcm9taXNlIHdyYXBwaW5nIHRoZSBzYW1lIG9iamVjdFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gd3JhcEpRdWVyeVByb21pc2U8VD4oanF1ZXJ5UHJvbWlzZTogalF1ZXJ5LlByb21pc2UpOiBQcm9taXNlPFQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRqcXVlcnlQcm9taXNlLmRvbmUocmVzb2x2ZSBhcyBhbnkpLmZhaWwocmVqZWN0KTtcblx0fSk7XG59XG5cbi8qKlxuICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2hlbGxTZXJ2aWNlc1xuICpcbiAqIEBpbXBsZW1lbnRzIHtJU2hlbGxTZXJ2aWNlc31cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNoZWxsU2VydmljZXMgZXh0ZW5kcyBTZXJ2aWNlPFJlcXVpcmVkPFNoZWxsU2VydmljZXNTZXR0aW5ncz4+IGltcGxlbWVudHMgSVNoZWxsU2VydmljZXMge1xuXHRyZXNvbHZlRm46IGFueTtcblx0cmVqZWN0Rm46IGFueTtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRjcm9zc0FwcE5hdlNlcnZpY2UhOiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbjtcblx0dXJsUGFyc2luZ1NlcnZpY2UhOiBVUkxQYXJzaW5nO1xuXHRzaGVsbE5hdmlnYXRpb24hOiBTaGVsbE5hdmlnYXRpb247XG5cdG9TaGVsbENvbnRhaW5lciE6IENvbnRhaW5lcjtcblx0c2hlbGxVSVNlcnZpY2UhOiBhbnk7XG5cdGluc3RhbmNlVHlwZSE6IHN0cmluZztcblx0bGlua3NDYWNoZSE6IGFueTtcblx0Zm5GaW5kU2VtYW50aWNPYmplY3RzSW5DYWNoZTogYW55O1xuXG5cdGluaXQoKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3QgYXMgYW55O1xuXHRcdHRoaXMub1NoZWxsQ29udGFpbmVyID0gb0NvbnRleHQuc2V0dGluZ3Muc2hlbGxDb250YWluZXI7XG5cdFx0dGhpcy5pbnN0YW5jZVR5cGUgPSBcInJlYWxcIjtcblx0XHR0aGlzLmxpbmtzQ2FjaGUgPSB7fTtcblx0XHR0aGlzLmZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUgPSBmdW5jdGlvbiAob0FyZ3M6IGFueSk6IG9iamVjdCB7XG5cdFx0XHRjb25zdCBfb0FyZ3M6IGFueSA9IG9BcmdzO1xuXHRcdFx0Y29uc3QgYUNhY2hlZFNlbWFudGljT2JqZWN0cyA9IFtdO1xuXHRcdFx0Y29uc3QgYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cyA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBfb0FyZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKCEhX29BcmdzW2ldWzBdICYmICEhX29BcmdzW2ldWzBdLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMubGlua3NDYWNoZVtfb0FyZ3NbaV1bMF0uc2VtYW50aWNPYmplY3RdKSB7XG5cdFx0XHRcdFx0XHRhQ2FjaGVkU2VtYW50aWNPYmplY3RzLnB1c2godGhpcy5saW5rc0NhY2hlW19vQXJnc1tpXVswXS5zZW1hbnRpY09iamVjdF0ubGlua3MpO1xuXHRcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9BcmdzW2ldWzBdLCBcImxpbmtzXCIsIHtcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHRoaXMubGlua3NDYWNoZVtfb0FyZ3NbaV1bMF0uc2VtYW50aWNPYmplY3RdLmxpbmtzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cy5wdXNoKF9vQXJnc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4geyBvbGRBcmdzOiBvQXJncywgbmV3QXJnczogYU5vbkNhY2hlZFNlbWFudGljT2JqZWN0cywgY2FjaGVkTGlua3M6IGFDYWNoZWRTZW1hbnRpY09iamVjdHMgfTtcblx0XHR9O1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0aGlzLnJlc29sdmVGbiA9IHJlc29sdmU7XG5cdFx0XHR0aGlzLnJlamVjdEZuID0gcmVqZWN0O1xuXHRcdH0pO1xuXHRcdGNvbnN0IG9Dcm9zc0FwcE5hdlNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cIik7XG5cdFx0Y29uc3Qgb1VybFBhcnNpbmdTZXJ2aWNlUHJvbWlzZSA9IHRoaXMub1NoZWxsQ29udGFpbmVyLmdldFNlcnZpY2VBc3luYyhcIlVSTFBhcnNpbmdcIik7XG5cdFx0Y29uc3Qgb1NoZWxsTmF2aWdhdGlvblNlcnZpY2VQcm9taXNlID0gdGhpcy5vU2hlbGxDb250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiU2hlbGxOYXZpZ2F0aW9uXCIpO1xuXHRcdGNvbnN0IG9TaGVsbFVJU2VydmljZVByb21pc2UgPSBvQ29tcG9uZW50LmdldFNlcnZpY2UoXCJTaGVsbFVJU2VydmljZVwiKTtcblx0XHRQcm9taXNlLmFsbChbb0Nyb3NzQXBwTmF2U2VydmljZVByb21pc2UsIG9VcmxQYXJzaW5nU2VydmljZVByb21pc2UsIG9TaGVsbE5hdmlnYXRpb25TZXJ2aWNlUHJvbWlzZSwgb1NoZWxsVUlTZXJ2aWNlUHJvbWlzZV0pXG5cdFx0XHQudGhlbigoW29Dcm9zc0FwcE5hdlNlcnZpY2UsIG9VcmxQYXJzaW5nU2VydmljZSwgb1NoZWxsTmF2aWdhdGlvbiwgb1NoZWxsVUlTZXJ2aWNlXSkgPT4ge1xuXHRcdFx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2U7XG5cdFx0XHRcdHRoaXMudXJsUGFyc2luZ1NlcnZpY2UgPSBvVXJsUGFyc2luZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuc2hlbGxOYXZpZ2F0aW9uID0gb1NoZWxsTmF2aWdhdGlvbjtcblx0XHRcdFx0dGhpcy5zaGVsbFVJU2VydmljZSA9IG9TaGVsbFVJU2VydmljZTtcblx0XHRcdFx0dGhpcy5yZXNvbHZlRm4oKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2godGhpcy5yZWplY3RGbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB0YXJnZXQgbGlua3MgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QgJiBhY3Rpb25cblx0ICogV2lsbCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0TGlua3MgbWV0aG9kLiBJbiBjYXNlIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvciBhbnkgZXhjZXB0aW9uXG5cdCAqIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9uIGVycm9yIGluIGNvbnNvbGUuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0FyZ3MgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbj0+Z2V0TGlua3MgYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byB0YXJnZXQgbGlua3MgYXJyYXlcblx0ICovXG5cdGdldExpbmtzKG9BcmdzOiBvYmplY3QpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZVxuXHRcdFx0XHQuZ2V0TGlua3Mob0FyZ3MpXG5cdFx0XHRcdC5mYWlsKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoYCR7b0Vycm9yfSBzYXAuZmUuY29yZS5zZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZUZhY3RvcnkuZ2V0TGlua3NgKSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKHJlc29sdmUpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdGFyZ2V0IGxpbmtzIGNvbmZpZ3VyZWQgZm9yIGEgZ2l2ZW4gc2VtYW50aWMgb2JqZWN0ICYgYWN0aW9uIGluIGNhY2hlXG5cdCAqIFdpbGwgcmV0cmlldmUgdGhlIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXG5cdCAqIHNlcnZpY2UgcmVmZXJlbmNlIGNhbGwgdGhlIGdldExpbmtzIG1ldGhvZC4gSW4gY2FzZSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb3IgYW55IGV4Y2VwdGlvblxuXHQgKiBtZXRob2QgdGhyb3dzIGV4Y2VwdGlvbiBlcnJvciBpbiBjb25zb2xlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9BcmdzIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmdldExpbmtzIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGFyZ2V0IGxpbmtzIGFycmF5XG5cdCAqL1xuXHRnZXRMaW5rc1dpdGhDYWNoZShvQXJnczogb2JqZWN0KTogUHJvbWlzZTxhbnlbXT4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRcdGlmICgob0FyZ3MgYXMgT2JqZWN0W10pLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXNvbHZlKFtdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9DYWNoZVJlc3VsdHMgPSB0aGlzLmZuRmluZFNlbWFudGljT2JqZWN0c0luQ2FjaGUob0FyZ3MpO1xuXG5cdFx0XHRcdGlmIChvQ2FjaGVSZXN1bHRzLm5ld0FyZ3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShvQ2FjaGVSZXN1bHRzLmNhY2hlZExpbmtzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRcdFx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZVxuXHRcdFx0XHRcdFx0LmdldExpbmtzKG9DYWNoZVJlc3VsdHMubmV3QXJncylcblx0XHRcdFx0XHRcdC5mYWlsKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke29FcnJvcn0gc2FwLmZlLmNvcmUuc2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2VGYWN0b3J5LmdldExpbmtzV2l0aENhY2hlYCkpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKChhTGlua3M6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYUxpbmtzLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9TZW1hbnRpY09iamVjdHNMaW5rczogYW55ID0ge307XG5cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFMaW5rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFMaW5rc1tpXS5sZW5ndGggPiAwICYmIG9DYWNoZVJlc3VsdHMubmV3QXJnc1tpXVswXS5saW5rcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TZW1hbnRpY09iamVjdHNMaW5rc1tvQ2FjaGVSZXN1bHRzLm5ld0FyZ3NbaV1bMF0uc2VtYW50aWNPYmplY3RdID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxpbmtzOiBhTGlua3NbaV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5saW5rc0NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLmxpbmtzQ2FjaGUsIG9TZW1hbnRpY09iamVjdHNMaW5rcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9DYWNoZVJlc3VsdHMuY2FjaGVkTGlua3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhTGlua3MpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFNZXJnZWRMaW5rcyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBqID0gMDtcblxuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgb0NhY2hlUmVzdWx0cy5vbGRBcmdzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoaiA8IGFMaW5rcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFMaW5rc1tqXS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NhY2hlUmVzdWx0cy5vbGRBcmdzW2tdWzBdLnNlbWFudGljT2JqZWN0ID09PSBvQ2FjaGVSZXN1bHRzLm5ld0FyZ3Nbal1bMF0uc2VtYW50aWNPYmplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2goYUxpbmtzW2pdKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2gob0NhY2hlUmVzdWx0cy5vbGRBcmdzW2tdWzBdLmxpbmtzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lcmdlZExpbmtzLnB1c2gob0NhY2hlUmVzdWx0cy5vbGRBcmdzW2tdWzBdLmxpbmtzKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhTWVyZ2VkTGlua3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgcmV0cmlldmUgdGhlIFNoZWxsQ29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogc2FwLnVzaGVsbC5jb250YWluZXJcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggcHJlZGVmaW5lZCBzaGVsbENvbnRhaW5lciBtZXRob2RzXG5cdCAqL1xuXHRnZXRTaGVsbENvbnRhaW5lcigpIHtcblx0XHRyZXR1cm4gdGhpcy5vU2hlbGxDb250YWluZXI7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHRvRXh0ZXJuYWwgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBOYXZpZ2F0aW9uIEFyZ3VtZW50cyBhbmQgb0NvbXBvbmVudC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBvTmF2QXJndW1lbnRzQXJyIEFuZFxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT50b0V4dGVybmFsIGFyZ3VtZW50c1xuXHQgKi9cblx0dG9FeHRlcm5hbChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50OiBvYmplY3QpOiB2b2lkIHtcblx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZS50b0V4dGVybmFsKG9OYXZBcmd1bWVudHNBcnIsIG9Db21wb25lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdGFyZ2V0IHN0YXJ0dXBBcHBTdGF0ZVxuXHQgKiBXaWxsIGNoZWNrIHRoZSBleGlzdGFuY2Ugb2YgdGhlIFNoZWxsQ29udGFpbmVyIGFuZCByZXRyaWV2ZSB0aGUgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cblx0ICogc2VydmljZSByZWZlcmVuY2UgY2FsbCB0aGUgZ2V0U3RhcnR1cEFwcFN0YXRlIG1ldGhvZC4gSW4gY2FzZSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb3IgYW55IGV4Y2VwdGlvblxuXHQgKiBtZXRob2QgdGhyb3dzIGV4Y2VwdGlvbiBlcnJvciBpbiBjb25zb2xlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9BcmdzIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmdldFN0YXJ0dXBBcHBTdGF0ZSBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIE9iamVjdFxuXHQgKi9cblx0Z2V0U3RhcnR1cEFwcFN0YXRlKG9BcmdzOiBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Ly8gSlF1ZXJ5IFByb21pc2UgYmVoYXZlcyBkaWZmZXJlbnRseVxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0XHQodGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UgYXMgYW55KVxuXHRcdFx0XHQuZ2V0U3RhcnR1cEFwcFN0YXRlKG9BcmdzKVxuXHRcdFx0XHQuZmFpbCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke29FcnJvcn0gc2FwLmZlLmNvcmUuc2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2VGYWN0b3J5LmdldFN0YXJ0dXBBcHBTdGF0ZWApKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4ocmVzb2x2ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGJhY2tUb1ByZXZpb3VzQXBwIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBTb21ldGhpbmcgdGhhdCBpbmRpY2F0ZSB3ZSd2ZSBuYXZpZ2F0ZWRcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRiYWNrVG9QcmV2aW91c0FwcCgpIHtcblx0XHRyZXR1cm4gdGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuYmFja1RvUHJldmlvdXNBcHAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgaHJlZkZvckV4dGVybmFsIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9BcmdzIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIGJBc3luYyBXaGV0aGVyIHRoaXMgY2FsbCBzaG91bGQgYmUgYXN5bmMgb3Igbm90XG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb249PmhyZWZGb3JFeHRlcm5hbCBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHN0cmluZ1xuXHQgKi9cblx0aHJlZkZvckV4dGVybmFsKG9BcmdzOiBvYmplY3QsIG9Db21wb25lbnQ/OiBvYmplY3QsIGJBc3luYz86IGJvb2xlYW4pIHtcblx0XHRyZXR1cm4gdGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuaHJlZkZvckV4dGVybmFsKG9BcmdzLCBvQ29tcG9uZW50IGFzIG9iamVjdCwgISFiQXN5bmMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBocmVmRm9yRXh0ZXJuYWwgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0FyZ3MgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogQHBhcmFtIG9Db21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5ocmVmRm9yRXh0ZXJuYWxBc3luYyBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIHN0cmluZ1xuXHQgKi9cblx0aHJlZkZvckV4dGVybmFsQXN5bmMob0FyZ3M6IG9iamVjdCwgb0NvbXBvbmVudD86IG9iamVjdCkge1xuXHRcdHJldHVybiB0aGlzLmNyb3NzQXBwTmF2U2VydmljZS5ocmVmRm9yRXh0ZXJuYWxBc3luYyhvQXJncywgb0NvbXBvbmVudCBhcyBvYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBnZXRBcHBTdGF0ZSBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZSB3aXRoIG9Db21wb25lbnQgYW5kIG9BcHBTdGF0ZUtleS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbj0+Z2V0QXBwU3RhdGUgYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBvYmplY3Rcblx0ICovXG5cdGdldEFwcFN0YXRlKG9Db21wb25lbnQ6IENvbXBvbmVudCwgc0FwcFN0YXRlS2V5OiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gd3JhcEpRdWVyeVByb21pc2UoKHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlIGFzIGFueSkuZ2V0QXBwU3RhdGUob0NvbXBvbmVudCwgc0FwcFN0YXRlS2V5KSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGNyZWF0ZUVtcHR5QXBwU3RhdGUgbWV0aG9kIG9mIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHNlcnZpY2Ugd2l0aCBvQ29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9Db21wb25lbnQgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbj0+Y3JlYXRlRW1wdHlBcHBTdGF0ZSBhcmd1bWVudHNcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHRvIG9iamVjdFxuXHQgKi9cblx0Y3JlYXRlRW1wdHlBcHBTdGF0ZShvQ29tcG9uZW50OiBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gKHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlIGFzIGFueSkuY3JlYXRlRW1wdHlBcHBTdGF0ZShvQ29tcG9uZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIG1ldGhvZCBvZiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBzZXJ2aWNlIHdpdGggTmF2aWdhdGlvbiBBcmd1bWVudHMgYW5kIG9Db21wb25lbnQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb05hdkFyZ3VtZW50c0FyclxuXHQgKiBAcGFyYW0gb0NvbXBvbmVudCBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZlxuXHQgKiBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uPT5pc05hdmlnYXRpb25TdXBwb3J0ZWQgYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBvYmplY3Rcblx0ICovXG5cdGlzTmF2aWdhdGlvblN1cHBvcnRlZChvTmF2QXJndW1lbnRzQXJyOiBBcnJheTxvYmplY3Q+LCBvQ29tcG9uZW50OiBvYmplY3QpIHtcblx0XHRyZXR1cm4gd3JhcEpRdWVyeVByb21pc2UodGhpcy5jcm9zc0FwcE5hdlNlcnZpY2UuaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKG9OYXZBcmd1bWVudHNBcnIsIG9Db21wb25lbnQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgaXNJbml0aWFsTmF2aWdhdGlvbiBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBib29sZWFuXG5cdCAqL1xuXHRpc0luaXRpYWxOYXZpZ2F0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmNyb3NzQXBwTmF2U2VydmljZS5pc0luaXRpYWxOYXZpZ2F0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGlzSW5pdGlhbE5hdmlnYXRpb25Bc3luYyBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBib29sZWFuXG5cdCAqL1xuXHRpc0luaXRpYWxOYXZpZ2F0aW9uQXN5bmMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlLmlzSW5pdGlhbE5hdmlnYXRpb25Bc3luYygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBleHBhbmRDb21wYWN0SGFzaCBtZXRob2Qgb2YgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24gc2VydmljZS5cblx0ICpcblx0ICogQHBhcmFtIHNIYXNoRnJhZ21lbnQgQW4gKGludGVybmFsIGZvcm1hdCkgc2hlbGwgaGFzaFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhlIHN1Y2Nlc3MgaGFuZGxlciBvZiB0aGUgcmVzb2x2ZSBwcm9taXNlIGdldCBhbiBleHBhbmRlZCBzaGVsbCBoYXNoIGFzIGZpcnN0IGFyZ3VtZW50XG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0ZXhwYW5kQ29tcGFjdEhhc2goc0hhc2hGcmFnbWVudDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NBcHBOYXZTZXJ2aWNlLmV4cGFuZENvbXBhY3RIYXNoKHNIYXNoRnJhZ21lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBwYXJzZVNoZWxsSGFzaCBtZXRob2Qgb2YgVVJMUGFyc2luZyBzZXJ2aWNlIHdpdGggZ2l2ZW4gc0hhc2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gc0hhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5wYXJzZVNoZWxsSGFzaCBhcmd1bWVudHNcblx0ICogQHJldHVybnMgVGhlIHBhcnNlZCB1cmxcblx0ICovXG5cdHBhcnNlU2hlbGxIYXNoKHNIYXNoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy51cmxQYXJzaW5nU2VydmljZS5wYXJzZVNoZWxsSGFzaChzSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHNwbGl0SGFzaCBtZXRob2Qgb2YgVVJMUGFyc2luZyBzZXJ2aWNlIHdpdGggZ2l2ZW4gc0hhc2guXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gc0hhc2ggQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Zcblx0ICogc2FwLnVzaGVsbC5zZXJ2aWNlcy5VUkxQYXJzaW5nPT5zcGxpdEhhc2ggYXJndW1lbnRzXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byBvYmplY3Rcblx0ICovXG5cdHNwbGl0SGFzaChzSGFzaDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMudXJsUGFyc2luZ1NlcnZpY2Uuc3BsaXRIYXNoKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgY29uc3RydWN0U2hlbGxIYXNoIG1ldGhvZCBvZiBVUkxQYXJzaW5nIHNlcnZpY2Ugd2l0aCBnaXZlbiBzSGFzaC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBvTmV3U2hlbGxIYXNoIENoZWNrIHRoZSBkZWZpbml0aW9uIG9mXG5cdCAqIHNhcC51c2hlbGwuc2VydmljZXMuVVJMUGFyc2luZz0+Y29uc3RydWN0U2hlbGxIYXNoIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJucyBTaGVsbCBIYXNoIHN0cmluZ1xuXHQgKi9cblx0Y29uc3RydWN0U2hlbGxIYXNoKG9OZXdTaGVsbEhhc2g6IG9iamVjdCkge1xuXHRcdHJldHVybiB0aGlzLnVybFBhcnNpbmdTZXJ2aWNlLmNvbnN0cnVjdFNoZWxsSGFzaChvTmV3U2hlbGxIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgc2V0RGlydHlGbGFnIG1ldGhvZCB3aXRoIGdpdmVuIGRpcnR5IHN0YXRlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIGJEaXJ0eSBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBzYXAudXNoZWxsLkNvbnRhaW5lci5zZXREaXJ0eUZsYWcgYXJndW1lbnRzXG5cdCAqL1xuXHRzZXREaXJ0eUZsYWcoYkRpcnR5OiBib29sZWFuKSB7XG5cdFx0dGhpcy5vU2hlbGxDb250YWluZXIuc2V0RGlydHlGbGFnKGJEaXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIG1ldGhvZCB3aXRoIGdpdmVuIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGNhbGxiYWNrIG1ldGhvZC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBmbkRpcnR5U3RhdGVQcm92aWRlciBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBzYXAudXNoZWxsLkNvbnRhaW5lci5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciBhcmd1bWVudHNcblx0ICovXG5cdHJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKGZuRGlydHlTdGF0ZVByb3ZpZGVyOiBGdW5jdGlvbikge1xuXHRcdHRoaXMub1NoZWxsQ29udGFpbmVyLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKGZuRGlydHlTdGF0ZVByb3ZpZGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciBtZXRob2Qgd2l0aCBnaXZlbiBkaXJ0eSBzdGF0ZSBwcm92aWRlciBjYWxsYmFjayBtZXRob2QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gZm5EaXJ0eVN0YXRlUHJvdmlkZXIgQ2hlY2sgdGhlIGRlZmluaXRpb24gb2Ygc2FwLnVzaGVsbC5Db250YWluZXIuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciBhcmd1bWVudHNcblx0ICovXG5cdGRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIoZm5EaXJ0eVN0YXRlUHJvdmlkZXI6IEZ1bmN0aW9uKSB7XG5cdFx0dGhpcy5vU2hlbGxDb250YWluZXIuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihmbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIGNyZWF0ZVJlbmRlcmVyIG1ldGhvZCBvZiB1c2hlbGwgY29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMgUmV0dXJucyByZW5kZXJlciBvYmplY3Rcblx0ICovXG5cdGNyZWF0ZVJlbmRlcmVyKCkge1xuXHRcdHJldHVybiB0aGlzLm9TaGVsbENvbnRhaW5lci5jcmVhdGVSZW5kZXJlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBnZXRVc2VyIG1ldGhvZCBvZiB1c2hlbGwgY29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMgUmV0dXJucyBVc2VyIG9iamVjdFxuXHQgKi9cblx0Z2V0VXNlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMub1NoZWxsQ29udGFpbmVyIGFzIGFueSkuZ2V0VXNlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2hlY2sgaWYgdXNoZWxsIGNvbnRhaW5lciBpcyBhdmFpbGFibGUgb3Igbm90LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlXG5cdCAqL1xuXHRoYXNVU2hlbGwoKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlciBtZXRob2Qgb2Ygc2hlbGxOYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gZm5OYXZGaWx0ZXIgVGhlIGZpbHRlciBmdW5jdGlvbiB0byByZWdpc3RlclxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdHJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlcihmbk5hdkZpbHRlcjogRnVuY3Rpb24pIHtcblx0XHQodGhpcy5zaGVsbE5hdmlnYXRpb24gYXMgYW55KS5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCB1bnJlZ2lzdGVyTmF2aWdhdGlvbkZpbHRlciBtZXRob2Qgb2Ygc2hlbGxOYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gZm5OYXZGaWx0ZXIgVGhlIGZpbHRlciBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0dW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXI6IEZ1bmN0aW9uKSB7XG5cdFx0KHRoaXMuc2hlbGxOYXZpZ2F0aW9uIGFzIGFueSkudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIoZm5OYXZGaWx0ZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdpbGwgY2FsbCBzZXRCYWNrTmF2aWdhdGlvbiBtZXRob2Qgb2YgU2hlbGxVSVNlcnZpY2Vcblx0ICogdGhhdCBkaXNwbGF5cyB0aGUgYmFjayBidXR0b24gaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICpcblx0ICogQHBhcmFtIFtmbkNhbGxCYWNrXSBBIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCBpbiB0aGUgVUkuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0c2V0QmFja05hdmlnYXRpb24oZm5DYWxsQmFjaz86IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5zaGVsbFVJU2VydmljZS5zZXRCYWNrTmF2aWdhdGlvbihmbkNhbGxCYWNrKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNhbGwgc2V0SGllcmFyY2h5IG1ldGhvZCBvZiBTaGVsbFVJU2VydmljZVxuXHQgKiB0aGF0IGRpc3BsYXlzIHRoZSBnaXZlbiBoaWVyYXJjaHkgaW4gdGhlIHNoZWxsIGhlYWRlci5cblx0ICpcblx0ICogQHBhcmFtIFthSGllcmFyY2h5TGV2ZWxzXSBBbiBhcnJheSByZXByZXNlbnRpbmcgaGllcmFyY2hpZXMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgYXBwLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdHNldEhpZXJhcmNoeShhSGllcmFyY2h5TGV2ZWxzOiBBcnJheTxvYmplY3Q+KTogdm9pZCB7XG5cdFx0dGhpcy5zaGVsbFVJU2VydmljZS5zZXRIaWVyYXJjaHkoYUhpZXJhcmNoeUxldmVscyk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjYWxsIHNldFRpdGxlIG1ldGhvZCBvZiBTaGVsbFVJU2VydmljZVxuXHQgKiB0aGF0IGRpc3BsYXlzIHRoZSBnaXZlbiB0aXRsZSBpbiB0aGUgc2hlbGwgaGVhZGVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gW3NUaXRsZV0gVGhlIG5ldyB0aXRsZS4gVGhlIGRlZmF1bHQgdGl0bGUgaXMgc2V0IGlmIHRoaXMgYXJndW1lbnQgaXMgbm90IGdpdmVuLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdHNldFRpdGxlKHNUaXRsZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5zaGVsbFVJU2VydmljZS5zZXRUaXRsZShzVGl0bGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGRlZmluZWQgY29udGVudCBkZW5zaXR5LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY29udGVudCBkZW5zaXR5IHZhbHVlXG5cdCAqL1xuXHRnZXRDb250ZW50RGVuc2l0eSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiAodGhpcy5vU2hlbGxDb250YWluZXIgYXMgYW55KS5nZXRVc2VyKCkuZ2V0Q29udGVudERlbnNpdHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGb3IgYSBnaXZlbiBzZW1hbnRpYyBvYmplY3QsIHRoaXMgbWV0aG9kIGNvbnNpZGVycyBhbGwgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbWFudGljIG9iamVjdCBhbmRcblx0ICogcmV0dXJucyB0aGUgb25lIHRhZ2dlZCBhcyBhIFwicHJpbWFyeUFjdGlvblwiLiBJZiBubyBpbmJvdW5kIHRhZ2dlZCBhcyBcInByaW1hcnlBY3Rpb25cIiBleGlzdHMsIHRoZW4gaXQgcmV0dXJuc1xuXHQgKiB0aGUgaW50ZW50IG9mIHRoZSBmaXJzdCBpbmJvdW5kIChhZnRlciBzb3J0aW5nIGhhcyBiZWVuIGFwcGxpZWQpIG1hdGNoaW5nIHRoZSBhY3Rpb24gXCJkaXNwbGF5RmFjdFNoZWV0XCIuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFNlZSAjQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24jZ2V0TGlua3MgZm9yIGRlc2NyaXB0aW9uLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgaW50ZW50IGlmIGl0IGV4aXN0cy5cblx0ICovXG5cdGdldFByaW1hcnlJbnRlbnQoc1NlbWFudGljT2JqZWN0OiBzdHJpbmcsIG1QYXJhbWV0ZXJzPzogb2JqZWN0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0XHR0aGlzLmNyb3NzQXBwTmF2U2VydmljZVxuXHRcdFx0XHQuZ2V0UHJpbWFyeUludGVudChzU2VtYW50aWNPYmplY3QsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHQuZmFpbCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke29FcnJvcn0gc2FwLmZlLmNvcmUuc2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2VGYWN0b3J5LmdldFByaW1hcnlJbnRlbnRgKSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKHJlc29sdmUpO1xuXHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogU2VydmljZSBGYWN0b3J5IGZvciB0aGUgU2hlbGxTZXJ2aWNlc1xuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNoZWxsU2VydmljZXNGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2hlbGxTZXJ2aWNlc1NldHRpbmdzPiB7XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGVpdGhlciBhIHN0YW5kYXJkIG9yIGEgbW9jayBTaGVsbCBzZXJ2aWNlIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG9TZXJ2aWNlQ29udGV4dCBUaGUgc2hlbGxzZXJ2aWNlIGNvbnRleHRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGZvciBhIHNoZWxsIHNlcnZpY2UgaW1wbGVtZW50YXRpb25cblx0ICogQHNlZSBTZXJ2aWNlRmFjdG9yeSNjcmVhdGVJbnN0YW5jZVxuXHQgKi9cblx0Y3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxTaGVsbFNlcnZpY2VzU2V0dGluZ3M+KTogUHJvbWlzZTxJU2hlbGxTZXJ2aWNlcz4ge1xuXHRcdG9TZXJ2aWNlQ29udGV4dC5zZXR0aW5ncy5zaGVsbENvbnRhaW5lciA9IHNhcC51c2hlbGwgJiYgKHNhcC51c2hlbGwuQ29udGFpbmVyIGFzIENvbnRhaW5lcik7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZSA9IG9TZXJ2aWNlQ29udGV4dC5zZXR0aW5ncy5zaGVsbENvbnRhaW5lclxuXHRcdFx0PyBuZXcgU2hlbGxTZXJ2aWNlcyhvU2VydmljZUNvbnRleHQgYXMgU2VydmljZUNvbnRleHQ8UmVxdWlyZWQ8U2hlbGxTZXJ2aWNlc1NldHRpbmdzPj4pXG5cdFx0XHQ6IG5ldyBTaGVsbFNlcnZpY2VNb2NrKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIG9TaGVsbFNlcnZpY2UuaW5pdFByb21pc2UudGhlbigoKSA9PiB7XG5cdFx0XHQvLyBFbnJpY2ggdGhlIGFwcENvbXBvbmVudCB3aXRoIHRoaXMgbWV0aG9kXG5cdFx0XHQob1NlcnZpY2VDb250ZXh0LnNjb3BlT2JqZWN0IGFzIGFueSkuZ2V0U2hlbGxTZXJ2aWNlcyA9ICgpID0+IG9TaGVsbFNlcnZpY2U7XG5cdFx0XHRyZXR1cm4gb1NoZWxsU2VydmljZTtcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaGVsbFNlcnZpY2VzRmFjdG9yeTtcbiJdfQ==