@sapui5/sap.fe.core 1.103.0 → 1.106.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 (303) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +121 -0
  4. package/src/sap/fe/core/ActionRuntime.ts +122 -0
  5. package/src/sap/fe/core/AppComponent.js +24 -11
  6. package/src/sap/fe/core/AppComponent.ts +17 -5
  7. package/src/sap/fe/core/AppStateHandler.js +74 -62
  8. package/src/sap/fe/core/AppStateHandler.ts +24 -29
  9. package/src/sap/fe/core/BaseController.js +2 -2
  10. package/src/sap/fe/core/CommonUtils.js +147 -180
  11. package/src/sap/fe/core/CommonUtils.ts +166 -193
  12. package/src/sap/fe/core/ExtensionAPI.js +2 -2
  13. package/src/sap/fe/core/PageController.js +2 -2
  14. package/src/sap/fe/core/TemplateComponent.js +21 -10
  15. package/src/sap/fe/core/TemplateComponent.ts +3 -0
  16. package/src/sap/fe/core/TemplateModel.js +2 -2
  17. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
  18. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +7 -1
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +194 -43
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +162 -24
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -227
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +268 -119
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +111 -76
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +96 -76
  27. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  28. package/src/sap/fe/core/controllerextensions/EditFlow.js +723 -637
  29. package/src/sap/fe/core/controllerextensions/EditFlow.ts +361 -398
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +83 -55
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +42 -44
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +29 -27
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +35 -30
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +171 -74
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +167 -76
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +5 -21
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -17
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -3
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  43. package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -1
  44. package/src/sap/fe/core/controllerextensions/Paginator.js +13 -13
  45. package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -11
  46. package/src/sap/fe/core/controllerextensions/Placeholder.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +2 -2
  48. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  49. package/src/sap/fe/core/controllerextensions/Share.js +154 -123
  50. package/src/sap/fe/core/controllerextensions/Share.ts +93 -95
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +157 -97
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +151 -95
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +151 -80
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +95 -93
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +9 -9
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +6 -7
  58. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +26 -11
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +30 -11
  60. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -40
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +55 -47
  62. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +31 -32
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1376 -914
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +654 -714
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +372 -326
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +210 -276
  67. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
  68. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +670 -521
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +537 -535
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +85 -65
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +16 -21
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +25 -13
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +53 -43
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +18 -27
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +9 -15
  77. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +19 -3
  78. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
  79. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +26 -16
  80. package/src/sap/fe/core/controls/Any.js +1 -1
  81. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +5 -5
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -3
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FileWrapper.js +8 -3
  89. package/src/sap/fe/core/controls/FileWrapper.ts +5 -1
  90. package/src/sap/fe/core/controls/FilterBar.js +2 -2
  91. package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
  92. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  93. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  94. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +48 -17
  95. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +2 -2
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +2 -2
  98. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -3
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +2 -2
  100. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +2 -2
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +1 -1
  103. package/src/sap/fe/core/converters/ConverterContext.js +23 -2
  104. package/src/sap/fe/core/converters/ConverterContext.ts +34 -9
  105. package/src/sap/fe/core/converters/ManifestSettings.js +19 -18
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +53 -47
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  108. package/src/sap/fe/core/converters/MetaModelConverter.js +32 -10
  109. package/src/sap/fe/core/converters/MetaModelConverter.ts +42 -19
  110. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  111. package/src/sap/fe/core/converters/annotations/DataField.js +5 -2
  112. package/src/sap/fe/core/converters/annotations/DataField.ts +5 -1
  113. package/src/sap/fe/core/converters/common/AnnotationConverter.js +69 -23
  114. package/src/sap/fe/core/converters/controls/Common/Action.js +98 -51
  115. package/src/sap/fe/core/converters/controls/Common/Action.ts +121 -44
  116. package/src/sap/fe/core/converters/controls/Common/Chart.js +31 -34
  117. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -34
  118. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  119. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +43 -7
  120. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -33
  121. package/src/sap/fe/core/converters/controls/Common/Form.js +8 -6
  122. package/src/sap/fe/core/converters/controls/Common/Form.ts +11 -14
  123. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  124. package/src/sap/fe/core/converters/controls/Common/KPI.ts +16 -15
  125. package/src/sap/fe/core/converters/controls/Common/Table.js +188 -157
  126. package/src/sap/fe/core/converters/controls/Common/Table.ts +279 -230
  127. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  128. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +57 -21
  130. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +71 -18
  131. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +30 -8
  132. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +24 -7
  133. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  134. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +43 -34
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +37 -25
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +85 -49
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +74 -50
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +54 -4
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +56 -8
  140. package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
  141. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +6 -4
  142. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +10 -2
  143. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +182 -0
  144. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +167 -0
  145. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  146. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  147. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  148. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  149. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  150. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -3
  151. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  152. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +8 -14
  153. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +6 -9
  154. package/src/sap/fe/core/converters/templates/ListReportConverter.js +31 -31
  155. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +54 -47
  156. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +44 -15
  157. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +64 -30
  158. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  159. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  160. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  161. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  162. package/src/sap/fe/core/formatters/StandardFormatter.js +13 -6
  163. package/src/sap/fe/core/formatters/StandardFormatter.ts +20 -14
  164. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  166. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  167. package/src/sap/fe/core/fpm/Component.js +33 -7
  168. package/src/sap/fe/core/fpm/Component.ts +14 -0
  169. package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
  170. package/src/sap/fe/core/helpers/AppStartupHelper.js +5 -4
  171. package/src/sap/fe/core/helpers/AppStartupHelper.ts +4 -3
  172. package/src/sap/fe/core/helpers/BindingToolkit.js +56 -24
  173. package/src/sap/fe/core/helpers/BindingToolkit.ts +67 -21
  174. package/src/sap/fe/core/helpers/ClassSupport.js +31 -3
  175. package/src/sap/fe/core/helpers/ClassSupport.ts +24 -1
  176. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  177. package/src/sap/fe/core/helpers/EditState.js +1 -1
  178. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  179. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  181. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  182. package/src/sap/fe/core/helpers/LoaderUtils.js +39 -0
  183. package/src/sap/fe/core/helpers/LoaderUtils.ts +14 -0
  184. package/src/sap/fe/core/helpers/MassEditHelper.js +475 -99
  185. package/src/sap/fe/core/helpers/MassEditHelper.ts +468 -155
  186. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  187. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  188. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  189. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  190. package/src/sap/fe/core/helpers/SemanticDateOperators.js +82 -36
  191. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +52 -36
  192. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/SideEffectsHelper.js +146 -0
  194. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +128 -0
  195. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  197. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  198. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  199. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  200. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  201. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
  202. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
  203. package/src/sap/fe/core/jsx-runtime/jsx-control.js +119 -0
  204. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +98 -0
  205. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  206. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  207. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  208. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  209. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  210. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
  211. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
  212. package/src/sap/fe/core/library.js +2 -2
  213. package/src/sap/fe/core/library.support.js +1 -1
  214. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  215. package/src/sap/fe/core/messagebundle.properties +4 -41
  216. package/src/sap/fe/core/messagebundle_ar.properties +22 -45
  217. package/src/sap/fe/core/messagebundle_bg.properties +22 -45
  218. package/src/sap/fe/core/messagebundle_ca.properties +22 -45
  219. package/src/sap/fe/core/messagebundle_cs.properties +22 -45
  220. package/src/sap/fe/core/messagebundle_cy.properties +21 -44
  221. package/src/sap/fe/core/messagebundle_da.properties +22 -45
  222. package/src/sap/fe/core/messagebundle_de.properties +22 -45
  223. package/src/sap/fe/core/messagebundle_el.properties +22 -45
  224. package/src/sap/fe/core/messagebundle_en.properties +21 -44
  225. package/src/sap/fe/core/messagebundle_en_GB.properties +21 -44
  226. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +21 -42
  227. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -40
  228. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -42
  229. package/src/sap/fe/core/messagebundle_es.properties +22 -45
  230. package/src/sap/fe/core/messagebundle_es_MX.properties +22 -45
  231. package/src/sap/fe/core/messagebundle_et.properties +22 -45
  232. package/src/sap/fe/core/messagebundle_fi.properties +22 -45
  233. package/src/sap/fe/core/messagebundle_fr.properties +21 -44
  234. package/src/sap/fe/core/messagebundle_fr_CA.properties +20 -43
  235. package/src/sap/fe/core/messagebundle_hi.properties +22 -45
  236. package/src/sap/fe/core/messagebundle_hr.properties +22 -45
  237. package/src/sap/fe/core/messagebundle_hu.properties +22 -45
  238. package/src/sap/fe/core/messagebundle_id.properties +22 -45
  239. package/src/sap/fe/core/messagebundle_it.properties +22 -45
  240. package/src/sap/fe/core/messagebundle_iw.properties +22 -45
  241. package/src/sap/fe/core/messagebundle_ja.properties +22 -45
  242. package/src/sap/fe/core/messagebundle_kk.properties +22 -45
  243. package/src/sap/fe/core/messagebundle_ko.properties +27 -50
  244. package/src/sap/fe/core/messagebundle_lt.properties +22 -45
  245. package/src/sap/fe/core/messagebundle_lv.properties +22 -45
  246. package/src/sap/fe/core/messagebundle_ms.properties +22 -45
  247. package/src/sap/fe/core/messagebundle_nl.properties +24 -47
  248. package/src/sap/fe/core/messagebundle_no.properties +22 -45
  249. package/src/sap/fe/core/messagebundle_pl.properties +23 -46
  250. package/src/sap/fe/core/messagebundle_pt.properties +23 -46
  251. package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -45
  252. package/src/sap/fe/core/messagebundle_ro.properties +22 -45
  253. package/src/sap/fe/core/messagebundle_ru.properties +22 -45
  254. package/src/sap/fe/core/messagebundle_sh.properties +22 -45
  255. package/src/sap/fe/core/messagebundle_sk.properties +22 -45
  256. package/src/sap/fe/core/messagebundle_sl.properties +22 -45
  257. package/src/sap/fe/core/messagebundle_sv.properties +22 -45
  258. package/src/sap/fe/core/messagebundle_th.properties +20 -43
  259. package/src/sap/fe/core/messagebundle_tr.properties +22 -45
  260. package/src/sap/fe/core/messagebundle_uk.properties +22 -45
  261. package/src/sap/fe/core/messagebundle_vi.properties +22 -45
  262. package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -45
  263. package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -45
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +102 -74
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +62 -63
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
  268. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -8
  269. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -7
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ShellServicesFactory.js +22 -2
  273. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -0
  274. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +2 -2
  276. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +251 -200
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +160 -144
  278. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  279. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  280. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  281. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  282. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  285. package/src/sap/fe/core/templating/CommonFormatters.js +4 -3
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +5 -1
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  288. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  289. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -1
  290. package/src/sap/fe/core/templating/DataModelPathHelper.ts +5 -2
  291. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  292. package/src/sap/fe/core/templating/EntitySetHelper.js +4 -5
  293. package/src/sap/fe/core/templating/EntitySetHelper.ts +4 -3
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  295. package/src/sap/fe/core/templating/FilterHelper.js +34 -15
  296. package/src/sap/fe/core/templating/FilterHelper.ts +28 -12
  297. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  298. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  299. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  300. package/src/sap/fe/core/templating/UIFormatters.js +5 -3
  301. package/src/sap/fe/core/templating/UIFormatters.ts +7 -5
  302. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  303. package/src/sap/fe/core/type/Email.js +2 -2
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters"], function (Log, CommonUtils, BindingToolkit, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldHelper", "sap/fe/macros/field/FieldTemplating", "sap/fe/macros/table/TableHelper", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters", "./SideEffectsHelper"], function (Log, CommonUtils, BindingToolkit, FELibrary, DataModelPathHelper, PropertyHelper, FieldHelper, FieldTemplating, TableHelper, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters, SideEffectsHelper) {
6
6
  "use strict";
7
7
 
8
8
  var isCollectionField = UIFormatters.isCollectionField;
@@ -27,6 +27,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
27
27
  var constant = BindingToolkit.constant;
28
28
  var compileExpression = BindingToolkit.compileExpression;
29
29
 
30
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
31
+
32
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
33
+
34
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
35
+
36
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
37
+
30
38
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
31
39
 
32
40
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -273,8 +281,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
273
281
  var editModeValues = Object.keys(EditMode);
274
282
  var editModeIsStatic = !!expBinding && editModeValues.includes(expBinding);
275
283
  var editable = !!expBinding && (editModeIsStatic && expBinding === EditMode.Editable || !editModeIsStatic);
284
+ var navPropertyWithValueHelp = sDataPropertyPath.includes("/") && bValueHelpEnabled;
276
285
 
277
- if (!editable) {
286
+ if (!editable || navPropertyWithValueHelp) {
278
287
  return;
279
288
  }
280
289
 
@@ -336,7 +345,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
336
345
  "massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
337
346
  "applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
338
347
  "useValueHelpValue": "< Use Value Help >",
339
- "cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT"),
348
+ "cancelButtonText": oResourceBundle.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
340
349
  "noFields": oResourceBundle.getText("C_MASS_EDIT_NO_EDITABLE_FIELDS"),
341
350
  "okButtonText": oResourceBundle.getText("C_COMMON_DIALOG_OK")
342
351
  };
@@ -588,6 +597,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
588
597
  var aValues = [];
589
598
  var aUnitData = [];
590
599
  var aResults = [];
600
+ var textPaths = [];
591
601
  var aReadOnlyFieldInfo = [];
592
602
  var oData = {
593
603
  "values": aValues,
@@ -595,6 +605,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
595
605
  "results": aResults,
596
606
  "readablePropertyData": aReadOnlyFieldInfo,
597
607
  "selectedKey": undefined,
608
+ "textPaths": textPaths,
598
609
  "noFields": oDefaultValues.noFields
599
610
  };
600
611
  var oDialogDataModel = new JSONModel(oData);
@@ -718,6 +729,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
718
729
  dialogContext.setProperty(oInData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
719
730
  }
720
731
  }
732
+
733
+ textPaths[oInData.dataProperty] = oInData.descriptionPath ? [oInData.descriptionPath] : [];
721
734
  });
722
735
  aDataArray.forEach(function (oInData) {
723
736
  var values = {};
@@ -837,6 +850,332 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
837
850
  var fieldsInfoModel = source.getModel("fieldsInfo");
838
851
  fieldsInfoModel.setProperty("/isOpen", true);
839
852
  },
853
+ closeDialog: function (oDialog) {
854
+ oDialog.close();
855
+ oDialog.destroy();
856
+ },
857
+ messageHandlingForMassEdit: function (oTable, aContexts, oController, oInDialog, aResults, errorValues) {
858
+ var subtitleColumn = CommonUtils.getMessageColumn(oTable);
859
+ var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
860
+ var boundTransitionErrorContexts = [],
861
+ oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
862
+ var DraftStatus = FELibrary.DraftStatus;
863
+ messages.forEach(function (message) {
864
+ var messageTargets = message.getTargets();
865
+
866
+ if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
867
+ var _boundTransitionError;
868
+
869
+ var boundTransitionErrorContext = aContexts.find(function (oContext) {
870
+ return message.getTarget().indexOf(oContext.getPath()) !== -1;
871
+ });
872
+ boundTransitionErrorContexts.push(boundTransitionErrorContext);
873
+ message.additionalText = boundTransitionErrorContext ? (_boundTransitionError = boundTransitionErrorContext.getObject()) === null || _boundTransitionError === void 0 ? void 0 : _boundTransitionError[subtitleColumn] : undefined;
874
+ }
875
+ });
876
+
877
+ if (aResults.length > 0 && boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
878
+ oController._editFlow.setDraftStatus(DraftStatus.Saved);
879
+
880
+ var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
881
+ MessageToast.show(successToast);
882
+ } else if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
883
+ oController._editFlow.setDraftStatus(DraftStatus.Saved);
884
+ } else if (errorValues.length + boundTransitionErrorContexts.length === oTable.getSelectedContexts().length) {
885
+ oController._editFlow.setDraftStatus(DraftStatus.Clear);
886
+ }
887
+
888
+ oController._editFlow.getMessageHandler().showMessages();
889
+
890
+ if (oInDialog.isOpen()) {
891
+ var _oController$getView, _oController$getView$;
892
+
893
+ MassEditHelper.closeDialog(oInDialog);
894
+ (_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("skipPatchHandlers", false);
895
+ }
896
+ },
897
+
898
+ /**
899
+ * This function generates side effects map from side effects ids(which is a combination of entity type and qualifier).
900
+ *
901
+ * @param oEntitySetContext
902
+ * @param aSideEffects
903
+ * @param oController
904
+ * @param aResults
905
+ * @returns Side effect map with data.
906
+ */
907
+ getSideEffectDataForKey: function (oEntitySetContext, aSideEffects, oController, aResults) {
908
+ var sOwnerEntityType = oEntitySetContext.getProperty("$Type");
909
+ var baseSideEffectsMapArray = {};
910
+ aResults.forEach(function (result) {
911
+ var sPath = result.keyValue;
912
+ var sideEffectsArray = FieldHelper.getSideEffectsOnEntityAndProperty(sPath, sOwnerEntityType, aSideEffects);
913
+ baseSideEffectsMapArray[sPath] = oController._sideEffects.generateSideEffectsMapFromSideEffectId(sideEffectsArray);
914
+ });
915
+ return baseSideEffectsMapArray;
916
+ },
917
+
918
+ /**
919
+ * Give the entity type for a given spath for e.g.RequestedQuantity.
920
+ *
921
+ * @param sPath
922
+ * @param sEntityType
923
+ * @param oMetaModel
924
+ * @returns Object having entity, spath and navigation path.
925
+ */
926
+ fnGetPathForSourceProperty: function (sPath, sEntityType, oMetaModel) {
927
+ // if the property path has a navigation, get the target entity type of the navigation
928
+ var sNavigationPath = sPath.indexOf("/") > 0 ? "/" + sEntityType + "/" + sPath.substr(0, sPath.lastIndexOf("/") + 1) + "@sapui.name" : false,
929
+ pOwnerEntity = !sNavigationPath ? Promise.resolve(sEntityType) : oMetaModel.requestObject(sNavigationPath);
930
+ sPath = sNavigationPath ? sPath.substr(sPath.lastIndexOf("/") + 1) : sPath;
931
+ return {
932
+ sPath: sPath,
933
+ pOwnerEntity: pOwnerEntity,
934
+ sNavigationPath: sNavigationPath
935
+ };
936
+ },
937
+ fnGetEntityTypeOfOwner: function (oMetaModel, baseNavPath, oEntitySetContext, targetEntity, aTargets) {
938
+ var ownerEntityType = oEntitySetContext.getProperty("$Type");
939
+
940
+ var _oMetaModel$getObject = oMetaModel.getObject("".concat(oEntitySetContext, "/").concat(baseNavPath)),
941
+ pOwner = _oMetaModel$getObject["$Type"],
942
+ ownerNavPath = _oMetaModel$getObject["$Partner"]; // nav path
943
+
944
+
945
+ if (ownerNavPath) {
946
+ var entityObjOfOwnerPartner = oMetaModel.getObject("/".concat(pOwner, "/").concat(ownerNavPath));
947
+
948
+ if (entityObjOfOwnerPartner) {
949
+ var entityTypeOfOwnerPartner = entityObjOfOwnerPartner["$Type"]; // if the entity types defer, then base nav path is not from owner
950
+
951
+ if (entityTypeOfOwnerPartner !== ownerEntityType) {
952
+ // if target Prop is not from owner, we add it as immediate
953
+ aTargets.push(targetEntity);
954
+ }
955
+ }
956
+ } else {
957
+ // if there is no $Partner attribute, it may not be from owner
958
+ aTargets.push(targetEntity);
959
+ }
960
+
961
+ return aTargets;
962
+ },
963
+
964
+ /**
965
+ * Give targets that are immediate or deferred based on the entity type of that target.
966
+ *
967
+ *
968
+ * @param sideEffectsData
969
+ * @param oEntitySetContext
970
+ * @param sEntityType
971
+ * @param oMetaModel
972
+ * @returns Targets to request side effects.
973
+ */
974
+ fnGetTargetsForMassEdit: function (sideEffectsData, oEntitySetContext, sEntityType, oMetaModel) {
975
+ var aTargetProperties = sideEffectsData.TargetProperties,
976
+ aTargetEntities = sideEffectsData.TargetEntities;
977
+ var aPromises = [];
978
+ var aTargets = [];
979
+ var ownerEntityType = oEntitySetContext.getProperty("$Type");
980
+
981
+ if (sEntityType === ownerEntityType) {
982
+ // if SalesOrdr Item
983
+ aTargetEntities === null || aTargetEntities === void 0 ? void 0 : aTargetEntities.forEach(function (targetEntity) {
984
+ targetEntity = targetEntity["$NavigationPropertyPath"];
985
+ var baseNavPath;
986
+
987
+ if (targetEntity.includes("/")) {
988
+ baseNavPath = targetEntity.split("/")[0];
989
+ } else {
990
+ baseNavPath = targetEntity;
991
+ }
992
+
993
+ aTargets = MassEditHelper.fnGetEntityTypeOfOwner(oMetaModel, baseNavPath, oEntitySetContext, targetEntity, aTargets);
994
+ });
995
+ }
996
+
997
+ if (aTargetProperties.length) {
998
+ aTargetProperties.forEach(function (targetProp) {
999
+ var _MassEditHelper$fnGet = MassEditHelper.fnGetPathForSourceProperty(targetProp, sEntityType, oMetaModel),
1000
+ pOwnerEntity = _MassEditHelper$fnGet.pOwnerEntity;
1001
+
1002
+ aPromises.push(pOwnerEntity.then(function (resultEntity) {
1003
+ // if entity is SalesOrderItem, Target Property is from Items table
1004
+ if (resultEntity === ownerEntityType) {
1005
+ aTargets.push(targetProp); // get immediate targets
1006
+ } else if (targetProp.includes("/")) {
1007
+ var baseNavPath = targetProp.split("/")[0];
1008
+ aTargets = MassEditHelper.fnGetEntityTypeOfOwner(oMetaModel, baseNavPath, oEntitySetContext, targetProp, aTargets);
1009
+ }
1010
+
1011
+ return Promise.resolve(aTargets);
1012
+ }));
1013
+ });
1014
+ } else {
1015
+ aPromises.push(Promise.resolve(aTargets));
1016
+ }
1017
+
1018
+ return Promise.all(aPromises);
1019
+ },
1020
+
1021
+ /**
1022
+ * Upon updating the field, array of immediate and deferred side effects for that field are created.
1023
+ * If there are any failed side effects for that context, they will also be used to generate the map.
1024
+ * If the field has text associated with it, then add it to request side effects.
1025
+ *
1026
+ * @param mParams
1027
+ * @param mParams.oController Controller
1028
+ * @param mParams.oFieldPromise Promise to update field
1029
+ * @param mParams.sideEffectMap SideEffectsMap for the field
1030
+ * @param mParams.textPaths TextPaths of the field if any
1031
+ * @param mParams.groupId Group Id to used to group requests
1032
+ * @param mParams.key KeyValue of the field
1033
+ * @param mParams.oEntitySetContext EntitySetcontext
1034
+ * @param mParams.oMetaModel Metamodel data
1035
+ * @param mParams.selectedContext Selected row context
1036
+ * @param mParams.deferredTargetsForAQualifiedName Deferred targets data
1037
+ * @returns Promise for all immediately requested side effects.
1038
+ */
1039
+ handleMassEditFieldUpdateAndRequestSideEffects: function (mParams) {
1040
+ try {
1041
+ var _ret = function () {
1042
+ var oController = mParams.oController,
1043
+ oFieldPromise = mParams.oFieldPromise,
1044
+ sideEffectsMap = mParams.sideEffectsMap,
1045
+ textPaths = mParams.textPaths,
1046
+ groupId = mParams.groupId,
1047
+ key = mParams.key,
1048
+ oEntitySetContext = mParams.oEntitySetContext,
1049
+ oMetaModel = mParams.oMetaModel,
1050
+ oSelectedContext = mParams.oSelectedContext,
1051
+ deferredTargetsForAQualifiedName = mParams.deferredTargetsForAQualifiedName;
1052
+ var immediateSideEffectsPromises = [oFieldPromise];
1053
+ var ownerEntityType = oEntitySetContext.getProperty("$Type");
1054
+ var oAppComponent = CommonUtils.getAppComponent(oController.getView());
1055
+ var oSideEffectsService = oAppComponent.getSideEffectsService();
1056
+
1057
+ if (sideEffectsMap) {
1058
+ var allEntityTypesWithQualifier = Object.keys(sideEffectsMap);
1059
+ var sideEffectsDataForField = Object.values(sideEffectsMap);
1060
+ var mVisitedSideEffects = {};
1061
+ deferredTargetsForAQualifiedName[key] = {};
1062
+
1063
+ var _iterator3 = _createForOfIteratorHelper(sideEffectsDataForField.entries()),
1064
+ _step3;
1065
+
1066
+ try {
1067
+ var _loop = function () {
1068
+ var _step3$value = _slicedToArray(_step3.value, 2),
1069
+ index = _step3$value[0],
1070
+ data = _step3$value[1];
1071
+
1072
+ var entityTypeWithQualifier = allEntityTypesWithQualifier[index];
1073
+ var sEntityType = entityTypeWithQualifier.split("#")[0];
1074
+
1075
+ var oContext = oController._sideEffects.getContextForSideEffects(oSelectedContext, sEntityType);
1076
+
1077
+ data.context = oContext;
1078
+
1079
+ var allFailedSideEffects = oController._sideEffects.getRegisteredFailedRequests();
1080
+
1081
+ var aFailedSideEffects = allFailedSideEffects[oContext.getPath()];
1082
+
1083
+ oController._sideEffects.deleteFailedRequestsForAContext(oContext);
1084
+
1085
+ var sideEffectsForCurrentContext = [data.sideEffects];
1086
+ sideEffectsForCurrentContext = aFailedSideEffects && aFailedSideEffects.length ? sideEffectsForCurrentContext.concat(aFailedSideEffects) : sideEffectsForCurrentContext;
1087
+ mVisitedSideEffects[oContext] = {};
1088
+
1089
+ var _iterator4 = _createForOfIteratorHelper(sideEffectsForCurrentContext),
1090
+ _step4;
1091
+
1092
+ try {
1093
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
1094
+ var aSideEffect = _step4.value;
1095
+
1096
+ if (!mVisitedSideEffects[oContext].hasOwnProperty(aSideEffect.fullyQualifiedName)) {
1097
+ (function () {
1098
+ mVisitedSideEffects[oContext][aSideEffect.fullyQualifiedName] = true;
1099
+ var aImmediateTargets = [],
1100
+ allTargets = [],
1101
+ triggerActionName = void 0;
1102
+
1103
+ var fnGetImmediateTargetsAndActions = function (mSideEffect) {
1104
+ try {
1105
+ var aTargetProperties = mSideEffect.TargetProperties,
1106
+ aTargetEntities = mSideEffect.TargetEntities;
1107
+ var sideEffectEntityType = mSideEffect.fullyQualifiedName.split("@")[0];
1108
+ return Promise.resolve(MassEditHelper.fnGetTargetsForMassEdit(mSideEffect, oEntitySetContext, sideEffectEntityType, oMetaModel)).then(function (targetsArrayForAllProperties) {
1109
+ aImmediateTargets = targetsArrayForAllProperties[0];
1110
+ allTargets = (aTargetProperties || []).concat(aTargetEntities || []);
1111
+ var actionName = mSideEffect.TriggerAction;
1112
+ var aDeferredTargets = allTargets.filter(function (target) {
1113
+ return !aImmediateTargets.includes(target);
1114
+ });
1115
+ deferredTargetsForAQualifiedName[key][mSideEffect.fullyQualifiedName] = {
1116
+ aTargets: aDeferredTargets,
1117
+ oContext: oContext,
1118
+ mSideEffect: mSideEffect
1119
+ }; // if entity is other than items table then action is defered
1120
+
1121
+ if (actionName && sideEffectEntityType === ownerEntityType) {
1122
+ // static action is on collection, so we defer it, else add to immediate requests array
1123
+ var isStaticAction = TableHelper._isStaticAction(oMetaModel.getObject("/".concat(actionName)), actionName);
1124
+
1125
+ if (!isStaticAction) {
1126
+ triggerActionName = actionName;
1127
+ } else {
1128
+ deferredTargetsForAQualifiedName[key][mSideEffect.fullyQualifiedName]["TriggerAction"] = actionName;
1129
+ }
1130
+ } else {
1131
+ deferredTargetsForAQualifiedName[key][mSideEffect.fullyQualifiedName]["TriggerAction"] = actionName;
1132
+ }
1133
+
1134
+ return {
1135
+ aTargets: aImmediateTargets,
1136
+ TriggerAction: triggerActionName
1137
+ };
1138
+ });
1139
+ } catch (e) {
1140
+ return Promise.reject(e);
1141
+ }
1142
+ };
1143
+
1144
+ immediateSideEffectsPromises.push(oController._sideEffects.requestSideEffects(aSideEffect, oContext, groupId, fnGetImmediateTargetsAndActions));
1145
+ })();
1146
+ }
1147
+ }
1148
+ } catch (err) {
1149
+ _iterator4.e(err);
1150
+ } finally {
1151
+ _iterator4.f();
1152
+ }
1153
+ };
1154
+
1155
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
1156
+ _loop();
1157
+ }
1158
+ } catch (err) {
1159
+ _iterator3.e(err);
1160
+ } finally {
1161
+ _iterator3.f();
1162
+ }
1163
+ }
1164
+
1165
+ if (textPaths !== null && textPaths !== void 0 && textPaths[key] && textPaths[key].length) {
1166
+ immediateSideEffectsPromises.push(oSideEffectsService.requestSideEffects(textPaths[key], oSelectedContext, groupId));
1167
+ }
1168
+
1169
+ return {
1170
+ v: Promise.resolve(Promise.allSettled(immediateSideEffectsPromises))
1171
+ };
1172
+ }();
1173
+
1174
+ if (typeof _ret === "object") return _ret.v;
1175
+ } catch (e) {
1176
+ return Promise.reject(e);
1177
+ }
1178
+ },
840
1179
 
841
1180
  /**
842
1181
  * Create the mass edit dialog.
@@ -847,16 +1186,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
847
1186
  * @returns Promise returning instance of dialog.
848
1187
  */
849
1188
  createDialog: function (oTable, aContexts, oController) {
850
- var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
851
- aDataArray = [],
852
- oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
853
- oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
854
- oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
855
- dialogContext = MassEditHelper.getDialogContext(oTable),
856
- oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext);
857
- return new Promise(function (resolve, reject) {
1189
+ try {
1190
+ var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
1191
+ aDataArray = [],
1192
+ oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
1193
+ oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
1194
+ oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
1195
+ dialogContext = MassEditHelper.getDialogContext(oTable),
1196
+ oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext);
858
1197
  var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
859
- return Promise.resolve(XMLPreprocessor.process(oFragment, {
1198
+ return Promise.resolve(Promise.resolve(XMLPreprocessor.process(oFragment, {
860
1199
  name: sFragmentName
861
1200
  }, {
862
1201
  bindingContexts: {
@@ -865,11 +1204,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
865
1204
  models: {
866
1205
  dataFieldModel: oDataFieldModel
867
1206
  }
868
- })).then(function (oCreatedFragment) {
869
- return Fragment.load({
1207
+ }))).then(function (oCreatedFragment) {
1208
+ return Promise.resolve(Fragment.load({
870
1209
  definition: oCreatedFragment
871
- }).then(function (oDialogContent) {
872
- var DraftStatus = FELibrary.DraftStatus;
1210
+ })).then(function (oDialogContent) {
873
1211
  var oDialog = new Dialog({
874
1212
  resizable: true,
875
1213
  title: oDefaultValues.massEditTitle,
@@ -879,90 +1217,127 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
879
1217
  text: MassEditHelper.helpers.getExpBindingForApplyButtonTxt(oDefaultValues, oDataFieldModel.getObject("/")),
880
1218
  type: "Emphasized",
881
1219
  press: function (oEvent) {
882
- var _oController$getView, _oController$getView$;
1220
+ try {
1221
+ var _oController$getView2, _oController$getView3;
1222
+
1223
+ (_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", true);
1224
+ var oInDialog = oEvent.getSource().getParent();
1225
+ var oModel = oInDialog.getModel("fieldsInfo");
1226
+ var aResults = oModel.getProperty("/results");
1227
+ var oMetaModel = oTable && oTable.getModel().getMetaModel(),
1228
+ sCurrentEntitySetName = oTable.data("metaPath"),
1229
+ oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName);
1230
+ return Promise.resolve(SideEffectsHelper.generateSideEffectsMapFromMetaModel(oMetaModel)).then(function (aSideEffects) {
1231
+ var errorValues = [];
1232
+ var textPaths = oModel.getProperty("/textPaths");
1233
+ var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
1234
+ var groupId;
1235
+ var allSideEffects;
1236
+ var massEditPromises = [];
1237
+ var failedFieldsData = {};
1238
+ var selectedRowsLength = aContexts.length;
1239
+ var deferredTargetsForAQualifiedName = {};
1240
+ var baseSideEffectsMapArray = MassEditHelper.getSideEffectDataForKey(oEntitySetContext, aSideEffects, oController, aResults);
1241
+ aContexts.forEach(function (oSelectedContext, idx) {
1242
+ allSideEffects = [];
1243
+ aResults.forEach(function (oResult) {
1244
+ try {
1245
+ if (!failedFieldsData.hasOwnProperty(oResult.keyValue)) {
1246
+ failedFieldsData[oResult.keyValue] = 0;
1247
+ } //TODO - Add save implementation for Value Help.
1248
+
1249
+
1250
+ if (baseSideEffectsMapArray[oResult.keyValue]) {
1251
+ allSideEffects[oResult.keyValue] = baseSideEffectsMapArray[oResult.keyValue];
1252
+ }
883
1253
 
884
- (_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("skipPatchHandlers", true);
885
- var oInDialog = oEvent.getSource().getParent();
886
- var oModel = oInDialog.getModel("fieldsInfo");
887
- var aResults = oModel.getProperty("/results");
888
- var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
889
- var changePromise = [];
890
- var bReadOnlyField = false;
891
- var groupId; //let index = 0;
892
-
893
- var errorValues = [];
894
- aContexts.forEach(function (oSelectedContext, idx) {
895
- aResults.forEach(function (oResult) {
896
- //TODO - Add save implementation for Value Help.
897
- if (aPropertyReadableInfo) {
898
- bReadOnlyField = aPropertyReadableInfo.some(function (oPropertyInfo) {
899
- if (oResult.keyValue === oPropertyInfo.property) {
900
- if (oPropertyInfo.type === "Default") {
901
- return oPropertyInfo.value === true;
902
- } else if (oPropertyInfo.type === "Path" && oPropertyInfo.propertyValue && oPropertyInfo.propertyPath) {
903
- return oSelectedContext.getObject(oPropertyInfo.propertyPath) === oPropertyInfo.propertyValue;
1254
+ if (aPropertyReadableInfo) {
1255
+ aPropertyReadableInfo.some(function (oPropertyInfo) {
1256
+ if (oResult.keyValue === oPropertyInfo.property) {
1257
+ if (oPropertyInfo.type === "Default") {
1258
+ return oPropertyInfo.value === true;
1259
+ } else if (oPropertyInfo.type === "Path" && oPropertyInfo.propertyValue && oPropertyInfo.propertyPath) {
1260
+ return oSelectedContext.getObject(oPropertyInfo.propertyPath) === oPropertyInfo.propertyValue;
1261
+ }
1262
+ }
1263
+ });
904
1264
  }
1265
+
1266
+ groupId = "$auto.".concat(idx);
1267
+ var oFieldPromise = oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).catch(function (oError) {
1268
+ errorValues.push(oSelectedContext.getObject());
1269
+ Log.error("Mass Edit: Something went wrong in updating entries.", oError);
1270
+ failedFieldsData[oResult.keyValue] = failedFieldsData[oResult.keyValue] + 1;
1271
+ return Promise.reject({
1272
+ isFieldUpdateFailed: true
1273
+ });
1274
+ });
1275
+ var dataToUpdateFieldAndSideEffects = {
1276
+ oController: oController,
1277
+ oFieldPromise: oFieldPromise,
1278
+ sideEffectsMap: baseSideEffectsMapArray[oResult.keyValue],
1279
+ textPaths: textPaths,
1280
+ groupId: groupId,
1281
+ key: oResult.keyValue,
1282
+ oEntitySetContext: oEntitySetContext,
1283
+ oMetaModel: oMetaModel,
1284
+ oSelectedContext: oSelectedContext,
1285
+ deferredTargetsForAQualifiedName: deferredTargetsForAQualifiedName
1286
+ };
1287
+ massEditPromises.push(MassEditHelper.handleMassEditFieldUpdateAndRequestSideEffects(dataToUpdateFieldAndSideEffects));
1288
+ return Promise.resolve();
1289
+ } catch (e) {
1290
+ return Promise.reject(e);
905
1291
  }
906
1292
  });
907
- }
908
-
909
- groupId = "$auto.".concat(idx); //index += 1;
910
-
911
- oController._editFlow.setDraftStatus(DraftStatus.Saving); //let promiseCount = 0;
912
-
913
-
914
- if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
915
- changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).then(function () {
916
- return oSelectedContext;
917
- }).catch(function (oError) {
918
- errorValues.push(oSelectedContext.getObject());
919
- Log.error("Mass Edit: Something went wrong in updating entries.", oError);
920
- }));
921
- }
922
- });
923
- }); // eslint-disable-next-line promise/catch-or-return
924
-
925
- Promise.allSettled(changePromise).then(function () {
926
- var oListBinding = oTable.getRowBinding();
927
- var oExtensionAPI = oController && oController.getExtensionAPI();
928
- return oExtensionAPI.refresh(oListBinding.getPath()).then(function () {
929
- var subtitleColumn = CommonUtils.getMessageColumn(oTable);
930
- var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
931
- var boundTransitionErrorContexts = [];
932
- messages.forEach(function (message) {
933
- var messageTargets = message.getTargets();
934
-
935
- if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
936
- var boundTransitionErrorContext = aContexts.find(function (oContext) {
937
- return message.getTarget().indexOf(oContext.getPath()) !== -1;
1293
+ });
1294
+ return Promise.resolve(Promise.allSettled(massEditPromises).then(function () {
1295
+ try {
1296
+ groupId = "$auto.massEditDeferred";
1297
+ var deferredRequests = [];
1298
+ var sideEffectsDataForAllKeys = Object.values(deferredTargetsForAQualifiedName);
1299
+ var keysWithSideEffects = Object.keys(deferredTargetsForAQualifiedName);
1300
+ sideEffectsDataForAllKeys.forEach(function (aSideEffect, index) {
1301
+ var currentKey = keysWithSideEffects[index];
1302
+
1303
+ if (failedFieldsData[currentKey] !== selectedRowsLength) {
1304
+ var deferredSideEffectsData = Object.values(aSideEffect);
1305
+ deferredSideEffectsData.forEach(function (req) {
1306
+ var aTargets = req.aTargets,
1307
+ oContext = req.oContext,
1308
+ TriggerAction = req.TriggerAction,
1309
+ mSideEffect = req.mSideEffect;
1310
+
1311
+ var fnGetDeferredTargets = function () {
1312
+ return aTargets;
1313
+ };
1314
+
1315
+ var fnGetDeferredTargetsAndActions = function () {
1316
+ return {
1317
+ aTargets: fnGetDeferredTargets(),
1318
+ TriggerAction: TriggerAction
1319
+ };
1320
+ };
1321
+
1322
+ deferredRequests.push( // if some deferred is rejected, it will be add to failed queue
1323
+ oController._sideEffects.requestSideEffects(mSideEffect, oContext, groupId, fnGetDeferredTargetsAndActions));
1324
+ });
1325
+ }
938
1326
  });
939
- boundTransitionErrorContexts.push(boundTransitionErrorContext);
940
- message.additionalText = boundTransitionErrorContext ? boundTransitionErrorContext.getObject()[subtitleColumn] : undefined;
1327
+ return Promise.resolve();
1328
+ } catch (e) {
1329
+ return Promise.reject(e);
941
1330
  }
942
- });
943
-
944
- if (aResults.length > 0 && boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
945
- oController._editFlow.setDraftStatus(DraftStatus.Saved);
946
-
947
- var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
948
- MessageToast.show(successToast);
949
- } else if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
950
- oController._editFlow.setDraftStatus(DraftStatus.Saved);
951
- } else if (errorValues.length + boundTransitionErrorContexts.length === oTable.getSelectedContexts().length) {
952
- oController._editFlow.setDraftStatus(DraftStatus.Clear);
953
- }
954
-
955
- oController._editFlow.getMessageHandler().showMessages();
956
-
957
- if (oInDialog.isOpen()) {
958
- var _oController$getView2, _oController$getView3;
959
-
960
- oInDialog.close();
961
- oInDialog.destroy();
962
- (_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", false);
963
- }
1331
+ }).then(function () {
1332
+ MassEditHelper.messageHandlingForMassEdit(oTable, aContexts, oController, oInDialog, aResults, errorValues);
1333
+ }).catch(function (e) {
1334
+ MassEditHelper.closeDialog(oDialog);
1335
+ return Promise.reject(e);
1336
+ })).then(function () {});
964
1337
  });
965
- });
1338
+ } catch (e) {
1339
+ return Promise.reject(e);
1340
+ }
966
1341
  }
967
1342
  }),
968
1343
  endButton: new Button({
@@ -970,8 +1345,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
970
1345
  visible: MassEditHelper.helpers.hasEditableFieldsBinding(oDataFieldModel.getObject("/"), true),
971
1346
  press: function (oEvent) {
972
1347
  var oInDialog = oEvent.getSource().getParent();
973
- oInDialog.close();
974
- oInDialog.destroy();
1348
+ MassEditHelper.closeDialog(oInDialog);
975
1349
  }
976
1350
  })
977
1351
  });
@@ -979,10 +1353,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
979
1353
  oDialog.setModel(oDialogDataModel, "fieldsInfo");
980
1354
  oDialog.setModel(model);
981
1355
  oDialog.setBindingContext(dialogContext);
982
- resolve(oDialog);
1356
+ return oDialog;
983
1357
  });
984
- }).catch(reject);
985
- });
1358
+ });
1359
+ } catch (e) {
1360
+ return Promise.reject(e);
1361
+ }
986
1362
  },
987
1363
  helpers: {
988
1364
  getBindingExpForHasEditableFields: function (fields, editable) {
@@ -1003,4 +1379,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/B
1003
1379
  };
1004
1380
  return MassEditHelper;
1005
1381
  }, false);
1006
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsImhhc1ZhbHVlSGVscCIsImhhc0N1cnJlbmN5IiwiaGFzVW5pdCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwidW5pdFByb3BlcnR5SW5mbyIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCIsImV4cEJpbmRpbmciLCJnZXRFZGl0TW9kZSIsImNvbnN0YW50IiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5Iiwic0lucHV0VHlwZSIsImJQcm9wZXJ0eVJlcXVpcmVkIiwiaXNGaWVsZFJlcXVpcmVkIiwic1N1ZmZpeEZvcktlZXBFeGlzdGluZyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0T3B0aW9uc0V4aXN0Iiwic2VsZWN0T3B0aW9ucyIsImtlZXBFbnRyeSIsInRleHQiLCJrZWVwRXhpc3RpbmdQcmVmaXgiLCJrZXkiLCJmYWxzZUVudHJ5IiwidGV4dEluZm8iLCJ0cnV0aHlFbnRyeSIsInVuc2hpZnQiLCJpc1ZhbHVlSGVscEVuYWJsZWQiLCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwidmhkRW50cnkiLCJ1c2VWYWx1ZUhlbHBWYWx1ZSIsImNsZWFyRW50cnkiLCJjbGVhckZpZWxkVmFsdWUiLCJlbXB0eUVudHJ5IiwibGVhdmVCbGFua1ZhbHVlIiwiZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyIsInNlbGVjdGVkQ29udGV4dCIsImRlc2NyaXB0aW9uVmFsdWUiLCJmdWxsVGV4dCIsIkxvZyIsImluZm8iLCJpc0VkaXRhYmxlIiwiYW55IiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwib25Db250ZXh0RWRpdGFibGVDaGFuZ2UiLCJvRGlhbG9nRGF0YU1vZGVsIiwib2JqZWN0c0ZvclZpc2liaWxpdHkiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwidXBkYXRlT25Db250ZXh0Q2hhbmdlIiwibU9Ub1VzZSIsInZhbHVlcyIsImF0dGFjaENoYW5nZSIsImJpbmQiLCJnZXRCb3VuZE9iamVjdCIsIkFueSIsIm1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEZpZWxkVmlzaWJsaXR5IiwiaXNDb250ZXh0RWRpdGFibGUiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImRpYWxvZ0NvbnRleHQiLCJhVW5pdERhdGEiLCJhUmVzdWx0cyIsImFSZWFkT25seUZpZWxkSW5mbyIsIm9EYXRhIiwibm9GaWVsZHMiLCJvSW5EYXRhIiwib1RleHRJbmZvIiwic1Byb3BlcnR5S2V5Iiwic1VuaXRQcm9wZXJ0eU5hbWUiLCJvRGlzdGluY3RWYWx1ZU1hcCIsIm9EaXN0aW5jdFVuaXRNYXAiLCJzTXVsdGlMZXZlbFBhdGhWYWx1ZSIsImRpc3BsYXkiLCJ2YWx1ZVBhdGgiLCJlbnRyeSIsInVuaXRFbnRyeSIsInNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSIsInNlbGVjdGVkS2V5IiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJvcGVyYW5kcyIsIm9wZXJhbmQxIiwib3BlcmFuZDIiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiZWRpdE1vZGUiLCJ2aXNpYmxlIiwiZ2V0RGlhbG9nQ29udGV4dCIsInRhYmxlIiwiZGlhbG9nIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImxpc3RCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJvbkRpYWxvZ09wZW4iLCJldmVudCIsInNvdXJjZSIsImdldFNvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsImNyZWF0ZURpYWxvZyIsIm9Db250cm9sbGVyIiwic0ZyYWdtZW50TmFtZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImJpbmRpbmdDb250ZXh0cyIsImRhdGFGaWVsZE1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJtb2RlbHMiLCJ0aGVuIiwib0NyZWF0ZWRGcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJvRGlhbG9nQ29udGVudCIsIkRyYWZ0U3RhdHVzIiwiRkVMaWJyYXJ5Iiwib0RpYWxvZyIsIkRpYWxvZyIsInJlc2l6YWJsZSIsInRpdGxlIiwibWFzc0VkaXRUaXRsZSIsImNvbnRlbnQiLCJhZnRlck9wZW4iLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsImhlbHBlcnMiLCJnZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQiLCJwcmVzcyIsIm9FdmVudCIsImdldFZpZXciLCJvSW5EaWFsb2ciLCJvTW9kZWwiLCJhUHJvcGVydHlSZWFkYWJsZUluZm8iLCJjaGFuZ2VQcm9taXNlIiwiYlJlYWRPbmx5RmllbGQiLCJncm91cElkIiwiZXJyb3JWYWx1ZXMiLCJpZHgiLCJrZXlWYWx1ZSIsIl9lZGl0RmxvdyIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY2F0Y2giLCJvRXJyb3IiLCJlcnJvciIsImFsbFNldHRsZWQiLCJvTGlzdEJpbmRpbmciLCJvRXh0ZW5zaW9uQVBJIiwiZ2V0RXh0ZW5zaW9uQVBJIiwicmVmcmVzaCIsInN1YnRpdGxlQ29sdW1uIiwiZ2V0TWVzc2FnZUNvbHVtbiIsIm1lc3NhZ2VzIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cyIsIm1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0cyIsImdldFRhcmdldHMiLCJwZXJzaXN0ZW50IiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0IiwiZmluZCIsImdldFRhcmdldCIsImFkZGl0aW9uYWxUZXh0IiwiU2F2ZWQiLCJzdWNjZXNzVG9hc3QiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkNsZWFyIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZXMiLCJpc09wZW4iLCJjbG9zZSIsImRlc3Ryb3kiLCJlbmRCdXR0b24iLCJjYW5jZWxCdXR0b25UZXh0IiwiaGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nIiwiZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzIiwiZmllbGRzIiwidG90YWxFeHAiLCJyZWR1Y2UiLCJleHByZXNzaW9uIiwiZmllbGQiLCJvciIsInBhdGhJbk1vZGVsIiwibm90IiwiZGVmYXVsdFZhbHVlcyIsImVkaXRhYmxlRXhwIiwiaWZFbHNlIiwiYXBwbHlCdXR0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QUFFLFVBQUNFLE1BQUQsRUFBYy9OLFFBQWQsRUFBb0M7QUFDN0QsZUFBTzRPLGlCQUFpQixDQUFDOVcsY0FBYyxDQUFDdVMsT0FBZixDQUF1QnlELGlDQUF2QixDQUF5REMsTUFBekQsRUFBaUUvTixRQUFqRSxDQUFELENBQXhCO0FBQ0E7QUFyQk87QUExOUJhLEdBQXZCO1NBbS9CZWxJLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc0N1cnJlbmN5LFxuXHRoYXNVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvRmllbGQubWV0YWRhdGFcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vY29udHJvbHMvQW55XCI7XG5pbXBvcnQgQW55IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5cbi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGZvciBtYXNzIGVkaXQgZnVuY3Rpb25hbGl0eSAqL1xudHlwZSBUZXh0QXJyYW5nZW1lbnRJbmZvID0ge1xuXHR0ZXh0QXJyYW5nZW1lbnQ6IHN0cmluZztcblx0dmFsdWVQYXRoOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uUGF0aD86IHN0cmluZztcblx0dmFsdWU6IHN0cmluZztcblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0ZnVsbFRleHQ6IHN0cmluZztcbn07XG5cbnR5cGUgQmluZGluZ0luZm8gPSB7XG5cdHBhdGg/OiBzdHJpbmc7XG5cdG1vZGVsPzogc3RyaW5nIHwgb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogQXJyYXk8QmluZGluZ0luZm8+O1xufTtcblxuY29uc3QgTWFzc0VkaXRIZWxwZXIgPSB7XG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgdmFsdWUgYXQgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoIHdpdGggYSBibGFuayBhcnJheS5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHBvaW50aW5nIHRvIHRoZSBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIHBhdGhcblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIGFWYWx1ZXM6IGFueSAvKiwgdHJhbnNDdHg6IENvbnRleHQgKi8pIHtcblx0XHRsZXQgYUZpbmFsUGF0aDogYW55O1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgYVBhdGhzID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBzRnVsbFBhdGggPSBcIlwiO1xuXHRcdGFQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBgJHtzRnVsbFBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gO1xuXHRcdFx0XHRpZiAoc0Z1bGxQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0XHRhRmluYWxQYXRoID0gYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUZpbmFsUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB1bmlxdWUgdmFsdWVzIGZvciBnaXZlbiBhcnJheSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVmFsdWUgUHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSB2YWx1ZVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHNlbGY6IGFueVtdKSB7XG5cdFx0aWYgKHNWYWx1ZSAhPSB1bmRlZmluZWQgJiYgc1ZhbHVlICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBzZWxmLmluZGV4T2Yoc1ZhbHVlKSA9PT0gaW5kZXg7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBtdWx0aS1sZXZlbCBwYXRoIChmb3IgZXhhbXBsZTogX01hdGVyaWFscy9NYXRlcmlhbF9EZXRhaWxzIGdldHMgdGhlIHZhbHVlIG9mIE1hdGVyaWFsX0RldGFpbHMgdW5kZXIgX01hdGVyaWFscyBPYmplY3QpLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eVZhbHVlLCB3aGljaCBjYW4gYmUgb2YgYW55IHR5cGUgKHN0cmluZywgbnVtYmVyLCBldGMuLikuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRGF0YVByb3BlcnR5UGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBvVmFsdWVzIE9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXNcblx0ICogQHJldHVybnMgVGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqL1xuXHRnZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoOiBmdW5jdGlvbiAoc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFJlc3VsdCA9IG9WYWx1ZXMgJiYgb1ZhbHVlc1tzUGF0aF0gPyBvVmFsdWVzW3NQYXRoXSA6IFJlc3VsdCAmJiBSZXN1bHRbc1BhdGhdO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gUmVzdWx0O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUga2V5IHBhdGggZm9yIHRoZSBrZXkgb2YgYSBjb21ibyBib3ggdGhhdCBtdXN0IGJlIHNlbGVjdGVkIGluaXRpYWxseSB3aGVuIHRoZSBkaWFsb2cgb3BlbnM6XG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBkaWZmZXJlbnQsIHRoZW4gPCBLZWVwIEV4aXN0aW5nIFZhbHVlcyA+IGlzIHByZXNlbGVjdGVkLlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgdGhlIHNhbWUsIHRoZW4gdGhlIHByb3BlcnR5VmFsdWUgaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBlbXB0eSwgdGhlbiA8IExlYXZlIEJsYW5rID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gc0RhdGFQcm9wZXJ0eVBhdGggRGF0YSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBrZXkgcGF0aFxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9TZWxlY3RlZENvbnRleHQgPSBhQ29udGV4dHMsXG5cdFx0XHRcdGFQcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdG9TZWxlY3RlZENvbnRleHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24gPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgJiYgb0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzBdKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0ICYmIChvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aCkgfHwgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVZhbHVlcy5wdXNoKG9Db250ZXh0LmdldE9iamVjdChzRGF0YVByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFVbmlxdWVQcm9wZXJ0eVZhbHVlcyA9IGFQcm9wZXJ0eVZhbHVlcy5maWx0ZXIoTWFzc0VkaXRIZWxwZXIuZ2V0VW5pcXVlVmFsdWVzKTtcblx0XHRcdGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gYERlZmF1bHQvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBgRW1wdHkvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBgJHtzRGF0YVByb3BlcnR5UGF0aH0vJHthVW5pcXVlUHJvcGVydHlWYWx1ZXNbMF19YDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyBUaGUgaGlkZGVuIGFubm90YXRpb24gdmFsdWVcblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHBhdGggZm9yIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB0ZXh0QmluZGluZyBUZXh0IEJpbmRpbmcgSW5mb1xuXHQgKiBAcGFyYW0gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlXG5cdCAqIEByZXR1cm5zIFRleHQgUHJvcGVydHkgUGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldFRleHRQYXRoOiBmdW5jdGlvbiAocHJvcGVydHk6IHN0cmluZywgdGV4dEJpbmRpbmc6IGFueSwgZGlzcGxheU1vZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uUGF0aDtcblx0XHRpZiAodGV4dEJpbmRpbmcgJiYgKHRleHRCaW5kaW5nLnBhdGggfHwgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgdGV4dEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpKSAmJiBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHRleHRCaW5kaW5nLnBhdGggJiYgZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSB0ZXh0QmluZGluZy5wYXRoO1xuXHRcdFx0fSBlbHNlIGlmICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdHRleHRCaW5kaW5nLnBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvcHM6IEJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BzLnBhdGggJiYgcHJvcHMucGF0aCAhPT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHByb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2NyaXB0aW9uUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBKU09OIE1vZGVsIGZvciBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMgW2xhYmVsLCB2aXNpYmxpdHksIGRhdGFwcm9wZXJ0eSwgZXRjLl0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RlbFxuXHQgKi9cblx0cHJlcGFyZURhdGFGb3JEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSksXG5cdFx0XHRzQ3VycmVudEVudGl0eVNldE5hbWUgPSBvVGFibGUuZGF0YShcIm1ldGFQYXRoXCIpLFxuXHRcdFx0YVRhYmxlRmllbGRzID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGFibGVGaWVsZHMob1RhYmxlKSxcblx0XHRcdG9FbnRpdHlUeXBlQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9L0BgKSxcblx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDdXJyZW50RW50aXR5U2V0TmFtZSksXG5cdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRW50aXR5VHlwZUNvbnRleHQpO1xuXG5cdFx0Y29uc3Qgb0RhdGFGaWVsZE1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGxldCBvUmVzdWx0O1xuXHRcdGxldCBzTGFiZWxUZXh0O1xuXHRcdGxldCBiVmFsdWVIZWxwRW5hYmxlZDtcblx0XHRsZXQgc1VuaXRQcm9wZXJ0eVBhdGg7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdDtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXG5cdFx0YVRhYmxlRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHlQYXRoID0gb0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGxldCBvUHJvcGVydHlJbmZvID0gc0RhdGFQcm9wZXJ0eVBhdGggJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofUBgKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8ubGFiZWwgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiXSkgfHxcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRvUHJvcGVydHk6IGFueVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS5uYW1lID09PSBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3RbMF0gfHwge307XG5cdFx0XHRcdG9UZXh0QmluZGluZyA9IGdldFRleHRCaW5kaW5nKG9EYXRhTW9kZWxPYmplY3RQYXRoLCB7fSwgdHJ1ZSkgfHwge307XG5cdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQob0NvbHVtbkluZm8uYW5ub3RhdGlvblBhdGgpLFxuXHRcdFx0XHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQgPSBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvRmllbGRDb250ZXh0KSxcblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1AYCksXG5cdFx0XHRcdFx0b0ludGVyZmFjZSA9IG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRJbnRlcmZhY2UoKTtcblxuXHRcdFx0XHRsZXQgb0RhdGFNb2RlbFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ZpZWxkQ29udGV4dCwgb0VudGl0eVNldENvbnRleHQpO1xuXHRcdFx0XHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZD8uVmFsdWU/LnBhdGg/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKG9EYXRhTW9kZWxQYXRoLCBzRGF0YVByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkhpZGRlbkZpZWxkID1cblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRIaWRkZW5WYWx1ZUZvckNvbnRleHRzKFxuXHRcdFx0XHRcdFx0b0ZpZWxkQ29udGV4dCAmJiBvRmllbGRDb250ZXh0LmdldE9iamVjdCgpW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiXSxcblx0XHRcdFx0XHRcdGFDb250ZXh0c1xuXHRcdFx0XHRcdCkgfHwgZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzSW1hZ2UgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZVVSTFwiXTtcblxuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvSW50ZXJmYWNlLmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXRQYXRoOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHRvRGF0YUZpZWxkQ29udmVydGVkLl90eXBlID09PSBcIlByb3BlcnR5XCJcblx0XHRcdFx0XHRcdD8gb0RhdGFGaWVsZENvbnZlcnRlZFxuXHRcdFx0XHRcdFx0OiAob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHRcdCAgKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQuJHRhcmdldCk7XG5cdFx0XHRcdC8vIERhdGFmaWVsZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEZpZWxkQ29udHJvbCBjYWxjdWxhdGlvbiwgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWRcblxuXHRcdFx0XHRjb25zdCBjaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aW9uID0gISFvRGF0YUZpZWxkQ29udmVydGVkLkFjdGlvbjtcblx0XHRcdFx0Y29uc3QgaXNGaWVsZEdycCA9IE1hc3NFZGl0SGVscGVyLmdldElzRmllbGRHcnAob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cblx0XHRcdFx0aWYgKGlzSW1hZ2UgfHwgYkhpZGRlbkZpZWxkIHx8IGNoYXJ0UHJvcGVydHkgfHwgaXNBY3Rpb24gfHwgaXNGaWVsZEdycCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFZhbHVlSGVscCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID0gaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCA9XG5cdFx0XHRcdFx0KChoYXNDdXJyZW5jeShvUHJvcGVydHlJbmZvKSB8fCBoYXNVbml0KG9Qcm9wZXJ0eUluZm8pKSAmJiBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChvUHJvcGVydHlJbmZvKSkgfHwgXCJcIjtcblx0XHRcdFx0Y29uc3QgdW5pdFByb3BlcnR5SW5mbyA9IHNVbml0UHJvcGVydHlQYXRoICYmIGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA9IHVuaXRQcm9wZXJ0eUluZm8gJiYgaGFzVmFsdWVIZWxwKHVuaXRQcm9wZXJ0eUluZm8pO1xuXG5cdFx0XHRcdC8vIEVkaXRNb2RlIGFuZCBJbnB1dFR5cGVcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlGb3JGaWVsZENvbnRyb2wgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm8uVmFsdWUgPyBvUHJvcGVydHlJbmZvLlZhbHVlIDogb1Byb3BlcnR5SW5mbztcblx0XHRcdFx0Y29uc3QgZXhwQmluZGluZyA9IGdldEVkaXRNb2RlKHByb3BlcnR5Rm9yRmllbGRDb250cm9sLCBvRGF0YU1vZGVsUGF0aCwgZmFsc2UsIGZhbHNlLCBvRGF0YUZpZWxkQ29udmVydGVkLCBjb25zdGFudCh0cnVlKSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblxuXHRcdFx0XHRpZiAoIWVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoICYmICFzRGF0YVByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6XG5cdFx0XHRcdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiAhc1VuaXRQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpID8gYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFwiOiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c0RhdGFQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzVW5pdFByb3BlcnR5UGF0aCAmJiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c1VuaXRQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiOiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IE1hc3NFZGl0SGVscGVyLmdldFRleHRQYXRoKHNEYXRhUHJvcGVydHlQYXRoLCBvVGV4dEJpbmRpbmcsIGRpc3BsYXlNb2RlKSxcblx0XHRcdFx0XHRcdFwibnVsbGFibGVcIjogb1Byb3BlcnR5SW5mby5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gb1Byb3BlcnR5SW5mby5udWxsYWJsZSA6IHRydWUsXG5cdFx0XHRcdFx0XHRcImlzUHJvcGVydHlSZWFkT25seVwiOiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImlucHV0VHlwZVwiOiBpbnB1dFR5cGUsXG5cdFx0XHRcdFx0XHRcImVkaXRNb2RlXCI6IGVkaXRhYmxlID8gZXhwQmluZGluZyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFwidW5pdERhdGFQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoICYmIFwiZmllbGRzSW5mbz4vdW5pdERhdGEvXCIsXG5cdFx0XHRcdFx0XHRcInZhbHVlc1BhdGhcIjogXCJmaWVsZHNJbmZvPi92YWx1ZXMvXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGFEYXRhQXJyYXkucHVzaChvUmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EYXRhRmllbGRNb2RlbC5zZXREYXRhKGFEYXRhQXJyYXkpO1xuXHRcdHJldHVybiBvRGF0YUZpZWxkTW9kZWw7XG5cdH0sXG5cblx0Z2V0VGFibGVGaWVsZHM6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29sdW1ucztcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSBvQ29sdW1uICYmIG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCksXG5cdFx0XHRcdGFSZWFsdGVkQ29sdW1uSW5mbyA9XG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEgJiZcblx0XHRcdFx0XHRjb2x1bW5zRGF0YS5maWx0ZXIoZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uSW5mby5uYW1lID09PSBzRGF0YVByb3BlcnR5ICYmIG9Db2x1bW5JbmZvLnR5cGUgPT09IFwiQW5ub3RhdGlvblwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XCJsYWJlbFwiOiBvQ29sdW1uLmdldEhlYWRlcigpLFxuXHRcdFx0XHRcImFubm90YXRpb25QYXRoXCI6IGFSZWFsdGVkQ29sdW1uSW5mbyAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdLmFubm90YXRpb25QYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRUZXh0c0ZvckRpYWxvZzogZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwidXNlVmFsdWVIZWxwVmFsdWVcIjogXCI8IFVzZSBWYWx1ZSBIZWxwID5cIixcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NBTkNFTF9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwibm9GaWVsZHNcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9OT19FRElUQUJMRV9GSUVMRFNcIiksXG5cdFx0XHRcIm9rQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHN0cmluZ1xuXHQgKi9cblx0Ly8gZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZzogZnVuY3Rpb24gKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHQvLyBcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHQvLyBcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHQvLyBcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHQvLyBcdFx0Y2FzZSBcIkRhdGVQaWNrZXJcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRjYXNlIFwiQ2hlY2tCb3hcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRkZWZhdWx0OlxuXHQvLyBcdFx0XHRzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblx0Ly8gXHR9XG5cdC8vIFx0cmV0dXJuIHNSZXN1bHQ7XG5cdC8vIH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIG1vZGVsIFtLZWVwIEV4aXN0aW5nIFZhbHVlcywgTGVhdmUgQmxhbmtdLlxuXHQgKlxuXHQgKiBAcGFyYW0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSBiVU9NRmllbGRcblx0ICovXG5cdHNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZzogZnVuY3Rpb24gKGFWYWx1ZXM6IGFueSwgb0RlZmF1bHRWYWx1ZXM6IGFueSwgb1Byb3BlcnR5SW5mbzogYW55LCBiVU9NRmllbGQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGJVT01GaWVsZCA/IG9Qcm9wZXJ0eUluZm8udW5pdFByb3BlcnR5IDogb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdC8vIGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBcIlZhbHVlc1wiO1xuXHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMgPSBhVmFsdWVzLmRlZmF1bHRPcHRpb25zIHx8IFtdO1xuXHRcdGNvbnN0IHNlbGVjdE9wdGlvbnNFeGlzdCA9IGFWYWx1ZXMuc2VsZWN0T3B0aW9ucyAmJiBhVmFsdWVzLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMDtcblx0XHRjb25zdCBrZWVwRW50cnkgPSB7XG5cdFx0XHR0ZXh0OiBgJHtvRGVmYXVsdFZhbHVlcy5rZWVwRXhpc3RpbmdQcmVmaXh9ICR7c1N1ZmZpeEZvcktlZXBFeGlzdGluZ30gPmAsXG5cdFx0XHRrZXk6IGBEZWZhdWx0LyR7c1Byb3BlcnR5UGF0aH1gXG5cdFx0fTtcblxuXHRcdGlmIChzSW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdGNvbnN0IGZhbHNlRW50cnkgPSB7IHRleHQ6IFwiTm9cIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS9mYWxzZWAsIHRleHRJbmZvOiB7IHZhbHVlOiBmYWxzZSB9IH07XG5cdFx0XHRjb25zdCB0cnV0aHlFbnRyeSA9IHsgdGV4dDogXCJZZXNcIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS90cnVlYCwgdGV4dEluZm86IHsgdmFsdWU6IHRydWUgfSB9O1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHRydXRoeUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdCh0cnV0aHlFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWQgfHwgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRcdGNvbnN0IHZoZEVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy51c2VWYWx1ZUhlbHBWYWx1ZSwga2V5OiBgVXNlVmFsdWVIZWxwVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdH1cblx0XHRcdGlmIChzZWxlY3RPcHRpb25zRXhpc3QpIHtcblx0XHRcdFx0aWYgKGJQcm9wZXJ0eVJlcXVpcmVkICE9PSBcInRydWVcIiAmJiAhYlVPTUZpZWxkKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2xlYXJFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IGBDbGVhckZpZWxkVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoY2xlYXJFbnRyeSk7XG5cdFx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGVtcHR5RW50cnkgPSB7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBgRGVmYXVsdC8ke3NQcm9wZXJ0eVBhdGh9YCB9O1xuXHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoZW1wdHlFbnRyeSk7XG5cdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IGFycmFuZ2VtZW50IGluZm8gZm9yIGEgY29udGV4dCBwcm9wZXJ0eS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IFBhdGhcblx0ICogQHBhcmFtIGRlc2NyaXB0aW9uUGF0aCBQYXRoIHRvIHRleHQgYXNzb2NpYXRpb24gb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBkaXNwbGF5TW9kZSBEaXNwbGF5IG1vZGUgb2YgdGhlIHByb3BlcnR5IGFuZCB0ZXh0IGFzc29jaWF0aW9uXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMgVGhlIHRleHQgYXJyYW5nZW1lbnRcblx0ICovXG5cdGdldFRleHRBcnJhbmdlbWVudEluZm86IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGRlc2NyaXB0aW9uUGF0aDogc3RyaW5nLFxuXHRcdGRpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdFx0c2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0XG5cdCk6IFRleHRBcnJhbmdlbWVudEluZm8ge1xuXHRcdGxldCB2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpLFxuXHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSxcblx0XHRcdGZ1bGxUZXh0O1xuXHRcdGlmIChkZXNjcmlwdGlvblBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRcdHN3aXRjaCAoZGlzcGxheU1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoZGVzY3JpcHRpb25QYXRoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWUgPyBgJHt2YWx1ZX0gKCR7ZGVzY3JpcHRpb25WYWx1ZX0pYCA6IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlID8gYCR7ZGVzY3JpcHRpb25WYWx1ZX0gKCR7dmFsdWV9KWAgOiB2YWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRMb2cuaW5mbyhgRGlzcGxheSBQcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogJHtwcm9wZXJ0eX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJ0ZXh0QXJyYW5nZW1lbnRcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcInZhbHVlUGF0aFwiOiBwcm9wZXJ0eSxcblx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFwidmFsdWVcIjogdmFsdWUsXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcImZ1bGxUZXh0XCI6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW55IFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRpc0VkaXRhYmxlOiBmdW5jdGlvbiAoYW55OiBBbnlUeXBlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZyA9IGFueS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXHRcdGNvbnN0IHZhbHVlID0gKGJpbmRpbmcgYXMgYW55KS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBFZGl0TW9kZS5FZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgbWFzcyBlZGl0IGZpZWxkIG9uIGNoYW5nZSBvZiB0aGUgTWFuYWdlZE9iamVjdCBBbnkgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqL1xuXHRvbkNvbnRleHRFZGl0YWJsZUNoYW5nZTogZnVuY3Rpb24gKG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvYmplY3RzRm9yVmlzaWJpbGl0eSA9IG9EaWFsb2dEYXRhTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtkYXRhUHJvcGVydHl9L29iamVjdHNGb3JWaXNpYmlsaXR5YCkgfHwgW107XG5cdFx0Y29uc3QgZWRpdGFibGUgPSBvYmplY3RzRm9yVmlzaWJpbGl0eS5zb21lKE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUpO1xuXG5cdFx0aWYgKGVkaXRhYmxlKSB7XG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsLnNldFByb3BlcnR5KGAvdmFsdWVzLyR7ZGF0YVByb3BlcnR5fS92aXNpYmxlYCwgZWRpdGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIE1hbmFnZWQgT2JqZWN0IEFueSBmb3IgdmlzaWJpbGl0eSBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICpcblx0ICogQHBhcmFtIG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hDaGFuZ2UoTWFzc0VkaXRIZWxwZXIub25Db250ZXh0RWRpdGFibGVDaGFuZ2UuYmluZChudWxsLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGJvdW5kIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIHZpc2liaWxpdHkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKi9cblx0Z2V0Qm91bmRPYmplY3Q6IGZ1bmN0aW9uIChleHBCaW5kaW5nOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgY29udGV4dDogQ29udGV4dCk6IEFueVR5cGUge1xuXHRcdGNvbnN0IG1PVG9Vc2UgPSBuZXcgQW55KHsgYW55OiBleHBCaW5kaW5nIH0pO1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdG1PVG9Vc2Uuc2V0TW9kZWwobW9kZWwpO1xuXHRcdG1PVG9Vc2Uuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cblx0XHRyZXR1cm4gbU9Ub1VzZTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc3MgZWRpdCBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICovXG5cdGdldEZpZWxkVmlzaWJsaXR5OiBmdW5jdGlvbiAoXG5cdFx0ZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0b0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLFxuXHRcdGRhdGFQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbnRleHQ6IENvbnRleHRcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IE1hc3NFZGl0SGVscGVyLmdldEJvdW5kT2JqZWN0KGV4cEJpbmRpbmcsIGNvbnRleHQpO1xuXHRcdGNvbnN0IGlzQ29udGV4dEVkaXRhYmxlID0gTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZShtT1RvVXNlKTtcblxuXHRcdGlmICghaXNDb250ZXh0RWRpdGFibGUpIHtcblx0XHRcdE1hc3NFZGl0SGVscGVyLnVwZGF0ZU9uQ29udGV4dENoYW5nZShtT1RvVXNlLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHksIHZhbHVlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBpc0NvbnRleHRFZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBydW50aW1lIG1vZGVsOlxuXHQgKiA9PiBUaGUgbW9kZWwgY29uc2lzdHMgb2YgdmFsdWVzIHNob3duIGluIHRoZSBjb21ib0JveCBvZiB0aGUgZGlhbG9nIChMZWF2ZSBCbGFuaywgS2VlcCBFeGlzdGluZyBWYWx1ZXMsIG9yIGFueSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRleHQsIGV0Yy4pXG5cdCAqID0+IFRoZSBtb2RlbCB3aWxsIGNhcHR1cmUgcnVudGltZSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIHByb3BlcnR5ICh0aGUgdmFsdWUgZW50ZXJlZCBpbiB0aGUgY29tYm9Cb3gpLlxuXHQgKlxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcGFyYW0gZGlhbG9nQ29udGV4dCBUcmFuc2llbnQgY29udGV4dCBmb3IgbWFzcyBlZGl0IGRpYWxvZy5cblx0ICogQHJldHVybnMgVGhlIHJ1bnRpbWUgbW9kZWxcblx0ICovXG5cdHNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nOiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnksIGRpYWxvZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBhVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFVbml0RGF0YTogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVhZE9ubHlGaWVsZEluZm86IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb0RhdGEgPSB7XG5cdFx0XHRcInZhbHVlc1wiOiBhVmFsdWVzLFxuXHRcdFx0XCJ1bml0RGF0YVwiOiBhVW5pdERhdGEsXG5cdFx0XHRcInJlc3VsdHNcIjogYVJlc3VsdHMsXG5cdFx0XHRcInJlYWRhYmxlUHJvcGVydHlEYXRhXCI6IGFSZWFkT25seUZpZWxkSW5mbyxcblx0XHRcdFwic2VsZWN0ZWRLZXlcIjogdW5kZWZpbmVkLFxuXHRcdFx0XCJub0ZpZWxkc1wiOiBvRGVmYXVsdFZhbHVlcy5ub0ZpZWxkc1xuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgb1RleHRJbmZvO1xuXHRcdFx0bGV0IHNQcm9wZXJ0eUtleTtcblx0XHRcdGxldCBzVW5pdFByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFVuaXRNYXA6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIG9JbkRhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvSW5EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyAvKiwgZGlhbG9nQ29udGV4dCAqLyk7XG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzID0gb0luRGF0YS5kYXRhUHJvcGVydHkuc3BsaXQoXCIvXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtzTXVsdGlMZXZlbFBhdGhWYWx1ZX1gO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0luRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdGlmIChvSW5EYXRhLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV19YDtcblx0XHRcdFx0XHRpZiAob0luRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0ucHVzaChlbnRyeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS51bml0UHJvcGVydHldKSB7XG5cdFx0XHRcdFx0XHRzVW5pdFByb3BlcnR5TmFtZSA9IGAke29JbkRhdGEudW5pdFByb3BlcnR5fS8ke29EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XX1gO1xuXHRcdFx0XHRcdFx0aWYgKCFvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRcdFwia2V5XCI6IHNVbml0UHJvcGVydHlOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh1bml0RW50cnkpO1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0udGV4dEluZm8gPSB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiBvSW5EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvSW5EYXRhLmRpc3BsYXlcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRkaWFsb2dDb250ZXh0LnNldFByb3BlcnR5KG9JbkRhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFVuaXRNYXApLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0luRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgdmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvSW5EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0luRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRpZiAoIXNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSkge1xuXHRcdFx0XHRcdHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IGBFbXB0eS8ke29JbkRhdGEuZGF0YVByb3BlcnR5fWAgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlcyA9IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0pIHtcblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLCBvRGVmYXVsdFZhbHVlcywgb0luRGF0YSk7XG5cdFx0XHRcdHZhbHVlcyA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KFxuXHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9JbkRhdGEuaW5wdXRUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHx8XG5cdFx0XHRcdChvSW5EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cyA9XG5cdFx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogYEVtcHR5LyR7b0luRGF0YS5kYXRhUHJvcGVydHl9YCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24gKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGBFbXB0eS8ke29JbkRhdGEudW5pdFByb3BlcnR5fWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ICYmIHR5cGVvZiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHksIHR5cGU6IFwiRGVmYXVsdFwiIH0pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0gJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aDogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvSW5EYXRhLmVkaXRNb2RlKSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID1cblx0XHRcdFx0XHRvSW5EYXRhLmVkaXRNb2RlID09PSBFZGl0TW9kZS5FZGl0YWJsZSB8fFxuXHRcdFx0XHRcdGFDb250ZXh0cy5zb21lKFxuXHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0RmllbGRWaXNpYmxpdHkuYmluZChcblx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZWRpdE1vZGUsXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2dEYXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHR2YWx1ZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWVzLnZpc2libGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dmFsdWVzLnNlbGVjdGVkS2V5ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdHZhbHVlcy5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdHZhbHVlcy51bml0UHJvcGVydHkgPSBvSW5EYXRhLnVuaXRQcm9wZXJ0eTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXHQvKipcblx0ICogR2V0cyB0cmFuc2llbnQgY29udGV4dCBmb3IgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFibGUgSW5zdGFuY2Ugb2YgVGFibGUuXG5cdCAqIEBwYXJhbSBkaWFsb2cgTWFzcyBFZGl0IERpYWxvZy5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Z2V0RGlhbG9nQ29udGV4dDogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgZGlhbG9nPzogRGlhbG9nKTogQ29udGV4dCB7XG5cdFx0bGV0IHRyYW5zQ3R4OiBDb250ZXh0ID0gKGRpYWxvZyAmJiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSkgYXMgQ29udGV4dDtcblxuXHRcdGlmICghdHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0KHRyYW5zaWVudExpc3RCaW5kaW5nIGFzIGFueSkucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvKiAqL1xuXHRcdFx0fTtcblx0XHRcdHRyYW5zQ3R4ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHt9LCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNDdHg7XG5cdH0sXG5cblx0b25EaWFsb2dPcGVuOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0ZmllbGRzSW5mb01vZGVsLnNldFByb3BlcnR5KFwiL2lzT3BlblwiLCB0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgQ29udHJvbGxlciBmb3IgdGhlIHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Y3JlYXRlRGlhbG9nOiBmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0ZGlhbG9nQ29udGV4dCA9IE1hc3NFZGl0SGVscGVyLmdldERpYWxvZ0NvbnRleHQob1RhYmxlKSxcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5zZXRSdW50aW1lTW9kZWxPbkRpYWxvZyhhQ29udGV4dHMsIGFEYXRhQXJyYXksIG9EZWZhdWx0VmFsdWVzLCBkaWFsb2dDb250ZXh0KTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9DcmVhdGVkRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0NyZWF0ZWRGcmFnbWVudCB9KS50aGVuKGZ1bmN0aW9uIChvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogb0RlZmF1bHRWYWx1ZXMubWFzc0VkaXRUaXRsZSxcblx0XHRcdFx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0XHRcdFx0YWZ0ZXJPcGVuOiBNYXNzRWRpdEhlbHBlci5vbkRpYWxvZ09wZW4sXG5cdFx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEV4cEJpbmRpbmdGb3JBcHBseUJ1dHRvblR4dChvRGVmYXVsdFZhbHVlcywgb0RhdGFGaWVsZE1vZGVsLmdldE9iamVjdChcIi9cIikpLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJza2lwUGF0Y2hIYW5kbGVyc1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0luRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0luRGlhbG9nLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN1bHRzID0gb01vZGVsLmdldFByb3BlcnR5KFwiL3Jlc3VsdHNcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlSZWFkYWJsZUluZm8gPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVhZGFibGVQcm9wZXJ0eURhdGFcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VQcm9taXNlOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGJSZWFkT25seUZpZWxkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZ3JvdXBJZDtcblx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IGluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGVycm9yVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSwgaWR4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkID0gYCRhdXRvLiR7aWR4fWA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9pbmRleCArPSAxO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IHByb21pc2VDb3VudCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgJiYgb1Jlc3VsdC52YWx1ZSAhPT0gXCJEZWZhdWx0XCIgJiYgIWJSZWFkT25seUZpZWxkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VQcm9taXNlLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSwgZ3JvdXBJZClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVmFsdWVzLnB1c2gob1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRcdChQcm9taXNlIGFzIGFueSkuYWxsU2V0dGxlZChjaGFuZ2VQcm9taXNlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0V4dGVuc2lvbkFQSSA9IG9Db250cm9sbGVyICYmIChvQ29udHJvbGxlci5nZXRFeHRlbnNpb25BUEkoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0V4dGVuc2lvbkFQSS5yZWZyZXNoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN1YnRpdGxlQ29sdW1uID0gQ29tbW9uVXRpbHMuZ2V0TWVzc2FnZUNvbHVtbihvVGFibGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VzID0gc2FwLnVpLmdldENvcmUoKS5nZXRNZXNzYWdlTWFuYWdlcigpLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzID0gW10gYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZVRhcmdldHMgPSBtZXNzYWdlLmdldFRhcmdldHMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVRhcmdldHMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVRhcmdldHMubGVuZ3RoID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VUYXJnZXRzWzBdLmxlbmd0aCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLnBlcnNpc3RlbnQgPT09IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQgPSBhQ29udGV4dHMuZmluZChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldCgpLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLnB1c2goYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0LmdldE9iamVjdCgpW3N1YnRpdGxlQ29sdW1uXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoID09PSAwICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggPT09IDBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWNjZXNzVG9hc3QgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NVQ0NFU1NfVE9BU1RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhzdWNjZXNzVG9hc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9JbkRpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0luRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvSW5EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInNraXBQYXRjaEhhbmRsZXJzXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNhbmNlbEJ1dHRvblRleHQsXG5cdFx0XHRcdFx0XHRcdFx0dmlzaWJsZTogTWFzc0VkaXRIZWxwZXIuaGVscGVycy5oYXNFZGl0YWJsZUZpZWxkc0JpbmRpbmcob0RhdGFGaWVsZE1vZGVsLmdldE9iamVjdChcIi9cIiksIHRydWUpIGFzIGFueSxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvSW5EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvRGlhbG9nRGF0YU1vZGVsLCBcImZpZWxkc0luZm9cIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG1vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoZGlhbG9nQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9EaWFsb2cpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fSxcblxuXHRoZWxwZXJzOiB7XG5cdFx0Z2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzOiAoZmllbGRzOiBhbnksIGVkaXRhYmxlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRjb25zdCB0b3RhbEV4cCA9IGZpZWxkcy5yZWR1Y2UoXG5cdFx0XHRcdChleHByZXNzaW9uOiBhbnksIGZpZWxkOiBhbnkpID0+XG5cdFx0XHRcdFx0b3IoXG5cdFx0XHRcdFx0XHRleHByZXNzaW9uLFxuXHRcdFx0XHRcdFx0cGF0aEluTW9kZWwoXCIvdmFsdWVzL1wiICsgZmllbGQuZGF0YVByb3BlcnR5ICsgXCIvdmlzaWJsZVwiLCBcImZpZWxkc0luZm9cIikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0Y29uc3RhbnQoZmFsc2UpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGVkaXRhYmxlID8gdG90YWxFeHAgOiBub3QodG90YWxFeHApO1xuXHRcdH0sXG5cblx0XHRnZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQ6IChkZWZhdWx0VmFsdWVzOiBhbnksIGZpZWxkczogYm9vbGVhbikgPT4ge1xuXHRcdFx0Y29uc3QgZWRpdGFibGVFeHAgPSBNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEJpbmRpbmdFeHBGb3JIYXNFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIHRydWUpO1xuXHRcdFx0Y29uc3QgdG90YWxFeHAgPSBpZkVsc2UoZWRpdGFibGVFeHAsIGNvbnN0YW50KGRlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0KSwgY29uc3RhbnQoZGVmYXVsdFZhbHVlcy5va0J1dHRvblRleHQpKTtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbih0b3RhbEV4cCk7XG5cdFx0fSxcblxuXHRcdGhhc0VkaXRhYmxlRmllbGRzQmluZGluZzogKGZpZWxkczogYW55LCBlZGl0YWJsZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzKGZpZWxkcywgZWRpdGFibGUpKTtcblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19
1382
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdEhlbHBlciIsImluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aCIsInNQYXRoIiwiYVZhbHVlcyIsImFGaW5hbFBhdGgiLCJpbmRleCIsImFQYXRocyIsInNwbGl0Iiwic0Z1bGxQYXRoIiwiZm9yRWFjaCIsInNQcm9wZXJ0eVBhdGgiLCJnZXRVbmlxdWVWYWx1ZXMiLCJzVmFsdWUiLCJzZWxmIiwidW5kZWZpbmVkIiwiaW5kZXhPZiIsImdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgiLCJzRGF0YVByb3BlcnR5UGF0aCIsIm9WYWx1ZXMiLCJhUHJvcGVydHlQYXRocyIsIlJlc3VsdCIsImdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3giLCJhQ29udGV4dHMiLCJsZW5ndGgiLCJvU2VsZWN0ZWRDb250ZXh0IiwiYVByb3BlcnR5VmFsdWVzIiwib0NvbnRleHQiLCJvRGF0YU9iamVjdCIsImdldE9iamVjdCIsInNNdWx0aUxldmVsUGF0aENvbmRpdGlvbiIsImhhc093blByb3BlcnR5IiwicHVzaCIsImFVbmlxdWVQcm9wZXJ0eVZhbHVlcyIsImZpbHRlciIsImdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMiLCJoaWRkZW5WYWx1ZSIsIiRQYXRoIiwic29tZSIsImdldElucHV0VHlwZSIsInByb3BlcnR5SW5mbyIsImRhdGFGaWVsZENvbnZlcnRlZCIsIm9EYXRhTW9kZWxQYXRoIiwiZWRpdFN0eWxlUHJvcGVydGllcyIsImlucHV0VHlwZSIsInNldEVkaXRTdHlsZVByb3BlcnRpZXMiLCJlZGl0U3R5bGUiLCJpc1ZhbGlkRm9yTWFzc0VkaXQiLCJpc0NvbGxlY3Rpb25GaWVsZCIsImhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyIsImdldElzRmllbGRHcnAiLCIkVHlwZSIsIlRhcmdldCIsInZhbHVlIiwiZ2V0VGV4dFBhdGgiLCJwcm9wZXJ0eSIsInRleHRCaW5kaW5nIiwiZGlzcGxheU1vZGUiLCJkZXNjcmlwdGlvblBhdGgiLCJwYXRoIiwicGFyYW1ldGVycyIsInByb3BzIiwicHJlcGFyZURhdGFGb3JEaWFsb2ciLCJvVGFibGUiLCJhRGF0YUFycmF5Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0N1cnJlbnRFbnRpdHlTZXROYW1lIiwiZGF0YSIsImFUYWJsZUZpZWxkcyIsImdldFRhYmxlRmllbGRzIiwib0VudGl0eVR5cGVDb250ZXh0IiwiZ2V0Q29udGV4dCIsIm9FbnRpdHlTZXRDb250ZXh0Iiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJvRGF0YUZpZWxkTW9kZWwiLCJKU09OTW9kZWwiLCJvUmVzdWx0Iiwic0xhYmVsVGV4dCIsImJWYWx1ZUhlbHBFbmFibGVkIiwic1VuaXRQcm9wZXJ0eVBhdGgiLCJiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQiLCJvVGV4dEJpbmRpbmciLCJvQ29sdW1uSW5mbyIsImRhdGFQcm9wZXJ0eSIsIm9Qcm9wZXJ0eUluZm8iLCJsYWJlbCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsImdldFRleHRCaW5kaW5nIiwib0ZpZWxkQ29udGV4dCIsImFubm90YXRpb25QYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib1Byb3BlcnR5Q29udGV4dCIsIm9JbnRlcmZhY2UiLCJnZXRJbnRlcmZhY2UiLCJWYWx1ZSIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiYkhpZGRlbkZpZWxkIiwiaXNJbWFnZSIsImNvbnRleHQiLCJnZXRQYXRoIiwiX3R5cGUiLCIkdGFyZ2V0IiwiY2hhcnRQcm9wZXJ0eSIsInRlcm0iLCJpc0FjdGlvbiIsIkFjdGlvbiIsImlzRmllbGRHcnAiLCJoYXNWYWx1ZUhlbHAiLCJoYXNDdXJyZW5jeSIsImhhc1VuaXQiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCIsInVuaXRQcm9wZXJ0eUluZm8iLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwicHJvcGVydHlGb3JGaWVsZENvbnRyb2wiLCJleHBCaW5kaW5nIiwiZ2V0RWRpdE1vZGUiLCJjb25zdGFudCIsImVkaXRNb2RlVmFsdWVzIiwiT2JqZWN0Iiwia2V5cyIsIkVkaXRNb2RlIiwiZWRpdE1vZGVJc1N0YXRpYyIsImluY2x1ZGVzIiwiZWRpdGFibGUiLCJFZGl0YWJsZSIsIm5hdlByb3BlcnR5V2l0aFZhbHVlSGVscCIsImlzUmVhZE9ubHkiLCJpc1JlYWRPbmx5RXhwcmVzc2lvbiIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwibnVsbGFibGUiLCJzZXREYXRhIiwiYUNvbHVtbnMiLCJnZXRDb2x1bW5zIiwiY29sdW1uc0RhdGEiLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJjb2x1bW5zIiwibWFwIiwib0NvbHVtbiIsInNEYXRhUHJvcGVydHkiLCJnZXREYXRhUHJvcGVydHkiLCJhUmVhbHRlZENvbHVtbkluZm8iLCJ0eXBlIiwiZ2V0SGVhZGVyIiwiZ2V0RGVmYXVsdFRleHRzRm9yRGlhbG9nIiwib1Jlc291cmNlQnVuZGxlIiwiaVNlbGVjdGVkQ29udGV4dHMiLCJiRGlzcGxheU1vZGUiLCJnZXRUZXh0IiwidG9TdHJpbmciLCJzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2ciLCJvRGVmYXVsdFZhbHVlcyIsImJVT01GaWVsZCIsInVuaXRQcm9wZXJ0eSIsInNJbnB1dFR5cGUiLCJiUHJvcGVydHlSZXF1aXJlZCIsImlzRmllbGRSZXF1aXJlZCIsInNTdWZmaXhGb3JLZWVwRXhpc3RpbmciLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdE9wdGlvbnNFeGlzdCIsInNlbGVjdE9wdGlvbnMiLCJrZWVwRW50cnkiLCJ0ZXh0Iiwia2VlcEV4aXN0aW5nUHJlZml4Iiwia2V5IiwiZmFsc2VFbnRyeSIsInRleHRJbmZvIiwidHJ1dGh5RW50cnkiLCJ1bnNoaWZ0IiwiaXNWYWx1ZUhlbHBFbmFibGVkIiwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsInZoZEVudHJ5IiwidXNlVmFsdWVIZWxwVmFsdWUiLCJjbGVhckVudHJ5IiwiY2xlYXJGaWVsZFZhbHVlIiwiZW1wdHlFbnRyeSIsImxlYXZlQmxhbmtWYWx1ZSIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzZWxlY3RlZENvbnRleHQiLCJkZXNjcmlwdGlvblZhbHVlIiwiZnVsbFRleHQiLCJMb2ciLCJpbmZvIiwiaXNFZGl0YWJsZSIsImFueSIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsIm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlIiwib0RpYWxvZ0RhdGFNb2RlbCIsIm9iamVjdHNGb3JWaXNpYmlsaXR5IiwiZ2V0UHJvcGVydHkiLCJzZXRQcm9wZXJ0eSIsInVwZGF0ZU9uQ29udGV4dENoYW5nZSIsIm1PVG9Vc2UiLCJ2YWx1ZXMiLCJhdHRhY2hDaGFuZ2UiLCJiaW5kIiwiZ2V0Qm91bmRPYmplY3QiLCJBbnkiLCJtb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRGaWVsZFZpc2libGl0eSIsImlzQ29udGV4dEVkaXRhYmxlIiwic2V0UnVudGltZU1vZGVsT25EaWFsb2ciLCJkaWFsb2dDb250ZXh0IiwiYVVuaXREYXRhIiwiYVJlc3VsdHMiLCJ0ZXh0UGF0aHMiLCJhUmVhZE9ubHlGaWVsZEluZm8iLCJvRGF0YSIsIm5vRmllbGRzIiwib0luRGF0YSIsIm9UZXh0SW5mbyIsInNQcm9wZXJ0eUtleSIsInNVbml0UHJvcGVydHlOYW1lIiwib0Rpc3RpbmN0VmFsdWVNYXAiLCJvRGlzdGluY3RVbml0TWFwIiwic011bHRpTGV2ZWxQYXRoVmFsdWUiLCJkaXNwbGF5IiwidmFsdWVQYXRoIiwiZW50cnkiLCJ1bml0RW50cnkiLCJzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUiLCJzZWxlY3RlZEtleSIsImJDbGVhckZpZWxkT3JCbGFua1ZhbHVlRXhpc3RzIiwib2JqIiwiYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzIiwiaXNQcm9wZXJ0eVJlYWRPbmx5Iiwib3BlcmFuZHMiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHlWYWx1ZSIsImVkaXRNb2RlIiwidmlzaWJsZSIsImdldERpYWxvZ0NvbnRleHQiLCJ0YWJsZSIsImRpYWxvZyIsInRyYW5zQ3R4IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJsaXN0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJ0cmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwib25EaWFsb2dPcGVuIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJjbG9zZURpYWxvZyIsIm9EaWFsb2ciLCJjbG9zZSIsImRlc3Ryb3kiLCJtZXNzYWdlSGFuZGxpbmdGb3JNYXNzRWRpdCIsIm9Db250cm9sbGVyIiwib0luRGlhbG9nIiwiZXJyb3JWYWx1ZXMiLCJzdWJ0aXRsZUNvbHVtbiIsImdldE1lc3NhZ2VDb2x1bW4iLCJtZXNzYWdlcyIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiRHJhZnRTdGF0dXMiLCJGRUxpYnJhcnkiLCJtZXNzYWdlIiwibWVzc2FnZVRhcmdldHMiLCJnZXRUYXJnZXRzIiwicGVyc2lzdGVudCIsImJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dCIsImZpbmQiLCJnZXRUYXJnZXQiLCJhZGRpdGlvbmFsVGV4dCIsIl9lZGl0RmxvdyIsInNldERyYWZ0U3RhdHVzIiwiU2F2ZWQiLCJzdWNjZXNzVG9hc3QiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkNsZWFyIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZXMiLCJpc09wZW4iLCJnZXRWaWV3IiwiZ2V0U2lkZUVmZmVjdERhdGFGb3JLZXkiLCJhU2lkZUVmZmVjdHMiLCJzT3duZXJFbnRpdHlUeXBlIiwiYmFzZVNpZGVFZmZlY3RzTWFwQXJyYXkiLCJyZXN1bHQiLCJrZXlWYWx1ZSIsInNpZGVFZmZlY3RzQXJyYXkiLCJGaWVsZEhlbHBlciIsImdldFNpZGVFZmZlY3RzT25FbnRpdHlBbmRQcm9wZXJ0eSIsIl9zaWRlRWZmZWN0cyIsImdlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tU2lkZUVmZmVjdElkIiwiZm5HZXRQYXRoRm9yU291cmNlUHJvcGVydHkiLCJzRW50aXR5VHlwZSIsInNOYXZpZ2F0aW9uUGF0aCIsInN1YnN0ciIsImxhc3RJbmRleE9mIiwicE93bmVyRW50aXR5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0T2JqZWN0IiwiZm5HZXRFbnRpdHlUeXBlT2ZPd25lciIsImJhc2VOYXZQYXRoIiwidGFyZ2V0RW50aXR5IiwiYVRhcmdldHMiLCJvd25lckVudGl0eVR5cGUiLCJwT3duZXIiLCJvd25lck5hdlBhdGgiLCJlbnRpdHlPYmpPZk93bmVyUGFydG5lciIsImVudGl0eVR5cGVPZk93bmVyUGFydG5lciIsImZuR2V0VGFyZ2V0c0Zvck1hc3NFZGl0Iiwic2lkZUVmZmVjdHNEYXRhIiwiYVRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiYVRhcmdldEVudGl0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJhUHJvbWlzZXMiLCJ0YXJnZXRQcm9wIiwidGhlbiIsInJlc3VsdEVudGl0eSIsImFsbCIsImhhbmRsZU1hc3NFZGl0RmllbGRVcGRhdGVBbmRSZXF1ZXN0U2lkZUVmZmVjdHMiLCJtUGFyYW1zIiwib0ZpZWxkUHJvbWlzZSIsInNpZGVFZmZlY3RzTWFwIiwiZ3JvdXBJZCIsImRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lIiwiaW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9taXNlcyIsIm9BcHBDb21wb25lbnQiLCJnZXRBcHBDb21wb25lbnQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiYWxsRW50aXR5VHlwZXNXaXRoUXVhbGlmaWVyIiwic2lkZUVmZmVjdHNEYXRhRm9yRmllbGQiLCJtVmlzaXRlZFNpZGVFZmZlY3RzIiwiZW50cmllcyIsImVudGl0eVR5cGVXaXRoUXVhbGlmaWVyIiwiZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzIiwiYWxsRmFpbGVkU2lkZUVmZmVjdHMiLCJnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMiLCJhRmFpbGVkU2lkZUVmZmVjdHMiLCJkZWxldGVGYWlsZWRSZXF1ZXN0c0ZvckFDb250ZXh0Iiwic2lkZUVmZmVjdHNGb3JDdXJyZW50Q29udGV4dCIsInNpZGVFZmZlY3RzIiwiY29uY2F0IiwiYVNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJhSW1tZWRpYXRlVGFyZ2V0cyIsImFsbFRhcmdldHMiLCJ0cmlnZ2VyQWN0aW9uTmFtZSIsImZuR2V0SW1tZWRpYXRlVGFyZ2V0c0FuZEFjdGlvbnMiLCJtU2lkZUVmZmVjdCIsInNpZGVFZmZlY3RFbnRpdHlUeXBlIiwidGFyZ2V0c0FycmF5Rm9yQWxsUHJvcGVydGllcyIsImFjdGlvbk5hbWUiLCJUcmlnZ2VyQWN0aW9uIiwiYURlZmVycmVkVGFyZ2V0cyIsInRhcmdldCIsImlzU3RhdGljQWN0aW9uIiwiVGFibGVIZWxwZXIiLCJfaXNTdGF0aWNBY3Rpb24iLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJhbGxTZXR0bGVkIiwiY3JlYXRlRGlhbG9nIiwic0ZyYWdtZW50TmFtZSIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImJpbmRpbmdDb250ZXh0cyIsImRhdGFGaWVsZE1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJtb2RlbHMiLCJvQ3JlYXRlZEZyYWdtZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsIm9EaWFsb2dDb250ZW50IiwiRGlhbG9nIiwicmVzaXphYmxlIiwidGl0bGUiLCJtYXNzRWRpdFRpdGxlIiwiY29udGVudCIsImFmdGVyT3BlbiIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiaGVscGVycyIsImdldEV4cEJpbmRpbmdGb3JBcHBseUJ1dHRvblR4dCIsInByZXNzIiwib0V2ZW50Iiwib01vZGVsIiwiU2lkZUVmZmVjdHNIZWxwZXIiLCJnZW5lcmF0ZVNpZGVFZmZlY3RzTWFwRnJvbU1ldGFNb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImFsbFNpZGVFZmZlY3RzIiwibWFzc0VkaXRQcm9taXNlcyIsImZhaWxlZEZpZWxkc0RhdGEiLCJzZWxlY3RlZFJvd3NMZW5ndGgiLCJpZHgiLCJjYXRjaCIsIm9FcnJvciIsImVycm9yIiwicmVqZWN0IiwiaXNGaWVsZFVwZGF0ZUZhaWxlZCIsImRhdGFUb1VwZGF0ZUZpZWxkQW5kU2lkZUVmZmVjdHMiLCJkZWZlcnJlZFJlcXVlc3RzIiwic2lkZUVmZmVjdHNEYXRhRm9yQWxsS2V5cyIsImtleXNXaXRoU2lkZUVmZmVjdHMiLCJjdXJyZW50S2V5IiwiZGVmZXJyZWRTaWRlRWZmZWN0c0RhdGEiLCJyZXEiLCJmbkdldERlZmVycmVkVGFyZ2V0cyIsImZuR2V0RGVmZXJyZWRUYXJnZXRzQW5kQWN0aW9ucyIsImUiLCJlbmRCdXR0b24iLCJjYW5jZWxCdXR0b25UZXh0IiwiaGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nIiwiZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzIiwiZmllbGRzIiwidG90YWxFeHAiLCJyZWR1Y2UiLCJleHByZXNzaW9uIiwiZmllbGQiLCJvciIsInBhdGhJbk1vZGVsIiwibm90IiwiZGVmYXVsdFZhbHVlcyIsImVkaXRhYmxlRXhwIiwiaWZFbHNlIiwiYXBwbHlCdXR0b25UZXh0Iiwib2tCdXR0b25UZXh0IiwiY29tcGlsZUV4cHJlc3Npb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlLCBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9TaWRlRWZmZWN0c1wiO1xuaW1wb3J0IHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFTaWRlRWZmZWN0c1R5cGUsIFNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBlbmhhbmNlRGF0YU1vZGVsUGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoLFxuXHRoYXNDdXJyZW5jeSxcblx0aGFzVW5pdCxcblx0aGFzVmFsdWVIZWxwLFxuXHRoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCBGaWVsZEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvRmllbGQubWV0YWRhdGFcIjtcbmltcG9ydCBUYWJsZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUhlbHBlclwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgRWRpdE1vZGUgZnJvbSBcInNhcC91aS9tZGMvZW51bS9FZGl0TW9kZVwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQW55VHlwZSB9IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCBBbnkgZnJvbSBcIi4uL2NvbnRyb2xzL0FueVwiO1xuaW1wb3J0IHsgY29udmVydE1ldGFNb2RlbENvbnRleHQsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgaXNSZWFkT25seUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7IGdldEVkaXRNb2RlLCBnZXRSZXF1aXJlZEV4cHJlc3Npb24sIGlzQ29sbGVjdGlvbkZpZWxkIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcIi4vTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0hlbHBlciBmcm9tIFwiLi9TaWRlRWZmZWN0c0hlbHBlclwiO1xuXG4vKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBmb3IgbWFzcyBlZGl0IGZ1bmN0aW9uYWxpdHkgKi9cbnR5cGUgVGV4dEFycmFuZ2VtZW50SW5mbyA9IHtcblx0dGV4dEFycmFuZ2VtZW50OiBzdHJpbmc7XG5cdHZhbHVlUGF0aDogc3RyaW5nO1xuXHRkZXNjcmlwdGlvblBhdGg/OiBzdHJpbmc7XG5cdHZhbHVlOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cdGZ1bGxUZXh0OiBzdHJpbmc7XG59O1xuXG50eXBlIEJpbmRpbmdJbmZvID0ge1xuXHRwYXRoPzogc3RyaW5nO1xuXHRtb2RlbD86IHN0cmluZyB8IG9iamVjdDtcblx0cGFyYW1ldGVycz86IEFycmF5PEJpbmRpbmdJbmZvPjtcbn07XG5cbnR5cGUgRGF0YVRvVXBkYXRlRmllbGRBbmRTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdG9Db250cm9sbGVyOiBhbnk7XG5cdG9GaWVsZFByb21pc2U6IFByb21pc2U8YW55Pjtcblx0c2lkZUVmZmVjdHNNYXA6IE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlIHwgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlO1xuXHR0ZXh0UGF0aHM6IGFueTtcblx0Z3JvdXBJZDogc3RyaW5nO1xuXHRrZXk6IHN0cmluZztcblx0b0VudGl0eVNldENvbnRleHQ6IGFueTtcblx0b01ldGFNb2RlbDogYW55O1xuXHRvU2VsZWN0ZWRDb250ZXh0OiBhbnk7XG5cdGRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lOiBhbnk7XG59O1xuXG5jb25zdCBNYXNzRWRpdEhlbHBlciA9IHtcblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBhdCBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGggd2l0aCBhIGJsYW5rIGFycmF5LlxuXHQgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgcG9pbnRpbmcgdG8gdGhlIGZpbmFsIG9yIGRlZXBlc3QgbGV2ZWwgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIGFWYWx1ZXMgQXJyYXkgaW5zdGFuY2Ugd2hlcmUgdGhlIGRlZmF1bHQgZGF0YSBuZWVkcyB0byBiZSBhZGRlZFxuXHQgKiBAcmV0dXJucyBUaGUgZmluYWwgcGF0aFxuXHQgKi9cblx0aW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoOiBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgYVZhbHVlczogYW55IC8qLCB0cmFuc0N0eDogQ29udGV4dCAqLykge1xuXHRcdGxldCBhRmluYWxQYXRoOiBhbnk7XG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjb25zdCBhUGF0aHMgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHNGdWxsUGF0aCA9IFwiXCI7XG5cdFx0YVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0aWYgKCFhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdICYmIGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZpbmFsUGF0aCA9IGFWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdHNGdWxsUGF0aCA9IHNGdWxsUGF0aCArIHNQcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9IGVsc2UgaWYgKCFhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdHNGdWxsUGF0aCA9IGAke3NGdWxsUGF0aH0vJHtzUHJvcGVydHlQYXRofWA7XG5cdFx0XHRcdGlmIChzRnVsbFBhdGggIT09IHNQYXRoKSB7XG5cdFx0XHRcdFx0YUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdFx0XHRcdGFGaW5hbFBhdGggPSBhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhRmluYWxQYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHVuaXF1ZSB2YWx1ZXMgZm9yIGdpdmVuIGFycmF5IHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIHNWYWx1ZSBQcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqIEBwYXJhbSBzZWxmIEluc3RhbmNlIG9mIHRoZSBhcnJheVxuXHQgKiBAcmV0dXJucyBUaGUgdW5pcXVlIHZhbHVlXG5cdCAqL1xuXHRnZXRVbmlxdWVWYWx1ZXM6IGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgc2VsZjogYW55W10pIHtcblx0XHRpZiAoc1ZhbHVlICE9IHVuZGVmaW5lZCAmJiBzVmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHNlbGYuaW5kZXhPZihzVmFsdWUpID09PSBpbmRleDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciBhIG11bHRpLWxldmVsIHBhdGggKGZvciBleGFtcGxlOiBfTWF0ZXJpYWxzL01hdGVyaWFsX0RldGFpbHMgZ2V0cyB0aGUgdmFsdWUgb2YgTWF0ZXJpYWxfRGV0YWlscyB1bmRlciBfTWF0ZXJpYWxzIE9iamVjdCkuXG5cdCAqIFJldHVybnMgdGhlIHByb3BlcnR5VmFsdWUsIHdoaWNoIGNhbiBiZSBvZiBhbnkgdHlwZSAoc3RyaW5nLCBudW1iZXIsIGV0Yy4uKS5cblx0ICpcblx0ICogQHBhcmFtIHNEYXRhUHJvcGVydHlQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIG9WYWx1ZXMgT2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlc1xuXHQgKiBAcmV0dXJucyBUaGUgcHJvcGVydHkgdmFsdWVcblx0ICovXG5cdGdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGg6IGZ1bmN0aW9uIChzRGF0YVByb3BlcnR5UGF0aDogc3RyaW5nLCBvVmFsdWVzOiBhbnkpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgc0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IHNEYXRhUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGxldCBSZXN1bHQ6IGFueTtcblx0XHRcdGFQcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0UmVzdWx0ID0gb1ZhbHVlcyAmJiBvVmFsdWVzW3NQYXRoXSA/IG9WYWx1ZXNbc1BhdGhdIDogUmVzdWx0ICYmIFJlc3VsdFtzUGF0aF07XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBSZXN1bHQ7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBrZXkgcGF0aCBmb3IgdGhlIGtleSBvZiBhIGNvbWJvIGJveCB0aGF0IG11c3QgYmUgc2VsZWN0ZWQgaW5pdGlhbGx5IHdoZW4gdGhlIGRpYWxvZyBvcGVuczpcblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGRpZmZlcmVudCwgdGhlbiA8IEtlZXAgRXhpc3RpbmcgVmFsdWVzID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyB0aGUgc2FtZSwgdGhlbiB0aGUgcHJvcGVydHlWYWx1ZSBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIGVtcHR5LCB0aGVuIDwgTGVhdmUgQmxhbmsgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICpcblx0ICpcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBzRGF0YVByb3BlcnR5UGF0aCBEYXRhIHByb3BlcnR5IHBhdGhcblx0ICogQHJldHVybnMgVGhlIGtleSBwYXRoXG5cdCAqL1xuXHRnZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94OiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbiA9XG5cdFx0XHRcdFx0c0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAtMSAmJiBvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIilbMF0pO1xuXHRcdFx0XHRpZiAob0NvbnRleHQgJiYgKG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoKSB8fCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24pKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5VmFsdWVzLnB1c2gob0NvbnRleHQuZ2V0T2JqZWN0KHNEYXRhUHJvcGVydHlQYXRoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYVVuaXF1ZVByb3BlcnR5VmFsdWVzID0gYVByb3BlcnR5VmFsdWVzLmZpbHRlcihNYXNzRWRpdEhlbHBlci5nZXRVbmlxdWVWYWx1ZXMpO1xuXHRcdFx0aWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdHJldHVybiBgRGVmYXVsdC8ke3NEYXRhUHJvcGVydHlQYXRofWA7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIGBFbXB0eS8ke3NEYXRhUHJvcGVydHlQYXRofWA7XG5cdFx0XHR9IGVsc2UgaWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIGAke3NEYXRhUHJvcGVydHlQYXRofS8ke2FVbmlxdWVQcm9wZXJ0eVZhbHVlc1swXX1gO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlIFtib3RoIHN0YXRpYyBhbmQgcGF0aCBiYXNlZF0gZm9yIHRhYmxlJ3Mgc2VsZWN0ZWQgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIGhpZGRlblZhbHVlIEhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlIC8gcGF0aCBmb3IgZmllbGRcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEByZXR1cm5zIFRoZSBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZVxuXHQgKi9cblx0Z2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0czogZnVuY3Rpb24gKGhpZGRlblZhbHVlOiBhbnksIGFDb250ZXh0czogYW55W10pIHtcblx0XHRpZiAoaGlkZGVuVmFsdWUgJiYgaGlkZGVuVmFsdWUuJFBhdGgpIHtcblx0XHRcdHJldHVybiAhYUNvbnRleHRzLnNvbWUoZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoaGlkZGVuVmFsdWUuJFBhdGgpID09PSBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gaGlkZGVuVmFsdWU7XG5cdH0sXG5cblx0Z2V0SW5wdXRUeXBlOiBmdW5jdGlvbiAocHJvcGVydHlJbmZvOiBhbnksIGRhdGFGaWVsZENvbnZlcnRlZDogYW55LCBvRGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZWRpdFN0eWxlUHJvcGVydGllcyA9IHt9IGFzIEZpZWxkUHJvcGVydGllcztcblx0XHRsZXQgaW5wdXRUeXBlITogc3RyaW5nO1xuXHRcdGlmIChwcm9wZXJ0eUluZm8pIHtcblx0XHRcdHNldEVkaXRTdHlsZVByb3BlcnRpZXMoZWRpdFN0eWxlUHJvcGVydGllcywgZGF0YUZpZWxkQ29udmVydGVkLCBvRGF0YU1vZGVsUGF0aCwgdHJ1ZSk7XG5cdFx0XHRpbnB1dFR5cGUgPSBlZGl0U3R5bGVQcm9wZXJ0aWVzPy5lZGl0U3R5bGUgfHwgXCJcIjtcblx0XHR9XG5cdFx0Y29uc3QgaXNWYWxpZEZvck1hc3NFZGl0ID1cblx0XHRcdGlucHV0VHlwZSAmJlxuXHRcdFx0W1wiRGF0ZVBpY2tlclwiLCBcIlRpbWVQaWNrZXJcIiwgXCJEYXRlVGltZVBpY2tlclwiLCBcIlJhdGluZ0luZGljYXRvclwiXS5pbmRleE9mKGlucHV0VHlwZSkgPT09IC0xICYmXG5cdFx0XHQhaXNDb2xsZWN0aW9uRmllbGQob0RhdGFNb2RlbFBhdGgpICYmXG5cdFx0XHQhaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzKHByb3BlcnR5SW5mbyk7XG5cblx0XHRyZXR1cm4gKGlzVmFsaWRGb3JNYXNzRWRpdCB8fCBcIlwiKSAmJiBpbnB1dFR5cGU7XG5cdH0sXG5cblx0Z2V0SXNGaWVsZEdycDogZnVuY3Rpb24gKGRhdGFGaWVsZENvbnZlcnRlZDogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZCAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFubm90YXRpb25cIiAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC52YWx1ZSAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC52YWx1ZS5pbmRleE9mKFwiRmllbGRHcm91cFwiKSA+IC0xXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRleHQgcGF0aCBmb3IgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHRleHRCaW5kaW5nIFRleHQgQmluZGluZyBJbmZvXG5cdCAqIEBwYXJhbSBkaXNwbGF5TW9kZSBEaXNwbGF5IG1vZGVcblx0ICogQHJldHVybnMgVGV4dCBQcm9wZXJ0eSBQYXRoIGlmIGl0IGV4aXN0c1xuXHQgKi9cblx0Z2V0VGV4dFBhdGg6IGZ1bmN0aW9uIChwcm9wZXJ0eTogc3RyaW5nLCB0ZXh0QmluZGluZzogYW55LCBkaXNwbGF5TW9kZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgZGVzY3JpcHRpb25QYXRoO1xuXHRcdGlmICh0ZXh0QmluZGluZyAmJiAodGV4dEJpbmRpbmcucGF0aCB8fCAodGV4dEJpbmRpbmcucGFyYW1ldGVycyAmJiB0ZXh0QmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCkpICYmIHByb3BlcnR5KSB7XG5cdFx0XHRpZiAodGV4dEJpbmRpbmcucGF0aCAmJiBkaXNwbGF5TW9kZSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHRleHRCaW5kaW5nLnBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0dGV4dEJpbmRpbmcucGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wczogQmluZGluZ0luZm8pIHtcblx0XHRcdFx0XHRpZiAocHJvcHMucGF0aCAmJiBwcm9wcy5wYXRoICE9PSBwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoID0gcHJvcHMucGF0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZGVzY3JpcHRpb25QYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIEpTT04gTW9kZWwgZm9yIHByb3BlcnRpZXMgb2YgZGlhbG9nIGZpZWxkcyBbbGFiZWwsIHZpc2libGl0eSwgZGF0YXByb3BlcnR5LCBldGMuXS5cblx0ICpcblx0ICogQHBhcmFtIG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIG1vZGVsXG5cdCAqL1xuXHRwcmVwYXJlRGF0YUZvckRpYWxvZzogZnVuY3Rpb24gKG9UYWJsZTogVGFibGUsIGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9UYWJsZSAmJiAob1RhYmxlLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KSxcblx0XHRcdHNDdXJyZW50RW50aXR5U2V0TmFtZSA9IG9UYWJsZS5kYXRhKFwibWV0YVBhdGhcIiksXG5cdFx0XHRhVGFibGVGaWVsZHMgPSBNYXNzRWRpdEhlbHBlci5nZXRUYWJsZUZpZWxkcyhvVGFibGUpLFxuXHRcdFx0b0VudGl0eVR5cGVDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vQGApLFxuXHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lKSxcblx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlUeXBlQ29udGV4dCk7XG5cblx0XHRjb25zdCBvRGF0YUZpZWxkTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0bGV0IG9SZXN1bHQ7XG5cdFx0bGV0IHNMYWJlbFRleHQ7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdGxldCBzVW5pdFByb3BlcnR5UGF0aDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0O1xuXHRcdGxldCBvVGV4dEJpbmRpbmc7XG5cblx0XHRhVGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eVBhdGggPSBvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cdFx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0bGV0IG9Qcm9wZXJ0eUluZm8gPSBzRGF0YVByb3BlcnR5UGF0aCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c0RhdGFQcm9wZXJ0eVBhdGh9QGApO1xuXHRcdFx0XHRzTGFiZWxUZXh0ID1cblx0XHRcdFx0XHRvQ29sdW1uSW5mby5sYWJlbCB8fFxuXHRcdFx0XHRcdChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCJdKSB8fFxuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLmRhdGFQcm9wZXJ0eTtcblxuXHRcdFx0XHRpZiAob0RhdGFNb2RlbE9iamVjdFBhdGgpIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofUBgKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXG5cdFx0XHRcdGxldCBvRGF0YU1vZGVsUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRmllbGRDb250ZXh0LCBvRW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmIChvRGF0YUZpZWxkQ29udmVydGVkPy5WYWx1ZT8ucGF0aD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgob0RhdGFNb2RlbFBhdGgsIHNEYXRhUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiSGlkZGVuRmllbGQgPVxuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMoXG5cdFx0XHRcdFx0XHRvRmllbGRDb250ZXh0ICYmIG9GaWVsZENvbnRleHQuZ2V0T2JqZWN0KClbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzXG5cdFx0XHRcdFx0KSB8fCBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNJbWFnZSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdO1xuXG5cdFx0XHRcdG9JbnRlcmZhY2UuY29udGV4dCA9IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c0RhdGFQcm9wZXJ0eVBhdGh9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdG9Qcm9wZXJ0eUluZm8gPVxuXHRcdFx0XHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQuX3R5cGUgPT09IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0PyBvRGF0YUZpZWxkQ29udmVydGVkXG5cdFx0XHRcdFx0XHQ6IChvRGF0YUZpZWxkQ29udmVydGVkICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5WYWx1ZS4kdGFyZ2V0KSB8fFxuXHRcdFx0XHRcdFx0ICAob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0Ly8gRGF0YWZpZWxkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRmllbGRDb250cm9sIGNhbGN1bGF0aW9uLCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZFxuXG5cdFx0XHRcdGNvbnN0IGNoYXJ0UHJvcGVydHkgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm8udGVybSAmJiBvUHJvcGVydHlJbmZvLnRlcm0gPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnRcIjtcblx0XHRcdFx0Y29uc3QgaXNBY3Rpb24gPSAhIW9EYXRhRmllbGRDb252ZXJ0ZWQuQWN0aW9uO1xuXHRcdFx0XHRjb25zdCBpc0ZpZWxkR3JwID0gTWFzc0VkaXRIZWxwZXIuZ2V0SXNGaWVsZEdycChvRGF0YUZpZWxkQ29udmVydGVkKTtcblxuXHRcdFx0XHRpZiAoaXNJbWFnZSB8fCBiSGlkZGVuRmllbGQgfHwgY2hhcnRQcm9wZXJ0eSB8fCBpc0FjdGlvbiB8fCBpc0ZpZWxkR3JwKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVmFsdWVIZWxwIHByb3BlcnRpZXNcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWQgPSBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoID1cblx0XHRcdFx0XHQoKGhhc0N1cnJlbmN5KG9Qcm9wZXJ0eUluZm8pIHx8IGhhc1VuaXQob1Byb3BlcnR5SW5mbykpICYmIGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKG9Qcm9wZXJ0eUluZm8pKSB8fCBcIlwiO1xuXHRcdFx0XHRjb25zdCB1bml0UHJvcGVydHlJbmZvID0gc1VuaXRQcm9wZXJ0eVBhdGggJiYgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHlJbmZvKTtcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWRGb3JVbml0ID0gdW5pdFByb3BlcnR5SW5mbyAmJiBoYXNWYWx1ZUhlbHAodW5pdFByb3BlcnR5SW5mbyk7XG5cblx0XHRcdFx0Ly8gRWRpdE1vZGUgYW5kIElucHV0VHlwZVxuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mby5WYWx1ZSA/IG9Qcm9wZXJ0eUluZm8uVmFsdWUgOiBvUHJvcGVydHlJbmZvO1xuXHRcdFx0XHRjb25zdCBleHBCaW5kaW5nID0gZ2V0RWRpdE1vZGUocHJvcGVydHlGb3JGaWVsZENvbnRyb2wsIG9EYXRhTW9kZWxQYXRoLCBmYWxzZSwgZmFsc2UsIG9EYXRhRmllbGRDb252ZXJ0ZWQsIGNvbnN0YW50KHRydWUpKTtcblx0XHRcdFx0Y29uc3QgZWRpdE1vZGVWYWx1ZXMgPSBPYmplY3Qua2V5cyhFZGl0TW9kZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlSXNTdGF0aWMgPSAhIWV4cEJpbmRpbmcgJiYgZWRpdE1vZGVWYWx1ZXMuaW5jbHVkZXMoZXhwQmluZGluZyBhcyBFZGl0TW9kZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRhYmxlID0gISFleHBCaW5kaW5nICYmICgoZWRpdE1vZGVJc1N0YXRpYyAmJiBleHBCaW5kaW5nID09PSBFZGl0TW9kZS5FZGl0YWJsZSkgfHwgIWVkaXRNb2RlSXNTdGF0aWMpO1xuXHRcdFx0XHRjb25zdCBuYXZQcm9wZXJ0eVdpdGhWYWx1ZUhlbHAgPSBzRGF0YVByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgJiYgYlZhbHVlSGVscEVuYWJsZWQ7XG5cdFx0XHRcdGlmICghZWRpdGFibGUgfHwgbmF2UHJvcGVydHlXaXRoVmFsdWVIZWxwKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoICYmICFzRGF0YVByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0XCI6XG5cdFx0XHRcdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiAhc1VuaXRQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpID8gYlZhbHVlSGVscEVuYWJsZWRGb3JVbml0IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFwiOiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c0RhdGFQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwVW5pdFwiOiBzVW5pdFByb3BlcnR5UGF0aCAmJiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c1VuaXRQcm9wZXJ0eVBhdGh9YCxcblx0XHRcdFx0XHRcdFwiaXNGaWVsZFJlcXVpcmVkXCI6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblBhdGhcIjogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25Vbml0UGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzVW5pdFByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZW50aXR5U2V0XCI6IHNDdXJyZW50RW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdFwiZGlzcGxheVwiOiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IE1hc3NFZGl0SGVscGVyLmdldFRleHRQYXRoKHNEYXRhUHJvcGVydHlQYXRoLCBvVGV4dEJpbmRpbmcsIGRpc3BsYXlNb2RlKSxcblx0XHRcdFx0XHRcdFwibnVsbGFibGVcIjogb1Byb3BlcnR5SW5mby5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gb1Byb3BlcnR5SW5mby5udWxsYWJsZSA6IHRydWUsXG5cdFx0XHRcdFx0XHRcImlzUHJvcGVydHlSZWFkT25seVwiOiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImlucHV0VHlwZVwiOiBpbnB1dFR5cGUsXG5cdFx0XHRcdFx0XHRcImVkaXRNb2RlXCI6IGVkaXRhYmxlID8gZXhwQmluZGluZyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFwidW5pdERhdGFQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoICYmIFwiZmllbGRzSW5mbz4vdW5pdERhdGEvXCIsXG5cdFx0XHRcdFx0XHRcInZhbHVlc1BhdGhcIjogXCJmaWVsZHNJbmZvPi92YWx1ZXMvXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGFEYXRhQXJyYXkucHVzaChvUmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EYXRhRmllbGRNb2RlbC5zZXREYXRhKGFEYXRhQXJyYXkpO1xuXHRcdHJldHVybiBvRGF0YUZpZWxkTW9kZWw7XG5cdH0sXG5cblx0Z2V0VGFibGVGaWVsZHM6IGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IGFDb2x1bW5zID0gKG9UYWJsZSAmJiBvVGFibGUuZ2V0Q29sdW1ucygpKSB8fCBbXTtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29sdW1ucztcblx0XHRyZXR1cm4gYUNvbHVtbnMubWFwKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSBvQ29sdW1uICYmIG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCksXG5cdFx0XHRcdGFSZWFsdGVkQ29sdW1uSW5mbyA9XG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEgJiZcblx0XHRcdFx0XHRjb2x1bW5zRGF0YS5maWx0ZXIoZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uSW5mby5uYW1lID09PSBzRGF0YVByb3BlcnR5ICYmIG9Db2x1bW5JbmZvLnR5cGUgPT09IFwiQW5ub3RhdGlvblwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XCJsYWJlbFwiOiBvQ29sdW1uLmdldEhlYWRlcigpLFxuXHRcdFx0XHRcImFubm90YXRpb25QYXRoXCI6IGFSZWFsdGVkQ29sdW1uSW5mbyAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdLmFubm90YXRpb25QYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRUZXh0c0ZvckRpYWxvZzogZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZTogYW55LCBpU2VsZWN0ZWRDb250ZXh0czogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdC8vIFRoZSBjb25maXJtIGJ1dHRvbiB0ZXh0IGlzIFwiU2F2ZVwiIGZvciB0YWJsZSBpbiBEaXNwbGF5IG1vZGUgYW5kIFwiQXBwbHlcIiBmb3IgdGFibGUgaW4gZWRpdCBtb2RlLiBUaGlzIGNhbiBiZSBsYXRlciBleHBvc2VkIGlmIG5lZWRlZC5cblx0XHRjb25zdCBiRGlzcGxheU1vZGUgPSBvVGFibGUuZGF0YShcImRpc3BsYXlNb2RlUHJvcGVydHlCaW5kaW5nXCIpID09PSBcInRydWVcIjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRcImtlZXBFeGlzdGluZ1ByZWZpeFwiOiBcIjwgS2VlcFwiLFxuXHRcdFx0XCJsZWF2ZUJsYW5rVmFsdWVcIjogXCI8IExlYXZlIEJsYW5rID5cIixcblx0XHRcdFwiY2xlYXJGaWVsZFZhbHVlXCI6IFwiPCBDbGVhciBWYWx1ZXMgPlwiLFxuXHRcdFx0XCJtYXNzRWRpdFRpdGxlXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0XCJhcHBseUJ1dHRvblRleHRcIjogYkRpc3BsYXlNb2RlXG5cdFx0XHRcdD8gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TQVZFX0JVVFRPTl9URVhUXCIpXG5cdFx0XHRcdDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9BUFBMWV9CVVRUT05fVEVYVFwiKSxcblx0XHRcdFwidXNlVmFsdWVIZWxwVmFsdWVcIjogXCI8IFVzZSBWYWx1ZSBIZWxwID5cIixcblx0XHRcdFwiY2FuY2VsQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFwibm9GaWVsZHNcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9OT19FRElUQUJMRV9GSUVMRFNcIiksXG5cdFx0XHRcIm9rQnV0dG9uVGV4dFwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiKVxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzdWZmaXggdG8gdGhlICdrZWVwIGV4aXN0aW5nJyBwcm9wZXJ0eSBvZiB0aGUgY29tYm9Cb3guXG5cdCAqXG5cdCAqIEBwYXJhbSBzSW5wdXRUeXBlIElucHV0VHlwZSBvZiB0aGUgZmllbGRcblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHN0cmluZ1xuXHQgKi9cblx0Ly8gZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZzogZnVuY3Rpb24gKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHQvLyBcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHQvLyBcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHQvLyBcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHQvLyBcdFx0Y2FzZSBcIkRhdGVQaWNrZXJcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRjYXNlIFwiQ2hlY2tCb3hcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRkZWZhdWx0OlxuXHQvLyBcdFx0XHRzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblx0Ly8gXHR9XG5cdC8vIFx0cmV0dXJuIHNSZXN1bHQ7XG5cdC8vIH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIG1vZGVsIFtLZWVwIEV4aXN0aW5nIFZhbHVlcywgTGVhdmUgQmxhbmtdLlxuXHQgKlxuXHQgKiBAcGFyYW0gYVZhbHVlcyBBcnJheSBpbnN0YW5jZSB3aGVyZSB0aGUgZGVmYXVsdCBkYXRhIG5lZWRzIHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIEFwcGxpY2F0aW9uIE1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvUHJvcGVydHlJbmZvIFByb3BlcnR5IGluZm9ybWF0aW9uXG5cdCAqIEBwYXJhbSBiVU9NRmllbGRcblx0ICovXG5cdHNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZzogZnVuY3Rpb24gKGFWYWx1ZXM6IGFueSwgb0RlZmF1bHRWYWx1ZXM6IGFueSwgb1Byb3BlcnR5SW5mbzogYW55LCBiVU9NRmllbGQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGJVT01GaWVsZCA/IG9Qcm9wZXJ0eUluZm8udW5pdFByb3BlcnR5IDogb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdC8vIGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBcIlZhbHVlc1wiO1xuXHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMgPSBhVmFsdWVzLmRlZmF1bHRPcHRpb25zIHx8IFtdO1xuXHRcdGNvbnN0IHNlbGVjdE9wdGlvbnNFeGlzdCA9IGFWYWx1ZXMuc2VsZWN0T3B0aW9ucyAmJiBhVmFsdWVzLnNlbGVjdE9wdGlvbnMubGVuZ3RoID4gMDtcblx0XHRjb25zdCBrZWVwRW50cnkgPSB7XG5cdFx0XHR0ZXh0OiBgJHtvRGVmYXVsdFZhbHVlcy5rZWVwRXhpc3RpbmdQcmVmaXh9ICR7c1N1ZmZpeEZvcktlZXBFeGlzdGluZ30gPmAsXG5cdFx0XHRrZXk6IGBEZWZhdWx0LyR7c1Byb3BlcnR5UGF0aH1gXG5cdFx0fTtcblxuXHRcdGlmIChzSW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdGNvbnN0IGZhbHNlRW50cnkgPSB7IHRleHQ6IFwiTm9cIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS9mYWxzZWAsIHRleHRJbmZvOiB7IHZhbHVlOiBmYWxzZSB9IH07XG5cdFx0XHRjb25zdCB0cnV0aHlFbnRyeSA9IHsgdGV4dDogXCJZZXNcIiwga2V5OiBgJHtzUHJvcGVydHlQYXRofS90cnVlYCwgdGV4dEluZm86IHsgdmFsdWU6IHRydWUgfSB9O1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGZhbHNlRW50cnkpO1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHRydXRoeUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdCh0cnV0aHlFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWQgfHwgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRcdGNvbnN0IHZoZEVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy51c2VWYWx1ZUhlbHBWYWx1ZSwga2V5OiBgVXNlVmFsdWVIZWxwVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdH1cblx0XHRcdGlmIChzZWxlY3RPcHRpb25zRXhpc3QpIHtcblx0XHRcdFx0aWYgKGJQcm9wZXJ0eVJlcXVpcmVkICE9PSBcInRydWVcIiAmJiAhYlVPTUZpZWxkKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2xlYXJFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IGBDbGVhckZpZWxkVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoY2xlYXJFbnRyeSk7XG5cdFx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGVtcHR5RW50cnkgPSB7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBgRGVmYXVsdC8ke3NQcm9wZXJ0eVBhdGh9YCB9O1xuXHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoZW1wdHlFbnRyeSk7XG5cdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IGFycmFuZ2VtZW50IGluZm8gZm9yIGEgY29udGV4dCBwcm9wZXJ0eS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IFBhdGhcblx0ICogQHBhcmFtIGRlc2NyaXB0aW9uUGF0aCBQYXRoIHRvIHRleHQgYXNzb2NpYXRpb24gb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBkaXNwbGF5TW9kZSBEaXNwbGF5IG1vZGUgb2YgdGhlIHByb3BlcnR5IGFuZCB0ZXh0IGFzc29jaWF0aW9uXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMgVGhlIHRleHQgYXJyYW5nZW1lbnRcblx0ICovXG5cdGdldFRleHRBcnJhbmdlbWVudEluZm86IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGRlc2NyaXB0aW9uUGF0aDogc3RyaW5nLFxuXHRcdGRpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdFx0c2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0XG5cdCk6IFRleHRBcnJhbmdlbWVudEluZm8ge1xuXHRcdGxldCB2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpLFxuXHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSxcblx0XHRcdGZ1bGxUZXh0O1xuXHRcdGlmIChkZXNjcmlwdGlvblBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRcdHN3aXRjaCAoZGlzcGxheU1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoZGVzY3JpcHRpb25QYXRoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWUgPyBgJHt2YWx1ZX0gKCR7ZGVzY3JpcHRpb25WYWx1ZX0pYCA6IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlID8gYCR7ZGVzY3JpcHRpb25WYWx1ZX0gKCR7dmFsdWV9KWAgOiB2YWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRMb2cuaW5mbyhgRGlzcGxheSBQcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogJHtwcm9wZXJ0eX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJ0ZXh0QXJyYW5nZW1lbnRcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcInZhbHVlUGF0aFwiOiBwcm9wZXJ0eSxcblx0XHRcdFwiZGVzY3JpcHRpb25QYXRoXCI6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFwidmFsdWVcIjogdmFsdWUsXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRcImZ1bGxUZXh0XCI6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW55IFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRpc0VkaXRhYmxlOiBmdW5jdGlvbiAoYW55OiBBbnlUeXBlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZyA9IGFueS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXHRcdGNvbnN0IHZhbHVlID0gKGJpbmRpbmcgYXMgYW55KS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBFZGl0TW9kZS5FZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgbWFzcyBlZGl0IGZpZWxkIG9uIGNoYW5nZSBvZiB0aGUgTWFuYWdlZE9iamVjdCBBbnkgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqL1xuXHRvbkNvbnRleHRFZGl0YWJsZUNoYW5nZTogZnVuY3Rpb24gKG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvYmplY3RzRm9yVmlzaWJpbGl0eSA9IG9EaWFsb2dEYXRhTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtkYXRhUHJvcGVydHl9L29iamVjdHNGb3JWaXNpYmlsaXR5YCkgfHwgW107XG5cdFx0Y29uc3QgZWRpdGFibGUgPSBvYmplY3RzRm9yVmlzaWJpbGl0eS5zb21lKE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUpO1xuXG5cdFx0aWYgKGVkaXRhYmxlKSB7XG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsLnNldFByb3BlcnR5KGAvdmFsdWVzLyR7ZGF0YVByb3BlcnR5fS92aXNpYmxlYCwgZWRpdGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIE1hbmFnZWQgT2JqZWN0IEFueSBmb3IgdmlzaWJpbGl0eSBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICpcblx0ICogQHBhcmFtIG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hDaGFuZ2UoTWFzc0VkaXRIZWxwZXIub25Db250ZXh0RWRpdGFibGVDaGFuZ2UuYmluZChudWxsLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGJvdW5kIG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIHZpc2liaWxpdHkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKi9cblx0Z2V0Qm91bmRPYmplY3Q6IGZ1bmN0aW9uIChleHBCaW5kaW5nOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgY29udGV4dDogQ29udGV4dCk6IEFueVR5cGUge1xuXHRcdGNvbnN0IG1PVG9Vc2UgPSBuZXcgQW55KHsgYW55OiBleHBCaW5kaW5nIH0pO1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdG1PVG9Vc2Uuc2V0TW9kZWwobW9kZWwpO1xuXHRcdG1PVG9Vc2Uuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cblx0XHRyZXR1cm4gbU9Ub1VzZTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIGV4cEJpbmRpbmcgQmluZGluZyBTdHJpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoZSBiaW5kaW5nIHZhbHVlLlxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hc3MgZWRpdCBmaWVsZCBpcyBlZGl0YWJsZS5cblx0ICovXG5cdGdldEZpZWxkVmlzaWJsaXR5OiBmdW5jdGlvbiAoXG5cdFx0ZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0b0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLFxuXHRcdGRhdGFQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbnRleHQ6IENvbnRleHRcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IE1hc3NFZGl0SGVscGVyLmdldEJvdW5kT2JqZWN0KGV4cEJpbmRpbmcsIGNvbnRleHQpO1xuXHRcdGNvbnN0IGlzQ29udGV4dEVkaXRhYmxlID0gTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZShtT1RvVXNlKTtcblxuXHRcdGlmICghaXNDb250ZXh0RWRpdGFibGUpIHtcblx0XHRcdE1hc3NFZGl0SGVscGVyLnVwZGF0ZU9uQ29udGV4dENoYW5nZShtT1RvVXNlLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHksIHZhbHVlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBpc0NvbnRleHRFZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBydW50aW1lIG1vZGVsOlxuXHQgKiA9PiBUaGUgbW9kZWwgY29uc2lzdHMgb2YgdmFsdWVzIHNob3duIGluIHRoZSBjb21ib0JveCBvZiB0aGUgZGlhbG9nIChMZWF2ZSBCbGFuaywgS2VlcCBFeGlzdGluZyBWYWx1ZXMsIG9yIGFueSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRleHQsIGV0Yy4pXG5cdCAqID0+IFRoZSBtb2RlbCB3aWxsIGNhcHR1cmUgcnVudGltZSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIHByb3BlcnR5ICh0aGUgdmFsdWUgZW50ZXJlZCBpbiB0aGUgY29tYm9Cb3gpLlxuXHQgKlxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIGFEYXRhQXJyYXkgQXJyYXkgY29udGFpbmluZyBkYXRhIHJlbGF0ZWQgdG8gdGhlIGRpYWxvZyB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHBhcmFtIG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gaTE4blxuXHQgKiBAcGFyYW0gZGlhbG9nQ29udGV4dCBUcmFuc2llbnQgY29udGV4dCBmb3IgbWFzcyBlZGl0IGRpYWxvZy5cblx0ICogQHJldHVybnMgVGhlIHJ1bnRpbWUgbW9kZWxcblx0ICovXG5cdHNldFJ1bnRpbWVNb2RlbE9uRGlhbG9nOiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10sIG9EZWZhdWx0VmFsdWVzOiBhbnksIGRpYWxvZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBhVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFVbml0RGF0YTogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRjb25zdCB0ZXh0UGF0aHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXG5cdFx0Y29uc3Qgb0RhdGEgPSB7XG5cdFx0XHRcInZhbHVlc1wiOiBhVmFsdWVzLFxuXHRcdFx0XCJ1bml0RGF0YVwiOiBhVW5pdERhdGEsXG5cdFx0XHRcInJlc3VsdHNcIjogYVJlc3VsdHMsXG5cdFx0XHRcInJlYWRhYmxlUHJvcGVydHlEYXRhXCI6IGFSZWFkT25seUZpZWxkSW5mbyxcblx0XHRcdFwic2VsZWN0ZWRLZXlcIjogdW5kZWZpbmVkLFxuXHRcdFx0XCJ0ZXh0UGF0aHNcIjogdGV4dFBhdGhzLFxuXHRcdFx0XCJub0ZpZWxkc1wiOiBvRGVmYXVsdFZhbHVlcy5ub0ZpZWxkc1xuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgb1RleHRJbmZvO1xuXHRcdFx0bGV0IHNQcm9wZXJ0eUtleTtcblx0XHRcdGxldCBzVW5pdFByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFVuaXRNYXA6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIG9JbkRhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvSW5EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyAvKiwgZGlhbG9nQ29udGV4dCAqLyk7XG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzID0gb0luRGF0YS5kYXRhUHJvcGVydHkuc3BsaXQoXCIvXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtzTXVsdGlMZXZlbFBhdGhWYWx1ZX1gO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSxcblx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0luRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdGlmIChvSW5EYXRhLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV19YDtcblx0XHRcdFx0XHRpZiAob0luRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0ucHVzaChlbnRyeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS51bml0UHJvcGVydHldKSB7XG5cdFx0XHRcdFx0XHRzVW5pdFByb3BlcnR5TmFtZSA9IGAke29JbkRhdGEudW5pdFByb3BlcnR5fS8ke29EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XX1gO1xuXHRcdFx0XHRcdFx0aWYgKCFvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRcdFwia2V5XCI6IHNVbml0UHJvcGVydHlOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh1bml0RW50cnkpO1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0udGV4dEluZm8gPSB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiBvSW5EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvSW5EYXRhLmRpc3BsYXlcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRkaWFsb2dDb250ZXh0LnNldFByb3BlcnR5KG9JbkRhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFVuaXRNYXApLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0luRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGV4dFBhdGhzW29JbkRhdGEuZGF0YVByb3BlcnR5XSA9IG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoID8gW29JbkRhdGEuZGVzY3JpcHRpb25QYXRoXSA6IFtdO1xuXHRcdH0pO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgdmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvSW5EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0luRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRpZiAoIXNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSkge1xuXHRcdFx0XHRcdHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IGBFbXB0eS8ke29JbkRhdGEuZGF0YVByb3BlcnR5fWAgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlcyA9IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0pIHtcblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLCBvRGVmYXVsdFZhbHVlcywgb0luRGF0YSk7XG5cdFx0XHRcdHZhbHVlcyA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KFxuXHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9JbkRhdGEuaW5wdXRUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHx8XG5cdFx0XHRcdChvSW5EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cyA9XG5cdFx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogYEVtcHR5LyR7b0luRGF0YS5kYXRhUHJvcGVydHl9YCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24gKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGBFbXB0eS8ke29JbkRhdGEudW5pdFByb3BlcnR5fWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ICYmIHR5cGVvZiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LCB2YWx1ZTogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHksIHR5cGU6IFwiRGVmYXVsdFwiIH0pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHMgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0gJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDJcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBSZWFkT25seUV4cHJlc3Npb24gY2hhbmdlXG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHtcblx0XHRcdFx0XHRcInByb3BlcnR5XCI6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aDogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMi52YWx1ZSxcblx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0dGluZyB2aXNiaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0XHRcdGlmIChvSW5EYXRhLmVkaXRNb2RlKSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID1cblx0XHRcdFx0XHRvSW5EYXRhLmVkaXRNb2RlID09PSBFZGl0TW9kZS5FZGl0YWJsZSB8fFxuXHRcdFx0XHRcdGFDb250ZXh0cy5zb21lKFxuXHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0RmllbGRWaXNpYmxpdHkuYmluZChcblx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZWRpdE1vZGUsXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2dEYXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHR2YWx1ZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWVzLnZpc2libGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0dmFsdWVzLnNlbGVjdGVkS2V5ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdHZhbHVlcy5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdHZhbHVlcy51bml0UHJvcGVydHkgPSBvSW5EYXRhLnVuaXRQcm9wZXJ0eTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBvRGlhbG9nRGF0YU1vZGVsO1xuXHR9LFxuXHQvKipcblx0ICogR2V0cyB0cmFuc2llbnQgY29udGV4dCBmb3IgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFibGUgSW5zdGFuY2Ugb2YgVGFibGUuXG5cdCAqIEBwYXJhbSBkaWFsb2cgTWFzcyBFZGl0IERpYWxvZy5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Z2V0RGlhbG9nQ29udGV4dDogZnVuY3Rpb24gKHRhYmxlOiBUYWJsZSwgZGlhbG9nPzogRGlhbG9nKTogQ29udGV4dCB7XG5cdFx0bGV0IHRyYW5zQ3R4OiBDb250ZXh0ID0gKGRpYWxvZyAmJiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSkgYXMgQ29udGV4dDtcblxuXHRcdGlmICghdHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0KHRyYW5zaWVudExpc3RCaW5kaW5nIGFzIGFueSkucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvKiAqL1xuXHRcdFx0fTtcblx0XHRcdHRyYW5zQ3R4ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHt9LCB0cnVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNDdHg7XG5cdH0sXG5cblx0b25EaWFsb2dPcGVuOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0ZmllbGRzSW5mb01vZGVsLnNldFByb3BlcnR5KFwiL2lzT3BlblwiLCB0cnVlKTtcblx0fSxcblxuXHRjbG9zZURpYWxvZzogZnVuY3Rpb24gKG9EaWFsb2c6IGFueSkge1xuXHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0fSxcblxuXHRtZXNzYWdlSGFuZGxpbmdGb3JNYXNzRWRpdDogZnVuY3Rpb24gKFxuXHRcdG9UYWJsZTogVGFibGUsXG5cdFx0YUNvbnRleHRzOiBhbnksXG5cdFx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRcdG9JbkRpYWxvZzogYW55LFxuXHRcdGFSZXN1bHRzOiBhbnksXG5cdFx0ZXJyb3JWYWx1ZXM6IGFueVxuXHQpIHtcblx0XHRjb25zdCBzdWJ0aXRsZUNvbHVtbiA9IENvbW1vblV0aWxzLmdldE1lc3NhZ2VDb2x1bW4ob1RhYmxlKTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cyA9IFtdIGFzIGFueSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3QgRHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXM7XG5cblx0XHRtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlOiBhbnkpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2VUYXJnZXRzID0gbWVzc2FnZS5nZXRUYXJnZXRzKCk7XG5cdFx0XHRpZiAobWVzc2FnZVRhcmdldHMgJiYgbWVzc2FnZVRhcmdldHMubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VUYXJnZXRzWzBdLmxlbmd0aCAmJiBtZXNzYWdlLnBlcnNpc3RlbnQgPT09IHRydWUpIHtcblx0XHRcdFx0Y29uc3QgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0ID0gYUNvbnRleHRzLmZpbmQoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUYXJnZXQoKS5pbmRleE9mKG9Db250ZXh0LmdldFBhdGgoKSkgIT09IC0xO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0Ym91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5wdXNoKGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dCk7XG5cdFx0XHRcdG1lc3NhZ2UuYWRkaXRpb25hbFRleHQgPSBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRcblx0XHRcdFx0XHQ/IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dC5nZXRPYmplY3QoKT8uW3N1YnRpdGxlQ29sdW1uXVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChhUmVzdWx0cy5sZW5ndGggPiAwICYmIGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoID09PSAwICYmIGVycm9yVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdGNvbnN0IHN1Y2Nlc3NUb2FzdCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfU1VDQ0VTU19UT0FTVFwiKTtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHN1Y2Nlc3NUb2FzdCk7XG5cdFx0fSBlbHNlIGlmIChlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA8IChvVGFibGUgYXMgYW55KS5nZXRTZWxlY3RlZENvbnRleHRzKCkubGVuZ3RoKSB7XG5cdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdH0gZWxzZSBpZiAoZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPT09IChvVGFibGUgYXMgYW55KS5nZXRTZWxlY3RlZENvbnRleHRzKCkubGVuZ3RoKSB7XG5cdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdH1cblxuXHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdGlmIChvSW5EaWFsb2cuaXNPcGVuKCkpIHtcblx0XHRcdE1hc3NFZGl0SGVscGVyLmNsb3NlRGlhbG9nKG9JbkRpYWxvZyk7XG5cdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiLCBmYWxzZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBzaWRlIGVmZmVjdHMgbWFwIGZyb20gc2lkZSBlZmZlY3RzIGlkcyh3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGVudGl0eSB0eXBlIGFuZCBxdWFsaWZpZXIpLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0VudGl0eVNldENvbnRleHRcblx0ICogQHBhcmFtIGFTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0ICogQHBhcmFtIGFSZXN1bHRzXG5cdCAqIEByZXR1cm5zIFNpZGUgZWZmZWN0IG1hcCB3aXRoIGRhdGEuXG5cdCAqL1xuXHRnZXRTaWRlRWZmZWN0RGF0YUZvcktleTogZnVuY3Rpb24gKG9FbnRpdHlTZXRDb250ZXh0OiBhbnksIGFTaWRlRWZmZWN0czogYW55LCBvQ29udHJvbGxlcjogYW55LCBhUmVzdWx0czogYW55KSB7XG5cdFx0Y29uc3Qgc093bmVyRW50aXR5VHlwZSA9IG9FbnRpdHlTZXRDb250ZXh0LmdldFByb3BlcnR5KFwiJFR5cGVcIik7XG5cdFx0Y29uc3QgYmFzZVNpZGVFZmZlY3RzTWFwQXJyYXk6IGFueSA9IHt9O1xuXG5cdFx0YVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IHNQYXRoID0gcmVzdWx0LmtleVZhbHVlO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNBcnJheSA9IEZpZWxkSGVscGVyLmdldFNpZGVFZmZlY3RzT25FbnRpdHlBbmRQcm9wZXJ0eShzUGF0aCwgc093bmVyRW50aXR5VHlwZSwgYVNpZGVFZmZlY3RzKTtcblx0XHRcdGJhc2VTaWRlRWZmZWN0c01hcEFycmF5W3NQYXRoXSA9IG9Db250cm9sbGVyLl9zaWRlRWZmZWN0cy5nZW5lcmF0ZVNpZGVFZmZlY3RzTWFwRnJvbVNpZGVFZmZlY3RJZChzaWRlRWZmZWN0c0FycmF5KTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYmFzZVNpZGVFZmZlY3RzTWFwQXJyYXk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdpdmUgdGhlIGVudGl0eSB0eXBlIGZvciBhIGdpdmVuIHNwYXRoIGZvciBlLmcuUmVxdWVzdGVkUXVhbnRpdHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aFxuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWxcblx0ICogQHJldHVybnMgT2JqZWN0IGhhdmluZyBlbnRpdHksIHNwYXRoIGFuZCBuYXZpZ2F0aW9uIHBhdGguXG5cdCAqL1xuXHRmbkdldFBhdGhGb3JTb3VyY2VQcm9wZXJ0eTogZnVuY3Rpb24gKHNQYXRoOiBhbnksIHNFbnRpdHlUeXBlOiBhbnksIG9NZXRhTW9kZWw6IGFueSkge1xuXHRcdC8vIGlmIHRoZSBwcm9wZXJ0eSBwYXRoIGhhcyBhIG5hdmlnYXRpb24sIGdldCB0aGUgdGFyZ2V0IGVudGl0eSB0eXBlIG9mIHRoZSBuYXZpZ2F0aW9uXG5cdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID1cblx0XHRcdFx0c1BhdGguaW5kZXhPZihcIi9cIikgPiAwID8gXCIvXCIgKyBzRW50aXR5VHlwZSArIFwiL1wiICsgc1BhdGguc3Vic3RyKDAsIHNQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpICsgXCJAc2FwdWkubmFtZVwiIDogZmFsc2UsXG5cdFx0XHRwT3duZXJFbnRpdHkgPSAhc05hdmlnYXRpb25QYXRoID8gUHJvbWlzZS5yZXNvbHZlKHNFbnRpdHlUeXBlKSA6IG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChzTmF2aWdhdGlvblBhdGgpO1xuXHRcdHNQYXRoID0gc05hdmlnYXRpb25QYXRoID8gc1BhdGguc3Vic3RyKHNQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpIDogc1BhdGg7XG5cdFx0cmV0dXJuIHsgc1BhdGgsIHBPd25lckVudGl0eSwgc05hdmlnYXRpb25QYXRoIH07XG5cdH0sXG5cblx0Zm5HZXRFbnRpdHlUeXBlT2ZPd25lcjogZnVuY3Rpb24gKG9NZXRhTW9kZWw6IGFueSwgYmFzZU5hdlBhdGg6IHN0cmluZywgb0VudGl0eVNldENvbnRleHQ6IGFueSwgdGFyZ2V0RW50aXR5OiBzdHJpbmcsIGFUYXJnZXRzOiBhbnkpIHtcblx0XHRjb25zdCBvd25lckVudGl0eVR5cGUgPSBvRW50aXR5U2V0Q29udGV4dC5nZXRQcm9wZXJ0eShcIiRUeXBlXCIpO1xuXHRcdGNvbnN0IHsgXCIkVHlwZVwiOiBwT3duZXIsIFwiJFBhcnRuZXJcIjogb3duZXJOYXZQYXRoIH0gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtvRW50aXR5U2V0Q29udGV4dH0vJHtiYXNlTmF2UGF0aH1gKTsgLy8gbmF2IHBhdGhcblx0XHRpZiAob3duZXJOYXZQYXRoKSB7XG5cdFx0XHRjb25zdCBlbnRpdHlPYmpPZk93bmVyUGFydG5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtwT3duZXJ9LyR7b3duZXJOYXZQYXRofWApO1xuXHRcdFx0aWYgKGVudGl0eU9iak9mT3duZXJQYXJ0bmVyKSB7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVR5cGVPZk93bmVyUGFydG5lciA9IGVudGl0eU9iak9mT3duZXJQYXJ0bmVyW1wiJFR5cGVcIl07XG5cdFx0XHRcdC8vIGlmIHRoZSBlbnRpdHkgdHlwZXMgZGVmZXIsIHRoZW4gYmFzZSBuYXYgcGF0aCBpcyBub3QgZnJvbSBvd25lclxuXHRcdFx0XHRpZiAoZW50aXR5VHlwZU9mT3duZXJQYXJ0bmVyICE9PSBvd25lckVudGl0eVR5cGUpIHtcblx0XHRcdFx0XHQvLyBpZiB0YXJnZXQgUHJvcCBpcyBub3QgZnJvbSBvd25lciwgd2UgYWRkIGl0IGFzIGltbWVkaWF0ZVxuXHRcdFx0XHRcdGFUYXJnZXRzLnB1c2godGFyZ2V0RW50aXR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyAkUGFydG5lciBhdHRyaWJ1dGUsIGl0IG1heSBub3QgYmUgZnJvbSBvd25lclxuXHRcdFx0YVRhcmdldHMucHVzaCh0YXJnZXRFbnRpdHkpO1xuXHRcdH1cblx0XHRyZXR1cm4gYVRhcmdldHM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdpdmUgdGFyZ2V0cyB0aGF0IGFyZSBpbW1lZGlhdGUgb3IgZGVmZXJyZWQgYmFzZWQgb24gdGhlIGVudGl0eSB0eXBlIG9mIHRoYXQgdGFyZ2V0LlxuXHQgKlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNEYXRhXG5cdCAqIEBwYXJhbSBvRW50aXR5U2V0Q29udGV4dFxuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWxcblx0ICogQHJldHVybnMgVGFyZ2V0cyB0byByZXF1ZXN0IHNpZGUgZWZmZWN0cy5cblx0ICovXG5cdGZuR2V0VGFyZ2V0c0Zvck1hc3NFZGl0OiBmdW5jdGlvbiAoc2lkZUVmZmVjdHNEYXRhOiBhbnksIG9FbnRpdHlTZXRDb250ZXh0OiBhbnksIHNFbnRpdHlUeXBlOiBhbnksIG9NZXRhTW9kZWw6IGFueSkge1xuXHRcdGNvbnN0IHsgVGFyZ2V0UHJvcGVydGllczogYVRhcmdldFByb3BlcnRpZXMsIFRhcmdldEVudGl0aWVzOiBhVGFyZ2V0RW50aXRpZXMgfSA9IHNpZGVFZmZlY3RzRGF0YTtcblx0XHRjb25zdCBhUHJvbWlzZXM6IGFueSA9IFtdO1xuXHRcdGxldCBhVGFyZ2V0czogYW55ID0gW107XG5cdFx0Y29uc3Qgb3duZXJFbnRpdHlUeXBlID0gb0VudGl0eVNldENvbnRleHQuZ2V0UHJvcGVydHkoXCIkVHlwZVwiKTtcblxuXHRcdGlmIChzRW50aXR5VHlwZSA9PT0gb3duZXJFbnRpdHlUeXBlKSB7XG5cdFx0XHQvLyBpZiBTYWxlc09yZHIgSXRlbVxuXHRcdFx0YVRhcmdldEVudGl0aWVzPy5mb3JFYWNoKCh0YXJnZXRFbnRpdHk6IGFueSkgPT4ge1xuXHRcdFx0XHR0YXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHlbXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiXTtcblx0XHRcdFx0bGV0IGJhc2VOYXZQYXRoOiBzdHJpbmc7XG5cdFx0XHRcdGlmICh0YXJnZXRFbnRpdHkuaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdFx0YmFzZU5hdlBhdGggPSB0YXJnZXRFbnRpdHkuc3BsaXQoXCIvXCIpWzBdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJhc2VOYXZQYXRoID0gdGFyZ2V0RW50aXR5O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFUYXJnZXRzID0gTWFzc0VkaXRIZWxwZXIuZm5HZXRFbnRpdHlUeXBlT2ZPd25lcihvTWV0YU1vZGVsLCBiYXNlTmF2UGF0aCwgb0VudGl0eVNldENvbnRleHQsIHRhcmdldEVudGl0eSwgYVRhcmdldHMpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKGFUYXJnZXRQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0YVRhcmdldFByb3BlcnRpZXMuZm9yRWFjaCgodGFyZ2V0UHJvcDogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHsgcE93bmVyRW50aXR5IH0gPSBNYXNzRWRpdEhlbHBlci5mbkdldFBhdGhGb3JTb3VyY2VQcm9wZXJ0eSh0YXJnZXRQcm9wLCBzRW50aXR5VHlwZSwgb01ldGFNb2RlbCk7XG5cdFx0XHRcdGFQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdHBPd25lckVudGl0eS50aGVuKChyZXN1bHRFbnRpdHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gaWYgZW50aXR5IGlzIFNhbGVzT3JkZXJJdGVtLCBUYXJnZXQgUHJvcGVydHkgaXMgZnJvbSBJdGVtcyB0YWJsZVxuXHRcdFx0XHRcdFx0aWYgKHJlc3VsdEVudGl0eSA9PT0gb3duZXJFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdGFUYXJnZXRzLnB1c2godGFyZ2V0UHJvcCk7IC8vIGdldCBpbW1lZGlhdGUgdGFyZ2V0c1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0YXJnZXRQcm9wLmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBiYXNlTmF2UGF0aCA9IHRhcmdldFByb3Auc3BsaXQoXCIvXCIpWzBdO1xuXHRcdFx0XHRcdFx0XHRhVGFyZ2V0cyA9IE1hc3NFZGl0SGVscGVyLmZuR2V0RW50aXR5VHlwZU9mT3duZXIoXG5cdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRiYXNlTmF2UGF0aCxcblx0XHRcdFx0XHRcdFx0XHRvRW50aXR5U2V0Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRQcm9wLFxuXHRcdFx0XHRcdFx0XHRcdGFUYXJnZXRzXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFUYXJnZXRzKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFQcm9taXNlcy5wdXNoKFByb21pc2UucmVzb2x2ZShhVGFyZ2V0cykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChhUHJvbWlzZXMpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcG9uIHVwZGF0aW5nIHRoZSBmaWVsZCwgYXJyYXkgb2YgaW1tZWRpYXRlIGFuZCBkZWZlcnJlZCBzaWRlIGVmZmVjdHMgZm9yIHRoYXQgZmllbGQgYXJlIGNyZWF0ZWQuXG5cdCAqIElmIHRoZXJlIGFyZSBhbnkgZmFpbGVkIHNpZGUgZWZmZWN0cyBmb3IgdGhhdCBjb250ZXh0LCB0aGV5IHdpbGwgYWxzbyBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtYXAuXG5cdCAqIElmIHRoZSBmaWVsZCBoYXMgdGV4dCBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gYWRkIGl0IHRvIHJlcXVlc3Qgc2lkZSBlZmZlY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0gbVBhcmFtc1xuXHQgKiBAcGFyYW0gbVBhcmFtcy5vQ29udHJvbGxlciBDb250cm9sbGVyXG5cdCAqIEBwYXJhbSBtUGFyYW1zLm9GaWVsZFByb21pc2UgUHJvbWlzZSB0byB1cGRhdGUgZmllbGRcblx0ICogQHBhcmFtIG1QYXJhbXMuc2lkZUVmZmVjdE1hcCBTaWRlRWZmZWN0c01hcCBmb3IgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSBtUGFyYW1zLnRleHRQYXRocyBUZXh0UGF0aHMgb2YgdGhlIGZpZWxkIGlmIGFueVxuXHQgKiBAcGFyYW0gbVBhcmFtcy5ncm91cElkIEdyb3VwIElkIHRvIHVzZWQgdG8gZ3JvdXAgcmVxdWVzdHNcblx0ICogQHBhcmFtIG1QYXJhbXMua2V5IEtleVZhbHVlIG9mIHRoZSBmaWVsZFxuXHQgKiBAcGFyYW0gbVBhcmFtcy5vRW50aXR5U2V0Q29udGV4dCBFbnRpdHlTZXRjb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1zLm9NZXRhTW9kZWwgTWV0YW1vZGVsIGRhdGFcblx0ICogQHBhcmFtIG1QYXJhbXMuc2VsZWN0ZWRDb250ZXh0IFNlbGVjdGVkIHJvdyBjb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1zLmRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lIERlZmVycmVkIHRhcmdldHMgZGF0YVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGZvciBhbGwgaW1tZWRpYXRlbHkgcmVxdWVzdGVkIHNpZGUgZWZmZWN0cy5cblx0ICovXG5cdGhhbmRsZU1hc3NFZGl0RmllbGRVcGRhdGVBbmRSZXF1ZXN0U2lkZUVmZmVjdHM6IGFzeW5jIGZ1bmN0aW9uIChtUGFyYW1zOiBEYXRhVG9VcGRhdGVGaWVsZEFuZFNpZGVFZmZlY3RzVHlwZSkge1xuXHRcdGNvbnN0IHtcblx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0b0ZpZWxkUHJvbWlzZSxcblx0XHRcdHNpZGVFZmZlY3RzTWFwLFxuXHRcdFx0dGV4dFBhdGhzLFxuXHRcdFx0Z3JvdXBJZCxcblx0XHRcdGtleSxcblx0XHRcdG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdG9TZWxlY3RlZENvbnRleHQsXG5cdFx0XHRkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZVxuXHRcdH0gPSBtUGFyYW1zO1xuXHRcdGNvbnN0IGltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvbWlzZXMgPSBbb0ZpZWxkUHJvbWlzZV07XG5cdFx0Y29uc3Qgb3duZXJFbnRpdHlUeXBlID0gb0VudGl0eVNldENvbnRleHQuZ2V0UHJvcGVydHkoXCIkVHlwZVwiKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9Db250cm9sbGVyLmdldFZpZXcoKSk7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cblx0XHRpZiAoc2lkZUVmZmVjdHNNYXApIHtcblx0XHRcdGNvbnN0IGFsbEVudGl0eVR5cGVzV2l0aFF1YWxpZmllciA9IE9iamVjdC5rZXlzKHNpZGVFZmZlY3RzTWFwKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzRGF0YUZvckZpZWxkOiBhbnkgPSBPYmplY3QudmFsdWVzKHNpZGVFZmZlY3RzTWFwKTtcblxuXHRcdFx0Y29uc3QgbVZpc2l0ZWRTaWRlRWZmZWN0czogYW55ID0ge307XG5cdFx0XHRkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZVtrZXldID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IFtpbmRleCwgZGF0YV0gb2Ygc2lkZUVmZmVjdHNEYXRhRm9yRmllbGQuZW50cmllcygpKSB7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVR5cGVXaXRoUXVhbGlmaWVyID0gYWxsRW50aXR5VHlwZXNXaXRoUXVhbGlmaWVyW2luZGV4XTtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSBlbnRpdHlUeXBlV2l0aFF1YWxpZmllci5zcGxpdChcIiNcIilbMF07XG5cdFx0XHRcdGNvbnN0IG9Db250ZXh0OiBhbnkgPSBvQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9TZWxlY3RlZENvbnRleHQsIHNFbnRpdHlUeXBlKTtcblx0XHRcdFx0ZGF0YS5jb250ZXh0ID0gb0NvbnRleHQ7XG5cblx0XHRcdFx0Y29uc3QgYWxsRmFpbGVkU2lkZUVmZmVjdHMgPSBvQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzKCk7XG5cdFx0XHRcdGNvbnN0IGFGYWlsZWRTaWRlRWZmZWN0cyA9IGFsbEZhaWxlZFNpZGVFZmZlY3RzW29Db250ZXh0LmdldFBhdGgoKV07XG5cdFx0XHRcdG9Db250cm9sbGVyLl9zaWRlRWZmZWN0cy5kZWxldGVGYWlsZWRSZXF1ZXN0c0ZvckFDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0bGV0IHNpZGVFZmZlY3RzRm9yQ3VycmVudENvbnRleHQgPSBbZGF0YS5zaWRlRWZmZWN0c107XG5cdFx0XHRcdHNpZGVFZmZlY3RzRm9yQ3VycmVudENvbnRleHQgPVxuXHRcdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cyAmJiBhRmFpbGVkU2lkZUVmZmVjdHMubGVuZ3RoXG5cdFx0XHRcdFx0XHQ/IHNpZGVFZmZlY3RzRm9yQ3VycmVudENvbnRleHQuY29uY2F0KGFGYWlsZWRTaWRlRWZmZWN0cylcblx0XHRcdFx0XHRcdDogc2lkZUVmZmVjdHNGb3JDdXJyZW50Q29udGV4dDtcblx0XHRcdFx0bVZpc2l0ZWRTaWRlRWZmZWN0c1tvQ29udGV4dF0gPSB7fTtcblx0XHRcdFx0Zm9yIChjb25zdCBhU2lkZUVmZmVjdCBvZiBzaWRlRWZmZWN0c0ZvckN1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0aWYgKCFtVmlzaXRlZFNpZGVFZmZlY3RzW29Db250ZXh0XS5oYXNPd25Qcm9wZXJ0eShhU2lkZUVmZmVjdC5mdWxseVF1YWxpZmllZE5hbWUpKSB7XG5cdFx0XHRcdFx0XHRtVmlzaXRlZFNpZGVFZmZlY3RzW29Db250ZXh0XVthU2lkZUVmZmVjdC5mdWxseVF1YWxpZmllZE5hbWVdID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGxldCBhSW1tZWRpYXRlVGFyZ2V0czogYW55W10gPSBbXSxcblx0XHRcdFx0XHRcdFx0YWxsVGFyZ2V0czogYW55W10gPSBbXSxcblx0XHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbk5hbWU6IFN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZm5HZXRJbW1lZGlhdGVUYXJnZXRzQW5kQWN0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uIChtU2lkZUVmZmVjdDogU2lkZUVmZmVjdHNUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHsgVGFyZ2V0UHJvcGVydGllczogYVRhcmdldFByb3BlcnRpZXMsIFRhcmdldEVudGl0aWVzOiBhVGFyZ2V0RW50aXRpZXMgfSA9IG1TaWRlRWZmZWN0O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0RW50aXR5VHlwZSA9IG1TaWRlRWZmZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIkBcIilbMF07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldHNBcnJheUZvckFsbFByb3BlcnRpZXMgPSBhd2FpdCBNYXNzRWRpdEhlbHBlci5mbkdldFRhcmdldHNGb3JNYXNzRWRpdChcblx0XHRcdFx0XHRcdFx0XHRtU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRcdFx0XHRvRW50aXR5U2V0Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0RW50aXR5VHlwZSxcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGFJbW1lZGlhdGVUYXJnZXRzID0gdGFyZ2V0c0FycmF5Rm9yQWxsUHJvcGVydGllc1swXTtcblx0XHRcdFx0XHRcdFx0YWxsVGFyZ2V0cyA9IChhVGFyZ2V0UHJvcGVydGllcyB8fCBbXSkuY29uY2F0KChhVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lOiBTdHJpbmcgfCB1bmRlZmluZWQgPSAobVNpZGVFZmZlY3QgYXMgT0RhdGFTaWRlRWZmZWN0c1R5cGUpLlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFEZWZlcnJlZFRhcmdldHMgPSBhbGxUYXJnZXRzLmZpbHRlcigodGFyZ2V0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gIWFJbW1lZGlhdGVUYXJnZXRzLmluY2x1ZGVzKHRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lW2tleV1bbVNpZGVFZmZlY3QuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHtcblx0XHRcdFx0XHRcdFx0XHRhVGFyZ2V0czogYURlZmVycmVkVGFyZ2V0cyxcblx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dDogb0NvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0bVNpZGVFZmZlY3Rcblx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBpZiBlbnRpdHkgaXMgb3RoZXIgdGhhbiBpdGVtcyB0YWJsZSB0aGVuIGFjdGlvbiBpcyBkZWZlcmVkXG5cdFx0XHRcdFx0XHRcdGlmIChhY3Rpb25OYW1lICYmIHNpZGVFZmZlY3RFbnRpdHlUeXBlID09PSBvd25lckVudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBzdGF0aWMgYWN0aW9uIGlzIG9uIGNvbGxlY3Rpb24sIHNvIHdlIGRlZmVyIGl0LCBlbHNlIGFkZCB0byBpbW1lZGlhdGUgcmVxdWVzdHMgYXJyYXlcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBpc1N0YXRpY0FjdGlvbiA9IFRhYmxlSGVscGVyLl9pc1N0YXRpY0FjdGlvbihvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7YWN0aW9uTmFtZX1gKSwgYWN0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFpc1N0YXRpY0FjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZVtrZXldW21TaWRlRWZmZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZV1bXCJUcmlnZ2VyQWN0aW9uXCJdID0gYWN0aW9uTmFtZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRUYXJnZXRzRm9yQVF1YWxpZmllZE5hbWVba2V5XVttU2lkZUVmZmVjdC5mdWxseVF1YWxpZmllZE5hbWVdW1wiVHJpZ2dlckFjdGlvblwiXSA9IGFjdGlvbk5hbWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGFUYXJnZXRzOiBhSW1tZWRpYXRlVGFyZ2V0cyxcblx0XHRcdFx0XHRcdFx0XHRUcmlnZ2VyQWN0aW9uOiB0cmlnZ2VyQWN0aW9uTmFtZVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0aW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzKGFTaWRlRWZmZWN0LCBvQ29udGV4dCwgZ3JvdXBJZCwgZm5HZXRJbW1lZGlhdGVUYXJnZXRzQW5kQWN0aW9ucylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0ZXh0UGF0aHM/LltrZXldICYmIHRleHRQYXRoc1trZXldLmxlbmd0aCkge1xuXHRcdFx0aW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9taXNlcy5wdXNoKG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKHRleHRQYXRoc1trZXldLCBvU2VsZWN0ZWRDb250ZXh0LCBncm91cElkKSk7XG5cdFx0fVxuXHRcdHJldHVybiAoUHJvbWlzZSBhcyBhbnkpLmFsbFNldHRsZWQoaW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9taXNlcyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgbWFzcyBlZGl0IGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIG9Db250cm9sbGVyIENvbnRyb2xsZXIgZm9yIHRoZSB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGNyZWF0ZURpYWxvZzogYXN5bmMgZnVuY3Rpb24gKG9UYWJsZTogVGFibGUsIGFDb250ZXh0czogYW55W10sIG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0ZGlhbG9nQ29udGV4dCA9IE1hc3NFZGl0SGVscGVyLmdldERpYWxvZ0NvbnRleHQob1RhYmxlKSxcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5zZXRSdW50aW1lTW9kZWxPbkRpYWxvZyhhQ29udGV4dHMsIGFEYXRhQXJyYXksIG9EZWZhdWx0VmFsdWVzLCBkaWFsb2dDb250ZXh0KTtcblxuXHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXG5cdFx0Y29uc3Qgb0NyZWF0ZWRGcmFnbWVudCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogb0RhdGFGaWVsZE1vZGVsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0KTtcblx0XHRjb25zdCBvRGlhbG9nQ29udGVudCA9IGF3YWl0IEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvQ3JlYXRlZEZyYWdtZW50IH0pO1xuXHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHJlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHRpdGxlOiBvRGVmYXVsdFZhbHVlcy5tYXNzRWRpdFRpdGxlLFxuXHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50IGFzIGFueV0sXG5cdFx0XHRhZnRlck9wZW46IE1hc3NFZGl0SGVscGVyLm9uRGlhbG9nT3Blbixcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogTWFzc0VkaXRIZWxwZXIuaGVscGVycy5nZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQob0RlZmF1bHRWYWx1ZXMsIG9EYXRhRmllbGRNb2RlbC5nZXRPYmplY3QoXCIvXCIpKSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBhc3luYyBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiLCB0cnVlKTtcblx0XHRcdFx0XHRjb25zdCBvSW5EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0luRGlhbG9nLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRcdFx0XHRjb25zdCBhUmVzdWx0cyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZXN1bHRzXCIpO1xuXG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9UYWJsZSAmJiAob1RhYmxlLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KSxcblx0XHRcdFx0XHRcdHNDdXJyZW50RW50aXR5U2V0TmFtZSA9IG9UYWJsZS5kYXRhKFwibWV0YVBhdGhcIiksXG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0Q29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ3VycmVudEVudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRcdGNvbnN0IGFTaWRlRWZmZWN0cyA9IGF3YWl0IFNpZGVFZmZlY3RzSGVscGVyLmdlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tTWV0YU1vZGVsKG9NZXRhTW9kZWwpO1xuXHRcdFx0XHRcdGNvbnN0IGVycm9yVmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdGNvbnN0IHRleHRQYXRocyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi90ZXh0UGF0aHNcIik7XG5cdFx0XHRcdFx0Y29uc3QgYVByb3BlcnR5UmVhZGFibGVJbmZvID0gb01vZGVsLmdldFByb3BlcnR5KFwiL3JlYWRhYmxlUHJvcGVydHlEYXRhXCIpO1xuXHRcdFx0XHRcdGxldCBncm91cElkOiBzdHJpbmc7XG5cdFx0XHRcdFx0bGV0IGFsbFNpZGVFZmZlY3RzOiBhbnlbXTtcblx0XHRcdFx0XHRjb25zdCBtYXNzRWRpdFByb21pc2VzOiBhbnkgPSBbXTtcblx0XHRcdFx0XHRjb25zdCBmYWlsZWRGaWVsZHNEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZFJvd3NMZW5ndGggPSBhQ29udGV4dHMubGVuZ3RoO1xuXHRcdFx0XHRcdGNvbnN0IGRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRjb25zdCBiYXNlU2lkZUVmZmVjdHNNYXBBcnJheSA9IE1hc3NFZGl0SGVscGVyLmdldFNpZGVFZmZlY3REYXRhRm9yS2V5KFxuXHRcdFx0XHRcdFx0b0VudGl0eVNldENvbnRleHQsXG5cdFx0XHRcdFx0XHRhU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdGFSZXN1bHRzXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGFDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnksIGlkeDogbnVtYmVyKSB7XG5cdFx0XHRcdFx0XHRhbGxTaWRlRWZmZWN0cyA9IFtdO1xuXHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChhc3luYyBmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmICghZmFpbGVkRmllbGRzRGF0YS5oYXNPd25Qcm9wZXJ0eShvUmVzdWx0LmtleVZhbHVlKSkge1xuXHRcdFx0XHRcdFx0XHRcdGZhaWxlZEZpZWxkc0RhdGFbb1Jlc3VsdC5rZXlWYWx1ZV0gPSAwO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdC8vVE9ETyAtIEFkZCBzYXZlIGltcGxlbWVudGF0aW9uIGZvciBWYWx1ZSBIZWxwLlxuXHRcdFx0XHRcdFx0XHRpZiAoYmFzZVNpZGVFZmZlY3RzTWFwQXJyYXlbb1Jlc3VsdC5rZXlWYWx1ZV0pIHtcblx0XHRcdFx0XHRcdFx0XHRhbGxTaWRlRWZmZWN0c1tvUmVzdWx0LmtleVZhbHVlXSA9IGJhc2VTaWRlRWZmZWN0c01hcEFycmF5W29SZXN1bHQua2V5VmFsdWVdO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eVJlYWRhYmxlSW5mbykge1xuXHRcdFx0XHRcdFx0XHRcdGFQcm9wZXJ0eVJlYWRhYmxlSW5mby5zb21lKGZ1bmN0aW9uIChvUHJvcGVydHlJbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eUluZm8udmFsdWUgPT09IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby50eXBlID09PSBcIlBhdGhcIiAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aCkgPT09IG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGdyb3VwSWQgPSBgJGF1dG8uJHtpZHh9YDtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0ZpZWxkUHJvbWlzZSA9IG9TZWxlY3RlZENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSwgZ3JvdXBJZClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvclZhbHVlcy5wdXNoKG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiTWFzcyBFZGl0OiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbiB1cGRhdGluZyBlbnRyaWVzLlwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmFpbGVkRmllbGRzRGF0YVtvUmVzdWx0LmtleVZhbHVlXSA9IGZhaWxlZEZpZWxkc0RhdGFbb1Jlc3VsdC5rZXlWYWx1ZV0gKyAxO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KHsgaXNGaWVsZFVwZGF0ZUZhaWxlZDogdHJ1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRhVG9VcGRhdGVGaWVsZEFuZFNpZGVFZmZlY3RzOiBEYXRhVG9VcGRhdGVGaWVsZEFuZFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0XHRvRmllbGRQcm9taXNlLFxuXHRcdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzTWFwOiBiYXNlU2lkZUVmZmVjdHNNYXBBcnJheVtvUmVzdWx0LmtleVZhbHVlXSxcblx0XHRcdFx0XHRcdFx0XHR0ZXh0UGF0aHMsXG5cdFx0XHRcdFx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0XHRcdFx0XHRrZXk6IG9SZXN1bHQua2V5VmFsdWUsXG5cdFx0XHRcdFx0XHRcdFx0b0VudGl0eVNldENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRvU2VsZWN0ZWRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdG1hc3NFZGl0UHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5oYW5kbGVNYXNzRWRpdEZpZWxkVXBkYXRlQW5kUmVxdWVzdFNpZGVFZmZlY3RzKGRhdGFUb1VwZGF0ZUZpZWxkQW5kU2lkZUVmZmVjdHMpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGF3YWl0IChQcm9taXNlIGFzIGFueSlcblx0XHRcdFx0XHRcdC5hbGxTZXR0bGVkKG1hc3NFZGl0UHJvbWlzZXMpXG5cdFx0XHRcdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdGdyb3VwSWQgPSBgJGF1dG8ubWFzc0VkaXREZWZlcnJlZGA7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlZmVycmVkUmVxdWVzdHMgPSBbXTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNEYXRhRm9yQWxsS2V5czogYW55ID0gT2JqZWN0LnZhbHVlcyhkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGtleXNXaXRoU2lkZUVmZmVjdHM6IGFueVtdID0gT2JqZWN0LmtleXMoZGVmZXJyZWRUYXJnZXRzRm9yQVF1YWxpZmllZE5hbWUpO1xuXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzRGF0YUZvckFsbEtleXMuZm9yRWFjaCgoYVNpZGVFZmZlY3Q6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRLZXkgPSBrZXlzV2l0aFNpZGVFZmZlY3RzW2luZGV4XTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZmFpbGVkRmllbGRzRGF0YVtjdXJyZW50S2V5XSAhPT0gc2VsZWN0ZWRSb3dzTGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBkZWZlcnJlZFNpZGVFZmZlY3RzRGF0YSA9IE9iamVjdC52YWx1ZXMoYVNpZGVFZmZlY3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRTaWRlRWZmZWN0c0RhdGEuZm9yRWFjaCgocmVxOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgeyBhVGFyZ2V0cywgb0NvbnRleHQsIFRyaWdnZXJBY3Rpb24sIG1TaWRlRWZmZWN0IH0gPSByZXE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGZuR2V0RGVmZXJyZWRUYXJnZXRzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhVGFyZ2V0cztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZm5HZXREZWZlcnJlZFRhcmdldHNBbmRBY3Rpb25zID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhVGFyZ2V0czogZm5HZXREZWZlcnJlZFRhcmdldHMoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFRyaWdnZXJBY3Rpb246IFRyaWdnZXJBY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkUmVxdWVzdHMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiBzb21lIGRlZmVycmVkIGlzIHJlamVjdGVkLCBpdCB3aWxsIGJlIGFkZCB0byBmYWlsZWQgcXVldWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVNpZGVFZmZlY3QsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGdyb3VwSWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmbkdldERlZmVycmVkVGFyZ2V0c0FuZEFjdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIubWVzc2FnZUhhbmRsaW5nRm9yTWFzc0VkaXQob1RhYmxlLCBhQ29udGV4dHMsIG9Db250cm9sbGVyLCBvSW5EaWFsb2csIGFSZXN1bHRzLCBlcnJvclZhbHVlcyk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuY2xvc2VEaWFsb2cob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNhbmNlbEJ1dHRvblRleHQsXG5cdFx0XHRcdHZpc2libGU6IE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuaGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nKG9EYXRhRmllbGRNb2RlbC5nZXRPYmplY3QoXCIvXCIpLCB0cnVlKSBhcyBhbnksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBvSW5EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuY2xvc2VEaWFsb2cob0luRGlhbG9nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHR9KTtcblx0XHRjb25zdCBtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpO1xuXHRcdG9EaWFsb2cuc2V0TW9kZWwob0RpYWxvZ0RhdGFNb2RlbCwgXCJmaWVsZHNJbmZvXCIpO1xuXHRcdG9EaWFsb2cuc2V0TW9kZWwobW9kZWwpO1xuXHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoZGlhbG9nQ29udGV4dCk7XG5cdFx0cmV0dXJuIG9EaWFsb2c7XG5cdH0sXG5cblx0aGVscGVyczoge1xuXHRcdGdldEJpbmRpbmdFeHBGb3JIYXNFZGl0YWJsZUZpZWxkczogKGZpZWxkczogYW55LCBlZGl0YWJsZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0Y29uc3QgdG90YWxFeHAgPSBmaWVsZHMucmVkdWNlKFxuXHRcdFx0XHQoZXhwcmVzc2lvbjogYW55LCBmaWVsZDogYW55KSA9PlxuXHRcdFx0XHRcdG9yKFxuXHRcdFx0XHRcdFx0ZXhwcmVzc2lvbixcblx0XHRcdFx0XHRcdHBhdGhJbk1vZGVsKFwiL3ZhbHVlcy9cIiArIGZpZWxkLmRhdGFQcm9wZXJ0eSArIFwiL3Zpc2libGVcIiwgXCJmaWVsZHNJbmZvXCIpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPlxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdGNvbnN0YW50KGZhbHNlKVxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBlZGl0YWJsZSA/IHRvdGFsRXhwIDogbm90KHRvdGFsRXhwKTtcblx0XHR9LFxuXG5cdFx0Z2V0RXhwQmluZGluZ0ZvckFwcGx5QnV0dG9uVHh0OiAoZGVmYXVsdFZhbHVlczogYW55LCBmaWVsZHM6IGJvb2xlYW4pID0+IHtcblx0XHRcdGNvbnN0IGVkaXRhYmxlRXhwID0gTWFzc0VkaXRIZWxwZXIuaGVscGVycy5nZXRCaW5kaW5nRXhwRm9ySGFzRWRpdGFibGVGaWVsZHMoZmllbGRzLCB0cnVlKTtcblx0XHRcdGNvbnN0IHRvdGFsRXhwID0gaWZFbHNlKGVkaXRhYmxlRXhwLCBjb25zdGFudChkZWZhdWx0VmFsdWVzLmFwcGx5QnV0dG9uVGV4dCksIGNvbnN0YW50KGRlZmF1bHRWYWx1ZXMub2tCdXR0b25UZXh0KSk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24odG90YWxFeHApO1xuXHRcdH0sXG5cblx0XHRoYXNFZGl0YWJsZUZpZWxkc0JpbmRpbmc6IChmaWVsZHM6IGFueSwgZWRpdGFibGU6IGJvb2xlYW4pID0+IHtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEJpbmRpbmdFeHBGb3JIYXNFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIGVkaXRhYmxlKSk7XG5cdFx0fVxuXHR9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