@envive-ai/react-hooks 0.2.4 → 0.2.5

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 (333) hide show
  1. package/dist/{NewOrgConfig-xNlcpcF_.js → NewOrgConfig-B98Y9tMb.js} +2 -2
  2. package/dist/{NewOrgConfig-B_1A1d9q.cjs → NewOrgConfig-ZbBKiByQ.cjs} +2 -2
  3. package/dist/{SystemSettingsContext-Dh_35fES.cjs → SystemSettingsContext-CO5c1L62.cjs} +2 -2
  4. package/dist/{SystemSettingsContext-CCuS3kWH.js → SystemSettingsContext-CXmUlH8i.js} +2 -2
  5. package/dist/{TrackComponentVisibleEvent-B828giM-.js → TrackComponentVisibleEvent-B0WO3ArV.js} +3 -3
  6. package/dist/{TrackComponentVisibleEvent-DsTIH7Yt.cjs → TrackComponentVisibleEvent-LRE9MYzL.cjs} +3 -3
  7. package/dist/{amplitudeContext-BfRDG5CX.d.ts → amplitudeContext-DXnJi0V1.d.ts} +1 -1
  8. package/dist/{api-D9gmGNAV.js → api-BWSsazAG.js} +3 -3
  9. package/dist/{api-Bc3_julZ.cjs → api-DeW6rHj3.cjs} +3 -3
  10. package/dist/application/models/graphql/index.cjs +2 -2
  11. package/dist/application/models/graphql/index.d.ts +1 -1
  12. package/dist/application/models/graphql/index.js +2 -2
  13. package/dist/application/models/guards/api/index.cjs +3 -3
  14. package/dist/application/models/guards/api/index.d.ts +2 -2
  15. package/dist/application/models/guards/api/index.js +3 -3
  16. package/dist/application/models/guards/utils.cjs +1 -1
  17. package/dist/application/models/guards/utils.d.ts +1 -1
  18. package/dist/application/models/guards/utils.js +1 -1
  19. package/dist/application/models/index.cjs +10 -10
  20. package/dist/application/models/index.d.ts +11 -11
  21. package/dist/application/models/index.js +10 -10
  22. package/dist/application/models/utilityTypes/index.cjs +1 -1
  23. package/dist/application/models/utilityTypes/index.d.ts +1 -1
  24. package/dist/application/models/utilityTypes/index.js +1 -1
  25. package/dist/application/models/variantInfo/index.cjs +1 -1
  26. package/dist/application/models/variantInfo/index.d.ts +1 -1
  27. package/dist/application/models/variantInfo/index.js +1 -1
  28. package/dist/application/utils/index.cjs +19 -19
  29. package/dist/application/utils/index.d.cts +2 -2
  30. package/dist/application/utils/index.d.ts +15 -15
  31. package/dist/application/utils/index.js +19 -19
  32. package/dist/{atomStore-8ppNkJ_n.cjs → atomStore-DNji91Im.cjs} +1 -1
  33. package/dist/{atomStore-BLYJ2ZoQ.js → atomStore-DXTVqiKc.js} +1 -1
  34. package/dist/atoms/app/index.cjs +19 -19
  35. package/dist/atoms/app/index.d.cts +7 -7
  36. package/dist/atoms/app/index.d.ts +13 -13
  37. package/dist/atoms/app/index.js +19 -19
  38. package/dist/atoms/atomStore/index.cjs +1 -1
  39. package/dist/atoms/atomStore/index.js +1 -1
  40. package/dist/atoms/chat/index.cjs +21 -21
  41. package/dist/atoms/chat/index.d.cts +26 -26
  42. package/dist/atoms/chat/index.d.ts +38 -38
  43. package/dist/atoms/chat/index.js +21 -21
  44. package/dist/atoms/globalSearch/index.cjs +1 -1
  45. package/dist/atoms/globalSearch/index.d.cts +6 -6
  46. package/dist/atoms/globalSearch/index.d.ts +6 -6
  47. package/dist/atoms/globalSearch/index.js +1 -1
  48. package/dist/atoms/org/index.cjs +3 -3
  49. package/dist/atoms/org/index.d.cts +17 -17
  50. package/dist/atoms/org/index.d.ts +30 -30
  51. package/dist/atoms/org/index.js +3 -3
  52. package/dist/atoms/search/index.cjs +28 -28
  53. package/dist/atoms/search/index.d.cts +1 -1
  54. package/dist/atoms/search/index.d.ts +13 -13
  55. package/dist/atoms/search/index.js +28 -28
  56. package/dist/atoms/search/types.cjs +1 -1
  57. package/dist/atoms/search/types.d.ts +1 -1
  58. package/dist/atoms/search/types.js +1 -1
  59. package/dist/atoms/search/utils.cjs +1 -1
  60. package/dist/atoms/search/utils.js +1 -1
  61. package/dist/{cdnContext-D26C8Y4H.js → cdnContext-CH_-ssYa.js} +2 -2
  62. package/dist/{cdnContext-BlRI74F-.cjs → cdnContext-D7kHxOzE.cjs} +2 -2
  63. package/dist/{chat-pXCsesuS.js → chat-ClvJ9xEj.js} +1 -1
  64. package/dist/{chat-2NGrmU_Z.cjs → chat-CqPuT9_V.cjs} +8 -8
  65. package/dist/{chat-sCX7aTrz.cjs → chat-DCGriB7h.cjs} +1 -1
  66. package/dist/{chat-Bg3wEfNd.js → chat-DH70QqJp.js} +8 -8
  67. package/dist/{chatElementDisplayLocation-D6oLuQS4.d.ts → chatElementDisplayLocation-BoE6DEdv.d.ts} +1 -1
  68. package/dist/{chatSearch-B4dsxGth.cjs → chatSearch-BQCZI8MJ.cjs} +7 -7
  69. package/dist/{chatSearch-Cvc_eBFV.js → chatSearch-D8xCWU8m.js} +7 -7
  70. package/dist/{chatState-fP1r34CN.cjs → chatState-CcFtSqJT.cjs} +3 -3
  71. package/dist/{chatState-2bMtvPgG.js → chatState-DKnNHmwe.js} +3 -3
  72. package/dist/{common-4xhjcUbt.cjs → common-DQPvV_S_.cjs} +1 -1
  73. package/dist/{common-DhKoZ6jN.js → common-c_4eX0qn.js} +1 -1
  74. package/dist/{components-BUisjl4v.js → components-CDpaMUjK.js} +1 -1
  75. package/dist/{components-DVaYBroL.cjs → components-DKwVHIjq.cjs} +1 -1
  76. package/dist/config/index.cjs +71 -0
  77. package/dist/config/index.d.cts +5 -0
  78. package/dist/config/index.d.ts +5 -0
  79. package/dist/config/index.js +6 -0
  80. package/dist/config/locators/components/chat/index.cjs +1 -1
  81. package/dist/config/locators/components/chat/index.d.ts +1 -1
  82. package/dist/config/locators/components/chat/index.js +1 -1
  83. package/dist/config/locators/components/common/index.cjs +1 -1
  84. package/dist/config/locators/components/common/index.d.ts +1 -1
  85. package/dist/config/locators/components/common/index.js +1 -1
  86. package/dist/config/locators/components/index.cjs +1 -1
  87. package/dist/config/locators/components/index.d.ts +1 -1
  88. package/dist/config/locators/components/index.js +1 -1
  89. package/dist/config/locators/index.cjs +23 -44
  90. package/dist/config/locators/index.d.cts +2 -23
  91. package/dist/config/locators/index.d.ts +5 -26
  92. package/dist/config/locators/index.js +5 -26
  93. package/dist/contexts/amplitudeContext/index.cjs +19 -19
  94. package/dist/contexts/amplitudeContext/index.d.ts +1 -1
  95. package/dist/contexts/amplitudeContext/index.js +19 -19
  96. package/dist/contexts/cdnContext/index.cjs +4 -4
  97. package/dist/contexts/cdnContext/index.js +4 -4
  98. package/dist/contexts/chatContext/index.cjs +31 -31
  99. package/dist/contexts/chatContext/index.d.cts +2 -2
  100. package/dist/contexts/chatContext/index.d.ts +2 -2
  101. package/dist/contexts/chatContext/index.js +31 -31
  102. package/dist/contexts/enviveConfigContext/index.cjs +4 -4
  103. package/dist/contexts/enviveConfigContext/index.d.ts +3 -3
  104. package/dist/contexts/enviveConfigContext/index.js +4 -4
  105. package/dist/contexts/enviveCssContext/index.cjs +18 -18
  106. package/dist/contexts/enviveCssContext/index.js +18 -18
  107. package/dist/contexts/featureFlagContext/index.cjs +6 -6
  108. package/dist/contexts/featureFlagContext/index.d.ts +3 -3
  109. package/dist/contexts/featureFlagContext/index.js +6 -6
  110. package/dist/contexts/featureFlagServiceContext/index.cjs +3 -3
  111. package/dist/contexts/featureFlagServiceContext/index.d.ts +4 -4
  112. package/dist/contexts/featureFlagServiceContext/index.js +3 -3
  113. package/dist/contexts/graphqlContext/index.cjs +13 -13
  114. package/dist/contexts/graphqlContext/index.d.cts +1 -1
  115. package/dist/contexts/graphqlContext/index.d.ts +13 -13
  116. package/dist/contexts/graphqlContext/index.js +13 -13
  117. package/dist/contexts/localStorageContext/index.cjs +2 -2
  118. package/dist/contexts/localStorageContext/index.js +2 -2
  119. package/dist/contexts/newOrgConfigContext/index.cjs +17 -17
  120. package/dist/contexts/newOrgConfigContext/index.d.cts +2 -2
  121. package/dist/contexts/newOrgConfigContext/index.d.ts +14 -14
  122. package/dist/contexts/newOrgConfigContext/index.js +17 -17
  123. package/dist/contexts/searchContext/index.cjs +24 -24
  124. package/dist/contexts/searchContext/index.d.ts +2 -2
  125. package/dist/contexts/searchContext/index.js +24 -24
  126. package/dist/contexts/sessionStorageContext/index.cjs +2 -2
  127. package/dist/contexts/sessionStorageContext/index.js +2 -2
  128. package/dist/contexts/shopifyUrlContext/index.cjs +2 -2
  129. package/dist/contexts/shopifyUrlContext/index.d.ts +3 -3
  130. package/dist/contexts/shopifyUrlContext/index.js +2 -2
  131. package/dist/contexts/systemSettingsContext/index.cjs +4 -4
  132. package/dist/contexts/systemSettingsContext/index.d.cts +4 -4
  133. package/dist/contexts/systemSettingsContext/index.d.ts +13 -13
  134. package/dist/contexts/systemSettingsContext/index.js +4 -4
  135. package/dist/contexts/types.cjs +1 -1
  136. package/dist/contexts/types.d.ts +3 -3
  137. package/dist/contexts/types.js +1 -1
  138. package/dist/contexts/userIdentityContext/index.cjs +19 -19
  139. package/dist/contexts/userIdentityContext/index.d.ts +1 -1
  140. package/dist/contexts/userIdentityContext/index.js +19 -19
  141. package/dist/{domObserver-Do6RAJdf.cjs → domObserver-Bqf3ooj8.cjs} +1 -1
  142. package/dist/{domObserver-DKcas6tl.js → domObserver-v9ODTyfT.js} +1 -1
  143. package/dist/{enviveConfig-BSfyz_pm.js → enviveConfig-DZBohDpc.js} +3 -3
  144. package/dist/{enviveConfig-D8vcVPWD.cjs → enviveConfig-Dv9-esGV.cjs} +3 -3
  145. package/dist/{enviveConfigContext-C8cCcdKU.cjs → enviveConfigContext-D2OELZDR.cjs} +3 -3
  146. package/dist/{enviveConfigContext-CJqpRSKu.js → enviveConfigContext-DrDjCems.js} +3 -3
  147. package/dist/events/index.cjs +1 -1
  148. package/dist/events/index.js +1 -1
  149. package/dist/{events-B_fJZf9E.cjs → events-DYY4l817.cjs} +1 -1
  150. package/dist/{events-BHJJjPDN.js → events-DyUix-Bn.js} +1 -1
  151. package/dist/{featureFlagServiceContext-DFb-uLHN.cjs → featureFlagServiceContext-CJyYItqu.cjs} +3 -3
  152. package/dist/{featureFlagServiceContext-C2Yj-Uyh.d.ts → featureFlagServiceContext-C_2m4wPL.d.ts} +2 -2
  153. package/dist/{featureFlagServiceContext-Dd_Hbq6e.js → featureFlagServiceContext-FBM6DdMJ.js} +3 -3
  154. package/dist/{featureGates-DhoJq4io.js → featureGates-KEwAL8p_.js} +1 -1
  155. package/dist/{featureGates-BdvOVv8N.cjs → featureGates-qU_ulhpC.cjs} +1 -1
  156. package/dist/{frontendConfig-CbyjUXZW.d.ts → frontendConfig-CymUbclV.d.ts} +3 -3
  157. package/dist/frontendConfig-tVg0hsWZ.d.cts +1 -1
  158. package/dist/{globalSearch-B_v9qfCT.js → globalSearch-Ccxq8hNF.js} +1 -1
  159. package/dist/{globalSearch-OiF96VLG.cjs → globalSearch-FBk2epe8.cjs} +1 -1
  160. package/dist/{graphql-W7GMIHUu.js → graphql-3PxNRFOc.js} +2 -2
  161. package/dist/{graphql-B9HhDXYt.cjs → graphql-DGYfelZp.cjs} +2 -2
  162. package/dist/{graphqlConfig-DZHeFKDY.cjs → graphqlConfig-GHZ1UgCw.cjs} +1 -1
  163. package/dist/{graphqlConfig-Xk--JbPl.js → graphqlConfig-mDg6J44N.js} +1 -1
  164. package/dist/{graphqlContext-aaOOb79d.cjs → graphqlContext-BZPEAFSR.cjs} +5 -5
  165. package/dist/{graphqlContext-CMav2igl.d.cts → graphqlContext-Bf3E-V2T.d.cts} +3 -3
  166. package/dist/{graphqlContext-BotK7KCg.d.ts → graphqlContext-CQikpV_I.d.ts} +3 -3
  167. package/dist/{graphqlContext-CSVwhCnP.js → graphqlContext-eaZPxgRE.js} +5 -5
  168. package/dist/hooks/AmplitudeOperations/index.cjs +21 -21
  169. package/dist/hooks/AmplitudeOperations/index.d.ts +1 -1
  170. package/dist/hooks/AmplitudeOperations/index.js +21 -21
  171. package/dist/hooks/AppDetails/index.cjs +22 -22
  172. package/dist/hooks/AppDetails/index.d.ts +11 -11
  173. package/dist/hooks/AppDetails/index.js +22 -22
  174. package/dist/hooks/CdnOperations/index.cjs +4 -4
  175. package/dist/hooks/CdnOperations/index.js +4 -4
  176. package/dist/hooks/ChatToggle/index.cjs +21 -21
  177. package/dist/hooks/ChatToggle/index.d.ts +1 -1
  178. package/dist/hooks/ChatToggle/index.js +21 -21
  179. package/dist/hooks/ChatToggleAnalytics/index.cjs +22 -22
  180. package/dist/hooks/ChatToggleAnalytics/index.d.ts +1 -1
  181. package/dist/hooks/ChatToggleAnalytics/index.js +22 -22
  182. package/dist/hooks/CustomerSupportHandoff/index.cjs +1 -1
  183. package/dist/hooks/CustomerSupportHandoff/index.js +1 -1
  184. package/dist/hooks/Debounce/index.cjs +1 -1
  185. package/dist/hooks/Debounce/index.js +1 -1
  186. package/dist/hooks/ElementObserver/index.cjs +1 -1
  187. package/dist/hooks/ElementObserver/index.d.ts +1 -1
  188. package/dist/hooks/ElementObserver/index.js +1 -1
  189. package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
  190. package/dist/hooks/GraphQLConfig/index.cjs +14 -14
  191. package/dist/hooks/GraphQLConfig/index.d.cts +1 -1
  192. package/dist/hooks/GraphQLConfig/index.d.ts +12 -12
  193. package/dist/hooks/GraphQLConfig/index.js +14 -14
  194. package/dist/hooks/IdentifyUser/index.cjs +19 -19
  195. package/dist/hooks/IdentifyUser/index.js +19 -19
  196. package/dist/hooks/ImageResolver/index.cjs +12 -12
  197. package/dist/hooks/ImageResolver/index.js +12 -12
  198. package/dist/hooks/Intersection/index.cjs +1 -1
  199. package/dist/hooks/Intersection/index.js +1 -1
  200. package/dist/hooks/LocalStorageOperations/index.cjs +2 -2
  201. package/dist/hooks/LocalStorageOperations/index.js +2 -2
  202. package/dist/hooks/MessageFilter/index.cjs +10 -10
  203. package/dist/hooks/MessageFilter/index.d.ts +11 -11
  204. package/dist/hooks/MessageFilter/index.js +10 -10
  205. package/dist/hooks/NewOrgConfig/index.cjs +18 -18
  206. package/dist/hooks/NewOrgConfig/index.d.cts +2 -2
  207. package/dist/hooks/NewOrgConfig/index.d.ts +14 -14
  208. package/dist/hooks/NewOrgConfig/index.js +18 -18
  209. package/dist/hooks/Search/index.cjs +37 -37
  210. package/dist/hooks/Search/index.d.cts +3 -3
  211. package/dist/hooks/Search/index.d.ts +15 -15
  212. package/dist/hooks/Search/index.js +37 -37
  213. package/dist/hooks/SearchOperations/index.cjs +24 -24
  214. package/dist/hooks/SearchOperations/index.d.ts +2 -2
  215. package/dist/hooks/SearchOperations/index.js +24 -24
  216. package/dist/hooks/SessionStorageOperations/index.cjs +2 -2
  217. package/dist/hooks/SessionStorageOperations/index.js +2 -2
  218. package/dist/hooks/ShopifyUrlOperations/index.cjs +2 -2
  219. package/dist/hooks/ShopifyUrlOperations/index.d.ts +3 -3
  220. package/dist/hooks/ShopifyUrlOperations/index.js +2 -2
  221. package/dist/hooks/SystemSettingsContext/index.cjs +5 -5
  222. package/dist/hooks/SystemSettingsContext/index.d.ts +13 -13
  223. package/dist/hooks/SystemSettingsContext/index.js +5 -5
  224. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +21 -21
  225. package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +2 -2
  226. package/dist/hooks/TrackComponentVisibleEvent/index.js +21 -21
  227. package/dist/hooks/UpdateAnalyticsProps/index.cjs +19 -19
  228. package/dist/hooks/UpdateAnalyticsProps/index.js +19 -19
  229. package/dist/hooks/utils.cjs +1 -1
  230. package/dist/hooks/utils.d.cts +1 -1
  231. package/dist/hooks/utils.d.ts +12 -12
  232. package/dist/hooks/utils.js +1 -1
  233. package/dist/{index-7VOYQNo5.d.ts → index-BVf069X-.d.ts} +2 -2
  234. package/dist/{index-D9SzePCE.d.cts → index-B_KJB5L_.d.cts} +30 -30
  235. package/dist/{index-DDZmV951.d.ts → index-BkLv_fCu.d.ts} +34 -34
  236. package/dist/{index-hebsV7fc.d.ts → index-C0eAp5f5.d.ts} +1 -1
  237. package/dist/{index-exSzn3SP.d.ts → index-CJc7_j_v.d.ts} +1 -1
  238. package/dist/{index-DzzKdrcZ.d.ts → index-DBqgBV9N.d.ts} +1 -1
  239. package/dist/{index-C1nwLU6Q.d.ts → index-DHgVW8ey.d.ts} +1 -1
  240. package/dist/{index-YrhxAGtH.d.ts → index-DgjDuQl4.d.ts} +6 -6
  241. package/dist/index-FQjyuD3D.d.cts +22 -0
  242. package/dist/index-LTdMHOxj.d.ts +22 -0
  243. package/dist/{index-Dy22w7kg.d.ts → index-nDWHlouq.d.ts} +1 -1
  244. package/dist/{index-L7SEpDLz.d.ts → index-vP8BKdxl.d.ts} +1 -1
  245. package/dist/interceptors/index.cjs +2 -2
  246. package/dist/interceptors/index.d.cts +1 -1
  247. package/dist/interceptors/index.d.ts +12 -12
  248. package/dist/interceptors/index.js +2 -2
  249. package/dist/interceptors/types.cjs +1 -1
  250. package/dist/interceptors/types.d.cts +1 -1
  251. package/dist/interceptors/types.d.ts +12 -12
  252. package/dist/interceptors/types.js +1 -1
  253. package/dist/{localStorageContext-Dwgto93_.js → localStorageContext-BPZ82q-G.js} +2 -2
  254. package/dist/{localStorageContext-cnMYDllE.cjs → localStorageContext-NRP-CdmF.cjs} +2 -2
  255. package/dist/locators-BMQGmGLq.js +23 -0
  256. package/dist/locators-DxYdak1F.cjs +131 -0
  257. package/dist/{logger-Cp7J4YJT.cjs → logger-TBIl4uIH.cjs} +1 -1
  258. package/dist/{logger-oAgZx2-m.js → logger-W3lqg-4b.js} +1 -1
  259. package/dist/{models-B1P-dSCW.cjs → models-D-4db7XW.cjs} +5 -5
  260. package/dist/{models-CgvSM2fW.js → models-c86hYW-F.js} +5 -5
  261. package/dist/{newOrgConfigAtom-B9FW3fDc.cjs → newOrgConfigAtom-A4BEeHMf.cjs} +1 -1
  262. package/dist/{newOrgConfigAtom-CMeY5c6t.js → newOrgConfigAtom-OzAyrPS8.js} +1 -1
  263. package/dist/{newOrgConfigContext-C8wBmK3q.d.cts → newOrgConfigContext-DOdUxlOE.d.cts} +2 -2
  264. package/dist/{newOrgConfigContext-B0v1q3dk.cjs → newOrgConfigContext-DX9iqIIK.cjs} +5 -5
  265. package/dist/{newOrgConfigContext-1uwWWCPa.js → newOrgConfigContext-aqN8Tu79.js} +5 -5
  266. package/dist/{newOrgConfigContext-D180PO0t.d.ts → newOrgConfigContext-jphS5d4K.d.ts} +2 -2
  267. package/dist/{nodeSelector-DQicm08Y.d.ts → nodeSelector-Dcn3_NrZ.d.ts} +1 -1
  268. package/dist/{org-DU3Wck0R.cjs → org-Bq2KsJSp.cjs} +1 -1
  269. package/dist/{org-DptftvB6.js → org-gtWmGw4K.js} +1 -1
  270. package/dist/{search-Du6HZpO6.cjs → search-BQPMtze5.cjs} +5 -5
  271. package/dist/{search-DYVQuYti.d.ts → search-CIrqYYMI.d.ts} +2 -2
  272. package/dist/{search-BtYKpiNB.js → search-PXzaYtZj.js} +5 -5
  273. package/dist/{search-filter-types-B5xcaEit.d.ts → search-filter-types-BhK20ts3.d.ts} +1 -1
  274. package/dist/{search-filter-types-DZPTzUK9.d.cts → search-filter-types-BxaNSLs_.d.cts} +1 -1
  275. package/dist/{searchContext-BK43ArCs.cjs → searchContext-CmsLR6Ka.cjs} +7 -7
  276. package/dist/{searchContext-JjZZhDCe.js → searchContext-NPfqMf6b.js} +7 -7
  277. package/dist/{searchServiceAdapter-DrjFCiw8.cjs → searchServiceAdapter-BczodJGV.cjs} +1 -1
  278. package/dist/{searchServiceAdapter-BSPZOg1r.js → searchServiceAdapter-BuEHFG5t.js} +1 -1
  279. package/dist/{sessionStorageContext-BQY9r8zz.js → sessionStorageContext-C1u04nAK.js} +2 -2
  280. package/dist/{sessionStorageContext-R2yUAkd9.cjs → sessionStorageContext-Cy8xc9-3.cjs} +2 -2
  281. package/dist/{shopifyUrlContext-DUdw1xUH.cjs → shopifyUrlContext-CUyq3f27.cjs} +2 -2
  282. package/dist/{shopifyUrlContext-Bon8_SUJ.js → shopifyUrlContext-DTLlqlMj.js} +2 -2
  283. package/dist/{spiffyWidgets-DZqG5plz.d.ts → spiffyWidgets-BnkP5kXf.d.ts} +1 -1
  284. package/dist/{systemSettingsContext-Dv9EmjmZ.cjs → systemSettingsContext-Ba-wi2NZ.cjs} +2 -2
  285. package/dist/{systemSettingsContext-BjbhIz6y.js → systemSettingsContext-DumUaV0m.js} +2 -2
  286. package/dist/{test-types-Dl5puRHC.d.ts → test-types-DbrKQIqB.d.ts} +1 -1
  287. package/dist/types/index.d.cts +1 -1
  288. package/dist/types/index.d.ts +2 -2
  289. package/dist/{types-DIk0FLwd.js → types-BWzwd0Qc.js} +1 -1
  290. package/dist/{types-Csgpt7EV.d.ts → types-CEx2uKKS.d.ts} +1 -1
  291. package/dist/{types-D3uOF0Oy.js → types-CtUb63bt.js} +1 -1
  292. package/dist/{types-DNLkuGWZ.cjs → types-Cz8CaPUQ.cjs} +1 -1
  293. package/dist/{types-oSg-AkO5.d.ts → types-Mwm0bS2l.d.ts} +2 -2
  294. package/dist/{types-BwNrLPSZ.cjs → types-UUvB6h05.cjs} +1 -1
  295. package/dist/{types-DSW9XODe.d.cts → types-zQGBI-Yo.d.cts} +1 -1
  296. package/dist/types.d.ts +3 -3
  297. package/dist/{urlsParser-BV5yF8sa.cjs → urlsParser-COzMdJaX.cjs} +1 -1
  298. package/dist/{urlsParser-DUgV_Qy9.js → urlsParser-DxjoLj98.js} +1 -1
  299. package/dist/{useAmplitudeOperations-C9o_wDU6.cjs → useAmplitudeOperations-Cv0fi3uj.cjs} +2 -2
  300. package/dist/{useAmplitudeOperations-COq3L1no.js → useAmplitudeOperations-Ti6phPPq.js} +2 -2
  301. package/dist/{useAppDetails-C4GTLEIR.cjs → useAppDetails-BgqbPlfR.cjs} +4 -4
  302. package/dist/{useAppDetails-CEksA88Q.js → useAppDetails-DnKGYtCd.js} +4 -4
  303. package/dist/{useDebounce--rPGMuE7.js → useDebounce-BV7B-Jz3.js} +1 -1
  304. package/dist/{useDebounce-DECHWSTn.cjs → useDebounce-vU5iW5sa.cjs} +1 -1
  305. package/dist/{useGraphQLConfig-DzH1nVBh.cjs → useGraphQLConfig-BizpCw23.cjs} +2 -2
  306. package/dist/{useGraphQLConfig-DQoMmpNM.js → useGraphQLConfig-DFWl9Z89.js} +2 -2
  307. package/dist/{useIntersection-UEO0Cezc.js → useIntersection-BJRFGG0f.js} +1 -1
  308. package/dist/{useIntersection-rV0Q8mBH.cjs → useIntersection-CYRvxtRN.cjs} +1 -1
  309. package/dist/{useMessageInterceptor-D5oAekXn.js → useMessageInterceptor-BjGP_uXm.js} +1 -1
  310. package/dist/{useMessageInterceptor-CstX10ih.cjs → useMessageInterceptor-arAqUq1Q.cjs} +1 -1
  311. package/dist/{userIdentityContext-8kfKQRFx.d.ts → userIdentityContext-BvsEnQVX.d.ts} +1 -1
  312. package/dist/{utils-EDgzCG3Q.d.cts → utils-B7PAzB_M.d.cts} +1 -1
  313. package/dist/{utils-DQhbbAnt.js → utils-BRNaQkCK.js} +1 -1
  314. package/dist/{utils-CqVRbvfN.cjs → utils-Buo4KU5l.cjs} +1 -1
  315. package/dist/{utils-Cavu4XiM.cjs → utils-CDw74BCO.cjs} +1 -1
  316. package/dist/{utils-VI19AC8S.cjs → utils-CLGXsOwE.cjs} +12 -12
  317. package/dist/{utils-B8rATLoc.d.ts → utils-CrQ0h9tc.d.ts} +4 -4
  318. package/dist/{utils-ARmpTh1O.js → utils-DIvMgPe8.js} +1 -1
  319. package/dist/{utils-Bcz5kAgP.js → utils-D_kATUj6.js} +1 -1
  320. package/dist/{utils-BLe5oreh.d.ts → utils-DyTiotQz.d.ts} +1 -1
  321. package/dist/{utils-CMqFfqZx.cjs → utils-hYTjy7hJ.cjs} +1 -1
  322. package/dist/{utils-V1YTUQng.js → utils-jYtD3hmA.js} +12 -12
  323. package/dist/{variantInfo-BwBBEWSA.js → variantInfo-BfKlkaWU.js} +1 -1
  324. package/dist/{variantInfo-BRmDpamJ.cjs → variantInfo-DpLn4nHz.cjs} +1 -1
  325. package/package.json +9 -1
  326. package/src/config/index.ts +1 -0
  327. /package/dist/{AmplitudeOperations-CEwp7tPJ.cjs → AmplitudeOperations-BEGeYKG5.cjs} +0 -0
  328. /package/dist/{AmplitudeOperations-uF2zIi_1.js → AmplitudeOperations-CWI4yjZ4.js} +0 -0
  329. /package/dist/{index-CalyvQj_.d.ts → index-DL2ODEnw.d.ts} +0 -0
  330. /package/dist/{types-a8gm_IaQ.cjs → types-CKPddlfS.cjs} +0 -0
  331. /package/dist/{types-DtTnp0o0.js → types-Dc6hx6ei.js} +0 -0
  332. /package/dist/{utilityTypes-DynzxjK3.js → utilityTypes-B2KuRn37.js} +0 -0
  333. /package/dist/{utilityTypes-xb8SjKSV.cjs → utilityTypes-BGbL2WTP.cjs} +0 -0
@@ -1,15 +1,15 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_events = require('./events-B_fJZf9E.cjs');
3
- const require_models = require('./models-B1P-dSCW.cjs');
4
- const require_featureGates = require('./featureGates-BdvOVv8N.cjs');
5
- const require_logger = require('./logger-Cp7J4YJT.cjs');
6
- const require_variantInfo = require('./variantInfo-BRmDpamJ.cjs');
7
- const require_localStorageContext = require('./localStorageContext-cnMYDllE.cjs');
8
- const require_enviveConfig = require('./enviveConfig-D8vcVPWD.cjs');
9
- const require_graphqlConfig = require('./graphqlConfig-DZHeFKDY.cjs');
10
- const require_atomStore = require('./atomStore-8ppNkJ_n.cjs');
11
- const require_enviveConfigContext = require('./enviveConfigContext-C8cCcdKU.cjs');
12
- const require_featureFlagServiceContext = require('./featureFlagServiceContext-DFb-uLHN.cjs');
2
+ const require_events = require('./events-DYY4l817.cjs');
3
+ const require_models = require('./models-D-4db7XW.cjs');
4
+ const require_featureGates = require('./featureGates-qU_ulhpC.cjs');
5
+ const require_logger = require('./logger-TBIl4uIH.cjs');
6
+ const require_variantInfo = require('./variantInfo-DpLn4nHz.cjs');
7
+ const require_localStorageContext = require('./localStorageContext-NRP-CdmF.cjs');
8
+ const require_enviveConfig = require('./enviveConfig-Dv9-esGV.cjs');
9
+ const require_graphqlConfig = require('./graphqlConfig-GHZ1UgCw.cjs');
10
+ const require_atomStore = require('./atomStore-DNji91Im.cjs');
11
+ const require_enviveConfigContext = require('./enviveConfigContext-D2OELZDR.cjs');
12
+ const require_featureFlagServiceContext = require('./featureFlagServiceContext-CJyYItqu.cjs');
13
13
  let __spiffy_ai_commerce_api_client = require("@spiffy-ai/commerce-api-client");
14
14
  __spiffy_ai_commerce_api_client = require_chunk.__toESM(__spiffy_ai_commerce_api_client);
15
15
  let uuid = require("uuid");
@@ -1588,4 +1588,4 @@ Object.defineProperty(exports, 'variantInfoAtom', {
1588
1588
  return variantInfoAtom;
1589
1589
  }
1590
1590
  });
1591
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtVkkxOUFDOFMuY2pzIiwibmFtZXMiOlsiVXNlckV2ZW50Q2F0ZWdvcnkiLCJQTFBBdHRyaWJ1dGVDYXRlZ29yeSIsIlVzZXJFdmVudENhdGVnb3J5IiwiTWVzc2FnZVJvbGUiLCJNZXNzYWdlVHlwZSIsIlJlc3BvbnNlRXJyb3IiLCJnZXRBdG9tU3RvcmUiLCJiYXNlVXJsQXRvbSIsImNvbmZpZzogQ29uZmlndXJhdGlvbiIsIkNvbmZpZ3VyYXRpb24iLCJEZWZhdWx0QXBpIiwiSW5mZXJlbmNlQXBpIiwiQ3VzdG9tZXJTZXJ2aWNlQXBpIiwib3JnU2hvcnROYW1lQXRvbSIsIm9yZ0lkQXRvbSIsImNvbnRleHRTb3VyY2VBdG9tIiwiZW52QXRvbSIsImZlYXR1cmVGbGFnU2VydmljZUF0b20iLCJjb250ZXh0OiBDb250ZXh0IiwiQ29udGV4dFNvdXJjZUVudW0iLCJDb250ZXh0RW52RW51bSIsInZhbGlkYXRlUmVzcG9uc2UiLCJlcnI6IHVua25vd24iLCJlcnJvcjogdW5rbm93biIsInZhbGlkYXRlU3VnZ2VzdGlvbiIsImRhdGE6IFYxR2V0U2Vzc2lvbk1lc3NhZ2VzMjAwUmVzcG9uc2UiLCJyZXNwb25zZXM6IFJlc3BvbnNlW11bXSIsInN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10iLCJ1c2VyRXZlbnRzOiBVc2VyRXZlbnRbXSIsInZhbGlkYXRlVXNlckV2ZW50IiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJhc3Npc3RhbnRNZXNzYWdlczogTWVzc2FnZVtdW10iLCJSZXNwb25zZUNhdGVnb3J5IiwidXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsIkZvcm1UeXBlIiwiVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtIiwicmVhY3RBcHBOYW1lQXRvbSIsInJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCIsIlByb2R1Y3RFeHBlcmltZW50IiwidmFsaWRhdGVPcmdDb25maWdSZXN1bHRzIiwiVUFQYXJzZXIiLCJVc2VySWRlbnRpdHlQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+IiwidXNlTG9jYWxTdG9yYWdlIiwiQ29tbWVyY2VBcGlDbGllbnQiLCJzZXNzaW9uU3RvcmFnZVV0aWwiLCJWYXJpYW50VHlwZUVudW0iLCJjb250ZXh0U291cmNlQXRvbSIsIkNvbnRleHRTb3VyY2VFbnVtIiwiQW1wbGl0dWRlUHJvdmlkZXI6IFJlYWN0LkZDPHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9PiIsImFtcGxpdHVkZUFwaUtleUF0b20iLCJkYXRhUmVzaWRlbmN5QXRvbSIsIm9yZ0FuYWx5dGljc0dvb2dsZUFuYWx5dGljc0NvbmZpZ0F0b20iLCJlbnZBdG9tIiwiY29udGV4dFNvdXJjZUF0b20iLCJpZGVudGlmeWluZ1ByZWZpeEF0b20iLCJ1c2VMb2NhbFN0b3JhZ2UiLCJ1c2VFbnZpdmVDb25maWciLCJ1c2VGZWF0dXJlRmxhZ1NlcnZpY2UiLCJSZWFjdCIsIkxvY2FsU3RvcmFnZUtleXMiLCJ2YWx1ZSIsIk9yZ1Nob3J0TmFtZSIsIkZlYXR1cmVHYXRlcyIsImVucmljaG1lbnQ6IEVucmljaG1lbnRQbHVnaW4iLCJlbnJpY2hlZEV2ZW50OiBFdmVudCIsImdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJTcGlmZnlFdmVudCIsImN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZTogQnJvd3NlckNsaWVudCIsImV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwiaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50IiwiaXNHQTRFY29tbWVyY2VFdmVudCIsImlzQmFzZUVjb21tZXJjZUV2ZW50IiwiTWVzc2FnZVR5cGUiLCJVc2VyRXZlbnRDYXRlZ29yeSIsIk1lc3NhZ2VSb2xlIiwiTWVzc2FnZVR5cGUiLCJSZXNwb25zZUNhdGVnb3J5IiwiTWVzc2FnZVR5cGUiLCJNZXNzYWdlUm9sZSIsIlVzZXJFdmVudENhdGVnb3J5IiwiTWVzc2FnZVJvbGUiLCJNZXNzYWdlVHlwZSIsIm5vZGU6IE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkIiwib3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2NvcmVDb250ZXh0VG9BcGlDb250ZXh0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL3N1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdC50cyIsIi4uL3NyYy90eXBlcy9leGNlcHRpb25zL3Nlc3Npb25FeGNlcHRpb25zLnRzIiwiLi4vc3JjL3R5cGVzL2V4Y2VwdGlvbnMvdW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9ucy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9jb21tZXJjZS1hcGkudHMiLCIuLi9zcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0LnRzeCIsIi4uL3NyYy9hdG9tcy9hcHAvdmFyaWFudC50cyIsIi4uL3NyYy9hdG9tcy9hcHAvaW5kZXgudHMiLCIuLi9zcmMvY29udGV4dHMvYW1wbGl0dWRlQ29udGV4dC9hbXBsaXR1ZGVDb250ZXh0LnRzeCIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9hbmFseXRpY3NVdGlscy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9kaXZpZGVBcnJheS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9pbWFnZUZpbHRlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXJjaGFudFV0aWxzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tUXVlcnlFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbVJlc3BvbnNlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL25vZGVTZWxlY3Rvci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9vdmVycmlkZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvc3RyaW5nVXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvdmFsaWRhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBVc2VyRXZlbnQgYXMgQXBpVXNlckV2ZW50LFxuICBQTFBBdHRyaWJ1dGVDYXRlZ29yeSxcbiAgUExQSWRBdHRyaWJ1dGVzLFxuICBVc2VyRXZlbnRDYXRlZ29yeSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IFVzZXJFdmVudCBhcyBDb3JlVXNlckV2ZW50IH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCA9IChkYXRhOiBDb3JlVXNlckV2ZW50KTogQXBpVXNlckV2ZW50ID0+IHtcbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBkcFZpc2l0IHx8XG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuQWRkVG9DYXJ0XG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcHJvZHVjdF9pZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgcGFyZW50X3Byb2R1Y3RfaWQ6IGRhdGEuYXR0cmlidXRlcy5wYXJlbnRQcm9kdWN0SWQsXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY2F0ZWdvcnk6IFBMUEF0dHJpYnV0ZUNhdGVnb3J5LklkLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLy8gd2UncmUgb25seSBoYW5kbGluZyBpZCBhdHRyaWJ1dGVzIGZvciBub3dcbiAgICAgICAgICBpZDogKGRhdGEuYXR0cmlidXRlcy5hdHRyaWJ1dGVzIGFzIFBMUElkQXR0cmlidXRlcykuaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcXVlcnk6IGRhdGEuYXR0cmlidXRlcy5xdWVyeSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaF90ZXJtOiBkYXRhLmF0dHJpYnV0ZXMuc2VhcmNoVGVybSxcbiAgICAgICAgc2VsZWN0ZWRfZmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLnNlbGVjdGVkRmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc3VnZ2VzdGlvbl9pZDogZGF0YS5hdHRyaWJ1dGVzLnN1Z2dlc3Rpb25JZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QYWdlVmlzaXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgcGFnZV92aXNpdF9jYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLnBhZ2VWaXNpdENhdGVnb3J5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZpbGxlZF9zY2hlbWE6IHsgLi4uZGF0YS5hdHRyaWJ1dGVzLmZpbGxlZFNjaGVtYSB9LFxuICAgICAgICBmb3JtX3Jlc3BvbnNlX2lkOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQsXG4gICAgICAgIGZvcm1fdHlwZTogZGF0YS5hdHRyaWJ1dGVzLmZvcm1UeXBlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBhcHBfbG9hZGVkIGV2ZW50LCB3aGVuIHdlIHN0YXJ0IHRvIHVzZSBhcHBfdW5sb2FkZWQgd2UgbmVlZCB0byBoYW5kbGUgaXQgaGVyZVxuICByZXR1cm4ge1xuICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgTmV4dE1lc3NhZ2VSZXF1ZXN0IGFzIEFwaU5leHRNZXNzYWdlUmVxdWVzdCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBOZXh0TWVzc2FnZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50IH0gZnJvbSAnLi9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQnO1xuXG5leHBvcnQgY29uc3QgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgPSAoXG4gIGRhdGE6IE5leHRNZXNzYWdlUmVxdWVzdCxcbik6IEFwaU5leHRNZXNzYWdlUmVxdWVzdCA9PiAoe1xuICBjb250ZXh0OiB7XG4gICAgY2hhdF9pZDogZGF0YS5jb250ZXh0LmNoYXRJZCxcbiAgICBvcmdfaWQ6IGRhdGEuY29udGV4dC5vcmdJZCxcbiAgICBvcmdfc2hvcnRfbmFtZTogZGF0YS5jb250ZXh0Lm9yZ1Nob3J0TmFtZSxcbiAgICB1c2VyX2lkOiBkYXRhLmNvbnRleHQudXNlcklkLFxuICAgIHNvdXJjZTogZGF0YS5jb250ZXh0LnNvdXJjZSxcbiAgICBlbnY6IGRhdGEuY29udGV4dC5lbnYsXG4gIH0sXG4gIGlkOiBkYXRhLmlkLFxuICBmZWF0dXJlX2ZsYWdzOiBkYXRhLmZlYXR1cmVGbGFncyxcbiAgdXNlcl9ldmVudHM6IGRhdGEudXNlckV2ZW50cz8ubWFwKCh1c2VyRXZlbnQpID0+IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCh1c2VyRXZlbnQpKSxcbiAgZ2VuZXJhdGlvbl9wYXJhbXM6IHtcbiAgICBtb2RlbDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5tb2RlbCxcbiAgICBtYXhfdG9rZW5zOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/Lm1heFRva2VucyxcbiAgICBzdG9wOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0b3AsXG4gICAgc3RyZWFtOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0cmVhbSxcbiAgICB0ZW1wZXJhdHVyZTogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50ZW1wZXJhdHVyZSxcbiAgICB0b3BfcDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50b3BQLFxuICAgIG51bV9zdWdnZXN0aW9uczogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5udW1TdWdnZXN0aW9ucyxcbiAgICByZXNwb25zZV9zeXN0ZW1fcHJvbXB0OiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnJlc3BvbnNlU3lzdGVtUHJvbXB0LFxuICAgIHN1Z2dlc3Rpb25fc3lzdGVtX3Byb21wdDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5zdWdnZXN0aW9uU3lzdGVtUHJvbXB0LFxuICAgIHJlc3BvbnNlX2NhY2hpbmc6IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8ucmVzcG9uc2VDYWNoaW5nLFxuICB9LFxufSk7XG4iLCJpbXBvcnQgeyBDb250ZXh0IGFzIEFwaUNvbnRleHQgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgQ29udGV4dCBhcyBDb3JlQ29udGV4dCB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBjb3JlQ29udGV4dFRvQXBpQ29udGV4dCA9IChjb250ZXh0OiBDb3JlQ29udGV4dCk6IEFwaUNvbnRleHQgPT4gKHtcbiAgY2hhdF9pZDogY29udGV4dC5jaGF0SWQsXG4gIG9yZ19pZDogY29udGV4dC5vcmdJZCxcbiAgdXNlcl9pZDogY29udGV4dC51c2VySWQsXG4gIG9yZ19zaG9ydF9uYW1lOiBjb250ZXh0Lm9yZ1Nob3J0TmFtZSxcbiAgc291cmNlOiBjb250ZXh0LnNvdXJjZSxcbiAgZW52OiBjb250ZXh0LmVudixcbn0pO1xuIiwiaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0IGFzIEFwaVN1cHBvcnRlZEV2ZW50UmVxdWVzdCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRFdmVudFJlcXVlc3QgYXMgQ29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9hcGkvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0JztcbmltcG9ydCB7IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCB9IGZyb20gJy4vY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50JztcbmltcG9ydCB7IGNvcmVDb250ZXh0VG9BcGlDb250ZXh0IH0gZnJvbSAnLi9jb3JlQ29udGV4dFRvQXBpQ29udGV4dCc7XG5cbmV4cG9ydCBjb25zdCBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0ID0gKFxuICBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0OiBDb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuKTogQXBpU3VwcG9ydGVkRXZlbnRSZXF1ZXN0ID0+ICh7XG4gIGlkOiBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LmlkLFxuICB1c2VyX2V2ZW50OiBjb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQoY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdC51c2VyRXZlbnQpLFxuICBjb250ZXh0OiBjb3JlQ29udGV4dFRvQXBpQ29udGV4dChjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LmNvbnRleHQpLFxufSk7XG4iLCJleHBvcnQgY2xhc3MgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ1Nlc3Npb24gcmVzdGFydCByZXF1aXJlZCcpO1xuICAgIHRoaXMubmFtZSA9ICdTZXNzaW9uUmVzdGFydFJlcXVpcmVkJztcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ1Vuc3VwcG9ydGVkIHByb2R1Y3QnKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zdXBwb3J0ZWRQcm9kdWN0JztcbiAgfVxufSIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7XG4gIEZvcm1SZXNwb25zZUF0dHJpYnV0ZXMsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VSb2xlLFxuICBNZXNzYWdlVHlwZSxcbiAgVXNlckV2ZW50LFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IG1lc3NhZ2VGcm9tRm9ybVN1Ym1pdHRlZEV2ZW50ID0gKFxuICBldmVudDogVXNlckV2ZW50LFxuICBmb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ10sXG4pOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGV2ZW50LmNhdGVnb3J5ICE9PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGZvcm1TdHJpbmdDb250ZW50cyA9IE9iamVjdC5lbnRyaWVzKGZvcm1SZXNwb25zZUF0dHJpYnV0ZXMuc2NoZW1hLnByb3BlcnRpZXMpXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHt2YWx1ZS50aXRsZX06ICR7ZXZlbnQuYXR0cmlidXRlcy5maWxsZWRTY2hlbWFba2V5XX1gKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICByZXR1cm4ge1xuICAgIGlkOiBldmVudC5ldmVudElkLFxuICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgdHlwZTogTWVzc2FnZVR5cGUuUXVlcnlUeXBlZCxcbiAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICBtZXRhZGF0YToge1xuICAgICAgY29udGVudDogZm9ybVN0cmluZ0NvbnRlbnRzLFxuICAgIH0sXG4gIH07XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBDb25maWd1cmF0aW9uLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIERlZmF1bHRBcGksXG4gIEluZmVyZW5jZUFwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0sXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBSZXNwb25zZUNhdGVnb3J5LFxuICBGb3JtVHlwZSxcbn0gZnJvbSBcIkBzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHsgdmFsaWRhdGVTdWdnZXN0aW9uIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVN1Z2dlc3Rpb25cIjtcbmltcG9ydCB7IHZhbGlkYXRlVXNlckV2ZW50IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudFwiO1xuaW1wb3J0IHtcbiAgbWVzc2FnZUZyb21RdWVyeUV2ZW50LFxuICBtZXNzYWdlRnJvbVJlc3BvbnNlLFxuICBtZXNzYWdlRnJvbVN1Z2dlc3Rpb25FdmVudCxcbn0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICBSZXNwb25zZSxcbiAgU3VnZ2VzdGlvbixcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBVc2VyRXZlbnQsXG59IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzXCI7XG5pbXBvcnQgeyBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0XCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlc3BvbnNlIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgeyBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi91dGlscy9zdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3RcIjtcbmltcG9ydCB7IFNlc3Npb25SZXN0YXJ0UmVxdWlyZWQgfSBmcm9tIFwic3JjL3R5cGVzL2V4Y2VwdGlvbnMvc2Vzc2lvbkV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiB9IGZyb20gXCJzcmMvdHlwZXMvZXhjZXB0aW9ucy91bnN1cHBvcnRlZFByb2R1Y3RFeGNlcHRpb25zXCI7XG5pbXBvcnQgeyBDbGllbnREZXRhaWxzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvY2xpZW50RGV0YWlsc1wiO1xuaW1wb3J0IHsgZ2V0QXRvbVN0b3JlIH0gZnJvbSBcInNyYy9hdG9tcy9hdG9tU3RvcmUvYXRvbVN0b3JlXCI7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpbWVudCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3Byb2R1Y3RFeHBlcmltZW50XCI7XG5pbXBvcnQgeyBGZWF0dXJlR2F0ZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9mZWF0dXJlR2F0ZXNcIjtcbmltcG9ydCB7IHZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzXCI7XG5pbXBvcnQgeyBPcmdDb25maWcgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0c1wiO1xuaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnQgfSBmcm9tIFwic3JjL2F0b21zL2FwcC92YXJpYW50XCI7XG5pbXBvcnQgeyBtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gXCJAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQvZGlzdC9tb2RlbHMvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29udGV4dEVudkVudW0gfSBmcm9tIFwiQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50XCI7IC8vIEltcG9ydCBDb250ZXh0RW52RW51bVxuaW1wb3J0IHtcbiAgYmFzZVVybEF0b20sXG4gIHJlYWN0QXBwTmFtZUF0b20sXG4gIGNvbnRleHRTb3VyY2VBdG9tLFxuICBvcmdTaG9ydE5hbWVBdG9tLFxuICBlbnZBdG9tLCAvLyBJbXBvcnQgZW52QXRvbVxufSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20sIGNoYXRJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiOyAvLyBJbXBvcnQgdXNlcklkQXRvbSBhbmQgY2hhdElkQXRvbVxuaW1wb3J0IHsgb3JnSWRBdG9tLCBmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmcvZ3JhcGhxbENvbmZpZ1wiOyAvLyBJbXBvcnQgbmV3IG9yZ0lkQXRvbSBhbmQgZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbVxuXG5hc3luYyBmdW5jdGlvbiBlcnJvclJlc3BvbnNlQm9keShlcnJvcjogUmVzcG9uc2VFcnJvcikge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBlcnJvci5yZXNwb25zZS5qc29uKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZihlcnJvck1zZzogc3RyaW5nLCBlcnJvcjogdW5rbm93bikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFJlc3BvbnNlRXJyb3IpKSB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBhd2FpdCBlcnJvclJlc3BvbnNlQm9keShlcnJvcik7XG4gIGlmIChcbiAgICBlcnJvclJlc3BvbnNlPy5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpID09PSBcInVuc3VwcG9ydGVkIHByb2R1Y3RcIiB8fCAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIEFQSSByZXR1cm4gc3ViX2NvZGUgaW5zdGVhZCBvZiBtZXNzYWdlXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUFJPRFVDVF9OT1RfRk9VTkRcIlxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUkVTVEFSVF9TRVNTSU9OXCIgfHxcbiAgICBlcnJvclJlc3BvbnNlPy5zdWJfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gXCJOT1RfRk9VTkRcIiAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3IEFQSSByZXNwb25zZXMgd2lsbCBjb250YWluIFwiYXBwX2NvZGVcIlxuICApIHtcbiAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgIFwiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdC4gUmUtc3RhcnQgc2Vzc2lvblwiLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXNzaW9uUmVzdGFydFJlcXVpcmVkKCk7XG4gIH1cblxuICBMb2dnZXIubG9nSW5mbyhlcnJvck1zZywgZXJyb3IpO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuY2xhc3MgQ29tbWVyY2VBcGlDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBcGk6IERlZmF1bHRBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21lclNlcnZpY2VBcGk6IEN1c3RvbWVyU2VydmljZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGluZmVyZW5jZUFwaTogSW5mZXJlbmNlQXBpO1xuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tZXJjZUFwaUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgcmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgc3RhdGljIGdldEluc3RhbmNlID0gKCk6IENvbW1lcmNlQXBpQ2xpZW50ID0+IHtcbiAgICBpZiAoIUNvbW1lcmNlQXBpQ2xpZW50Lmluc3RhbmNlKSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSA9IG5ldyBDb21tZXJjZUFwaUNsaWVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZTtcbiAgfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJhc2VQYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYXRvbVN0b3JlID0gZ2V0QXRvbVN0b3JlKCk7XG4gICAgY29uc3QgYmFzZVVybCA9IGF0b21TdG9yZS5nZXQoYmFzZVVybEF0b20pO1xuICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aCB8fCBiYXNlVXJsO1xuICAgIC8vIEFQSSBLZXkgaXMgbm93IGhhbmRsZWQgYXQgdGhlIEVudml2ZUNvbmZpZ1Byb3ZpZGVyIGxldmVsXG4gICAgY29uc3QgY29uZmlnOiBDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oe1xuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIHJlc29sdmVVcmwgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IHVzZXJJZCA9IGF0b21TdG9yZS5nZXQodXNlcklkQXRvbSk7XG4gICAgY29uc3QgY2hhdElkID0gYXRvbVN0b3JlLmdldChjaGF0SWRBdG9tKTtcbiAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICBjb25zdCBlbnYgPSBhdG9tU3RvcmUuZ2V0KGVudkF0b20pO1xuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICB1c2VyX2lkOiB1c2VySWQgPz8gXCJcIixcbiAgICAgIG9yZ19pZDogb3JnSWQgPz8gXCJcIixcbiAgICAgIG9yZ19zaG9ydF9uYW1lOiBvcmdTaG9ydE5hbWUgPz8gXCJcIixcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCA/PyBcIlwiLFxuICAgICAgc291cmNlOiBzb3VyY2UgPz8gQ29udGV4dFNvdXJjZUVudW0uQXBwLFxuICAgICAgZW52OiAoZW52IGFzIENvbnRleHRFbnZFbnVtKSA/PyBDb250ZXh0RW52RW51bS5EZXYsIC8vIENhc3QgZW52IHRvIENvbnRleHRFbnZFbnVtXG4gICAgfTtcblxuICAgIGNvbnN0IGZlYXR1cmVHYXRlcyA9XG4gICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge307XG4gICAgY29uc3QgdXJsUmVzb2x2aW5nUmVxdWVzdCA9IHtcbiAgICAgIHVybCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmZWF0dXJlX2dhdGVzOiBmZWF0dXJlR2F0ZXMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJhd1Jlc3BvbnNlID1cbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxVXJsUmVzb2x2aW5nUG9zdFJhdyh7XG4gICAgICAgIFVybFJlc29sdmluZ1JlcXVlc3Q6IHVybFJlc29sdmluZ1JlcXVlc3QsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJhd1Jlc3BvbnNlLnJhdy5qc29uKCk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xuICB9O1xuXG4gIHN0YXRpYyByZXBvcnRTZXNzaW9uID0gYXN5bmMgKFxuICAgIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFNlc3Npb25SZXF1ZXN0XG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUNoYXRzUmVwb3J0U2Vzc2lvbklkUG9zdChcbiAgICAgIHtcbiAgICAgICAgUmVwb3J0U2Vzc2lvblJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlcyA9IGFzeW5jIChcbiAgICBwYXlsb2FkOiBOZXh0TWVzc2FnZVJlcXVlc3RcbiAgKTogUHJvbWlzZTxNZXNzYWdlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0KHtcbiAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwKSlcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwKSk7XG5cbiAgICAgIHJldHVybiBtZXNzYWdlcy5maWx0ZXIoKG0pOiBtIGlzIE1lc3NhZ2UgPT4gbSAhPSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgIExvZ2dlci5sb2dJbmZvKFwiRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlc1wiLCBlcnIsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKFwiRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlc1wiLCBlcnIpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nID0gKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdFxuICApOiBBc3luY0dlbmVyYXRvcjxSZXNwb25zZSwgdm9pZCwgdW5rbm93bj4gPT4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uKiBnZW5lcmF0ZShcbiAgICAgIGluZmVyZW5jZUFwaTogSW5mZXJlbmNlQXBpLFxuICAgICAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgICApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBzdHJlYW1pbmcgaXMgZW5hYmxlZFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpbmZlcmVuY2VBcGkudjFOZXh0UmVzcG9uc2VzUG9zdFJhdyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGFzIGEgc3RyZWFtIG9mIGRhdGFcbiAgICAgICAgaWYgKCFyZXNwb25zZS5yYXcuYm9keSkge1xuICAgICAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgICAgIFwiW3NwaWZmeS1haV0gTm8gYm9keSBpbiB0aGUgc3RyZWFtZWQgcmVzcG9uc2VcIixcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnJhdyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLnJhdy5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7XG5cbiAgICAgICAgbGV0IHBhcnRpYWwgPSBcIlwiO1xuICAgICAgICAvLyBUT0RPIHRoaXMgZnVuY3Rpb24gaXMgcmVjcmVhdGVkIGV2ZXJ5IHRpbWUgbmV3IGRhdGEgY29tZXMgZnJvbSB0aGUgc3RyZWFtIC0gZGVmaW5lIGl0IG91dHNpZGUgb2YgdGhlIGdlbmVyYXRvclxuICAgICAgICBjb25zdCBzYWZlUGFyc2UgPSAobGluZTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxpbmUpOyAvLyBQYXJzZSB0aGUgSlNPTiBzdHJpbmdcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIExvZ2dlci5sb2dFcnJvcihcIltzcGlmZnktYWldIEVycm9yIHBhcnNpbmcgc3RyZWFtZWQgbGluZVwiLCBlcnIsIHtcbiAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgcGFydGlhbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gc3dhbGxvdyB0aGUgZXJyb3IgYW5kIHNldCB0aGUgcGFydGlhbCB0byBvdXIgY3VycmVudCBjaHVua1xuICAgICAgICAgICAgcGFydGlhbCA9IGxpbmU7XG4gICAgICAgICAgICByZXR1cm4gcGFydGlhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVE9ETyB0aGlzIGZ1bmN0aW9uIGlzIHJlY3JlYXRlZCBldmVyeSB0aW1lIG5ldyBkYXRhIGNvbWVzIGZyb20gdGhlIHN0cmVhbSAtIGRlZmluZSBpdCBvdXRzaWRlIG9mIHRoZSBnZW5lcmF0b3JcbiAgICAgICAgY29uc3QgcHJvY2Vzc0NodW5rID0gKGNodW5rOiBzdHJpbmcpOiB1bmtub3duW10gPT4ge1xuICAgICAgICAgIC8vIG1lcmdlIHRoZSBwYXJ0aWFsIHdpdGggdGhlIGluY29taW5nIGNodW5rXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBgJHtwYXJ0aWFsfSR7Y2h1bmt9YC5zcGxpdChcIlxcblwiKTtcblxuICAgICAgICAgIGNvbnN0IHBhcnNlZExpbmVzID0gbGluZXNcbiAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUucmVwbGFjZSgvXmRhdGE6IC8sIFwiXCIpLnRyaW0oKSkgLy8gUmVtb3ZlIHRoZSBcImRhdGE6IFwiIHByZWZpeFxuICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gXCJcIiAmJiBsaW5lICE9PSBcIltET05FXVwiKSAvLyBSZW1vdmUgZW1wdHkgbGluZXMgYW5kIFwiW0RPTkVdXCJcbiAgICAgICAgICAgIC5tYXAoc2FmZVBhcnNlKVxuICAgICAgICAgICAgLmZpbHRlcigodikgPT4gdik7IC8vIGFuZCBmaWx0ZXIgb3V0IHRoZSB1bmRlZmluZWQgdmFsdWVzXG4gICAgICAgICAgcmV0dXJuIHBhcnNlZExpbmVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuXG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hc3NhZ2UgYW5kIHBhcnNlIHRoZSBjaHVuayBvZiBkYXRhXG4gICAgICAgICAgY29uc3QgY2h1bmsgPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTGluZXMgPSBwcm9jZXNzQ2h1bmsoY2h1bmspO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBwYXJzZWRMaW5lIG9mIHBhcnNlZExpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRSZXNwb25zZSA9IHZhbGlkYXRlUmVzcG9uc2UocGFyc2VkTGluZSk7XG5cbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB5aWVsZCB2YWxpZGF0ZWRSZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgICBcIltzcGlmZnktYWldIEZhaWxlZCB0byBnZXQgbmV4dCBzdHJlYW1pbmcgcmVzcG9uc2VzXCIsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgICAgICB1c2VyRXZlbnRzOiBwYXlsb2FkPy51c2VyRXZlbnRzLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlc1wiLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5yZXNwb25zZXNBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlciA9XG4gICAgICBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdGUoXG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaSxcbiAgICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyXG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdFxuICApOiBQcm9taXNlPFN1Z2dlc3Rpb25bXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyID1cbiAgICAgICAgbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxTmV4dFN1Z2dlc3Rpb25zUG9zdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2lnbmFsOlxuICAgICAgICAgICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gdmFsaWRhdGVTdWdnZXN0aW9uKHJlc3ApKVxuICAgICAgICAuZmlsdGVyKChzdWdnZXN0aW9uKTogc3VnZ2VzdGlvbiBpcyBTdWdnZXN0aW9uID0+IHN1Z2dlc3Rpb24gIT0gbnVsbCk7XG5cbiAgICAgIHJldHVybiBzdWdnZXN0aW9ucztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXCJGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zXCIsIGVycm9yLCB7XG4gICAgICAgIHBheWxvYWRDb250ZXh0OiBwYXlsb2FkPy5jb250ZXh0LFxuICAgICAgICB1c2VyRXZlbnRzOiBwYXlsb2FkPy51c2VyRXZlbnRzLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKFwiRmFpbGVkIHRvIGdldCBzdWdnZXN0aW9uc1wiLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBleGlzdGluZyBjaGF0IGRhdGEgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCBUaGUgb3JnYW5pemF0aW9uIElkXG4gICAqIEBwYXJhbSBjaGF0SWQgVGhlIGV4aXN0aW5nIGNoYXQgSWRcbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBJZFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCB3ZXJlIGV4Y2hhbmdlZCBpbiB0aGUgY2hhdCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjaGF0IHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgY2hhdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7XG4gICAgcmVzcG9uc2VzOiBSZXNwb25zZVtdW107XG4gICAgdXNlckV2ZW50czogVXNlckV2ZW50W107XG4gICAgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXTtcbiAgICBtZXNzYWdlczogTWVzc2FnZVtdW107XG4gIH0+ID0+IHtcbiAgICBsZXQgZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSA9IHtcbiAgICAgIHJlc3BvbnNlczogW10sXG4gICAgICBzdWdnZXN0aW9uczogW10sXG4gICAgICB1c2VyX2V2ZW50czogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgb3JnX2lkOiBvcmdJZCxcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCxcbiAgICAgIHVzZXJfaWQ6IHVzZXJJZCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBkYXRhID1cbiAgICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5kZWZhdWx0QXBpLnYxR2V0U2Vzc2lvbk1lc3NhZ2VzKFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXG4gICAgICAgIFwiRmFpbGVkIHRvIGdldCBjaGF0IHJlc3BvbnNlc1wiLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZXM6IFJlc3BvbnNlW11bXSA9IGRhdGE/LnJlc3BvbnNlcz8ubWFwKCh0dXJuKSA9PlxuICAgICAgdHVyblxuICAgICAgICAubWFwKChyZXNwb25zZSkgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgIC5maWx0ZXIoKHJlc3BvbnNlKTogcmVzcG9uc2UgaXMgUmVzcG9uc2UgPT4gcmVzcG9uc2UgIT0gbnVsbClcbiAgICApO1xuXG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSA9IGRhdGE/LnN1Z2dlc3Rpb25zXG4gICAgICAubWFwKChzdWdnZXN0aW9uKSA9PiB2YWxpZGF0ZVN1Z2dlc3Rpb24oc3VnZ2VzdGlvbikpXG4gICAgICAuZmlsdGVyKChzdWdnZXN0aW9uKTogc3VnZ2VzdGlvbiBpcyBTdWdnZXN0aW9uID0+IHN1Z2dlc3Rpb24gIT0gbnVsbCk7XG5cbiAgICBjb25zdCB1c2VyRXZlbnRzOiBVc2VyRXZlbnRbXSA9IGRhdGE/LnVzZXJfZXZlbnRzXG4gICAgICAubWFwKChldmVudCkgPT4gdmFsaWRhdGVVc2VyRXZlbnQoZXZlbnQpKVxuICAgICAgLmZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBVc2VyRXZlbnQgPT4gZXZlbnQgIT0gbnVsbCk7XG5cbiAgICAvLyBpZiBhIGZvcm0gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQsIGRvbid0IHNob3cgaXQgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcyA9IHVzZXJFdmVudHNcbiAgICAgIC5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZClcbiAgICAgIC5tYXAoKGV2ZW50KSA9PiBldmVudC5hdHRyaWJ1dGVzLmZvcm1SZXNwb25zZUlkKTtcblxuICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VzOiBNZXNzYWdlW11bXSA9IHJlc3BvbnNlc1xuICAgICAgLm1hcCgodHVybikgPT5cbiAgICAgICAgdHVyblxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuRm9ybSAmJlxuICAgICAgICAgICAgICAgIGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcy5pbmNsdWRlcyhyZXNwb25zZS5pZClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChyZXNwb25zZSkgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZSA9PiBtZXNzYWdlICE9IG51bGwpXG4gICAgICApXG4gICAgICAuZmlsdGVyKCh0dXJuKSA9PiB0dXJuLmxlbmd0aCA+IDApO1xuXG4gICAgY29uc3QgdXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSA9IHVzZXJFdmVudHNcbiAgICAgIC5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBbVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCwgVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIGV2ZW50LmNhdGVnb3J5XG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gW21lc3NhZ2VGcm9tUXVlcnlFdmVudChldmVudCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQoZXZlbnQsIHN1Z2dlc3Rpb25zKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZXNcbiAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPT09IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5hdHRyaWJ1dGVzLmZvcm1UeXBlICE9PSBGb3JtVHlwZS5Fc2NhbGF0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGZvcm1SZXNwb25zZSAmJiBmb3JtUmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuRm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQoZXZlbnQsIGZvcm1SZXNwb25zZS5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKG1lc3NhZ2UpOiBtZXNzYWdlIGlzIE1lc3NhZ2VbXSA9PiBtZXNzYWdlLmxlbmd0aCA+IDApO1xuXG4gICAgLy8gU29ydCB0aGUgbWVzc2FnZXMgY2hyb25vbG9naWNhbGx5IHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnlcbiAgICBjb25zdCBzb3J0ZWRNZXNzYWdlcyA9IFsuLi5hc3Npc3RhbnRNZXNzYWdlcywgLi4udXNlck1lc3NhZ2VzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+XG4gICAgICAgIG5ldyBEYXRlKGFbMF0uY3JlYXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiWzBdLmNyZWF0ZWRBdCkuZ2V0VGltZSgpXG4gICAgKTtcblxuICAgIHJldHVybiB7IHJlc3BvbnNlcywgdXNlckV2ZW50cywgc3VnZ2VzdGlvbnMsIG1lc3NhZ2VzOiBzb3J0ZWRNZXNzYWdlcyB9O1xuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkRXZlbnQgPSBhc3luYyAoXG4gICAgcGF5bG9hZDogU3VwcG9ydGVkRXZlbnRSZXF1ZXN0XG4gICk6IFByb21pc2U8U3VwcG9ydGVkRXZlbnQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MVN1cHBvcnRlZEV2ZW50UG9zdFJhdyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBTdXBwb3J0ZWRFdmVudFJlcXVlc3Q6XG4gICAgICAgICAgICAgIGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIEpTT05cbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZVRleHQgPSBhd2FpdCByYXdSZXNwb25zZS5yYXcudGV4dCgpO1xuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlSnNvbiA9IEpTT04ucGFyc2UoaHR0cFJlc3BvbnNlVGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmh0dHBSZXNwb25zZUpzb24sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogaHR0cFJlc3BvbnNlSnNvbi5udW1fb2ZfcmV2aWV3cyxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogaHR0cFJlc3BvbnNlSnNvbi5tZXJjaGFudF90YWdzIHx8IFtdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcIkZhaWxlZCB0byBnZXQgcmVzcG9uc2UgZm9yIHYxU3VwcG9ydGVkRXZlbnRQb3N0XCIsIHtcbiAgICAgICAgZXJyLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgICAgICByZWFkeTogZmFsc2UsXG4gICAgICAgIGNhdGVnb3J5OiB1bmRlZmluZWQsXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbXSxcbiAgICAgICAgbnVtYmVyT2ZSZXZpZXdzOiB1bmRlZmluZWQsXG4gICAgICAgIHRvcF9jYXRlZ29yeTogdW5kZWZpbmVkLFxuICAgICAgICBtZXJjaGFudF90YWdzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBpZGVudGlmeVVzZXIgPSBhc3luYyAoXG4gICAgc3BpZmZ5VXNlcklkOiBzdHJpbmcsXG4gICAgbWVyY2hhbnRVc2VySWQ6IHN0cmluZyxcbiAgICB1YURldGFpbHM6IENsaWVudERldGFpbHNcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUFuYWx5dGljc0lkZW50aWZ5UG9zdCh7XG4gICAgICAgIEFuYWx5dGljc0lkZW50aWZ5UmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJfaWQ6IHNwaWZmeVVzZXJJZCxcbiAgICAgICAgICBvc19uYW1lOiB1YURldGFpbHMub3MsXG4gICAgICAgICAgb3NfdmVyc2lvbjogdWFEZXRhaWxzLm9zVmVyc2lvbixcbiAgICAgICAgICBwbGF0Zm9ybTogdWFEZXRhaWxzLm9zLFxuICAgICAgICAgIGRldmljZV9pZDogdWFEZXRhaWxzLmRldmljZU1vZGVsLFxuICAgICAgICAgIGRldmljZV9icmFuZDogdWFEZXRhaWxzLmRldmljZUJyYW5kLFxuICAgICAgICAgIGRldmljZV9tYW51ZmFjdHVyZXI6IHVhRGV0YWlscy5kZXZpY2VNYW51ZmFjdHVyZXIsXG4gICAgICAgICAgZGV2aWNlX21vZGVsOiB1YURldGFpbHMuZGV2aWNlTW9kZWwsXG4gICAgICAgICAgdXNlcl9wcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjZHBfdXNlcl9pZDogbWVyY2hhbnRVc2VySWQsXG4gICAgICAgICAgICBicm93c2VyOiB1YURldGFpbHMuYnJvd3NlcixcbiAgICAgICAgICAgIGJyb3dzZXJfdmVyc2lvbjogdWFEZXRhaWxzLmJyb3dzZXJWZXJzaW9uLFxuICAgICAgICAgICAgdXNlcl9hZ2VudDogdWFEZXRhaWxzLnVzZXJBZ2VudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJGYWlsZWQgdG8gaWRlbnRpZnkgdXNlclwiLCBlcnIpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBtYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZSA9IChcbiAgICBzb3VyY2U6IENvbnRleHRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkXG4gICk6IFYxT3JnQ29uZmlnR2V0U291cmNlRW51bSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLkZvcms6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uRm9yaztcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uUGxheWdyb3VuZDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5QbGF5Z3JvdW5kO1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5BcHA6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uQXBwO1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5UZXN0OlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlRlc3Q7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIG5ldyB2YWx1ZXMgYXJlIGFkZGVkIHRvIENvbnRleHRTb3VyY2VFbnVtLCB3ZSBjYXRjaCBpdFxuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gc291cmNlO1xuICAgICAgICByZXR1cm4gZXhoYXVzdGl2ZUNoZWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0T3JnQ29uZmlnID0gYXN5bmMgKFxuICAgIHVzZXJfaWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPE9yZ0NvbmZpZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICAgIGNvbnN0IHJlYWN0QXBwTmFtZSA9IGF0b21TdG9yZS5nZXQocmVhY3RBcHBOYW1lQXRvbSk7XG4gICAgICBjb25zdCBjb250ZXh0U291cmNlID0gYXRvbVN0b3JlLmdldChjb250ZXh0U291cmNlQXRvbSk7XG4gICAgICBjb25zdCBmZWF0dXJlRmxhZ1NlcnZpY2UgPSBhdG9tU3RvcmUuZ2V0KGZlYXR1cmVGbGFnU2VydmljZUF0b20pOyAvLyBHZXQgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICBjb25zdCByZXF1ZXN0OiBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QgPSB7XG4gICAgICAgIG5hbWVzcGFjZTogcmVhY3RBcHBOYW1lLFxuICAgICAgICB1c2VyX2lkLFxuICAgICAgICBzb3VyY2U6IHRoaXMubWFwQ29udGV4dFNvdXJjZVRvVjFPcmdDb25maWdHZXRTb3VyY2UoY29udGV4dFNvdXJjZSksXG4gICAgICAgIGluY2x1ZGVfZXhwZXJpbWVudHM6IE9iamVjdC52YWx1ZXMoUHJvZHVjdEV4cGVyaW1lbnQpLFxuICAgICAgICBpbmNsdWRlX2ZlYXR1cmVfZ2F0ZXM6IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgIGZlYXR1cmVGbGFnU2VydmljZT8uZmVhdHVyZUZsYWdTZXJ2aWNlPy5nZXRGZWF0dXJlRmxhZ3MoKSB8fCB7fVxuICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcigoWywgaXNFbmFibGVkXSkgPT4gaXNFbmFibGVkKVxuICAgICAgICAgIC5tYXAoKFtmZWF0dXJlR2F0ZU5hbWVdKSA9PiBmZWF0dXJlR2F0ZU5hbWUpLCAvLyBVc2UgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFPcmdDb25maWdHZXQoXG4gICAgICAgICAgcmVxdWVzdFxuICAgICAgICApO1xuXG4gICAgICByZXR1cm4gdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzKHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihgRmFpbGVkIHRvIGdldCBvcmcgY29uZmlnYCwgZXJyLCB7IGVyciB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBhZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb24gPSBhc3luYyAoXG4gICAgc3BpZmZ5VXNlcklkOiBzdHJpbmcsXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBjdXN0b21lclNlcnZpY2VQcm92aWRlcjogQ3VzdG9tZXJTZXJ2aWNlUHJvdmlkZXJcbiAgKSA9PiB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oXG4gICAgICBgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uIC0gdXNlcl9pZD0ke3NwaWZmeVVzZXJJZH0gZW1haWw9JHtlbWFpbH0gY3VzdG9tZXJfc2VydmljZV9wcm92aWRlcj0ke2N1c3RvbWVyU2VydmljZVByb3ZpZGVyfWBcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmN1c3RvbWVyU2VydmljZUFwaS52MUN1c3RzZXJ2aWNlQWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uUG9zdChcbiAgICAgICAge1xuICAgICAgICAgIEFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHNwaWZmeV91c2VyX2lkOiBzcGlmZnlVc2VySWQsXG4gICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgIGN1c3RvbWVyX3NlcnZpY2VfcHJvdmlkZXI6IGN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJGYWlsZWQgdG8gYWRkIG5vdGUgdG8gbGF0ZXN0IGNvbnZlcnNhdGlvblwiLCB7IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldEN1c3RvbWVyU2VydmljZUFwaSA9ICgpID0+XG4gICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1lcmNlQXBpQ2xpZW50O1xuIiwiaW1wb3J0IFJlYWN0LCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbiAgdXNlRWZmZWN0LFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBVQVBhcnNlciBmcm9tIFwidWEtcGFyc2VyLWpzXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCJzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXJcIjtcbmltcG9ydCBDb21tZXJjZUFwaUNsaWVudCBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2NvbW1lcmNlLWFwaVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgeyBDbGllbnREZXRhaWxzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvY2xpZW50RGV0YWlsc1wiO1xuaW1wb3J0IHsgdXNlTG9jYWxTdG9yYWdlIH0gZnJvbSBcInNyYy9jb250ZXh0cy9sb2NhbFN0b3JhZ2VDb250ZXh0XCI7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBzZXJ2aWNlXG5jb25zdCBnZXRVc2VyQWdlbnREZXRhaWxzID0gKCk6IENsaWVudERldGFpbHMgPT4ge1xuICBjb25zdCB1YVBhcnNlciA9IG5ldyBVQVBhcnNlcigpO1xuICBjb25zdCByZXN1bHQgPSB1YVBhcnNlci5nZXRSZXN1bHQoKTtcblxuICByZXR1cm4ge1xuICAgIG9zOiByZXN1bHQ/Lm9zPy5uYW1lLFxuICAgIG9zVmVyc2lvbjogcmVzdWx0Py5vcz8udmVyc2lvbixcbiAgICBkZXZpY2VCcmFuZDogcmVzdWx0Py5kZXZpY2U/LnZlbmRvcixcbiAgICBkZXZpY2VNYW51ZmFjdHVyZXI6IHJlc3VsdD8uZGV2aWNlPy52ZW5kb3IsXG4gICAgZGV2aWNlTW9kZWw6IHJlc3VsdD8uZGV2aWNlPy5tb2RlbCxcbiAgICBicm93c2VyOiByZXN1bHQ/LmJyb3dzZXI/Lm5hbWUsXG4gICAgYnJvd3NlclZlcnNpb246IHJlc3VsdD8uYnJvd3Nlcj8udmVyc2lvbixcbiAgICB1c2VyQWdlbnQ6IHJlc3VsdD8udWEsXG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJZGVudGl0eUNvbnRleHRUeXBlIHtcbiAgaWRlbnRpZnlVc2VyOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBnZXRVc2VySWRPckRlZmF1bHQ6ICgpID0+IHN0cmluZztcbiAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZTogKHVzZXJJZDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2U6ICh1c2VySWQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2U6ICgpID0+IHZvaWQ7XG4gIGlzUmVhZHk6IGJvb2xlYW47XG59XG5cbmNvbnN0IFVzZXJJZGVudGl0eUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFVzZXJJZGVudGl0eUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkPihcbiAgdW5kZWZpbmVkXG4pO1xuXG5leHBvcnQgY29uc3QgVXNlcklkZW50aXR5UHJvdmlkZXI6IFJlYWN0LkZDPHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9PiA9ICh7XG4gIGNoaWxkcmVuLFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgZ2V0SXRlbSxcbiAgICBzZXRJdGVtLFxuICAgIGlzQXZhaWxhYmxlOiBsb2NhbFN0b3JhZ2VJc1JlYWR5LFxuICB9ID0gdXNlTG9jYWxTdG9yYWdlKCk7XG5cbiAgY29uc3QgW2lzUmVhZHksIHNldElzUmVhZHldID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gQXNzdW1pbmcgQ29tbWVyY2VBcGlDbGllbnQgYW5kIG90aGVyIGRlcGVuZGVuY2llcyBhcmUgcmVhZHkgaWYgbG9jYWxTdG9yYWdlIGlzLlxuICAgIC8vIEluIGEgbW9yZSBjb21wbGV4IHNjZW5hcmlvLCB5b3UgbWlnaHQgaGF2ZSBtb3JlIGNoZWNrcyBoZXJlLlxuICAgIHNldElzUmVhZHkobG9jYWxTdG9yYWdlSXNSZWFkeSk7XG4gIH0sIFtsb2NhbFN0b3JhZ2VJc1JlYWR5XSk7XG5cbiAgY29uc3QgVVNFUl9JRF9PVkVSUklERV9LRVkgPSBcInYxLXNwaWZmeS11c2VyLWlkLW92ZXJyaWRlXCI7XG4gIGNvbnN0IFVTRVJfSURfREVGQVVMVF9LRVkgPSBcInYxLXNwaWZmeS11c2VyLWlkLWRlZmF1bHRcIjtcblxuICBjb25zdCBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKTpcbiAgICB8IHN0cmluZ1xuICAgIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gZ2V0SXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSkgPz8gdW5kZWZpbmVkO1xuICB9LCBbZ2V0SXRlbV0pO1xuXG4gIGNvbnN0IGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soKCk6XG4gICAgfCBzdHJpbmdcbiAgICB8IHVuZGVmaW5lZCA9PiB7XG4gICAgcmV0dXJuIGdldEl0ZW0oVVNFUl9JRF9ERUZBVUxUX0tFWSkgPz8gdW5kZWZpbmVkO1xuICB9LCBbZ2V0SXRlbV0pO1xuXG4gIGNvbnN0IHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1c2VySWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgICAgYHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSAtIFNldHRpbmcgdXNlcl9pZD0ke3VzZXJJZH1gXG4gICAgICApO1xuICAgICAgc2V0SXRlbShVU0VSX0lEX0RFRkFVTFRfS0VZLCB1c2VySWQpO1xuICAgICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgICByZXR1cm4gdXNlcklkO1xuICAgIH0sXG4gICAgW3NldEl0ZW0sIFVTRVJfSURfREVGQVVMVF9LRVldXG4gICk7XG5cbiAgY29uc3Qgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1c2VySWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgICAgYHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgLSBTZXR0aW5nIHVzZXJfaWQ9JHt1c2VySWR9YFxuICAgICAgKTtcbiAgICAgIHNldEl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVksIHVzZXJJZCk7XG4gICAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudCBpcyBoYW5kbGVkIGJ5IHVzZUxvY2FsU3RvcmFnZSBub3dcbiAgICAgIHJldHVybiB1c2VySWQ7XG4gICAgfSxcbiAgICBbc2V0SXRlbSwgVVNFUl9JRF9PVkVSUklERV9LRVldXG4gICk7XG5cbiAgY29uc3QgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIExvZ2dlci5sb2dJbmZvKGBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgLSBDbGVhcmluZyB1c2VyX2lkYCk7XG4gICAgLy8gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRMb2NhbFN0b3JhZ2UoKT8ucmVtb3ZlSXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSk7XG4gICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgc2V0SXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSwgXCJcIik7IC8vIFNldCB0byBlbXB0eSBzdHJpbmcgdG8gY2xlYXJcbiAgfSwgW3NldEl0ZW0sIFVTRVJfSURfT1ZFUlJJREVfS0VZXSk7XG5cbiAgY29uc3QgZ2V0VXNlcklkT3JEZWZhdWx0ID0gdXNlQ2FsbGJhY2soKCk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgdXNlcklkT3ZlcnJpZGUgPSBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAodXNlcklkT3ZlcnJpZGUpIHtcbiAgICAgIHJldHVybiB1c2VySWRPdmVycmlkZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VXNlcklkID0gZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoZGVmYXVsdFVzZXJJZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRVc2VySWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZShgc3BpZmZ5LXVzZXItaWQtJHt1dWlkKCl9YCk7XG4gIH0sIFtcbiAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICBdKTtcblxuICBjb25zdCBpZGVudGlmeVVzZXIgPSB1c2VDYWxsYmFjayhhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFpc1JlYWR5KSB7XG4gICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgXCJbVXNlcklkZW50aXR5Q29udGV4dF0gQ29udGV4dCBub3QgcmVhZHksIHNraXBwaW5nIGlkZW50aWZ5VXNlclwiLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRlbXBvcmFyaWx5IGNvbW1lbnRlZCBvdXQgdW50aWwgV2luZG93RGF0YUxheWVyU2VydmljZSBpcyByZXNvbHZlZFxuICAgICAgLy8gY29uc3QgY2RwVXNlcklkID0gV2luZG93RGF0YUxheWVyU2VydmljZS5nZXRHb29nbGVBbmFseXRpY3NDbGllbnRJZCgpO1xuICAgICAgY29uc3QgY2RwVXNlcklkID0gXCJVTktOT1dOX0NEUF9VU0VSX0lEXCI7IC8vIFBsYWNlaG9sZGVyXG4gICAgICBjb25zdCB1c2VySWQgPSBnZXRVc2VySWRPckRlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHVzZXJBZ2VudERldGFpbHMgPSBnZXRVc2VyQWdlbnREZXRhaWxzKCk7XG5cbiAgICAgIGlmICghY2RwVXNlcklkKSB7XG4gICAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAgIFwiW3NwaWZmeS1haV0gTm8gR0EgQ2xpZW50IElEIGZvdW5kLCBza2lwcGluZyBpZGVudGlmeVVzZXJcIixcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5pZGVudGlmeVVzZXIodXNlcklkLCBjZHBVc2VySWQsIHVzZXJBZ2VudERldGFpbHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJbc3BpZmZ5LWFpXSBFcnJvciBpZGVudGlmeWluZyB1c2VyXCIsIGVycm9yKTtcbiAgICB9XG4gIH0sIFtpc1JlYWR5LCBnZXRVc2VySWRPckRlZmF1bHRdKTtcblxuICBjb25zdCB2YWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIGlkZW50aWZ5VXNlcixcbiAgICAgIGdldFVzZXJJZE9yRGVmYXVsdCxcbiAgICAgIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGlzUmVhZHksXG4gICAgfSksXG4gICAgW1xuICAgICAgaWRlbnRpZnlVc2VyLFxuICAgICAgZ2V0VXNlcklkT3JEZWZhdWx0LFxuICAgICAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgaXNSZWFkeSxcbiAgICBdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8VXNlcklkZW50aXR5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17dmFsdWV9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvVXNlcklkZW50aXR5Q29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VVc2VySWRlbnRpdHkgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFVzZXJJZGVudGl0eUNvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcInVzZVVzZXJJZGVudGl0eSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgVXNlcklkZW50aXR5UHJvdmlkZXJcIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiaW1wb3J0IHsgYXRvbVdpdGhTdG9yYWdlIH0gZnJvbSAnam90YWkvdXRpbHMnO1xuaW1wb3J0IHsgYXRvbSB9IGZyb20gJ2pvdGFpJztcbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50UmVzcG9uc2UsIFBhZ2VWaXNpdENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7XG4gIFBhZ2VWaXNpdFZhcmlhbnRJbmZvLFxuICBQRFBWYXJpYW50SW5mbyxcbiAgUExQVmFyaWFudEluZm8sXG4gIFZhcmlhbnRJbmZvLFxuICBWYXJpYW50VHlwZUVudW0sXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgc2Vzc2lvblN0b3JhZ2VVdGlsIH0gZnJvbSAnc3JjL2F0b21zL2F0b21TdG9yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcG9ydGVkRXZlbnRcbiAgZXh0ZW5kcyBQaWNrPFxuICAgIFN1cHBvcnRlZEV2ZW50UmVzcG9uc2UsXG4gICAgJ3N1cHBvcnRlZCcgfCAncmVhZHknIHwgJ2NhdGVnb3J5JyB8ICdjb2xsZWN0aW9ucycgfCAndG9wX2NhdGVnb3J5J1xuICA+IHtcbiAgbnVtYmVyT2ZSZXZpZXdzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG1lcmNoYW50X3RhZ3M/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFBEUEF0dHJpYnV0ZXMge1xuICBwcm9kdWN0X2lkPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUExQQXR0cmlidXRlcyB7XG4gIGF0dHJpYnV0ZXM/OiB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsUmVzb2x2aW5nUERQQ29uZmlnIHtcbiAgcGRwX2F0dHJpYnV0ZXM6IFBEUEF0dHJpYnV0ZXM7XG4gIG51bWJlcl9vZl9yZXZpZXdzPzogbnVtYmVyO1xuICBjb2xsZWN0aW9ucz86IHN0cmluZ1tdO1xuICBtZXJjaGFudF90YWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsUmVzb2x2aW5nUExQQ29uZmlnIHtcbiAgcGxwX2F0dHJpYnV0ZXM6IFBMUEF0dHJpYnV0ZXM7XG4gIHRvcF9jYXRlZ29yeT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFVybFJlc29sdmluZ0dlbmVyaWNDb25maWcge1xuICBkZXRhaWxzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQYWdlVmFyaWFudENoZWNrQ29uZmlnID0ge1xuICBjaGVja190eXBlOiBzdHJpbmc7XG4gIGZlYXR1cmVfZ2F0ZT86IHN0cmluZztcbiAgZXh0cmFjdG9yPzoge1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBtYXA/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gIH07XG4gIHByb2R1Y3RfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwcm9kdWN0X2lkcz86IHN0cmluZ1tdO1xuICBwbHBfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwbHBfaWRzPzogc3RyaW5nW107XG4gIGNvbGxlY3Rpb25zPzogc3RyaW5nW107XG4gIHF1ZXJ5X3BhcmFtPzogc3RyaW5nO1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgdG9wX2NhdGVnb3J5Pzogc3RyaW5nW107XG4gIHJldmlld19taW5pbXVtPzogbnVtYmVyO1xuICBtZXJjaGFudF90YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrZW5kV2lkZ2V0TW91bnRpbmdDb25maWcgPSB7XG4gIG1vdW50aW5nX2NvbmZpZ19pZDogc3RyaW5nO1xuICB3aWRnZXRfY29uZmlnX2lkPzogc3RyaW5nO1xuICBtb3VudGluZ19wb2ludF93aWRnZXRzPzogQXJyYXk8e1xuICAgIGNoZWNrczogUGFnZVZhcmlhbnRDaGVja0NvbmZpZ1tdO1xuICAgIHdpZGdldF9jb25maWdfaWQ6IHN0cmluZztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrZW5kUGFnZVZhcmlhbnRDb25maWcgPSB7XG4gIHZhcmlhbnRfaWQ6IHN0cmluZztcbiAgdmFyaWFudF90eXBlOiBzdHJpbmc7XG4gIHZhcmlhbnRfY2hlY2tzOiBQYWdlVmFyaWFudENoZWNrQ29uZmlnW107XG4gIHdpZGdldF9tb3VudGluZzogQmFja2VuZFdpZGdldE1vdW50aW5nQ29uZmlnW107XG4gIHBscF9pZF9leHRyYWN0b3I/OiBzdHJpbmc7XG4gIHByb2R1Y3RfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwYXJlbnRfcHJvZHVjdF9pZF9leHRyYWN0b3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVybFJlc29sdmVyUmVzcG9uc2Uge1xuICB2YXJpYW50X3R5cGU6IHN0cmluZztcbiAgc3BlY2lmaWNfZGV0YWlsczogVXJsUmVzb2x2aW5nUERQQ29uZmlnIHwgVXJsUmVzb2x2aW5nUExQQ29uZmlnIHwgVXJsUmVzb2x2aW5nR2VuZXJpY0NvbmZpZztcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHVzZXJfZXZlbnQ/OiB7XG4gICAgZXZlbnRfaWQ/OiBzdHJpbmc7XG4gICAgYXR0cmlidXRlcz86IFBEUEF0dHJpYnV0ZXMgfCBQTFBBdHRyaWJ1dGVzO1xuICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gIH07XG4gIHBhZ2VfdmFyaWFudD86IEJhY2tlbmRQYWdlVmFyaWFudENvbmZpZztcbn1cblxuLy8gVXNlIGEgbWFwIGZvciBwZXItVVJMIGNhY2hlXG5leHBvcnQgdHlwZSBVcmxSZXNvbHZlckNhY2hlID0gUmVjb3JkPHN0cmluZywgVXJsUmVzb2x2ZXJSZXNwb25zZSB8IHVuZGVmaW5lZD47XG5cbmNvbnN0IGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAnc3BpZmZ5LXVybC1yZXNvbHZlcicsXG4gIHVuZGVmaW5lZCxcbiAgc2Vzc2lvblN0b3JhZ2VVdGlsLFxuICB7XG4gICAgZ2V0T25Jbml0OiB0cnVlLFxuICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IHVybFJlc29sdmVyQXRvbSA9IGF0b20oXG4gIChnZXQpOiBVcmxSZXNvbHZlckNhY2hlID0+IHtcbiAgICBjb25zdCBtYXliZVVybFJlc29sdmVyID0gZ2V0KGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSk7XG4gICAgaWYgKG1heWJlVXJsUmVzb2x2ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShtYXliZVVybFJlc29sdmVyKTtcbiAgfSxcbiAgKGdldCwgc2V0LCB2YWx1ZTogeyB1cmw6IHN0cmluZzsgcmVzcG9uc2U6IFVybFJlc29sdmVyUmVzcG9uc2UgfCB1bmRlZmluZWQgfSkgPT4ge1xuICAgIC8vIEdldCBjdXJyZW50IGNhY2hlIGZyb20gc3RvcmFnZVxuICAgIGNvbnN0IGN1cnJlbnRDYWNoZSA9IGdldCh1cmxSZXNvbHZlckF0b20pO1xuICAgIGNvbnN0IG5ld0NhY2hlID0geyAuLi5jdXJyZW50Q2FjaGUsIFt2YWx1ZS51cmxdOiB2YWx1ZS5yZXNwb25zZSB9O1xuXG4gICAgc2V0KGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSwgSlNPTi5zdHJpbmdpZnkobmV3Q2FjaGUpKTtcbiAgfSxcbik7XG5cbmNvbnN0IGludGVybmFsU3RvcmFnZVN1cHBvcnRlZEV2ZW50QXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAnc3BpZmZ5LXN1cHBvcnRlZC1ldmVudCcsXG4gIHVuZGVmaW5lZCxcbiAgc2Vzc2lvblN0b3JhZ2VVdGlsLFxuICB7XG4gICAgZ2V0T25Jbml0OiB0cnVlLFxuICB9LFxuKTtcbmNvbnN0IGludGVybmFsU3VwcG9ydGVkRXZlbnRBdG9tID0gYXRvbTxTdXBwb3J0ZWRFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRlZEV2ZW50QXRvbSA9IGF0b20oXG4gIChnZXQpOiBTdXBwb3J0ZWRFdmVudCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgbWF5YmVTdXBwb3J0ZWRFdmVudCA9IGdldChpbnRlcm5hbFN0b3JhZ2VTdXBwb3J0ZWRFdmVudEF0b20pO1xuICAgIGlmIChtYXliZVN1cHBvcnRlZEV2ZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETyB0aGlzIGlzIGFuIHVudmFsaWRhdGVkIHBhcnNlLiBJdCBtYXkgYmUgYmV0dGVyIHRvIGltcGxlbWVudCBhIGN1c3RvbSBzdG9yYWdlIHV0aWxcbiAgICAvLyBhbmQgcGVyZm9ybSB0aGUgb2JqZWN0IHZhbGlkYXRpb24gb24gXCJnZXRcIiB0aGVyZS5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShtYXliZVN1cHBvcnRlZEV2ZW50KTtcbiAgfSxcbiAgKF8sIHNldCwgdmFsdWU6IFN1cHBvcnRlZEV2ZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHNldChpbnRlcm5hbFN0b3JhZ2VTdXBwb3J0ZWRFdmVudEF0b20sIHVuZGVmaW5lZCk7XG4gICAgICBzZXQoaW50ZXJuYWxTdXBwb3J0ZWRFdmVudEF0b20sIHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0KGludGVybmFsU3VwcG9ydGVkRXZlbnRBdG9tLCB2YWx1ZSk7XG4gICAgc2V0KGludGVybmFsU3RvcmFnZVN1cHBvcnRlZEV2ZW50QXRvbSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfSxcbik7XG5cbmNvbnN0IGludGVybmFsVmFyaWFudElkQXRvbSA9IGF0b208c3RyaW5nPigpO1xuY29uc3QgaW50ZXJuYWxQcm9kdWN0SWRBdG9tID0gYXRvbTxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcm5hbFBhcmVudFByb2R1Y3RJZEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUHJvZHVjdFVybEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUGxwSWRBdG9tID0gYXRvbTxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcm5hbFVybEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUGFnZVZpc2l0Q2F0ZWdvcnlBdG9tID0gYXRvbTxQYWdlVmlzaXRDYXRlZ29yeT4oKTtcbmNvbnN0IGludGVybmFsVmFyaWFudEF0b20gPSBhdG9tPCdwZHAnIHwgJ3BscCcgfCAnc2VhcmNoJyB8ICdwYWdlX3Zpc2l0Jz4oJ3BkcCcpO1xuXG5leHBvcnQgY29uc3QgdmFyaWFudElkQXRvbSA9IGF0b20oKGdldCkgPT4gZ2V0KGludGVybmFsVmFyaWFudElkQXRvbSkpO1xuZXhwb3J0IGNvbnN0IHByb2R1Y3RJZEF0b20gPSBhdG9tKChnZXQpID0+IGdldChpbnRlcm5hbFByb2R1Y3RJZEF0b20pKTtcbmV4cG9ydCBjb25zdCBwYXJlbnRQcm9kdWN0SWRBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQYXJlbnRQcm9kdWN0SWRBdG9tKSk7XG5leHBvcnQgY29uc3QgcHJvZHVjdFVybEF0b20gPSBhdG9tKChnZXQpID0+IGdldChpbnRlcm5hbFByb2R1Y3RVcmxBdG9tKSk7XG5leHBvcnQgY29uc3QgcGxwSWRBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQbHBJZEF0b20pKTtcbmV4cG9ydCBjb25zdCB1cmxBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxVcmxBdG9tKSk7XG5leHBvcnQgY29uc3QgcGFnZVZpc2l0Q2F0ZWdvcnlBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQYWdlVmlzaXRDYXRlZ29yeUF0b20pKTtcbmV4cG9ydCBjb25zdCB2YXJpYW50QXRvbSA9IGF0b20oKGdldCkgPT4gZ2V0KGludGVybmFsVmFyaWFudEF0b20pKTtcbmV4cG9ydCBjb25zdCBoYXNQYXJzZWRWYXJpYW50SW5mb0F0b20gPSBhdG9tKGZhbHNlKTtcblxuZXhwb3J0IGNvbnN0IHZhcmlhbnRJbmZvQXRvbSA9IGF0b20oXG4gIChnZXQpOiBWYXJpYW50SW5mbyA9PiB7XG4gICAgY29uc3QgdmFyaWFudCA9IGdldCh2YXJpYW50QXRvbSk7XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QZHApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBwcm9kdWN0SWQ6IGdldChwcm9kdWN0SWRBdG9tKSxcbiAgICAgICAgcGFyZW50UHJvZHVjdElkOiBnZXQocGFyZW50UHJvZHVjdElkQXRvbSksXG4gICAgICAgIHVybDogZ2V0KHVybEF0b20pLFxuICAgICAgfSBhcyBQRFBWYXJpYW50SW5mbztcbiAgICB9XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QbHApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBwbHBJZDogZ2V0KHBscElkQXRvbSksXG4gICAgICAgIHVybDogZ2V0KHVybEF0b20pLFxuICAgICAgfSBhcyBQTFBWYXJpYW50SW5mbztcbiAgICB9XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QYWdlVmlzaXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICB1cmw6IGdldCh1cmxBdG9tKSxcbiAgICAgICAgcGFnZVZpc2l0Q2F0ZWdvcnk6IGdldChwYWdlVmlzaXRDYXRlZ29yeUF0b20pLFxuICAgICAgfSBhcyBQYWdlVmlzaXRWYXJpYW50SW5mbztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhcmlhbnRJbmZvIGRldGFpbHMnKTtcbiAgfSxcbiAgKF8sIHNldCwgbmV3VmFyaWFudDogVmFyaWFudEluZm8pID0+IHtcbiAgICBzZXQoaW50ZXJuYWxWYXJpYW50QXRvbSwgbmV3VmFyaWFudC52YXJpYW50KTtcbiAgICBzZXQoaW50ZXJuYWxWYXJpYW50SWRBdG9tLCBuZXdWYXJpYW50LnZhcmlhbnRJZCk7XG4gICAgaWYgKG5ld1ZhcmlhbnQudmFyaWFudCA9PT0gVmFyaWFudFR5cGVFbnVtLlBkcCkge1xuICAgICAgc2V0KGludGVybmFsUHJvZHVjdElkQXRvbSwgbmV3VmFyaWFudC5wcm9kdWN0SWQpO1xuICAgICAgc2V0KGludGVybmFsUGFyZW50UHJvZHVjdElkQXRvbSwgbmV3VmFyaWFudC5wYXJlbnRQcm9kdWN0SWQpO1xuICAgICAgc2V0KGludGVybmFsVXJsQXRvbSwgbmV3VmFyaWFudC51cmwpO1xuICAgIH1cbiAgICBpZiAobmV3VmFyaWFudC52YXJpYW50ID09PSBWYXJpYW50VHlwZUVudW0uUGxwKSB7XG4gICAgICBzZXQoaW50ZXJuYWxQbHBJZEF0b20sIG5ld1ZhcmlhbnQucGxwSWQpO1xuICAgICAgc2V0KGludGVybmFsVXJsQXRvbSwgbmV3VmFyaWFudC51cmwpO1xuICAgIH1cbiAgICBpZiAobmV3VmFyaWFudC52YXJpYW50ID09PSBWYXJpYW50VHlwZUVudW0uUGFnZVZpc2l0KSB7XG4gICAgICBzZXQoaW50ZXJuYWxVcmxBdG9tLCBuZXdWYXJpYW50LnVybCk7XG4gICAgICBzZXQoaW50ZXJuYWxQYWdlVmlzaXRDYXRlZ29yeUF0b20sIG5ld1ZhcmlhbnQucGFnZVZpc2l0Q2F0ZWdvcnkpO1xuICAgIH1cbiAgfSxcbik7XG4iLCJpbXBvcnQge1xuICBDb250ZXh0RW52RW51bSxcbiAgQ29udGV4dFNvdXJjZUVudW0sXG59IGZyb20gXCJAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnRcIjtcbmltcG9ydCB7IGF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGF0b21XaXRoU3RvcmFnZSB9IGZyb20gXCJqb3RhaS91dGlsc1wiO1xuaW1wb3J0IHsgVmFyaWFudEluZm8gfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHsgVXNlcklkZW50aXR5Q29udGV4dFR5cGUsIHVzZVVzZXJJZGVudGl0eSB9IGZyb20gXCJzcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0XCI7XG5pbXBvcnQgeyB2YXJpYW50SW5mb0F0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcC92YXJpYW50XCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IGNvbnRleHRTb3VyY2VBdG9tIH0gZnJvbSBcIi4uL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBcHBEZXRhaWxzIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgb3JnU2hvcnROYW1lOiBzdHJpbmc7XG4gIGNoYXRJZDogc3RyaW5nO1xuICB1c2VySWQ6IHN0cmluZztcbiAgc291cmNlOiBDb250ZXh0U291cmNlRW51bTtcbiAgZW52OiBDb250ZXh0RW52RW51bTtcbiAgdmFyaWFudEluZm86IFZhcmlhbnRJbmZvO1xufVxuXG5leHBvcnQgeyB2YXJpYW50SW5mb0F0b20gfSBmcm9tIFwiLi92YXJpYW50XCI7XG5cbmNvbnN0IGludGVybmFsVXNlcklkQXRvbSA9IGF0b208c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3QgdXNlcklkQXRvbSA9IGF0b20oXG4gIChnZXQpID0+IHtcbiAgICBjb25zdCBtYXliZVVzZXJJZCA9IGdldChpbnRlcm5hbFVzZXJJZEF0b20pO1xuXG4gICAgaWYgKG1heWJlVXNlcklkKSB7XG4gICAgICByZXR1cm4gbWF5YmVVc2VySWQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBnZXRVc2VySWRPckRlZmF1bHQgfSA9IHVzZVVzZXJJZGVudGl0eSgpO1xuICAgIHJldHVybiBnZXRVc2VySWRPckRlZmF1bHQoKTtcbiAgfSxcbiAgKF8sIHNldCwgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIHNldChpbnRlcm5hbFVzZXJJZEF0b20sIHZhbHVlKTtcbiAgfVxuKTtcblxuZXhwb3J0IGNvbnN0IHVzZXJJZGVudGl0eUF0b20gPSBhdG9tPFVzZXJJZGVudGl0eUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkPihcbiAgdW5kZWZpbmVkXG4pO1xuXG5leHBvcnQgY29uc3QgYXBwU291cmNlQXRvbSA9IGF0b208Q29udGV4dFNvdXJjZUVudW0+KFxuICAoZ2V0KTogQ29udGV4dFNvdXJjZUVudW0gPT4gZ2V0KGNvbnRleHRTb3VyY2VBdG9tKSA/PyBDb250ZXh0U291cmNlRW51bS5BcHBcbik7XG5leHBvcnQgY29uc3QgY2hhdElkQXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmc+KFxuICBcInYxLXNwaWZmeS1jaGF0LXNlc3Npb24taWRcIixcbiAgdXVpZCgpLFxuICB1bmRlZmluZWQsXG4gIHtcbiAgICBnZXRPbkluaXQ6IHRydWUsXG4gIH1cbik7XG4iLCJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VBdG9tVmFsdWUgfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSBcIkBhbXBsaXR1ZGUvYW5hbHl0aWNzLWJyb3dzZXJcIjtcbmltcG9ydCB7IEZlYXR1cmVHYXRlcyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlc1wiO1xuaW1wb3J0IHsgT3JnU2hvcnROYW1lIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHNcIjtcbmltcG9ydCB7IEV2ZW50c0Rpc3BhdGNoZXIsIFNwaWZmeUV2ZW50IH0gZnJvbSBcInNyYy9ldmVudHNcIjtcbmltcG9ydCB7XG4gIGFtcGxpdHVkZUFwaUtleUF0b20sXG4gIGNvbnRleHRTb3VyY2VBdG9tLFxuICBkYXRhUmVzaWRlbmN5QXRvbSxcbiAgaWRlbnRpZnlpbmdQcmVmaXhBdG9tLFxufSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7XG4gIExvY2FsU3RvcmFnZUtleXMsXG4gIHVzZUxvY2FsU3RvcmFnZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9sb2NhbFN0b3JhZ2VDb250ZXh0XCI7XG5pbXBvcnQgeyBvcmdBbmFseXRpY3NHb29nbGVBbmFseXRpY3NDb25maWdBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmcvb3JnQW5hbHl0aWNzQ29uZmlnXCI7XG5pbXBvcnQgeyB1c2VySWRBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9hcHBcIjtcbmltcG9ydCB7IGVudkF0b20gfSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUge1xuICBCcm93c2VyQ2xpZW50LFxuICBFbnJpY2htZW50UGx1Z2luLFxuICBFdmVudCxcbiAgU2VydmVyWm9uZVR5cGUsXG59IGZyb20gXCJAYW1wbGl0dWRlL2FuYWx5dGljcy10eXBlc1wiO1xuaW1wb3J0IHsgdXNlRW52aXZlQ29uZmlnIH0gZnJvbSBcInNyYy9jb250ZXh0cy9lbnZpdmVDb25maWdDb250ZXh0L2Vudml2ZUNvbmZpZ0NvbnRleHRcIjtcbmltcG9ydCB7XG4gIHVzZUZlYXR1cmVGbGFnU2VydmljZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9mZWF0dXJlRmxhZ1NlcnZpY2VDb250ZXh0L2ZlYXR1cmVGbGFnU2VydmljZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZVVzZXJJZGVudGl0eSB9IGZyb20gXCJzcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0XCI7XG5cbmV4cG9ydCBlbnVtIFNwaWZmeU1ldHJpY3NFdmVudE5hbWUge1xuICBCdW5kbGVMb2FkZWQgPSBcIkJ1bmRsZSBMb2FkZWRcIixcbiAgQ2hhdExpdmVBZ2VudEJ0bkNsaWNrID0gXCJDaGF0IExpdmUgQWdlbnQgQnRuIENsaWNrXCIsXG4gIENoYXRGbG9hdGluZ0J1dHRvblZpc2libGUgPSBcIkNoYXQgRmxvYXRpbmcgQnV0dG9uIFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudFZpc2libGUgPSBcIkNoYXQgQ29tcG9uZW50IFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudEV4cGFuZGVkID0gXCJDaGF0IENvbXBvbmVudCBFeHBhbmRlZFwiLFxuICBDaGF0Q29tcG9uZW50Q29sbGFwc2VkID0gXCJDaGF0IENvbXBvbmVudCBDb2xsYXBzZWRcIixcbiAgQ2hhdFVzZXJNZXNzYWdlSW5wdXQgPSBcIkNoYXQgVXNlciBNZXNzYWdlIElucHV0XCIsXG4gIENoYXRTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiQ2hhdCBTdWdnZXN0aW9uIENsaWNrZWRcIixcbiAgQ2hhdEFzc2lzdGFudFJlc3BvbnNlID0gXCJDaGF0IEFzc2lzdGFudCBSZXNwb25zZVwiLFxuICBQcm9kdWN0Q2FyZENsaWNrZWQgPSBcIlByb2R1Y3QgQ2FyZCBDbGlja2VkXCIsXG4gIFByb2R1Y3RSZXZpZXdDYXJkQ2xpY2tlZCA9IFwiUHJvZHVjdCBSZXZpZXcgQ2FyZCBDbGlja2VkXCIsXG4gIEFkZFRvQ2FydENsaWNrZWQgPSBcIkFkZCB0byBDYXJ0IENsaWNrZWRcIixcbiAgUHJvbXB0Q2FyZENsaWNrZWQgPSBcIlByb21wdCBDYXJkIENsaWNrZWRcIixcbiAgU3VwcG9ydGVkRXZlbnQgPSBcIlN1cHBvcnRlZCBFdmVudFwiLFxuICBTZWFyY2hCYWNrVG9SZXNwb25zZUNsaWNrZWQgPSBcIlNlYXJjaCBCYWNrIHRvIFJlc3BvbnNlIENsaWNrZWRcIixcbiAgUGVyZm9ybWFuY2VNZXRyaWNzID0gXCJQZXJmb3JtYW5jZSBNZXRyaWNzXCIsXG4gIFNlYXJjaEJhckNsaWNrZWQgPSBcIlNlYXJjaCBCYXIgQ2xpY2tlZFwiLFxuICBPcmRlckxvb2t1cFN0YXJ0ZWQgPSBcIk9yZGVyIExvb2t1cCBTdGFydGVkXCIsXG4gIE9yZGVyTG9va3VwRm9ybVN1Ym1pdHRlZCA9IFwiT3JkZXIgTG9va3VwIEZvcm0gU3VibWl0dGVkXCIsXG4gIFNlYXJjaENvbXBvbmVudFZpc2libGUgPSBcIlNlYXJjaCBDb21wb25lbnQgVmlzaWJsZVwiLFxuICBTZWFyY2haZXJvU3RhdGVTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiU2VhcmNoIFplcm8gU3RhdGUgU3VnZ2VzdGlvbiBDbGlja2VkXCIsIC8vIFRoaXMgaXMgdGhlIHNjcm9sbGluZyBsaXN0IG9mIHN1Z2dlc3Rpb24gYnV0dG9ucyBpbiBnbG9iYWwgc2VhcmNoXG4gIFNlYXJjaElucHV0U3RhcnRlZCA9IFwiU2VhcmNoIElucHV0IFN0YXJ0ZWRcIixcbiAgU2VhcmNoUXVlcnlTdWJtaXR0ZWQgPSBcIlNlYXJjaCBRdWVyeSBTdWJtaXR0ZWRcIixcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlVmlld2VkID0gJ1NlYXJjaCBBdXRvY29tcGxldGUgVmlld2VkJywgLy8gVE9ETzogYWRkIHRoaXMgd2hlbiBhdXRvY29tcGxldGUgaXMgYWRkZWRcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlQ2xpY2tlZCA9ICdTZWFyY2ggQXV0b2NvbXBsZXRlIENsaWNrZWQnLCAvLyBUT0RPOiBhZGQgdGhpcyB3aGVuIGF1dG9jb21wbGV0ZSBpcyBhZGRlZFxuICBTZWFyY2hSZXN1bHRzVmlld2VkID0gXCJTZWFyY2ggUmVzdWx0cyBWaWV3ZWRcIixcbiAgU2VhcmNoVGltZVRvRmlyc3RDbGljayA9IFwiU2VhcmNoIFRpbWUgdG8gRmlyc3QgQ2xpY2tcIixcbiAgU2VhcmNoWmVyb1Jlc3VsdHNSYXRlID0gXCJTZWFyY2ggWmVybyBSZXN1bHRzIFJhdGVcIixcbiAgU2VhcmNoRmlsdGVyQ2xpY2tlZCA9IFwiU2VhcmNoIEZpbHRlciBDbGlja2VkXCIsXG4gIFNlYXJjaFNvcnRDbGlja2VkID0gXCJTZWFyY2ggU29ydCBDbGlja2VkXCIsXG59XG5cbmludGVyZmFjZSBUcmFja0V2ZW50UGFyYW1zIHtcbiAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lO1xuICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV2ZW50R3JvdXBzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGFsc29TZW5kVG9Hb29nbGVBbmFseXRpY3M/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQW1wbGl0dWRlQ29udGV4dFR5cGUge1xuICB0cmFja0V2ZW50OiAocGFyYW1zOiBUcmFja0V2ZW50UGFyYW1zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBpc1JlYWR5OiBib29sZWFuO1xuICBzZXRTdXBwbGVtZW50YWxEZWZhdWx0UHJvcHM6IChwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEFtcGxpdHVkZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEFtcGxpdHVkZUNvbnRleHRUeXBlIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBjb25zdCBBbXBsaXR1ZGVQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+ID0gKHtcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IHVzZXJJZCA9IHVzZUF0b21WYWx1ZSh1c2VySWRBdG9tKTtcbiAgY29uc3QgYW1wbGl0dWRlQXBpS2V5ID0gdXNlQXRvbVZhbHVlKGFtcGxpdHVkZUFwaUtleUF0b20pO1xuICBjb25zdCBkYXRhUmVzaWRlbmN5ID0gdXNlQXRvbVZhbHVlKGRhdGFSZXNpZGVuY3lBdG9tKTtcbiAgY29uc3Qgb3JnR2FDb25maWcgPSB1c2VBdG9tVmFsdWUob3JnQW5hbHl0aWNzR29vZ2xlQW5hbHl0aWNzQ29uZmlnQXRvbSk7XG4gIGNvbnN0IGVudiA9IHVzZUF0b21WYWx1ZShlbnZBdG9tKTtcbiAgY29uc3QgY29udGV4dFNvdXJjZSA9IHVzZUF0b21WYWx1ZShjb250ZXh0U291cmNlQXRvbSk7XG4gIGNvbnN0IGlkZW50aWZ5aW5nUHJlZml4ID0gdXNlQXRvbVZhbHVlKGlkZW50aWZ5aW5nUHJlZml4QXRvbSk7XG4gIGNvbnN0IHsgZ2V0SXRlbSB9ID0gdXNlTG9jYWxTdG9yYWdlKCk7XG4gIGNvbnN0IHtcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICBmZWF0dXJlR2F0ZXMsXG4gIH0gPSB1c2VFbnZpdmVDb25maWcoKTtcblxuICBjb25zdCB7IGZlYXR1cmVGbGFnU2VydmljZSB9ID0gdXNlRmVhdHVyZUZsYWdTZXJ2aWNlKCk7XG5cbiAgY29uc3QgW2FtcGxpdHVkZUNsaWVudCwgc2V0QW1wbGl0dWRlQ2xpZW50XSA9IFJlYWN0LnVzZVN0YXRlPFxuICAgIEJyb3dzZXJDbGllbnQgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCwgc2V0SW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudF0gPVxuICAgIFJlYWN0LnVzZVN0YXRlPEVucmljaG1lbnRQbHVnaW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFtzdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wc10gPVxuICAgIFJlYWN0LnVzZVN0YXRlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSk7XG5cbiAgY29uc3QgaXNSZWFkeSA9IEJvb2xlYW4oXG4gICAgdXNlcklkICYmIGZlYXR1cmVGbGFnU2VydmljZSAmJiBhbXBsaXR1ZGVBcGlLZXkgJiYgdXNlcklkXG4gICk7XG5cbiAgY29uc3QgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMgPSB1c2VDYWxsYmFjaygoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IGdhdGVzUHJvcHMgPSBmZWF0dXJlR2F0ZXNcbiAgICAgID8gZmVhdHVyZUdhdGVzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgIGlmIChjdXJyLm5hbWUgJiYgY3Vyci52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIFtgZmVhdHVyZV9nYXRlLiR7Y3Vyci5uYW1lfWBdOiBjdXJyLnZhbHVlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiB7fTtcbiAgICBjb25zdCBleHBlcmltZW50UHJvcHMgPSB7fTsgLy8gTm8gZGlyZWN0IGVxdWl2YWxlbnQgZm9yIGV4cGVyaW1lbnRzIGluIEVudml2ZUNvbmZpZyB5ZXRcblxuICAgIGNvbnN0IG9yZ0xldmVsQW1wbGl0dWRlVHJhY2tpbmdQcm9wcyA9IHtcbiAgICAgIC4uLmdhdGVzUHJvcHMsXG4gICAgICAuLi5leHBlcmltZW50UHJvcHMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5vcmdMZXZlbEFtcGxpdHVkZVRyYWNraW5nUHJvcHMsXG4gICAgICAuLi5zdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsXG4gICAgICAvLyBUT0RPOiBvcmdfaWQgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSBpbiBFbnZpdmVDb25maWcuIE5lZWQgdG8gZmluZCBhIG5ldyBzb3VyY2Ugb3IgZGVyaXZlIGl0LlxuICAgICAgLy8gb3JnX2lkOiBvcmdDb25maWc/Lm9yZz8ub3JnPy5pZCxcbiAgICAgIGFwcF9pZDogXCJjb21tZXJjZS1jaGF0LXJlYWN0LWNvbXBvbmVudFwiLFxuICAgICAgY2hhdF9pZDogZ2V0SXRlbShMb2NhbFN0b3JhZ2VLZXlzLkNoYXRJZCksXG4gICAgICBlbnY6IGVudiB8fCBcInVua25vd25cIixcbiAgICAgIGFwcF9zb3VyY2U6IGNvbnRleHRTb3VyY2UsXG4gICAgICBcIm9yZy5zaG9ydF9uYW1lXCI6IG9yZ1Nob3J0TmFtZSxcbiAgICAgIFwidXNlci5pZFwiOiB1c2VySWQsXG4gICAgICBcImNkcC51c2VyX2lkXCI6IG51bGwsXG4gICAgICBcImNkcC5wcm92aWRlclwiOiBudWxsLFxuICAgICAgXCJldmVudC5zb3VyY2VcIjogXCJ3ZWItYnJvd3NlclwiLFxuICAgICAgXCJldmVudC50eXBlXCI6IFwidXNlci1hY3Rpdml0eVwiLFxuICAgICAgXCJldmVudC5pZFwiOiBudWxsLFxuICAgICAgXCJldmVudC5jaGFubmVsXCI6IFwid2ViXCIsXG4gICAgICBcImV2ZW50LnRpbWVzdGFtcFwiOiBudWxsLFxuICAgIH07XG4gIH0sIFtcbiAgICBmZWF0dXJlR2F0ZXMsXG4gICAgc3VwcGxlbWVudGFsRGVmYXVsdFByb3BzLFxuICAgIGVudixcbiAgICBjb250ZXh0U291cmNlLFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICB1c2VySWQsXG4gIF0pO1xuXG4gIGNvbnN0IGV2ZW50UHJvcHNUb1ByZWZpeGVkRXZlbnRQcm9wcyA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICAgIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgY29uc3QgcHJlZml4ID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIl9cIik7XG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZXZlbnRQcm9wcykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBhY2NbYCR7cHJlZml4fS4ke2tleX1gXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCA9IHVzZUNhbGxiYWNrKCgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBpc0VuYWJsZWQgPSBCb29sZWFuKFxuICAgICAgb3JnU2hvcnROYW1lID09PSBPcmdTaG9ydE5hbWUuVW5pcXVlVmludGFnZSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzQ2xpZW50U2Vzc2lvbkVuYWJsZWQoKSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzRmVhdHVyZUdhdGVFbmFibGVkKFxuICAgICAgICAgIEZlYXR1cmVHYXRlcy5Jc05ld0ZlYXR1cmVFbmFibGVkXG4gICAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHNhbXBsZVJhdGUgPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICAgYFtzcGlmZnktYWldIGFtcGxpdHVkZSBzZXNzaW9uLXJlcGxheSBpbml0aWFsaXppbmcgaXNFbmFibGVkPSR7aXNFbmFibGVkfSBzYW1wbGVSYXRlPSR7c2FtcGxlUmF0ZX1gXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBhbXBsaXR1ZGVJbnN0YW5jZS5hZGQoc2Vzc2lvblJlcGxheVBsdWdpbih7IHNhbXBsZVJhdGUgfSkpO1xuXG4gICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgXCJbc3BpZmZ5LWFpXSBFcnJvciBpbml0aWFsaXppbmcgYW1wbGl0dWRlIHNlc3Npb24tcmVwbGF5XCIsXG4gICAgICAgIGVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBbb3JnU2hvcnROYW1lLCBmZWF0dXJlRmxhZ1NlcnZpY2VdKTtcblxuICBjb25zdCBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCA9IHVzZUNhbGxiYWNrKCgpOiBFbnJpY2htZW50UGx1Z2luID0+IHtcbiAgICBpZiAoaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbnJpY2htZW50OiBFbnJpY2htZW50UGx1Z2luID0ge1xuICAgICAgbmFtZTogXCJwYWdlLXZpZXctdHJhY2tpbmctZW5yaWNobWVudFwiLFxuICAgICAgdHlwZTogXCJlbnJpY2htZW50XCIsXG4gICAgICBzZXR1cDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGV2ZW50OiBFdmVudCk6IFByb21pc2U8RXZlbnQ+ID0+IHtcbiAgICAgICAgbGV0IGVucmljaGVkRXZlbnQ6IEV2ZW50O1xuXG4gICAgICAgIGNvbnN0IGV2ZW50c1RvRW5yaWNoID0gW1xuICAgICAgICAgIFwiW0FtcGxpdHVkZV0gUGFnZSBWaWV3ZWRcIixcbiAgICAgICAgICBgW1NwaWZmeV0gJHtTcGlmZnlNZXRyaWNzRXZlbnROYW1lLkJ1bmRsZUxvYWRlZH1gLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChldmVudHNUb0VucmljaC5pbmNsdWRlcyhldmVudC5ldmVudF90eXBlKSkge1xuICAgICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgIGlmIChwdWJsaWNLZXkpIHtcbiAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXNbXCJnbG9iYWxQcm9wZXJ0aWVzLnB1YmxpY0tleVwiXSA9IHB1YmxpY0tleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVPdmVycmlkZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW2BnbG9iYWxQcm9wZXJ0aWVzLmZlYXR1cmVPdmVycmlkZXMuJHtrZXl9YF0gPVxuICAgICAgICAgICAgICAgIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhbnRVcmxPdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudFVybE92ZXJyaWRlXCJdID1cbiAgICAgICAgICAgICAgdmFyaWFudFVybE92ZXJyaWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFudEluZm9PdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudEluZm9PdmVycmlkZVwiXSA9XG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhcmlhbnRJbmZvT3ZlcnJpZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW1wiZ2xvYmFsUHJvcGVydGllcy5zaG93XCJdID0gU3RyaW5nKHNob3cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVuYWJsZWRGZWF0dXJlcyA9IGZlYXR1cmVGbGFnU2VydmljZSEuZ2V0RmVhdHVyZUZsYWdzKCk7XG4gICAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzUHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgZW5hYmxlZEZlYXR1cmVzXG4gICAgICAgICAgKS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gICAgICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgICAgW2BlbmFibGVkRmVhdHVyZXMuJHtrZXl9YF06IGAke3ZhbHVlfWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHRpbWluZ1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBcInRpbWluZy5lbnJpY2hlZF9hdF9tc1wiOiB3aW5kb3cucGVyZm9ybWFuY2U/Lm5vdygpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBlbnJpY2hlZEV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICBldmVudF9wcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIC4uLmV2ZW50LmV2ZW50X3Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAgIC4uLmdsb2JhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmVuYWJsZWRGZWF0dXJlc1Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLnRpbWluZ1Byb3BlcnRpZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5yaWNoZWRFdmVudCA9IGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgRXZlbnRzRGlzcGF0Y2hlci5kaXNwYXRjaChTcGlmZnlFdmVudC5BTVBMSVRVREVfRVZFTlQsIGVucmljaGVkRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiBlbnJpY2hlZEV2ZW50O1xuICAgICAgfSxcbiAgICB9O1xuICAgIHNldEludGVybmFsRXZlbnRUcmFja2luZ0VucmljaG1lbnQoZW5yaWNobWVudCk7XG4gICAgcmV0dXJuIGVucmljaG1lbnQ7XG4gIH0sIFtcbiAgICBpbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50LFxuICAgIGdldERlZmF1bHRUcmFja2luZ1Byb3BzLFxuICAgIGZlYXR1cmVGbGFnU2VydmljZSxcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc1JlYWR5ICYmICFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZTogQnJvd3NlckNsaWVudCA9IGNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICBjb25zdCBpc1Nlc3Npb25zRW5hYmxlZCA9IGFtcGxpdHVkZVNlc3Npb25SZXBsYXlJbml0KCk7XG4gICAgICBjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UuYWRkKGdldEV2ZW50VHJhY2tpbmdFbnJpY2htZW50KCkpO1xuICAgICAgY3VycmVudEFtcGxpdHVkZUluc3RhbmNlLmluaXQoYW1wbGl0dWRlQXBpS2V5ISwgdXNlcklkISwge1xuICAgICAgICBzZXJ2ZXJab25lOiBkYXRhUmVzaWRlbmN5IGFzIFNlcnZlclpvbmVUeXBlLFxuICAgICAgICB0cmFja2luZ09wdGlvbnM6IHtcbiAgICAgICAgICBpcEFkZHJlc3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9jYXB0dXJlOiB7XG4gICAgICAgICAgYXR0cmlidXRpb246IHRydWUsXG4gICAgICAgICAgcGFnZVZpZXdzOiB7XG4gICAgICAgICAgICB0cmFja0hpc3RvcnlDaGFuZ2VzOiBcInBhdGhPbmx5XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uczogaXNTZXNzaW9uc0VuYWJsZWQsXG4gICAgICAgICAgZm9ybUludGVyYWN0aW9uczogZmFsc2UsXG4gICAgICAgICAgZmlsZURvd25sb2FkczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHNldEFtcGxpdHVkZUNsaWVudChjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UpO1xuICAgIH1cbiAgfSwgW1xuICAgIGlzUmVhZHksXG4gICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgIGFtcGxpdHVkZUFwaUtleSxcbiAgICB1c2VySWQsXG4gICAgZGF0YVJlc2lkZW5jeSxcbiAgICBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCxcbiAgICBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCxcbiAgXSk7XG5cbiAgY29uc3QgdHJhY2tFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7XG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudFByb3BzLFxuICAgICAgZXZlbnRHcm91cHMsXG4gICAgICBhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzID0gZmFsc2UsXG4gICAgfTogVHJhY2tFdmVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiU3VibWl0dGluZyBldmVudFwiLCBldmVudE5hbWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkRXZlbnROYW1lID0gYFtTcGlmZnldICR7ZXZlbnROYW1lfWA7XG5cbiAgICAgICAgaWYgKCFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybihcImFtcGxpdHVkZSBjbGllbnQgdW5kZWZpbmVkXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudE5hbWUsXG4gICAgICAgICAgZXZlbnRQcm9wcyxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShldmVudERhdGEpO1xuICAgICAgICAgLy8gY2FsY3VsYXRlIGEgaGFzaCBvZiB0aGUgZXZlbnQgcHJvcGVydGllcyB0byB1c2UgYXMgdGhlIGluc2VydF9pZCBzbyB0aGF0IGR1cGxpY2F0ZSBldmVudHNcbiAgICAgICAgLy8gYXJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBieSBBbXBsaXR1ZGVcbiAgICAgICAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTI1NlwiLCBkYXRhKTtcbiAgICAgICAgY29uc3QgaGFzaEFycmF5ID0gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShoYXNoQnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbnNlcnRJZCA9IGhhc2hBcnJheVxuICAgICAgICAgIC5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICBMb2dnZXIubG9nRGVidWcoYGFtcGxpdHVkZSB0cmFja2luZyAke2RlY29yYXRlZEV2ZW50TmFtZX1gLCBudWxsLCB7XG4gICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHByb3BzOiBldmVudFByb3BzLFxuICAgICAgICB9KTtcblxuICAgICAgICBhbXBsaXR1ZGVDbGllbnQudHJhY2soXG4gICAgICAgICAgZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAuLi5ldmVudFByb3BzLFxuICAgICAgICAgICAgLi4uKGV2ZW50UHJvcHNcbiAgICAgICAgICAgICAgPyBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMoZXZlbnROYW1lLCBldmVudFByb3BzKVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmV2ZW50R3JvdXBzLFxuICAgICAgICAgICAgaW5zZXJ0X2lkOiBjdXJyZW50SW5zZXJ0SWQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzICYmIG9yZ0dhQ29uZmlnKSB7XG4gICAgICAgICAgLy8gVE9ETzogQWRkIGluIHdpbmRvd0RhdGFMYXllclNlcnZpY2Ugb3IgY29udGV4dCBhbHRlcm5hdGl2ZSBhbmQgaG9vayBpdCB1cCBoZXJlXG4gICAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiW3NwaWZmeS1haV0gR0EgdHJhY2tpbmdcIiwgZGVjb3JhdGVkRXZlbnROYW1lKTtcbiAgICAgICAgICBpZiAod2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgKHdpbmRvdy5kYXRhTGF5ZXIgYXMgYW55W10pLnB1c2goe1xuICAgICAgICAgICAgICBldmVudDogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFByb3BzOiBldmVudFByb3BzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiW3NwaWZmeS1haV0gRXJyb3IgdHJhY2tpbmcgZXZlbnRcIiwgZXJyLCB7XG4gICAgICAgICAgZXZlbnROYW1lLFxuICAgICAgICAgIGV2ZW50UHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgICAgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMsXG4gICAgICBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMsXG4gICAgICBvcmdHYUNvbmZpZyxcbiAgICBdXG4gICk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICB0cmFja0V2ZW50LFxuICAgICAgaXNSZWFkeSxcbiAgICAgIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wczogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT5cbiAgICAgICAgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzKHByb3BzKSxcbiAgICB9KSxcbiAgICBbdHJhY2tFdmVudCwgaXNSZWFkeSwgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEFtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0FtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQW1wbGl0dWRlID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBbXBsaXR1ZGVDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlQW1wbGl0dWRlIG11c3QgYmUgdXNlZCB3aXRoaW4gQW1wbGl0dWRlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQsXG4gIGlzR0E0RWNvbW1lcmNlRXZlbnQsXG4gIGlzQmFzZUVjb21tZXJjZUV2ZW50LFxuICBCYXNlRWNvbW1lcmNlRXZlbnQsXG59IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzXCI7XG5pbXBvcnQgeyBTcGlmZnlNZXRyaWNzRXZlbnROYW1lIH0gZnJvbSBcInNyYy9jb250ZXh0cy9hbXBsaXR1ZGVDb250ZXh0L2FtcGxpdHVkZUNvbnRleHRcIjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBkYXRhTGF5ZXI6IGFueVtdO1xuICB9XG59XG5cbmNvbnN0IE5PUk1BTElaRURfQUREX1RPX0NBUlRfRVZFTlRfTkFNRVMgPSBbXCJhZGR0b2NhcnRcIiwgXCJhZGRlZHRvY2FydFwiXTtcbmNvbnN0IENIRUNLX0RBVEFfTEFZRVJfSU5URVJWQUxfTVMgPSA1MDA7XG5jb25zdCBDSEVDS19EQVRBX0xBWUVSX01BWF9BVFRFTVBUUyA9IDEwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIEdvb2dsZSBBbmFseXRpY3MgZXZlbnQgaXMgYW4gYWRkX3RvX2NhcnQgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBuYW1lIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGFuIGFkZF90b19jYXJ0IGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmNvbnN0IGlzQWRkVG9DYXJ0RXZlbnQgPSAoZXZlbnQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkRXZlbnQgPSBldmVudC5yZXBsYWNlKC9bLV9dL2csIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBOT1JNQUxJWkVEX0FERF9UT19DQVJUX0VWRU5UX05BTUVTLnNvbWUoKG5hbWUpID0+XG4gICAgbm9ybWFsaXplZEV2ZW50LmluY2x1ZGVzKG5hbWUpXG4gICk7XG59O1xuXG4vKipcbiAqIFRyYWNrcyBhbiBhZGRfdG9fY2FydCBldmVudCBpbiBBbXBsaXR1ZGUuXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byB0cmFjay5cbiAqL1xuY29uc3QgaGFuZGxlQWRkVG9DYXJ0RXZlbnQgPSAoXG4gIGV2ZW50OiBCYXNlRWNvbW1lcmNlRXZlbnQsXG4gIHRyYWNrOiAoXG4gICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IHZvaWRcbikgPT4ge1xuICBsZXQgZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaWYgKGlzTGVnYWN5VUFFY29tbWVyY2VFdmVudChldmVudCkpIHtcbiAgICBldmVudFByb3BzID0ge1xuICAgICAgaXRlbXM6IGV2ZW50LmVjb21tZXJjZS5hZGQucHJvZHVjdHMubWFwKChwcm9kdWN0KSA9PiAoe1xuICAgICAgICBpdGVtX25hbWU6IHByb2R1Y3QubmFtZSxcbiAgICAgICAgaXRlbV9jYXRlZ29yeTogcHJvZHVjdC5jYXRlZ29yeSxcbiAgICAgICAgcHJpY2U6IHByb2R1Y3QucHJpY2UsXG4gICAgICAgIHF1YW50aXR5OiBwcm9kdWN0LnF1YW50aXR5LFxuICAgICAgfSkpLFxuICAgICAgY3VycmVuY3k6IGV2ZW50LmVjb21tZXJjZS5hZGQuY3VycmVuY3lDb2RlLFxuICAgICAgZXZlbnRfZm9ybWF0X3ZlcnNpb246IFwibGVnYWN5X3VuaXZlcnNhbF9hbmFseXRpY3NcIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzR0E0RWNvbW1lcmNlRXZlbnQoZXZlbnQpKSB7XG4gICAgZXZlbnRQcm9wcyA9IHtcbiAgICAgIGl0ZW1zOiBldmVudC5lY29tbWVyY2UuaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBpdGVtX25hbWU6IGl0ZW0uaXRlbV9uYW1lLFxuICAgICAgICBpdGVtX2NhdGVnb3J5OiBpdGVtLml0ZW1fY2F0ZWdvcnksXG4gICAgICAgIHByaWNlOiBpdGVtLnByaWNlLFxuICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eSxcbiAgICAgIH0pKSxcbiAgICAgIGN1cnJlbmN5OiBldmVudC5lY29tbWVyY2UuY3VycmVuY3ksXG4gICAgICBldmVudF9mb3JtYXRfdmVyc2lvbjogXCJnb29nbGVfYW5hbHl0aWNzXzRcIixcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGV2ZW50UHJvcHMgPSB7XG4gICAgICBldmVudF9wcm9wZXJ0aWVzOiB7IC4uLmV2ZW50IH0sXG4gICAgICBldmVudF9mb3JtYXRfdmVyc2lvbjogXCJ1bmtub3duXCIsXG4gICAgfTtcbiAgfVxuXG4gIHRyYWNrKFNwaWZmeU1ldHJpY3NFdmVudE5hbWUuQWRkVG9DYXJ0Q2xpY2tlZCwge1xuICAgIGV2ZW50UHJvcHMsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgd2luZG93LmRhdGFMYXllci5wdXNoIG1ldGhvZCB0byBpbnRlcmNlcHQgYWRkX3RvX2NhcnQgZXZlbnRzIGFuZCBzZW5kIHRoZW0gdG8gQW1wbGl0dWRlLlxuICogVGhpcyBmdW5jdGlvbiBydW5zIG9uIGFuIGludGVydmFsIHVudGlsIHRoZSBkYXRhTGF5ZXIgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgY29uc3QgaW5pdERhdGFMYXllcldyYXBwZXIgPSAoXG4gIHRyYWNrOiAoXG4gICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IHZvaWRcbikgPT4ge1xuICBsZXQgYXR0ZW1wdHMgPSAwO1xuXG4gIC8vIGN1cnJlbnRseSwgb3VyIGJ1bmRsZSBpcyBhbHdheXMgbG9hZGVkIGFmdGVyIEdUTSBoYXMgaW5pdGlhbGl6ZWQgR0EvZGF0YUxheWVyXG4gIC8vIHdlJ2xsIG5lZWQgdGhpcyBjaGVjayBoZXJlIGlmL3doZW4gd2UgbG9hZCBzcGlmZnkgYmVmb3JlL291dHNpZGUgb2YgR1RNXG4gIGNvbnN0IGNoZWNrQW5kSW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5kYXRhTGF5ZXIgfHwgISh3aW5kb3cuZGF0YUxheWVyIGFzIGFueSkucHVzaCkge1xuICAgICAgYXR0ZW1wdHMgKz0gMTtcblxuICAgICAgaWYgKGF0dGVtcHRzID49IENIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTKSB7XG4gICAgICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICAgICBgW3NwaWZmeS1haV0gZGF0YUxheWVyIG5vdCBhdmFpbGFibGUgYWZ0ZXIgJHtDSEVDS19EQVRBX0xBWUVSX01BWF9BVFRFTVBUU30gYXR0ZW1wdHNgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dChjaGVja0FuZEluaXRpYWxpemUsIENIRUNLX0RBVEFfTEFZRVJfSU5URVJWQUxfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgIFwiW3NwaWZmeS1haV0gZGF0YUxheWVyIGlzIGF2YWlsYWJsZSwgd3JhcHBpbmcgcHVzaCBmdW5jdGlvbi4uLlwiXG4gICAgKTtcbiAgICBjb25zdCBvcmlnaW5hbFB1c2ggPSB3aW5kb3cuZGF0YUxheWVyLnB1c2g7XG4gICAgd2luZG93LmRhdGFMYXllci5wdXNoID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc0Jhc2VFY29tbWVyY2VFdmVudChhcmdzWzBdKSAmJlxuICAgICAgICBpc0FkZFRvQ2FydEV2ZW50KChhcmdzWzBdIGFzIGFueSkuZXZlbnQpXG4gICAgICApIHtcbiAgICAgICAgaGFuZGxlQWRkVG9DYXJ0RXZlbnQoYXJnc1swXSBhcyBCYXNlRWNvbW1lcmNlRXZlbnQsIHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgLy8gSU1QT1JUQU5UOiBjYWxsIHRoZSBvcmlnaW5hbCBwdXNoIG1ldGhvZCBzbyB0aGF0IHRoZSBldmVudCBpcyBzdGlsbCBsb2dnZWQgdG8gR0FcbiAgICAgIHJldHVybiBvcmlnaW5hbFB1c2guYXBwbHkod2luZG93LmRhdGFMYXllciwgYXJncyk7XG4gICAgfTtcbiAgfTtcblxuICBjaGVja0FuZEluaXRpYWxpemUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbml0QW1wbGl0dWRlID0gKFxuICB0cmFjazogKFxuICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSA9PiB2b2lkXG4pID0+IHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBtaWdodCBub3QgYmUgbmVlZGVkIGFueW1vcmUgaWYgQW1wbGl0dWRlIGlzIGluaXRpYWxpemVkIHZpYSBjb250ZXh0LlxuICAvLyBGb3Igbm93LCB3ZSdsbCBrZWVwIGl0IGFuZCBwYXNzIHRoZSB0cmFjayBmdW5jdGlvbi5cbiAgLy8gSWYgaXQncyB0cnVseSByZWR1bmRhbnQsIGl0IGNhbiBiZSByZW1vdmVkIGxhdGVyLlxuICB0cmFjayhTcGlmZnlNZXRyaWNzRXZlbnROYW1lLkJ1bmRsZUxvYWRlZCk7IC8vIEV4YW1wbGUgdXNhZ2UsIGFkanVzdCBhcyBuZWVkZWRcbn07XG4iLCJleHBvcnQgY29uc3QgZGl2aWRlQXJyYXkgPSA8VD4oYXJyYXk6IFRbXSwgc2l6ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHJvd3MgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICByb3dzLnB1c2goYXJyYXkuZmlsdGVyKChfOiBULCBpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIHNpemUgPT09IGkpKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn07XG4iLCJpbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlVHlwZSwgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgZ2V0UmVjZW50UHJvZHVjdEltYWdlVXJscyA9IChsYXN0TWVzc2FnZXM6IE1lc3NhZ2VbXSwgY3VycmVudFByb2R1Y3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHByb2R1Y3RNZXNzYWdlcyA9IGxhc3RNZXNzYWdlc1xuICAgIC5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UudHlwZSA9PT0gTWVzc2FnZVR5cGUuUHJvZHVjdCAmJiBtZXNzYWdlLm1ldGFkYXRhPy5pbWFnZVVybClcbiAgICAubWFwKChtKSA9PiBtIGFzIFByb2R1Y3RNZXNzYWdlTWV0YWRhdGEpO1xuICAvLyBwdXQgYWRkZWQgcHJvZHVjdCBpbWFnZSBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0XG4gIHJldHVybiBbXG4gICAgLi4ucHJvZHVjdE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5tZXRhZGF0YT8uaWQgPT09IGN1cnJlbnRQcm9kdWN0SWQpLFxuICAgIC4uLnByb2R1Y3RNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0ubWV0YWRhdGE/LmlkICE9PSBjdXJyZW50UHJvZHVjdElkKSxcbiAgXS5tYXAoKG0pID0+IG0ubWV0YWRhdGEhLmltYWdlVXJsISk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IHByZXBhcmVNZXJjaGFudFBhZ2UgPSAoKSA9PiB7XG4gIGxldCBtZXRhVmlld3BvcnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSd2aWV3cG9ydCddXCIpO1xuICBpZiAobWV0YVZpZXdwb3J0KSB7XG4gICAgY29uc3QgY29udGVudCA9IG1ldGFWaWV3cG9ydC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgY29uc3QgaGFzTWF4aW11bVNjYWxlID0gY29udGVudD8uaW5jbHVkZXMoXCJtYXhpbXVtLXNjYWxlPTFcIilcbiAgICBpZiAoIWhhc01heGltdW1TY2FsZSkge1xuICAgICAgbWV0YVZpZXdwb3J0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgYCR7Y29udGVudH0sIG1heGltdW0tc2NhbGU9MWApXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgbWV0YVZpZXdwb3J0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm1ldGFcIik7XG4gIG1ldGFWaWV3cG9ydC5zZXRBdHRyaWJ1dGUoXCJuYW1lXCIsIFwidmlld3BvcnRcIilcbiAgbWV0YVZpZXdwb3J0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgXCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgbWF4aW11bS1zY2FsZT0xXCIpXG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobWV0YVZpZXdwb3J0KTtcbn1cbiIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VSb2xlLCBNZXNzYWdlVHlwZSwgVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIHF1ZXJ5IFVzZXJFdmVudCBvYmplY3QgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IGZvciBwcmVzZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSB1c2VyIGV2ZW50IG9iamVjdCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgcXVlcnkgZXZlbnQsIG90aGVyd2lzZSB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2VGcm9tUXVlcnlFdmVudCA9IChldmVudDogVXNlckV2ZW50KTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5RdWVyeVR5cGVkLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBjb250ZW50OiBldmVudC5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBzZWFyY2hUZXJtOiBldmVudC5hdHRyaWJ1dGVzLnNlYXJjaFRlcm0gfHwgJycsXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyczogZXZlbnQuYXR0cmlidXRlcy5zZWxlY3RlZEZpbHRlcnMgfHwgW10sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IFJlc3BvbnNlQ2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVJvbGUsIE1lc3NhZ2VUeXBlLCBSZXNwb25zZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBzZXJ2ZXIgUmVzcG9uc2Ugb2JqZWN0IGludG8gYSBNZXNzYWdlIG9iamVjdCBmb3IgcHJlc2VudGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0IHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBjb250YWluaW5nIG1vZGVsIGdlbmVyYXRlZCBjb250ZW50XG4gKlxuICogQHJldHVybnMgQSBNZXNzYWdlIGlmIHRoZSByZXNwb25zZSBjb250YWlucyBrbm93biBhdHRyaWJ1dGVzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlRnJvbVJlc3BvbnNlID0gKHJlc3BvbnNlPzogUmVzcG9uc2UpOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgY29udGVudDogcmVzcG9uc2UuYXR0cmlidXRlcy5jb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXcsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICByZXZpZXc6IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmV2aWV3LFxuICAgICAgICByZXZpZXdlcjogcmVzcG9uc2UuYXR0cmlidXRlcy5yZXZpZXdlcixcbiAgICAgICAgc3RhcnM6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuc3RhcnMsXG4gICAgICAgIHRpdGxlOiByZXNwb25zZS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICByaWNoSW5mb3JtYXRpb246IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmljaEluZm9ybWF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlNlcGFyYXRvcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlNlcGFyYXRvcixcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlBhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5QYWdlLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlByb2R1Y3RTZWFyY2hGaWx0ZXIsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICAuLi5yZXNwb25zZS5hdHRyaWJ1dGVzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgZm9ybVR5cGU6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuZm9ybUNhdGVnb3J5Py5mb3JtVHlwZSxcbiAgICAgICAgZmllbGRzOiBPYmplY3QuZW50cmllcyhyZXNwb25zZS5hdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdGl0bGU6IHZhbHVlLnRpdGxlLFxuICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgZm9ybWF0OiB2YWx1ZS5mb3JtYXQsXG4gICAgICAgICAgcmVxdWlyZWQ6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuc2NoZW1hLnJlcXVpcmVkLmluY2x1ZGVzKGtleSksXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5PcmRlcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLk9yZGVyLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuIiwiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVJvbGUsIE1lc3NhZ2VUeXBlLCBTdWdnZXN0aW9uLCBVc2VyRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgVXNlckV2ZW50IG9iamVjdCBpbnRvIGEgTWVzc2FnZSBvYmplY3QgZm9yIHByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIFVzZXJFdmVudCBvYmplY3QgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0gc3VnZ2VzdGlvbnMgQSBsaXN0IG9mIGdlbmVyYXRlZCBzdWdnZXN0aW9ucyB0byBtYXRjaCB0aGUgZXZlbnQgdG9cbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgc3VnZ2VzdGlvbiBjbGljayBldmVudCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQgPSAoXG4gIGV2ZW50OiBVc2VyRXZlbnQsXG4gIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10sXG4pOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgIGNvbnN0IHsgc3VnZ2VzdGlvbklkIH0gPSBldmVudC5hdHRyaWJ1dGVzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBldmVudC5ldmVudElkLFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuVXNlcixcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlN1Z2dlc3Rpb25DbGlja2VkLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBzdWdnZXN0aW9uSWQsXG4gICAgICAgIHN1Z2dlc3Rpb25Db250ZW50OiBzdWdnZXN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzdWdnZXN0aW9uSWQpPy5jb250ZW50ID8/ICcnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJleHBvcnQgYWJzdHJhY3QgY2xhc3MgTm9kZVNlbGVjdG9yIHtcbiAgcHJpdmF0ZSBwYXR0ZXJuOiBzdHJpbmc7XG4gIHByaXZhdGUgcm9vdDogRG9jdW1lbnQ7XG5cbiAgY29uc3RydWN0b3IocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudDtcbiAgfVxuXG4gIGdldFBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0dGVybjtcbiAgfVxuXG4gIHNldFJvb3Qocm9vdDogRG9jdW1lbnQpIHtcbiAgICB0aGlzLnJvb3QgPSByb290O1xuICB9XG5cbiAgZ2V0Um9vdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgYWJzdHJhY3QgcGFyc2UoKTogTm9kZSB8IG51bGw7XG59XG5cbmNsYXNzIFF1ZXJ5U2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRQYXR0ZXJuKCkpO1xuICB9XG59XG5cbmNsYXNzIElEU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UGF0dGVybigpKSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIFhwYXRoU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpPy5ldmFsdWF0ZShcbiAgICAgIHRoaXMuZ2V0UGF0dGVybigpLFxuICAgICAgdGhpcy5nZXRSb290KCksXG4gICAgICBudWxsLFxuICAgICAgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsXG4gICAgICBudWxsLFxuICAgICk/LnNpbmdsZU5vZGVWYWx1ZSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIENoYWluU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdG9ySW5kZXggPSAwO1xuICAgIGNvbnN0IHNlbGVjdG9ycyA9IHRoaXMuZ2V0UGF0dGVybigpLnNwbGl0KCdAJyk7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gc2VsZWN0b3JzLmxlbmd0aCAtIDE7XG5cbiAgICBjb25zdCBwYXJzZUNoYWluID0gKHBhdHRlcm46IHN0cmluZywgcHJldk5vZGU/OiBOb2RlIHwgbnVsbCk6IE5vZGUgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JGYWN0b3J5LnBhcnNlKHBhdHRlcm4pO1xuXG4gICAgICBpZiAocHJldk5vZGUpIHtcbiAgICAgICAgc2VsZWN0b3Iuc2V0Um9vdChwcmV2Tm9kZSBhcyBEb2N1bWVudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gc2VsZWN0b3IucGFyc2UoKTtcbiAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgfCB1bmRlZmluZWQgPSBjdXJyZW50Tm9kZSB8fCBkb2N1bWVudDtcbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpPy5zaGFkb3dSb290KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnNoYWRvd1Jvb3Q7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpPy5jb250ZW50V2luZG93KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3c/LmRvY3VtZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbKytzZWxlY3RvckluZGV4XS50cmltKCksIG5vZGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbc2VsZWN0b3JJbmRleF0udHJpbSgpKTtcbiAgfVxufVxuXG5jbGFzcyBFbXB0eSBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCcnKTtcbiAgfVxuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRmFjdG9yeSB7XG4gIHN0YXRpYyBwYXJzZShjb21wb3NlZFNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjb21wb3NlZFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbmV3IEVtcHR5KCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXQgPSBjb21wb3NlZFNlbGVjdG9yLnNwbGl0KCd8Jyk7XG4gICAgY29uc3QgdHlwZSA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gc3BsaXRbMV07XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQoc2VsZWN0b3IpO1xuICAgICAgY2FzZSAncXVlcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgICBjYXNlICd4cGF0aCc6XG4gICAgICAgIHJldHVybiB0aGlzLnhwYXRoKHNlbGVjdG9yKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgRW1wdHkoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2soc2VsZWN0b3I/OiBOb2RlU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgPz8gbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgY2hhaW4ocGF0dGVybj86IHN0cmluZykge1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IENoYWluU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxuXG4gIHN0YXRpYyBpZChwYXR0ZXJuPzogc3RyaW5nKTogTm9kZVNlbGVjdG9yIHtcbiAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBJRFNlbGVjdG9yKHBhdHRlcm4pIDogbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgcXVlcnkocGF0dGVybj86IHN0cmluZyk6IE5vZGVTZWxlY3RvciB7XG4gICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgUXVlcnlTZWxlY3RvcihwYXR0ZXJuKSA6IG5ldyBFbXB0eSgpO1xuICB9XG5cbiAgc3RhdGljIHhwYXRoKHBhdHRlcm4/OiBzdHJpbmcpOiBOb2RlU2VsZWN0b3Ige1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFhwYXRoU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxufVxuIiwiZXhwb3J0IHR5cGUgUmVwbGFjZU9wPFQ+ID0geyAkcmVwbGFjZTogVCB9O1xuZXhwb3J0IHR5cGUgRGVsZXRlT3AgPSB7ICRkZWxldGU6IHRydWUgfTtcblxuLy8gVHJlYXQgdGhlc2UgYXMgYXRvbWljIHZhbHVlcyAobm90IHJlY3Vyc2VkIGludG8pXG50eXBlIEJ1aWx0aW4gPSBEYXRlIHwgUmVnRXhwIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pO1xuXG50eXBlIFByaW1pdGl2ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBzeW1ib2wgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIE92ZXJyaWRlPFQ+IGlzIGEgRGVlcFBhcnRpYWwtbGlrZSB0eXBlIHdpdGggc3BlY2lhbCBvcGVyYXRvcnM6XG4gKiAtIHsgJHJlcGxhY2U6IFQgfSB0byByZXBsYWNlIGFuIGVudGlyZSBzdWJ0cmVlL2FycmF5XG4gKiAtIHsgJGRlbGV0ZTogdHJ1ZSB9IHRvIGRlbGV0ZSBhbiBvYmplY3Qga2V5XG4gKlxuICogQXJyYXlzIGJlaGF2aW9yOlxuICogLSBBcnJheXMgb2Ygb2JqZWN0czogbWVyZ2UtYnktaW5kZXggYnkgZGVmYXVsdCAodW5sZXNzIGBhcnJheVN0cmF0ZWd5OiAncmVwbGFjZSdgIG9yIGAkcmVwbGFjZWAgaXMgdXNlZClcbiAqIC0gQXJyYXlzIG9mIHByaW1pdGl2ZXMgKHN0cmluZy9udW1iZXIvYm9vbGVhbi8uLi4pOiByZXBsYWNlZCBieSBkZWZhdWx0IHdoZW4gYSBwYXRjaCBhcnJheSBpcyBwcm92aWRlZFxuICovXG5leHBvcnQgdHlwZSBPdmVycmlkZTxUPiA9XG4gIC8vIGF0b21pY1xuICBUIGV4dGVuZHMgUHJpbWl0aXZlIHwgQnVpbHRpblxuICAgID8gVCB8IFJlcGxhY2VPcDxUPiB8IERlbGV0ZU9wXG4gICAgOiAvLyBhcnJheXNcbiAgICAgIFQgZXh0ZW5kcyAoaW5mZXIgVSlbXVxuICAgICAgPyBBcnJheTxPdmVycmlkZTxVPiB8IHVuZGVmaW5lZD4gfCBSZXBsYWNlT3A8VD5cbiAgICAgIDogLy8gbWFwcy9zZXRzIOKAkyBrZWVwIHNpbXBsZTogb25seSBhbGxvdyBmdWxsIHJlcGxhY2VcbiAgICAgICAgVCBleHRlbmRzIE1hcDx1bmtub3duLCB1bmtub3duPiB8IFNldDx1bmtub3duPlxuICAgICAgICA/IFJlcGxhY2VPcDxUPlxuICAgICAgICA6IC8vIG9iamVjdHNcbiAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgICAgPyB7IFtLIGluIGtleW9mIFRdPzogT3ZlcnJpZGU8VFtLXT4gfCBEZWxldGVPcCB8IG51bGwgfSB8IFJlcGxhY2VPcDxUPlxuICAgICAgICAgIDogVDtcblxuZXhwb3J0IHR5cGUgTWVyZ2VPcHRpb25zID0ge1xuICAvKipcbiAgICogSG93IHRvIHRyZWF0IGFycmF5cyB3aGVuIHBhdGNoIHByb3ZpZGVzIGFuIGFycmF5IChub3QgJHJlcGxhY2UpOlxuICAgKiAtICdyZXBsYWNlJzogYWx3YXlzIHVzZSBwYXRjaCBhcnJheSBhcyB3aG9sZSB2YWx1ZVxuICAgKiAtICdtZXJnZUJ5SW5kZXgnOiBtZXJnZSBlYWNoIGluZGV4IHJlY3Vyc2l2ZWx5IChkZWZhdWx0IGZvciBhcnJheXMgb2Ygb2JqZWN0cylcbiAgICogTm90ZTogQXJyYXlzIG9mIHByaW1pdGl2ZXMgYXJlIHJlcGxhY2VkIGJ5IGRlZmF1bHQgcmVnYXJkbGVzcyBvZiB0aGlzIG9wdGlvbi5cbiAgICovXG4gIGFycmF5U3RyYXRlZ3k/OiAncmVwbGFjZScgfCAnbWVyZ2VCeUluZGV4JztcbiAgLyoqXG4gICAqIElmIHRydWUsIGEgYG51bGxgIHBhdGNoIHZhbHVlIGRlbGV0ZXMgdGhlIGtleSBmcm9tIGFuIG9iamVjdCAoUkZDIDczOTYtaXNoKVxuICAgKi9cbiAgbnVsbERlbGV0ZXM/OiBib29sZWFuO1xufTtcblxuLy8gUHJldmVudHMgVCBmcm9tIGJlaW5nIGluZmVycmVkIGZyb20gdGhlICdwYXRjaCcgcGFyYW1ldGVyOyBpdCBtdXN0IGJlIGluZmVycmVkIGZyb20gJ2Jhc2UnLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE0ODI5I2lzc3VlY29tbWVudC01MDQwNDI1NDZcbnR5cGUgTm9JbmZlcjxUPiA9IFtUXVtUIGV4dGVuZHMgdW5rbm93biA/IDAgOiBuZXZlcl07XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QoeDogdW5rbm93bik6IHggaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICEheCAmJlxuICAgIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KHgpICYmXG4gICAgISh4IGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAhKHggaW5zdGFuY2VvZiBSZWdFeHApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUmVwbGFjZSh4OiB1bmtub3duKTogeCBpcyBSZXBsYWNlT3A8dW5rbm93bj4ge1xuICByZXR1cm4gISF4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAnJHJlcGxhY2UnIGluICh4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbn1cbmZ1bmN0aW9uIGlzRGVsZXRlKHg6IHVua25vd24pOiB4IGlzIERlbGV0ZU9wIHtcbiAgcmV0dXJuICEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgKHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLiRkZWxldGUgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlVmFsdWUoeDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCB0ID0gdHlwZW9mIHg7XG4gIHJldHVybiAoXG4gICAgeCA9PT0gbnVsbCB8fFxuICAgIHQgPT09ICdzdHJpbmcnIHx8XG4gICAgdCA9PT0gJ251bWJlcicgfHxcbiAgICB0ID09PSAnYm9vbGVhbicgfHxcbiAgICB0ID09PSAnYmlnaW50JyB8fFxuICAgIHQgPT09ICdzeW1ib2wnIHx8XG4gICAgdCA9PT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheU9mUHJpbWl0aXZlcyhhcnI6IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOyAvLyBhbWJpZ3VvdXMsIGRlZmF1bHQgdG8gbWVyZ2UtYnktaW5kZXggb24gZW1wdHlcbiAgLy8gSWYgZXZlcnkgZGVmaW5lZCBlbGVtZW50IGlzIHByaW1pdGl2ZSwgdHJlYXQgYXMgcHJpbWl0aXZlc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHYgPSBhcnJbaV07XG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiAhaXNQcmltaXRpdmVWYWx1ZSh2KSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtZXJnZUFueShiYXNlQW55OiB1bmtub3duLCBwYXRjaEFueTogdW5rbm93biwgb3B0czogTWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIGlmIChpc1JlcGxhY2UocGF0Y2hBbnkpKSByZXR1cm4gcGF0Y2hBbnkuJHJlcGxhY2UgYXMgdW5rbm93bjtcbiAgaWYgKGlzRGVsZXRlKHBhdGNoQW55KSkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gY2FsbGVyIGRlbGV0ZXMgdGhlIGtleVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VBbnkpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0Y2hBbnkpKSB7XG4gICAgICBjb25zdCBiYXNlQXJyID0gYmFzZUFueSBhcyB1bmtub3duW107XG4gICAgICBjb25zdCBwYXRjaEFyciA9IHBhdGNoQW55IGFzIHVua25vd25bXTtcbiAgICAgIGNvbnN0IHNob3VsZFJlcGxhY2UgPVxuICAgICAgICBvcHRzLmFycmF5U3RyYXRlZ3kgPT09ICdyZXBsYWNlJyB8fFxuICAgICAgICBpc0FycmF5T2ZQcmltaXRpdmVzKGJhc2VBcnIpIHx8XG4gICAgICAgIGlzQXJyYXlPZlByaW1pdGl2ZXMocGF0Y2hBcnIpO1xuICAgICAgaWYgKHNob3VsZFJlcGxhY2UpIHJldHVybiBwYXRjaEFueSBhcyB1bmtub3duO1xuICAgICAgY29uc3Qgb3V0ID0gYmFzZUFyci5zbGljZSgpO1xuICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgob3V0Lmxlbmd0aCwgcGF0Y2hBcnIubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4OyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgcFZhbCA9IHBhdGNoQXJyW2ldO1xuICAgICAgICBpZiAocFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3V0W2ldID0gbWVyZ2VBbnkob3V0W2ldLCBwVmFsLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dCBhcyB1bmtub3duO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZUFueSBhcyB1bmtub3duO1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoYmFzZUFueSkgJiYgaXNQbGFpbk9iamVjdChwYXRjaEFueSkpIHtcbiAgICBjb25zdCBiYXNlT2JqID0gYmFzZUFueSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBwYXRjaE9iaiA9IHBhdGNoQW55IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmJhc2VPYmogfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXRjaE9iaikpIHtcbiAgICAgIGNvbnN0IHBWYWwgPSBwYXRjaE9ialtrZXldO1xuICAgICAgaWYgKHBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBsZWF2ZSBhcy1pc1xuICAgICAgfSBlbHNlIGlmIChvcHRzLm51bGxEZWxldGVzICYmIHBWYWwgPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIGlmIChpc1JlcGxhY2UocFZhbCkpIHtcbiAgICAgICAgb3V0W2tleV0gPSBwVmFsLiRyZXBsYWNlO1xuICAgICAgfSBlbHNlIGlmIChpc0RlbGV0ZShwVmFsKSkge1xuICAgICAgICBkZWxldGUgb3V0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQW55KGJhc2VPYmo/LltrZXldLCBwVmFsLCBvcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dCBhcyB1bmtub3duO1xuICB9XG5cbiAgcmV0dXJuIChwYXRjaEFueSBhcyB1bmtub3duKSA/PyBiYXNlQW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlPdmVycmlkZXM8VD4oXG4gIGJhc2U6IFQsXG4gIHBhdGNoOiBPdmVycmlkZTxOb0luZmVyPFQ+PixcbiAgb3B0czogTWVyZ2VPcHRpb25zID0ge30sXG4pOiBUIHtcbiAgY29uc3QgeyBhcnJheVN0cmF0ZWd5ID0gJ21lcmdlQnlJbmRleCcsIG51bGxEZWxldGVzID0gZmFsc2UgfSA9IG9wdHM7XG5cbiAgLy8gSGFuZGxlIHdob2xlLW5vZGUgY29udHJvbCBvcGVyYXRvcnMgb24gcGF0Y2ggaXRzZWxmXG4gIGlmIChpc1JlcGxhY2UocGF0Y2gpKSByZXR1cm4gcGF0Y2guJHJlcGxhY2UgYXMgVDtcbiAgaWYgKGlzRGVsZXRlKHBhdGNoKSkgcmV0dXJuIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQ7XG5cbiAgLy8gQXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2UpKSB7XG4gICAgaWYgKGlzUmVwbGFjZShwYXRjaCkpIHJldHVybiBwYXRjaC4kcmVwbGFjZSBhcyBUO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgICAgaWYgKGFycmF5U3RyYXRlZ3kgPT09ICdyZXBsYWNlJykgcmV0dXJuIHBhdGNoIGFzIHVua25vd24gYXMgVDtcbiAgICAgIC8vIG1lcmdlIGJ5IGluZGV4XG4gICAgICBjb25zdCBvdXQgPSAoYmFzZSBhcyB1bmtub3duW10pLnNsaWNlKCk7XG4gICAgICBjb25zdCBtYXggPSBNYXRoLm1heChvdXQubGVuZ3RoLCBwYXRjaC5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBwVmFsID0gKHBhdGNoIGFzIHVua25vd25bXSlbaV07XG4gICAgICAgIGlmIChwVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdXRbaV0gPSBtZXJnZUFueShvdXRbaV0sIHBWYWwsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgLy8gaW52YWxpZCBwYXRjaCB0eXBlIGZvciBhbiBhcnJheSDihpIgaWdub3JlIGFuZCByZXR1cm4gYmFzZVxuICAgIHJldHVybiBiYXNlIGFzIFQ7XG4gIH1cblxuICAvLyBQbGFpbiBvYmplY3RzXG4gIGlmIChpc1BsYWluT2JqZWN0KGJhc2UpICYmIGlzUGxhaW5PYmplY3QocGF0Y2gpKSB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uKGJhc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgY29uc3QgcGF0Y2hPYmogPSBwYXRjaCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXRjaE9iaikpIHtcbiAgICAgIGNvbnN0IHBWYWwgPSBwYXRjaE9ialtrZXldO1xuICAgICAgaWYgKHBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBsZWF2ZSBleGlzdGluZyB2YWx1ZVxuICAgICAgfSBlbHNlIGlmIChudWxsRGVsZXRlcyAmJiBwVmFsID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBvdXRba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZXBsYWNlKHBWYWwpKSB7XG4gICAgICAgIG91dFtrZXldID0gcFZhbC4kcmVwbGFjZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEZWxldGUocFZhbCkpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYlZhbCA9IChiYXNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQW55KGJWYWwsIHBWYWwsIG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8vIEZvciBwcmltaXRpdmVzIG9yIHdoZW4gcGF0Y2ggaXMgcHJpbWl0aXZlLCBwYXRjaCB3aW5zIGlmIGRlZmluZWRcbiAgcmV0dXJuICgocGF0Y2ggYXMgdW5rbm93bikgPz8gYmFzZSkgYXMgVDtcbn1cbiIsIlxuY2xhc3MgU3RyaW5nVXRpbHMge1xuICBzdGF0aWMgaXNOdWxsT3JFbXB0eSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWVUcmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVRyaW1tZWQgPT09ICcnO1xuICB9XG5cbiAgc3RhdGljIHRyaW1Ub051bGwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWVUcmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNOdWxsT3JFbXB0eSh2YWx1ZVRyaW1tZWQpID8gdW5kZWZpbmVkIDogdmFsdWVUcmltbWVkO1xuICB9XG5cbiAgc3RhdGljIGNhcGl0YWxpemUodHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR5cGUuc3Vic3RyaW5nKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBmaXJzdCBwYXR0ZXJuIGluIGFuIGFycmF5IHRoYXQgbWF0Y2hlcyBhIGdpdmVuIFVSTC5cbiAgICogUGF0dGVybnMgY2FuIGluY2x1ZGUgYSBzaW5nbGUgd2lsZGNhcmQgJyonIHdoaWNoIG1hdGNoZXMgYW55IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gdXJsVG9UZXN0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZmluZE1hdGNoaW5nUGF0dGVybihwYXR0ZXJuczogc3RyaW5nW10sIHVybFRvVGVzdDogTG9jYXRpb24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdXJsVG9UZXN0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgLy8gVGVzdCBvbmx5IGlmIGEgcGF0aG5hbWUgaXMgcHJlc2VudC5cbiAgICAgIGlmICh1cmxUb1Rlc3QucGF0aG5hbWUgIT09ICcvJykge1xuICAgICAgICAvLyBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGluIHRoZSBwYXR0ZXJuXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGNoYXJhY3RlcnMgbGlrZSAnLicsICcrJywgJz8nLCAnKCcsIGV0Yy4sIGluIHRoZSBwYXR0ZXJuIGFyZSB0cmVhdGVkIGxpdGVyYWxseS5cbiAgICAgICAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcblxuICAgICAgICAvLyBSZXBsYWNlIHRoZSB3aWxkY2FyZCAnKicgd2l0aCBpdHMgcmVnZXggZXF1aXZhbGVudCAnLionIChtYXRjaGVzIGFueSBjaGFyYWN0ZXIgemVybyBvciBtb3JlIHRpbWVzKVxuICAgICAgICBjb25zdCByZWdleFBhdHRlcm4gPSBlc2NhcGVkUGF0dGVybi5yZXBsYWNlKC9cXCovZywgJy4qJyk7XG5cbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtyZWdleFBhdHRlcm59JGApO1xuICAgICAgICBpZiAocmVnZXgudGVzdCh1cmxUb1Rlc3QucGF0aG5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgodXJsVG9UZXN0Lmhvc3RuYW1lKSkge1xuICAgICAgICByZXR1cm4gcGF0dGVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyaW5nVXRpbHMgfTtcbiIsIi8vIFRoaXMgZW1haWwgdmFsaWRhdGVzIHRoYXQgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgYmVmb3JlIHRoZSBgQGAgc3ltYm9sLFxuLy8gb25lIG9yIG1vcmUgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSBgQGAgc3ltYm9sIGFuZCB0aGUgYC5gIHN5bWJvbCxcbi8vIGFuZCBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBgLmAgc3ltYm9sXG4vLyBJdCBkb2VzIE5PVCB2YWxpZGF0ZSBhbGwgcG9zc2libGUgZW1haWwgZm9ybWF0cywgYnV0IGl0IGlzIGEgZGVjZW50IHBsYWNlIHRvIHN0YXJ0LlxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRW1haWwgPSAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdCh2YWx1ZSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLE1BQWEsK0JBQStCLFNBQXNDO0FBQ2hGLEtBQ0UsS0FBSyxhQUFhQSxrREFBa0IsWUFDcEMsS0FBSyxhQUFhQSxrREFBa0IsVUFFcEMsUUFBTztFQUNMLFVBQVUsS0FBSztFQUNmLFlBQVksS0FBSztFQUNqQixVQUFVLEtBQUs7RUFDZixZQUFZO0dBQ1YsWUFBWSxLQUFLLFdB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
1591
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtQ0xHWHNPd0UuY2pzIiwibmFtZXMiOlsiVXNlckV2ZW50Q2F0ZWdvcnkiLCJQTFBBdHRyaWJ1dGVDYXRlZ29yeSIsIlVzZXJFdmVudENhdGVnb3J5IiwiTWVzc2FnZVJvbGUiLCJNZXNzYWdlVHlwZSIsIlJlc3BvbnNlRXJyb3IiLCJnZXRBdG9tU3RvcmUiLCJiYXNlVXJsQXRvbSIsImNvbmZpZzogQ29uZmlndXJhdGlvbiIsIkNvbmZpZ3VyYXRpb24iLCJEZWZhdWx0QXBpIiwiSW5mZXJlbmNlQXBpIiwiQ3VzdG9tZXJTZXJ2aWNlQXBpIiwib3JnU2hvcnROYW1lQXRvbSIsIm9yZ0lkQXRvbSIsImNvbnRleHRTb3VyY2VBdG9tIiwiZW52QXRvbSIsImZlYXR1cmVGbGFnU2VydmljZUF0b20iLCJjb250ZXh0OiBDb250ZXh0IiwiQ29udGV4dFNvdXJjZUVudW0iLCJDb250ZXh0RW52RW51bSIsInZhbGlkYXRlUmVzcG9uc2UiLCJlcnI6IHVua25vd24iLCJlcnJvcjogdW5rbm93biIsInZhbGlkYXRlU3VnZ2VzdGlvbiIsImRhdGE6IFYxR2V0U2Vzc2lvbk1lc3NhZ2VzMjAwUmVzcG9uc2UiLCJyZXNwb25zZXM6IFJlc3BvbnNlW11bXSIsInN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10iLCJ1c2VyRXZlbnRzOiBVc2VyRXZlbnRbXSIsInZhbGlkYXRlVXNlckV2ZW50IiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJhc3Npc3RhbnRNZXNzYWdlczogTWVzc2FnZVtdW10iLCJSZXNwb25zZUNhdGVnb3J5IiwidXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsIkZvcm1UeXBlIiwiVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtIiwicmVhY3RBcHBOYW1lQXRvbSIsInJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCIsIlByb2R1Y3RFeHBlcmltZW50IiwidmFsaWRhdGVPcmdDb25maWdSZXN1bHRzIiwiVUFQYXJzZXIiLCJVc2VySWRlbnRpdHlQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+IiwidXNlTG9jYWxTdG9yYWdlIiwiQ29tbWVyY2VBcGlDbGllbnQiLCJzZXNzaW9uU3RvcmFnZVV0aWwiLCJWYXJpYW50VHlwZUVudW0iLCJjb250ZXh0U291cmNlQXRvbSIsIkNvbnRleHRTb3VyY2VFbnVtIiwiQW1wbGl0dWRlUHJvdmlkZXI6IFJlYWN0LkZDPHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9PiIsImFtcGxpdHVkZUFwaUtleUF0b20iLCJkYXRhUmVzaWRlbmN5QXRvbSIsIm9yZ0FuYWx5dGljc0dvb2dsZUFuYWx5dGljc0NvbmZpZ0F0b20iLCJlbnZBdG9tIiwiY29udGV4dFNvdXJjZUF0b20iLCJpZGVudGlmeWluZ1ByZWZpeEF0b20iLCJ1c2VMb2NhbFN0b3JhZ2UiLCJ1c2VFbnZpdmVDb25maWciLCJ1c2VGZWF0dXJlRmxhZ1NlcnZpY2UiLCJSZWFjdCIsIkxvY2FsU3RvcmFnZUtleXMiLCJ2YWx1ZSIsIk9yZ1Nob3J0TmFtZSIsIkZlYXR1cmVHYXRlcyIsImVucmljaG1lbnQ6IEVucmljaG1lbnRQbHVnaW4iLCJlbnJpY2hlZEV2ZW50OiBFdmVudCIsImdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJTcGlmZnlFdmVudCIsImN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZTogQnJvd3NlckNsaWVudCIsImV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwiaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50IiwiaXNHQTRFY29tbWVyY2VFdmVudCIsImlzQmFzZUVjb21tZXJjZUV2ZW50IiwiTWVzc2FnZVR5cGUiLCJVc2VyRXZlbnRDYXRlZ29yeSIsIk1lc3NhZ2VSb2xlIiwiTWVzc2FnZVR5cGUiLCJSZXNwb25zZUNhdGVnb3J5IiwiTWVzc2FnZVR5cGUiLCJNZXNzYWdlUm9sZSIsIlVzZXJFdmVudENhdGVnb3J5IiwiTWVzc2FnZVJvbGUiLCJNZXNzYWdlVHlwZSIsIm5vZGU6IE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkIiwib3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2NvcmVDb250ZXh0VG9BcGlDb250ZXh0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL3N1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdC50cyIsIi4uL3NyYy90eXBlcy9leGNlcHRpb25zL3Nlc3Npb25FeGNlcHRpb25zLnRzIiwiLi4vc3JjL3R5cGVzL2V4Y2VwdGlvbnMvdW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9ucy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9jb21tZXJjZS1hcGkudHMiLCIuLi9zcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0LnRzeCIsIi4uL3NyYy9hdG9tcy9hcHAvdmFyaWFudC50cyIsIi4uL3NyYy9hdG9tcy9hcHAvaW5kZXgudHMiLCIuLi9zcmMvY29udGV4dHMvYW1wbGl0dWRlQ29udGV4dC9hbXBsaXR1ZGVDb250ZXh0LnRzeCIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9hbmFseXRpY3NVdGlscy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9kaXZpZGVBcnJheS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9pbWFnZUZpbHRlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXJjaGFudFV0aWxzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tUXVlcnlFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbVJlc3BvbnNlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL25vZGVTZWxlY3Rvci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9vdmVycmlkZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvc3RyaW5nVXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvdmFsaWRhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBVc2VyRXZlbnQgYXMgQXBpVXNlckV2ZW50LFxuICBQTFBBdHRyaWJ1dGVDYXRlZ29yeSxcbiAgUExQSWRBdHRyaWJ1dGVzLFxuICBVc2VyRXZlbnRDYXRlZ29yeSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IFVzZXJFdmVudCBhcyBDb3JlVXNlckV2ZW50IH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCA9IChkYXRhOiBDb3JlVXNlckV2ZW50KTogQXBpVXNlckV2ZW50ID0+IHtcbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBkcFZpc2l0IHx8XG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuQWRkVG9DYXJ0XG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcHJvZHVjdF9pZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgcGFyZW50X3Byb2R1Y3RfaWQ6IGRhdGEuYXR0cmlidXRlcy5wYXJlbnRQcm9kdWN0SWQsXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY2F0ZWdvcnk6IFBMUEF0dHJpYnV0ZUNhdGVnb3J5LklkLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLy8gd2UncmUgb25seSBoYW5kbGluZyBpZCBhdHRyaWJ1dGVzIGZvciBub3dcbiAgICAgICAgICBpZDogKGRhdGEuYXR0cmlidXRlcy5hdHRyaWJ1dGVzIGFzIFBMUElkQXR0cmlidXRlcykuaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcXVlcnk6IGRhdGEuYXR0cmlidXRlcy5xdWVyeSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaF90ZXJtOiBkYXRhLmF0dHJpYnV0ZXMuc2VhcmNoVGVybSxcbiAgICAgICAgc2VsZWN0ZWRfZmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLnNlbGVjdGVkRmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc3VnZ2VzdGlvbl9pZDogZGF0YS5hdHRyaWJ1dGVzLnN1Z2dlc3Rpb25JZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QYWdlVmlzaXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgcGFnZV92aXNpdF9jYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLnBhZ2VWaXNpdENhdGVnb3J5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZpbGxlZF9zY2hlbWE6IHsgLi4uZGF0YS5hdHRyaWJ1dGVzLmZpbGxlZFNjaGVtYSB9LFxuICAgICAgICBmb3JtX3Jlc3BvbnNlX2lkOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQsXG4gICAgICAgIGZvcm1fdHlwZTogZGF0YS5hdHRyaWJ1dGVzLmZvcm1UeXBlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBhcHBfbG9hZGVkIGV2ZW50LCB3aGVuIHdlIHN0YXJ0IHRvIHVzZSBhcHBfdW5sb2FkZWQgd2UgbmVlZCB0byBoYW5kbGUgaXQgaGVyZVxuICByZXR1cm4ge1xuICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgTmV4dE1lc3NhZ2VSZXF1ZXN0IGFzIEFwaU5leHRNZXNzYWdlUmVxdWVzdCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBOZXh0TWVzc2FnZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50IH0gZnJvbSAnLi9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQnO1xuXG5leHBvcnQgY29uc3QgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgPSAoXG4gIGRhdGE6IE5leHRNZXNzYWdlUmVxdWVzdCxcbik6IEFwaU5leHRNZXNzYWdlUmVxdWVzdCA9PiAoe1xuICBjb250ZXh0OiB7XG4gICAgY2hhdF9pZDogZGF0YS5jb250ZXh0LmNoYXRJZCxcbiAgICBvcmdfaWQ6IGRhdGEuY29udGV4dC5vcmdJZCxcbiAgICBvcmdfc2hvcnRfbmFtZTogZGF0YS5jb250ZXh0Lm9yZ1Nob3J0TmFtZSxcbiAgICB1c2VyX2lkOiBkYXRhLmNvbnRleHQudXNlcklkLFxuICAgIHNvdXJjZTogZGF0YS5jb250ZXh0LnNvdXJjZSxcbiAgICBlbnY6IGRhdGEuY29udGV4dC5lbnYsXG4gIH0sXG4gIGlkOiBkYXRhLmlkLFxuICBmZWF0dXJlX2ZsYWdzOiBkYXRhLmZlYXR1cmVGbGFncyxcbiAgdXNlcl9ldmVudHM6IGRhdGEudXNlckV2ZW50cz8ubWFwKCh1c2VyRXZlbnQpID0+IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCh1c2VyRXZlbnQpKSxcbiAgZ2VuZXJhdGlvbl9wYXJhbXM6IHtcbiAgICBtb2RlbDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5tb2RlbCxcbiAgICBtYXhfdG9rZW5zOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/Lm1heFRva2VucyxcbiAgICBzdG9wOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0b3AsXG4gICAgc3RyZWFtOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0cmVhbSxcbiAgICB0ZW1wZXJhdHVyZTogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50ZW1wZXJhdHVyZSxcbiAgICB0b3BfcDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50b3BQLFxuICAgIG51bV9zdWdnZXN0aW9uczogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5udW1TdWdnZXN0aW9ucyxcbiAgICByZXNwb25zZV9zeXN0ZW1fcHJvbXB0OiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnJlc3BvbnNlU3lzdGVtUHJvbXB0LFxuICAgIHN1Z2dlc3Rpb25fc3lzdGVtX3Byb21wdDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5zdWdnZXN0aW9uU3lzdGVtUHJvbXB0LFxuICAgIHJlc3BvbnNlX2NhY2hpbmc6IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8ucmVzcG9uc2VDYWNoaW5nLFxuICB9LFxufSk7XG4iLCJpbXBvcnQgeyBDb250ZXh0IGFzIEFwaUNvbnRleHQgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgQ29udGV4dCBhcyBDb3JlQ29udGV4dCB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBjb3JlQ29udGV4dFRvQXBpQ29udGV4dCA9IChjb250ZXh0OiBDb3JlQ29udGV4dCk6IEFwaUNvbnRleHQgPT4gKHtcbiAgY2hhdF9pZDogY29udGV4dC5jaGF0SWQsXG4gIG9yZ19pZDogY29udGV4dC5vcmdJZCxcbiAgdXNlcl9pZDogY29udGV4dC51c2VySWQsXG4gIG9yZ19zaG9ydF9uYW1lOiBjb250ZXh0Lm9yZ1Nob3J0TmFtZSxcbiAgc291cmNlOiBjb250ZXh0LnNvdXJjZSxcbiAgZW52OiBjb250ZXh0LmVudixcbn0pO1xuIiwiaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0IGFzIEFwaVN1cHBvcnRlZEV2ZW50UmVxdWVzdCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRFdmVudFJlcXVlc3QgYXMgQ29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9hcGkvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0JztcbmltcG9ydCB7IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCB9IGZyb20gJy4vY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50JztcbmltcG9ydCB7IGNvcmVDb250ZXh0VG9BcGlDb250ZXh0IH0gZnJvbSAnLi9jb3JlQ29udGV4dFRvQXBpQ29udGV4dCc7XG5cbmV4cG9ydCBjb25zdCBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0ID0gKFxuICBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0OiBDb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuKTogQXBpU3VwcG9ydGVkRXZlbnRSZXF1ZXN0ID0+ICh7XG4gIGlkOiBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LmlkLFxuICB1c2VyX2V2ZW50OiBjb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQoY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdC51c2VyRXZlbnQpLFxuICBjb250ZXh0OiBjb3JlQ29udGV4dFRvQXBpQ29udGV4dChjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LmNvbnRleHQpLFxufSk7XG4iLCJleHBvcnQgY2xhc3MgU2Vzc2lvblJlc3RhcnRSZXF1aXJlZCBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ1Nlc3Npb24gcmVzdGFydCByZXF1aXJlZCcpO1xuICAgIHRoaXMubmFtZSA9ICdTZXNzaW9uUmVzdGFydFJlcXVpcmVkJztcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ1Vuc3VwcG9ydGVkIHByb2R1Y3QnKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zdXBwb3J0ZWRQcm9kdWN0JztcbiAgfVxufSIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7XG4gIEZvcm1SZXNwb25zZUF0dHJpYnV0ZXMsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VSb2xlLFxuICBNZXNzYWdlVHlwZSxcbiAgVXNlckV2ZW50LFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IG1lc3NhZ2VGcm9tRm9ybVN1Ym1pdHRlZEV2ZW50ID0gKFxuICBldmVudDogVXNlckV2ZW50LFxuICBmb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ10sXG4pOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGV2ZW50LmNhdGVnb3J5ICE9PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGZvcm1TdHJpbmdDb250ZW50cyA9IE9iamVjdC5lbnRyaWVzKGZvcm1SZXNwb25zZUF0dHJpYnV0ZXMuc2NoZW1hLnByb3BlcnRpZXMpXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHt2YWx1ZS50aXRsZX06ICR7ZXZlbnQuYXR0cmlidXRlcy5maWxsZWRTY2hlbWFba2V5XX1gKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICByZXR1cm4ge1xuICAgIGlkOiBldmVudC5ldmVudElkLFxuICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgdHlwZTogTWVzc2FnZVR5cGUuUXVlcnlUeXBlZCxcbiAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICBtZXRhZGF0YToge1xuICAgICAgY29udGVudDogZm9ybVN0cmluZ0NvbnRlbnRzLFxuICAgIH0sXG4gIH07XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBDb25maWd1cmF0aW9uLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIERlZmF1bHRBcGksXG4gIEluZmVyZW5jZUFwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0sXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBSZXNwb25zZUNhdGVnb3J5LFxuICBGb3JtVHlwZSxcbn0gZnJvbSBcIkBzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHsgdmFsaWRhdGVTdWdnZXN0aW9uIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVN1Z2dlc3Rpb25cIjtcbmltcG9ydCB7IHZhbGlkYXRlVXNlckV2ZW50IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudFwiO1xuaW1wb3J0IHtcbiAgbWVzc2FnZUZyb21RdWVyeUV2ZW50LFxuICBtZXNzYWdlRnJvbVJlc3BvbnNlLFxuICBtZXNzYWdlRnJvbVN1Z2dlc3Rpb25FdmVudCxcbn0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICBSZXNwb25zZSxcbiAgU3VnZ2VzdGlvbixcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBVc2VyRXZlbnQsXG59IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzXCI7XG5pbXBvcnQgeyBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0XCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlc3BvbnNlIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgeyBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi91dGlscy9zdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3RcIjtcbmltcG9ydCB7IFNlc3Npb25SZXN0YXJ0UmVxdWlyZWQgfSBmcm9tIFwic3JjL3R5cGVzL2V4Y2VwdGlvbnMvc2Vzc2lvbkV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiB9IGZyb20gXCJzcmMvdHlwZXMvZXhjZXB0aW9ucy91bnN1cHBvcnRlZFByb2R1Y3RFeGNlcHRpb25zXCI7XG5pbXBvcnQgeyBDbGllbnREZXRhaWxzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvY2xpZW50RGV0YWlsc1wiO1xuaW1wb3J0IHsgZ2V0QXRvbVN0b3JlIH0gZnJvbSBcInNyYy9hdG9tcy9hdG9tU3RvcmUvYXRvbVN0b3JlXCI7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpbWVudCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3Byb2R1Y3RFeHBlcmltZW50XCI7XG5pbXBvcnQgeyBGZWF0dXJlR2F0ZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9mZWF0dXJlR2F0ZXNcIjtcbmltcG9ydCB7IHZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzXCI7XG5pbXBvcnQgeyBPcmdDb25maWcgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0c1wiO1xuaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnQgfSBmcm9tIFwic3JjL2F0b21zL2FwcC92YXJpYW50XCI7XG5pbXBvcnQgeyBtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gXCJAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQvZGlzdC9tb2RlbHMvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29udGV4dEVudkVudW0gfSBmcm9tIFwiQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50XCI7IC8vIEltcG9ydCBDb250ZXh0RW52RW51bVxuaW1wb3J0IHtcbiAgYmFzZVVybEF0b20sXG4gIHJlYWN0QXBwTmFtZUF0b20sXG4gIGNvbnRleHRTb3VyY2VBdG9tLFxuICBvcmdTaG9ydE5hbWVBdG9tLFxuICBlbnZBdG9tLCAvLyBJbXBvcnQgZW52QXRvbVxufSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20sIGNoYXRJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiOyAvLyBJbXBvcnQgdXNlcklkQXRvbSBhbmQgY2hhdElkQXRvbVxuaW1wb3J0IHsgb3JnSWRBdG9tLCBmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmcvZ3JhcGhxbENvbmZpZ1wiOyAvLyBJbXBvcnQgbmV3IG9yZ0lkQXRvbSBhbmQgZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbVxuXG5hc3luYyBmdW5jdGlvbiBlcnJvclJlc3BvbnNlQm9keShlcnJvcjogUmVzcG9uc2VFcnJvcikge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBlcnJvci5yZXNwb25zZS5qc29uKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZihlcnJvck1zZzogc3RyaW5nLCBlcnJvcjogdW5rbm93bikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFJlc3BvbnNlRXJyb3IpKSB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBhd2FpdCBlcnJvclJlc3BvbnNlQm9keShlcnJvcik7XG4gIGlmIChcbiAgICBlcnJvclJlc3BvbnNlPy5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpID09PSBcInVuc3VwcG9ydGVkIHByb2R1Y3RcIiB8fCAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIEFQSSByZXR1cm4gc3ViX2NvZGUgaW5zdGVhZCBvZiBtZXNzYWdlXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUFJPRFVDVF9OT1RfRk9VTkRcIlxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUkVTVEFSVF9TRVNTSU9OXCIgfHxcbiAgICBlcnJvclJlc3BvbnNlPy5zdWJfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gXCJOT1RfRk9VTkRcIiAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3IEFQSSByZXNwb25zZXMgd2lsbCBjb250YWluIFwiYXBwX2NvZGVcIlxuICApIHtcbiAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgIFwiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdC4gUmUtc3RhcnQgc2Vzc2lvblwiLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXNzaW9uUmVzdGFydFJlcXVpcmVkKCk7XG4gIH1cblxuICBMb2dnZXIubG9nSW5mbyhlcnJvck1zZywgZXJyb3IpO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuY2xhc3MgQ29tbWVyY2VBcGlDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBcGk6IERlZmF1bHRBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21lclNlcnZpY2VBcGk6IEN1c3RvbWVyU2VydmljZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGluZmVyZW5jZUFwaTogSW5mZXJlbmNlQXBpO1xuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tZXJjZUFwaUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgcmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgc3RhdGljIGdldEluc3RhbmNlID0gKCk6IENvbW1lcmNlQXBpQ2xpZW50ID0+IHtcbiAgICBpZiAoIUNvbW1lcmNlQXBpQ2xpZW50Lmluc3RhbmNlKSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSA9IG5ldyBDb21tZXJjZUFwaUNsaWVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZTtcbiAgfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJhc2VQYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYXRvbVN0b3JlID0gZ2V0QXRvbVN0b3JlKCk7XG4gICAgY29uc3QgYmFzZVVybCA9IGF0b21TdG9yZS5nZXQoYmFzZVVybEF0b20pO1xuICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aCB8fCBiYXNlVXJsO1xuICAgIC8vIEFQSSBLZXkgaXMgbm93IGhhbmRsZWQgYXQgdGhlIEVudml2ZUNvbmZpZ1Byb3ZpZGVyIGxldmVsXG4gICAgY29uc3QgY29uZmlnOiBDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oe1xuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIHJlc29sdmVVcmwgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IHVzZXJJZCA9IGF0b21TdG9yZS5nZXQodXNlcklkQXRvbSk7XG4gICAgY29uc3QgY2hhdElkID0gYXRvbVN0b3JlLmdldChjaGF0SWRBdG9tKTtcbiAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICBjb25zdCBlbnYgPSBhdG9tU3RvcmUuZ2V0KGVudkF0b20pO1xuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICB1c2VyX2lkOiB1c2VySWQgPz8gXCJcIixcbiAgICAgIG9yZ19pZDogb3JnSWQgPz8gXCJcIixcbiAgICAgIG9yZ19zaG9ydF9uYW1lOiBvcmdTaG9ydE5hbWUgPz8gXCJcIixcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCA/PyBcIlwiLFxuICAgICAgc291cmNlOiBzb3VyY2UgPz8gQ29udGV4dFNvdXJjZUVudW0uQXBwLFxuICAgICAgZW52OiAoZW52IGFzIENvbnRleHRFbnZFbnVtKSA/PyBDb250ZXh0RW52RW51bS5EZXYsIC8vIENhc3QgZW52IHRvIENvbnRleHRFbnZFbnVtXG4gICAgfTtcblxuICAgIGNvbnN0IGZlYXR1cmVHYXRlcyA9XG4gICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge307XG4gICAgY29uc3QgdXJsUmVzb2x2aW5nUmVxdWVzdCA9IHtcbiAgICAgIHVybCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmZWF0dXJlX2dhdGVzOiBmZWF0dXJlR2F0ZXMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJhd1Jlc3BvbnNlID1cbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxVXJsUmVzb2x2aW5nUG9zdFJhdyh7XG4gICAgICAgIFVybFJlc29sdmluZ1JlcXVlc3Q6IHVybFJlc29sdmluZ1JlcXVlc3QsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJhd1Jlc3BvbnNlLnJhdy5qc29uKCk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xuICB9O1xuXG4gIHN0YXRpYyByZXBvcnRTZXNzaW9uID0gYXN5bmMgKFxuICAgIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFNlc3Npb25SZXF1ZXN0XG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUNoYXRzUmVwb3J0U2Vzc2lvbklkUG9zdChcbiAgICAgIHtcbiAgICAgICAgUmVwb3J0U2Vzc2lvblJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlcyA9IGFzeW5jIChcbiAgICBwYXlsb2FkOiBOZXh0TWVzc2FnZVJlcXVlc3RcbiAgKTogUHJvbWlzZTxNZXNzYWdlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0KHtcbiAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwKSlcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwKSk7XG5cbiAgICAgIHJldHVybiBtZXNzYWdlcy5maWx0ZXIoKG0pOiBtIGlzIE1lc3NhZ2UgPT4gbSAhPSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgIExvZ2dlci5sb2dJbmZvKFwiRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlc1wiLCBlcnIsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKFwiRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlc1wiLCBlcnIpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nID0gKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdFxuICApOiBBc3luY0dlbmVyYXRvcjxSZXNwb25zZSwgdm9pZCwgdW5rbm93bj4gPT4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uKiBnZW5lcmF0ZShcbiAgICAgIGluZmVyZW5jZUFwaTogSW5mZXJlbmNlQXBpLFxuICAgICAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgICApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBzdHJlYW1pbmcgaXMgZW5hYmxlZFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpbmZlcmVuY2VBcGkudjFOZXh0UmVzcG9uc2VzUG9zdFJhdyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGFzIGEgc3RyZWFtIG9mIGRhdGFcbiAgICAgICAgaWYgKCFyZXNwb25zZS5yYXcuYm9keSkge1xuICAgICAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgICAgIFwiW3NwaWZmeS1haV0gTm8gYm9keSBpbiB0aGUgc3RyZWFtZWQgcmVzcG9uc2VcIixcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnJhdyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLnJhdy5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7XG5cbiAgICAgICAgbGV0IHBhcnRpYWwgPSBcIlwiO1xuICAgICAgICAvLyBUT0RPIHRoaXMgZnVuY3Rpb24gaXMgcmVjcmVhdGVkIGV2ZXJ5IHRpbWUgbmV3IGRhdGEgY29tZXMgZnJvbSB0aGUgc3RyZWFtIC0gZGVmaW5lIGl0IG91dHNpZGUgb2YgdGhlIGdlbmVyYXRvclxuICAgICAgICBjb25zdCBzYWZlUGFyc2UgPSAobGluZTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxpbmUpOyAvLyBQYXJzZSB0aGUgSlNPTiBzdHJpbmdcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIExvZ2dlci5sb2dFcnJvcihcIltzcGlmZnktYWldIEVycm9yIHBhcnNpbmcgc3RyZWFtZWQgbGluZVwiLCBlcnIsIHtcbiAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgcGFydGlhbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gc3dhbGxvdyB0aGUgZXJyb3IgYW5kIHNldCB0aGUgcGFydGlhbCB0byBvdXIgY3VycmVudCBjaHVua1xuICAgICAgICAgICAgcGFydGlhbCA9IGxpbmU7XG4gICAgICAgICAgICByZXR1cm4gcGFydGlhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVE9ETyB0aGlzIGZ1bmN0aW9uIGlzIHJlY3JlYXRlZCBldmVyeSB0aW1lIG5ldyBkYXRhIGNvbWVzIGZyb20gdGhlIHN0cmVhbSAtIGRlZmluZSBpdCBvdXRzaWRlIG9mIHRoZSBnZW5lcmF0b3JcbiAgICAgICAgY29uc3QgcHJvY2Vzc0NodW5rID0gKGNodW5rOiBzdHJpbmcpOiB1bmtub3duW10gPT4ge1xuICAgICAgICAgIC8vIG1lcmdlIHRoZSBwYXJ0aWFsIHdpdGggdGhlIGluY29taW5nIGNodW5rXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBgJHtwYXJ0aWFsfSR7Y2h1bmt9YC5zcGxpdChcIlxcblwiKTtcblxuICAgICAgICAgIGNvbnN0IHBhcnNlZExpbmVzID0gbGluZXNcbiAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUucmVwbGFjZSgvXmRhdGE6IC8sIFwiXCIpLnRyaW0oKSkgLy8gUmVtb3ZlIHRoZSBcImRhdGE6IFwiIHByZWZpeFxuICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gXCJcIiAmJiBsaW5lICE9PSBcIltET05FXVwiKSAvLyBSZW1vdmUgZW1wdHkgbGluZXMgYW5kIFwiW0RPTkVdXCJcbiAgICAgICAgICAgIC5tYXAoc2FmZVBhcnNlKVxuICAgICAgICAgICAgLmZpbHRlcigodikgPT4gdik7IC8vIGFuZCBmaWx0ZXIgb3V0IHRoZSB1bmRlZmluZWQgdmFsdWVzXG4gICAgICAgICAgcmV0dXJuIHBhcnNlZExpbmVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuXG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hc3NhZ2UgYW5kIHBhcnNlIHRoZSBjaHVuayBvZiBkYXRhXG4gICAgICAgICAgY29uc3QgY2h1bmsgPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTGluZXMgPSBwcm9jZXNzQ2h1bmsoY2h1bmspO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBwYXJzZWRMaW5lIG9mIHBhcnNlZExpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRSZXNwb25zZSA9IHZhbGlkYXRlUmVzcG9uc2UocGFyc2VkTGluZSk7XG5cbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB5aWVsZCB2YWxpZGF0ZWRSZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgICBcIltzcGlmZnktYWldIEZhaWxlZCB0byBnZXQgbmV4dCBzdHJlYW1pbmcgcmVzcG9uc2VzXCIsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgICAgICB1c2VyRXZlbnRzOiBwYXlsb2FkPy51c2VyRXZlbnRzLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlc1wiLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5yZXNwb25zZXNBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlciA9XG4gICAgICBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdGUoXG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaSxcbiAgICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyXG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdFxuICApOiBQcm9taXNlPFN1Z2dlc3Rpb25bXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyID1cbiAgICAgICAgbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxTmV4dFN1Z2dlc3Rpb25zUG9zdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2lnbmFsOlxuICAgICAgICAgICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gdmFsaWRhdGVTdWdnZXN0aW9uKHJlc3ApKVxuICAgICAgICAuZmlsdGVyKChzdWdnZXN0aW9uKTogc3VnZ2VzdGlvbiBpcyBTdWdnZXN0aW9uID0+IHN1Z2dlc3Rpb24gIT0gbnVsbCk7XG5cbiAgICAgIHJldHVybiBzdWdnZXN0aW9ucztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXCJGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zXCIsIGVycm9yLCB7XG4gICAgICAgIHBheWxvYWRDb250ZXh0OiBwYXlsb2FkPy5jb250ZXh0LFxuICAgICAgICB1c2VyRXZlbnRzOiBwYXlsb2FkPy51c2VyRXZlbnRzLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKFwiRmFpbGVkIHRvIGdldCBzdWdnZXN0aW9uc1wiLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBleGlzdGluZyBjaGF0IGRhdGEgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCBUaGUgb3JnYW5pemF0aW9uIElkXG4gICAqIEBwYXJhbSBjaGF0SWQgVGhlIGV4aXN0aW5nIGNoYXQgSWRcbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBJZFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCB3ZXJlIGV4Y2hhbmdlZCBpbiB0aGUgY2hhdCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjaGF0IHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgY2hhdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7XG4gICAgcmVzcG9uc2VzOiBSZXNwb25zZVtdW107XG4gICAgdXNlckV2ZW50czogVXNlckV2ZW50W107XG4gICAgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXTtcbiAgICBtZXNzYWdlczogTWVzc2FnZVtdW107XG4gIH0+ID0+IHtcbiAgICBsZXQgZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSA9IHtcbiAgICAgIHJlc3BvbnNlczogW10sXG4gICAgICBzdWdnZXN0aW9uczogW10sXG4gICAgICB1c2VyX2V2ZW50czogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgb3JnX2lkOiBvcmdJZCxcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCxcbiAgICAgIHVzZXJfaWQ6IHVzZXJJZCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBkYXRhID1cbiAgICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5kZWZhdWx0QXBpLnYxR2V0U2Vzc2lvbk1lc3NhZ2VzKFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXG4gICAgICAgIFwiRmFpbGVkIHRvIGdldCBjaGF0IHJlc3BvbnNlc1wiLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZXM6IFJlc3BvbnNlW11bXSA9IGRhdGE/LnJlc3BvbnNlcz8ubWFwKCh0dXJuKSA9PlxuICAgICAgdHVyblxuICAgICAgICAubWFwKChyZXNwb25zZSkgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgIC5maWx0ZXIoKHJlc3BvbnNlKTogcmVzcG9uc2UgaXMgUmVzcG9uc2UgPT4gcmVzcG9uc2UgIT0gbnVsbClcbiAgICApO1xuXG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSA9IGRhdGE/LnN1Z2dlc3Rpb25zXG4gICAgICAubWFwKChzdWdnZXN0aW9uKSA9PiB2YWxpZGF0ZVN1Z2dlc3Rpb24oc3VnZ2VzdGlvbikpXG4gICAgICAuZmlsdGVyKChzdWdnZXN0aW9uKTogc3VnZ2VzdGlvbiBpcyBTdWdnZXN0aW9uID0+IHN1Z2dlc3Rpb24gIT0gbnVsbCk7XG5cbiAgICBjb25zdCB1c2VyRXZlbnRzOiBVc2VyRXZlbnRbXSA9IGRhdGE/LnVzZXJfZXZlbnRzXG4gICAgICAubWFwKChldmVudCkgPT4gdmFsaWRhdGVVc2VyRXZlbnQoZXZlbnQpKVxuICAgICAgLmZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBVc2VyRXZlbnQgPT4gZXZlbnQgIT0gbnVsbCk7XG5cbiAgICAvLyBpZiBhIGZvcm0gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQsIGRvbid0IHNob3cgaXQgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcyA9IHVzZXJFdmVudHNcbiAgICAgIC5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZClcbiAgICAgIC5tYXAoKGV2ZW50KSA9PiBldmVudC5hdHRyaWJ1dGVzLmZvcm1SZXNwb25zZUlkKTtcblxuICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VzOiBNZXNzYWdlW11bXSA9IHJlc3BvbnNlc1xuICAgICAgLm1hcCgodHVybikgPT5cbiAgICAgICAgdHVyblxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuRm9ybSAmJlxuICAgICAgICAgICAgICAgIGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcy5pbmNsdWRlcyhyZXNwb25zZS5pZClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChyZXNwb25zZSkgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZSA9PiBtZXNzYWdlICE9IG51bGwpXG4gICAgICApXG4gICAgICAuZmlsdGVyKCh0dXJuKSA9PiB0dXJuLmxlbmd0aCA+IDApO1xuXG4gICAgY29uc3QgdXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSA9IHVzZXJFdmVudHNcbiAgICAgIC5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBbVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCwgVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIGV2ZW50LmNhdGVnb3J5XG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gW21lc3NhZ2VGcm9tUXVlcnlFdmVudChldmVudCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQoZXZlbnQsIHN1Z2dlc3Rpb25zKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZXNcbiAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPT09IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5hdHRyaWJ1dGVzLmZvcm1UeXBlICE9PSBGb3JtVHlwZS5Fc2NhbGF0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGZvcm1SZXNwb25zZSAmJiBmb3JtUmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuRm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQoZXZlbnQsIGZvcm1SZXNwb25zZS5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKG1lc3NhZ2UpOiBtZXNzYWdlIGlzIE1lc3NhZ2VbXSA9PiBtZXNzYWdlLmxlbmd0aCA+IDApO1xuXG4gICAgLy8gU29ydCB0aGUgbWVzc2FnZXMgY2hyb25vbG9naWNhbGx5IHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnlcbiAgICBjb25zdCBzb3J0ZWRNZXNzYWdlcyA9IFsuLi5hc3Npc3RhbnRNZXNzYWdlcywgLi4udXNlck1lc3NhZ2VzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+XG4gICAgICAgIG5ldyBEYXRlKGFbMF0uY3JlYXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiWzBdLmNyZWF0ZWRBdCkuZ2V0VGltZSgpXG4gICAgKTtcblxuICAgIHJldHVybiB7IHJlc3BvbnNlcywgdXNlckV2ZW50cywgc3VnZ2VzdGlvbnMsIG1lc3NhZ2VzOiBzb3J0ZWRNZXNzYWdlcyB9O1xuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkRXZlbnQgPSBhc3luYyAoXG4gICAgcGF5bG9hZDogU3VwcG9ydGVkRXZlbnRSZXF1ZXN0XG4gICk6IFByb21pc2U8U3VwcG9ydGVkRXZlbnQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MVN1cHBvcnRlZEV2ZW50UG9zdFJhdyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBTdXBwb3J0ZWRFdmVudFJlcXVlc3Q6XG4gICAgICAgICAgICAgIGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIEpTT05cbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZVRleHQgPSBhd2FpdCByYXdSZXNwb25zZS5yYXcudGV4dCgpO1xuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlSnNvbiA9IEpTT04ucGFyc2UoaHR0cFJlc3BvbnNlVGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmh0dHBSZXNwb25zZUpzb24sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogaHR0cFJlc3BvbnNlSnNvbi5udW1fb2ZfcmV2aWV3cyxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogaHR0cFJlc3BvbnNlSnNvbi5tZXJjaGFudF90YWdzIHx8IFtdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcIkZhaWxlZCB0byBnZXQgcmVzcG9uc2UgZm9yIHYxU3VwcG9ydGVkRXZlbnRQb3N0XCIsIHtcbiAgICAgICAgZXJyLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgICAgICByZWFkeTogZmFsc2UsXG4gICAgICAgIGNhdGVnb3J5OiB1bmRlZmluZWQsXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbXSxcbiAgICAgICAgbnVtYmVyT2ZSZXZpZXdzOiB1bmRlZmluZWQsXG4gICAgICAgIHRvcF9jYXRlZ29yeTogdW5kZWZpbmVkLFxuICAgICAgICBtZXJjaGFudF90YWdzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBpZGVudGlmeVVzZXIgPSBhc3luYyAoXG4gICAgc3BpZmZ5VXNlcklkOiBzdHJpbmcsXG4gICAgbWVyY2hhbnRVc2VySWQ6IHN0cmluZyxcbiAgICB1YURldGFpbHM6IENsaWVudERldGFpbHNcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUFuYWx5dGljc0lkZW50aWZ5UG9zdCh7XG4gICAgICAgIEFuYWx5dGljc0lkZW50aWZ5UmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJfaWQ6IHNwaWZmeVVzZXJJZCxcbiAgICAgICAgICBvc19uYW1lOiB1YURldGFpbHMub3MsXG4gICAgICAgICAgb3NfdmVyc2lvbjogdWFEZXRhaWxzLm9zVmVyc2lvbixcbiAgICAgICAgICBwbGF0Zm9ybTogdWFEZXRhaWxzLm9zLFxuICAgICAgICAgIGRldmljZV9pZDogdWFEZXRhaWxzLmRldmljZU1vZGVsLFxuICAgICAgICAgIGRldmljZV9icmFuZDogdWFEZXRhaWxzLmRldmljZUJyYW5kLFxuICAgICAgICAgIGRldmljZV9tYW51ZmFjdHVyZXI6IHVhRGV0YWlscy5kZXZpY2VNYW51ZmFjdHVyZXIsXG4gICAgICAgICAgZGV2aWNlX21vZGVsOiB1YURldGFpbHMuZGV2aWNlTW9kZWwsXG4gICAgICAgICAgdXNlcl9wcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjZHBfdXNlcl9pZDogbWVyY2hhbnRVc2VySWQsXG4gICAgICAgICAgICBicm93c2VyOiB1YURldGFpbHMuYnJvd3NlcixcbiAgICAgICAgICAgIGJyb3dzZXJfdmVyc2lvbjogdWFEZXRhaWxzLmJyb3dzZXJWZXJzaW9uLFxuICAgICAgICAgICAgdXNlcl9hZ2VudDogdWFEZXRhaWxzLnVzZXJBZ2VudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJGYWlsZWQgdG8gaWRlbnRpZnkgdXNlclwiLCBlcnIpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBtYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZSA9IChcbiAgICBzb3VyY2U6IENvbnRleHRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkXG4gICk6IFYxT3JnQ29uZmlnR2V0U291cmNlRW51bSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLkZvcms6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uRm9yaztcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uUGxheWdyb3VuZDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5QbGF5Z3JvdW5kO1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5BcHA6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uQXBwO1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5UZXN0OlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlRlc3Q7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIG5ldyB2YWx1ZXMgYXJlIGFkZGVkIHRvIENvbnRleHRTb3VyY2VFbnVtLCB3ZSBjYXRjaCBpdFxuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gc291cmNlO1xuICAgICAgICByZXR1cm4gZXhoYXVzdGl2ZUNoZWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0T3JnQ29uZmlnID0gYXN5bmMgKFxuICAgIHVzZXJfaWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPE9yZ0NvbmZpZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICAgIGNvbnN0IHJlYWN0QXBwTmFtZSA9IGF0b21TdG9yZS5nZXQocmVhY3RBcHBOYW1lQXRvbSk7XG4gICAgICBjb25zdCBjb250ZXh0U291cmNlID0gYXRvbVN0b3JlLmdldChjb250ZXh0U291cmNlQXRvbSk7XG4gICAgICBjb25zdCBmZWF0dXJlRmxhZ1NlcnZpY2UgPSBhdG9tU3RvcmUuZ2V0KGZlYXR1cmVGbGFnU2VydmljZUF0b20pOyAvLyBHZXQgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICBjb25zdCByZXF1ZXN0OiBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QgPSB7XG4gICAgICAgIG5hbWVzcGFjZTogcmVhY3RBcHBOYW1lLFxuICAgICAgICB1c2VyX2lkLFxuICAgICAgICBzb3VyY2U6IHRoaXMubWFwQ29udGV4dFNvdXJjZVRvVjFPcmdDb25maWdHZXRTb3VyY2UoY29udGV4dFNvdXJjZSksXG4gICAgICAgIGluY2x1ZGVfZXhwZXJpbWVudHM6IE9iamVjdC52YWx1ZXMoUHJvZHVjdEV4cGVyaW1lbnQpLFxuICAgICAgICBpbmNsdWRlX2ZlYXR1cmVfZ2F0ZXM6IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgIGZlYXR1cmVGbGFnU2VydmljZT8uZmVhdHVyZUZsYWdTZXJ2aWNlPy5nZXRGZWF0dXJlRmxhZ3MoKSB8fCB7fVxuICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcigoWywgaXNFbmFibGVkXSkgPT4gaXNFbmFibGVkKVxuICAgICAgICAgIC5tYXAoKFtmZWF0dXJlR2F0ZU5hbWVdKSA9PiBmZWF0dXJlR2F0ZU5hbWUpLCAvLyBVc2UgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFPcmdDb25maWdHZXQoXG4gICAgICAgICAgcmVxdWVzdFxuICAgICAgICApO1xuXG4gICAgICByZXR1cm4gdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzKHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihgRmFpbGVkIHRvIGdldCBvcmcgY29uZmlnYCwgZXJyLCB7IGVyciB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBhZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb24gPSBhc3luYyAoXG4gICAgc3BpZmZ5VXNlcklkOiBzdHJpbmcsXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBjdXN0b21lclNlcnZpY2VQcm92aWRlcjogQ3VzdG9tZXJTZXJ2aWNlUHJvdmlkZXJcbiAgKSA9PiB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oXG4gICAgICBgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uIC0gdXNlcl9pZD0ke3NwaWZmeVVzZXJJZH0gZW1haWw9JHtlbWFpbH0gY3VzdG9tZXJfc2VydmljZV9wcm92aWRlcj0ke2N1c3RvbWVyU2VydmljZVByb3ZpZGVyfWBcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmN1c3RvbWVyU2VydmljZUFwaS52MUN1c3RzZXJ2aWNlQWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uUG9zdChcbiAgICAgICAge1xuICAgICAgICAgIEFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHNwaWZmeV91c2VyX2lkOiBzcGlmZnlVc2VySWQsXG4gICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgIGN1c3RvbWVyX3NlcnZpY2VfcHJvdmlkZXI6IGN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJGYWlsZWQgdG8gYWRkIG5vdGUgdG8gbGF0ZXN0IGNvbnZlcnNhdGlvblwiLCB7IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldEN1c3RvbWVyU2VydmljZUFwaSA9ICgpID0+XG4gICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1lcmNlQXBpQ2xpZW50O1xuIiwiaW1wb3J0IFJlYWN0LCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbiAgdXNlRWZmZWN0LFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBVQVBhcnNlciBmcm9tIFwidWEtcGFyc2VyLWpzXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCJzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXJcIjtcbmltcG9ydCBDb21tZXJjZUFwaUNsaWVudCBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2NvbW1lcmNlLWFwaVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgeyBDbGllbnREZXRhaWxzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvY2xpZW50RGV0YWlsc1wiO1xuaW1wb3J0IHsgdXNlTG9jYWxTdG9yYWdlIH0gZnJvbSBcInNyYy9jb250ZXh0cy9sb2NhbFN0b3JhZ2VDb250ZXh0XCI7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBzZXJ2aWNlXG5jb25zdCBnZXRVc2VyQWdlbnREZXRhaWxzID0gKCk6IENsaWVudERldGFpbHMgPT4ge1xuICBjb25zdCB1YVBhcnNlciA9IG5ldyBVQVBhcnNlcigpO1xuICBjb25zdCByZXN1bHQgPSB1YVBhcnNlci5nZXRSZXN1bHQoKTtcblxuICByZXR1cm4ge1xuICAgIG9zOiByZXN1bHQ/Lm9zPy5uYW1lLFxuICAgIG9zVmVyc2lvbjogcmVzdWx0Py5vcz8udmVyc2lvbixcbiAgICBkZXZpY2VCcmFuZDogcmVzdWx0Py5kZXZpY2U/LnZlbmRvcixcbiAgICBkZXZpY2VNYW51ZmFjdHVyZXI6IHJlc3VsdD8uZGV2aWNlPy52ZW5kb3IsXG4gICAgZGV2aWNlTW9kZWw6IHJlc3VsdD8uZGV2aWNlPy5tb2RlbCxcbiAgICBicm93c2VyOiByZXN1bHQ/LmJyb3dzZXI/Lm5hbWUsXG4gICAgYnJvd3NlclZlcnNpb246IHJlc3VsdD8uYnJvd3Nlcj8udmVyc2lvbixcbiAgICB1c2VyQWdlbnQ6IHJlc3VsdD8udWEsXG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJZGVudGl0eUNvbnRleHRUeXBlIHtcbiAgaWRlbnRpZnlVc2VyOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBnZXRVc2VySWRPckRlZmF1bHQ6ICgpID0+IHN0cmluZztcbiAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZTogKHVzZXJJZDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2U6ICh1c2VySWQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2U6ICgpID0+IHZvaWQ7XG4gIGlzUmVhZHk6IGJvb2xlYW47XG59XG5cbmNvbnN0IFVzZXJJZGVudGl0eUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFVzZXJJZGVudGl0eUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkPihcbiAgdW5kZWZpbmVkXG4pO1xuXG5leHBvcnQgY29uc3QgVXNlcklkZW50aXR5UHJvdmlkZXI6IFJlYWN0LkZDPHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9PiA9ICh7XG4gIGNoaWxkcmVuLFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgZ2V0SXRlbSxcbiAgICBzZXRJdGVtLFxuICAgIGlzQXZhaWxhYmxlOiBsb2NhbFN0b3JhZ2VJc1JlYWR5LFxuICB9ID0gdXNlTG9jYWxTdG9yYWdlKCk7XG5cbiAgY29uc3QgW2lzUmVhZHksIHNldElzUmVhZHldID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gQXNzdW1pbmcgQ29tbWVyY2VBcGlDbGllbnQgYW5kIG90aGVyIGRlcGVuZGVuY2llcyBhcmUgcmVhZHkgaWYgbG9jYWxTdG9yYWdlIGlzLlxuICAgIC8vIEluIGEgbW9yZSBjb21wbGV4IHNjZW5hcmlvLCB5b3UgbWlnaHQgaGF2ZSBtb3JlIGNoZWNrcyBoZXJlLlxuICAgIHNldElzUmVhZHkobG9jYWxTdG9yYWdlSXNSZWFkeSk7XG4gIH0sIFtsb2NhbFN0b3JhZ2VJc1JlYWR5XSk7XG5cbiAgY29uc3QgVVNFUl9JRF9PVkVSUklERV9LRVkgPSBcInYxLXNwaWZmeS11c2VyLWlkLW92ZXJyaWRlXCI7XG4gIGNvbnN0IFVTRVJfSURfREVGQVVMVF9LRVkgPSBcInYxLXNwaWZmeS11c2VyLWlkLWRlZmF1bHRcIjtcblxuICBjb25zdCBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKTpcbiAgICB8IHN0cmluZ1xuICAgIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gZ2V0SXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSkgPz8gdW5kZWZpbmVkO1xuICB9LCBbZ2V0SXRlbV0pO1xuXG4gIGNvbnN0IGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soKCk6XG4gICAgfCBzdHJpbmdcbiAgICB8IHVuZGVmaW5lZCA9PiB7XG4gICAgcmV0dXJuIGdldEl0ZW0oVVNFUl9JRF9ERUZBVUxUX0tFWSkgPz8gdW5kZWZpbmVkO1xuICB9LCBbZ2V0SXRlbV0pO1xuXG4gIGNvbnN0IHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1c2VySWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgICAgYHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSAtIFNldHRpbmcgdXNlcl9pZD0ke3VzZXJJZH1gXG4gICAgICApO1xuICAgICAgc2V0SXRlbShVU0VSX0lEX0RFRkFVTFRfS0VZLCB1c2VySWQpO1xuICAgICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgICByZXR1cm4gdXNlcklkO1xuICAgIH0sXG4gICAgW3NldEl0ZW0sIFVTRVJfSURfREVGQVVMVF9LRVldXG4gICk7XG5cbiAgY29uc3Qgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1c2VySWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgICAgYHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgLSBTZXR0aW5nIHVzZXJfaWQ9JHt1c2VySWR9YFxuICAgICAgKTtcbiAgICAgIHNldEl0ZW0oVVNFUl9JRF9PVkVSUklERV9LRVksIHVzZXJJZCk7XG4gICAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudCBpcyBoYW5kbGVkIGJ5IHVzZUxvY2FsU3RvcmFnZSBub3dcbiAgICAgIHJldHVybiB1c2VySWQ7XG4gICAgfSxcbiAgICBbc2V0SXRlbSwgVVNFUl9JRF9PVkVSUklERV9LRVldXG4gICk7XG5cbiAgY29uc3QgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIExvZ2dlci5sb2dJbmZvKGBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgLSBDbGVhcmluZyB1c2VyX2lkYCk7XG4gICAgLy8gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRMb2NhbFN0b3JhZ2UoKT8ucmVtb3ZlSXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSk7XG4gICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgc2V0SXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSwgXCJcIik7IC8vIFNldCB0byBlbXB0eSBzdHJpbmcgdG8gY2xlYXJcbiAgfSwgW3NldEl0ZW0sIFVTRVJfSURfT1ZFUlJJREVfS0VZXSk7XG5cbiAgY29uc3QgZ2V0VXNlcklkT3JEZWZhdWx0ID0gdXNlQ2FsbGJhY2soKCk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgdXNlcklkT3ZlcnJpZGUgPSBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAodXNlcklkT3ZlcnJpZGUpIHtcbiAgICAgIHJldHVybiB1c2VySWRPdmVycmlkZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VXNlcklkID0gZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoZGVmYXVsdFVzZXJJZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRVc2VySWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZShgc3BpZmZ5LXVzZXItaWQtJHt1dWlkKCl9YCk7XG4gIH0sIFtcbiAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICBdKTtcblxuICBjb25zdCBpZGVudGlmeVVzZXIgPSB1c2VDYWxsYmFjayhhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFpc1JlYWR5KSB7XG4gICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgXCJbVXNlcklkZW50aXR5Q29udGV4dF0gQ29udGV4dCBub3QgcmVhZHksIHNraXBwaW5nIGlkZW50aWZ5VXNlclwiLFxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRlbXBvcmFyaWx5IGNvbW1lbnRlZCBvdXQgdW50aWwgV2luZG93RGF0YUxheWVyU2VydmljZSBpcyByZXNvbHZlZFxuICAgICAgLy8gY29uc3QgY2RwVXNlcklkID0gV2luZG93RGF0YUxheWVyU2VydmljZS5nZXRHb29nbGVBbmFseXRpY3NDbGllbnRJZCgpO1xuICAgICAgY29uc3QgY2RwVXNlcklkID0gXCJVTktOT1dOX0NEUF9VU0VSX0lEXCI7IC8vIFBsYWNlaG9sZGVyXG4gICAgICBjb25zdCB1c2VySWQgPSBnZXRVc2VySWRPckRlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHVzZXJBZ2VudERldGFpbHMgPSBnZXRVc2VyQWdlbnREZXRhaWxzKCk7XG5cbiAgICAgIGlmICghY2RwVXNlcklkKSB7XG4gICAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAgIFwiW3NwaWZmeS1haV0gTm8gR0EgQ2xpZW50IElEIGZvdW5kLCBza2lwcGluZyBpZGVudGlmeVVzZXJcIixcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5pZGVudGlmeVVzZXIodXNlcklkLCBjZHBVc2VySWQsIHVzZXJBZ2VudERldGFpbHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJbc3BpZmZ5LWFpXSBFcnJvciBpZGVudGlmeWluZyB1c2VyXCIsIGVycm9yKTtcbiAgICB9XG4gIH0sIFtpc1JlYWR5LCBnZXRVc2VySWRPckRlZmF1bHRdKTtcblxuICBjb25zdCB2YWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIGlkZW50aWZ5VXNlcixcbiAgICAgIGdldFVzZXJJZE9yRGVmYXVsdCxcbiAgICAgIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGlzUmVhZHksXG4gICAgfSksXG4gICAgW1xuICAgICAgaWRlbnRpZnlVc2VyLFxuICAgICAgZ2V0VXNlcklkT3JEZWZhdWx0LFxuICAgICAgZ2V0VXNlcklkT3ZlcnJpZGVGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWREZWZhdWx0SW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBzZXRVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgY2xlYXJVc2VySWRPdmVycmlkZUluTG9jYWxTdG9yYWdlLFxuICAgICAgaXNSZWFkeSxcbiAgICBdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8VXNlcklkZW50aXR5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17dmFsdWV9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvVXNlcklkZW50aXR5Q29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VVc2VySWRlbnRpdHkgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFVzZXJJZGVudGl0eUNvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcInVzZVVzZXJJZGVudGl0eSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgVXNlcklkZW50aXR5UHJvdmlkZXJcIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiaW1wb3J0IHsgYXRvbVdpdGhTdG9yYWdlIH0gZnJvbSAnam90YWkvdXRpbHMnO1xuaW1wb3J0IHsgYXRvbSB9IGZyb20gJ2pvdGFpJztcbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50UmVzcG9uc2UsIFBhZ2VWaXNpdENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7XG4gIFBhZ2VWaXNpdFZhcmlhbnRJbmZvLFxuICBQRFBWYXJpYW50SW5mbyxcbiAgUExQVmFyaWFudEluZm8sXG4gIFZhcmlhbnRJbmZvLFxuICBWYXJpYW50VHlwZUVudW0sXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgc2Vzc2lvblN0b3JhZ2VVdGlsIH0gZnJvbSAnc3JjL2F0b21zL2F0b21TdG9yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcG9ydGVkRXZlbnRcbiAgZXh0ZW5kcyBQaWNrPFxuICAgIFN1cHBvcnRlZEV2ZW50UmVzcG9uc2UsXG4gICAgJ3N1cHBvcnRlZCcgfCAncmVhZHknIHwgJ2NhdGVnb3J5JyB8ICdjb2xsZWN0aW9ucycgfCAndG9wX2NhdGVnb3J5J1xuICA+IHtcbiAgbnVtYmVyT2ZSZXZpZXdzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG1lcmNoYW50X3RhZ3M/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFBEUEF0dHJpYnV0ZXMge1xuICBwcm9kdWN0X2lkPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUExQQXR0cmlidXRlcyB7XG4gIGF0dHJpYnV0ZXM/OiB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsUmVzb2x2aW5nUERQQ29uZmlnIHtcbiAgcGRwX2F0dHJpYnV0ZXM6IFBEUEF0dHJpYnV0ZXM7XG4gIG51bWJlcl9vZl9yZXZpZXdzPzogbnVtYmVyO1xuICBjb2xsZWN0aW9ucz86IHN0cmluZ1tdO1xuICBtZXJjaGFudF90YWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsUmVzb2x2aW5nUExQQ29uZmlnIHtcbiAgcGxwX2F0dHJpYnV0ZXM6IFBMUEF0dHJpYnV0ZXM7XG4gIHRvcF9jYXRlZ29yeT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFVybFJlc29sdmluZ0dlbmVyaWNDb25maWcge1xuICBkZXRhaWxzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQYWdlVmFyaWFudENoZWNrQ29uZmlnID0ge1xuICBjaGVja190eXBlOiBzdHJpbmc7XG4gIGZlYXR1cmVfZ2F0ZT86IHN0cmluZztcbiAgZXh0cmFjdG9yPzoge1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBtYXA/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gIH07XG4gIHByb2R1Y3RfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwcm9kdWN0X2lkcz86IHN0cmluZ1tdO1xuICBwbHBfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwbHBfaWRzPzogc3RyaW5nW107XG4gIGNvbGxlY3Rpb25zPzogc3RyaW5nW107XG4gIHF1ZXJ5X3BhcmFtPzogc3RyaW5nO1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgdG9wX2NhdGVnb3J5Pzogc3RyaW5nW107XG4gIHJldmlld19taW5pbXVtPzogbnVtYmVyO1xuICBtZXJjaGFudF90YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrZW5kV2lkZ2V0TW91bnRpbmdDb25maWcgPSB7XG4gIG1vdW50aW5nX2NvbmZpZ19pZDogc3RyaW5nO1xuICB3aWRnZXRfY29uZmlnX2lkPzogc3RyaW5nO1xuICBtb3VudGluZ19wb2ludF93aWRnZXRzPzogQXJyYXk8e1xuICAgIGNoZWNrczogUGFnZVZhcmlhbnRDaGVja0NvbmZpZ1tdO1xuICAgIHdpZGdldF9jb25maWdfaWQ6IHN0cmluZztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrZW5kUGFnZVZhcmlhbnRDb25maWcgPSB7XG4gIHZhcmlhbnRfaWQ6IHN0cmluZztcbiAgdmFyaWFudF90eXBlOiBzdHJpbmc7XG4gIHZhcmlhbnRfY2hlY2tzOiBQYWdlVmFyaWFudENoZWNrQ29uZmlnW107XG4gIHdpZGdldF9tb3VudGluZzogQmFja2VuZFdpZGdldE1vdW50aW5nQ29uZmlnW107XG4gIHBscF9pZF9leHRyYWN0b3I/OiBzdHJpbmc7XG4gIHByb2R1Y3RfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwYXJlbnRfcHJvZHVjdF9pZF9leHRyYWN0b3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVybFJlc29sdmVyUmVzcG9uc2Uge1xuICB2YXJpYW50X3R5cGU6IHN0cmluZztcbiAgc3BlY2lmaWNfZGV0YWlsczogVXJsUmVzb2x2aW5nUERQQ29uZmlnIHwgVXJsUmVzb2x2aW5nUExQQ29uZmlnIHwgVXJsUmVzb2x2aW5nR2VuZXJpY0NvbmZpZztcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHVzZXJfZXZlbnQ/OiB7XG4gICAgZXZlbnRfaWQ/OiBzdHJpbmc7XG4gICAgYXR0cmlidXRlcz86IFBEUEF0dHJpYnV0ZXMgfCBQTFBBdHRyaWJ1dGVzO1xuICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gIH07XG4gIHBhZ2VfdmFyaWFudD86IEJhY2tlbmRQYWdlVmFyaWFudENvbmZpZztcbn1cblxuLy8gVXNlIGEgbWFwIGZvciBwZXItVVJMIGNhY2hlXG5leHBvcnQgdHlwZSBVcmxSZXNvbHZlckNhY2hlID0gUmVjb3JkPHN0cmluZywgVXJsUmVzb2x2ZXJSZXNwb25zZSB8IHVuZGVmaW5lZD47XG5cbmNvbnN0IGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAnc3BpZmZ5LXVybC1yZXNvbHZlcicsXG4gIHVuZGVmaW5lZCxcbiAgc2Vzc2lvblN0b3JhZ2VVdGlsLFxuICB7XG4gICAgZ2V0T25Jbml0OiB0cnVlLFxuICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IHVybFJlc29sdmVyQXRvbSA9IGF0b20oXG4gIChnZXQpOiBVcmxSZXNvbHZlckNhY2hlID0+IHtcbiAgICBjb25zdCBtYXliZVVybFJlc29sdmVyID0gZ2V0KGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSk7XG4gICAgaWYgKG1heWJlVXJsUmVzb2x2ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShtYXliZVVybFJlc29sdmVyKTtcbiAgfSxcbiAgKGdldCwgc2V0LCB2YWx1ZTogeyB1cmw6IHN0cmluZzsgcmVzcG9uc2U6IFVybFJlc29sdmVyUmVzcG9uc2UgfCB1bmRlZmluZWQgfSkgPT4ge1xuICAgIC8vIEdldCBjdXJyZW50IGNhY2hlIGZyb20gc3RvcmFnZVxuICAgIGNvbnN0IGN1cnJlbnRDYWNoZSA9IGdldCh1cmxSZXNvbHZlckF0b20pO1xuICAgIGNvbnN0IG5ld0NhY2hlID0geyAuLi5jdXJyZW50Q2FjaGUsIFt2YWx1ZS51cmxdOiB2YWx1ZS5yZXNwb25zZSB9O1xuXG4gICAgc2V0KGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSwgSlNPTi5zdHJpbmdpZnkobmV3Q2FjaGUpKTtcbiAgfSxcbik7XG5cbmNvbnN0IGludGVybmFsU3RvcmFnZVN1cHBvcnRlZEV2ZW50QXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAnc3BpZmZ5LXN1cHBvcnRlZC1ldmVudCcsXG4gIHVuZGVmaW5lZCxcbiAgc2Vzc2lvblN0b3JhZ2VVdGlsLFxuICB7XG4gICAgZ2V0T25Jbml0OiB0cnVlLFxuICB9LFxuKTtcbmNvbnN0IGludGVybmFsU3VwcG9ydGVkRXZlbnRBdG9tID0gYXRvbTxTdXBwb3J0ZWRFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRlZEV2ZW50QXRvbSA9IGF0b20oXG4gIChnZXQpOiBTdXBwb3J0ZWRFdmVudCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgbWF5YmVTdXBwb3J0ZWRFdmVudCA9IGdldChpbnRlcm5hbFN0b3JhZ2VTdXBwb3J0ZWRFdmVudEF0b20pO1xuICAgIGlmIChtYXliZVN1cHBvcnRlZEV2ZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETyB0aGlzIGlzIGFuIHVudmFsaWRhdGVkIHBhcnNlLiBJdCBtYXkgYmUgYmV0dGVyIHRvIGltcGxlbWVudCBhIGN1c3RvbSBzdG9yYWdlIHV0aWxcbiAgICAvLyBhbmQgcGVyZm9ybSB0aGUgb2JqZWN0IHZhbGlkYXRpb24gb24gXCJnZXRcIiB0aGVyZS5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShtYXliZVN1cHBvcnRlZEV2ZW50KTtcbiAgfSxcbiAgKF8sIHNldCwgdmFsdWU6IFN1cHBvcnRlZEV2ZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHNldChpbnRlcm5hbFN0b3JhZ2VTdXBwb3J0ZWRFdmVudEF0b20sIHVuZGVmaW5lZCk7XG4gICAgICBzZXQoaW50ZXJuYWxTdXBwb3J0ZWRFdmVudEF0b20sIHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0KGludGVybmFsU3VwcG9ydGVkRXZlbnRBdG9tLCB2YWx1ZSk7XG4gICAgc2V0KGludGVybmFsU3RvcmFnZVN1cHBvcnRlZEV2ZW50QXRvbSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfSxcbik7XG5cbmNvbnN0IGludGVybmFsVmFyaWFudElkQXRvbSA9IGF0b208c3RyaW5nPigpO1xuY29uc3QgaW50ZXJuYWxQcm9kdWN0SWRBdG9tID0gYXRvbTxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcm5hbFBhcmVudFByb2R1Y3RJZEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUHJvZHVjdFVybEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUGxwSWRBdG9tID0gYXRvbTxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcm5hbFVybEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUGFnZVZpc2l0Q2F0ZWdvcnlBdG9tID0gYXRvbTxQYWdlVmlzaXRDYXRlZ29yeT4oKTtcbmNvbnN0IGludGVybmFsVmFyaWFudEF0b20gPSBhdG9tPCdwZHAnIHwgJ3BscCcgfCAnc2VhcmNoJyB8ICdwYWdlX3Zpc2l0Jz4oJ3BkcCcpO1xuXG5leHBvcnQgY29uc3QgdmFyaWFudElkQXRvbSA9IGF0b20oKGdldCkgPT4gZ2V0KGludGVybmFsVmFyaWFudElkQXRvbSkpO1xuZXhwb3J0IGNvbnN0IHByb2R1Y3RJZEF0b20gPSBhdG9tKChnZXQpID0+IGdldChpbnRlcm5hbFByb2R1Y3RJZEF0b20pKTtcbmV4cG9ydCBjb25zdCBwYXJlbnRQcm9kdWN0SWRBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQYXJlbnRQcm9kdWN0SWRBdG9tKSk7XG5leHBvcnQgY29uc3QgcHJvZHVjdFVybEF0b20gPSBhdG9tKChnZXQpID0+IGdldChpbnRlcm5hbFByb2R1Y3RVcmxBdG9tKSk7XG5leHBvcnQgY29uc3QgcGxwSWRBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQbHBJZEF0b20pKTtcbmV4cG9ydCBjb25zdCB1cmxBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxVcmxBdG9tKSk7XG5leHBvcnQgY29uc3QgcGFnZVZpc2l0Q2F0ZWdvcnlBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQYWdlVmlzaXRDYXRlZ29yeUF0b20pKTtcbmV4cG9ydCBjb25zdCB2YXJpYW50QXRvbSA9IGF0b20oKGdldCkgPT4gZ2V0KGludGVybmFsVmFyaWFudEF0b20pKTtcbmV4cG9ydCBjb25zdCBoYXNQYXJzZWRWYXJpYW50SW5mb0F0b20gPSBhdG9tKGZhbHNlKTtcblxuZXhwb3J0IGNvbnN0IHZhcmlhbnRJbmZvQXRvbSA9IGF0b20oXG4gIChnZXQpOiBWYXJpYW50SW5mbyA9PiB7XG4gICAgY29uc3QgdmFyaWFudCA9IGdldCh2YXJpYW50QXRvbSk7XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QZHApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBwcm9kdWN0SWQ6IGdldChwcm9kdWN0SWRBdG9tKSxcbiAgICAgICAgcGFyZW50UHJvZHVjdElkOiBnZXQocGFyZW50UHJvZHVjdElkQXRvbSksXG4gICAgICAgIHVybDogZ2V0KHVybEF0b20pLFxuICAgICAgfSBhcyBQRFBWYXJpYW50SW5mbztcbiAgICB9XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QbHApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBwbHBJZDogZ2V0KHBscElkQXRvbSksXG4gICAgICAgIHVybDogZ2V0KHVybEF0b20pLFxuICAgICAgfSBhcyBQTFBWYXJpYW50SW5mbztcbiAgICB9XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QYWdlVmlzaXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICB1cmw6IGdldCh1cmxBdG9tKSxcbiAgICAgICAgcGFnZVZpc2l0Q2F0ZWdvcnk6IGdldChwYWdlVmlzaXRDYXRlZ29yeUF0b20pLFxuICAgICAgfSBhcyBQYWdlVmlzaXRWYXJpYW50SW5mbztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhcmlhbnRJbmZvIGRldGFpbHMnKTtcbiAgfSxcbiAgKF8sIHNldCwgbmV3VmFyaWFudDogVmFyaWFudEluZm8pID0+IHtcbiAgICBzZXQoaW50ZXJuYWxWYXJpYW50QXRvbSwgbmV3VmFyaWFudC52YXJpYW50KTtcbiAgICBzZXQoaW50ZXJuYWxWYXJpYW50SWRBdG9tLCBuZXdWYXJpYW50LnZhcmlhbnRJZCk7XG4gICAgaWYgKG5ld1ZhcmlhbnQudmFyaWFudCA9PT0gVmFyaWFudFR5cGVFbnVtLlBkcCkge1xuICAgICAgc2V0KGludGVybmFsUHJvZHVjdElkQXRvbSwgbmV3VmFyaWFudC5wcm9kdWN0SWQpO1xuICAgICAgc2V0KGludGVybmFsUGFyZW50UHJvZHVjdElkQXRvbSwgbmV3VmFyaWFudC5wYXJlbnRQcm9kdWN0SWQpO1xuICAgICAgc2V0KGludGVybmFsVXJsQXRvbSwgbmV3VmFyaWFudC51cmwpO1xuICAgIH1cbiAgICBpZiAobmV3VmFyaWFudC52YXJpYW50ID09PSBWYXJpYW50VHlwZUVudW0uUGxwKSB7XG4gICAgICBzZXQoaW50ZXJuYWxQbHBJZEF0b20sIG5ld1ZhcmlhbnQucGxwSWQpO1xuICAgICAgc2V0KGludGVybmFsVXJsQXRvbSwgbmV3VmFyaWFudC51cmwpO1xuICAgIH1cbiAgICBpZiAobmV3VmFyaWFudC52YXJpYW50ID09PSBWYXJpYW50VHlwZUVudW0uUGFnZVZpc2l0KSB7XG4gICAgICBzZXQoaW50ZXJuYWxVcmxBdG9tLCBuZXdWYXJpYW50LnVybCk7XG4gICAgICBzZXQoaW50ZXJuYWxQYWdlVmlzaXRDYXRlZ29yeUF0b20sIG5ld1ZhcmlhbnQucGFnZVZpc2l0Q2F0ZWdvcnkpO1xuICAgIH1cbiAgfSxcbik7XG4iLCJpbXBvcnQge1xuICBDb250ZXh0RW52RW51bSxcbiAgQ29udGV4dFNvdXJjZUVudW0sXG59IGZyb20gXCJAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnRcIjtcbmltcG9ydCB7IGF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGF0b21XaXRoU3RvcmFnZSB9IGZyb20gXCJqb3RhaS91dGlsc1wiO1xuaW1wb3J0IHsgVmFyaWFudEluZm8gfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHsgVXNlcklkZW50aXR5Q29udGV4dFR5cGUsIHVzZVVzZXJJZGVudGl0eSB9IGZyb20gXCJzcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0XCI7XG5pbXBvcnQgeyB2YXJpYW50SW5mb0F0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcC92YXJpYW50XCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IGNvbnRleHRTb3VyY2VBdG9tIH0gZnJvbSBcIi4uL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBcHBEZXRhaWxzIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgb3JnU2hvcnROYW1lOiBzdHJpbmc7XG4gIGNoYXRJZDogc3RyaW5nO1xuICB1c2VySWQ6IHN0cmluZztcbiAgc291cmNlOiBDb250ZXh0U291cmNlRW51bTtcbiAgZW52OiBDb250ZXh0RW52RW51bTtcbiAgdmFyaWFudEluZm86IFZhcmlhbnRJbmZvO1xufVxuXG5leHBvcnQgeyB2YXJpYW50SW5mb0F0b20gfSBmcm9tIFwiLi92YXJpYW50XCI7XG5cbmNvbnN0IGludGVybmFsVXNlcklkQXRvbSA9IGF0b208c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3QgdXNlcklkQXRvbSA9IGF0b20oXG4gIChnZXQpID0+IHtcbiAgICBjb25zdCBtYXliZVVzZXJJZCA9IGdldChpbnRlcm5hbFVzZXJJZEF0b20pO1xuXG4gICAgaWYgKG1heWJlVXNlcklkKSB7XG4gICAgICByZXR1cm4gbWF5YmVVc2VySWQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBnZXRVc2VySWRPckRlZmF1bHQgfSA9IHVzZVVzZXJJZGVudGl0eSgpO1xuICAgIHJldHVybiBnZXRVc2VySWRPckRlZmF1bHQoKTtcbiAgfSxcbiAgKF8sIHNldCwgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIHNldChpbnRlcm5hbFVzZXJJZEF0b20sIHZhbHVlKTtcbiAgfVxuKTtcblxuZXhwb3J0IGNvbnN0IHVzZXJJZGVudGl0eUF0b20gPSBhdG9tPFVzZXJJZGVudGl0eUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkPihcbiAgdW5kZWZpbmVkXG4pO1xuXG5leHBvcnQgY29uc3QgYXBwU291cmNlQXRvbSA9IGF0b208Q29udGV4dFNvdXJjZUVudW0+KFxuICAoZ2V0KTogQ29udGV4dFNvdXJjZUVudW0gPT4gZ2V0KGNvbnRleHRTb3VyY2VBdG9tKSA/PyBDb250ZXh0U291cmNlRW51bS5BcHBcbik7XG5leHBvcnQgY29uc3QgY2hhdElkQXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmc+KFxuICBcInYxLXNwaWZmeS1jaGF0LXNlc3Npb24taWRcIixcbiAgdXVpZCgpLFxuICB1bmRlZmluZWQsXG4gIHtcbiAgICBnZXRPbkluaXQ6IHRydWUsXG4gIH1cbik7XG4iLCJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VBdG9tVmFsdWUgfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSBcIkBhbXBsaXR1ZGUvYW5hbHl0aWNzLWJyb3dzZXJcIjtcbmltcG9ydCB7IEZlYXR1cmVHYXRlcyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlc1wiO1xuaW1wb3J0IHsgT3JnU2hvcnROYW1lIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHNcIjtcbmltcG9ydCB7IEV2ZW50c0Rpc3BhdGNoZXIsIFNwaWZmeUV2ZW50IH0gZnJvbSBcInNyYy9ldmVudHNcIjtcbmltcG9ydCB7XG4gIGFtcGxpdHVkZUFwaUtleUF0b20sXG4gIGNvbnRleHRTb3VyY2VBdG9tLFxuICBkYXRhUmVzaWRlbmN5QXRvbSxcbiAgaWRlbnRpZnlpbmdQcmVmaXhBdG9tLFxufSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7XG4gIExvY2FsU3RvcmFnZUtleXMsXG4gIHVzZUxvY2FsU3RvcmFnZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9sb2NhbFN0b3JhZ2VDb250ZXh0XCI7XG5pbXBvcnQgeyBvcmdBbmFseXRpY3NHb29nbGVBbmFseXRpY3NDb25maWdBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmcvb3JnQW5hbHl0aWNzQ29uZmlnXCI7XG5pbXBvcnQgeyB1c2VySWRBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9hcHBcIjtcbmltcG9ydCB7IGVudkF0b20gfSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUge1xuICBCcm93c2VyQ2xpZW50LFxuICBFbnJpY2htZW50UGx1Z2luLFxuICBFdmVudCxcbiAgU2VydmVyWm9uZVR5cGUsXG59IGZyb20gXCJAYW1wbGl0dWRlL2FuYWx5dGljcy10eXBlc1wiO1xuaW1wb3J0IHsgdXNlRW52aXZlQ29uZmlnIH0gZnJvbSBcInNyYy9jb250ZXh0cy9lbnZpdmVDb25maWdDb250ZXh0L2Vudml2ZUNvbmZpZ0NvbnRleHRcIjtcbmltcG9ydCB7XG4gIHVzZUZlYXR1cmVGbGFnU2VydmljZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9mZWF0dXJlRmxhZ1NlcnZpY2VDb250ZXh0L2ZlYXR1cmVGbGFnU2VydmljZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZVVzZXJJZGVudGl0eSB9IGZyb20gXCJzcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0XCI7XG5cbmV4cG9ydCBlbnVtIFNwaWZmeU1ldHJpY3NFdmVudE5hbWUge1xuICBCdW5kbGVMb2FkZWQgPSBcIkJ1bmRsZSBMb2FkZWRcIixcbiAgQ2hhdExpdmVBZ2VudEJ0bkNsaWNrID0gXCJDaGF0IExpdmUgQWdlbnQgQnRuIENsaWNrXCIsXG4gIENoYXRGbG9hdGluZ0J1dHRvblZpc2libGUgPSBcIkNoYXQgRmxvYXRpbmcgQnV0dG9uIFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudFZpc2libGUgPSBcIkNoYXQgQ29tcG9uZW50IFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudEV4cGFuZGVkID0gXCJDaGF0IENvbXBvbmVudCBFeHBhbmRlZFwiLFxuICBDaGF0Q29tcG9uZW50Q29sbGFwc2VkID0gXCJDaGF0IENvbXBvbmVudCBDb2xsYXBzZWRcIixcbiAgQ2hhdFVzZXJNZXNzYWdlSW5wdXQgPSBcIkNoYXQgVXNlciBNZXNzYWdlIElucHV0XCIsXG4gIENoYXRTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiQ2hhdCBTdWdnZXN0aW9uIENsaWNrZWRcIixcbiAgQ2hhdEFzc2lzdGFudFJlc3BvbnNlID0gXCJDaGF0IEFzc2lzdGFudCBSZXNwb25zZVwiLFxuICBQcm9kdWN0Q2FyZENsaWNrZWQgPSBcIlByb2R1Y3QgQ2FyZCBDbGlja2VkXCIsXG4gIFByb2R1Y3RSZXZpZXdDYXJkQ2xpY2tlZCA9IFwiUHJvZHVjdCBSZXZpZXcgQ2FyZCBDbGlja2VkXCIsXG4gIEFkZFRvQ2FydENsaWNrZWQgPSBcIkFkZCB0byBDYXJ0IENsaWNrZWRcIixcbiAgUHJvbXB0Q2FyZENsaWNrZWQgPSBcIlByb21wdCBDYXJkIENsaWNrZWRcIixcbiAgU3VwcG9ydGVkRXZlbnQgPSBcIlN1cHBvcnRlZCBFdmVudFwiLFxuICBTZWFyY2hCYWNrVG9SZXNwb25zZUNsaWNrZWQgPSBcIlNlYXJjaCBCYWNrIHRvIFJlc3BvbnNlIENsaWNrZWRcIixcbiAgUGVyZm9ybWFuY2VNZXRyaWNzID0gXCJQZXJmb3JtYW5jZSBNZXRyaWNzXCIsXG4gIFNlYXJjaEJhckNsaWNrZWQgPSBcIlNlYXJjaCBCYXIgQ2xpY2tlZFwiLFxuICBPcmRlckxvb2t1cFN0YXJ0ZWQgPSBcIk9yZGVyIExvb2t1cCBTdGFydGVkXCIsXG4gIE9yZGVyTG9va3VwRm9ybVN1Ym1pdHRlZCA9IFwiT3JkZXIgTG9va3VwIEZvcm0gU3VibWl0dGVkXCIsXG4gIFNlYXJjaENvbXBvbmVudFZpc2libGUgPSBcIlNlYXJjaCBDb21wb25lbnQgVmlzaWJsZVwiLFxuICBTZWFyY2haZXJvU3RhdGVTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiU2VhcmNoIFplcm8gU3RhdGUgU3VnZ2VzdGlvbiBDbGlja2VkXCIsIC8vIFRoaXMgaXMgdGhlIHNjcm9sbGluZyBsaXN0IG9mIHN1Z2dlc3Rpb24gYnV0dG9ucyBpbiBnbG9iYWwgc2VhcmNoXG4gIFNlYXJjaElucHV0U3RhcnRlZCA9IFwiU2VhcmNoIElucHV0IFN0YXJ0ZWRcIixcbiAgU2VhcmNoUXVlcnlTdWJtaXR0ZWQgPSBcIlNlYXJjaCBRdWVyeSBTdWJtaXR0ZWRcIixcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlVmlld2VkID0gJ1NlYXJjaCBBdXRvY29tcGxldGUgVmlld2VkJywgLy8gVE9ETzogYWRkIHRoaXMgd2hlbiBhdXRvY29tcGxldGUgaXMgYWRkZWRcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlQ2xpY2tlZCA9ICdTZWFyY2ggQXV0b2NvbXBsZXRlIENsaWNrZWQnLCAvLyBUT0RPOiBhZGQgdGhpcyB3aGVuIGF1dG9jb21wbGV0ZSBpcyBhZGRlZFxuICBTZWFyY2hSZXN1bHRzVmlld2VkID0gXCJTZWFyY2ggUmVzdWx0cyBWaWV3ZWRcIixcbiAgU2VhcmNoVGltZVRvRmlyc3RDbGljayA9IFwiU2VhcmNoIFRpbWUgdG8gRmlyc3QgQ2xpY2tcIixcbiAgU2VhcmNoWmVyb1Jlc3VsdHNSYXRlID0gXCJTZWFyY2ggWmVybyBSZXN1bHRzIFJhdGVcIixcbiAgU2VhcmNoRmlsdGVyQ2xpY2tlZCA9IFwiU2VhcmNoIEZpbHRlciBDbGlja2VkXCIsXG4gIFNlYXJjaFNvcnRDbGlja2VkID0gXCJTZWFyY2ggU29ydCBDbGlja2VkXCIsXG59XG5cbmludGVyZmFjZSBUcmFja0V2ZW50UGFyYW1zIHtcbiAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lO1xuICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV2ZW50R3JvdXBzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGFsc29TZW5kVG9Hb29nbGVBbmFseXRpY3M/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQW1wbGl0dWRlQ29udGV4dFR5cGUge1xuICB0cmFja0V2ZW50OiAocGFyYW1zOiBUcmFja0V2ZW50UGFyYW1zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBpc1JlYWR5OiBib29sZWFuO1xuICBzZXRTdXBwbGVtZW50YWxEZWZhdWx0UHJvcHM6IChwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEFtcGxpdHVkZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEFtcGxpdHVkZUNvbnRleHRUeXBlIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBjb25zdCBBbXBsaXR1ZGVQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+ID0gKHtcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IHVzZXJJZCA9IHVzZUF0b21WYWx1ZSh1c2VySWRBdG9tKTtcbiAgY29uc3QgYW1wbGl0dWRlQXBpS2V5ID0gdXNlQXRvbVZhbHVlKGFtcGxpdHVkZUFwaUtleUF0b20pO1xuICBjb25zdCBkYXRhUmVzaWRlbmN5ID0gdXNlQXRvbVZhbHVlKGRhdGFSZXNpZGVuY3lBdG9tKTtcbiAgY29uc3Qgb3JnR2FDb25maWcgPSB1c2VBdG9tVmFsdWUob3JnQW5hbHl0aWNzR29vZ2xlQW5hbHl0aWNzQ29uZmlnQXRvbSk7XG4gIGNvbnN0IGVudiA9IHVzZUF0b21WYWx1ZShlbnZBdG9tKTtcbiAgY29uc3QgY29udGV4dFNvdXJjZSA9IHVzZUF0b21WYWx1ZShjb250ZXh0U291cmNlQXRvbSk7XG4gIGNvbnN0IGlkZW50aWZ5aW5nUHJlZml4ID0gdXNlQXRvbVZhbHVlKGlkZW50aWZ5aW5nUHJlZml4QXRvbSk7XG4gIGNvbnN0IHsgZ2V0SXRlbSB9ID0gdXNlTG9jYWxTdG9yYWdlKCk7XG4gIGNvbnN0IHtcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICBmZWF0dXJlR2F0ZXMsXG4gIH0gPSB1c2VFbnZpdmVDb25maWcoKTtcblxuICBjb25zdCB7IGZlYXR1cmVGbGFnU2VydmljZSB9ID0gdXNlRmVhdHVyZUZsYWdTZXJ2aWNlKCk7XG5cbiAgY29uc3QgW2FtcGxpdHVkZUNsaWVudCwgc2V0QW1wbGl0dWRlQ2xpZW50XSA9IFJlYWN0LnVzZVN0YXRlPFxuICAgIEJyb3dzZXJDbGllbnQgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCwgc2V0SW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudF0gPVxuICAgIFJlYWN0LnVzZVN0YXRlPEVucmljaG1lbnRQbHVnaW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFtzdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wc10gPVxuICAgIFJlYWN0LnVzZVN0YXRlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSk7XG5cbiAgY29uc3QgaXNSZWFkeSA9IEJvb2xlYW4oXG4gICAgdXNlcklkICYmIGZlYXR1cmVGbGFnU2VydmljZSAmJiBhbXBsaXR1ZGVBcGlLZXkgJiYgdXNlcklkXG4gICk7XG5cbiAgY29uc3QgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMgPSB1c2VDYWxsYmFjaygoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IGdhdGVzUHJvcHMgPSBmZWF0dXJlR2F0ZXNcbiAgICAgID8gZmVhdHVyZUdhdGVzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgIGlmIChjdXJyLm5hbWUgJiYgY3Vyci52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIFtgZmVhdHVyZV9nYXRlLiR7Y3Vyci5uYW1lfWBdOiBjdXJyLnZhbHVlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiB7fTtcbiAgICBjb25zdCBleHBlcmltZW50UHJvcHMgPSB7fTsgLy8gTm8gZGlyZWN0IGVxdWl2YWxlbnQgZm9yIGV4cGVyaW1lbnRzIGluIEVudml2ZUNvbmZpZyB5ZXRcblxuICAgIGNvbnN0IG9yZ0xldmVsQW1wbGl0dWRlVHJhY2tpbmdQcm9wcyA9IHtcbiAgICAgIC4uLmdhdGVzUHJvcHMsXG4gICAgICAuLi5leHBlcmltZW50UHJvcHMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5vcmdMZXZlbEFtcGxpdHVkZVRyYWNraW5nUHJvcHMsXG4gICAgICAuLi5zdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsXG4gICAgICAvLyBUT0RPOiBvcmdfaWQgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSBpbiBFbnZpdmVDb25maWcuIE5lZWQgdG8gZmluZCBhIG5ldyBzb3VyY2Ugb3IgZGVyaXZlIGl0LlxuICAgICAgLy8gb3JnX2lkOiBvcmdDb25maWc/Lm9yZz8ub3JnPy5pZCxcbiAgICAgIGFwcF9pZDogXCJjb21tZXJjZS1jaGF0LXJlYWN0LWNvbXBvbmVudFwiLFxuICAgICAgY2hhdF9pZDogZ2V0SXRlbShMb2NhbFN0b3JhZ2VLZXlzLkNoYXRJZCksXG4gICAgICBlbnY6IGVudiB8fCBcInVua25vd25cIixcbiAgICAgIGFwcF9zb3VyY2U6IGNvbnRleHRTb3VyY2UsXG4gICAgICBcIm9yZy5zaG9ydF9uYW1lXCI6IG9yZ1Nob3J0TmFtZSxcbiAgICAgIFwidXNlci5pZFwiOiB1c2VySWQsXG4gICAgICBcImNkcC51c2VyX2lkXCI6IG51bGwsXG4gICAgICBcImNkcC5wcm92aWRlclwiOiBudWxsLFxuICAgICAgXCJldmVudC5zb3VyY2VcIjogXCJ3ZWItYnJvd3NlclwiLFxuICAgICAgXCJldmVudC50eXBlXCI6IFwidXNlci1hY3Rpdml0eVwiLFxuICAgICAgXCJldmVudC5pZFwiOiBudWxsLFxuICAgICAgXCJldmVudC5jaGFubmVsXCI6IFwid2ViXCIsXG4gICAgICBcImV2ZW50LnRpbWVzdGFtcFwiOiBudWxsLFxuICAgIH07XG4gIH0sIFtcbiAgICBmZWF0dXJlR2F0ZXMsXG4gICAgc3VwcGxlbWVudGFsRGVmYXVsdFByb3BzLFxuICAgIGVudixcbiAgICBjb250ZXh0U291cmNlLFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICB1c2VySWQsXG4gIF0pO1xuXG4gIGNvbnN0IGV2ZW50UHJvcHNUb1ByZWZpeGVkRXZlbnRQcm9wcyA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICAgIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgY29uc3QgcHJlZml4ID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIl9cIik7XG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZXZlbnRQcm9wcykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBhY2NbYCR7cHJlZml4fS4ke2tleX1gXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCA9IHVzZUNhbGxiYWNrKCgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBpc0VuYWJsZWQgPSBCb29sZWFuKFxuICAgICAgb3JnU2hvcnROYW1lID09PSBPcmdTaG9ydE5hbWUuVW5pcXVlVmludGFnZSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzQ2xpZW50U2Vzc2lvbkVuYWJsZWQoKSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzRmVhdHVyZUdhdGVFbmFibGVkKFxuICAgICAgICAgIEZlYXR1cmVHYXRlcy5Jc05ld0ZlYXR1cmVFbmFibGVkXG4gICAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHNhbXBsZVJhdGUgPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICAgYFtzcGlmZnktYWldIGFtcGxpdHVkZSBzZXNzaW9uLXJlcGxheSBpbml0aWFsaXppbmcgaXNFbmFibGVkPSR7aXNFbmFibGVkfSBzYW1wbGVSYXRlPSR7c2FtcGxlUmF0ZX1gXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBhbXBsaXR1ZGVJbnN0YW5jZS5hZGQoc2Vzc2lvblJlcGxheVBsdWdpbih7IHNhbXBsZVJhdGUgfSkpO1xuXG4gICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgXCJbc3BpZmZ5LWFpXSBFcnJvciBpbml0aWFsaXppbmcgYW1wbGl0dWRlIHNlc3Npb24tcmVwbGF5XCIsXG4gICAgICAgIGVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBbb3JnU2hvcnROYW1lLCBmZWF0dXJlRmxhZ1NlcnZpY2VdKTtcblxuICBjb25zdCBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCA9IHVzZUNhbGxiYWNrKCgpOiBFbnJpY2htZW50UGx1Z2luID0+IHtcbiAgICBpZiAoaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbnJpY2htZW50OiBFbnJpY2htZW50UGx1Z2luID0ge1xuICAgICAgbmFtZTogXCJwYWdlLXZpZXctdHJhY2tpbmctZW5yaWNobWVudFwiLFxuICAgICAgdHlwZTogXCJlbnJpY2htZW50XCIsXG4gICAgICBzZXR1cDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGV2ZW50OiBFdmVudCk6IFByb21pc2U8RXZlbnQ+ID0+IHtcbiAgICAgICAgbGV0IGVucmljaGVkRXZlbnQ6IEV2ZW50O1xuXG4gICAgICAgIGNvbnN0IGV2ZW50c1RvRW5yaWNoID0gW1xuICAgICAgICAgIFwiW0FtcGxpdHVkZV0gUGFnZSBWaWV3ZWRcIixcbiAgICAgICAgICBgW1NwaWZmeV0gJHtTcGlmZnlNZXRyaWNzRXZlbnROYW1lLkJ1bmRsZUxvYWRlZH1gLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChldmVudHNUb0VucmljaC5pbmNsdWRlcyhldmVudC5ldmVudF90eXBlKSkge1xuICAgICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgIGlmIChwdWJsaWNLZXkpIHtcbiAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXNbXCJnbG9iYWxQcm9wZXJ0aWVzLnB1YmxpY0tleVwiXSA9IHB1YmxpY0tleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVPdmVycmlkZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW2BnbG9iYWxQcm9wZXJ0aWVzLmZlYXR1cmVPdmVycmlkZXMuJHtrZXl9YF0gPVxuICAgICAgICAgICAgICAgIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhbnRVcmxPdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudFVybE92ZXJyaWRlXCJdID1cbiAgICAgICAgICAgICAgdmFyaWFudFVybE92ZXJyaWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFudEluZm9PdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudEluZm9PdmVycmlkZVwiXSA9XG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhcmlhbnRJbmZvT3ZlcnJpZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW1wiZ2xvYmFsUHJvcGVydGllcy5zaG93XCJdID0gU3RyaW5nKHNob3cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVuYWJsZWRGZWF0dXJlcyA9IGZlYXR1cmVGbGFnU2VydmljZSEuZ2V0RmVhdHVyZUZsYWdzKCk7XG4gICAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzUHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgZW5hYmxlZEZlYXR1cmVzXG4gICAgICAgICAgKS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gICAgICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgICAgW2BlbmFibGVkRmVhdHVyZXMuJHtrZXl9YF06IGAke3ZhbHVlfWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHRpbWluZ1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBcInRpbWluZy5lbnJpY2hlZF9hdF9tc1wiOiB3aW5kb3cucGVyZm9ybWFuY2U/Lm5vdygpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBlbnJpY2hlZEV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICBldmVudF9wcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIC4uLmV2ZW50LmV2ZW50X3Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAgIC4uLmdsb2JhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmVuYWJsZWRGZWF0dXJlc1Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLnRpbWluZ1Byb3BlcnRpZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5yaWNoZWRFdmVudCA9IGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgRXZlbnRzRGlzcGF0Y2hlci5kaXNwYXRjaChTcGlmZnlFdmVudC5BTVBMSVRVREVfRVZFTlQsIGVucmljaGVkRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiBlbnJpY2hlZEV2ZW50O1xuICAgICAgfSxcbiAgICB9O1xuICAgIHNldEludGVybmFsRXZlbnRUcmFja2luZ0VucmljaG1lbnQoZW5yaWNobWVudCk7XG4gICAgcmV0dXJuIGVucmljaG1lbnQ7XG4gIH0sIFtcbiAgICBpbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50LFxuICAgIGdldERlZmF1bHRUcmFja2luZ1Byb3BzLFxuICAgIGZlYXR1cmVGbGFnU2VydmljZSxcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc1JlYWR5ICYmICFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZTogQnJvd3NlckNsaWVudCA9IGNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICBjb25zdCBpc1Nlc3Npb25zRW5hYmxlZCA9IGFtcGxpdHVkZVNlc3Npb25SZXBsYXlJbml0KCk7XG4gICAgICBjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UuYWRkKGdldEV2ZW50VHJhY2tpbmdFbnJpY2htZW50KCkpO1xuICAgICAgY3VycmVudEFtcGxpdHVkZUluc3RhbmNlLmluaXQoYW1wbGl0dWRlQXBpS2V5ISwgdXNlcklkISwge1xuICAgICAgICBzZXJ2ZXJab25lOiBkYXRhUmVzaWRlbmN5IGFzIFNlcnZlclpvbmVUeXBlLFxuICAgICAgICB0cmFja2luZ09wdGlvbnM6IHtcbiAgICAgICAgICBpcEFkZHJlc3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9jYXB0dXJlOiB7XG4gICAgICAgICAgYXR0cmlidXRpb246IHRydWUsXG4gICAgICAgICAgcGFnZVZpZXdzOiB7XG4gICAgICAgICAgICB0cmFja0hpc3RvcnlDaGFuZ2VzOiBcInBhdGhPbmx5XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uczogaXNTZXNzaW9uc0VuYWJsZWQsXG4gICAgICAgICAgZm9ybUludGVyYWN0aW9uczogZmFsc2UsXG4gICAgICAgICAgZmlsZURvd25sb2FkczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHNldEFtcGxpdHVkZUNsaWVudChjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UpO1xuICAgIH1cbiAgfSwgW1xuICAgIGlzUmVhZHksXG4gICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgIGFtcGxpdHVkZUFwaUtleSxcbiAgICB1c2VySWQsXG4gICAgZGF0YVJlc2lkZW5jeSxcbiAgICBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCxcbiAgICBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCxcbiAgXSk7XG5cbiAgY29uc3QgdHJhY2tFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7XG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudFByb3BzLFxuICAgICAgZXZlbnRHcm91cHMsXG4gICAgICBhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzID0gZmFsc2UsXG4gICAgfTogVHJhY2tFdmVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiU3VibWl0dGluZyBldmVudFwiLCBldmVudE5hbWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkRXZlbnROYW1lID0gYFtTcGlmZnldICR7ZXZlbnROYW1lfWA7XG5cbiAgICAgICAgaWYgKCFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybihcImFtcGxpdHVkZSBjbGllbnQgdW5kZWZpbmVkXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudE5hbWUsXG4gICAgICAgICAgZXZlbnRQcm9wcyxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShldmVudERhdGEpO1xuICAgICAgICAgLy8gY2FsY3VsYXRlIGEgaGFzaCBvZiB0aGUgZXZlbnQgcHJvcGVydGllcyB0byB1c2UgYXMgdGhlIGluc2VydF9pZCBzbyB0aGF0IGR1cGxpY2F0ZSBldmVudHNcbiAgICAgICAgLy8gYXJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBieSBBbXBsaXR1ZGVcbiAgICAgICAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTI1NlwiLCBkYXRhKTtcbiAgICAgICAgY29uc3QgaGFzaEFycmF5ID0gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShoYXNoQnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbnNlcnRJZCA9IGhhc2hBcnJheVxuICAgICAgICAgIC5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICBMb2dnZXIubG9nRGVidWcoYGFtcGxpdHVkZSB0cmFja2luZyAke2RlY29yYXRlZEV2ZW50TmFtZX1gLCBudWxsLCB7XG4gICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHByb3BzOiBldmVudFByb3BzLFxuICAgICAgICB9KTtcblxuICAgICAgICBhbXBsaXR1ZGVDbGllbnQudHJhY2soXG4gICAgICAgICAgZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAuLi5ldmVudFByb3BzLFxuICAgICAgICAgICAgLi4uKGV2ZW50UHJvcHNcbiAgICAgICAgICAgICAgPyBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMoZXZlbnROYW1lLCBldmVudFByb3BzKVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmV2ZW50R3JvdXBzLFxuICAgICAgICAgICAgaW5zZXJ0X2lkOiBjdXJyZW50SW5zZXJ0SWQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzICYmIG9yZ0dhQ29uZmlnKSB7XG4gICAgICAgICAgLy8gVE9ETzogQWRkIGluIHdpbmRvd0RhdGFMYXllclNlcnZpY2Ugb3IgY29udGV4dCBhbHRlcm5hdGl2ZSBhbmQgaG9vayBpdCB1cCBoZXJlXG4gICAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiW3NwaWZmeS1haV0gR0EgdHJhY2tpbmdcIiwgZGVjb3JhdGVkRXZlbnROYW1lKTtcbiAgICAgICAgICBpZiAod2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgKHdpbmRvdy5kYXRhTGF5ZXIgYXMgYW55W10pLnB1c2goe1xuICAgICAgICAgICAgICBldmVudDogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFByb3BzOiBldmVudFByb3BzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiW3NwaWZmeS1haV0gRXJyb3IgdHJhY2tpbmcgZXZlbnRcIiwgZXJyLCB7XG4gICAgICAgICAgZXZlbnROYW1lLFxuICAgICAgICAgIGV2ZW50UHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgICAgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMsXG4gICAgICBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMsXG4gICAgICBvcmdHYUNvbmZpZyxcbiAgICBdXG4gICk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICB0cmFja0V2ZW50LFxuICAgICAgaXNSZWFkeSxcbiAgICAgIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wczogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT5cbiAgICAgICAgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzKHByb3BzKSxcbiAgICB9KSxcbiAgICBbdHJhY2tFdmVudCwgaXNSZWFkeSwgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEFtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0FtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQW1wbGl0dWRlID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBbXBsaXR1ZGVDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlQW1wbGl0dWRlIG11c3QgYmUgdXNlZCB3aXRoaW4gQW1wbGl0dWRlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQsXG4gIGlzR0E0RWNvbW1lcmNlRXZlbnQsXG4gIGlzQmFzZUVjb21tZXJjZUV2ZW50LFxuICBCYXNlRWNvbW1lcmNlRXZlbnQsXG59IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzXCI7XG5pbXBvcnQgeyBTcGlmZnlNZXRyaWNzRXZlbnROYW1lIH0gZnJvbSBcInNyYy9jb250ZXh0cy9hbXBsaXR1ZGVDb250ZXh0L2FtcGxpdHVkZUNvbnRleHRcIjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBkYXRhTGF5ZXI6IGFueVtdO1xuICB9XG59XG5cbmNvbnN0IE5PUk1BTElaRURfQUREX1RPX0NBUlRfRVZFTlRfTkFNRVMgPSBbXCJhZGR0b2NhcnRcIiwgXCJhZGRlZHRvY2FydFwiXTtcbmNvbnN0IENIRUNLX0RBVEFfTEFZRVJfSU5URVJWQUxfTVMgPSA1MDA7XG5jb25zdCBDSEVDS19EQVRBX0xBWUVSX01BWF9BVFRFTVBUUyA9IDEwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIEdvb2dsZSBBbmFseXRpY3MgZXZlbnQgaXMgYW4gYWRkX3RvX2NhcnQgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBuYW1lIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGFuIGFkZF90b19jYXJ0IGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmNvbnN0IGlzQWRkVG9DYXJ0RXZlbnQgPSAoZXZlbnQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkRXZlbnQgPSBldmVudC5yZXBsYWNlKC9bLV9dL2csIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBOT1JNQUxJWkVEX0FERF9UT19DQVJUX0VWRU5UX05BTUVTLnNvbWUoKG5hbWUpID0+XG4gICAgbm9ybWFsaXplZEV2ZW50LmluY2x1ZGVzKG5hbWUpXG4gICk7XG59O1xuXG4vKipcbiAqIFRyYWNrcyBhbiBhZGRfdG9fY2FydCBldmVudCBpbiBBbXBsaXR1ZGUuXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byB0cmFjay5cbiAqL1xuY29uc3QgaGFuZGxlQWRkVG9DYXJ0RXZlbnQgPSAoXG4gIGV2ZW50OiBCYXNlRWNvbW1lcmNlRXZlbnQsXG4gIHRyYWNrOiAoXG4gICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IHZvaWRcbikgPT4ge1xuICBsZXQgZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaWYgKGlzTGVnYWN5VUFFY29tbWVyY2VFdmVudChldmVudCkpIHtcbiAgICBldmVudFByb3BzID0ge1xuICAgICAgaXRlbXM6IGV2ZW50LmVjb21tZXJjZS5hZGQucHJvZHVjdHMubWFwKChwcm9kdWN0KSA9PiAoe1xuICAgICAgICBpdGVtX25hbWU6IHByb2R1Y3QubmFtZSxcbiAgICAgICAgaXRlbV9jYXRlZ29yeTogcHJvZHVjdC5jYXRlZ29yeSxcbiAgICAgICAgcHJpY2U6IHByb2R1Y3QucHJpY2UsXG4gICAgICAgIHF1YW50aXR5OiBwcm9kdWN0LnF1YW50aXR5LFxuICAgICAgfSkpLFxuICAgICAgY3VycmVuY3k6IGV2ZW50LmVjb21tZXJjZS5hZGQuY3VycmVuY3lDb2RlLFxuICAgICAgZXZlbnRfZm9ybWF0X3ZlcnNpb246IFwibGVnYWN5X3VuaXZlcnNhbF9hbmFseXRpY3NcIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzR0E0RWNvbW1lcmNlRXZlbnQoZXZlbnQpKSB7XG4gICAgZXZlbnRQcm9wcyA9IHtcbiAgICAgIGl0ZW1zOiBldmVudC5lY29tbWVyY2UuaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBpdGVtX25hbWU6IGl0ZW0uaXRlbV9uYW1lLFxuICAgICAgICBpdGVtX2NhdGVnb3J5OiBpdGVtLml0ZW1fY2F0ZWdvcnksXG4gICAgICAgIHByaWNlOiBpdGVtLnByaWNlLFxuICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eSxcbiAgICAgIH0pKSxcbiAgICAgIGN1cnJlbmN5OiBldmVudC5lY29tbWVyY2UuY3VycmVuY3ksXG4gICAgICBldmVudF9mb3JtYXRfdmVyc2lvbjogXCJnb29nbGVfYW5hbHl0aWNzXzRcIixcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGV2ZW50UHJvcHMgPSB7XG4gICAgICBldmVudF9wcm9wZXJ0aWVzOiB7IC4uLmV2ZW50IH0sXG4gICAgICBldmVudF9mb3JtYXRfdmVyc2lvbjogXCJ1bmtub3duXCIsXG4gICAgfTtcbiAgfVxuXG4gIHRyYWNrKFNwaWZmeU1ldHJpY3NFdmVudE5hbWUuQWRkVG9DYXJ0Q2xpY2tlZCwge1xuICAgIGV2ZW50UHJvcHMsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgd2luZG93LmRhdGFMYXllci5wdXNoIG1ldGhvZCB0byBpbnRlcmNlcHQgYWRkX3RvX2NhcnQgZXZlbnRzIGFuZCBzZW5kIHRoZW0gdG8gQW1wbGl0dWRlLlxuICogVGhpcyBmdW5jdGlvbiBydW5zIG9uIGFuIGludGVydmFsIHVudGlsIHRoZSBkYXRhTGF5ZXIgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgY29uc3QgaW5pdERhdGFMYXllcldyYXBwZXIgPSAoXG4gIHRyYWNrOiAoXG4gICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IHZvaWRcbikgPT4ge1xuICBsZXQgYXR0ZW1wdHMgPSAwO1xuXG4gIC8vIGN1cnJlbnRseSwgb3VyIGJ1bmRsZSBpcyBhbHdheXMgbG9hZGVkIGFmdGVyIEdUTSBoYXMgaW5pdGlhbGl6ZWQgR0EvZGF0YUxheWVyXG4gIC8vIHdlJ2xsIG5lZWQgdGhpcyBjaGVjayBoZXJlIGlmL3doZW4gd2UgbG9hZCBzcGlmZnkgYmVmb3JlL291dHNpZGUgb2YgR1RNXG4gIGNvbnN0IGNoZWNrQW5kSW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5kYXRhTGF5ZXIgfHwgISh3aW5kb3cuZGF0YUxheWVyIGFzIGFueSkucHVzaCkge1xuICAgICAgYXR0ZW1wdHMgKz0gMTtcblxuICAgICAgaWYgKGF0dGVtcHRzID49IENIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTKSB7XG4gICAgICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICAgICBgW3NwaWZmeS1haV0gZGF0YUxheWVyIG5vdCBhdmFpbGFibGUgYWZ0ZXIgJHtDSEVDS19EQVRBX0xBWUVSX01BWF9BVFRFTVBUU30gYXR0ZW1wdHNgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dChjaGVja0FuZEluaXRpYWxpemUsIENIRUNLX0RBVEFfTEFZRVJfSU5URVJWQUxfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgIFwiW3NwaWZmeS1haV0gZGF0YUxheWVyIGlzIGF2YWlsYWJsZSwgd3JhcHBpbmcgcHVzaCBmdW5jdGlvbi4uLlwiXG4gICAgKTtcbiAgICBjb25zdCBvcmlnaW5hbFB1c2ggPSB3aW5kb3cuZGF0YUxheWVyLnB1c2g7XG4gICAgd2luZG93LmRhdGFMYXllci5wdXNoID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc0Jhc2VFY29tbWVyY2VFdmVudChhcmdzWzBdKSAmJlxuICAgICAgICBpc0FkZFRvQ2FydEV2ZW50KChhcmdzWzBdIGFzIGFueSkuZXZlbnQpXG4gICAgICApIHtcbiAgICAgICAgaGFuZGxlQWRkVG9DYXJ0RXZlbnQoYXJnc1swXSBhcyBCYXNlRWNvbW1lcmNlRXZlbnQsIHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgLy8gSU1QT1JUQU5UOiBjYWxsIHRoZSBvcmlnaW5hbCBwdXNoIG1ldGhvZCBzbyB0aGF0IHRoZSBldmVudCBpcyBzdGlsbCBsb2dnZWQgdG8gR0FcbiAgICAgIHJldHVybiBvcmlnaW5hbFB1c2guYXBwbHkod2luZG93LmRhdGFMYXllciwgYXJncyk7XG4gICAgfTtcbiAgfTtcblxuICBjaGVja0FuZEluaXRpYWxpemUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbml0QW1wbGl0dWRlID0gKFxuICB0cmFjazogKFxuICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSA9PiB2b2lkXG4pID0+IHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBtaWdodCBub3QgYmUgbmVlZGVkIGFueW1vcmUgaWYgQW1wbGl0dWRlIGlzIGluaXRpYWxpemVkIHZpYSBjb250ZXh0LlxuICAvLyBGb3Igbm93LCB3ZSdsbCBrZWVwIGl0IGFuZCBwYXNzIHRoZSB0cmFjayBmdW5jdGlvbi5cbiAgLy8gSWYgaXQncyB0cnVseSByZWR1bmRhbnQsIGl0IGNhbiBiZSByZW1vdmVkIGxhdGVyLlxuICB0cmFjayhTcGlmZnlNZXRyaWNzRXZlbnROYW1lLkJ1bmRsZUxvYWRlZCk7IC8vIEV4YW1wbGUgdXNhZ2UsIGFkanVzdCBhcyBuZWVkZWRcbn07XG4iLCJleHBvcnQgY29uc3QgZGl2aWRlQXJyYXkgPSA8VD4oYXJyYXk6IFRbXSwgc2l6ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHJvd3MgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICByb3dzLnB1c2goYXJyYXkuZmlsdGVyKChfOiBULCBpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIHNpemUgPT09IGkpKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn07XG4iLCJpbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlVHlwZSwgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgZ2V0UmVjZW50UHJvZHVjdEltYWdlVXJscyA9IChsYXN0TWVzc2FnZXM6IE1lc3NhZ2VbXSwgY3VycmVudFByb2R1Y3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHByb2R1Y3RNZXNzYWdlcyA9IGxhc3RNZXNzYWdlc1xuICAgIC5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UudHlwZSA9PT0gTWVzc2FnZVR5cGUuUHJvZHVjdCAmJiBtZXNzYWdlLm1ldGFkYXRhPy5pbWFnZVVybClcbiAgICAubWFwKChtKSA9PiBtIGFzIFByb2R1Y3RNZXNzYWdlTWV0YWRhdGEpO1xuICAvLyBwdXQgYWRkZWQgcHJvZHVjdCBpbWFnZSBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0XG4gIHJldHVybiBbXG4gICAgLi4ucHJvZHVjdE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5tZXRhZGF0YT8uaWQgPT09IGN1cnJlbnRQcm9kdWN0SWQpLFxuICAgIC4uLnByb2R1Y3RNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0ubWV0YWRhdGE/LmlkICE9PSBjdXJyZW50UHJvZHVjdElkKSxcbiAgXS5tYXAoKG0pID0+IG0ubWV0YWRhdGEhLmltYWdlVXJsISk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IHByZXBhcmVNZXJjaGFudFBhZ2UgPSAoKSA9PiB7XG4gIGxldCBtZXRhVmlld3BvcnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSd2aWV3cG9ydCddXCIpO1xuICBpZiAobWV0YVZpZXdwb3J0KSB7XG4gICAgY29uc3QgY29udGVudCA9IG1ldGFWaWV3cG9ydC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgY29uc3QgaGFzTWF4aW11bVNjYWxlID0gY29udGVudD8uaW5jbHVkZXMoXCJtYXhpbXVtLXNjYWxlPTFcIilcbiAgICBpZiAoIWhhc01heGltdW1TY2FsZSkge1xuICAgICAgbWV0YVZpZXdwb3J0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgYCR7Y29udGVudH0sIG1heGltdW0tc2NhbGU9MWApXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgbWV0YVZpZXdwb3J0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm1ldGFcIik7XG4gIG1ldGFWaWV3cG9ydC5zZXRBdHRyaWJ1dGUoXCJuYW1lXCIsIFwidmlld3BvcnRcIilcbiAgbWV0YVZpZXdwb3J0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgXCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgbWF4aW11bS1zY2FsZT0xXCIpXG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobWV0YVZpZXdwb3J0KTtcbn1cbiIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VSb2xlLCBNZXNzYWdlVHlwZSwgVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIHF1ZXJ5IFVzZXJFdmVudCBvYmplY3QgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IGZvciBwcmVzZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSB1c2VyIGV2ZW50IG9iamVjdCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgcXVlcnkgZXZlbnQsIG90aGVyd2lzZSB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2VGcm9tUXVlcnlFdmVudCA9IChldmVudDogVXNlckV2ZW50KTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5RdWVyeVR5cGVkLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBjb250ZW50OiBldmVudC5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBzZWFyY2hUZXJtOiBldmVudC5hdHRyaWJ1dGVzLnNlYXJjaFRlcm0gfHwgJycsXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyczogZXZlbnQuYXR0cmlidXRlcy5zZWxlY3RlZEZpbHRlcnMgfHwgW10sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IFJlc3BvbnNlQ2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVJvbGUsIE1lc3NhZ2VUeXBlLCBSZXNwb25zZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBzZXJ2ZXIgUmVzcG9uc2Ugb2JqZWN0IGludG8gYSBNZXNzYWdlIG9iamVjdCBmb3IgcHJlc2VudGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0IHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBjb250YWluaW5nIG1vZGVsIGdlbmVyYXRlZCBjb250ZW50XG4gKlxuICogQHJldHVybnMgQSBNZXNzYWdlIGlmIHRoZSByZXNwb25zZSBjb250YWlucyBrbm93biBhdHRyaWJ1dGVzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlRnJvbVJlc3BvbnNlID0gKHJlc3BvbnNlPzogUmVzcG9uc2UpOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgY29udGVudDogcmVzcG9uc2UuYXR0cmlidXRlcy5jb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXcsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICByZXZpZXc6IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmV2aWV3LFxuICAgICAgICByZXZpZXdlcjogcmVzcG9uc2UuYXR0cmlidXRlcy5yZXZpZXdlcixcbiAgICAgICAgc3RhcnM6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuc3RhcnMsXG4gICAgICAgIHRpdGxlOiByZXNwb25zZS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICByaWNoSW5mb3JtYXRpb246IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmljaEluZm9ybWF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlNlcGFyYXRvcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlNlcGFyYXRvcixcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlBhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5QYWdlLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlByb2R1Y3RTZWFyY2hGaWx0ZXIsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICAuLi5yZXNwb25zZS5hdHRyaWJ1dGVzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgZm9ybVR5cGU6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuZm9ybUNhdGVnb3J5Py5mb3JtVHlwZSxcbiAgICAgICAgZmllbGRzOiBPYmplY3QuZW50cmllcyhyZXNwb25zZS5hdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdGl0bGU6IHZhbHVlLnRpdGxlLFxuICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgZm9ybWF0OiB2YWx1ZS5mb3JtYXQsXG4gICAgICAgICAgcmVxdWlyZWQ6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuc2NoZW1hLnJlcXVpcmVkLmluY2x1ZGVzKGtleSksXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5PcmRlcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLk9yZGVyLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuIiwiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVJvbGUsIE1lc3NhZ2VUeXBlLCBTdWdnZXN0aW9uLCBVc2VyRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgVXNlckV2ZW50IG9iamVjdCBpbnRvIGEgTWVzc2FnZSBvYmplY3QgZm9yIHByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIFVzZXJFdmVudCBvYmplY3QgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0gc3VnZ2VzdGlvbnMgQSBsaXN0IG9mIGdlbmVyYXRlZCBzdWdnZXN0aW9ucyB0byBtYXRjaCB0aGUgZXZlbnQgdG9cbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgc3VnZ2VzdGlvbiBjbGljayBldmVudCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQgPSAoXG4gIGV2ZW50OiBVc2VyRXZlbnQsXG4gIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10sXG4pOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgIGNvbnN0IHsgc3VnZ2VzdGlvbklkIH0gPSBldmVudC5hdHRyaWJ1dGVzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBldmVudC5ldmVudElkLFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuVXNlcixcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlN1Z2dlc3Rpb25DbGlja2VkLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBzdWdnZXN0aW9uSWQsXG4gICAgICAgIHN1Z2dlc3Rpb25Db250ZW50OiBzdWdnZXN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzdWdnZXN0aW9uSWQpPy5jb250ZW50ID8/ICcnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJleHBvcnQgYWJzdHJhY3QgY2xhc3MgTm9kZVNlbGVjdG9yIHtcbiAgcHJpdmF0ZSBwYXR0ZXJuOiBzdHJpbmc7XG4gIHByaXZhdGUgcm9vdDogRG9jdW1lbnQ7XG5cbiAgY29uc3RydWN0b3IocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudDtcbiAgfVxuXG4gIGdldFBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0dGVybjtcbiAgfVxuXG4gIHNldFJvb3Qocm9vdDogRG9jdW1lbnQpIHtcbiAgICB0aGlzLnJvb3QgPSByb290O1xuICB9XG5cbiAgZ2V0Um9vdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgYWJzdHJhY3QgcGFyc2UoKTogTm9kZSB8IG51bGw7XG59XG5cbmNsYXNzIFF1ZXJ5U2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRQYXR0ZXJuKCkpO1xuICB9XG59XG5cbmNsYXNzIElEU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UGF0dGVybigpKSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIFhwYXRoU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpPy5ldmFsdWF0ZShcbiAgICAgIHRoaXMuZ2V0UGF0dGVybigpLFxuICAgICAgdGhpcy5nZXRSb290KCksXG4gICAgICBudWxsLFxuICAgICAgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsXG4gICAgICBudWxsLFxuICAgICk/LnNpbmdsZU5vZGVWYWx1ZSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIENoYWluU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdG9ySW5kZXggPSAwO1xuICAgIGNvbnN0IHNlbGVjdG9ycyA9IHRoaXMuZ2V0UGF0dGVybigpLnNwbGl0KCdAJyk7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gc2VsZWN0b3JzLmxlbmd0aCAtIDE7XG5cbiAgICBjb25zdCBwYXJzZUNoYWluID0gKHBhdHRlcm46IHN0cmluZywgcHJldk5vZGU/OiBOb2RlIHwgbnVsbCk6IE5vZGUgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JGYWN0b3J5LnBhcnNlKHBhdHRlcm4pO1xuXG4gICAgICBpZiAocHJldk5vZGUpIHtcbiAgICAgICAgc2VsZWN0b3Iuc2V0Um9vdChwcmV2Tm9kZSBhcyBEb2N1bWVudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gc2VsZWN0b3IucGFyc2UoKTtcbiAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgfCB1bmRlZmluZWQgPSBjdXJyZW50Tm9kZSB8fCBkb2N1bWVudDtcbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpPy5zaGFkb3dSb290KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnNoYWRvd1Jvb3Q7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpPy5jb250ZW50V2luZG93KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3c/LmRvY3VtZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbKytzZWxlY3RvckluZGV4XS50cmltKCksIG5vZGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbc2VsZWN0b3JJbmRleF0udHJpbSgpKTtcbiAgfVxufVxuXG5jbGFzcyBFbXB0eSBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCcnKTtcbiAgfVxuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRmFjdG9yeSB7XG4gIHN0YXRpYyBwYXJzZShjb21wb3NlZFNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjb21wb3NlZFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbmV3IEVtcHR5KCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXQgPSBjb21wb3NlZFNlbGVjdG9yLnNwbGl0KCd8Jyk7XG4gICAgY29uc3QgdHlwZSA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gc3BsaXRbMV07XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQoc2VsZWN0b3IpO1xuICAgICAgY2FzZSAncXVlcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgICBjYXNlICd4cGF0aCc6XG4gICAgICAgIHJldHVybiB0aGlzLnhwYXRoKHNlbGVjdG9yKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgRW1wdHkoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2soc2VsZWN0b3I/OiBOb2RlU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgPz8gbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgY2hhaW4ocGF0dGVybj86IHN0cmluZykge1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IENoYWluU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxuXG4gIHN0YXRpYyBpZChwYXR0ZXJuPzogc3RyaW5nKTogTm9kZVNlbGVjdG9yIHtcbiAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBJRFNlbGVjdG9yKHBhdHRlcm4pIDogbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgcXVlcnkocGF0dGVybj86IHN0cmluZyk6IE5vZGVTZWxlY3RvciB7XG4gICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgUXVlcnlTZWxlY3RvcihwYXR0ZXJuKSA6IG5ldyBFbXB0eSgpO1xuICB9XG5cbiAgc3RhdGljIHhwYXRoKHBhdHRlcm4/OiBzdHJpbmcpOiBOb2RlU2VsZWN0b3Ige1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFhwYXRoU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxufVxuIiwiZXhwb3J0IHR5cGUgUmVwbGFjZU9wPFQ+ID0geyAkcmVwbGFjZTogVCB9O1xuZXhwb3J0IHR5cGUgRGVsZXRlT3AgPSB7ICRkZWxldGU6IHRydWUgfTtcblxuLy8gVHJlYXQgdGhlc2UgYXMgYXRvbWljIHZhbHVlcyAobm90IHJlY3Vyc2VkIGludG8pXG50eXBlIEJ1aWx0aW4gPSBEYXRlIHwgUmVnRXhwIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pO1xuXG50eXBlIFByaW1pdGl2ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBzeW1ib2wgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIE92ZXJyaWRlPFQ+IGlzIGEgRGVlcFBhcnRpYWwtbGlrZSB0eXBlIHdpdGggc3BlY2lhbCBvcGVyYXRvcnM6XG4gKiAtIHsgJHJlcGxhY2U6IFQgfSB0byByZXBsYWNlIGFuIGVudGlyZSBzdWJ0cmVlL2FycmF5XG4gKiAtIHsgJGRlbGV0ZTogdHJ1ZSB9IHRvIGRlbGV0ZSBhbiBvYmplY3Qga2V5XG4gKlxuICogQXJyYXlzIGJlaGF2aW9yOlxuICogLSBBcnJheXMgb2Ygb2JqZWN0czogbWVyZ2UtYnktaW5kZXggYnkgZGVmYXVsdCAodW5sZXNzIGBhcnJheVN0cmF0ZWd5OiAncmVwbGFjZSdgIG9yIGAkcmVwbGFjZWAgaXMgdXNlZClcbiAqIC0gQXJyYXlzIG9mIHByaW1pdGl2ZXMgKHN0cmluZy9udW1iZXIvYm9vbGVhbi8uLi4pOiByZXBsYWNlZCBieSBkZWZhdWx0IHdoZW4gYSBwYXRjaCBhcnJheSBpcyBwcm92aWRlZFxuICovXG5leHBvcnQgdHlwZSBPdmVycmlkZTxUPiA9XG4gIC8vIGF0b21pY1xuICBUIGV4dGVuZHMgUHJpbWl0aXZlIHwgQnVpbHRpblxuICAgID8gVCB8IFJlcGxhY2VPcDxUPiB8IERlbGV0ZU9wXG4gICAgOiAvLyBhcnJheXNcbiAgICAgIFQgZXh0ZW5kcyAoaW5mZXIgVSlbXVxuICAgICAgPyBBcnJheTxPdmVycmlkZTxVPiB8IHVuZGVmaW5lZD4gfCBSZXBsYWNlT3A8VD5cbiAgICAgIDogLy8gbWFwcy9zZXRzIOKAkyBrZWVwIHNpbXBsZTogb25seSBhbGxvdyBmdWxsIHJlcGxhY2VcbiAgICAgICAgVCBleHRlbmRzIE1hcDx1bmtub3duLCB1bmtub3duPiB8IFNldDx1bmtub3duPlxuICAgICAgICA/IFJlcGxhY2VPcDxUPlxuICAgICAgICA6IC8vIG9iamVjdHNcbiAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgICAgPyB7IFtLIGluIGtleW9mIFRdPzogT3ZlcnJpZGU8VFtLXT4gfCBEZWxldGVPcCB8IG51bGwgfSB8IFJlcGxhY2VPcDxUPlxuICAgICAgICAgIDogVDtcblxuZXhwb3J0IHR5cGUgTWVyZ2VPcHRpb25zID0ge1xuICAvKipcbiAgICogSG93IHRvIHRyZWF0IGFycmF5cyB3aGVuIHBhdGNoIHByb3ZpZGVzIGFuIGFycmF5IChub3QgJHJlcGxhY2UpOlxuICAgKiAtICdyZXBsYWNlJzogYWx3YXlzIHVzZSBwYXRjaCBhcnJheSBhcyB3aG9sZSB2YWx1ZVxuICAgKiAtICdtZXJnZUJ5SW5kZXgnOiBtZXJnZSBlYWNoIGluZGV4IHJlY3Vyc2l2ZWx5IChkZWZhdWx0IGZvciBhcnJheXMgb2Ygb2JqZWN0cylcbiAgICogTm90ZTogQXJyYXlzIG9mIHByaW1pdGl2ZXMgYXJlIHJlcGxhY2VkIGJ5IGRlZmF1bHQgcmVnYXJkbGVzcyBvZiB0aGlzIG9wdGlvbi5cbiAgICovXG4gIGFycmF5U3RyYXRlZ3k/OiAncmVwbGFjZScgfCAnbWVyZ2VCeUluZGV4JztcbiAgLyoqXG4gICAqIElmIHRydWUsIGEgYG51bGxgIHBhdGNoIHZhbHVlIGRlbGV0ZXMgdGhlIGtleSBmcm9tIGFuIG9iamVjdCAoUkZDIDczOTYtaXNoKVxuICAgKi9cbiAgbnVsbERlbGV0ZXM/OiBib29sZWFuO1xufTtcblxuLy8gUHJldmVudHMgVCBmcm9tIGJlaW5nIGluZmVycmVkIGZyb20gdGhlICdwYXRjaCcgcGFyYW1ldGVyOyBpdCBtdXN0IGJlIGluZmVycmVkIGZyb20gJ2Jhc2UnLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE0ODI5I2lzc3VlY29tbWVudC01MDQwNDI1NDZcbnR5cGUgTm9JbmZlcjxUPiA9IFtUXVtUIGV4dGVuZHMgdW5rbm93biA/IDAgOiBuZXZlcl07XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QoeDogdW5rbm93bik6IHggaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICEheCAmJlxuICAgIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KHgpICYmXG4gICAgISh4IGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAhKHggaW5zdGFuY2VvZiBSZWdFeHApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUmVwbGFjZSh4OiB1bmtub3duKTogeCBpcyBSZXBsYWNlT3A8dW5rbm93bj4ge1xuICByZXR1cm4gISF4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAnJHJlcGxhY2UnIGluICh4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbn1cbmZ1bmN0aW9uIGlzRGVsZXRlKHg6IHVua25vd24pOiB4IGlzIERlbGV0ZU9wIHtcbiAgcmV0dXJuICEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgKHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLiRkZWxldGUgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlVmFsdWUoeDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCB0ID0gdHlwZW9mIHg7XG4gIHJldHVybiAoXG4gICAgeCA9PT0gbnVsbCB8fFxuICAgIHQgPT09ICdzdHJpbmcnIHx8XG4gICAgdCA9PT0gJ251bWJlcicgfHxcbiAgICB0ID09PSAnYm9vbGVhbicgfHxcbiAgICB0ID09PSAnYmlnaW50JyB8fFxuICAgIHQgPT09ICdzeW1ib2wnIHx8XG4gICAgdCA9PT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheU9mUHJpbWl0aXZlcyhhcnI6IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOyAvLyBhbWJpZ3VvdXMsIGRlZmF1bHQgdG8gbWVyZ2UtYnktaW5kZXggb24gZW1wdHlcbiAgLy8gSWYgZXZlcnkgZGVmaW5lZCBlbGVtZW50IGlzIHByaW1pdGl2ZSwgdHJlYXQgYXMgcHJpbWl0aXZlc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHYgPSBhcnJbaV07XG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiAhaXNQcmltaXRpdmVWYWx1ZSh2KSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtZXJnZUFueShiYXNlQW55OiB1bmtub3duLCBwYXRjaEFueTogdW5rbm93biwgb3B0czogTWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIGlmIChpc1JlcGxhY2UocGF0Y2hBbnkpKSByZXR1cm4gcGF0Y2hBbnkuJHJlcGxhY2UgYXMgdW5rbm93bjtcbiAgaWYgKGlzRGVsZXRlKHBhdGNoQW55KSkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gY2FsbGVyIGRlbGV0ZXMgdGhlIGtleVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VBbnkpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0Y2hBbnkpKSB7XG4gICAgICBjb25zdCBiYXNlQXJyID0gYmFzZUFueSBhcyB1bmtub3duW107XG4gICAgICBjb25zdCBwYXRjaEFyciA9IHBhdGNoQW55IGFzIHVua25vd25bXTtcbiAgICAgIGNvbnN0IHNob3VsZFJlcGxhY2UgPVxuICAgICAgICBvcHRzLmFycmF5U3RyYXRlZ3kgPT09ICdyZXBsYWNlJyB8fFxuICAgICAgICBpc0FycmF5T2ZQcmltaXRpdmVzKGJhc2VBcnIpIHx8XG4gICAgICAgIGlzQXJyYXlPZlByaW1pdGl2ZXMocGF0Y2hBcnIpO1xuICAgICAgaWYgKHNob3VsZFJlcGxhY2UpIHJldHVybiBwYXRjaEFueSBhcyB1bmtub3duO1xuICAgICAgY29uc3Qgb3V0ID0gYmFzZUFyci5zbGljZSgpO1xuICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgob3V0Lmxlbmd0aCwgcGF0Y2hBcnIubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4OyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgcFZhbCA9IHBhdGNoQXJyW2ldO1xuICAgICAgICBpZiAocFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3V0W2ldID0gbWVyZ2VBbnkob3V0W2ldLCBwVmFsLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dCBhcyB1bmtub3duO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZUFueSBhcyB1bmtub3duO1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoYmFzZUFueSkgJiYgaXNQbGFpbk9iamVjdChwYXRjaEFueSkpIHtcbiAgICBjb25zdCBiYXNlT2JqID0gYmFzZUFueSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBwYXRjaE9iaiA9IHBhdGNoQW55IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmJhc2VPYmogfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXRjaE9iaikpIHtcbiAgICAgIGNvbnN0IHBWYWwgPSBwYXRjaE9ialtrZXldO1xuICAgICAgaWYgKHBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBsZWF2ZSBhcy1pc1xuICAgICAgfSBlbHNlIGlmIChvcHRzLm51bGxEZWxldGVzICYmIHBWYWwgPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIGlmIChpc1JlcGxhY2UocFZhbCkpIHtcbiAgICAgICAgb3V0W2tleV0gPSBwVmFsLiRyZXBsYWNlO1xuICAgICAgfSBlbHNlIGlmIChpc0RlbGV0ZShwVmFsKSkge1xuICAgICAgICBkZWxldGUgb3V0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQW55KGJhc2VPYmo/LltrZXldLCBwVmFsLCBvcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dCBhcyB1bmtub3duO1xuICB9XG5cbiAgcmV0dXJuIChwYXRjaEFueSBhcyB1bmtub3duKSA/PyBiYXNlQW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlPdmVycmlkZXM8VD4oXG4gIGJhc2U6IFQsXG4gIHBhdGNoOiBPdmVycmlkZTxOb0luZmVyPFQ+PixcbiAgb3B0czogTWVyZ2VPcHRpb25zID0ge30sXG4pOiBUIHtcbiAgY29uc3QgeyBhcnJheVN0cmF0ZWd5ID0gJ21lcmdlQnlJbmRleCcsIG51bGxEZWxldGVzID0gZmFsc2UgfSA9IG9wdHM7XG5cbiAgLy8gSGFuZGxlIHdob2xlLW5vZGUgY29udHJvbCBvcGVyYXRvcnMgb24gcGF0Y2ggaXRzZWxmXG4gIGlmIChpc1JlcGxhY2UocGF0Y2gpKSByZXR1cm4gcGF0Y2guJHJlcGxhY2UgYXMgVDtcbiAgaWYgKGlzRGVsZXRlKHBhdGNoKSkgcmV0dXJuIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQ7XG5cbiAgLy8gQXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2UpKSB7XG4gICAgaWYgKGlzUmVwbGFjZShwYXRjaCkpIHJldHVybiBwYXRjaC4kcmVwbGFjZSBhcyBUO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgICAgaWYgKGFycmF5U3RyYXRlZ3kgPT09ICdyZXBsYWNlJykgcmV0dXJuIHBhdGNoIGFzIHVua25vd24gYXMgVDtcbiAgICAgIC8vIG1lcmdlIGJ5IGluZGV4XG4gICAgICBjb25zdCBvdXQgPSAoYmFzZSBhcyB1bmtub3duW10pLnNsaWNlKCk7XG4gICAgICBjb25zdCBtYXggPSBNYXRoLm1heChvdXQubGVuZ3RoLCBwYXRjaC5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBwVmFsID0gKHBhdGNoIGFzIHVua25vd25bXSlbaV07XG4gICAgICAgIGlmIChwVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdXRbaV0gPSBtZXJnZUFueShvdXRbaV0sIHBWYWwsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgLy8gaW52YWxpZCBwYXRjaCB0eXBlIGZvciBhbiBhcnJheSDihpIgaWdub3JlIGFuZCByZXR1cm4gYmFzZVxuICAgIHJldHVybiBiYXNlIGFzIFQ7XG4gIH1cblxuICAvLyBQbGFpbiBvYmplY3RzXG4gIGlmIChpc1BsYWluT2JqZWN0KGJhc2UpICYmIGlzUGxhaW5PYmplY3QocGF0Y2gpKSB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uKGJhc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgY29uc3QgcGF0Y2hPYmogPSBwYXRjaCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXRjaE9iaikpIHtcbiAgICAgIGNvbnN0IHBWYWwgPSBwYXRjaE9ialtrZXldO1xuICAgICAgaWYgKHBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBsZWF2ZSBleGlzdGluZyB2YWx1ZVxuICAgICAgfSBlbHNlIGlmIChudWxsRGVsZXRlcyAmJiBwVmFsID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBvdXRba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZXBsYWNlKHBWYWwpKSB7XG4gICAgICAgIG91dFtrZXldID0gcFZhbC4kcmVwbGFjZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEZWxldGUocFZhbCkpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYlZhbCA9IChiYXNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQW55KGJWYWwsIHBWYWwsIG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8vIEZvciBwcmltaXRpdmVzIG9yIHdoZW4gcGF0Y2ggaXMgcHJpbWl0aXZlLCBwYXRjaCB3aW5zIGlmIGRlZmluZWRcbiAgcmV0dXJuICgocGF0Y2ggYXMgdW5rbm93bikgPz8gYmFzZSkgYXMgVDtcbn1cbiIsIlxuY2xhc3MgU3RyaW5nVXRpbHMge1xuICBzdGF0aWMgaXNOdWxsT3JFbXB0eSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWVUcmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVRyaW1tZWQgPT09ICcnO1xuICB9XG5cbiAgc3RhdGljIHRyaW1Ub051bGwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWVUcmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNOdWxsT3JFbXB0eSh2YWx1ZVRyaW1tZWQpID8gdW5kZWZpbmVkIDogdmFsdWVUcmltbWVkO1xuICB9XG5cbiAgc3RhdGljIGNhcGl0YWxpemUodHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR5cGUuc3Vic3RyaW5nKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBmaXJzdCBwYXR0ZXJuIGluIGFuIGFycmF5IHRoYXQgbWF0Y2hlcyBhIGdpdmVuIFVSTC5cbiAgICogUGF0dGVybnMgY2FuIGluY2x1ZGUgYSBzaW5nbGUgd2lsZGNhcmQgJyonIHdoaWNoIG1hdGNoZXMgYW55IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gdXJsVG9UZXN0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZmluZE1hdGNoaW5nUGF0dGVybihwYXR0ZXJuczogc3RyaW5nW10sIHVybFRvVGVzdDogTG9jYXRpb24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdXJsVG9UZXN0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgLy8gVGVzdCBvbmx5IGlmIGEgcGF0aG5hbWUgaXMgcHJlc2VudC5cbiAgICAgIGlmICh1cmxUb1Rlc3QucGF0aG5hbWUgIT09ICcvJykge1xuICAgICAgICAvLyBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGluIHRoZSBwYXR0ZXJuXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGNoYXJhY3RlcnMgbGlrZSAnLicsICcrJywgJz8nLCAnKCcsIGV0Yy4sIGluIHRoZSBwYXR0ZXJuIGFyZSB0cmVhdGVkIGxpdGVyYWxseS5cbiAgICAgICAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcblxuICAgICAgICAvLyBSZXBsYWNlIHRoZSB3aWxkY2FyZCAnKicgd2l0aCBpdHMgcmVnZXggZXF1aXZhbGVudCAnLionIChtYXRjaGVzIGFueSBjaGFyYWN0ZXIgemVybyBvciBtb3JlIHRpbWVzKVxuICAgICAgICBjb25zdCByZWdleFBhdHRlcm4gPSBlc2NhcGVkUGF0dGVybi5yZXBsYWNlKC9cXCovZywgJy4qJyk7XG5cbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtyZWdleFBhdHRlcm59JGApO1xuICAgICAgICBpZiAocmVnZXgudGVzdCh1cmxUb1Rlc3QucGF0aG5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgodXJsVG9UZXN0Lmhvc3RuYW1lKSkge1xuICAgICAgICByZXR1cm4gcGF0dGVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyaW5nVXRpbHMgfTtcbiIsIi8vIFRoaXMgZW1haWwgdmFsaWRhdGVzIHRoYXQgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgYmVmb3JlIHRoZSBgQGAgc3ltYm9sLFxuLy8gb25lIG9yIG1vcmUgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSBgQGAgc3ltYm9sIGFuZCB0aGUgYC5gIHN5bWJvbCxcbi8vIGFuZCBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBgLmAgc3ltYm9sXG4vLyBJdCBkb2VzIE5PVCB2YWxpZGF0ZSBhbGwgcG9zc2libGUgZW1haWwgZm9ybWF0cywgYnV0IGl0IGlzIGEgZGVjZW50IHBsYWNlIHRvIHN0YXJ0LlxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRW1haWwgPSAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdCh2YWx1ZSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLE1BQWEsK0JBQStCLFNBQXNDO0FBQ2hGLEtBQ0UsS0FBSyxhQUFhQSxrREFBa0IsWUFDcEMsS0FBSyxhQUFhQSxrREFBa0IsVUFFcEMsUUFBTztFQUNMLFVBQVUsS0FBSztFQUNmLFlBQVksS0FBSztFQUNqQixVQUFVLEtBQUs7RUFDZixZQUFZO0dBQ1YsWUFBWSxLQUFLLFdB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