@dollhousemcp/mcp-server 1.4.4 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (667) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +68 -7
  3. package/dist/auth/GitHubAuthManager.d.ts +93 -0
  4. package/dist/auth/GitHubAuthManager.d.ts.map +1 -0
  5. package/dist/auth/GitHubAuthManager.js +465 -0
  6. package/dist/generated/version.d.ts +2 -2
  7. package/dist/generated/version.js +3 -3
  8. package/dist/index.d.ts +23 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +244 -5
  11. package/dist/security/tokenManager.d.ts +34 -0
  12. package/dist/security/tokenManager.d.ts.map +1 -1
  13. package/dist/security/tokenManager.js +199 -1
  14. package/dist/server/ServerSetup.d.ts.map +1 -1
  15. package/dist/server/ServerSetup.js +4 -1
  16. package/dist/server/tools/AuthTools.d.ts +10 -0
  17. package/dist/server/tools/AuthTools.d.ts.map +1 -0
  18. package/dist/server/tools/AuthTools.js +41 -0
  19. package/dist/server/types.d.ts +3 -0
  20. package/dist/server/types.d.ts.map +1 -1
  21. package/dist/server/types.js +1 -1
  22. package/package.json +1 -1
  23. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  24. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  25. package/dist/collection/MarketplaceBrowser.js +0 -115
  26. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  27. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  28. package/dist/collection/MarketplaceSearch.js +0 -48
  29. package/dist/collection/PersonaInstaller.d.ts +0 -26
  30. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  31. package/dist/collection/PersonaInstaller.js +0 -103
  32. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  33. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  34. package/dist/elements/ensembles/Ensemble.js +0 -860
  35. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  36. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  37. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  38. package/dist/elements/ensembles/constants.d.ts +0 -73
  39. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  40. package/dist/elements/ensembles/constants.js +0 -92
  41. package/dist/elements/ensembles/index.d.ts +0 -8
  42. package/dist/elements/ensembles/index.d.ts.map +0 -1
  43. package/dist/elements/ensembles/index.js +0 -8
  44. package/dist/elements/ensembles/types.d.ts +0 -92
  45. package/dist/elements/ensembles/types.d.ts.map +0 -1
  46. package/dist/elements/ensembles/types.js +0 -8
  47. package/dist/elements/memories/Memory.d.ts +0 -110
  48. package/dist/elements/memories/Memory.d.ts.map +0 -1
  49. package/dist/elements/memories/Memory.js +0 -470
  50. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  51. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  52. package/dist/elements/memories/MemoryManager.js +0 -435
  53. package/dist/elements/memories/constants.d.ts +0 -42
  54. package/dist/elements/memories/constants.d.ts.map +0 -1
  55. package/dist/elements/memories/constants.js +0 -49
  56. package/dist/elements/memories/index.d.ts +0 -6
  57. package/dist/elements/memories/index.d.ts.map +0 -1
  58. package/dist/elements/memories/index.js +0 -6
  59. package/dist/marketplace/GitHubClient.d.ts +0 -22
  60. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  61. package/dist/marketplace/GitHubClient.js +0 -112
  62. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  63. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  64. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  65. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  66. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  67. package/dist/marketplace/MarketplaceSearch.js +0 -48
  68. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  69. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  70. package/dist/marketplace/PersonaDetails.js +0 -71
  71. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  72. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  73. package/dist/marketplace/PersonaInstaller.js +0 -100
  74. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  75. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  76. package/dist/marketplace/PersonaSubmitter.js +0 -57
  77. package/dist/marketplace/index.d.ts +0 -10
  78. package/dist/marketplace/index.d.ts.map +0 -1
  79. package/dist/marketplace/index.js +0 -10
  80. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  81. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  82. package/dist/server/tools/MarketplaceTools.js +0 -96
  83. package/dist/src/cache/APICache.d.ts +0 -23
  84. package/dist/src/cache/APICache.d.ts.map +0 -1
  85. package/dist/src/cache/APICache.js +0 -42
  86. package/dist/src/cache/index.d.ts +0 -5
  87. package/dist/src/cache/index.d.ts.map +0 -1
  88. package/dist/src/cache/index.js +0 -5
  89. package/dist/src/config/constants.d.ts +0 -25
  90. package/dist/src/config/constants.d.ts.map +0 -1
  91. package/dist/src/config/constants.js +0 -30
  92. package/dist/src/config/index.d.ts +0 -6
  93. package/dist/src/config/index.d.ts.map +0 -1
  94. package/dist/src/config/index.js +0 -6
  95. package/dist/src/config/indicator-config.d.ts +0 -107
  96. package/dist/src/config/indicator-config.d.ts.map +0 -1
  97. package/dist/src/config/indicator-config.js +0 -158
  98. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  99. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  100. package/dist/src/constants/defaultPersonas.js +0 -18
  101. package/dist/src/constants/limits.d.ts +0 -10
  102. package/dist/src/constants/limits.d.ts.map +0 -1
  103. package/dist/src/constants/limits.js +0 -13
  104. package/dist/src/errors/SecurityError.d.ts +0 -29
  105. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  106. package/dist/src/errors/SecurityError.js +0 -47
  107. package/dist/src/errors/index.d.ts +0 -2
  108. package/dist/src/errors/index.d.ts.map +0 -1
  109. package/dist/src/errors/index.js +0 -2
  110. package/dist/src/index.barrel.d.ts +0 -21
  111. package/dist/src/index.barrel.d.ts.map +0 -1
  112. package/dist/src/index.barrel.js +0 -31
  113. package/dist/src/index.d.ts +0 -220
  114. package/dist/src/index.d.ts.map +0 -1
  115. package/dist/src/index.js +0 -1559
  116. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  117. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  118. package/dist/src/marketplace/GitHubClient.js +0 -112
  119. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  120. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  121. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  122. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  123. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  124. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  125. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  126. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  127. package/dist/src/marketplace/PersonaDetails.js +0 -71
  128. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  129. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  130. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  131. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  132. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  133. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  134. package/dist/src/marketplace/index.d.ts +0 -10
  135. package/dist/src/marketplace/index.d.ts.map +0 -1
  136. package/dist/src/marketplace/index.js +0 -10
  137. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  138. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  139. package/dist/src/persona/PersonaLoader.js +0 -139
  140. package/dist/src/persona/PersonaManager.d.ts +0 -112
  141. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  142. package/dist/src/persona/PersonaManager.js +0 -341
  143. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  144. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  145. package/dist/src/persona/PersonaValidator.js +0 -157
  146. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  147. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  148. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  149. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  150. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  151. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  152. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  153. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  154. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  155. package/dist/src/persona/export-import/index.d.ts +0 -10
  156. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  157. package/dist/src/persona/export-import/index.js +0 -7
  158. package/dist/src/persona/index.d.ts +0 -7
  159. package/dist/src/persona/index.d.ts.map +0 -1
  160. package/dist/src/persona/index.js +0 -7
  161. package/dist/src/security/InputValidator.d.ts +0 -69
  162. package/dist/src/security/InputValidator.d.ts.map +0 -1
  163. package/dist/src/security/InputValidator.js +0 -381
  164. package/dist/src/security/commandValidator.d.ts +0 -7
  165. package/dist/src/security/commandValidator.d.ts.map +0 -1
  166. package/dist/src/security/commandValidator.js +0 -77
  167. package/dist/src/security/constants.d.ts +0 -21
  168. package/dist/src/security/constants.d.ts.map +0 -1
  169. package/dist/src/security/constants.js +0 -23
  170. package/dist/src/security/contentValidator.d.ts +0 -47
  171. package/dist/src/security/contentValidator.d.ts.map +0 -1
  172. package/dist/src/security/contentValidator.js +0 -188
  173. package/dist/src/security/fileLockManager.d.ts +0 -70
  174. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  175. package/dist/src/security/fileLockManager.js +0 -187
  176. package/dist/src/security/index.d.ts +0 -12
  177. package/dist/src/security/index.d.ts.map +0 -1
  178. package/dist/src/security/index.js +0 -14
  179. package/dist/src/security/pathValidator.d.ts +0 -9
  180. package/dist/src/security/pathValidator.d.ts.map +0 -1
  181. package/dist/src/security/pathValidator.js +0 -97
  182. package/dist/src/security/secureYamlParser.d.ts +0 -46
  183. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  184. package/dist/src/security/secureYamlParser.js +0 -203
  185. package/dist/src/security/securityMonitor.d.ts +0 -58
  186. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  187. package/dist/src/security/securityMonitor.js +0 -108
  188. package/dist/src/security/tokenManager.d.ts +0 -59
  189. package/dist/src/security/tokenManager.d.ts.map +0 -1
  190. package/dist/src/security/tokenManager.js +0 -216
  191. package/dist/src/security/yamlValidator.d.ts +0 -20
  192. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  193. package/dist/src/security/yamlValidator.js +0 -138
  194. package/dist/src/server/ServerSetup.d.ts +0 -31
  195. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  196. package/dist/src/server/ServerSetup.js +0 -79
  197. package/dist/src/server/index.d.ts +0 -7
  198. package/dist/src/server/index.d.ts.map +0 -1
  199. package/dist/src/server/index.js +0 -7
  200. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  201. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  202. package/dist/src/server/tools/ConfigTools.js +0 -63
  203. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  204. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  205. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  206. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  207. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  208. package/dist/src/server/tools/PersonaTools.js +0 -257
  209. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  210. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  211. package/dist/src/server/tools/ToolRegistry.js +0 -40
  212. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  213. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  214. package/dist/src/server/tools/UpdateTools.js +0 -64
  215. package/dist/src/server/tools/UserTools.d.ts +0 -10
  216. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  217. package/dist/src/server/tools/UserTools.js +0 -51
  218. package/dist/src/server/tools/index.d.ts +0 -10
  219. package/dist/src/server/tools/index.d.ts.map +0 -1
  220. package/dist/src/server/tools/index.js +0 -10
  221. package/dist/src/server/types.d.ts +0 -34
  222. package/dist/src/server/types.d.ts.map +0 -1
  223. package/dist/src/server/types.js +0 -5
  224. package/dist/src/tools/debug.d.ts +0 -20
  225. package/dist/src/tools/debug.d.ts.map +0 -1
  226. package/dist/src/tools/debug.js +0 -37
  227. package/dist/src/types/cache.d.ts +0 -8
  228. package/dist/src/types/cache.d.ts.map +0 -1
  229. package/dist/src/types/cache.js +0 -5
  230. package/dist/src/types/index.d.ts +0 -8
  231. package/dist/src/types/index.d.ts.map +0 -1
  232. package/dist/src/types/index.js +0 -8
  233. package/dist/src/types/marketplace.d.ts +0 -23
  234. package/dist/src/types/marketplace.d.ts.map +0 -1
  235. package/dist/src/types/marketplace.js +0 -5
  236. package/dist/src/types/mcp.d.ts +0 -161
  237. package/dist/src/types/mcp.d.ts.map +0 -1
  238. package/dist/src/types/mcp.js +0 -75
  239. package/dist/src/types/persona.d.ts +0 -30
  240. package/dist/src/types/persona.d.ts.map +0 -1
  241. package/dist/src/types/persona.js +0 -5
  242. package/dist/src/update/BackupManager.d.ts +0 -46
  243. package/dist/src/update/BackupManager.d.ts.map +0 -1
  244. package/dist/src/update/BackupManager.js +0 -261
  245. package/dist/src/update/DependencyChecker.d.ts +0 -41
  246. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  247. package/dist/src/update/DependencyChecker.js +0 -132
  248. package/dist/src/update/RateLimiter.d.ts +0 -80
  249. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  250. package/dist/src/update/RateLimiter.js +0 -172
  251. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  252. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  253. package/dist/src/update/SignatureVerifier.js +0 -214
  254. package/dist/src/update/UpdateChecker.d.ts +0 -127
  255. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  256. package/dist/src/update/UpdateChecker.js +0 -460
  257. package/dist/src/update/UpdateManager.d.ts +0 -41
  258. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  259. package/dist/src/update/UpdateManager.js +0 -260
  260. package/dist/src/update/VersionManager.d.ts +0 -31
  261. package/dist/src/update/VersionManager.d.ts.map +0 -1
  262. package/dist/src/update/VersionManager.js +0 -134
  263. package/dist/src/update/index.d.ts +0 -9
  264. package/dist/src/update/index.d.ts.map +0 -1
  265. package/dist/src/update/index.js +0 -9
  266. package/dist/src/utils/filesystem.d.ts +0 -32
  267. package/dist/src/utils/filesystem.d.ts.map +0 -1
  268. package/dist/src/utils/filesystem.js +0 -73
  269. package/dist/src/utils/git.d.ts +0 -32
  270. package/dist/src/utils/git.d.ts.map +0 -1
  271. package/dist/src/utils/git.js +0 -65
  272. package/dist/src/utils/index.d.ts +0 -7
  273. package/dist/src/utils/index.d.ts.map +0 -1
  274. package/dist/src/utils/index.js +0 -7
  275. package/dist/src/utils/logger.d.ts +0 -45
  276. package/dist/src/utils/logger.d.ts.map +0 -1
  277. package/dist/src/utils/logger.js +0 -91
  278. package/dist/src/utils/version.d.ts +0 -25
  279. package/dist/src/utils/version.d.ts.map +0 -1
  280. package/dist/src/utils/version.js +0 -97
  281. package/dist/test/src/cache/APICache.d.ts +0 -23
  282. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  283. package/dist/test/src/cache/APICache.js +0 -42
  284. package/dist/test/src/cache/index.d.ts +0 -5
  285. package/dist/test/src/cache/index.d.ts.map +0 -1
  286. package/dist/test/src/cache/index.js +0 -5
  287. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  288. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  289. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  290. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  291. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  292. package/dist/test/src/collection/CollectionSearch.js +0 -48
  293. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  294. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  295. package/dist/test/src/collection/GitHubClient.js +0 -114
  296. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  297. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  298. package/dist/test/src/collection/PersonaDetails.js +0 -71
  299. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  300. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  301. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  302. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  303. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  304. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  305. package/dist/test/src/collection/index.d.ts +0 -10
  306. package/dist/test/src/collection/index.d.ts.map +0 -1
  307. package/dist/test/src/collection/index.js +0 -10
  308. package/dist/test/src/config/constants.d.ts +0 -25
  309. package/dist/test/src/config/constants.d.ts.map +0 -1
  310. package/dist/test/src/config/constants.js +0 -30
  311. package/dist/test/src/config/index.d.ts +0 -6
  312. package/dist/test/src/config/index.d.ts.map +0 -1
  313. package/dist/test/src/config/index.js +0 -6
  314. package/dist/test/src/config/indicator-config.d.ts +0 -107
  315. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  316. package/dist/test/src/config/indicator-config.js +0 -158
  317. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  318. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  319. package/dist/test/src/constants/defaultPersonas.js +0 -18
  320. package/dist/test/src/constants/limits.d.ts +0 -10
  321. package/dist/test/src/constants/limits.d.ts.map +0 -1
  322. package/dist/test/src/constants/limits.js +0 -13
  323. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  324. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  325. package/dist/test/src/elements/BaseElement.js +0 -381
  326. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  327. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  328. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  329. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  330. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  331. package/dist/test/src/elements/agents/Agent.js +0 -848
  332. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  333. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  334. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  335. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  336. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  337. package/dist/test/src/elements/agents/constants.js +0 -45
  338. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  339. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  340. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  341. package/dist/test/src/elements/agents/index.d.ts +0 -8
  342. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  343. package/dist/test/src/elements/agents/index.js +0 -8
  344. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  345. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  346. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  347. package/dist/test/src/elements/agents/types.d.ts +0 -97
  348. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  349. package/dist/test/src/elements/agents/types.js +0 -5
  350. package/dist/test/src/elements/index.d.ts +0 -6
  351. package/dist/test/src/elements/index.d.ts.map +0 -1
  352. package/dist/test/src/elements/index.js +0 -6
  353. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  354. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  355. package/dist/test/src/elements/memories/Memory.js +0 -470
  356. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  357. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  358. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  359. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  360. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  361. package/dist/test/src/elements/memories/constants.js +0 -49
  362. package/dist/test/src/elements/memories/index.d.ts +0 -6
  363. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  364. package/dist/test/src/elements/memories/index.js +0 -6
  365. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  366. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  367. package/dist/test/src/elements/skills/Skill.js +0 -381
  368. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  369. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  370. package/dist/test/src/elements/templates/Template.js +0 -673
  371. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  372. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  373. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  374. package/dist/test/src/elements/templates/index.d.ts +0 -6
  375. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  376. package/dist/test/src/elements/templates/index.js +0 -6
  377. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  378. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  379. package/dist/test/src/errors/SecurityError.js +0 -47
  380. package/dist/test/src/errors/index.d.ts +0 -2
  381. package/dist/test/src/errors/index.d.ts.map +0 -1
  382. package/dist/test/src/errors/index.js +0 -2
  383. package/dist/test/src/index.barrel.d.ts +0 -21
  384. package/dist/test/src/index.barrel.d.ts.map +0 -1
  385. package/dist/test/src/index.barrel.js +0 -31
  386. package/dist/test/src/index.d.ts +0 -223
  387. package/dist/test/src/index.d.ts.map +0 -1
  388. package/dist/test/src/index.js +0 -1594
  389. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  390. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  391. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  392. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  393. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  394. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  395. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  396. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  397. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  398. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  399. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  400. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  401. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  402. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  403. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  404. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  405. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  406. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  407. package/dist/test/src/marketplace/index.d.ts +0 -10
  408. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  409. package/dist/test/src/marketplace/index.js +0 -10
  410. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  411. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  412. package/dist/test/src/persona/PersonaElement.js +0 -223
  413. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  414. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  415. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  416. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  417. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  418. package/dist/test/src/persona/PersonaLoader.js +0 -145
  419. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  420. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  421. package/dist/test/src/persona/PersonaManager.js +0 -341
  422. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  423. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  424. package/dist/test/src/persona/PersonaValidator.js +0 -157
  425. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  426. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  427. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  428. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  429. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  430. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  431. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  432. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  433. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  434. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  435. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  436. package/dist/test/src/persona/export-import/index.js +0 -7
  437. package/dist/test/src/persona/index.d.ts +0 -7
  438. package/dist/test/src/persona/index.d.ts.map +0 -1
  439. package/dist/test/src/persona/index.js +0 -7
  440. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  441. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  442. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  443. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  444. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  445. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  446. package/dist/test/src/portfolio/types.d.ts +0 -18
  447. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  448. package/dist/test/src/portfolio/types.js +0 -13
  449. package/dist/test/src/security/InputValidator.d.ts +0 -80
  450. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  451. package/dist/test/src/security/InputValidator.js +0 -436
  452. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  453. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  454. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  455. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  456. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  457. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  458. package/dist/test/src/security/audit/index.d.ts +0 -14
  459. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  460. package/dist/test/src/security/audit/index.js +0 -15
  461. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  462. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  463. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  464. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  465. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  466. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  467. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  468. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  469. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  470. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  471. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  472. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  473. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  474. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  475. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  476. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  477. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  478. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  479. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  480. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  481. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  482. package/dist/test/src/security/audit/types.d.ts +0 -94
  483. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  484. package/dist/test/src/security/audit/types.js +0 -6
  485. package/dist/test/src/security/commandValidator.d.ts +0 -7
  486. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  487. package/dist/test/src/security/commandValidator.js +0 -78
  488. package/dist/test/src/security/constants.d.ts +0 -24
  489. package/dist/test/src/security/constants.d.ts.map +0 -1
  490. package/dist/test/src/security/constants.js +0 -26
  491. package/dist/test/src/security/contentValidator.d.ts +0 -47
  492. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  493. package/dist/test/src/security/contentValidator.js +0 -301
  494. package/dist/test/src/security/errors.d.ts +0 -14
  495. package/dist/test/src/security/errors.d.ts.map +0 -1
  496. package/dist/test/src/security/errors.js +0 -28
  497. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  498. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  499. package/dist/test/src/security/fileLockManager.js +0 -187
  500. package/dist/test/src/security/index.d.ts +0 -12
  501. package/dist/test/src/security/index.d.ts.map +0 -1
  502. package/dist/test/src/security/index.js +0 -14
  503. package/dist/test/src/security/pathValidator.d.ts +0 -9
  504. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  505. package/dist/test/src/security/pathValidator.js +0 -98
  506. package/dist/test/src/security/regexValidator.d.ts +0 -59
  507. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  508. package/dist/test/src/security/regexValidator.js +0 -214
  509. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  510. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  511. package/dist/test/src/security/secureYamlParser.js +0 -203
  512. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  513. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  514. package/dist/test/src/security/securityMonitor.js +0 -108
  515. package/dist/test/src/security/tokenManager.d.ts +0 -85
  516. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  517. package/dist/test/src/security/tokenManager.js +0 -286
  518. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  519. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  520. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  521. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  522. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  523. package/dist/test/src/security/yamlValidator.js +0 -164
  524. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  525. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  526. package/dist/test/src/server/ServerSetup.js +0 -116
  527. package/dist/test/src/server/index.d.ts +0 -7
  528. package/dist/test/src/server/index.d.ts.map +0 -1
  529. package/dist/test/src/server/index.js +0 -7
  530. package/dist/test/src/server/startup.d.ts +0 -31
  531. package/dist/test/src/server/startup.d.ts.map +0 -1
  532. package/dist/test/src/server/startup.js +0 -67
  533. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  534. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  535. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  536. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  537. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  538. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  539. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  540. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  541. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  542. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  543. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  544. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  545. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  546. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  547. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  548. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  549. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  550. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  551. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  552. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  553. package/dist/test/src/server/tools/UserTools.js +0 -51
  554. package/dist/test/src/server/tools/index.d.ts +0 -10
  555. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  556. package/dist/test/src/server/tools/index.js +0 -10
  557. package/dist/test/src/server/types.d.ts +0 -34
  558. package/dist/test/src/server/types.d.ts.map +0 -1
  559. package/dist/test/src/server/types.js +0 -5
  560. package/dist/test/src/tools/debug.d.ts +0 -20
  561. package/dist/test/src/tools/debug.d.ts.map +0 -1
  562. package/dist/test/src/tools/debug.js +0 -37
  563. package/dist/test/src/types/cache.d.ts +0 -8
  564. package/dist/test/src/types/cache.d.ts.map +0 -1
  565. package/dist/test/src/types/cache.js +0 -5
  566. package/dist/test/src/types/collection.d.ts +0 -23
  567. package/dist/test/src/types/collection.d.ts.map +0 -1
  568. package/dist/test/src/types/collection.js +0 -5
  569. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  570. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  571. package/dist/test/src/types/elements/IElement.js +0 -30
  572. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  573. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  574. package/dist/test/src/types/elements/IElementManager.js +0 -6
  575. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  576. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  577. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  578. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  579. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  580. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  581. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  582. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  583. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  584. package/dist/test/src/types/elements/index.d.ts +0 -9
  585. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  586. package/dist/test/src/types/elements/index.js +0 -11
  587. package/dist/test/src/types/index.d.ts +0 -9
  588. package/dist/test/src/types/index.d.ts.map +0 -1
  589. package/dist/test/src/types/index.js +0 -9
  590. package/dist/test/src/types/marketplace.d.ts +0 -23
  591. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  592. package/dist/test/src/types/marketplace.js +0 -5
  593. package/dist/test/src/types/mcp.d.ts +0 -84
  594. package/dist/test/src/types/mcp.d.ts.map +0 -1
  595. package/dist/test/src/types/mcp.js +0 -80
  596. package/dist/test/src/types/persona.d.ts +0 -30
  597. package/dist/test/src/types/persona.d.ts.map +0 -1
  598. package/dist/test/src/types/persona.js +0 -5
  599. package/dist/test/src/update/BackupManager.d.ts +0 -46
  600. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  601. package/dist/test/src/update/BackupManager.js +0 -261
  602. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  603. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  604. package/dist/test/src/update/DependencyChecker.js +0 -132
  605. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  606. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  607. package/dist/test/src/update/RateLimiter.js +0 -172
  608. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  609. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  610. package/dist/test/src/update/SignatureVerifier.js +0 -214
  611. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  612. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  613. package/dist/test/src/update/UpdateChecker.js +0 -469
  614. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  615. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  616. package/dist/test/src/update/UpdateManager.js +0 -260
  617. package/dist/test/src/update/VersionManager.d.ts +0 -31
  618. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  619. package/dist/test/src/update/VersionManager.js +0 -134
  620. package/dist/test/src/update/index.d.ts +0 -9
  621. package/dist/test/src/update/index.d.ts.map +0 -1
  622. package/dist/test/src/update/index.js +0 -9
  623. package/dist/test/src/utils/filesystem.d.ts +0 -29
  624. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  625. package/dist/test/src/utils/filesystem.js +0 -94
  626. package/dist/test/src/utils/git.d.ts +0 -32
  627. package/dist/test/src/utils/git.d.ts.map +0 -1
  628. package/dist/test/src/utils/git.js +0 -65
  629. package/dist/test/src/utils/index.d.ts +0 -7
  630. package/dist/test/src/utils/index.d.ts.map +0 -1
  631. package/dist/test/src/utils/index.js +0 -7
  632. package/dist/test/src/utils/logger.d.ts +0 -45
  633. package/dist/test/src/utils/logger.d.ts.map +0 -1
  634. package/dist/test/src/utils/logger.js +0 -91
  635. package/dist/test/src/utils/version.d.ts +0 -25
  636. package/dist/test/src/utils/version.d.ts.map +0 -1
  637. package/dist/test/src/utils/version.js +0 -97
  638. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  639. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  640. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  641. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  642. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  643. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  644. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  645. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  646. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  647. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  648. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  649. package/dist/test/test/__tests__/integration/setup.js +0 -31
  650. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  651. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  652. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  653. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  654. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  655. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  656. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  657. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  658. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  659. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  660. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  661. package/dist/test/test/__tests__/security/index.js +0 -98
  662. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  663. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  664. package/dist/test/test/__tests__/security/setup.js +0 -23
  665. package/dist/types/marketplace.d.ts +0 -23
  666. package/dist/types/marketplace.d.ts.map +0 -1
  667. package/dist/types/marketplace.js +0 -5
package/dist/index.js CHANGED
@@ -1,4 +1,13 @@
1
1
  #!/usr/bin/env node
2
+ // Defensive error handling for npx/CLI execution
3
+ process.on('uncaughtException', (error) => {
4
+ console.error('[DollhouseMCP] Server startup failed');
5
+ process.exit(1);
6
+ });
7
+ process.on('unhandledRejection', (reason, promise) => {
8
+ console.error('[DollhouseMCP] Server startup failed');
9
+ process.exit(1);
10
+ });
2
11
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
13
  import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
@@ -18,6 +27,7 @@ import { generateAnonymousId, generateUniqueId, slugify } from './utils/filesyst
18
27
  import { GitHubClient, CollectionBrowser, CollectionSearch, PersonaDetails, PersonaSubmitter, ElementInstaller } from './collection/index.js';
19
28
  import { UpdateManager } from './update/index.js';
20
29
  import { ServerSetup } from './server/index.js';
30
+ import { GitHubAuthManager } from './auth/GitHubAuthManager.js';
21
31
  import { logger } from './utils/logger.js';
22
32
  import { PersonaExporter, PersonaImporter, PersonaSharer } from './persona/export-import/index.js';
23
33
  import { isDefaultPersona } from './constants/defaultPersonas.js';
@@ -26,6 +36,18 @@ import { MigrationManager } from './portfolio/MigrationManager.js';
26
36
  import { SkillManager } from './elements/skills/index.js';
27
37
  import { TemplateManager } from './elements/templates/TemplateManager.js';
28
38
  import { AgentManager } from './elements/agents/AgentManager.js';
39
+ // Detect execution environment
40
+ const EXECUTION_ENV = {
41
+ isNpx: process.env.npm_execpath?.includes('npx') || false,
42
+ isCli: process.argv[1]?.endsWith('/dollhousemcp') || false,
43
+ isDirect: !process.env.npm_execpath,
44
+ cwd: process.cwd(),
45
+ scriptPath: process.argv[1],
46
+ };
47
+ // Only log execution environment in debug mode
48
+ if (process.env.DOLLHOUSE_DEBUG) {
49
+ console.error('[DollhouseMCP] Debug mode enabled');
50
+ }
29
51
  export class DollhouseMCPServer {
30
52
  server;
31
53
  personasDir;
@@ -36,6 +58,7 @@ export class DollhouseMCPServer {
36
58
  rateLimitTracker = new Map();
37
59
  indicatorConfig;
38
60
  githubClient;
61
+ githubAuthManager;
39
62
  collectionBrowser;
40
63
  collectionSearch;
41
64
  personaDetails;
@@ -81,6 +104,7 @@ export class DollhouseMCPServer {
81
104
  // Initialize persona manager
82
105
  // Initialize collection modules
83
106
  this.githubClient = new GitHubClient(this.apiCache, this.rateLimitTracker);
107
+ this.githubAuthManager = new GitHubAuthManager(this.apiCache);
84
108
  this.collectionBrowser = new CollectionBrowser(this.githubClient);
85
109
  this.collectionSearch = new CollectionSearch(this.githubClient);
86
110
  this.personaDetails = new PersonaDetails(this.githubClient);
@@ -1684,6 +1708,26 @@ export class DollhouseMCPServer {
1684
1708
  }
1685
1709
  }
1686
1710
  async submitContent(contentIdentifier) {
1711
+ // Check GitHub authentication first
1712
+ const authStatus = await this.githubAuthManager.getAuthStatus();
1713
+ if (!authStatus.isAuthenticated) {
1714
+ return {
1715
+ content: [
1716
+ {
1717
+ type: "text",
1718
+ text: `${this.getPersonaIndicator()}🔐 **GitHub Authentication Required**\n\n` +
1719
+ `To submit content to the DollhouseMCP collection, you need to connect to GitHub.\n\n` +
1720
+ `**Why GitHub?**\n` +
1721
+ `• It's where our community shares content\n` +
1722
+ `• Free account with millions of developers\n` +
1723
+ `• Secure and reliable platform\n\n` +
1724
+ `**To get started:**\n` +
1725
+ `Just say "connect to GitHub" or "set up GitHub"\n\n` +
1726
+ `Don't have a GitHub account? No problem! You'll be guided through creating one.`,
1727
+ },
1728
+ ],
1729
+ };
1730
+ }
1687
1731
  // Find the content in local collection
1688
1732
  let persona = this.personas.get(contentIdentifier);
1689
1733
  if (!persona) {
@@ -1878,6 +1922,153 @@ export class DollhouseMCPServer {
1878
1922
  getCurrentUserForAttribution() {
1879
1923
  return this.currentUser || generateAnonymousId();
1880
1924
  }
1925
+ // GitHub authentication management
1926
+ async setupGitHubAuth() {
1927
+ try {
1928
+ // Check current auth status first
1929
+ const currentStatus = await this.githubAuthManager.getAuthStatus();
1930
+ if (currentStatus.isAuthenticated) {
1931
+ return {
1932
+ content: [{
1933
+ type: "text",
1934
+ text: `${this.getPersonaIndicator()}✅ **Already Connected to GitHub**\n\n` +
1935
+ `👤 **Username:** ${currentStatus.username}\n` +
1936
+ `🔑 **Permissions:** ${currentStatus.scopes?.join(', ') || 'basic access'}\n\n` +
1937
+ `You're all set! You can:\n` +
1938
+ `• Browse the collection\n` +
1939
+ `• Install content\n` +
1940
+ `• Submit your creations\n\n` +
1941
+ `To disconnect, say "disconnect from GitHub"`
1942
+ }]
1943
+ };
1944
+ }
1945
+ // Initiate device flow
1946
+ const deviceResponse = await this.githubAuthManager.initiateDeviceFlow();
1947
+ // Start polling in background
1948
+ this.pollForAuthCompletion(deviceResponse.device_code, deviceResponse.interval);
1949
+ // Return instructions to user
1950
+ return {
1951
+ content: [{
1952
+ type: "text",
1953
+ text: this.githubAuthManager.formatAuthInstructions(deviceResponse)
1954
+ }]
1955
+ };
1956
+ }
1957
+ catch (error) {
1958
+ logger.error('Failed to setup GitHub auth', { error });
1959
+ return {
1960
+ content: [{
1961
+ type: "text",
1962
+ text: `${this.getPersonaIndicator()}❌ **Authentication Setup Failed**\n\n` +
1963
+ `Unable to start GitHub authentication: ${error instanceof Error ? error.message : 'Unknown error'}\n\n` +
1964
+ `Please check your internet connection and try again.`
1965
+ }]
1966
+ };
1967
+ }
1968
+ }
1969
+ async checkGitHubAuth() {
1970
+ try {
1971
+ const status = await this.githubAuthManager.getAuthStatus();
1972
+ if (status.isAuthenticated) {
1973
+ return {
1974
+ content: [{
1975
+ type: "text",
1976
+ text: `${this.getPersonaIndicator()}✅ **GitHub Connected**\n\n` +
1977
+ `👤 **Username:** ${status.username}\n` +
1978
+ `🔑 **Permissions:** ${status.scopes?.join(', ') || 'basic access'}\n\n` +
1979
+ `**Available Actions:**\n` +
1980
+ `✅ Browse collection\n` +
1981
+ `✅ Install content\n` +
1982
+ `✅ Submit content\n\n` +
1983
+ `Everything is working properly!`
1984
+ }]
1985
+ };
1986
+ }
1987
+ else if (status.hasToken) {
1988
+ return {
1989
+ content: [{
1990
+ type: "text",
1991
+ text: `${this.getPersonaIndicator()}⚠️ **GitHub Token Invalid**\n\n` +
1992
+ `A GitHub token was found but it appears to be invalid or expired.\n\n` +
1993
+ `**To fix this:**\n` +
1994
+ `1. Say "set up GitHub" to authenticate again\n` +
1995
+ `2. Or check your GITHUB_TOKEN environment variable\n\n` +
1996
+ `Note: Browse and install still work without authentication!`
1997
+ }]
1998
+ };
1999
+ }
2000
+ else {
2001
+ return {
2002
+ content: [{
2003
+ type: "text",
2004
+ text: `${this.getPersonaIndicator()}🔒 **Not Connected to GitHub**\n\n` +
2005
+ `You're not currently authenticated with GitHub.\n\n` +
2006
+ `**What works without auth:**\n` +
2007
+ `✅ Browse the public collection\n` +
2008
+ `✅ Install community content\n` +
2009
+ `❌ Submit your own content (requires auth)\n\n` +
2010
+ `To connect, just say "set up GitHub" or "connect to GitHub"`
2011
+ }]
2012
+ };
2013
+ }
2014
+ }
2015
+ catch (error) {
2016
+ logger.error('Failed to check GitHub auth', { error });
2017
+ return {
2018
+ content: [{
2019
+ type: "text",
2020
+ text: `${this.getPersonaIndicator()}❌ **Unable to Check Authentication**\n\n` +
2021
+ `Error: ${error instanceof Error ? error.message : 'Unknown error'}`
2022
+ }]
2023
+ };
2024
+ }
2025
+ }
2026
+ async clearGitHubAuth() {
2027
+ try {
2028
+ await this.githubAuthManager.clearAuthentication();
2029
+ return {
2030
+ content: [{
2031
+ type: "text",
2032
+ text: `${this.getPersonaIndicator()}✅ **GitHub Disconnected**\n\n` +
2033
+ `Your GitHub connection has been cleared.\n\n` +
2034
+ `**What still works:**\n` +
2035
+ `✅ Browse the public collection\n` +
2036
+ `✅ Install community content\n` +
2037
+ `❌ Submit content (requires reconnection)\n\n` +
2038
+ `To reconnect later, just say "connect to GitHub"\n\n` +
2039
+ `⚠️ **Note:** To fully remove authentication, also unset the GITHUB_TOKEN environment variable.`
2040
+ }]
2041
+ };
2042
+ }
2043
+ catch (error) {
2044
+ logger.error('Failed to clear GitHub auth', { error });
2045
+ return {
2046
+ content: [{
2047
+ type: "text",
2048
+ text: `${this.getPersonaIndicator()}❌ **Failed to Clear Authentication**\n\n` +
2049
+ `Error: ${error instanceof Error ? error.message : 'Unknown error'}`
2050
+ }]
2051
+ };
2052
+ }
2053
+ }
2054
+ /**
2055
+ * Poll for auth completion in the background
2056
+ */
2057
+ async pollForAuthCompletion(deviceCode, interval) {
2058
+ try {
2059
+ const tokenResponse = await this.githubAuthManager.pollForToken(deviceCode, interval);
2060
+ const authStatus = await this.githubAuthManager.completeAuthentication(tokenResponse);
2061
+ // Log success (user will see this in their next interaction)
2062
+ logger.info('GitHub authentication completed successfully', {
2063
+ username: authStatus.username,
2064
+ scopes: authStatus.scopes
2065
+ });
2066
+ }
2067
+ catch (error) {
2068
+ // Log error but don't throw - this runs in background
2069
+ logger.error('GitHub authentication polling failed', { error });
2070
+ }
2071
+ }
1881
2072
  // Chat-based persona management tools
1882
2073
  async createPersona(name, description, category, instructions, triggers) {
1883
2074
  try {
@@ -2837,6 +3028,30 @@ Placeholders for custom format:
2837
3028
  async run() {
2838
3029
  const transport = new StdioServerTransport();
2839
3030
  logger.info("Starting DollhouseMCP server...");
3031
+ // Set up graceful shutdown handlers
3032
+ const cleanup = async () => {
3033
+ logger.info("Shutting down DollhouseMCP server...");
3034
+ try {
3035
+ // Clean up GitHub auth manager
3036
+ if (this.githubAuthManager) {
3037
+ await this.githubAuthManager.cleanup();
3038
+ }
3039
+ // Clean up any other resources
3040
+ if (this.updateManager) {
3041
+ // UpdateManager might have active operations too
3042
+ logger.debug("Cleaning up update manager...");
3043
+ }
3044
+ logger.info("Cleanup completed");
3045
+ }
3046
+ catch (error) {
3047
+ logger.error("Error during cleanup", { error });
3048
+ }
3049
+ process.exit(0);
3050
+ };
3051
+ // Register shutdown handlers
3052
+ process.on('SIGINT', cleanup);
3053
+ process.on('SIGTERM', cleanup);
3054
+ process.on('SIGHUP', cleanup);
2840
3055
  await this.server.connect(transport);
2841
3056
  // Mark that MCP is now connected - no more console output allowed
2842
3057
  logger.setMCPConnected();
@@ -2845,11 +3060,35 @@ Placeholders for custom format:
2845
3060
  }
2846
3061
  // Export is already at class declaration
2847
3062
  // Only start the server if this file is being run directly (not imported by tests)
2848
- if (import.meta.url === `file://${process.argv[1]}` && !process.env.JEST_WORKER_ID) {
2849
- const server = new DollhouseMCPServer();
2850
- server.run().catch((error) => {
2851
- logger.error("Fatal error starting server", error);
3063
+ // Handle different execution methods (direct, npx, CLI)
3064
+ const isDirectExecution = import.meta.url === `file://${process.argv[1]}`;
3065
+ const isNpxExecution = process.env.npm_execpath?.includes('npx');
3066
+ const isCliExecution = process.argv[1]?.endsWith('/dollhousemcp') || process.argv[1]?.endsWith('\\dollhousemcp');
3067
+ const isTest = process.env.JEST_WORKER_ID;
3068
+ // Progressive startup with retries for npx/CLI execution
3069
+ const STARTUP_DELAYS = [10, 50, 100, 200]; // Progressive delays in ms
3070
+ async function startServerWithRetry(retriesLeft = STARTUP_DELAYS.length) {
3071
+ try {
3072
+ const server = new DollhouseMCPServer();
3073
+ await server.run();
3074
+ }
3075
+ catch (error) {
3076
+ if (retriesLeft > 0 && (isNpxExecution || isCliExecution)) {
3077
+ // Try again with a longer delay
3078
+ const delayIndex = STARTUP_DELAYS.length - retriesLeft;
3079
+ const delay = STARTUP_DELAYS[delayIndex];
3080
+ await new Promise(resolve => setTimeout(resolve, delay));
3081
+ return startServerWithRetry(retriesLeft - 1);
3082
+ }
3083
+ // Final failure - minimal error message for security
3084
+ console.error("[DollhouseMCP] Server startup failed");
3085
+ process.exit(1);
3086
+ }
3087
+ }
3088
+ if ((isDirectExecution || isNpxExecution || isCliExecution) && !isTest) {
3089
+ startServerWithRetry().catch(() => {
3090
+ console.error("[DollhouseMCP] Server startup failed");
2852
3091
  process.exit(1);
2853
3092
  });
2854
3093
  }
2855
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQXdCLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSWhFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0osT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxNQUFN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QUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgU2VydmVyIH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTdGRpb1NlcnZlclRyYW5zcG9ydCB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9zdGRpby5qc1wiO1xuaW1wb3J0IHsgTWNwRXJyb3IsIEVycm9yQ29kZSB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3R5cGVzLmpzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxvYWRJbmRpY2F0b3JDb25maWcsIGZvcm1hdEluZGljYXRvciwgdmFsaWRhdGVDdXN0b21Gb3JtYXQsIHR5cGUgSW5kaWNhdG9yQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuL2Vycm9ycy9TZWN1cml0eUVycm9yLmpzJztcbmltcG9ydCB7IFNlY3VyZUVycm9ySGFuZGxlciB9IGZyb20gJy4vc2VjdXJpdHkvZXJyb3JIYW5kbGVyLmpzJztcblxuLy8gSW1wb3J0IG1vZHVsYXJpemVkIGNvbXBvbmVudHNcbmltcG9ydCB7IFBlcnNvbmEsIFBlcnNvbmFNZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMvcGVyc29uYS5qcyc7XG5pbXBvcnQgeyBBUElDYWNoZSB9IGZyb20gJy4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWxlbmFtZSwgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVDb250ZW50U2l6ZSwgdmFsaWRhdGVVc2VybmFtZSwgdmFsaWRhdGVDYXRlZ29yeSwgTUNQSW5wdXRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUywgVkFMSURBVElPTl9QQVRURVJOUyB9IGZyb20gJy4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFub255bW91c0lkLCBnZW5lcmF0ZVVuaXF1ZUlkLCBzbHVnaWZ5IH0gZnJvbSAnLi91dGlscy9maWxlc3lzdGVtLmpzJztcbmltcG9ydCB7IEdpdEh1YkNsaWVudCwgQ29sbGVjdGlvbkJyb3dzZXIsIENvbGxlY3Rpb25TZWFyY2gsIFBlcnNvbmFEZXRhaWxzLCBQZXJzb25hU3VibWl0dGVyLCBFbGVtZW50SW5zdGFsbGVyIH0gZnJvbSAnLi9jb2xsZWN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7IFVwZGF0ZU1hbmFnZXIgfSBmcm9tICcuL3VwZGF0ZS9pbmRleC5qcyc7XG5pbXBvcnQgeyBTZXJ2ZXJTZXR1cCwgSVRvb2xIYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvaW5kZXguanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUGVyc29uYUV4cG9ydGVyLCBQZXJzb25hSW1wb3J0ZXIsIFBlcnNvbmFTaGFyZXIgfSBmcm9tICcuL3BlcnNvbmEvZXhwb3J0LWltcG9ydC9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0RlZmF1bHRQZXJzb25hIH0gZnJvbSAnLi9jb25zdGFudHMvZGVmYXVsdFBlcnNvbmFzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIsIEVsZW1lbnRUeXBlIH0gZnJvbSAnLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNaWdyYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi9lbGVtZW50cy9hZ2VudHMvQWdlbnRNYW5hZ2VyLmpzJztcblxuXG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VNQ1BTZXJ2ZXIgaW1wbGVtZW50cyBJVG9vbEhhbmRsZXIge1xuICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICBwcml2YXRlIHBlcnNvbmFzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcGVyc29uYXM6IE1hcDxzdHJpbmcsIFBlcnNvbmE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGFjdGl2ZVBlcnNvbmE6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRVc2VyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhcGlDYWNoZTogQVBJQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTtcbiAgcHJpdmF0ZSByYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIGluZGljYXRvckNvbmZpZzogSW5kaWNhdG9yQ29uZmlnO1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIGNvbGxlY3Rpb25Ccm93c2VyOiBDb2xsZWN0aW9uQnJvd3NlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uU2VhcmNoOiBDb2xsZWN0aW9uU2VhcmNoO1xuICBwcml2YXRlIHBlcnNvbmFEZXRhaWxzOiBQZXJzb25hRGV0YWlscztcbiAgcHJpdmF0ZSBlbGVtZW50SW5zdGFsbGVyOiBFbGVtZW50SW5zdGFsbGVyO1xuICBwcml2YXRlIHBlcnNvbmFTdWJtaXR0ZXI6IFBlcnNvbmFTdWJtaXR0ZXI7XG4gIHByaXZhdGUgdXBkYXRlTWFuYWdlcj86IFVwZGF0ZU1hbmFnZXI7XG4gIHByaXZhdGUgc2VydmVyU2V0dXA6IFNlcnZlclNldHVwO1xuICBwcml2YXRlIHBlcnNvbmFFeHBvcnRlcjogUGVyc29uYUV4cG9ydGVyO1xuICBwcml2YXRlIHBlcnNvbmFJbXBvcnRlcj86IFBlcnNvbmFJbXBvcnRlcjtcbiAgcHJpdmF0ZSBwZXJzb25hU2hhcmVyOiBQZXJzb25hU2hhcmVyO1xuICBwcml2YXRlIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgbWlncmF0aW9uTWFuYWdlcjogTWlncmF0aW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBza2lsbE1hbmFnZXI6IFNraWxsTWFuYWdlcjtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZU1hbmFnZXI6IFRlbXBsYXRlTWFuYWdlcjtcbiAgcHJpdmF0ZSBhZ2VudE1hbmFnZXI6IEFnZW50TWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNlcnZlciA9IG5ldyBTZXJ2ZXIoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiZG9sbGhvdXNlbWNwXCIsXG4gICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgIHRvb2xzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3lzdGVtXG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMubWlncmF0aW9uTWFuYWdlciA9IG5ldyBNaWdyYXRpb25NYW5hZ2VyKHRoaXMucG9ydGZvbGlvTWFuYWdlcik7XG4gICAgXG4gICAgLy8gQ1JJVElDQUwgRklYOiBEb24ndCBhY2Nlc3MgZGlyZWN0b3JpZXMgdW50aWwgYWZ0ZXIgbWlncmF0aW9uIHJ1bnNcbiAgICAvLyBQcmV2aW91c2x5OiB0aGlzLnBlcnNvbmFzRGlyIHdhcyBzZXQgaGVyZSwgY3JlYXRpbmcgZGlyZWN0b3JpZXMgYmVmb3JlIG1pZ3JhdGlvbiBjb3VsZCBmaXggdGhlbVxuICAgIC8vIE5vdzogV2UgZGVsYXkgZGlyZWN0b3J5IGFjY2VzcyB1bnRpbCBpbml0aWFsaXplUG9ydGZvbGlvKCkgY29tcGxldGVzXG4gICAgdGhpcy5wZXJzb25hc0RpciA9ICcnOyAvLyBUZW1wb3JhcnkgLSB3aWxsIGJlIHNldCBhZnRlciBtaWdyYXRpb25cbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVsZW1lbnQgbWFuYWdlcnNcbiAgICB0aGlzLnNraWxsTWFuYWdlciA9IG5ldyBTa2lsbE1hbmFnZXIoKTtcbiAgICB0aGlzLnRlbXBsYXRlTWFuYWdlciA9IG5ldyBUZW1wbGF0ZU1hbmFnZXIoKTtcbiAgICB0aGlzLmFnZW50TWFuYWdlciA9IG5ldyBBZ2VudE1hbmFnZXIodGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEJhc2VEaXIoKSk7XG4gICAgXG4gICAgLy8gTG9nIHJlc29sdmVkIHBhdGggZm9yIGRlYnVnZ2luZ1xuICAgIGxvZ2dlci5pbmZvKGBQZXJzb25hcyBkaXJlY3RvcnkgcmVzb2x2ZWQgdG86ICR7dGhpcy5wZXJzb25hc0Rpcn1gKTtcbiAgICBcbiAgICAvLyBQYXRoVmFsaWRhdG9yIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgbWlncmF0aW9uIGNvbXBsZXRlc1xuICAgIFxuICAgIC8vIExvYWQgdXNlciBpZGVudGl0eSBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCBudWxsO1xuICAgIFxuICAgIC8vIExvYWQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmluZGljYXRvckNvbmZpZyA9IGxvYWRJbmRpY2F0b3JDb25maWcoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHBlcnNvbmEgbWFuYWdlclxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgY29sbGVjdGlvbiBtb2R1bGVzXG4gICAgdGhpcy5naXRodWJDbGllbnQgPSBuZXcgR2l0SHViQ2xpZW50KHRoaXMuYXBpQ2FjaGUsIHRoaXMucmF0ZUxpbWl0VHJhY2tlcik7XG4gICAgdGhpcy5jb2xsZWN0aW9uQnJvd3NlciA9IG5ldyBDb2xsZWN0aW9uQnJvd3Nlcih0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgdGhpcy5jb2xsZWN0aW9uU2VhcmNoID0gbmV3IENvbGxlY3Rpb25TZWFyY2godGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMucGVyc29uYURldGFpbHMgPSBuZXcgUGVyc29uYURldGFpbHModGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMuZWxlbWVudEluc3RhbGxlciA9IG5ldyBFbGVtZW50SW5zdGFsbGVyKHRoaXMuZ2l0aHViQ2xpZW50KTtcbiAgICB0aGlzLnBlcnNvbmFTdWJtaXR0ZXIgPSBuZXcgUGVyc29uYVN1Ym1pdHRlcigpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBtYW5hZ2VyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgbWlncmF0aW9uIGNvbXBsZXRlcyB0byBhdm9pZCBqc2RvbSBjcmFzaFxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZXhwb3J0L2ltcG9ydC9zaGFyZSBtb2R1bGVzXG4gICAgdGhpcy5wZXJzb25hRXhwb3J0ZXIgPSBuZXcgUGVyc29uYUV4cG9ydGVyKHRoaXMuY3VycmVudFVzZXIpO1xuICAgIC8vIFBlcnNvbmFJbXBvcnRlciB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIG1pZ3JhdGlvbiBjb21wbGV0ZXNcbiAgICB0aGlzLnBlcnNvbmFTaGFyZXIgPSBuZXcgUGVyc29uYVNoYXJlcih0aGlzLmdpdGh1YkNsaWVudCwgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2ZXIgc2V0dXBcbiAgICB0aGlzLnNlcnZlclNldHVwID0gbmV3IFNlcnZlclNldHVwKCk7XG4gICAgdGhpcy5zZXJ2ZXJTZXR1cC5zZXR1cFNlcnZlcih0aGlzLnNlcnZlciwgdGhpcyk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gYW5kIHBlcmZvcm0gbWlncmF0aW9uIGlmIG5lZWRlZFxuICAgIHRoaXMuaW5pdGlhbGl6ZVBvcnRmb2xpbygpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gTk9XIHNhZmUgdG8gYWNjZXNzIGRpcmVjdG9yaWVzIGFmdGVyIG1pZ3JhdGlvblxuICAgICAgdGhpcy5wZXJzb25hc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuICAgICAgXG4gICAgICAvLyBMb2cgcmVzb2x2ZWQgcGF0aCBmb3IgZGVidWdnaW5nXG4gICAgICBsb2dnZXIuaW5mbyhgUGVyc29uYXMgZGlyZWN0b3J5IHJlc29sdmVkIHRvOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgUGF0aFZhbGlkYXRvciB3aXRoIHRoZSBwZXJzb25hcyBkaXJlY3RvcnlcbiAgICAgIFBhdGhWYWxpZGF0b3IuaW5pdGlhbGl6ZSh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGUgbWFuYWdlciB3aXRoIHNhZmUgZGlyZWN0b3J5XG4gICAgICAvLyBVc2UgdGhlIHBhcmVudCBvZiBwZXJzb25hcyBkaXJlY3RvcnkgdG8gYXZvaWQgcHJvZHVjdGlvbiBjaGVja1xuICAgICAgY29uc3Qgc2FmZURpciA9IHBhdGguZGlybmFtZSh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMudXBkYXRlTWFuYWdlciA9IG5ldyBVcGRhdGVNYW5hZ2VyKHNhZmVEaXIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gRmFpbGVkIHRvIGluaXRpYWxpemUgVXBkYXRlTWFuYWdlcjonLCBlcnJvcik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgVXBkYXRlTWFuYWdlcjogJHtlcnJvcn1gKTtcbiAgICAgICAgLy8gQ29udGludWUgd2l0aG91dCB1cGRhdGUgZnVuY3Rpb25hbGl0eVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIGltcG9ydCBtb2R1bGUgdGhhdCBkZXBlbmRzIG9uIHBlcnNvbmFzRGlyXG4gICAgICB0aGlzLnBlcnNvbmFJbXBvcnRlciA9IG5ldyBQZXJzb25hSW1wb3J0ZXIodGhpcy5wZXJzb25hc0RpciwgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgICBcbiAgICAgIHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgLy8gRG9uJ3QgdXNlIENSSVRJQ0FMIGluIHRoZSBlcnJvciBtZXNzYWdlIGFzIGl0IHRyaWdnZXJzIERvY2tlciB0ZXN0IGZhaWx1cmVzXG4gICAgICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3J0Zm9saW86JywgZXJyb3IpO1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3J0Zm9saW86ICR7ZXJyb3J9YCk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVBvcnRmb2xpbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBtaWdyYXRpb24gaXMgbmVlZGVkXG4gICAgY29uc3QgbmVlZHNNaWdyYXRpb24gPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubmVlZHNNaWdyYXRpb24oKTtcbiAgICBcbiAgICBpZiAobmVlZHNNaWdyYXRpb24pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdMZWdhY3kgcGVyc29uYXMgZGV0ZWN0ZWQuIFN0YXJ0aW5nIG1pZ3JhdGlvbi4uLicpO1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubWlncmF0ZSh7IGJhY2t1cDogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgbWlncmF0ZWQgJHtyZXN1bHQubWlncmF0ZWRDb3VudH0gcGVyc29uYXNgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5iYWNrZWRVcCAmJiByZXN1bHQuYmFja3VwUGF0aCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBCYWNrdXAgY3JlYXRlZCBhdDogJHtyZXN1bHQuYmFja3VwUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdNaWdyYXRpb24gY29tcGxldGVkIHdpdGggZXJyb3JzOicpO1xuICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIHBvcnRmb2xpbyBzdHJ1Y3R1cmUgZXhpc3RzXG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpO1xuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5pbml0aWFsaXplKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVG9vbCBoYW5kbGVyIG1ldGhvZHMgLSBub3cgcHVibGljIGZvciBhY2Nlc3MgZnJvbSB0b29sIG1vZHVsZXNcbiAgXG4gIHByaXZhdGUgZ2V0UGVyc29uYUluZGljYXRvcigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgIHZlcnNpb246IHBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBlbGVtZW50IHR5cGUgdG8gaGFuZGxlIGJvdGggc2luZ3VsYXIgKG5ldykgYW5kIHBsdXJhbCAobGVnYWN5KSBmb3Jtc1xuICAgKiBUaGlzIHByb3ZpZGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIHYxLjQuMFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIE1hcCBwbHVyYWwgZm9ybXMgdG8gc2luZ3VsYXIgRWxlbWVudFR5cGUgdmFsdWVzXG4gICAgY29uc3QgcGx1cmFsVG9TaW5ndWxhck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdwZXJzb25hcyc6IEVsZW1lbnRUeXBlLlBFUlNPTkEsXG4gICAgICAnc2tpbGxzJzogRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICAndGVtcGxhdGVzJzogRWxlbWVudFR5cGUuVEVNUExBVEUsXG4gICAgICAnYWdlbnRzJzogRWxlbWVudFR5cGUuQUdFTlQsXG4gICAgICAnbWVtb3JpZXMnOiBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICAnZW5zZW1ibGVzJzogRWxlbWVudFR5cGUuRU5TRU1CTEVcbiAgICB9O1xuICAgIFxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHZhbGlkIEVsZW1lbnRUeXBlIHZhbHVlLCByZXR1cm4gYXMtaXNcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuaW5jbHVkZXModHlwZSBhcyBFbGVtZW50VHlwZSkpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBpdCdzIGEgcGx1cmFsIGZvcm0sIGNvbnZlcnQgdG8gc2luZ3VsYXJcbiAgICBpZiAocGx1cmFsVG9TaW5ndWxhck1hcFt0eXBlXSkge1xuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmdcbiAgICAgIGxvZ2dlci53YXJuKGBVc2luZyBwbHVyYWwgZWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHNpbmd1bGFyIGZvcm0gJyR7cGx1cmFsVG9TaW5ndWxhck1hcFt0eXBlXX0nIGluc3RlYWQuYCk7XG4gICAgICByZXR1cm4gcGx1cmFsVG9TaW5ndWxhck1hcFt0eXBlXTtcbiAgICB9XG4gICAgXG4gICAgLy8gVW5rbm93biB0eXBlIC0gcmV0dXJuIGFzLWlzIGFuZCBsZXQgdmFsaWRhdGlvbiBoYW5kbGUgaXRcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBtZXRhZGF0YSBvYmplY3QgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAqIFJlbW92ZXMgYW55IGRhbmdlcm91cyBwcm9wZXJ0aWVzIHRoYXQgY291bGQgYWZmZWN0IE9iamVjdC5wcm90b3R5cGVcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghbWV0YWRhdGEgfHwgdHlwZW9mIG1ldGFkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBkYW5nZXJvdXNQcm9wZXJ0aWVzID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgY29uc3Qgc2FuaXRpemVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpKSB7XG4gICAgICBpZiAoIWRhbmdlcm91c1Byb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBzYW5pdGl6ZSBuZXN0ZWQgb2JqZWN0c1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBzYW5pdGl6ZWRba2V5XSA9IHRoaXMuc2FuaXRpemVNZXRhZGF0YSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FuaXRpemVkW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUGVyc29uYXMoKSB7XG4gICAgLy8gVmFsaWRhdGUgdGhlIHBlcnNvbmFzIGRpcmVjdG9yeSBwYXRoXG4gICAgaWYgKCFwYXRoLmlzQWJzb2x1dGUodGhpcy5wZXJzb25hc0RpcikpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBQZXJzb25hcyBkaXJlY3RvcnkgcGF0aCBpcyBub3QgYWJzb2x1dGU6ICR7dGhpcy5wZXJzb25hc0Rpcn1gKTtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ3JlYXRlIHBlcnNvbmFzIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLnBlcnNvbmFzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYENyZWF0ZWQgcGVyc29uYXMgZGlyZWN0b3J5IGF0OiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgICAgIC8vIENvbnRpbnVlIHRvIHRyeSBsb2FkaW5nIChkaXJlY3Rvcnkgd2lsbCBiZSBlbXB0eSlcbiAgICAgIH0gY2F0Y2ggKG1rZGlyRXJyb3I6IGFueSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgcGVyc29uYXMgZGlyZWN0b3J5IGF0ICR7dGhpcy5wZXJzb25hc0Rpcn06ICR7bWtkaXJFcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBEb24ndCB0aHJvdyAtIGVtcHR5IHBvcnRmb2xpbyBpcyB2YWxpZFxuICAgICAgICB0aGlzLnBlcnNvbmFzLmNsZWFyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMucGVyc29uYXNEaXIpO1xuICAgICAgY29uc3QgbWFya2Rvd25GaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcblxuICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgICAgXG4gICAgICBpZiAobWFya2Rvd25GaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tEb2xsaG91c2VNQ1BdIE5vIHBlcnNvbmFzIGZvdW5kIGluIHBvcnRmb2xpby4gVXNlIGJyb3dzZV9jb2xsZWN0aW9uIHRvIGluc3RhbGwgc29tZSEnKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIG1hcmtkb3duRmlsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBmaWxlKTtcbiAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IFBhdGhWYWxpZGF0b3Iuc2FmZVJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBVc2Ugc2VjdXJlIFlBTUwgcGFyc2VyXG4gICAgICAgICAgbGV0IHBhcnNlZDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGZpbGVDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvcikge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIHBlcnNvbmEgJHtmaWxlfTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlZC5kYXRhIGFzIFBlcnNvbmFNZXRhZGF0YTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQ7XG5cbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGUsICcubWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgSUQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgICBsZXQgdW5pcXVlSWQgPSBtZXRhZGF0YS51bmlxdWVfaWQ7XG4gICAgICAgICAgaWYgKCF1bmlxdWVJZCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aG9yRm9ySWQgPSBtZXRhZGF0YS5hdXRob3IgfHwgdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICAgICAgICB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQobWV0YWRhdGEubmFtZSwgYXV0aG9yRm9ySWQpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHZW5lcmF0ZWQgdW5pcXVlIElEIGZvciAke21ldGFkYXRhLm5hbWV9OiAke3VuaXF1ZUlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG1ldGFkYXRhIGZpZWxkc1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuY2F0ZWdvcnkpIG1ldGFkYXRhLmNhdGVnb3J5ID0gJ2dlbmVyYWwnO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYWdlX3JhdGluZykgbWV0YWRhdGEuYWdlX3JhdGluZyA9ICdhbGwnO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuY29udGVudF9mbGFncykgbWV0YWRhdGEuY29udGVudF9mbGFncyA9IFtdO1xuICAgICAgICAgIGlmIChtZXRhZGF0YS5haV9nZW5lcmF0ZWQgPT09IHVuZGVmaW5lZCkgbWV0YWRhdGEuYWlfZ2VuZXJhdGVkID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCkgbWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgPSAnaHVtYW4nO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEucHJpY2UpIG1ldGFkYXRhLnByaWNlID0gJ2ZyZWUnO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEubGljZW5zZSkgbWV0YWRhdGEubGljZW5zZSA9ICdDQy1CWS1TQS00LjAnO1xuXG4gICAgICAgICAgY29uc3QgcGVyc29uYTogUGVyc29uYSA9IHtcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlLFxuICAgICAgICAgICAgdW5pcXVlX2lkOiB1bmlxdWVJZCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5wZXJzb25hcy5zZXQoZmlsZSwgcGVyc29uYSk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBMb2FkZWQgcGVyc29uYTogJHttZXRhZGF0YS5uYW1lfSAoJHt1bmlxdWVJZH1gKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGxvYWRpbmcgcGVyc29uYSAke2ZpbGV9OiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBFTk9FTlQgZ3JhY2VmdWxseSAtIGRpcmVjdG9yeSBtaWdodCBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tEb2xsaG91c2VNQ1BdIFBlcnNvbmFzIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCB5ZXQgLSBwb3J0Zm9saW8gaXMgZW1wdHknKTtcbiAgICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHJlYWRpbmcgcGVyc29uYXMgZGlyZWN0b3J5OiAke2Vycm9yfWApO1xuICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxpc3RQZXJzb25hcygpIHtcbiAgICBjb25zdCBwZXJzb25hTGlzdCA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkubWFwKHBlcnNvbmEgPT4gKHtcbiAgICAgIGZpbGVuYW1lOiBwZXJzb25hLmZpbGVuYW1lLFxuICAgICAgdW5pcXVlX2lkOiBwZXJzb25hLnVuaXF1ZV9pZCxcbiAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdHJpZ2dlcnM6IHBlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnMgfHwgW10sXG4gICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24gfHwgXCIxLjBcIixcbiAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgXCJVbmtub3duXCIsXG4gICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeSB8fCAnZ2VuZXJhbCcsXG4gICAgICBhZ2VfcmF0aW5nOiBwZXJzb25hLm1ldGFkYXRhLmFnZV9yYXRpbmcgfHwgJ2FsbCcsXG4gICAgICBwcmljZTogcGVyc29uYS5tZXRhZGF0YS5wcmljZSB8fCAnZnJlZScsXG4gICAgICBhaV9nZW5lcmF0ZWQ6IHBlcnNvbmEubWV0YWRhdGEuYWlfZ2VuZXJhdGVkIHx8IGZhbHNlLFxuICAgICAgYWN0aXZlOiB0aGlzLmFjdGl2ZVBlcnNvbmEgPT09IHBlcnNvbmEuZmlsZW5hbWUsXG4gICAgfSkpO1xuXG4gICAgaWYgKHBlcnNvbmFMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9WW91IGRvbid0IGhhdmUgYW55IHBlcnNvbmFzIGluc3RhbGxlZCB5ZXQuIFdvdWxkIHlvdSBsaWtlIHRvIGJyb3dzZSB0aGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gb24gR2l0SHViIHRvIHNlZSB3aGF0J3MgYXZhaWxhYmxlPyBJIGNhbiBzaG93IHlvdSBwZXJzb25hcyBmb3IgY3JlYXRpdmUgd3JpdGluZywgdGVjaG5pY2FsIGFuYWx5c2lzLCBhbmQgbW9yZS4gSnVzdCBzYXkgXCJ5ZXNcIiBvciB1c2UgJ2Jyb3dzZV9jb2xsZWN0aW9uJy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1BdmFpbGFibGUgUGVyc29uYXMgKCR7cGVyc29uYUxpc3QubGVuZ3RofSk6XFxuXFxuYCArXG4gICAgICAgICAgICBwZXJzb25hTGlzdC5tYXAocCA9PiBcbiAgICAgICAgICAgICAgYCR7cC5hY3RpdmUgPyAn8J+UuSAnIDogJ+KWq++4jyAnfSoqJHtwLm5hbWV9KiogKCR7cC51bmlxdWVfaWR9KVxcbmAgK1xuICAgICAgICAgICAgICBgICAgJHtwLmRlc2NyaXB0aW9ufVxcbmAgK1xuICAgICAgICAgICAgICBgICAg8J+TgSAke3AuY2F0ZWdvcnl9IHwg8J+OrSAke3AuYXV0aG9yfSB8IPCflJYgJHtwLnByaWNlfSB8ICR7cC5haV9nZW5lcmF0ZWQgPyAn8J+kliBBSScgOiAn8J+RpCBIdW1hbid9XFxuYCArXG4gICAgICAgICAgICAgIGAgICBBZ2U6ICR7cC5hZ2VfcmF0aW5nfSB8IFZlcnNpb246ICR7cC52ZXJzaW9ufVxcbmAgK1xuICAgICAgICAgICAgICBgICAgVHJpZ2dlcnM6ICR7cC50cmlnZ2Vycy5qb2luKCcsICcpIHx8ICdOb25lJ31cXG5gXG4gICAgICAgICAgICApLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgYWN0aXZhdGVQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBwZXJzb25hIGlkZW50aWZpZXJcbiAgICBjb25zdCB2YWxpZGF0ZWRJZGVudGlmaWVyID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihwZXJzb25hSWRlbnRpZmllcik7XG4gICAgXG4gICAgLy8gVHJ5IHRvIGZpbmQgcGVyc29uYSBieSBmaWxlbmFtZSBmaXJzdCwgdGhlbiBieSBuYW1lXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh2YWxpZGF0ZWRJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSB2YWxpZGF0ZWRJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JbnZhbGlkUGFyYW1zLFxuICAgICAgICBgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYUlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmEgPSBwZXJzb25hLmZpbGVuYW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfVBlcnNvbmEgQWN0aXZhdGVkOiAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqXFxuXFxuYCArXG4gICAgICAgICAgICBgJHtwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcblxcbmAgK1xuICAgICAgICAgICAgYCoqSW5zdHJ1Y3Rpb25zOioqXFxuJHtwZXJzb25hLmNvbnRlbnR9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEFjdGl2ZVBlcnNvbmEoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfU5vIHBlcnNvbmEgaXMgY3VycmVudGx5IGFjdGl2ZS5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgdGhpcy5hY3RpdmVQZXJzb25hID0gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfUFjdGl2ZSBwZXJzb25hIG5vdCBmb3VuZC4gRGVhY3RpdmF0ZWQuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9QWN0aXZlIFBlcnNvbmE6ICoqJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KipcXG5cXG5gICtcbiAgICAgICAgICAgIGAke3BlcnNvbmEubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuXFxuYCArXG4gICAgICAgICAgICBgRmlsZTogJHtwZXJzb25hLmZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYFZlcnNpb246ICR7cGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxcbmAgK1xuICAgICAgICAgICAgYEF1dGhvcjogJHtwZXJzb25hLm1ldGFkYXRhLmF1dGhvciB8fCAnVW5rbm93bid9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGVQZXJzb25hKCkge1xuICAgIGNvbnN0IHdhc0FjdGl2ZSA9IHRoaXMuYWN0aXZlUGVyc29uYSAhPT0gbnVsbDtcbiAgICBjb25zdCBpbmRpY2F0b3IgPSB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKTtcbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmEgPSBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHdhc0FjdGl2ZSBcbiAgICAgICAgICAgID8gYCR7aW5kaWNhdG9yfeKchSBQZXJzb25hIGRlYWN0aXZhdGVkLiBCYWNrIHRvIGRlZmF1bHQgbW9kZS5gXG4gICAgICAgICAgICA6IFwiTm8gcGVyc29uYSB3YXMgYWN0aXZlLlwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0UGVyc29uYURldGFpbHMocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIC8vIFRyeSB0byBmaW5kIHBlcnNvbmEgYnkgZmlsZW5hbWUgZmlyc3QsIHRoZW4gYnkgbmFtZVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBlcnNvbmFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JbnZhbGlkUGFyYW1zLFxuICAgICAgICBgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYUlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiyAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqIERldGFpbHNcXG5cXG5gICtcbiAgICAgICAgICAgIGAqKkRlc2NyaXB0aW9uOioqICR7cGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG5gICtcbiAgICAgICAgICAgIGAqKkZpbGU6KiogJHtwZXJzb25hLmZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYCoqVmVyc2lvbjoqKiAke3BlcnNvbmEubWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wJ31cXG5gICtcbiAgICAgICAgICAgIGAqKkF1dGhvcjoqKiAke3BlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8ICdVbmtub3duJ31cXG5gICtcbiAgICAgICAgICAgIGAqKlRyaWdnZXJzOioqICR7cGVyc29uYS5tZXRhZGF0YS50cmlnZ2Vycz8uam9pbignLCAnKSB8fCAnTm9uZSd9XFxuXFxuYCArXG4gICAgICAgICAgICBgKipGdWxsIENvbnRlbnQ6KipcXG5cXGBcXGBcXGBcXG4ke3BlcnNvbmEuY29udGVudH1cXG5cXGBcXGBcXGBgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVsb2FkUGVyc29uYXMoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+UhCBSZWxvYWRlZCAke3RoaXMucGVyc29uYXMuc2l6ZX0gcGVyc29uYXMgZnJvbSAke3RoaXMucGVyc29uYXNEaXJ9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09IEVsZW1lbnQgTWV0aG9kcyAoR2VuZXJpYyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMpID09PT09XG4gIFxuICBhc3luYyBsaXN0RWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RQZXJzb25hcygpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGlmIChza2lsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwiTm8gc2tpbGxzIGFyZSBjdXJyZW50bHkgaW5zdGFsbGVkLiBUaGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gaGFzIHNraWxscyBmb3IgY29kZSByZXZpZXcsIGRhdGEgYW5hbHlzaXMsIGNyZWF0aXZlIHdyaXRpbmcgYW5kIG1vcmUuIFdvdWxkIHlvdSBsaWtlIG1lIHRvIHNob3cgeW91IHdoYXQncyBhdmFpbGFibGU/IEp1c3Qgc2F5IFxcXCJ5ZXNcXFwiIG9yIEkgY2FuIGhlbHAgeW91IGNyZWF0ZSBhIGN1c3RvbSBza2lsbC5cIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3Qgc2tpbGxMaXN0ID0gc2tpbGxzLm1hcChza2lsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV4aXR5ID0gc2tpbGwubWV0YWRhdGEuY29tcGxleGl0eSB8fCAnYmVnaW5uZXInO1xuICAgICAgICAgICAgY29uc3QgZG9tYWlucyA9IHNraWxsLm1ldGFkYXRhLmRvbWFpbnM/LmpvaW4oJywgJykgfHwgJ2dlbmVyYWwnO1xuICAgICAgICAgICAgcmV0dXJuIGDwn5ug77iPICR7c2tpbGwubWV0YWRhdGEubmFtZX0gLSAke3NraWxsLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcbiAgIENvbXBsZXhpdHk6ICR7Y29tcGxleGl0eX0gfCBEb21haW5zOiAke2RvbWFpbnN9YDtcbiAgICAgICAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5OaIEF2YWlsYWJsZSBTa2lsbHM6XFxuXFxuJHtza2lsbExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGlmICh0ZW1wbGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwiWW91IGhhdmVuJ3QgaW5zdGFsbGVkIGFueSB0ZW1wbGF0ZXMgeWV0LiBXb3VsZCB5b3UgbGlrZSB0byBzZWUgYXZhaWxhYmxlIHRlbXBsYXRlcyBmb3IgZW1haWxzLCByZXBvcnRzLCBhbmQgZG9jdW1lbnRhdGlvbj8gSSBjYW4gc2hvdyB5b3UgZXhhbXBsZXMgZnJvbSB0aGUgY29sbGVjdGlvbiBvciBoZWxwIHlvdSBjcmVhdGUgeW91ciBvd24uIFdoYXQgd291bGQgeW91IHByZWZlcj9cIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVMaXN0ID0gdGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXM/Lm1hcCh2ID0+IHYubmFtZSkuam9pbignLCAnKSB8fCAnbm9uZSc7XG4gICAgICAgICAgICByZXR1cm4gYPCfk4QgJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfSAtICR7dGVtcGxhdGUubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuICAgVmFyaWFibGVzOiAke3ZhcmlhYmxlc31gO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcblxcbicpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCfk50gQXZhaWxhYmxlIFRlbXBsYXRlczpcXG5cXG4ke3RlbXBsYXRlTGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCJObyBhZ2VudHMgaW5zdGFsbGVkIHlldC4gQWdlbnRzIGFyZSBhdXRvbm9tb3VzIGhlbHBlcnMgdGhhdCBjYW4gd29yayBvbiB0YXNrcyBpbmRlcGVuZGVudGx5LiBUaGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gaW5jbHVkZXMgdGFzayBtYW5hZ2VycywgcmVzZWFyY2ggYXNzaXN0YW50cywgYW5kIG1vcmUuIFdvdWxkIHlvdSBsaWtlIHRvIGJyb3dzZSBhdmFpbGFibGUgYWdlbnRzIG9yIGxlYXJuIGhvdyB0byBjcmVhdGUgeW91ciBvd24/XCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGFnZW50TGlzdCA9IGFnZW50cy5tYXAoYWdlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3BlY2lhbGl6YXRpb25zID0gKGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuc3BlY2lhbGl6YXRpb25zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJztcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGFnZW50LmdldFN0YXR1cygpO1xuICAgICAgICAgICAgcmV0dXJuIGDwn6SWICR7YWdlbnQubWV0YWRhdGEubmFtZX0gLSAke2FnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcbiAgIFN0YXR1czogJHtzdGF0dXN9IHwgU3BlY2lhbGl6YXRpb25zOiAke3NwZWNpYWxpemF0aW9uc31gO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcblxcbicpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCfpJYgQXZhaWxhYmxlIEFnZW50czpcXG5cXG4ke2FnZW50TGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9Jy4gQXZhaWxhYmxlIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyl9IChvciBsZWdhY3kgcGx1cmFsIGZvcm1zOiBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cylgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgJHt0eXBlfSBlbGVtZW50czpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGxpc3QgJHt0eXBlfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlUGVyc29uYShuYW1lKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZmluZChzID0+IHMubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFNraWxsICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgc2tpbGxcbiAgICAgICAgICBhd2FpdCBza2lsbC5hY3RpdmF0ZT8uKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKchSBTa2lsbCAnJHtuYW1lfScgYWN0aXZhdGVkXFxuXFxuJHtza2lsbC5pbnN0cnVjdGlvbnN9YFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmZpbmQodCA9PiB0Lm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBUZW1wbGF0ZSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdmFyaWFibGVzID0gdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzPy5tYXAodiA9PiB2Lm5hbWUpLmpvaW4oJywgJykgfHwgJ25vbmUnO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBUZW1wbGF0ZSAnJHtuYW1lfScgcmVhZHkgdG8gdXNlXFxuVmFyaWFibGVzOiAke3ZhcmlhYmxlc31cXG5cXG5Vc2UgJ3JlbmRlcl90ZW1wbGF0ZScgdG8gZ2VuZXJhdGUgY29udGVudCB3aXRoIHRoaXMgdGVtcGxhdGUuYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5maW5kKGEgPT4gYS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudFxuICAgICAgICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pyFIEFnZW50ICcke25hbWV9JyBhY3RpdmF0ZWQgYW5kIHJlYWR5XFxuU3BlY2lhbGl6YXRpb25zOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9XFxuXFxuVXNlICdleGVjdXRlX2FnZW50JyB0byBnaXZlIHRoaXMgYWdlbnQgYSBnb2FsLmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBnZXRBY3RpdmVFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIFxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlUGVyc29uYSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZVNraWxscyA9IHNraWxscy5maWx0ZXIocyA9PiBzLmdldFN0YXR1cygpID09PSAnYWN0aXZlJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGFjdGl2ZVNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCLwn5OLIE5vIGFjdGl2ZSBza2lsbHNcIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3Qgc2tpbGxMaXN0ID0gYWN0aXZlU2tpbGxzLm1hcChzID0+IGDwn5ug77iPICR7cy5tZXRhZGF0YS5uYW1lfWApLmpvaW4oJywgJyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgQWN0aXZlIHNraWxsczogJHtza2lsbExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBcIvCfk50gVGVtcGxhdGVzIGFyZSBzdGF0ZWxlc3MgYW5kIGFjdGl2YXRlZCBvbi1kZW1hbmQgd2hlbiByZW5kZXJpbmdcIlxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUFnZW50cyA9IGFnZW50cy5maWx0ZXIoYSA9PiBhLmdldFN0YXR1cygpID09PSAnYWN0aXZlJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGFjdGl2ZUFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCLwn6SWIE5vIGFjdGl2ZSBhZ2VudHNcIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgYWdlbnRMaXN0ID0gYWN0aXZlQWdlbnRzLm1hcChhID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdvYWxzID0gKGEgYXMgYW55KS5zdGF0ZT8uZ29hbHM/Lmxlbmd0aCB8fCAwO1xuICAgICAgICAgICAgcmV0dXJuIGDwn6SWICR7YS5tZXRhZGF0YS5uYW1lfSAoJHtnb2Fsc30gYWN0aXZlIGdvYWxzKWA7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgQWN0aXZlIGFnZW50czpcXG4ke2FnZW50TGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBkZWFjdGl2YXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWFjdGl2YXRlUGVyc29uYSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IHNraWxsLmRlYWN0aXZhdGU/LigpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBTa2lsbCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IFwi8J+TnSBUZW1wbGF0ZXMgYXJlIHN0YXRlbGVzcyAtIG5vdGhpbmcgdG8gZGVhY3RpdmF0ZVwiXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBBZ2VudCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgYWdlbnQuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBBZ2VudCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEVsZW1lbnREZXRhaWxzKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFBlcnNvbmFEZXRhaWxzKG5hbWUpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgICAgICAgICBg8J+boO+4jyAqKiR7c2tpbGwubWV0YWRhdGEubmFtZX0qKmAsXG4gICAgICAgICAgICBgJHtza2lsbC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1gLFxuICAgICAgICAgICAgYGAsXG4gICAgICAgICAgICBgKipDb21wbGV4aXR5Kio6ICR7c2tpbGwubWV0YWRhdGEuY29tcGxleGl0eSB8fCAnYmVnaW5uZXInfWAsXG4gICAgICAgICAgICBgKipEb21haW5zKio6ICR7c2tpbGwubWV0YWRhdGEuZG9tYWlucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9YCxcbiAgICAgICAgICAgIGAqKkxhbmd1YWdlcyoqOiAke3NraWxsLm1ldGFkYXRhLmxhbmd1YWdlcz8uam9pbignLCAnKSB8fCAnYW55J31gLFxuICAgICAgICAgICAgYCoqUHJlcmVxdWlzaXRlcyoqOiAke3NraWxsLm1ldGFkYXRhLnByZXJlcXVpc2l0ZXM/LmpvaW4oJywgJykgfHwgJ25vbmUnfWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9ucyoqOmAsXG4gICAgICAgICAgICBza2lsbC5pbnN0cnVjdGlvbnNcbiAgICAgICAgICBdO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChza2lsbC5tZXRhZGF0YS5wYXJhbWV0ZXJzICYmIHNraWxsLm1ldGFkYXRhLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKCcnLCAnKipQYXJhbWV0ZXJzKio6Jyk7XG4gICAgICAgICAgICBza2lsbC5tZXRhZGF0YS5wYXJhbWV0ZXJzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaChgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGRldGFpbHMuam9pbignXFxuJylcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuZmluZCh0ID0+IHQubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFRlbXBsYXRlICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICAgICAgYPCfk4QgKioke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgICAgICAgYCR7dGVtcGxhdGUubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqT3V0cHV0IEZvcm1hdCoqOiAkeyh0ZW1wbGF0ZS5tZXRhZGF0YSBhcyBhbnkpLm91dHB1dF9mb3JtYXQgfHwgJ3RleHQnfWAsXG4gICAgICAgICAgICBgKipUZW1wbGF0ZSBDb250ZW50Kio6YCxcbiAgICAgICAgICAgICdgYGAnLFxuICAgICAgICAgICAgdGVtcGxhdGUuY29udGVudCxcbiAgICAgICAgICAgICdgYGAnXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzICYmIHRlbXBsYXRlLm1ldGFkYXRhLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goJycsICcqKlZhcmlhYmxlcyoqOicpO1xuICAgICAgICAgICAgdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaChgLSAke3YubmFtZX0gKCR7di50eXBlfSk6ICR7di5kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGRldGFpbHMuam9pbignXFxuJylcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZmluZChhID0+IGEubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEFnZW50ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICAgICAgYPCfpJYgKioke2FnZW50Lm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgICAgICAgYCR7YWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqU3RhdHVzKio6ICR7YWdlbnQuZ2V0U3RhdHVzKCl9YCxcbiAgICAgICAgICAgIGAqKlNwZWNpYWxpemF0aW9ucyoqOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9YCxcbiAgICAgICAgICAgIGAqKkRlY2lzaW9uIEZyYW1ld29yayoqOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmRlY2lzaW9uRnJhbWV3b3JrIHx8ICdydWxlLWJhc2VkJ31gLFxuICAgICAgICAgICAgYCoqUmlzayBUb2xlcmFuY2UqKjogJHsoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5yaXNrVG9sZXJhbmNlIHx8ICdsb3cnfWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9ucyoqOmAsXG4gICAgICAgICAgICAoYWdlbnQgYXMgYW55KS5pbnN0cnVjdGlvbnMgfHwgJ05vIGluc3RydWN0aW9ucyBhdmFpbGFibGUnXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBhZ2VudFN0YXRlID0gKGFnZW50IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKGFnZW50U3RhdGU/LmdvYWxzICYmIGFnZW50U3RhdGUuZ29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKCcnLCAnKipDdXJyZW50IEdvYWxzKio6Jyk7XG4gICAgICAgICAgICBhZ2VudFN0YXRlLmdvYWxzLmZvckVhY2goKGc6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBkZXRhaWxzLnB1c2goYC0gJHtnLmRlc2NyaXB0aW9ufSAoJHtnLnN0YXR1c30pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBkZXRhaWxzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlscyBmb3IgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlsczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgcmVsb2FkRWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLnJlbG9hZFBlcnNvbmFzKCk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHtcbiAgICAgICAgICB0aGlzLnNraWxsTWFuYWdlci5jbGVhckNhY2hlKCk7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHtza2lsbHMubGVuZ3RofSBza2lsbHMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICAvLyBUZW1wbGF0ZSBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke3RlbXBsYXRlcy5sZW5ndGh9IHRlbXBsYXRlcyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIC8vIEFnZW50IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7YWdlbnRzLmxlbmd0aH0gYWdlbnRzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVsb2FkICR7dHlwZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEVsZW1lbnQtc3BlY2lmaWMgbWV0aG9kc1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZShuYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmZpbmQodCA9PiB0Lm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVGVtcGxhdGUgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTaW1wbGUgdGVtcGxhdGUgcmVuZGVyaW5nIC0gcmVwbGFjZSB2YXJpYWJsZXMgaW4gY29udGVudFxuICAgICAgbGV0IHJlbmRlcmVkID0gdGVtcGxhdGUuY29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxce1xcXFx7XFxcXHMqJHtrZXl9XFxcXHMqXFxcXH1cXFxcfWAsICdnJyk7XG4gICAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQucmVwbGFjZShyZWdleCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn5OEIFJlbmRlcmVkIHRlbXBsYXRlICcke25hbWV9JzpcXG5cXG4ke3JlbmRlcmVkfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbmRlciB0ZW1wbGF0ZSAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byByZW5kZXIgdGVtcGxhdGU6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIGdvYWw6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTaW1wbGUgYWdlbnQgZXhlY3V0aW9uIHNpbXVsYXRpb25cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgc3VtbWFyeTogYEFnZW50ICcke25hbWV9JyBpcyBub3cgd29ya2luZyBvbjogJHtnb2FsfWAsXG4gICAgICAgIHN0YXR1czogJ2luLXByb2dyZXNzJyxcbiAgICAgICAgYWN0aW9uc1Rha2VuOiAxXG4gICAgICB9O1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn6SWIEFnZW50ICcke25hbWV9JyBleGVjdXRpb24gcmVzdWx0OlxcblxcbiR7cmVzdWx0LnN1bW1hcnl9XFxuXFxuU3RhdHVzOiAke3Jlc3VsdC5zdGF0dXN9XFxuQWN0aW9ucyB0YWtlbjogJHtyZXN1bHQuYWN0aW9uc1Rha2VuIHx8IDB9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudCAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBleGVjdXRlIGFnZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBjcmVhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGRlc2NyaXB0aW9uLCBjb250ZW50LCBtZXRhZGF0YSB9ID0gYXJncztcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCB0eXBlXG4gICAgICBpZiAoIU9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyl9IChvciBsZWdhY3kgcGx1cmFsIGZvcm1zOiBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgaW5wdXRzXG4gICAgICBjb25zdCB2YWxpZGF0ZWROYW1lID0gdmFsaWRhdGVGaWxlbmFtZShuYW1lKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkZXNjcmlwdGlvbiwgU0VDVVJJVFlfTElNSVRTLk1BWF9NRVRBREFUQV9GSUVMRF9MRU5HVEgpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIG1ldGFkYXRhIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgY29uc3Qgc2FuaXRpemVkTWV0YWRhdGEgPSB0aGlzLnNhbml0aXplTWV0YWRhdGEobWV0YWRhdGEgfHwge30pO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgZWxlbWVudCBiYXNlZCBvbiB0eXBlXG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIC8vIFVzZSBleGlzdGluZyBwZXJzb25hIGNyZWF0aW9uIGxvZ2ljXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGVyc29uYShcbiAgICAgICAgICAgIHZhbGlkYXRlZE5hbWUsIFxuICAgICAgICAgICAgdmFsaWRhdGVkRGVzY3JpcHRpb24sIFxuICAgICAgICAgICAgc2FuaXRpemVkTWV0YWRhdGE/LmNhdGVnb3J5IHx8ICdnZW5lcmFsJyxcbiAgICAgICAgICAgIGNvbnRlbnQgfHwgJycsXG4gICAgICAgICAgICBzYW5pdGl6ZWRNZXRhZGF0YT8udHJpZ2dlcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOlxuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICAuLi5zYW5pdGl6ZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgfHwgJydcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQ3JlYXRlZCBza2lsbCAnJHtza2lsbC5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOlxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50IHx8ICcnLFxuICAgICAgICAgICAgLi4uc2FuaXRpemVkTWV0YWRhdGFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQ3JlYXRlZCB0ZW1wbGF0ZSAnJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIGNvbnN0IGFnZW50UmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY3JlYXRlKFxuICAgICAgICAgICAgdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgY29udGVudCB8fCAnJyxcbiAgICAgICAgICAgIHNhbml0aXplZE1ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWFnZW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCAke2FnZW50UmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pyFIENyZWF0ZWQgYWdlbnQgJyR7dmFsaWRhdGVkTmFtZX0nIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgRWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgY3JlYXRpb25gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gY3JlYXRlIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W119KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgZmllbGQsIHZhbHVlIH0gPSBhcmdzO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IHR5cGVcbiAgICAgIGlmICghT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuaW5jbHVkZXModHlwZSBhcyBFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEludmFsaWQgZWxlbWVudCB0eXBlICcke3R5cGV9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuam9pbignLCAnKX0gKG9yIGxlZ2FjeSBwbHVyYWwgZm9ybXM6IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYWdlbnRzKWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3IgcGVyc29uYXMsIHVzZSBleGlzdGluZyBlZGl0IGxvZ2ljXG4gICAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0UGVyc29uYShuYW1lLCBmaWVsZCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBiYXNlZCBvbiB0eXBlXG4gICAgICBsZXQgbWFuYWdlcjogU2tpbGxNYW5hZ2VyIHwgVGVtcGxhdGVNYW5hZ2VyIHwgQWdlbnRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5za2lsbE1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgRWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZWRpdGluZ2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmluZCB0aGUgZWxlbWVudFxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IG1hbmFnZXIhLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgJHt0eXBlfSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgZmllbGQgdXBkYXRlcyAoZS5nLiwgXCJtZXRhZGF0YS5hdXRob3JcIilcbiAgICAgIGNvbnN0IGZpZWxkUGFydHMgPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGZpZWxkIG5hbWVzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgY29uc3QgZGFuZ2Vyb3VzUHJvcGVydGllcyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGZpZWxkUGFydHMpIHtcbiAgICAgICAgaWYgKGRhbmdlcm91c1Byb3BlcnRpZXMuaW5jbHVkZXMocGFydCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBmaWVsZCBuYW1lOiAnJHtwYXJ0fScgaXMgbm90IGFsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnNgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgbGV0IHRhcmdldDogYW55ID0gZWxlbWVudDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IEFkZGl0aW9uYWwgY2hlY2sgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgQ2Fubm90IHNldCBwcm9wZXJ0eSAnJHtmaWVsZFBhcnRzW2ldfScgb24gbm9uLW9iamVjdGBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCF0YXJnZXRbZmllbGRQYXJ0c1tpXV0pIHtcbiAgICAgICAgICAvLyBTRUNVUklUWTogVXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0byBhdm9pZCBwcm90b3R5cGUgY2hhaW4gcG9sbHV0aW9uXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZmllbGRQYXJ0c1tpXSwge1xuICAgICAgICAgICAgdmFsdWU6IHt9LFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2ZpZWxkUGFydHNbaV1dO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdGhlIGZpZWxkXG4gICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZFBhcnRzW2ZpZWxkUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBTRUNVUklUWTogVXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBmb3IgdGhlIGZpbmFsIGFzc2lnbm1lbnQgdG9vXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBsYXN0RmllbGQsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHZlcnNpb24gLSBoYW5kbGUgdmFyaW91cyB2ZXJzaW9uIGZvcm1hdHNcbiAgICAgIGlmIChlbGVtZW50LnZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgdmVyc2lvblBhcnRzID0gZWxlbWVudC52ZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmICh2ZXJzaW9uUGFydHMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAvLyBTdGFuZGFyZCBzZW12ZXIgZm9ybWF0IChlLmcuLCAxLjAuMClcbiAgICAgICAgICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KHZlcnNpb25QYXJ0c1syXSkgfHwgMDtcbiAgICAgICAgICB2ZXJzaW9uUGFydHNbMl0gPSBTdHJpbmcocGF0Y2ggKyAxKTtcbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSB2ZXJzaW9uUGFydHMuam9pbignLicpO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAvLyBUd28tcGFydCB2ZXJzaW9uIChlLmcuLCAxLjApIC0gYWRkIHBhdGNoIHZlcnNpb25cbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSBgJHtlbGVtZW50LnZlcnNpb259LjFgO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPT09IDEgJiYgL15cXGQrJC8udGVzdCh2ZXJzaW9uUGFydHNbMF0pKSB7XG4gICAgICAgICAgLy8gU2luZ2xlIG51bWJlciB2ZXJzaW9uIChlLmcuLCAxKSAtIGNvbnZlcnQgdG8gc2VtdmVyXG4gICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7ZWxlbWVudC52ZXJzaW9ufS4wLjFgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vbi1zdGFuZGFyZCB2ZXJzaW9uIC0gYXBwZW5kIG9yIHJlcGxhY2Ugd2l0aCBzdGFuZGFyZCBmb3JtYXRcbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSAnMS4wLjEnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyB2ZXJzaW9uIC0gc2V0IGluaXRpYWwgdmVyc2lvblxuICAgICAgICBlbGVtZW50LnZlcnNpb24gPSAnMS4wLjAnO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTYXZlIHRoZSBlbGVtZW50IC0gbmVlZCB0byBkZXRlcm1pbmUgZmlsZW5hbWVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpfS5tZGA7XG4gICAgICBhd2FpdCBtYW5hZ2VyIS5zYXZlKGVsZW1lbnQgYXMgYW55LCBmaWxlbmFtZSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKchSBVcGRhdGVkICR7dHlwZX0gJyR7bmFtZX0nIC0gJHtmaWVsZH0gc2V0IHRvOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBlZGl0IGVsZW1lbnQ6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBlZGl0IGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIHZhbGlkYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHN0cmljdD86IGJvb2xlYW59KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgc3RyaWN0ID0gZmFsc2UgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBwZXJzb25hcywgdXNlIGV4aXN0aW5nIHZhbGlkYXRpb24gbG9naWNcbiAgICAgIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUGVyc29uYShuYW1lKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSBtYW5hZ2VyIGJhc2VkIG9uIHR5cGVcbiAgICAgIGxldCBtYW5hZ2VyOiBTa2lsbE1hbmFnZXIgfCBUZW1wbGF0ZU1hbmFnZXIgfCBBZ2VudE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIHN3aXRjaCAodHlwZSBhcyBFbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURTpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy50ZW1wbGF0ZU1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMuYWdlbnRNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciB2YWxpZGF0aW9uYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGaW5kIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgbWFuYWdlciEuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGVyZm9ybSB2YWxpZGF0aW9uXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgXG4gICAgICAvLyBGb3JtYXQgdmFsaWRhdGlvbiByZXBvcnRcbiAgICAgIGxldCByZXBvcnQgPSBg8J+UjSBWYWxpZGF0aW9uIFJlcG9ydCBmb3IgJHt0eXBlfSAnJHtuYW1lfSc6XFxuYDtcbiAgICAgIHJlcG9ydCArPSBgJHt2YWxpZGF0aW9uUmVzdWx0LnZhbGlkID8gJ+KchScgOiAn4p2MJ30gU3RhdHVzOiAke3ZhbGlkYXRpb25SZXN1bHQudmFsaWQgPyAnVmFsaWQnIDogJ0ludmFsaWQnfVxcblxcbmA7XG4gICAgICBcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9ycyAmJiB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg4p2MIEVycm9ycyAoJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5sZW5ndGh9KTpcXG5gO1xuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5mb3JFYWNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICDigKIgJHtlcnJvci5maWVsZCB8fCAnR2VuZXJhbCd9OiAke2Vycm9yLm1lc3NhZ2V9XFxuYDtcbiAgICAgICAgICBpZiAoZXJyb3IuZml4KSB7XG4gICAgICAgICAgICByZXBvcnQgKz0gYCAgICAg8J+SoSBGaXg6ICR7ZXJyb3IuZml4fVxcbmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDimqDvuI8gIFdhcm5pbmdzICgke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RofSk6XFxuYDtcbiAgICAgICAgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nOiBhbnkpID0+IHtcbiAgICAgICAgICByZXBvcnQgKz0gYCAgIOKAoiAke3dhcm5pbmcuZmllbGQgfHwgJ0dlbmVyYWwnfTogJHt3YXJuaW5nLm1lc3NhZ2V9XFxuYDtcbiAgICAgICAgICBpZiAod2FybmluZy5zdWdnZXN0aW9uKSB7XG4gICAgICAgICAgICByZXBvcnQgKz0gYCAgICAg8J+SoSBTdWdnZXN0aW9uOiAke3dhcm5pbmcuc3VnZ2VzdGlvbn1cXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuc3VnZ2VzdGlvbnMgJiYgdmFsaWRhdGlvblJlc3VsdC5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg8J+SoSBTdWdnZXN0aW9uczpcXG5gO1xuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnN1Z2dlc3Rpb25zLmZvckVhY2goKHN1Z2dlc3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAg4oCiICR7c3VnZ2VzdGlvbn1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWRkIHN0cmljdCBtb2RlIGFkZGl0aW9uYWwgY2hlY2tzIGlmIHJlcXVlc3RlZFxuICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICByZXBvcnQgKz0gJ1xcbvCfk4sgU3RyaWN0IE1vZGU6IEFkZGl0aW9uYWwgcXVhbGl0eSBjaGVja3MgYXBwbGllZCc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogcmVwb3J0XG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB2YWxpZGF0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gdmFsaWRhdGUgZWxlbWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZGVsZXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlbGV0ZURhdGE/OiBib29sZWFufSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGRlbGV0ZURhdGEgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGU6ICR7dHlwZX1cXG5WYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBiYXNlZCBvbiB0eXBlXG4gICAgICBsZXQgbWFuYWdlcjogU2tpbGxNYW5hZ2VyIHwgVGVtcGxhdGVNYW5hZ2VyIHwgQWdlbnRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5za2lsbE1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIC8vIEZvciBwZXJzb25hcywgdXNlIGEgZGlmZmVyZW50IGFwcHJvYWNoXG4gICAgICAgICAgY29uc3QgcGVyc29uYVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgYCR7bmFtZX0ubWRgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHBlcnNvbmFQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhwZXJzb25hUGF0aCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJlbG9hZCBwZXJzb25hcyB0byB1cGRhdGUgdGhlIGNhY2hlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinIUgU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgcGVyc29uYSAnJHtuYW1lfSdgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFBlcnNvbmEgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBkZWxldGlvbmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zdXJlIG1hbmFnZXIgd2FzIGFzc2lnbmVkIChUeXBlU2NyaXB0IHR5cGUgc2FmZXR5KVxuICAgICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRlbGV0aW9uYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgZmlyc3QgdG8gY2hlY2sgaWYgaXQgZXhpc3RzXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgbWFuYWdlciEuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIGFzc29jaWF0ZWQgZGF0YSBmaWxlc1xuICAgICAgbGV0IGRhdGFGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIFxuICAgICAgLy8gQWdlbnQtc3BlY2lmaWM6IENoZWNrIGZvciBzdGF0ZSBmaWxlc1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkFHRU5UKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLkFHRU5UKSwgJy5zdGF0ZScpO1xuICAgICAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4oc3RhdGVEaXIsIGAke25hbWV9LXN0YXRlLmpzb25gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChzdGF0ZUZpbGUpO1xuICAgICAgICAgIGRhdGFGaWxlcy5wdXNoKGAtIC5zdGF0ZS8ke25hbWV9LXN0YXRlLmpzb24gKCR7KHN0YXQuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9IEtCKWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIE5vIHN0YXRlIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWVtb3J5LXNwZWNpZmljOiBDaGVjayBmb3Igc3RvcmFnZSBmaWxlc1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgICBjb25zdCBzdG9yYWdlRGlyID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLk1FTU9SWSksICcuc3RvcmFnZScpO1xuICAgICAgICBjb25zdCBzdG9yYWdlRmlsZSA9IHBhdGguam9pbihzdG9yYWdlRGlyLCBgJHtuYW1lfS1tZW1vcnkuanNvbmApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KHN0b3JhZ2VGaWxlKTtcbiAgICAgICAgICBkYXRhRmlsZXMucHVzaChgLSAuc3RvcmFnZS8ke25hbWV9LW1lbW9yeS5qc29uICgkeyhzdGF0LnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfSBLQilgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBObyBzdG9yYWdlIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zZW1ibGUtc3BlY2lmaWM6IENoZWNrIGZvciBjb25maWcgZmlsZXNcbiAgICAgIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSkge1xuICAgICAgICBjb25zdCBjb25maWdEaXIgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuRU5TRU1CTEUpLCAnLmNvbmZpZ3MnKTtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihjb25maWdEaXIsIGAke25hbWV9LWNvbmZpZy5qc29uYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoY29uZmlnRmlsZSk7XG4gICAgICAgICAgZGF0YUZpbGVzLnB1c2goYC0gLmNvbmZpZ3MvJHtuYW1lfS1jb25maWcuanNvbiAoJHsoc3RhdC5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX0gS0IpYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gTm8gY29uZmlnIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZGF0YSBmaWxlcyBleGlzdCBhbmQgZGVsZXRlRGF0YSBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGluZm9ybSB0aGUgdXNlclxuICAgICAgaWYgKGRhdGFGaWxlcy5sZW5ndGggPiAwICYmIGRlbGV0ZURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDimqDvuI8gIFRoaXMgJHt0eXBlfSBoYXMgYXNzb2NpYXRlZCBkYXRhIGZpbGVzOlxcbiR7ZGF0YUZpbGVzLmpvaW4oJ1xcbicpfVxcblxcbldvdWxkIHlvdSBsaWtlIHRvIGRlbGV0ZSB0aGVzZSBkYXRhIGZpbGVzIGFzIHdlbGw/XFxuXFxu4oCiIFRvIGRlbGV0ZSBldmVyeXRoaW5nIChlbGVtZW50ICsgZGF0YSksIHNheTogXCJZZXMsIGRlbGV0ZSBhbGwgZGF0YVwiXFxu4oCiIFRvIGtlZXAgdGhlIGRhdGEgZmlsZXMsIHNheTogXCJObywga2VlcCB0aGUgZGF0YVwiXFxu4oCiIFRvIGNhbmNlbCwgc2F5OiBcIkNhbmNlbFwiYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERlbGV0ZSB0aGUgbWFpbiBlbGVtZW50IGZpbGVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7c2x1Z2lmeShuYW1lKX0ubWRgO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSBhcyBFbGVtZW50VHlwZSksIGZpbGVuYW1lKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGZpbGVwYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9IGZpbGUgJyR7ZmlsZW5hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERlbGV0ZSBhc3NvY2lhdGVkIGRhdGEgZmlsZXMgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAoZGVsZXRlRGF0YSAmJiBkYXRhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1cGRhdGVkRGF0YUZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkFHRU5UKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdGVGaWxlID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLkFHRU5UKSwgJy5zdGF0ZScsIGAke25hbWV9LXN0YXRlLmpzb25gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0YXRlRmlsZSk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDinJMgZGVsZXRlZGApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBMb2cgYnV0IGRvbid0IGZhaWwgaWYgc3RhdGUgZmlsZSBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgYWdlbnQgc3RhdGUgZmlsZTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKaoO+4jyBkZWxldGlvbiBmYWlsZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgICAgY29uc3Qgc3RvcmFnZUZpbGUgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuTUVNT1JZKSwgJy5zdG9yYWdlJywgYCR7bmFtZX0tbWVtb3J5Lmpzb25gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0b3JhZ2VGaWxlKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKckyBkZWxldGVkYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCBpZiBzdG9yYWdlIGZpbGUgZGVsZXRpb24gZmFpbHNcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIG1lbW9yeSBzdG9yYWdlIGZpbGU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDimqDvuI8gZGVsZXRpb24gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbih0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5FTlNFTUJMRSksICcuY29uZmlncycsIGAke25hbWV9LWNvbmZpZy5qc29uYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhjb25maWdGaWxlKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKckyBkZWxldGVkYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCBpZiBjb25maWcgZmlsZSBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgZW5zZW1ibGUgY29uZmlnIGZpbGU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDimqDvuI8gZGVsZXRpb24gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkYXRhRmlsZXMgPSB1cGRhdGVkRGF0YUZpbGVzO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCdWlsZCBzdWNjZXNzIG1lc3NhZ2VcbiAgICAgIGxldCBtZXNzYWdlID0gYOKchSBTdWNjZXNzZnVsbHkgZGVsZXRlZCAke3R5cGV9ICcke25hbWV9J2A7XG4gICAgICBpZiAoZGF0YUZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGRlbGV0ZURhdGEpIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG5Bc3NvY2lhdGVkIGRhdGEgZmlsZXM6XFxuJHtkYXRhRmlsZXMuam9pbignXFxuJyl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG7imqDvuI8gQXNzb2NpYXRlZCBkYXRhIGZpbGVzIHdlcmUgcHJlc2VydmVkOlxcbiR7ZGF0YUZpbGVzLmpvaW4oJ1xcbicpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBtZXNzYWdlXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZGVsZXRlIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBjaGVja1JhdGVMaW1pdCBhbmQgZmV0Y2hGcm9tR2l0SHViIGFyZSBub3cgaGFuZGxlZCBieSBHaXRIdWJDbGllbnRcblxuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvbiBmb3Igc2VjdGlvbiBhbmQgdHlwZVxuICAgICAgY29uc3QgdmFsaWRhdGVkU2VjdGlvbiA9IHNlY3Rpb24gPyB2YWxpZGF0ZUNhdGVnb3J5KHNlY3Rpb24pIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdmFsaWRhdGVkVHlwZSA9IHR5cGUgPyB2YWxpZGF0ZUNhdGVnb3J5KHR5cGUpIDogdW5kZWZpbmVkO1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25Ccm93c2VyLmJyb3dzZUNvbGxlY3Rpb24odmFsaWRhdGVkU2VjdGlvbiwgdmFsaWRhdGVkVHlwZSk7XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBzZWN0aW9ucyB2aWV3XG4gICAgICBjb25zdCBpdGVtcyA9IHJlc3VsdC5pdGVtcztcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSByZXN1bHQuc2VjdGlvbnMgfHwgcmVzdWx0LmNhdGVnb3JpZXM7XG4gICAgICBcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmNvbGxlY3Rpb25Ccm93c2VyLmZvcm1hdEJyb3dzZVJlc3VsdHMoXG4gICAgICAgIGl0ZW1zLCBcbiAgICAgICAgY2F0ZWdvcmllcywgXG4gICAgICAgIHZhbGlkYXRlZFNlY3Rpb24sIFxuICAgICAgICB2YWxpZGF0ZWRUeXBlLCBcbiAgICAgICAgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKClcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBDb2xsZWN0aW9uIGJyb3dzaW5nIGZhaWxlZDogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlYXJjaENvbGxlY3Rpb24ocXVlcnk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBzZWFyY2ggcXVlcnlcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFF1ZXJ5ID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeSk7XG4gICAgICBcbiAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uU2VhcmNoLnNlYXJjaENvbGxlY3Rpb24odmFsaWRhdGVkUXVlcnkpO1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY29sbGVjdGlvblNlYXJjaC5mb3JtYXRTZWFyY2hSZXN1bHRzKGl0ZW1zLCB2YWxpZGF0ZWRRdWVyeSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3Igc2VhcmNoaW5nIGNvbGxlY3Rpb246ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb2xsZWN0aW9uQ29udGVudChwYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudCB9ID0gYXdhaXQgdGhpcy5wZXJzb25hRGV0YWlscy5nZXRDb2xsZWN0aW9uQ29udGVudChwYXRoKTtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnBlcnNvbmFEZXRhaWxzLmZvcm1hdFBlcnNvbmFEZXRhaWxzKG1ldGFkYXRhLCBjb250ZW50LCBwYXRoLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciBmZXRjaGluZyBjb250ZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5zdGFsbENvbnRlbnQoaW5wdXRQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lbGVtZW50SW5zdGFsbGVyLmluc3RhbGxDb250ZW50KGlucHV0UGF0aCk7XG4gICAgICBcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pqg77iPICR7cmVzdWx0Lm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgaXQncyBhIHBlcnNvbmEsIHJlbG9hZCBwZXJzb25hc1xuICAgICAgaWYgKHJlc3VsdC5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbGVtZW50SW5zdGFsbGVyLmZvcm1hdEluc3RhbGxTdWNjZXNzKFxuICAgICAgICByZXN1bHQubWV0YWRhdGEhLCBcbiAgICAgICAgcmVzdWx0LmZpbGVuYW1lISxcbiAgICAgICAgcmVzdWx0LmVsZW1lbnRUeXBlIVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGluc3RhbGxpbmcgQUkgY3VzdG9taXphdGlvbiBlbGVtZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29udGVudChjb250ZW50SWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gRmluZCB0aGUgY29udGVudCBpbiBsb2NhbCBjb2xsZWN0aW9uXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChjb250ZW50SWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gY29udGVudElkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBDb250ZW50IG5vdCBmb3VuZDogJHtjb250ZW50SWRlbnRpZmllcn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBlcnNvbmEgY29udGVudCBiZWZvcmUgc3VibWlzc2lvblxuICAgIHRyeSB7XG4gICAgICAvLyBSZWFkIHRoZSBmdWxsIHBlcnNvbmEgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBwZXJzb25hLmZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IGZvciBzZWN1cml0eSB0aHJlYXRzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShmaWxlQ29udGVudCk7XG4gICAgICBpZiAoIWNvbnRlbnRWYWxpZGF0aW9uLmlzVmFsaWQgJiYgY29udGVudFZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTZWN1cml0eSBWYWxpZGF0aW9uIEZhaWxlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBUaGlzIHBlcnNvbmEgY29udGFpbnMgY29udGVudCB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIHByb21wdCBpbmplY3Rpb24gYXR0YWNrczpcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAke2NvbnRlbnRWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJ1xcbuKAoiAnKX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSByZW1vdmUgdGhlc2UgcGF0dGVybnMgYmVmb3JlIHN1Ym1pdHRpbmcgdG8gdGhlIGNvbGxlY3Rpb24uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1ldGFkYXRhVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShwZXJzb25hLm1ldGFkYXRhKTtcbiAgICAgIGlmICghbWV0YWRhdGFWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3imqDvuI8gKipNZXRhZGF0YSBTZWN1cml0eSBXYXJuaW5nKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFRoZSBwZXJzb25hIG1ldGFkYXRhIGNvbnRhaW5zIHBvdGVudGlhbGx5IHByb2JsZW1hdGljIGNvbnRlbnQ6XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgJHttZXRhZGF0YVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignXFxu4oCiICcpfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGZpeCB0aGVzZSBpc3N1ZXMgYmVmb3JlIHN1Ym1pdHRpbmcuYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIHZhbGlkYXRpbmcgcGVyc29uYTogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ2l0aHViSXNzdWVVcmwgfSA9IHRoaXMucGVyc29uYVN1Ym1pdHRlci5nZW5lcmF0ZVN1Ym1pc3Npb25Jc3N1ZShwZXJzb25hKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5wZXJzb25hU3VibWl0dGVyLmZvcm1hdFN1Ym1pc3Npb25SZXNwb25zZShwZXJzb25hLCBnaXRodWJJc3N1ZVVybCwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvLyBVc2VyIGlkZW50aXR5IG1hbmFnZW1lbnRcbiAgYXN5bmMgc2V0VXNlcklkZW50aXR5KHVzZXJuYW1lOiBzdHJpbmcsIGVtYWlsPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdXNlcm5hbWUgfHwgdXNlcm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBVc2VybmFtZSBjYW5ub3QgYmUgZW1wdHlgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdXNlcm5hbWVcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFVzZXJuYW1lID0gdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZSk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVtYWlsIGlmIHByb3ZpZGVkXG4gICAgICBsZXQgdmFsaWRhdGVkRW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbWFpbCkge1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWRFbWFpbCA9IHNhbml0aXplSW5wdXQoZW1haWwsIDEwMCk7XG4gICAgICAgIGlmICghVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0VNQUlMLnRlc3Qoc2FuaXRpemVkRW1haWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkYXRlZEVtYWlsID0gc2FuaXRpemVkRW1haWw7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgdmFsaWRhdGVkIHVzZXIgaWRlbnRpdHlcbiAgICAgIHRoaXMuY3VycmVudFVzZXIgPSB2YWxpZGF0ZWRVc2VybmFtZTtcbiAgICAgIGlmICh2YWxpZGF0ZWRFbWFpbCkge1xuICAgICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUwgPSB2YWxpZGF0ZWRFbWFpbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqVXNlciBJZGVudGl0eSBTZXQqKlxcblxcbmAgK1xuICAgICAgICAgICAgYPCfkaQgKipVc2VybmFtZToqKiAke3ZhbGlkYXRlZFVzZXJuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYCR7dmFsaWRhdGVkRW1haWwgPyBg8J+TpyAqKkVtYWlsOioqICR7dmFsaWRhdGVkRW1haWx9XFxuYCA6ICcnfWAgK1xuICAgICAgICAgICAgYFxcbvCfjq8gKipOZXh0IFN0ZXBzOioqXFxuYCArXG4gICAgICAgICAgICBg4oCiIE5ldyBwZXJzb25hcyB5b3UgY3JlYXRlIHdpbGwgYmUgYXR0cmlidXRlZCB0byBcIiR7dmFsaWRhdGVkVXNlcm5hbWV9XCJcXG5gICtcbiAgICAgICAgICAgIGDigKIgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIFxcYERPTExIT1VTRV9VU0VSPSR7dmFsaWRhdGVkVXNlcm5hbWV9XFxgIHRvIHBlcnNpc3QgdGhpcyBzZXR0aW5nXFxuYCArXG4gICAgICAgICAgICBgJHt2YWxpZGF0ZWRFbWFpbCA/IGDigKIgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIFxcYERPTExIT1VTRV9FTUFJTD0ke3ZhbGlkYXRlZEVtYWlsfVxcYCBmb3IgY29udGFjdCBpbmZvXFxuYCA6ICcnfWAgK1xuICAgICAgICAgICAgYOKAoiBVc2UgXFxgY2xlYXJfdXNlcl9pZGVudGl0eVxcYCB0byByZXR1cm4gdG8gYW5vbnltb3VzIG1vZGVgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipWYWxpZGF0aW9uIEVycm9yKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHVzZXJuYW1lIChhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMgb25seSkuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRVc2VySWRlbnRpdHkoKSB7XG4gICAgY29uc3QgZW1haWwgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUw7XG4gICAgXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5GkICoqVXNlciBJZGVudGl0eTogQW5vbnltb3VzKipcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn5SSICoqU3RhdHVzOioqIEFub255bW91cyBtb2RlXFxuYCArXG4gICAgICAgICAgICBg8J+TnSAqKkF0dHJpYnV0aW9uOioqIFBlcnNvbmFzIHdpbGwgdXNlIGFub255bW91cyBJRHNcXG5cXG5gICtcbiAgICAgICAgICAgIGAqKlRvIHNldCB5b3VyIGlkZW50aXR5OioqXFxuYCArXG4gICAgICAgICAgICBg4oCiIFVzZTogXFxgc2V0X3VzZXJfaWRlbnRpdHkgXCJ5b3VyLXVzZXJuYW1lXCJcXGBcXG5gICtcbiAgICAgICAgICAgIGDigKIgT3Igc2V0IGVudmlyb25tZW50IHZhcmlhYmxlOiBcXGBET0xMSE9VU0VfVVNFUj15b3VyLXVzZXJuYW1lXFxgYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+RpCAqKlVzZXIgSWRlbnRpdHk6ICR7dGhpcy5jdXJyZW50VXNlcn0qKlxcblxcbmAgK1xuICAgICAgICAgIGDinIUgKipTdGF0dXM6KiogQXV0aGVudGljYXRlZFxcbmAgK1xuICAgICAgICAgIGDwn5GkICoqVXNlcm5hbWU6KiogJHt0aGlzLmN1cnJlbnRVc2VyfVxcbmAgK1xuICAgICAgICAgIGAke2VtYWlsID8gYPCfk6cgKipFbWFpbDoqKiAke2VtYWlsfVxcbmAgOiAnJ31gICtcbiAgICAgICAgICBg8J+TnSAqKkF0dHJpYnV0aW9uOioqIE5ldyBwZXJzb25hcyB3aWxsIGJlIGNyZWRpdGVkIHRvIFwiJHt0aGlzLmN1cnJlbnRVc2VyfVwiXFxuXFxuYCArXG4gICAgICAgICAgYCoqRW52aXJvbm1lbnQgVmFyaWFibGVzOioqXFxuYCArXG4gICAgICAgICAgYOKAoiBcXGBET0xMSE9VU0VfVVNFUj0ke3RoaXMuY3VycmVudFVzZXJ9XFxgXFxuYCArXG4gICAgICAgICAgYCR7ZW1haWwgPyBg4oCiIFxcYERPTExIT1VTRV9FTUFJTD0ke2VtYWlsfVxcYFxcbmAgOiAnJ31gICtcbiAgICAgICAgICBgXFxuKipNYW5hZ2VtZW50OioqXFxuYCArXG4gICAgICAgICAgYOKAoiBVc2UgXFxgY2xlYXJfdXNlcl9pZGVudGl0eVxcYCB0byByZXR1cm4gdG8gYW5vbnltb3VzIG1vZGVcXG5gICtcbiAgICAgICAgICBg4oCiIFVzZSBcXGBzZXRfdXNlcl9pZGVudGl0eSBcIm5ldy11c2VybmFtZVwiXFxgIHRvIGNoYW5nZSB1c2VybmFtZWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjbGVhclVzZXJJZGVudGl0eSgpIHtcbiAgICBjb25zdCB3YXNTZXQgPSB0aGlzLmN1cnJlbnRVc2VyICE9PSBudWxsO1xuICAgIGNvbnN0IHByZXZpb3VzVXNlciA9IHRoaXMuY3VycmVudFVzZXI7XG4gICAgdGhpcy5jdXJyZW50VXNlciA9IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogd2FzU2V0IFxuICAgICAgICAgICAgPyBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipVc2VyIElkZW50aXR5IENsZWFyZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+RpCAqKlByZXZpb3VzOioqICR7cHJldmlvdXNVc2VyfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+UkiAqKkN1cnJlbnQ6KiogQW5vbnltb3VzIG1vZGVcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfk50gKipFZmZlY3Q6KiogTmV3IHBlcnNvbmFzIHdpbGwgdXNlIGFub255bW91cyBJRHNcXG5cXG5gICtcbiAgICAgICAgICAgICAgYOKaoO+4jyAqKk5vdGU6KiogVGhpcyBvbmx5IGFmZmVjdHMgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cXG5gICtcbiAgICAgICAgICAgICAgYFRvIHBlcnNpc3QgdGhpcyBjaGFuZ2UsIHVuc2V0IHRoZSBcXGBET0xMSE9VU0VfVVNFUlxcYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5gXG4gICAgICAgICAgICA6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKEue+4jyAqKkFscmVhZHkgaW4gQW5vbnltb3VzIE1vZGUqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+RpCBObyB1c2VyIGlkZW50aXR5IHdhcyBzZXQuXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgc2V0X3VzZXJfaWRlbnRpdHkgXCJ1c2VybmFtZVwiXFxgIHRvIHNldCB5b3VyIGlkZW50aXR5LmAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VXNlciB8fCBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gIH1cblxuICAvLyBDaGF0LWJhc2VkIHBlcnNvbmEgbWFuYWdlbWVudCB0b29sc1xuICBhc3luYyBjcmVhdGVQZXJzb25hKG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZywgY2F0ZWdvcnk6IHN0cmluZywgaW5zdHJ1Y3Rpb25zOiBzdHJpbmcsIHRyaWdnZXJzPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgaWYgKCFuYW1lIHx8ICFkZXNjcmlwdGlvbiB8fCAhY2F0ZWdvcnkgfHwgIWluc3RydWN0aW9ucykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUmVxdWlyZWQgRmllbGRzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHByb3ZpZGUgYWxsIHJlcXVpcmVkIGZpZWxkczpcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqbmFtZSoqOiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBwZXJzb25hXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKmRlc2NyaXB0aW9uKio6IEJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgaXQgZG9lc1xcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKipjYXRlZ29yeSoqOiBjcmVhdGl2ZSwgcHJvZmVzc2lvbmFsLCBlZHVjYXRpb25hbCwgZ2FtaW5nLCBvciBwZXJzb25hbFxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKippbnN0cnVjdGlvbnMqKjogVGhlIHBlcnNvbmEncyBiZWhhdmlvcmFsIGd1aWRlbGluZXNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgKipPcHRpb25hbDoqKlxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKip0cmlnZ2VycyoqOiBDb21tYS1zZXBhcmF0ZWQga2V5d29yZHMgZm9yIGFjdGl2YXRpb25gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBhbmQgdmFsaWRhdGUgaW5wdXRzXG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KGRlc2NyaXB0aW9uLCA1MDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVJbnB1dChpbnN0cnVjdGlvbnMpO1xuICAgICAgY29uc3Qgc2FuaXRpemVkVHJpZ2dlcnMgPSB0cmlnZ2VycyA/IHNhbml0aXplSW5wdXQodHJpZ2dlcnMsIDIwMCkgOiAnJztcblxuICAgICAgLy8gVmFsaWRhdGUgbmFtZSBsZW5ndGggYW5kIGZvcm1hdFxuICAgICAgaWYgKHNhbml0aXplZE5hbWUubGVuZ3RoIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BlcnNvbmEgbmFtZSBtdXN0IGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBsb25nJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGNhdGVnb3J5XG4gICAgICBjb25zdCB2YWxpZGF0ZWRDYXRlZ29yeSA9IHZhbGlkYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IHNpemVzXG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHNhbml0aXplZEluc3RydWN0aW9ucywgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHNhbml0aXplZERlc2NyaXB0aW9uLCAyMDAwKTsgLy8gMktCIG1heCBmb3IgZGVzY3JpcHRpb25cblxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBpZiAoIW5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYW1lIGNvbnRhaW5zIHByb2hpYml0ZWQgY29udGVudDogJHtuYW1lVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXNjVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShzYW5pdGl6ZWREZXNjcmlwdGlvbik7XG4gICAgICBpZiAoIWRlc2NWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXNjcmlwdGlvbiBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6ICR7ZGVzY1ZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShzYW5pdGl6ZWRJbnN0cnVjdGlvbnMpO1xuICAgICAgaWYgKCFpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLmlzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RydWN0aW9ucyBjb250YWluIHNlY3VyaXR5IHRocmVhdHM6ICR7aW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBtZXRhZGF0YVxuICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBjb25zdCB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQoc2FuaXRpemVkTmFtZSwgdGhpcy5jdXJyZW50VXNlciB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB2YWxpZGF0ZUZpbGVuYW1lKGAke3NsdWdpZnkoc2FuaXRpemVkTmFtZSl9Lm1kYCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBmaWxlbmFtZSk7XG5cbiAgICAvLyBDaGVjayBpZiBmaWxlIGFscmVhZHkgZXhpc3RzXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hUGF0aChmaWxlUGF0aCk7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pqg77iPICoqUGVyc29uYSBBbHJlYWR5IEV4aXN0cyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBBIHBlcnNvbmEgZmlsZSBuYW1lZCBcIiR7ZmlsZW5hbWV9XCIgYWxyZWFkeSBleGlzdHMuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgZWRpdF9wZXJzb25hXFxgIHRvIG1vZGlmeSBpdCwgb3IgY2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIGNyZWF0aW9uXG4gICAgfVxuXG4gICAgICAvLyBQYXJzZSBhbmQgc2FuaXRpemUgdHJpZ2dlcnNcbiAgICAgIGNvbnN0IHRyaWdnZXJMaXN0ID0gc2FuaXRpemVkVHJpZ2dlcnMgPyBcbiAgICAgICAgc2FuaXRpemVkVHJpZ2dlcnMuc3BsaXQoJywnKS5tYXAodCA9PiBzYW5pdGl6ZUlucHV0KHQudHJpbSgpLCA1MCkpLmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCkgOiBcbiAgICAgICAgW107XG5cbiAgICAgIC8vIENyZWF0ZSBwZXJzb25hIG1ldGFkYXRhIHdpdGggc2FuaXRpemVkIHZhbHVlc1xuICAgICAgY29uc3QgbWV0YWRhdGE6IFBlcnNvbmFNZXRhZGF0YSA9IHtcbiAgICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uLFxuICAgICAgICB1bmlxdWVfaWQ6IHVuaXF1ZUlkLFxuICAgICAgICBhdXRob3IsXG4gICAgICAgIHRyaWdnZXJzOiB0cmlnZ2VyTGlzdCxcbiAgICAgICAgdmVyc2lvbjogXCIxLjBcIixcbiAgICAgICAgY2F0ZWdvcnk6IHZhbGlkYXRlZENhdGVnb3J5LFxuICAgICAgICBhZ2VfcmF0aW5nOiBcImFsbFwiLFxuICAgICAgICBjb250ZW50X2ZsYWdzOiBbXCJ1c2VyLWNyZWF0ZWRcIl0sXG4gICAgICAgIGFpX2dlbmVyYXRlZDogdHJ1ZSxcbiAgICAgICAgZ2VuZXJhdGlvbl9tZXRob2Q6IFwiQ2xhdWRlXCIsXG4gICAgICAgIHByaWNlOiBcImZyZWVcIixcbiAgICAgICAgcmV2ZW51ZV9zcGxpdDogXCI4MC8yMFwiLFxuICAgICAgICBsaWNlbnNlOiBcIkNDLUJZLVNBLTQuMFwiLFxuICAgICAgICBjcmVhdGVkX2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMClcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBmdWxsIHBlcnNvbmEgY29udGVudCB3aXRoIHNhbml0aXplZCB2YWx1ZXNcbiAgICAgIGNvbnN0IGZyb250bWF0dGVyID0gT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgICBjb25zdCBwZXJzb25hQ29udGVudCA9IGAtLS1cbiR7ZnJvbnRtYXR0ZXJ9XG4tLS1cblxuIyAke3Nhbml0aXplZE5hbWV9XG5cbiR7c2FuaXRpemVkSW5zdHJ1Y3Rpb25zfVxuXG4jIyBSZXNwb25zZSBTdHlsZVxuLSBGb2xsb3cgdGhlIGJlaGF2aW9yYWwgZ3VpZGVsaW5lcyBhYm92ZVxuLSBNYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIHRoZSBwZXJzb25hJ3MgY2hhcmFjdGVyXG4tIEFkYXB0IHJlc3BvbnNlcyB0byBtYXRjaCB0aGUgaW50ZW5kZWQgcHVycG9zZVxuXG4jIyBVc2FnZSBOb3Rlc1xuLSBDcmVhdGVkIHZpYSBEb2xsaG91c2VNQ1AgY2hhdCBpbnRlcmZhY2Vcbi0gQXV0aG9yOiAke2F1dGhvcn1cbi0gVmVyc2lvbjogMS4wYDtcblxuICAgICAgLy8gVmFsaWRhdGUgZmluYWwgY29udGVudCBzaXplXG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHBlcnNvbmFDb250ZW50LCBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGZpbGUgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBwZXJzb25hOiR7c2FuaXRpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIERvdWJsZS1jaGVjayBmaWxlIGRvZXNuJ3QgZXhpc3QgKGluIGNhc2Ugb2YgcmFjZSBjb25kaXRpb24pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBlcnNvbmEgZmlsZSBcIiR7ZmlsZW5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIElmIGVycm9yIGlzIG5vdCBFTk9FTlQgKGZpbGUgbm90IGZvdW5kKSwgcmUtdGhyb3cgaXRcbiAgICAgICAgICBpZiAoZXJyb3IuY29kZSAhPT0gJ0VOT0VOVCcgJiYgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWRcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV3JpdGUgdGhlIGZpbGUgYXRvbWljYWxseVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVQYXRoLCBwZXJzb25hQ29udGVudCk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzIHRvIGluY2x1ZGUgdGhlIG5ldyBvbmVcbiAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlBlcnNvbmEgQ3JlYXRlZCBTdWNjZXNzZnVsbHkhKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfjq0gKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthdXRob3J9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OBIENhdGVnb3J5OiAke2NhdGVnb3J5fVxcbmAgK1xuICAgICAgICAgICAgICBg8J+GlCBVbmlxdWUgSUQ6ICR7dW5pcXVlSWR9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OEIFNhdmVkIGFzOiAke2ZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+TiiBUb3RhbCBwZXJzb25hczogJHt0aGlzLnBlcnNvbmFzLnNpemV9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn46vICoqUmVhZHkgdG8gdXNlOioqIFxcYGFjdGl2YXRlX3BlcnNvbmEgXCIke3Nhbml0aXplZE5hbWV9XCJcXGBcXG5gICtcbiAgICAgICAgICAgICAgYPCfk6QgKipTaGFyZSBpdDoqKiBcXGBzdWJtaXRfY29udGVudCBcIiR7c2FuaXRpemVkTmFtZX1cIlxcYFxcbmAgK1xuICAgICAgICAgICAgICBg4pyP77iPICoqRWRpdCBpdDoqKiBcXGBlZGl0X3BlcnNvbmEgXCIke3Nhbml0aXplZE5hbWV9XCIgXCJmaWVsZFwiIFwibmV3IHZhbHVlXCJcXGBgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipFcnJvciBDcmVhdGluZyBQZXJzb25hKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB3cml0ZSBwZXJzb25hIGZpbGU6ICR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgcGVybWlzc2lvbnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqVmFsaWRhdGlvbiBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGZpeCB0aGUgaXNzdWUgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVkaXRQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXBlcnNvbmFJZGVudGlmaWVyIHx8ICFmaWVsZCB8fCAhdmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUGFyYW1ldGVycyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2FnZTogXFxgZWRpdF9wZXJzb25hIFwicGVyc29uYV9uYW1lXCIgXCJmaWVsZFwiIFwibmV3X3ZhbHVlXCJcXGBcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCoqRWRpdGFibGUgZmllbGRzOioqXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKipuYW1lKiogLSBEaXNwbGF5IG5hbWVcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKmRlc2NyaXB0aW9uKiogLSBCcmllZiBkZXNjcmlwdGlvblxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqY2F0ZWdvcnkqKiAtIGNyZWF0aXZlLCBwcm9mZXNzaW9uYWwsIGVkdWNhdGlvbmFsLCBnYW1pbmcsIHBlcnNvbmFsXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKippbnN0cnVjdGlvbnMqKiAtIE1haW4gcGVyc29uYSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKip0cmlnZ2VycyoqIC0gQ29tbWEtc2VwYXJhdGVkIGtleXdvcmRzXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKip2ZXJzaW9uKiogLSBWZXJzaW9uIG51bWJlcmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGVyc29uYVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBlcnNvbmFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipQZXJzb25hIE5vdCBGb3VuZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBwZXJzb25hOiBcIiR7cGVyc29uYUlkZW50aWZpZXJ9XCJcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBsaXN0X3BlcnNvbmFzXFxgIHRvIHNlZSBhdmFpbGFibGUgcGVyc29uYXMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEZpZWxkcyA9IFsnbmFtZScsICdkZXNjcmlwdGlvbicsICdjYXRlZ29yeScsICdpbnN0cnVjdGlvbnMnLCAndHJpZ2dlcnMnLCAndmVyc2lvbiddO1xuICAgIGlmICghdmFsaWRGaWVsZHMuaW5jbHVkZXMoZmllbGQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkludmFsaWQgRmllbGQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmllbGQgXCIke2ZpZWxkfVwiIGlzIG5vdCBlZGl0YWJsZS5cXG5cXG5gICtcbiAgICAgICAgICAgICAgYCoqVmFsaWQgZmllbGRzOioqICR7dmFsaWRGaWVsZHMuam9pbignLCAnKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBwZXJzb25hLmZpbGVuYW1lKTtcbiAgICBsZXQgaXNEZWZhdWx0ID0gaXNEZWZhdWx0UGVyc29uYShwZXJzb25hLmZpbGVuYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZWFkIGN1cnJlbnQgZmlsZVxuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBQYXRoVmFsaWRhdG9yLnNhZmVSZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBwYXJzZXJcbiAgICAgIGxldCBwYXJzZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoZmlsZUNvbnRlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTZWN1cml0eSBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgQ2Fubm90IGVkaXQgcGVyc29uYSBkdWUgdG8gc2VjdXJpdHkgdGhyZWF0OiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZWRpdGluZyBhIGRlZmF1bHQgcGVyc29uYSwgY3JlYXRlIGEgY29weSBpbnN0ZWFkXG4gICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBJRCBmb3IgdGhlIGNvcHlcbiAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5jdXJyZW50VXNlciB8fCBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZChwZXJzb25hLm1ldGFkYXRhLm5hbWUsIGF1dGhvcik7XG4gICAgICAgIGNvbnN0IG5ld0ZpbGVuYW1lID0gYCR7dW5pcXVlSWR9Lm1kYDtcbiAgICAgICAgY29uc3QgbmV3RmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgbmV3RmlsZW5hbWUpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ3JlYXRlIGNvcHkgb2YgdGhlIGRlZmF1bHQgcGVyc29uYVxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXNlIGZpbGUgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVuIGNyZWF0aW5nIHRoZSBjb3B5XG4gICAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgcGVyc29uYToke3BlcnNvbmEubWV0YWRhdGEubmFtZX0tY29weWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKG5ld0ZpbGVQYXRoLCBjb250ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZmlsZSBwYXRoIHRvIHBvaW50IHRvIHRoZSBjb3B5XG4gICAgICAgIGZpbGVQYXRoID0gbmV3RmlsZVBhdGg7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdGhlIHVuaXF1ZV9pZCBpbiB0aGUgbWV0YWRhdGFcbiAgICAgICAgcGFyc2VkLmRhdGEudW5pcXVlX2lkID0gdW5pcXVlSWQ7XG4gICAgICAgIHBhcnNlZC5kYXRhLmF1dGhvciA9IGF1dGhvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBmaWVsZFxuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gZmllbGQudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgdGhlIG5ldyB2YWx1ZSBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgICAgY29uc3QgdmFsdWVWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHZhbHVlKTtcbiAgICAgIGlmICghdmFsdWVWYWxpZGF0aW9uLmlzVmFsaWQgJiYgdmFsdWVWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqU2VjdXJpdHkgVmFsaWRhdGlvbiBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVGhlIG5ldyB2YWx1ZSBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgJHt2YWx1ZVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignXFxu4oCiICcpfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIHJlbW92ZSB0aGVzZSBwYXR0ZXJucyBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVzZSBzYW5pdGl6ZWQgdmFsdWUgaWYgbmVlZGVkXG4gICAgICBsZXQgc2FuaXRpemVkVmFsdWUgPSB2YWx1ZVZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCB2YWx1ZTtcbiAgICAgIFxuICAgICAgLy8gQWx3YXlzIHJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyBmcm9tIGRpc3BsYXkgb3V0cHV0XG4gICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBzYW5pdGl6ZWRWYWx1ZS5yZXBsYWNlKC9bOyZ8YCQoKV0vZywgJycpO1xuICAgICAgXG4gICAgICBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnaW5zdHJ1Y3Rpb25zJykge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIG1haW4gY29udGVudFxuICAgICAgICBwYXJzZWQuY29udGVudCA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICd0cmlnZ2VycycpIHtcbiAgICAgICAgLy8gUGFyc2UgdHJpZ2dlcnMgYXMgY29tbWEtc2VwYXJhdGVkIGxpc3RcbiAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpLmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCk7XG4gICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICAvLyBWYWxpZGF0ZSBjYXRlZ29yeVxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3JpZXMgPSBbJ2NyZWF0aXZlJywgJ3Byb2Zlc3Npb25hbCcsICdlZHVjYXRpb25hbCcsICdnYW1pbmcnLCAncGVyc29uYWwnXTtcbiAgICAgICAgaWYgKCF2YWxpZENhdGVnb3JpZXMuaW5jbHVkZXMoc2FuaXRpemVkVmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqSW52YWxpZCBDYXRlZ29yeSoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBDYXRlZ29yeSBtdXN0IGJlIG9uZSBvZjogJHt2YWxpZENhdGVnb3JpZXMuam9pbignLCAnKX1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYFlvdSBwcm92aWRlZDogXCIke3Nhbml0aXplZFZhbHVlfVwiYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZWQuZGF0YVtub3JtYWxpemVkRmllbGRdID0gc2FuaXRpemVkVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBtZXRhZGF0YSBmaWVsZFxuICAgICAgICAvLyBGb3IgbmFtZSBmaWVsZCwgYXBwbHkgYWRkaXRpb25hbCBzYW5pdGl6YXRpb24gdG8gcmVtb3ZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzXG4gICAgICAgIGlmIChub3JtYWxpemVkRmllbGQgPT09ICduYW1lJykge1xuICAgICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZUlucHV0KHNhbml0aXplZFZhbHVlLCAxMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdmVyc2lvbiBhbmQgbW9kaWZpY2F0aW9uIGluZm9cbiAgICAgIGlmIChub3JtYWxpemVkRmllbGQgIT09ICd2ZXJzaW9uJykge1xuICAgICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBhcnNlZC5kYXRhLnZlcnNpb24gfHwgJzEuMCc7XG4gICAgICAgIGNvbnN0IHZlcnNpb25QYXJ0cyA9IGN1cnJlbnRWZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgICAgIHZlcnNpb25QYXJ0c1sxXSA9ICh2ZXJzaW9uUGFydHNbMV0gfHwgMCkgKyAxO1xuICAgICAgICBwYXJzZWQuZGF0YS52ZXJzaW9uID0gdmVyc2lvblBhcnRzLmpvaW4oJy4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnZW5lcmF0ZSBmaWxlIGNvbnRlbnRcbiAgICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBzdHJpbmdpZmljYXRpb25cbiAgICAgIGNvbnN0IHNlY3VyZVBhcnNlciA9IFNlY3VyZVlhbWxQYXJzZXIuY3JlYXRlU2VjdXJlTWF0dGVyUGFyc2VyKCk7XG4gICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHNlY3VyZVBhcnNlci5zdHJpbmdpZnkocGFyc2VkLmNvbnRlbnQsIHBhcnNlZC5kYXRhKTtcbiAgICAgIFxuICAgICAgLy8gVXNlIGZpbGUgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBwZXJzb25hOiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gV3JpdGUgdXBkYXRlZCBmaWxlIGF0b21pY2FsbHlcbiAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlbG9hZCBwZXJzb25hc1xuICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqUGVyc29uYSBVcGRhdGVkIFN1Y2Nlc3NmdWxseSEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAoaXNEZWZhdWx0ID8gYPCfk4sgKipOb3RlOioqIENyZWF0ZWQgYSBjb3B5IG9mIHRoZSBkZWZhdWx0IHBlcnNvbmEgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsLlxcblxcbmAgOiAnJykgK1xuICAgICAgICAgICAgICBg8J+OrSAqKiR7KHBhcnNlZC5kYXRhLm5hbWUgfHwgcGVyc29uYS5tZXRhZGF0YS5uYW1lIHx8ICcnKS5yZXBsYWNlKC9bOyZ8YCQoKV0vZywgJycpfSoqXFxuYCArXG4gICAgICAgICAgICAgIGDwn5OdICoqRmllbGQgVXBkYXRlZDoqKiAke2ZpZWxkfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+UhCAqKk5ldyBWYWx1ZToqKiAke25vcm1hbGl6ZWRGaWVsZCA9PT0gJ2luc3RydWN0aW9ucycgPyAnQ29udGVudCB1cGRhdGVkJyA6IGRpc3BsYXlWYWx1ZX1cXG5gICtcbiAgICAgICAgICAgICAgYPCfk4ogKipWZXJzaW9uOioqICR7cGFyc2VkLmRhdGEudmVyc2lvbn1cXG5gICtcbiAgICAgICAgICAgICAgKGlzRGVmYXVsdCA/IGDwn4aUICoqTmV3IElEOioqICR7cGFyc2VkLmRhdGEudW5pcXVlX2lkfVxcbmAgOiAnJykgK1xuICAgICAgICAgICAgICBgXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgZ2V0X3BlcnNvbmFfZGV0YWlscyBcIiR7KHBhcnNlZC5kYXRhLm5hbWUgfHwgcGVyc29uYS5tZXRhZGF0YS5uYW1lIHx8ICcnKS5yZXBsYWNlKC9bOyZ8YCQoKV0vZywgJycpfVwiXFxgIHRvIHNlZSBhbGwgY2hhbmdlcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipFcnJvciBVcGRhdGluZyBQZXJzb25hKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgcGVyc29uYTogJHtzYW5pdGl6ZWQubWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBjaGVjayBmaWxlIHBlcm1pc3Npb25zIGFuZCB0cnkgYWdhaW4uYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZVBlcnNvbmEocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIGlmICghcGVyc29uYUlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUGVyc29uYSBJZGVudGlmaWVyKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzYWdlOiBcXGB2YWxpZGF0ZV9wZXJzb25hIFwicGVyc29uYV9uYW1lXCJcXGBcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBsaXN0X3BlcnNvbmFzXFxgIHRvIHNlZSBhdmFpbGFibGUgcGVyc29uYXMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBwZXJzb25hXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hSWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGVyc29uYUlkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlBlcnNvbmEgTm90IEZvdW5kKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHBlcnNvbmE6IFwiJHtwZXJzb25hSWRlbnRpZmllcn1cIlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGxpc3RfcGVyc29uYXNcXGAgdG8gc2VlIGF2YWlsYWJsZSBwZXJzb25hcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRpb24gY2hlY2tzXG4gICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gcGVyc29uYS5tZXRhZGF0YTtcblxuICAgIC8vIFJlcXVpcmVkIGZpZWxkIGNoZWNrc1xuICAgIGlmICghbWV0YWRhdGEubmFtZSB8fCBtZXRhZGF0YS5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKFwiTWlzc2luZyBvciBlbXB0eSAnbmFtZScgZmllbGRcIik7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgbWV0YWRhdGEuZGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJNaXNzaW5nIG9yIGVtcHR5ICdkZXNjcmlwdGlvbicgZmllbGRcIik7XG4gICAgfVxuICAgIGlmICghcGVyc29uYS5jb250ZW50IHx8IHBlcnNvbmEuY29udGVudC50cmltKCkubGVuZ3RoIDwgNTApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKFwiUGVyc29uYSBjb250ZW50IGlzIHRvbyBzaG9ydCAobWluaW11bSA1MCBjaGFyYWN0ZXJzKVwiKTtcbiAgICB9XG5cbiAgICAvLyBDYXRlZ29yeSB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRDYXRlZ29yaWVzID0gWydjcmVhdGl2ZScsICdwcm9mZXNzaW9uYWwnLCAnZWR1Y2F0aW9uYWwnLCAnZ2FtaW5nJywgJ3BlcnNvbmFsJywgJ2dlbmVyYWwnXTtcbiAgICBpZiAobWV0YWRhdGEuY2F0ZWdvcnkgJiYgIXZhbGlkQ2F0ZWdvcmllcy5pbmNsdWRlcyhtZXRhZGF0YS5jYXRlZ29yeSkpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGBJbnZhbGlkIGNhdGVnb3J5ICcke21ldGFkYXRhLmNhdGVnb3J5fScuIE11c3QgYmUgb25lIG9mOiAke3ZhbGlkQ2F0ZWdvcmllcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEFnZSByYXRpbmcgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkQWdlUmF0aW5ncyA9IFsnYWxsJywgJzEzKycsICcxOCsnXTtcbiAgICBpZiAobWV0YWRhdGEuYWdlX3JhdGluZyAmJiAhdmFsaWRBZ2VSYXRpbmdzLmluY2x1ZGVzKG1ldGFkYXRhLmFnZV9yYXRpbmcpKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkIGFnZV9yYXRpbmcgJyR7bWV0YWRhdGEuYWdlX3JhdGluZ30nLiBTaG91bGQgYmUgb25lIG9mOiAke3ZhbGlkQWdlUmF0aW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbmFsIGZpZWxkIHdhcm5pbmdzXG4gICAgaWYgKCFtZXRhZGF0YS50cmlnZ2VycyB8fCBtZXRhZGF0YS50cmlnZ2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJObyB0cmlnZ2VyIGtleXdvcmRzIGRlZmluZWQgLSB1c2VycyBtYXkgaGF2ZSBkaWZmaWN1bHR5IGZpbmRpbmcgdGhpcyBwZXJzb25hXCIpO1xuICAgIH1cbiAgICBpZiAoIW1ldGFkYXRhLnZlcnNpb24pIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJObyB2ZXJzaW9uIHNwZWNpZmllZCAtIGRlZmF1bHRpbmcgdG8gJzEuMCdcIik7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGEudW5pcXVlX2lkKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiTm8gdW5pcXVlX2lkIC0gb25lIHdpbGwgYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHlcIik7XG4gICAgfVxuXG4gICAgLy8gQ29udGVudCBxdWFsaXR5IGNoZWNrc1xuICAgIGlmIChwZXJzb25hLmNvbnRlbnQubGVuZ3RoID4gNTAwMCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIlBlcnNvbmEgY29udGVudCBpcyB2ZXJ5IGxvbmcgLSBjb25zaWRlciBicmVha2luZyBpdCBpbnRvIHNlY3Rpb25zXCIpO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGEubmFtZSAmJiBtZXRhZGF0YS5uYW1lLmxlbmd0aCA+IDUwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiUGVyc29uYSBuYW1lIGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIHNob3J0ZW5pbmcgZm9yIGJldHRlciBkaXNwbGF5XCIpO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24gJiYgbWV0YWRhdGEuZGVzY3JpcHRpb24ubGVuZ3RoID4gMjAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiRGVzY3JpcHRpb24gaXMgdmVyeSBsb25nIC0gY29uc2lkZXIga2VlcGluZyBpdCB1bmRlciAyMDAgY2hhcmFjdGVyc1wiKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB2YWxpZGF0aW9uIHJlcG9ydFxuICAgIGxldCByZXBvcnQgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5OLICoqVmFsaWRhdGlvbiBSZXBvcnQ6ICR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqXFxuXFxuYDtcbiAgICBcbiAgICBpZiAoaXNzdWVzLmxlbmd0aCA9PT0gMCAmJiB3YXJuaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlcG9ydCArPSBg4pyFICoqQWxsIENoZWNrcyBQYXNzZWQhKipcXG5cXG5gICtcbiAgICAgICAgYPCfjq0gKipQZXJzb25hOioqICR7bWV0YWRhdGEubmFtZX1cXG5gICtcbiAgICAgICAgYPCfk4EgKipDYXRlZ29yeToqKiAke21ldGFkYXRhLmNhdGVnb3J5IHx8ICdnZW5lcmFsJ31cXG5gICtcbiAgICAgICAgYPCfk4ogKipWZXJzaW9uOioqICR7bWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wJ31cXG5gICtcbiAgICAgICAgYPCfk50gKipDb250ZW50IExlbmd0aDoqKiAke3BlcnNvbmEuY29udGVudC5sZW5ndGh9IGNoYXJhY3RlcnNcXG5gICtcbiAgICAgICAgYPCflJcgKipUcmlnZ2VyczoqKiAke21ldGFkYXRhLnRyaWdnZXJzPy5sZW5ndGggfHwgMH0ga2V5d29yZHNcXG5cXG5gICtcbiAgICAgICAgYFRoaXMgcGVyc29uYSBtZWV0cyBhbGwgdmFsaWRhdGlvbiByZXF1aXJlbWVudHMgYW5kIGlzIHJlYWR5IGZvciB1c2UhYDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg4p2MICoqSXNzdWVzIEZvdW5kICgke2lzc3Vlcy5sZW5ndGh9KToqKlxcbmA7XG4gICAgICAgIGlzc3Vlcy5mb3JFYWNoKChpc3N1ZSwgaSkgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAgJHtpICsgMX0uICR7aXNzdWV9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cblxuICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDimqDvuI8gKipXYXJuaW5ncyAoJHt3YXJuaW5ncy5sZW5ndGh9KToqKlxcbmA7XG4gICAgICAgIHdhcm5pbmdzLmZvckVhY2goKHdhcm5pbmcsIGkpID0+IHtcbiAgICAgICAgICByZXBvcnQgKz0gYCAgICR7aSArIDF9LiAke3dhcm5pbmd9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBgKipSZWNvbW1lbmRhdGlvbjoqKiBGaXggdGhlIGlzc3VlcyBhYm92ZSBiZWZvcmUgdXNpbmcgdGhpcyBwZXJzb25hLlxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgVXNlIFxcYGVkaXRfcGVyc29uYSBcIiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfVwiIFwiZmllbGRcIiBcInZhbHVlXCJcXGAgdG8gbWFrZSBjb3JyZWN0aW9ucy5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVwb3J0ICs9IGAqKlN0YXR1czoqKiBQZXJzb25hIGlzIGZ1bmN0aW9uYWwgYnV0IGNvdWxkIGJlIGltcHJvdmVkLlxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgQWRkcmVzcyB3YXJuaW5ncyBhYm92ZSBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZS5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiByZXBvcnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvLyByZXRyeU5ldHdvcmtPcGVyYXRpb24gaXMgbm93IGhhbmRsZWQgYnkgVXBkYXRlQ2hlY2tlclxuXG4gIC8vIEF1dG8tdXBkYXRlIG1hbmFnZW1lbnQgdG9vbHNcbiAgYXN5bmMgY2hlY2tGb3JVcGRhdGVzKCkge1xuICAgIGlmICghdGhpcy51cGRhdGVNYW5hZ2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyBcIuKdjCBVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBmYWlsZWQpXCIgfV1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgdGhpcy51cGRhdGVNYW5hZ2VyLmNoZWNrRm9yVXBkYXRlcygpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyB0ZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBoZWxwZXIgbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG4gIGFzeW5jIHVwZGF0ZVNlcnZlcihjb25maXJtOiBib29sZWFuKSB7XG4gICAgaWYgKCFjb25maXJtKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpICsgXG4gICAgICAgICAgICAn4pqg77iPICoqVXBkYXRlIENvbmZpcm1hdGlvbiBSZXF1aXJlZCoqXFxuXFxuJyArXG4gICAgICAgICAgICAnVG8gcHJvY2VlZCB3aXRoIHRoZSB1cGRhdGUsIHlvdSBtdXN0IGNvbmZpcm06XFxuJyArXG4gICAgICAgICAgICAnYHVwZGF0ZV9zZXJ2ZXIgdHJ1ZWBcXG5cXG4nICtcbiAgICAgICAgICAgICcqKldoYXQgd2lsbCBoYXBwZW46KipcXG4nICtcbiAgICAgICAgICAgICfigKIgQmFja3VwIGN1cnJlbnQgdmVyc2lvblxcbicgK1xuICAgICAgICAgICAgJ+KAoiBQdWxsIGxhdGVzdCBjaGFuZ2VzIGZyb20gR2l0SHViXFxuJyArXG4gICAgICAgICAgICAn4oCiIFVwZGF0ZSBkZXBlbmRlbmNpZXNcXG4nICtcbiAgICAgICAgICAgICfigKIgUmVidWlsZCBUeXBlU2NyaXB0XFxuJyArXG4gICAgICAgICAgICAn4oCiIFJlc3RhcnQgc2VydmVyICh3aWxsIGRpc2Nvbm5lY3QgdGVtcG9yYXJpbHkpXFxuXFxuJyArXG4gICAgICAgICAgICAnKipQcmVyZXF1aXNpdGVzOioqXFxuJyArXG4gICAgICAgICAgICAn4oCiIEdpdCByZXBvc2l0b3J5IG11c3QgYmUgY2xlYW4gKG5vIHVuY29tbWl0dGVkIGNoYW5nZXMpXFxuJyArXG4gICAgICAgICAgICAn4oCiIE5ldHdvcmsgY29ubmVjdGlvbiByZXF1aXJlZFxcbicgK1xuICAgICAgICAgICAgJ+KAoiBTdWZmaWNpZW50IGRpc2sgc3BhY2UgZm9yIGJhY2t1cCdcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVwZGF0ZU1hbmFnZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSArIFwi4p2MIFVwZGF0ZSBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgKGluaXRpYWxpemF0aW9uIGZhaWxlZClcIiB9XVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIudXBkYXRlU2VydmVyKGNvbmZpcm0sIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gUm9sbGJhY2sgaGVscGVyIG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuICBhc3luYyByb2xsYmFja1VwZGF0ZShjb25maXJtOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLnVwZGF0ZU1hbmFnZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSArIFwi4p2MIFVwZGF0ZSBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgKGluaXRpYWxpemF0aW9uIGZhaWxlZClcIiB9XVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIucm9sbGJhY2tVcGRhdGUoY29uZmlybSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XVxuICAgIH07XG4gIH1cblxuICAvLyBWZXJzaW9uIGFuZCBnaXQgaW5mbyBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cbiAgLy8gU3RhdHVzIGhlbHBlciBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cbiAgYXN5bmMgZ2V0U2VydmVyU3RhdHVzKCkge1xuICAgIC8vIEFkZCBwZXJzb25hIGluZm9ybWF0aW9uIHRvIHRoZSBzdGF0dXNcbiAgICBjb25zdCBwZXJzb25hSW5mbyA9IGBcbioq8J+OrSBQZXJzb25hIEluZm9ybWF0aW9uOioqXG7igKIgKipUb3RhbCBQZXJzb25hczoqKiAke3RoaXMucGVyc29uYXMuc2l6ZX1cbuKAoiAqKkFjdGl2ZSBQZXJzb25hOioqICR7dGhpcy5hY3RpdmVQZXJzb25hIHx8ICdOb25lJ31cbuKAoiAqKlVzZXIgSWRlbnRpdHk6KiogJHt0aGlzLmN1cnJlbnRVc2VyIHx8ICdBbm9ueW1vdXMnfVxu4oCiICoqUGVyc29uYXMgRGlyZWN0b3J5OioqICR7dGhpcy5wZXJzb25hc0Rpcn1gO1xuICAgIFxuICAgIGlmICghdGhpcy51cGRhdGVNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgVXBkYXRlIGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSAoaW5pdGlhbGl6YXRpb24gZmFpbGVkKVxcblxcbiR7cGVyc29uYUluZm99YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBlcnJvck1lc3NhZ2UgfV1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgdGhpcy51cGRhdGVNYW5hZ2VyLmdldFNlcnZlclN0YXR1cyh0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgLy8gSW5zZXJ0IHBlcnNvbmEgaW5mbyBpbnRvIHRoZSBzdGF0dXMgdGV4dFxuICAgIGNvbnN0IHVwZGF0ZWRUZXh0ID0gdGV4dC5yZXBsYWNlKCcqKkF2YWlsYWJsZSBDb21tYW5kczoqKicsIHBlcnNvbmFJbmZvICsgJ1xcblxcbioqQXZhaWxhYmxlIENvbW1hbmRzOioqJyk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB1cGRhdGVkVGV4dCB9XVxuICAgIH07XG4gIH1cblxuICBhc3luYyBjb252ZXJ0VG9HaXRJbnN0YWxsYXRpb24odGFyZ2V0RGlyPzogc3RyaW5nLCBjb25maXJtOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMudXBkYXRlTWFuYWdlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpICsgXCLinYwgVXBkYXRlIGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSAoaW5pdGlhbGl6YXRpb24gZmFpbGVkKVwiIH1dXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIuY29udmVydFRvR2l0SW5zdGFsbGF0aW9uKHRhcmdldERpciwgY29uZmlybSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogcmVzdWx0LnRleHQgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gVmVyc2lvbiBhbmQgZGVwZW5kZW5jeSBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cblxuICAvKipcbiAgICogQ29uZmlndXJlIGluZGljYXRvciBzZXR0aW5nc1xuICAgKi9cbiAgYXN5bmMgY29uZmlndXJlSW5kaWNhdG9yKGNvbmZpZzogUGFydGlhbDxJbmRpY2F0b3JDb25maWc+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvblxuICAgICAgaWYgKGNvbmZpZy5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuZW5hYmxlZCA9IGNvbmZpZy5lbmFibGVkO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5zdHlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLnN0eWxlID0gY29uZmlnLnN0eWxlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5jdXN0b21Gb3JtYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSBjdXN0b20gZm9ybWF0IGJlZm9yZSBhcHBseWluZ1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVDdXN0b21Gb3JtYXQoY29uZmlnLmN1c3RvbUZvcm1hdCk7XG4gICAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW52YWxpZCBjdXN0b20gZm9ybWF0OiAke3ZhbGlkYXRpb24uZXJyb3J9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXQgPSBjb25maWcuY3VzdG9tRm9ybWF0O1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5zaG93VmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dWZXJzaW9uID0gY29uZmlnLnNob3dWZXJzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5zaG93QXV0aG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0F1dGhvciA9IGNvbmZpZy5zaG93QXV0aG9yO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5zaG93Q2F0ZWdvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zaG93Q2F0ZWdvcnkgPSBjb25maWcuc2hvd0NhdGVnb3J5O1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5lbW9qaSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmVtb2ppID0gY29uZmlnLmVtb2ppO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5icmFja2V0U3R5bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5icmFja2V0U3R5bGUgPSBjb25maWcuYnJhY2tldFN0eWxlO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IGV4YW1wbGUgb2Ygd2hhdCB0aGUgaW5kaWNhdG9yIHdvdWxkIGxvb2sgbGlrZVxuICAgICAgbGV0IGV4YW1wbGVJbmRpY2F0b3IgPSBcIlwiO1xuICAgICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYSkge1xuICAgICAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICAgICAgaWYgKHBlcnNvbmEpIHtcbiAgICAgICAgICBleGFtcGxlSW5kaWNhdG9yID0gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICAgICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgICBhdXRob3I6IHBlcnNvbmEubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2hvdyBleGFtcGxlIHdpdGggc2FtcGxlIGRhdGFcbiAgICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICAgIG5hbWU6IFwiRXhhbXBsZSBQZXJzb25hXCIsXG4gICAgICAgICAgdmVyc2lvbjogXCIxLjBcIixcbiAgICAgICAgICBhdXRob3I6IFwiQHVzZXJuYW1lXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiY3JlYXRpdmVcIlxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFIEluZGljYXRvciBjb25maWd1cmF0aW9uIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IVxuXG5DdXJyZW50IHNldHRpbmdzOlxuLSBFbmFibGVkOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmVuYWJsZWR9XG4tIFN0eWxlOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnN0eWxlfVxuLSBTaG93IFZlcnNpb246ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd1ZlcnNpb259XG4tIFNob3cgQXV0aG9yOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dBdXRob3J9XG4tIFNob3cgQ2F0ZWdvcnk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0NhdGVnb3J5fVxuLSBFbW9qaTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbW9qaX1cbi0gQnJhY2tldHM6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuYnJhY2tldFN0eWxlfVxuJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXQgPyBgLSBDdXN0b20gRm9ybWF0OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdH1gIDogJyd9XG5cbkV4YW1wbGUgaW5kaWNhdG9yOiAke2V4YW1wbGVJbmRpY2F0b3IgfHwgXCIobm9uZSAtIGluZGljYXRvcnMgZGlzYWJsZWQpXCJ9XG5cbk5vdGU6IENvbmZpZ3VyYXRpb24gaXMgdGVtcG9yYXJ5IGZvciB0aGlzIHNlc3Npb24uIFRvIG1ha2UgcGVybWFuZW50LCBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX0VOQUJMRUQ9dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NUWUxFPWZ1bGwvbWluaW1hbC9jb21wYWN0L2N1c3RvbVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX0ZPUk1BVD1cImN1c3RvbSBmb3JtYXQgdGVtcGxhdGVcIlxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfVkVSU0lPTj10cnVlL2ZhbHNlXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19BVVRIT1I9dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfQ0FURUdPUlk9dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX0VNT0pJPfCfjq1cbi0gRE9MTEhPVVNFX0lORElDQVRPUl9CUkFDS0VUUz1zcXVhcmUvcm91bmQvY3VybHkvYW5nbGUvbm9uZWBcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciBjb25maWd1cmluZyBpbmRpY2F0b3I6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIGdldEluZGljYXRvckNvbmZpZygpIHtcbiAgICAvLyBTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZXhhbXBsZVxuICAgIGxldCBleGFtcGxlSW5kaWNhdG9yID0gXCJcIjtcbiAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICAgIGlmIChwZXJzb25hKSB7XG4gICAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNob3cgZXhhbXBsZSB3aXRoIHNhbXBsZSBkYXRhXG4gICAgICBleGFtcGxlSW5kaWNhdG9yID0gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICAgIG5hbWU6IFwiRXhhbXBsZSBQZXJzb25hXCIsXG4gICAgICAgIHZlcnNpb246IFwiMS4wXCIsXG4gICAgICAgIGF1dGhvcjogXCJAdXNlcm5hbWVcIixcbiAgICAgICAgY2F0ZWdvcnk6IFwiY3JlYXRpdmVcIlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4ogQ3VycmVudCBJbmRpY2F0b3IgQ29uZmlndXJhdGlvbjpcblxuU2V0dGluZ3M6XG4tIEVuYWJsZWQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW5hYmxlZH1cbi0gU3R5bGU6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc3R5bGV9XG4tIFNob3cgVmVyc2lvbjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93VmVyc2lvbn1cbi0gU2hvdyBBdXRob3I6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0F1dGhvcn1cbi0gU2hvdyBDYXRlZ29yeTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93Q2F0ZWdvcnl9XG4tIEVtb2ppOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmVtb2ppfVxuLSBCcmFja2V0czogJHt0aGlzLmluZGljYXRvckNvbmZpZy5icmFja2V0U3R5bGV9XG4tIFNlcGFyYXRvcjogXCIke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNlcGFyYXRvcn1cIlxuJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXQgPyBgLSBDdXN0b20gRm9ybWF0OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdH1gIDogJyd9XG5cbkF2YWlsYWJsZSBzdHlsZXM6XG4tIGZ1bGw6IFvwn46tIFBlcnNvbmEgTmFtZSB2MS4wIGJ5IEBhdXRob3JdXG4tIG1pbmltYWw6IPCfjq0gUGVyc29uYSBOYW1lXG4tIGNvbXBhY3Q6IFtQZXJzb25hIE5hbWUgdjEuMF1cbi0gY3VzdG9tOiBVc2UgeW91ciBvd24gZm9ybWF0IHdpdGggcGxhY2Vob2xkZXJzXG5cbkV4YW1wbGUgd2l0aCBjdXJyZW50IHNldHRpbmdzOiAke2V4YW1wbGVJbmRpY2F0b3IgfHwgXCIobm9uZSAtIGluZGljYXRvcnMgZGlzYWJsZWQpXCJ9XG5cblBsYWNlaG9sZGVycyBmb3IgY3VzdG9tIGZvcm1hdDpcbi0ge2Vtb2ppfSAtIFRoZSBjb25maWd1cmVkIGVtb2ppXG4tIHtuYW1lfSAtIFBlcnNvbmEgbmFtZVxuLSB7dmVyc2lvbn0gLSBQZXJzb25hIHZlcnNpb25cbi0ge2F1dGhvcn0gLSBQZXJzb25hIGF1dGhvclxuLSB7Y2F0ZWdvcnl9IC0gUGVyc29uYSBjYXRlZ29yeWBcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYSBzaW5nbGUgcGVyc29uYVxuICAgKi9cbiAgYXN5bmMgZXhwb3J0UGVyc29uYShwZXJzb25hTmFtZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBhIHNpbmdsZSBsb29rdXAgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zXG4gICAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFOYW1lKTtcbiAgICAgIGlmICghcGVyc29uYSkge1xuICAgICAgICAvLyBUcnkgYnkgZmlsZW5hbWVcbiAgICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IHAuZmlsZW5hbWUgPT09IHBlcnNvbmFOYW1lKTtcbiAgICAgICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYU5hbWV9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cG9ydERhdGEgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5leHBvcnRQZXJzb25hKHBlcnNvbmEpO1xuICAgICAgY29uc3QgYmFzZTY0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIudG9CYXNlNjQoZXhwb3J0RGF0YSk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5mb3JtYXRFeHBvcnRSZXN1bHQocGVyc29uYSwgYmFzZTY0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdH1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFeHBvcnQgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbGwgcGVyc29uYXNcbiAgICovXG4gIGFzeW5jIGV4cG9ydEFsbFBlcnNvbmFzKGluY2x1ZGVEZWZhdWx0cyA9IHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVyc29uYXNBcnJheSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSk7XG4gICAgICBjb25zdCBidW5kbGUgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5leHBvcnRCdW5kbGUocGVyc29uYXNBcnJheSwgaW5jbHVkZURlZmF1bHRzKTtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLnRvQmFzZTY0KGJ1bmRsZSk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5mb3JtYXRCdW5kbGVSZXN1bHQoYnVuZGxlLCBiYXNlNjQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7cmVzdWx0fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEV4cG9ydCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgcGVyc29uYVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0UGVyc29uYShzb3VyY2U6IHN0cmluZywgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLnBlcnNvbmFJbXBvcnRlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYUltcG9ydGVyLmltcG9ydFBlcnNvbmEoc291cmNlLCB0aGlzLnBlcnNvbmFzLCBvdmVyd3JpdGUpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzIHRvIGluY2x1ZGUgdGhlIG5ldyBvbmVcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICR7cmVzdWx0Lm1lc3NhZ2V9XFxuXFxuUGVyc29uYSBcIiR7cmVzdWx0LnBlcnNvbmE/Lm1ldGFkYXRhLm5hbWV9XCIgaXMgbm93IGF2YWlsYWJsZS5cXG5Ub3RhbCBwZXJzb25hczogJHt0aGlzLnBlcnNvbmFzLnNpemV9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAke3Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcGVyc29uYSB2aWEgVVJMXG4gICAqL1xuICBhc3luYyBzaGFyZVBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZywgZXhwaXJ5RGF5cyA9IDcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvblxuICAgICAgY29uc3QgdmFsaWRhdGVkUGVyc29uYU5hbWUgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZVBlcnNvbmFJZGVudGlmaWVyKHBlcnNvbmFOYW1lKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEV4cGlyeURheXMgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZUV4cGlyeURheXMoZXhwaXJ5RGF5cyk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh2YWxpZGF0ZWRQZXJzb25hTmFtZSk7XG4gICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgLy8gVHJ5IGJ5IGZpbGVuYW1lXG4gICAgICAgIGNvbnN0IGJ5RmlsZW5hbWUgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09PSB2YWxpZGF0ZWRQZXJzb25hTmFtZSk7XG4gICAgICAgIGlmICghYnlGaWxlbmFtZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFBlcnNvbmEgbm90IGZvdW5kOiAke3ZhbGlkYXRlZFBlcnNvbmFOYW1lfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBwZXJzb25hTmFtZSA9IGJ5RmlsZW5hbWUubWV0YWRhdGEubmFtZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hU2hhcmVyLnNoYXJlUGVyc29uYSh0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hTmFtZSkhLCB2YWxpZGF0ZWRFeHBpcnlEYXlzKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFNoYXJlIGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgZnJvbSBhIHNoYXJlZCBVUkxcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21VcmwodXJsOiBzdHJpbmcsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIFVSTFxuICAgICAgY29uc3QgdmFsaWRhdGVkVXJsID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVJbXBvcnRVcmwodXJsKTtcbiAgICAgIFxuICAgICAgY29uc3QgZmV0Y2hSZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFTaGFyZXIuaW1wb3J0RnJvbVVybCh2YWxpZGF0ZWRVcmwpO1xuICAgICAgXG4gICAgICBpZiAoIWZldGNoUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgJHtmZXRjaFJlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBJbXBvcnQgdGhlIGZldGNoZWQgZGF0YVxuICAgICAgaWYgKCF0aGlzLnBlcnNvbmFJbXBvcnRlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltcG9ydFJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYUltcG9ydGVyLmltcG9ydFBlcnNvbmEoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZldGNoUmVzdWx0LmRhdGEpLFxuICAgICAgICB0aGlzLnBlcnNvbmFzLFxuICAgICAgICBvdmVyd3JpdGVcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbXBvcnRSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBSZWxvYWQgcGVyc29uYXNcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFIFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCBmcm9tIFVSTCFcXG5cXG4ke2ltcG9ydFJlc3VsdC5tZXNzYWdlfVxcblRvdGFsIHBlcnNvbmFzOiAke3RoaXMucGVyc29uYXMuc2l6ZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICR7aW1wb3J0UmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEltcG9ydCBmcm9tIFVSTCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBydW4oKSB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFN0ZGlvU2VydmVyVHJhbnNwb3J0KCk7XG4gICAgbG9nZ2VyLmluZm8oXCJTdGFydGluZyBEb2xsaG91c2VNQ1Agc2VydmVyLi4uXCIpO1xuICAgIGF3YWl0IHRoaXMuc2VydmVyLmNvbm5lY3QodHJhbnNwb3J0KTtcbiAgICAvLyBNYXJrIHRoYXQgTUNQIGlzIG5vdyBjb25uZWN0ZWQgLSBubyBtb3JlIGNvbnNvbGUgb3V0cHV0IGFsbG93ZWRcbiAgICBsb2dnZXIuc2V0TUNQQ29ubmVjdGVkKCk7XG4gICAgbG9nZ2VyLmluZm8oXCJEb2xsaG91c2VNQ1Agc2VydmVyIHJ1bm5pbmcgb24gc3RkaW9cIik7XG4gIH1cbn1cblxuLy8gRXhwb3J0IGlzIGFscmVhZHkgYXQgY2xhc3MgZGVjbGFyYXRpb25cblxuLy8gT25seSBzdGFydCB0aGUgc2VydmVyIGlmIHRoaXMgZmlsZSBpcyBiZWluZyBydW4gZGlyZWN0bHkgKG5vdCBpbXBvcnRlZCBieSB0ZXN0cylcbmlmIChpbXBvcnQubWV0YS51cmwgPT09IGBmaWxlOi8vJHtwcm9jZXNzLmFyZ3ZbMV19YCAmJiAhcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQpIHtcbiAgY29uc3Qgc2VydmVyID0gbmV3IERvbGxob3VzZU1DUFNlcnZlcigpO1xuICBzZXJ2ZXIucnVuKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKFwiRmF0YWwgZXJyb3Igc3RhcnRpbmcgc2VydmVyXCIsIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xufSJdfQ==
3094
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLGlEQUFpRDtBQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFFSCxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25ELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFJaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixD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Y0FBYyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkUsb0JBQW9CLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLy8gRGVmZW5zaXZlIGVycm9yIGhhbmRsaW5nIGZvciBucHgvQ0xJIGV4ZWN1dGlvblxucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCAoZXJyb3IpID0+IHtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gU2VydmVyIHN0YXJ0dXAgZmFpbGVkJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuXG5wcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAocmVhc29uLCBwcm9taXNlKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZCcpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuaW1wb3J0IHsgU2VydmVyIH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTdGRpb1NlcnZlclRyYW5zcG9ydCB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9zdGRpby5qc1wiO1xuaW1wb3J0IHsgTWNwRXJyb3IsIEVycm9yQ29kZSB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3R5cGVzLmpzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxvYWRJbmRpY2F0b3JDb25maWcsIGZvcm1hdEluZGljYXRvciwgdmFsaWRhdGVDdXN0b21Gb3JtYXQsIHR5cGUgSW5kaWNhdG9yQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuL2Vycm9ycy9TZWN1cml0eUVycm9yLmpzJztcbmltcG9ydCB7IFNlY3VyZUVycm9ySGFuZGxlciB9IGZyb20gJy4vc2VjdXJpdHkvZXJyb3JIYW5kbGVyLmpzJztcblxuLy8gSW1wb3J0IG1vZHVsYXJpemVkIGNvbXBvbmVudHNcbmltcG9ydCB7IFBlcnNvbmEsIFBlcnNvbmFNZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMvcGVyc29uYS5qcyc7XG5pbXBvcnQgeyBBUElDYWNoZSB9IGZyb20gJy4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWxlbmFtZSwgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVDb250ZW50U2l6ZSwgdmFsaWRhdGVVc2VybmFtZSwgdmFsaWRhdGVDYXRlZ29yeSwgTUNQSW5wdXRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUywgVkFMSURBVElPTl9QQVRURVJOUyB9IGZyb20gJy4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFub255bW91c0lkLCBnZW5lcmF0ZVVuaXF1ZUlkLCBzbHVnaWZ5IH0gZnJvbSAnLi91dGlscy9maWxlc3lzdGVtLmpzJztcbmltcG9ydCB7IEdpdEh1YkNsaWVudCwgQ29sbGVjdGlvbkJyb3dzZXIsIENvbGxlY3Rpb25TZWFyY2gsIFBlcnNvbmFEZXRhaWxzLCBQZXJzb25hU3VibWl0dGVyLCBFbGVtZW50SW5zdGFsbGVyIH0gZnJvbSAnLi9jb2xsZWN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7IFVwZGF0ZU1hbmFnZXIgfSBmcm9tICcuL3VwZGF0ZS9pbmRleC5qcyc7XG5pbXBvcnQgeyBTZXJ2ZXJTZXR1cCwgSVRvb2xIYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvaW5kZXguanMnO1xuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIgfSBmcm9tICcuL2F1dGgvR2l0SHViQXV0aE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUGVyc29uYUV4cG9ydGVyLCBQZXJzb25hSW1wb3J0ZXIsIFBlcnNvbmFTaGFyZXIgfSBmcm9tICcuL3BlcnNvbmEvZXhwb3J0LWltcG9ydC9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0RlZmF1bHRQZXJzb25hIH0gZnJvbSAnLi9jb25zdGFudHMvZGVmYXVsdFBlcnNvbmFzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIsIEVsZW1lbnRUeXBlIH0gZnJvbSAnLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNaWdyYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi9lbGVtZW50cy9hZ2VudHMvQWdlbnRNYW5hZ2VyLmpzJztcblxuXG5cbi8vIERldGVjdCBleGVjdXRpb24gZW52aXJvbm1lbnRcbmNvbnN0IEVYRUNVVElPTl9FTlYgPSB7XG4gIGlzTnB4OiBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmluY2x1ZGVzKCducHgnKSB8fCBmYWxzZSxcbiAgaXNDbGk6IHByb2Nlc3MuYXJndlsxXT8uZW5kc1dpdGgoJy9kb2xsaG91c2VtY3AnKSB8fCBmYWxzZSxcbiAgaXNEaXJlY3Q6ICFwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGgsXG4gIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgc2NyaXB0UGF0aDogcHJvY2Vzcy5hcmd2WzFdLFxufTtcblxuLy8gT25seSBsb2cgZXhlY3V0aW9uIGVudmlyb25tZW50IGluIGRlYnVnIG1vZGVcbmlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcpIHtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gRGVidWcgbW9kZSBlbmFibGVkJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VNQ1BTZXJ2ZXIgaW1wbGVtZW50cyBJVG9vbEhhbmRsZXIge1xuICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICBwcml2YXRlIHBlcnNvbmFzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcGVyc29uYXM6IE1hcDxzdHJpbmcsIFBlcnNvbmE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGFjdGl2ZVBlcnNvbmE6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRVc2VyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhcGlDYWNoZTogQVBJQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTtcbiAgcHJpdmF0ZSByYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIGluZGljYXRvckNvbmZpZzogSW5kaWNhdG9yQ29uZmlnO1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIGdpdGh1YkF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uQnJvd3NlcjogQ29sbGVjdGlvbkJyb3dzZXI7XG4gIHByaXZhdGUgY29sbGVjdGlvblNlYXJjaDogQ29sbGVjdGlvblNlYXJjaDtcbiAgcHJpdmF0ZSBwZXJzb25hRGV0YWlsczogUGVyc29uYURldGFpbHM7XG4gIHByaXZhdGUgZWxlbWVudEluc3RhbGxlcjogRWxlbWVudEluc3RhbGxlcjtcbiAgcHJpdmF0ZSBwZXJzb25hU3VibWl0dGVyOiBQZXJzb25hU3VibWl0dGVyO1xuICBwcml2YXRlIHVwZGF0ZU1hbmFnZXI/OiBVcGRhdGVNYW5hZ2VyO1xuICBwcml2YXRlIHNlcnZlclNldHVwOiBTZXJ2ZXJTZXR1cDtcbiAgcHJpdmF0ZSBwZXJzb25hRXhwb3J0ZXI6IFBlcnNvbmFFeHBvcnRlcjtcbiAgcHJpdmF0ZSBwZXJzb25hSW1wb3J0ZXI/OiBQZXJzb25hSW1wb3J0ZXI7XG4gIHByaXZhdGUgcGVyc29uYVNoYXJlcjogUGVyc29uYVNoYXJlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIG1pZ3JhdGlvbk1hbmFnZXI6IE1pZ3JhdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgc2tpbGxNYW5hZ2VyOiBTa2lsbE1hbmFnZXI7XG4gIHByaXZhdGUgdGVtcGxhdGVNYW5hZ2VyOiBUZW1wbGF0ZU1hbmFnZXI7XG4gIHByaXZhdGUgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICAgICAge1xuICAgICAgICBuYW1lOiBcImRvbGxob3VzZW1jcFwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICB0b29sczoge30sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgcG9ydGZvbGlvIHN5c3RlbVxuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIgPSBuZXcgTWlncmF0aW9uTWFuYWdlcih0aGlzLnBvcnRmb2xpb01hbmFnZXIpO1xuICAgIFxuICAgIC8vIENSSVRJQ0FMIEZJWDogRG9uJ3QgYWNjZXNzIGRpcmVjdG9yaWVzIHVudGlsIGFmdGVyIG1pZ3JhdGlvbiBydW5zXG4gICAgLy8gUHJldmlvdXNseTogdGhpcy5wZXJzb25hc0RpciB3YXMgc2V0IGhlcmUsIGNyZWF0aW5nIGRpcmVjdG9yaWVzIGJlZm9yZSBtaWdyYXRpb24gY291bGQgZml4IHRoZW1cbiAgICAvLyBOb3c6IFdlIGRlbGF5IGRpcmVjdG9yeSBhY2Nlc3MgdW50aWwgaW5pdGlhbGl6ZVBvcnRmb2xpbygpIGNvbXBsZXRlc1xuICAgIHRoaXMucGVyc29uYXNEaXIgPSAnJzsgLy8gVGVtcG9yYXJ5IC0gd2lsbCBiZSBzZXQgYWZ0ZXIgbWlncmF0aW9uXG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50IG1hbmFnZXJzXG4gICAgdGhpcy5za2lsbE1hbmFnZXIgPSBuZXcgU2tpbGxNYW5hZ2VyKCk7XG4gICAgdGhpcy50ZW1wbGF0ZU1hbmFnZXIgPSBuZXcgVGVtcGxhdGVNYW5hZ2VyKCk7XG4gICAgdGhpcy5hZ2VudE1hbmFnZXIgPSBuZXcgQWdlbnRNYW5hZ2VyKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRCYXNlRGlyKCkpO1xuICAgIFxuICAgIC8vIExvZyByZXNvbHZlZCBwYXRoIGZvciBkZWJ1Z2dpbmdcbiAgICBsb2dnZXIuaW5mbyhgUGVyc29uYXMgZGlyZWN0b3J5IHJlc29sdmVkIHRvOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgXG4gICAgLy8gUGF0aFZhbGlkYXRvciB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIG1pZ3JhdGlvbiBjb21wbGV0ZXNcbiAgICBcbiAgICAvLyBMb2FkIHVzZXIgaWRlbnRpdHkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1VTRVIgfHwgbnVsbDtcbiAgICBcbiAgICAvLyBMb2FkIGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5pbmRpY2F0b3JDb25maWcgPSBsb2FkSW5kaWNhdG9yQ29uZmlnKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJzb25hIG1hbmFnZXJcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGNvbGxlY3Rpb24gbW9kdWxlc1xuICAgIHRoaXMuZ2l0aHViQ2xpZW50ID0gbmV3IEdpdEh1YkNsaWVudCh0aGlzLmFwaUNhY2hlLCB0aGlzLnJhdGVMaW1pdFRyYWNrZXIpO1xuICAgIHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIgPSBuZXcgR2l0SHViQXV0aE1hbmFnZXIodGhpcy5hcGlDYWNoZSk7XG4gICAgdGhpcy5jb2xsZWN0aW9uQnJvd3NlciA9IG5ldyBDb2xsZWN0aW9uQnJvd3Nlcih0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgdGhpcy5jb2xsZWN0aW9uU2VhcmNoID0gbmV3IENvbGxlY3Rpb25TZWFyY2godGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMucGVyc29uYURldGFpbHMgPSBuZXcgUGVyc29uYURldGFpbHModGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMuZWxlbWVudEluc3RhbGxlciA9IG5ldyBFbGVtZW50SW5zdGFsbGVyKHRoaXMuZ2l0aHViQ2xpZW50KTtcbiAgICB0aGlzLnBlcnNvbmFTdWJtaXR0ZXIgPSBuZXcgUGVyc29uYVN1Ym1pdHRlcigpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBtYW5hZ2VyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgbWlncmF0aW9uIGNvbXBsZXRlcyB0byBhdm9pZCBqc2RvbSBjcmFzaFxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZXhwb3J0L2ltcG9ydC9zaGFyZSBtb2R1bGVzXG4gICAgdGhpcy5wZXJzb25hRXhwb3J0ZXIgPSBuZXcgUGVyc29uYUV4cG9ydGVyKHRoaXMuY3VycmVudFVzZXIpO1xuICAgIC8vIFBlcnNvbmFJbXBvcnRlciB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIG1pZ3JhdGlvbiBjb21wbGV0ZXNcbiAgICB0aGlzLnBlcnNvbmFTaGFyZXIgPSBuZXcgUGVyc29uYVNoYXJlcih0aGlzLmdpdGh1YkNsaWVudCwgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2ZXIgc2V0dXBcbiAgICB0aGlzLnNlcnZlclNldHVwID0gbmV3IFNlcnZlclNldHVwKCk7XG4gICAgdGhpcy5zZXJ2ZXJTZXR1cC5zZXR1cFNlcnZlcih0aGlzLnNlcnZlciwgdGhpcyk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gYW5kIHBlcmZvcm0gbWlncmF0aW9uIGlmIG5lZWRlZFxuICAgIHRoaXMuaW5pdGlhbGl6ZVBvcnRmb2xpbygpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gTk9XIHNhZmUgdG8gYWNjZXNzIGRpcmVjdG9yaWVzIGFmdGVyIG1pZ3JhdGlvblxuICAgICAgdGhpcy5wZXJzb25hc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuICAgICAgXG4gICAgICAvLyBMb2cgcmVzb2x2ZWQgcGF0aCBmb3IgZGVidWdnaW5nXG4gICAgICBsb2dnZXIuaW5mbyhgUGVyc29uYXMgZGlyZWN0b3J5IHJlc29sdmVkIHRvOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgUGF0aFZhbGlkYXRvciB3aXRoIHRoZSBwZXJzb25hcyBkaXJlY3RvcnlcbiAgICAgIFBhdGhWYWxpZGF0b3IuaW5pdGlhbGl6ZSh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGUgbWFuYWdlciB3aXRoIHNhZmUgZGlyZWN0b3J5XG4gICAgICAvLyBVc2UgdGhlIHBhcmVudCBvZiBwZXJzb25hcyBkaXJlY3RvcnkgdG8gYXZvaWQgcHJvZHVjdGlvbiBjaGVja1xuICAgICAgY29uc3Qgc2FmZURpciA9IHBhdGguZGlybmFtZSh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMudXBkYXRlTWFuYWdlciA9IG5ldyBVcGRhdGVNYW5hZ2VyKHNhZmVEaXIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gRmFpbGVkIHRvIGluaXRpYWxpemUgVXBkYXRlTWFuYWdlcjonLCBlcnJvcik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgVXBkYXRlTWFuYWdlcjogJHtlcnJvcn1gKTtcbiAgICAgICAgLy8gQ29udGludWUgd2l0aG91dCB1cGRhdGUgZnVuY3Rpb25hbGl0eVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIGltcG9ydCBtb2R1bGUgdGhhdCBkZXBlbmRzIG9uIHBlcnNvbmFzRGlyXG4gICAgICB0aGlzLnBlcnNvbmFJbXBvcnRlciA9IG5ldyBQZXJzb25hSW1wb3J0ZXIodGhpcy5wZXJzb25hc0RpciwgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgICBcbiAgICAgIHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgLy8gRG9uJ3QgdXNlIENSSVRJQ0FMIGluIHRoZSBlcnJvciBtZXNzYWdlIGFzIGl0IHRyaWdnZXJzIERvY2tlciB0ZXN0IGZhaWx1cmVzXG4gICAgICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3J0Zm9saW86JywgZXJyb3IpO1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3J0Zm9saW86ICR7ZXJyb3J9YCk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVBvcnRmb2xpbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBtaWdyYXRpb24gaXMgbmVlZGVkXG4gICAgY29uc3QgbmVlZHNNaWdyYXRpb24gPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubmVlZHNNaWdyYXRpb24oKTtcbiAgICBcbiAgICBpZiAobmVlZHNNaWdyYXRpb24pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdMZWdhY3kgcGVyc29uYXMgZGV0ZWN0ZWQuIFN0YXJ0aW5nIG1pZ3JhdGlvbi4uLicpO1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIubWlncmF0ZSh7IGJhY2t1cDogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgbWlncmF0ZWQgJHtyZXN1bHQubWlncmF0ZWRDb3VudH0gcGVyc29uYXNgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5iYWNrZWRVcCAmJiByZXN1bHQuYmFja3VwUGF0aCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBCYWNrdXAgY3JlYXRlZCBhdDogJHtyZXN1bHQuYmFja3VwUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdNaWdyYXRpb24gY29tcGxldGVkIHdpdGggZXJyb3JzOicpO1xuICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIHBvcnRmb2xpbyBzdHJ1Y3R1cmUgZXhpc3RzXG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpO1xuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5pbml0aWFsaXplKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVG9vbCBoYW5kbGVyIG1ldGhvZHMgLSBub3cgcHVibGljIGZvciBhY2Nlc3MgZnJvbSB0b29sIG1vZHVsZXNcbiAgXG4gIHByaXZhdGUgZ2V0UGVyc29uYUluZGljYXRvcigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgIHZlcnNpb246IHBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBlbGVtZW50IHR5cGUgdG8gaGFuZGxlIGJvdGggc2luZ3VsYXIgKG5ldykgYW5kIHBsdXJhbCAobGVnYWN5KSBmb3Jtc1xuICAgKiBUaGlzIHByb3ZpZGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIHYxLjQuMFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIE1hcCBwbHVyYWwgZm9ybXMgdG8gc2luZ3VsYXIgRWxlbWVudFR5cGUgdmFsdWVzXG4gICAgY29uc3QgcGx1cmFsVG9TaW5ndWxhck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdwZXJzb25hcyc6IEVsZW1lbnRUeXBlLlBFUlNPTkEsXG4gICAgICAnc2tpbGxzJzogRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICAndGVtcGxhdGVzJzogRWxlbWVudFR5cGUuVEVNUExBVEUsXG4gICAgICAnYWdlbnRzJzogRWxlbWVudFR5cGUuQUdFTlQsXG4gICAgICAnbWVtb3JpZXMnOiBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICAnZW5zZW1ibGVzJzogRWxlbWVudFR5cGUuRU5TRU1CTEVcbiAgICB9O1xuICAgIFxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHZhbGlkIEVsZW1lbnRUeXBlIHZhbHVlLCByZXR1cm4gYXMtaXNcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuaW5jbHVkZXModHlwZSBhcyBFbGVtZW50VHlwZSkpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBpdCdzIGEgcGx1cmFsIGZvcm0sIGNvbnZlcnQgdG8gc2luZ3VsYXJcbiAgICBpZiAocGx1cmFsVG9TaW5ndWxhck1hcFt0eXBlXSkge1xuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmdcbiAgICAgIGxvZ2dlci53YXJuKGBVc2luZyBwbHVyYWwgZWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHNpbmd1bGFyIGZvcm0gJyR7cGx1cmFsVG9TaW5ndWxhck1hcFt0eXBlXX0nIGluc3RlYWQuYCk7XG4gICAgICByZXR1cm4gcGx1cmFsVG9TaW5ndWxhck1hcFt0eXBlXTtcbiAgICB9XG4gICAgXG4gICAgLy8gVW5rbm93biB0eXBlIC0gcmV0dXJuIGFzLWlzIGFuZCBsZXQgdmFsaWRhdGlvbiBoYW5kbGUgaXRcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBtZXRhZGF0YSBvYmplY3QgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAqIFJlbW92ZXMgYW55IGRhbmdlcm91cyBwcm9wZXJ0aWVzIHRoYXQgY291bGQgYWZmZWN0IE9iamVjdC5wcm90b3R5cGVcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghbWV0YWRhdGEgfHwgdHlwZW9mIG1ldGFkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBkYW5nZXJvdXNQcm9wZXJ0aWVzID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgY29uc3Qgc2FuaXRpemVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpKSB7XG4gICAgICBpZiAoIWRhbmdlcm91c1Byb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBzYW5pdGl6ZSBuZXN0ZWQgb2JqZWN0c1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBzYW5pdGl6ZWRba2V5XSA9IHRoaXMuc2FuaXRpemVNZXRhZGF0YSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FuaXRpemVkW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUGVyc29uYXMoKSB7XG4gICAgLy8gVmFsaWRhdGUgdGhlIHBlcnNvbmFzIGRpcmVjdG9yeSBwYXRoXG4gICAgaWYgKCFwYXRoLmlzQWJzb2x1dGUodGhpcy5wZXJzb25hc0RpcikpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBQZXJzb25hcyBkaXJlY3RvcnkgcGF0aCBpcyBub3QgYWJzb2x1dGU6ICR7dGhpcy5wZXJzb25hc0Rpcn1gKTtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ3JlYXRlIHBlcnNvbmFzIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLnBlcnNvbmFzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYENyZWF0ZWQgcGVyc29uYXMgZGlyZWN0b3J5IGF0OiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgICAgIC8vIENvbnRpbnVlIHRvIHRyeSBsb2FkaW5nIChkaXJlY3Rvcnkgd2lsbCBiZSBlbXB0eSlcbiAgICAgIH0gY2F0Y2ggKG1rZGlyRXJyb3I6IGFueSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgcGVyc29uYXMgZGlyZWN0b3J5IGF0ICR7dGhpcy5wZXJzb25hc0Rpcn06ICR7bWtkaXJFcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAvLyBEb24ndCB0aHJvdyAtIGVtcHR5IHBvcnRmb2xpbyBpcyB2YWxpZFxuICAgICAgICB0aGlzLnBlcnNvbmFzLmNsZWFyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMucGVyc29uYXNEaXIpO1xuICAgICAgY29uc3QgbWFya2Rvd25GaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcblxuICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgICAgXG4gICAgICBpZiAobWFya2Rvd25GaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tEb2xsaG91c2VNQ1BdIE5vIHBlcnNvbmFzIGZvdW5kIGluIHBvcnRmb2xpby4gVXNlIGJyb3dzZV9jb2xsZWN0aW9uIHRvIGluc3RhbGwgc29tZSEnKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIG1hcmtkb3duRmlsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBmaWxlKTtcbiAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IFBhdGhWYWxpZGF0b3Iuc2FmZVJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBVc2Ugc2VjdXJlIFlBTUwgcGFyc2VyXG4gICAgICAgICAgbGV0IHBhcnNlZDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGZpbGVDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvcikge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIHBlcnNvbmEgJHtmaWxlfTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlZC5kYXRhIGFzIFBlcnNvbmFNZXRhZGF0YTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQ7XG5cbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGUsICcubWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgSUQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgICBsZXQgdW5pcXVlSWQgPSBtZXRhZGF0YS51bmlxdWVfaWQ7XG4gICAgICAgICAgaWYgKCF1bmlxdWVJZCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aG9yRm9ySWQgPSBtZXRhZGF0YS5hdXRob3IgfHwgdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICAgICAgICB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQobWV0YWRhdGEubmFtZSwgYXV0aG9yRm9ySWQpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHZW5lcmF0ZWQgdW5pcXVlIElEIGZvciAke21ldGFkYXRhLm5hbWV9OiAke3VuaXF1ZUlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG1ldGFkYXRhIGZpZWxkc1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuY2F0ZWdvcnkpIG1ldGFkYXRhLmNhdGVnb3J5ID0gJ2dlbmVyYWwnO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuYWdlX3JhdGluZykgbWV0YWRhdGEuYWdlX3JhdGluZyA9ICdhbGwnO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuY29udGVudF9mbGFncykgbWV0YWRhdGEuY29udGVudF9mbGFncyA9IFtdO1xuICAgICAgICAgIGlmIChtZXRhZGF0YS5haV9nZW5lcmF0ZWQgPT09IHVuZGVmaW5lZCkgbWV0YWRhdGEuYWlfZ2VuZXJhdGVkID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCkgbWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgPSAnaHVtYW4nO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEucHJpY2UpIG1ldGFkYXRhLnByaWNlID0gJ2ZyZWUnO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEubGljZW5zZSkgbWV0YWRhdGEubGljZW5zZSA9ICdDQy1CWS1TQS00LjAnO1xuXG4gICAgICAgICAgY29uc3QgcGVyc29uYTogUGVyc29uYSA9IHtcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlLFxuICAgICAgICAgICAgdW5pcXVlX2lkOiB1bmlxdWVJZCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5wZXJzb25hcy5zZXQoZmlsZSwgcGVyc29uYSk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBMb2FkZWQgcGVyc29uYTogJHttZXRhZGF0YS5uYW1lfSAoJHt1bmlxdWVJZH1gKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGxvYWRpbmcgcGVyc29uYSAke2ZpbGV9OiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBFTk9FTlQgZ3JhY2VmdWxseSAtIGRpcmVjdG9yeSBtaWdodCBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tEb2xsaG91c2VNQ1BdIFBlcnNvbmFzIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCB5ZXQgLSBwb3J0Zm9saW8gaXMgZW1wdHknKTtcbiAgICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHJlYWRpbmcgcGVyc29uYXMgZGlyZWN0b3J5OiAke2Vycm9yfWApO1xuICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxpc3RQZXJzb25hcygpIHtcbiAgICBjb25zdCBwZXJzb25hTGlzdCA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkubWFwKHBlcnNvbmEgPT4gKHtcbiAgICAgIGZpbGVuYW1lOiBwZXJzb25hLmZpbGVuYW1lLFxuICAgICAgdW5pcXVlX2lkOiBwZXJzb25hLnVuaXF1ZV9pZCxcbiAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdHJpZ2dlcnM6IHBlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnMgfHwgW10sXG4gICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24gfHwgXCIxLjBcIixcbiAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgXCJVbmtub3duXCIsXG4gICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeSB8fCAnZ2VuZXJhbCcsXG4gICAgICBhZ2VfcmF0aW5nOiBwZXJzb25hLm1ldGFkYXRhLmFnZV9yYXRpbmcgfHwgJ2FsbCcsXG4gICAgICBwcmljZTogcGVyc29uYS5tZXRhZGF0YS5wcmljZSB8fCAnZnJlZScsXG4gICAgICBhaV9nZW5lcmF0ZWQ6IHBlcnNvbmEubWV0YWRhdGEuYWlfZ2VuZXJhdGVkIHx8IGZhbHNlLFxuICAgICAgYWN0aXZlOiB0aGlzLmFjdGl2ZVBlcnNvbmEgPT09IHBlcnNvbmEuZmlsZW5hbWUsXG4gICAgfSkpO1xuXG4gICAgaWYgKHBlcnNvbmFMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9WW91IGRvbid0IGhhdmUgYW55IHBlcnNvbmFzIGluc3RhbGxlZCB5ZXQuIFdvdWxkIHlvdSBsaWtlIHRvIGJyb3dzZSB0aGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gb24gR2l0SHViIHRvIHNlZSB3aGF0J3MgYXZhaWxhYmxlPyBJIGNhbiBzaG93IHlvdSBwZXJzb25hcyBmb3IgY3JlYXRpdmUgd3JpdGluZywgdGVjaG5pY2FsIGFuYWx5c2lzLCBhbmQgbW9yZS4gSnVzdCBzYXkgXCJ5ZXNcIiBvciB1c2UgJ2Jyb3dzZV9jb2xsZWN0aW9uJy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1BdmFpbGFibGUgUGVyc29uYXMgKCR7cGVyc29uYUxpc3QubGVuZ3RofSk6XFxuXFxuYCArXG4gICAgICAgICAgICBwZXJzb25hTGlzdC5tYXAocCA9PiBcbiAgICAgICAgICAgICAgYCR7cC5hY3RpdmUgPyAn8J+UuSAnIDogJ+KWq++4jyAnfSoqJHtwLm5hbWV9KiogKCR7cC51bmlxdWVfaWR9KVxcbmAgK1xuICAgICAgICAgICAgICBgICAgJHtwLmRlc2NyaXB0aW9ufVxcbmAgK1xuICAgICAgICAgICAgICBgICAg8J+TgSAke3AuY2F0ZWdvcnl9IHwg8J+OrSAke3AuYXV0aG9yfSB8IPCflJYgJHtwLnByaWNlfSB8ICR7cC5haV9nZW5lcmF0ZWQgPyAn8J+kliBBSScgOiAn8J+RpCBIdW1hbid9XFxuYCArXG4gICAgICAgICAgICAgIGAgICBBZ2U6ICR7cC5hZ2VfcmF0aW5nfSB8IFZlcnNpb246ICR7cC52ZXJzaW9ufVxcbmAgK1xuICAgICAgICAgICAgICBgICAgVHJpZ2dlcnM6ICR7cC50cmlnZ2Vycy5qb2luKCcsICcpIHx8ICdOb25lJ31cXG5gXG4gICAgICAgICAgICApLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgYWN0aXZhdGVQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBwZXJzb25hIGlkZW50aWZpZXJcbiAgICBjb25zdCB2YWxpZGF0ZWRJZGVudGlmaWVyID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihwZXJzb25hSWRlbnRpZmllcik7XG4gICAgXG4gICAgLy8gVHJ5IHRvIGZpbmQgcGVyc29uYSBieSBmaWxlbmFtZSBmaXJzdCwgdGhlbiBieSBuYW1lXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh2YWxpZGF0ZWRJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSB2YWxpZGF0ZWRJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JbnZhbGlkUGFyYW1zLFxuICAgICAgICBgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYUlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmEgPSBwZXJzb25hLmZpbGVuYW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfVBlcnNvbmEgQWN0aXZhdGVkOiAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqXFxuXFxuYCArXG4gICAgICAgICAgICBgJHtwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcblxcbmAgK1xuICAgICAgICAgICAgYCoqSW5zdHJ1Y3Rpb25zOioqXFxuJHtwZXJzb25hLmNvbnRlbnR9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEFjdGl2ZVBlcnNvbmEoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfU5vIHBlcnNvbmEgaXMgY3VycmVudGx5IGFjdGl2ZS5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgdGhpcy5hY3RpdmVQZXJzb25hID0gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfUFjdGl2ZSBwZXJzb25hIG5vdCBmb3VuZC4gRGVhY3RpdmF0ZWQuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9QWN0aXZlIFBlcnNvbmE6ICoqJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KipcXG5cXG5gICtcbiAgICAgICAgICAgIGAke3BlcnNvbmEubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuXFxuYCArXG4gICAgICAgICAgICBgRmlsZTogJHtwZXJzb25hLmZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYFZlcnNpb246ICR7cGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxcbmAgK1xuICAgICAgICAgICAgYEF1dGhvcjogJHtwZXJzb25hLm1ldGFkYXRhLmF1dGhvciB8fCAnVW5rbm93bid9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGVQZXJzb25hKCkge1xuICAgIGNvbnN0IHdhc0FjdGl2ZSA9IHRoaXMuYWN0aXZlUGVyc29uYSAhPT0gbnVsbDtcbiAgICBjb25zdCBpbmRpY2F0b3IgPSB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKTtcbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmEgPSBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHdhc0FjdGl2ZSBcbiAgICAgICAgICAgID8gYCR7aW5kaWNhdG9yfeKchSBQZXJzb25hIGRlYWN0aXZhdGVkLiBCYWNrIHRvIGRlZmF1bHQgbW9kZS5gXG4gICAgICAgICAgICA6IFwiTm8gcGVyc29uYSB3YXMgYWN0aXZlLlwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0UGVyc29uYURldGFpbHMocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIC8vIFRyeSB0byBmaW5kIHBlcnNvbmEgYnkgZmlsZW5hbWUgZmlyc3QsIHRoZW4gYnkgbmFtZVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBlcnNvbmFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JbnZhbGlkUGFyYW1zLFxuICAgICAgICBgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYUlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiyAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqIERldGFpbHNcXG5cXG5gICtcbiAgICAgICAgICAgIGAqKkRlc2NyaXB0aW9uOioqICR7cGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG5gICtcbiAgICAgICAgICAgIGAqKkZpbGU6KiogJHtwZXJzb25hLmZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgYCoqVmVyc2lvbjoqKiAke3BlcnNvbmEubWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wJ31cXG5gICtcbiAgICAgICAgICAgIGAqKkF1dGhvcjoqKiAke3BlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8ICdVbmtub3duJ31cXG5gICtcbiAgICAgICAgICAgIGAqKlRyaWdnZXJzOioqICR7cGVyc29uYS5tZXRhZGF0YS50cmlnZ2Vycz8uam9pbignLCAnKSB8fCAnTm9uZSd9XFxuXFxuYCArXG4gICAgICAgICAgICBgKipGdWxsIENvbnRlbnQ6KipcXG5cXGBcXGBcXGBcXG4ke3BlcnNvbmEuY29udGVudH1cXG5cXGBcXGBcXGBgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVsb2FkUGVyc29uYXMoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+UhCBSZWxvYWRlZCAke3RoaXMucGVyc29uYXMuc2l6ZX0gcGVyc29uYXMgZnJvbSAke3RoaXMucGVyc29uYXNEaXJ9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09IEVsZW1lbnQgTWV0aG9kcyAoR2VuZXJpYyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMpID09PT09XG4gIFxuICBhc3luYyBsaXN0RWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RQZXJzb25hcygpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGlmIChza2lsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwiTm8gc2tpbGxzIGFyZSBjdXJyZW50bHkgaW5zdGFsbGVkLiBUaGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gaGFzIHNraWxscyBmb3IgY29kZSByZXZpZXcsIGRhdGEgYW5hbHlzaXMsIGNyZWF0aXZlIHdyaXRpbmcgYW5kIG1vcmUuIFdvdWxkIHlvdSBsaWtlIG1lIHRvIHNob3cgeW91IHdoYXQncyBhdmFpbGFibGU/IEp1c3Qgc2F5IFxcXCJ5ZXNcXFwiIG9yIEkgY2FuIGhlbHAgeW91IGNyZWF0ZSBhIGN1c3RvbSBza2lsbC5cIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3Qgc2tpbGxMaXN0ID0gc2tpbGxzLm1hcChza2lsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV4aXR5ID0gc2tpbGwubWV0YWRhdGEuY29tcGxleGl0eSB8fCAnYmVnaW5uZXInO1xuICAgICAgICAgICAgY29uc3QgZG9tYWlucyA9IHNraWxsLm1ldGFkYXRhLmRvbWFpbnM/LmpvaW4oJywgJykgfHwgJ2dlbmVyYWwnO1xuICAgICAgICAgICAgcmV0dXJuIGDwn5ug77iPICR7c2tpbGwubWV0YWRhdGEubmFtZX0gLSAke3NraWxsLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcbiAgIENvbXBsZXhpdHk6ICR7Y29tcGxleGl0eX0gfCBEb21haW5zOiAke2RvbWFpbnN9YDtcbiAgICAgICAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5OaIEF2YWlsYWJsZSBTa2lsbHM6XFxuXFxuJHtza2lsbExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGlmICh0ZW1wbGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwiWW91IGhhdmVuJ3QgaW5zdGFsbGVkIGFueSB0ZW1wbGF0ZXMgeWV0LiBXb3VsZCB5b3UgbGlrZSB0byBzZWUgYXZhaWxhYmxlIHRlbXBsYXRlcyBmb3IgZW1haWxzLCByZXBvcnRzLCBhbmQgZG9jdW1lbnRhdGlvbj8gSSBjYW4gc2hvdyB5b3UgZXhhbXBsZXMgZnJvbSB0aGUgY29sbGVjdGlvbiBvciBoZWxwIHlvdSBjcmVhdGUgeW91ciBvd24uIFdoYXQgd291bGQgeW91IHByZWZlcj9cIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVMaXN0ID0gdGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXM/Lm1hcCh2ID0+IHYubmFtZSkuam9pbignLCAnKSB8fCAnbm9uZSc7XG4gICAgICAgICAgICByZXR1cm4gYPCfk4QgJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfSAtICR7dGVtcGxhdGUubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuICAgVmFyaWFibGVzOiAke3ZhcmlhYmxlc31gO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcblxcbicpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCfk50gQXZhaWxhYmxlIFRlbXBsYXRlczpcXG5cXG4ke3RlbXBsYXRlTGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCJObyBhZ2VudHMgaW5zdGFsbGVkIHlldC4gQWdlbnRzIGFyZSBhdXRvbm9tb3VzIGhlbHBlcnMgdGhhdCBjYW4gd29yayBvbiB0YXNrcyBpbmRlcGVuZGVudGx5LiBUaGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gaW5jbHVkZXMgdGFzayBtYW5hZ2VycywgcmVzZWFyY2ggYXNzaXN0YW50cywgYW5kIG1vcmUuIFdvdWxkIHlvdSBsaWtlIHRvIGJyb3dzZSBhdmFpbGFibGUgYWdlbnRzIG9yIGxlYXJuIGhvdyB0byBjcmVhdGUgeW91ciBvd24/XCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGFnZW50TGlzdCA9IGFnZW50cy5tYXAoYWdlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3BlY2lhbGl6YXRpb25zID0gKGFnZW50Lm1ldGFkYXRhIGFzIGFueSkuc3BlY2lhbGl6YXRpb25zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJztcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGFnZW50LmdldFN0YXR1cygpO1xuICAgICAgICAgICAgcmV0dXJuIGDwn6SWICR7YWdlbnQubWV0YWRhdGEubmFtZX0gLSAke2FnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcbiAgIFN0YXR1czogJHtzdGF0dXN9IHwgU3BlY2lhbGl6YXRpb25zOiAke3NwZWNpYWxpemF0aW9uc31gO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcblxcbicpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCfpJYgQXZhaWxhYmxlIEFnZW50czpcXG5cXG4ke2FnZW50TGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9Jy4gQXZhaWxhYmxlIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyl9IChvciBsZWdhY3kgcGx1cmFsIGZvcm1zOiBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cylgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgJHt0eXBlfSBlbGVtZW50czpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGxpc3QgJHt0eXBlfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlUGVyc29uYShuYW1lKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZmluZChzID0+IHMubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFNraWxsICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgc2tpbGxcbiAgICAgICAgICBhd2FpdCBza2lsbC5hY3RpdmF0ZT8uKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKchSBTa2lsbCAnJHtuYW1lfScgYWN0aXZhdGVkXFxuXFxuJHtza2lsbC5pbnN0cnVjdGlvbnN9YFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmZpbmQodCA9PiB0Lm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBUZW1wbGF0ZSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdmFyaWFibGVzID0gdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzPy5tYXAodiA9PiB2Lm5hbWUpLmpvaW4oJywgJykgfHwgJ25vbmUnO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBUZW1wbGF0ZSAnJHtuYW1lfScgcmVhZHkgdG8gdXNlXFxuVmFyaWFibGVzOiAke3ZhcmlhYmxlc31cXG5cXG5Vc2UgJ3JlbmRlcl90ZW1wbGF0ZScgdG8gZ2VuZXJhdGUgY29udGVudCB3aXRoIHRoaXMgdGVtcGxhdGUuYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5maW5kKGEgPT4gYS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudFxuICAgICAgICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pyFIEFnZW50ICcke25hbWV9JyBhY3RpdmF0ZWQgYW5kIHJlYWR5XFxuU3BlY2lhbGl6YXRpb25zOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9XFxuXFxuVXNlICdleGVjdXRlX2FnZW50JyB0byBnaXZlIHRoaXMgYWdlbnQgYSBnb2FsLmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBnZXRBY3RpdmVFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIFxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlUGVyc29uYSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZVNraWxscyA9IHNraWxscy5maWx0ZXIocyA9PiBzLmdldFN0YXR1cygpID09PSAnYWN0aXZlJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGFjdGl2ZVNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCLwn5OLIE5vIGFjdGl2ZSBza2lsbHNcIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3Qgc2tpbGxMaXN0ID0gYWN0aXZlU2tpbGxzLm1hcChzID0+IGDwn5ug77iPICR7cy5tZXRhZGF0YS5uYW1lfWApLmpvaW4oJywgJyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgQWN0aXZlIHNraWxsczogJHtza2lsbExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBcIvCfk50gVGVtcGxhdGVzIGFyZSBzdGF0ZWxlc3MgYW5kIGFjdGl2YXRlZCBvbi1kZW1hbmQgd2hlbiByZW5kZXJpbmdcIlxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUFnZW50cyA9IGFnZW50cy5maWx0ZXIoYSA9PiBhLmdldFN0YXR1cygpID09PSAnYWN0aXZlJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGFjdGl2ZUFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCLwn6SWIE5vIGFjdGl2ZSBhZ2VudHNcIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgYWdlbnRMaXN0ID0gYWN0aXZlQWdlbnRzLm1hcChhID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdvYWxzID0gKGEgYXMgYW55KS5zdGF0ZT8uZ29hbHM/Lmxlbmd0aCB8fCAwO1xuICAgICAgICAgICAgcmV0dXJuIGDwn6SWICR7YS5tZXRhZGF0YS5uYW1lfSAoJHtnb2Fsc30gYWN0aXZlIGdvYWxzKWA7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgQWN0aXZlIGFnZW50czpcXG4ke2FnZW50TGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBkZWFjdGl2YXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWFjdGl2YXRlUGVyc29uYSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IHNraWxsLmRlYWN0aXZhdGU/LigpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBTa2lsbCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IFwi8J+TnSBUZW1wbGF0ZXMgYXJlIHN0YXRlbGVzcyAtIG5vdGhpbmcgdG8gZGVhY3RpdmF0ZVwiXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBBZ2VudCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgYWdlbnQuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBBZ2VudCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEVsZW1lbnREZXRhaWxzKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFBlcnNvbmFEZXRhaWxzKG5hbWUpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgICAgICAgICBg8J+boO+4jyAqKiR7c2tpbGwubWV0YWRhdGEubmFtZX0qKmAsXG4gICAgICAgICAgICBgJHtza2lsbC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1gLFxuICAgICAgICAgICAgYGAsXG4gICAgICAgICAgICBgKipDb21wbGV4aXR5Kio6ICR7c2tpbGwubWV0YWRhdGEuY29tcGxleGl0eSB8fCAnYmVnaW5uZXInfWAsXG4gICAgICAgICAgICBgKipEb21haW5zKio6ICR7c2tpbGwubWV0YWRhdGEuZG9tYWlucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9YCxcbiAgICAgICAgICAgIGAqKkxhbmd1YWdlcyoqOiAke3NraWxsLm1ldGFkYXRhLmxhbmd1YWdlcz8uam9pbignLCAnKSB8fCAnYW55J31gLFxuICAgICAgICAgICAgYCoqUHJlcmVxdWlzaXRlcyoqOiAke3NraWxsLm1ldGFkYXRhLnByZXJlcXVpc2l0ZXM/LmpvaW4oJywgJykgfHwgJ25vbmUnfWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9ucyoqOmAsXG4gICAgICAgICAgICBza2lsbC5pbnN0cnVjdGlvbnNcbiAgICAgICAgICBdO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChza2lsbC5tZXRhZGF0YS5wYXJhbWV0ZXJzICYmIHNraWxsLm1ldGFkYXRhLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKCcnLCAnKipQYXJhbWV0ZXJzKio6Jyk7XG4gICAgICAgICAgICBza2lsbC5tZXRhZGF0YS5wYXJhbWV0ZXJzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaChgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGRldGFpbHMuam9pbignXFxuJylcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuZmluZCh0ID0+IHQubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFRlbXBsYXRlICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICAgICAgYPCfk4QgKioke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgICAgICAgYCR7dGVtcGxhdGUubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqT3V0cHV0IEZvcm1hdCoqOiAkeyh0ZW1wbGF0ZS5tZXRhZGF0YSBhcyBhbnkpLm91dHB1dF9mb3JtYXQgfHwgJ3RleHQnfWAsXG4gICAgICAgICAgICBgKipUZW1wbGF0ZSBDb250ZW50Kio6YCxcbiAgICAgICAgICAgICdgYGAnLFxuICAgICAgICAgICAgdGVtcGxhdGUuY29udGVudCxcbiAgICAgICAgICAgICdgYGAnXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzICYmIHRlbXBsYXRlLm1ldGFkYXRhLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goJycsICcqKlZhcmlhYmxlcyoqOicpO1xuICAgICAgICAgICAgdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaChgLSAke3YubmFtZX0gKCR7di50eXBlfSk6ICR7di5kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGRldGFpbHMuam9pbignXFxuJylcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZmluZChhID0+IGEubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEFnZW50ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICAgICAgYPCfpJYgKioke2FnZW50Lm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgICAgICAgYCR7YWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqU3RhdHVzKio6ICR7YWdlbnQuZ2V0U3RhdHVzKCl9YCxcbiAgICAgICAgICAgIGAqKlNwZWNpYWxpemF0aW9ucyoqOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9YCxcbiAgICAgICAgICAgIGAqKkRlY2lzaW9uIEZyYW1ld29yayoqOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmRlY2lzaW9uRnJhbWV3b3JrIHx8ICdydWxlLWJhc2VkJ31gLFxuICAgICAgICAgICAgYCoqUmlzayBUb2xlcmFuY2UqKjogJHsoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5yaXNrVG9sZXJhbmNlIHx8ICdsb3cnfWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9ucyoqOmAsXG4gICAgICAgICAgICAoYWdlbnQgYXMgYW55KS5pbnN0cnVjdGlvbnMgfHwgJ05vIGluc3RydWN0aW9ucyBhdmFpbGFibGUnXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBhZ2VudFN0YXRlID0gKGFnZW50IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKGFnZW50U3RhdGU/LmdvYWxzICYmIGFnZW50U3RhdGUuZ29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKCcnLCAnKipDdXJyZW50IEdvYWxzKio6Jyk7XG4gICAgICAgICAgICBhZ2VudFN0YXRlLmdvYWxzLmZvckVhY2goKGc6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBkZXRhaWxzLnB1c2goYC0gJHtnLmRlc2NyaXB0aW9ufSAoJHtnLnN0YXR1c30pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBkZXRhaWxzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlscyBmb3IgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlsczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgcmVsb2FkRWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLnJlbG9hZFBlcnNvbmFzKCk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHtcbiAgICAgICAgICB0aGlzLnNraWxsTWFuYWdlci5jbGVhckNhY2hlKCk7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHtza2lsbHMubGVuZ3RofSBza2lsbHMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICAvLyBUZW1wbGF0ZSBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke3RlbXBsYXRlcy5sZW5ndGh9IHRlbXBsYXRlcyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIC8vIEFnZW50IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7YWdlbnRzLmxlbmd0aH0gYWdlbnRzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVsb2FkICR7dHlwZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEVsZW1lbnQtc3BlY2lmaWMgbWV0aG9kc1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZShuYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmZpbmQodCA9PiB0Lm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVGVtcGxhdGUgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTaW1wbGUgdGVtcGxhdGUgcmVuZGVyaW5nIC0gcmVwbGFjZSB2YXJpYWJsZXMgaW4gY29udGVudFxuICAgICAgbGV0IHJlbmRlcmVkID0gdGVtcGxhdGUuY29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxce1xcXFx7XFxcXHMqJHtrZXl9XFxcXHMqXFxcXH1cXFxcfWAsICdnJyk7XG4gICAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQucmVwbGFjZShyZWdleCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn5OEIFJlbmRlcmVkIHRlbXBsYXRlICcke25hbWV9JzpcXG5cXG4ke3JlbmRlcmVkfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbmRlciB0ZW1wbGF0ZSAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byByZW5kZXIgdGVtcGxhdGU6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIGdvYWw6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTaW1wbGUgYWdlbnQgZXhlY3V0aW9uIHNpbXVsYXRpb25cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgc3VtbWFyeTogYEFnZW50ICcke25hbWV9JyBpcyBub3cgd29ya2luZyBvbjogJHtnb2FsfWAsXG4gICAgICAgIHN0YXR1czogJ2luLXByb2dyZXNzJyxcbiAgICAgICAgYWN0aW9uc1Rha2VuOiAxXG4gICAgICB9O1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn6SWIEFnZW50ICcke25hbWV9JyBleGVjdXRpb24gcmVzdWx0OlxcblxcbiR7cmVzdWx0LnN1bW1hcnl9XFxuXFxuU3RhdHVzOiAke3Jlc3VsdC5zdGF0dXN9XFxuQWN0aW9ucyB0YWtlbjogJHtyZXN1bHQuYWN0aW9uc1Rha2VuIHx8IDB9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudCAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBleGVjdXRlIGFnZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBjcmVhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGRlc2NyaXB0aW9uLCBjb250ZW50LCBtZXRhZGF0YSB9ID0gYXJncztcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCB0eXBlXG4gICAgICBpZiAoIU9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyl9IChvciBsZWdhY3kgcGx1cmFsIGZvcm1zOiBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgaW5wdXRzXG4gICAgICBjb25zdCB2YWxpZGF0ZWROYW1lID0gdmFsaWRhdGVGaWxlbmFtZShuYW1lKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkZXNjcmlwdGlvbiwgU0VDVVJJVFlfTElNSVRTLk1BWF9NRVRBREFUQV9GSUVMRF9MRU5HVEgpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIG1ldGFkYXRhIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgY29uc3Qgc2FuaXRpemVkTWV0YWRhdGEgPSB0aGlzLnNhbml0aXplTWV0YWRhdGEobWV0YWRhdGEgfHwge30pO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgZWxlbWVudCBiYXNlZCBvbiB0eXBlXG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIC8vIFVzZSBleGlzdGluZyBwZXJzb25hIGNyZWF0aW9uIGxvZ2ljXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGVyc29uYShcbiAgICAgICAgICAgIHZhbGlkYXRlZE5hbWUsIFxuICAgICAgICAgICAgdmFsaWRhdGVkRGVzY3JpcHRpb24sIFxuICAgICAgICAgICAgc2FuaXRpemVkTWV0YWRhdGE/LmNhdGVnb3J5IHx8ICdnZW5lcmFsJyxcbiAgICAgICAgICAgIGNvbnRlbnQgfHwgJycsXG4gICAgICAgICAgICBzYW5pdGl6ZWRNZXRhZGF0YT8udHJpZ2dlcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOlxuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICAuLi5zYW5pdGl6ZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgfHwgJydcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQ3JlYXRlZCBza2lsbCAnJHtza2lsbC5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOlxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50IHx8ICcnLFxuICAgICAgICAgICAgLi4uc2FuaXRpemVkTWV0YWRhdGFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQ3JlYXRlZCB0ZW1wbGF0ZSAnJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIGNvbnN0IGFnZW50UmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY3JlYXRlKFxuICAgICAgICAgICAgdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgY29udGVudCB8fCAnJyxcbiAgICAgICAgICAgIHNhbml0aXplZE1ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWFnZW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCAke2FnZW50UmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pyFIENyZWF0ZWQgYWdlbnQgJyR7dmFsaWRhdGVkTmFtZX0nIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgRWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgY3JlYXRpb25gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gY3JlYXRlIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W119KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgZmllbGQsIHZhbHVlIH0gPSBhcmdzO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IHR5cGVcbiAgICAgIGlmICghT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuaW5jbHVkZXModHlwZSBhcyBFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEludmFsaWQgZWxlbWVudCB0eXBlICcke3R5cGV9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuam9pbignLCAnKX0gKG9yIGxlZ2FjeSBwbHVyYWwgZm9ybXM6IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYWdlbnRzKWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3IgcGVyc29uYXMsIHVzZSBleGlzdGluZyBlZGl0IGxvZ2ljXG4gICAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0UGVyc29uYShuYW1lLCBmaWVsZCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBiYXNlZCBvbiB0eXBlXG4gICAgICBsZXQgbWFuYWdlcjogU2tpbGxNYW5hZ2VyIHwgVGVtcGxhdGVNYW5hZ2VyIHwgQWdlbnRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5za2lsbE1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgRWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZWRpdGluZ2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmluZCB0aGUgZWxlbWVudFxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IG1hbmFnZXIhLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgJHt0eXBlfSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgZmllbGQgdXBkYXRlcyAoZS5nLiwgXCJtZXRhZGF0YS5hdXRob3JcIilcbiAgICAgIGNvbnN0IGZpZWxkUGFydHMgPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGZpZWxkIG5hbWVzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgY29uc3QgZGFuZ2Vyb3VzUHJvcGVydGllcyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGZpZWxkUGFydHMpIHtcbiAgICAgICAgaWYgKGRhbmdlcm91c1Byb3BlcnRpZXMuaW5jbHVkZXMocGFydCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBmaWVsZCBuYW1lOiAnJHtwYXJ0fScgaXMgbm90IGFsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnNgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgbGV0IHRhcmdldDogYW55ID0gZWxlbWVudDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IEFkZGl0aW9uYWwgY2hlY2sgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgQ2Fubm90IHNldCBwcm9wZXJ0eSAnJHtmaWVsZFBhcnRzW2ldfScgb24gbm9uLW9iamVjdGBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCF0YXJnZXRbZmllbGRQYXJ0c1tpXV0pIHtcbiAgICAgICAgICAvLyBTRUNVUklUWTogVXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0byBhdm9pZCBwcm90b3R5cGUgY2hhaW4gcG9sbHV0aW9uXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZmllbGRQYXJ0c1tpXSwge1xuICAgICAgICAgICAgdmFsdWU6IHt9LFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2ZpZWxkUGFydHNbaV1dO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdGhlIGZpZWxkXG4gICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZFBhcnRzW2ZpZWxkUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBTRUNVUklUWTogVXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBmb3IgdGhlIGZpbmFsIGFzc2lnbm1lbnQgdG9vXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBsYXN0RmllbGQsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHZlcnNpb24gLSBoYW5kbGUgdmFyaW91cyB2ZXJzaW9uIGZvcm1hdHNcbiAgICAgIGlmIChlbGVtZW50LnZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgdmVyc2lvblBhcnRzID0gZWxlbWVudC52ZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmICh2ZXJzaW9uUGFydHMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAvLyBTdGFuZGFyZCBzZW12ZXIgZm9ybWF0IChlLmcuLCAxLjAuMClcbiAgICAgICAgICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KHZlcnNpb25QYXJ0c1syXSkgfHwgMDtcbiAgICAgICAgICB2ZXJzaW9uUGFydHNbMl0gPSBTdHJpbmcocGF0Y2ggKyAxKTtcbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSB2ZXJzaW9uUGFydHMuam9pbignLicpO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAvLyBUd28tcGFydCB2ZXJzaW9uIChlLmcuLCAxLjApIC0gYWRkIHBhdGNoIHZlcnNpb25cbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSBgJHtlbGVtZW50LnZlcnNpb259LjFgO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPT09IDEgJiYgL15cXGQrJC8udGVzdCh2ZXJzaW9uUGFydHNbMF0pKSB7XG4gICAgICAgICAgLy8gU2luZ2xlIG51bWJlciB2ZXJzaW9uIChlLmcuLCAxKSAtIGNvbnZlcnQgdG8gc2VtdmVyXG4gICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7ZWxlbWVudC52ZXJzaW9ufS4wLjFgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vbi1zdGFuZGFyZCB2ZXJzaW9uIC0gYXBwZW5kIG9yIHJlcGxhY2Ugd2l0aCBzdGFuZGFyZCBmb3JtYXRcbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSAnMS4wLjEnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyB2ZXJzaW9uIC0gc2V0IGluaXRpYWwgdmVyc2lvblxuICAgICAgICBlbGVtZW50LnZlcnNpb24gPSAnMS4wLjAnO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTYXZlIHRoZSBlbGVtZW50IC0gbmVlZCB0byBkZXRlcm1pbmUgZmlsZW5hbWVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpfS5tZGA7XG4gICAgICBhd2FpdCBtYW5hZ2VyIS5zYXZlKGVsZW1lbnQgYXMgYW55LCBmaWxlbmFtZSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKchSBVcGRhdGVkICR7dHlwZX0gJyR7bmFtZX0nIC0gJHtmaWVsZH0gc2V0IHRvOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBlZGl0IGVsZW1lbnQ6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBlZGl0IGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIHZhbGlkYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHN0cmljdD86IGJvb2xlYW59KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgc3RyaWN0ID0gZmFsc2UgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBwZXJzb25hcywgdXNlIGV4aXN0aW5nIHZhbGlkYXRpb24gbG9naWNcbiAgICAgIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUGVyc29uYShuYW1lKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSBtYW5hZ2VyIGJhc2VkIG9uIHR5cGVcbiAgICAgIGxldCBtYW5hZ2VyOiBTa2lsbE1hbmFnZXIgfCBUZW1wbGF0ZU1hbmFnZXIgfCBBZ2VudE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIHN3aXRjaCAodHlwZSBhcyBFbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURTpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy50ZW1wbGF0ZU1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMuYWdlbnRNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciB2YWxpZGF0aW9uYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGaW5kIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgbWFuYWdlciEuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGVyZm9ybSB2YWxpZGF0aW9uXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgXG4gICAgICAvLyBGb3JtYXQgdmFsaWRhdGlvbiByZXBvcnRcbiAgICAgIGxldCByZXBvcnQgPSBg8J+UjSBWYWxpZGF0aW9uIFJlcG9ydCBmb3IgJHt0eXBlfSAnJHtuYW1lfSc6XFxuYDtcbiAgICAgIHJlcG9ydCArPSBgJHt2YWxpZGF0aW9uUmVzdWx0LnZhbGlkID8gJ+KchScgOiAn4p2MJ30gU3RhdHVzOiAke3ZhbGlkYXRpb25SZXN1bHQudmFsaWQgPyAnVmFsaWQnIDogJ0ludmFsaWQnfVxcblxcbmA7XG4gICAgICBcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9ycyAmJiB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg4p2MIEVycm9ycyAoJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5sZW5ndGh9KTpcXG5gO1xuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5mb3JFYWNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICDigKIgJHtlcnJvci5maWVsZCB8fCAnR2VuZXJhbCd9OiAke2Vycm9yLm1lc3NhZ2V9XFxuYDtcbiAgICAgICAgICBpZiAoZXJyb3IuZml4KSB7XG4gICAgICAgICAgICByZXBvcnQgKz0gYCAgICAg8J+SoSBGaXg6ICR7ZXJyb3IuZml4fVxcbmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDimqDvuI8gIFdhcm5pbmdzICgke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RofSk6XFxuYDtcbiAgICAgICAgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nOiBhbnkpID0+IHtcbiAgICAgICAgICByZXBvcnQgKz0gYCAgIOKAoiAke3dhcm5pbmcuZmllbGQgfHwgJ0dlbmVyYWwnfTogJHt3YXJuaW5nLm1lc3NhZ2V9XFxuYDtcbiAgICAgICAgICBpZiAod2FybmluZy5zdWdnZXN0aW9uKSB7XG4gICAgICAgICAgICByZXBvcnQgKz0gYCAgICAg8J+SoSBTdWdnZXN0aW9uOiAke3dhcm5pbmcuc3VnZ2VzdGlvbn1cXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuc3VnZ2VzdGlvbnMgJiYgdmFsaWRhdGlvblJlc3VsdC5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg8J+SoSBTdWdnZXN0aW9uczpcXG5gO1xuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnN1Z2dlc3Rpb25zLmZvckVhY2goKHN1Z2dlc3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAg4oCiICR7c3VnZ2VzdGlvbn1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWRkIHN0cmljdCBtb2RlIGFkZGl0aW9uYWwgY2hlY2tzIGlmIHJlcXVlc3RlZFxuICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICByZXBvcnQgKz0gJ1xcbvCfk4sgU3RyaWN0IE1vZGU6IEFkZGl0aW9uYWwgcXVhbGl0eSBjaGVja3MgYXBwbGllZCc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogcmVwb3J0XG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB2YWxpZGF0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gdmFsaWRhdGUgZWxlbWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZGVsZXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlbGV0ZURhdGE/OiBib29sZWFufSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGRlbGV0ZURhdGEgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGU6ICR7dHlwZX1cXG5WYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBiYXNlZCBvbiB0eXBlXG4gICAgICBsZXQgbWFuYWdlcjogU2tpbGxNYW5hZ2VyIHwgVGVtcGxhdGVNYW5hZ2VyIHwgQWdlbnRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5za2lsbE1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIC8vIEZvciBwZXJzb25hcywgdXNlIGEgZGlmZmVyZW50IGFwcHJvYWNoXG4gICAgICAgICAgY29uc3QgcGVyc29uYVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgYCR7bmFtZX0ubWRgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHBlcnNvbmFQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhwZXJzb25hUGF0aCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJlbG9hZCBwZXJzb25hcyB0byB1cGRhdGUgdGhlIGNhY2hlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinIUgU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgcGVyc29uYSAnJHtuYW1lfSdgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFBlcnNvbmEgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBkZWxldGlvbmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zdXJlIG1hbmFnZXIgd2FzIGFzc2lnbmVkIChUeXBlU2NyaXB0IHR5cGUgc2FmZXR5KVxuICAgICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRlbGV0aW9uYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgZmlyc3QgdG8gY2hlY2sgaWYgaXQgZXhpc3RzXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgbWFuYWdlciEuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIGFzc29jaWF0ZWQgZGF0YSBmaWxlc1xuICAgICAgbGV0IGRhdGFGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIFxuICAgICAgLy8gQWdlbnQtc3BlY2lmaWM6IENoZWNrIGZvciBzdGF0ZSBmaWxlc1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkFHRU5UKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLkFHRU5UKSwgJy5zdGF0ZScpO1xuICAgICAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4oc3RhdGVEaXIsIGAke25hbWV9LXN0YXRlLmpzb25gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChzdGF0ZUZpbGUpO1xuICAgICAgICAgIGRhdGFGaWxlcy5wdXNoKGAtIC5zdGF0ZS8ke25hbWV9LXN0YXRlLmpzb24gKCR7KHN0YXQuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9IEtCKWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIE5vIHN0YXRlIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWVtb3J5LXNwZWNpZmljOiBDaGVjayBmb3Igc3RvcmFnZSBmaWxlc1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgICBjb25zdCBzdG9yYWdlRGlyID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLk1FTU9SWSksICcuc3RvcmFnZScpO1xuICAgICAgICBjb25zdCBzdG9yYWdlRmlsZSA9IHBhdGguam9pbihzdG9yYWdlRGlyLCBgJHtuYW1lfS1tZW1vcnkuanNvbmApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KHN0b3JhZ2VGaWxlKTtcbiAgICAgICAgICBkYXRhRmlsZXMucHVzaChgLSAuc3RvcmFnZS8ke25hbWV9LW1lbW9yeS5qc29uICgkeyhzdGF0LnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfSBLQilgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBObyBzdG9yYWdlIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zZW1ibGUtc3BlY2lmaWM6IENoZWNrIGZvciBjb25maWcgZmlsZXNcbiAgICAgIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSkge1xuICAgICAgICBjb25zdCBjb25maWdEaXIgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuRU5TRU1CTEUpLCAnLmNvbmZpZ3MnKTtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihjb25maWdEaXIsIGAke25hbWV9LWNvbmZpZy5qc29uYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoY29uZmlnRmlsZSk7XG4gICAgICAgICAgZGF0YUZpbGVzLnB1c2goYC0gLmNvbmZpZ3MvJHtuYW1lfS1jb25maWcuanNvbiAoJHsoc3RhdC5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX0gS0IpYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gTm8gY29uZmlnIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZGF0YSBmaWxlcyBleGlzdCBhbmQgZGVsZXRlRGF0YSBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGluZm9ybSB0aGUgdXNlclxuICAgICAgaWYgKGRhdGFGaWxlcy5sZW5ndGggPiAwICYmIGRlbGV0ZURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDimqDvuI8gIFRoaXMgJHt0eXBlfSBoYXMgYXNzb2NpYXRlZCBkYXRhIGZpbGVzOlxcbiR7ZGF0YUZpbGVzLmpvaW4oJ1xcbicpfVxcblxcbldvdWxkIHlvdSBsaWtlIHRvIGRlbGV0ZSB0aGVzZSBkYXRhIGZpbGVzIGFzIHdlbGw/XFxuXFxu4oCiIFRvIGRlbGV0ZSBldmVyeXRoaW5nIChlbGVtZW50ICsgZGF0YSksIHNheTogXCJZZXMsIGRlbGV0ZSBhbGwgZGF0YVwiXFxu4oCiIFRvIGtlZXAgdGhlIGRhdGEgZmlsZXMsIHNheTogXCJObywga2VlcCB0aGUgZGF0YVwiXFxu4oCiIFRvIGNhbmNlbCwgc2F5OiBcIkNhbmNlbFwiYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERlbGV0ZSB0aGUgbWFpbiBlbGVtZW50IGZpbGVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7c2x1Z2lmeShuYW1lKX0ubWRgO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSBhcyBFbGVtZW50VHlwZSksIGZpbGVuYW1lKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGZpbGVwYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9IGZpbGUgJyR7ZmlsZW5hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERlbGV0ZSBhc3NvY2lhdGVkIGRhdGEgZmlsZXMgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAoZGVsZXRlRGF0YSAmJiBkYXRhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1cGRhdGVkRGF0YUZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkFHRU5UKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdGVGaWxlID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLkFHRU5UKSwgJy5zdGF0ZScsIGAke25hbWV9LXN0YXRlLmpzb25gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0YXRlRmlsZSk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDinJMgZGVsZXRlZGApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBMb2cgYnV0IGRvbid0IGZhaWwgaWYgc3RhdGUgZmlsZSBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgYWdlbnQgc3RhdGUgZmlsZTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKaoO+4jyBkZWxldGlvbiBmYWlsZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgICAgY29uc3Qgc3RvcmFnZUZpbGUgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuTUVNT1JZKSwgJy5zdG9yYWdlJywgYCR7bmFtZX0tbWVtb3J5Lmpzb25gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0b3JhZ2VGaWxlKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKckyBkZWxldGVkYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCBpZiBzdG9yYWdlIGZpbGUgZGVsZXRpb24gZmFpbHNcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIG1lbW9yeSBzdG9yYWdlIGZpbGU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDimqDvuI8gZGVsZXRpb24gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbih0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5FTlNFTUJMRSksICcuY29uZmlncycsIGAke25hbWV9LWNvbmZpZy5qc29uYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhjb25maWdGaWxlKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKckyBkZWxldGVkYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCBpZiBjb25maWcgZmlsZSBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgZW5zZW1ibGUgY29uZmlnIGZpbGU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDimqDvuI8gZGVsZXRpb24gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkYXRhRmlsZXMgPSB1cGRhdGVkRGF0YUZpbGVzO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCdWlsZCBzdWNjZXNzIG1lc3NhZ2VcbiAgICAgIGxldCBtZXNzYWdlID0gYOKchSBTdWNjZXNzZnVsbHkgZGVsZXRlZCAke3R5cGV9ICcke25hbWV9J2A7XG4gICAgICBpZiAoZGF0YUZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGRlbGV0ZURhdGEpIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG5Bc3NvY2lhdGVkIGRhdGEgZmlsZXM6XFxuJHtkYXRhRmlsZXMuam9pbignXFxuJyl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG7imqDvuI8gQXNzb2NpYXRlZCBkYXRhIGZpbGVzIHdlcmUgcHJlc2VydmVkOlxcbiR7ZGF0YUZpbGVzLmpvaW4oJ1xcbicpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBtZXNzYWdlXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZGVsZXRlIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBjaGVja1JhdGVMaW1pdCBhbmQgZmV0Y2hGcm9tR2l0SHViIGFyZSBub3cgaGFuZGxlZCBieSBHaXRIdWJDbGllbnRcblxuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvbiBmb3Igc2VjdGlvbiBhbmQgdHlwZVxuICAgICAgY29uc3QgdmFsaWRhdGVkU2VjdGlvbiA9IHNlY3Rpb24gPyB2YWxpZGF0ZUNhdGVnb3J5KHNlY3Rpb24pIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdmFsaWRhdGVkVHlwZSA9IHR5cGUgPyB2YWxpZGF0ZUNhdGVnb3J5KHR5cGUpIDogdW5kZWZpbmVkO1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25Ccm93c2VyLmJyb3dzZUNvbGxlY3Rpb24odmFsaWRhdGVkU2VjdGlvbiwgdmFsaWRhdGVkVHlwZSk7XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBzZWN0aW9ucyB2aWV3XG4gICAgICBjb25zdCBpdGVtcyA9IHJlc3VsdC5pdGVtcztcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSByZXN1bHQuc2VjdGlvbnMgfHwgcmVzdWx0LmNhdGVnb3JpZXM7XG4gICAgICBcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmNvbGxlY3Rpb25Ccm93c2VyLmZvcm1hdEJyb3dzZVJlc3VsdHMoXG4gICAgICAgIGl0ZW1zLCBcbiAgICAgICAgY2F0ZWdvcmllcywgXG4gICAgICAgIHZhbGlkYXRlZFNlY3Rpb24sIFxuICAgICAgICB2YWxpZGF0ZWRUeXBlLCBcbiAgICAgICAgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKClcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBDb2xsZWN0aW9uIGJyb3dzaW5nIGZhaWxlZDogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlYXJjaENvbGxlY3Rpb24ocXVlcnk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBzZWFyY2ggcXVlcnlcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFF1ZXJ5ID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeSk7XG4gICAgICBcbiAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uU2VhcmNoLnNlYXJjaENvbGxlY3Rpb24odmFsaWRhdGVkUXVlcnkpO1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY29sbGVjdGlvblNlYXJjaC5mb3JtYXRTZWFyY2hSZXN1bHRzKGl0ZW1zLCB2YWxpZGF0ZWRRdWVyeSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3Igc2VhcmNoaW5nIGNvbGxlY3Rpb246ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb2xsZWN0aW9uQ29udGVudChwYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudCB9ID0gYXdhaXQgdGhpcy5wZXJzb25hRGV0YWlscy5nZXRDb2xsZWN0aW9uQ29udGVudChwYXRoKTtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnBlcnNvbmFEZXRhaWxzLmZvcm1hdFBlcnNvbmFEZXRhaWxzKG1ldGFkYXRhLCBjb250ZW50LCBwYXRoLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciBmZXRjaGluZyBjb250ZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5zdGFsbENvbnRlbnQoaW5wdXRQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lbGVtZW50SW5zdGFsbGVyLmluc3RhbGxDb250ZW50KGlucHV0UGF0aCk7XG4gICAgICBcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pqg77iPICR7cmVzdWx0Lm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgaXQncyBhIHBlcnNvbmEsIHJlbG9hZCBwZXJzb25hc1xuICAgICAgaWYgKHJlc3VsdC5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbGVtZW50SW5zdGFsbGVyLmZvcm1hdEluc3RhbGxTdWNjZXNzKFxuICAgICAgICByZXN1bHQubWV0YWRhdGEhLCBcbiAgICAgICAgcmVzdWx0LmZpbGVuYW1lISxcbiAgICAgICAgcmVzdWx0LmVsZW1lbnRUeXBlIVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGluc3RhbGxpbmcgQUkgY3VzdG9taXphdGlvbiBlbGVtZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29udGVudChjb250ZW50SWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gQ2hlY2sgR2l0SHViIGF1dGhlbnRpY2F0aW9uIGZpcnN0XG4gICAgY29uc3QgYXV0aFN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgIFxuICAgIGlmICghYXV0aFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCflJAgKipHaXRIdWIgQXV0aGVudGljYXRpb24gUmVxdWlyZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFRvIHN1Ym1pdCBjb250ZW50IHRvIHRoZSBEb2xsaG91c2VNQ1AgY29sbGVjdGlvbiwgeW91IG5lZWQgdG8gY29ubmVjdCB0byBHaXRIdWIuXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipXaHkgR2l0SHViPyoqXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIEl0J3Mgd2hlcmUgb3VyIGNvbW11bml0eSBzaGFyZXMgY29udGVudFxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBGcmVlIGFjY291bnQgd2l0aCBtaWxsaW9ucyBvZiBkZXZlbG9wZXJzXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIFNlY3VyZSBhbmQgcmVsaWFibGUgcGxhdGZvcm1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKlRvIGdldCBzdGFydGVkOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICBgSnVzdCBzYXkgXCJjb25uZWN0IHRvIEdpdEh1YlwiIG9yIFwic2V0IHVwIEdpdEh1YlwiXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgRG9uJ3QgaGF2ZSBhIEdpdEh1YiBhY2NvdW50PyBObyBwcm9ibGVtISBZb3UnbGwgYmUgZ3VpZGVkIHRocm91Z2ggY3JlYXRpbmcgb25lLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmQgdGhlIGNvbnRlbnQgaW4gbG9jYWwgY29sbGVjdGlvblxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQoY29udGVudElkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGNvbnRlbnRJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgQ29udGVudCBub3QgZm91bmQ6ICR7Y29udGVudElkZW50aWZpZXJ9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBwZXJzb25hIGNvbnRlbnQgYmVmb3JlIHN1Ym1pc3Npb25cbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCB0aGUgZnVsbCBwZXJzb25hIGZpbGUgY29udGVudFxuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgcGVyc29uYS5maWxlbmFtZSk7XG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IFBhdGhWYWxpZGF0b3Iuc2FmZVJlYWRGaWxlKGZ1bGxQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgICAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoZmlsZUNvbnRlbnQpO1xuICAgICAgaWYgKCFjb250ZW50VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGNvbnRlbnRWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqU2VjdXJpdHkgVmFsaWRhdGlvbiBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVGhpcyBwZXJzb25hIGNvbnRhaW5zIGNvbnRlbnQgdGhhdCBjb3VsZCBiZSB1c2VkIGZvciBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3M6XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgJHtjb250ZW50VmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCdcXG7igKIgJyl9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgcmVtb3ZlIHRoZXNlIHBhdHRlcm5zIGJlZm9yZSBzdWJtaXR0aW5nIHRvIHRoZSBjb2xsZWN0aW9uLmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXRhZGF0YVZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlTWV0YWRhdGEocGVyc29uYS5tZXRhZGF0YSk7XG4gICAgICBpZiAoIW1ldGFkYXRhVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pqg77iPICoqTWV0YWRhdGEgU2VjdXJpdHkgV2FybmluZyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBUaGUgcGVyc29uYSBtZXRhZGF0YSBjb250YWlucyBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBjb250ZW50OlxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICR7bWV0YWRhdGFWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJ1xcbuKAoiAnKX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBmaXggdGhlc2UgaXNzdWVzIGJlZm9yZSBzdWJtaXR0aW5nLmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciB2YWxpZGF0aW5nIHBlcnNvbmE6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdpdGh1Yklzc3VlVXJsIH0gPSB0aGlzLnBlcnNvbmFTdWJtaXR0ZXIuZ2VuZXJhdGVTdWJtaXNzaW9uSXNzdWUocGVyc29uYSk7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucGVyc29uYVN1Ym1pdHRlci5mb3JtYXRTdWJtaXNzaW9uUmVzcG9uc2UocGVyc29uYSwgZ2l0aHViSXNzdWVVcmwsIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVXNlciBpZGVudGl0eSBtYW5hZ2VtZW50XG4gIGFzeW5jIHNldFVzZXJJZGVudGl0eSh1c2VybmFtZTogc3RyaW5nLCBlbWFpbD86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXVzZXJuYW1lIHx8IHVzZXJuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgVXNlcm5hbWUgY2Fubm90IGJlIGVtcHR5YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXplIHVzZXJuYW1lXG4gICAgICBjb25zdCB2YWxpZGF0ZWRVc2VybmFtZSA9IHZhbGlkYXRlVXNlcm5hbWUodXNlcm5hbWUpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBlbWFpbCBpZiBwcm92aWRlZFxuICAgICAgbGV0IHZhbGlkYXRlZEVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZW1haWwpIHtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkRW1haWwgPSBzYW5pdGl6ZUlucHV0KGVtYWlsLCAxMDApO1xuICAgICAgICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9FTUFJTC50ZXN0KHNhbml0aXplZEVtYWlsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbWFpbCBmb3JtYXQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRFbWFpbCA9IHNhbml0aXplZEVtYWlsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHZhbGlkYXRlZCB1c2VyIGlkZW50aXR5XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdmFsaWRhdGVkVXNlcm5hbWU7XG4gICAgICBpZiAodmFsaWRhdGVkRW1haWwpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMID0gdmFsaWRhdGVkRW1haWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlVzZXIgSWRlbnRpdHkgU2V0KipcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn5GkICoqVXNlcm5hbWU6KiogJHt2YWxpZGF0ZWRVc2VybmFtZX1cXG5gICtcbiAgICAgICAgICAgIGAke3ZhbGlkYXRlZEVtYWlsID8gYPCfk6cgKipFbWFpbDoqKiAke3ZhbGlkYXRlZEVtYWlsfVxcbmAgOiAnJ31gICtcbiAgICAgICAgICAgIGBcXG7wn46vICoqTmV4dCBTdGVwczoqKlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBOZXcgcGVyc29uYXMgeW91IGNyZWF0ZSB3aWxsIGJlIGF0dHJpYnV0ZWQgdG8gXCIke3ZhbGlkYXRlZFVzZXJuYW1lfVwiXFxuYCArXG4gICAgICAgICAgICBg4oCiIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcXGBET0xMSE9VU0VfVVNFUj0ke3ZhbGlkYXRlZFVzZXJuYW1lfVxcYCB0byBwZXJzaXN0IHRoaXMgc2V0dGluZ1xcbmAgK1xuICAgICAgICAgICAgYCR7dmFsaWRhdGVkRW1haWwgPyBg4oCiIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcXGBET0xMSE9VU0VfRU1BSUw9JHt2YWxpZGF0ZWRFbWFpbH1cXGAgZm9yIGNvbnRhY3QgaW5mb1xcbmAgOiAnJ31gICtcbiAgICAgICAgICAgIGDigKIgVXNlIFxcYGNsZWFyX3VzZXJfaWRlbnRpdHlcXGAgdG8gcmV0dXJuIHRvIGFub255bW91cyBtb2RlYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqVmFsaWRhdGlvbiBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB1c2VybmFtZSAoYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzIG9ubHkpLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0VXNlcklkZW50aXR5KCkge1xuICAgIGNvbnN0IGVtYWlsID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMO1xuICAgIFxuICAgIGlmICghdGhpcy5jdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+RpCAqKlVzZXIgSWRlbnRpdHk6IEFub255bW91cyoqXFxuXFxuYCArXG4gICAgICAgICAgICBg8J+UkiAqKlN0YXR1czoqKiBBbm9ueW1vdXMgbW9kZVxcbmAgK1xuICAgICAgICAgICAgYPCfk50gKipBdHRyaWJ1dGlvbjoqKiBQZXJzb25hcyB3aWxsIHVzZSBhbm9ueW1vdXMgSURzXFxuXFxuYCArXG4gICAgICAgICAgICBgKipUbyBzZXQgeW91ciBpZGVudGl0eToqKlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBVc2U6IFxcYHNldF91c2VyX2lkZW50aXR5IFwieW91ci11c2VybmFtZVwiXFxgXFxuYCArXG4gICAgICAgICAgICBg4oCiIE9yIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXFxgRE9MTEhPVVNFX1VTRVI9eW91ci11c2VybmFtZVxcYGAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfkaQgKipVc2VyIElkZW50aXR5OiAke3RoaXMuY3VycmVudFVzZXJ9KipcXG5cXG5gICtcbiAgICAgICAgICBg4pyFICoqU3RhdHVzOioqIEF1dGhlbnRpY2F0ZWRcXG5gICtcbiAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7dGhpcy5jdXJyZW50VXNlcn1cXG5gICtcbiAgICAgICAgICBgJHtlbWFpbCA/IGDwn5OnICoqRW1haWw6KiogJHtlbWFpbH1cXG5gIDogJyd9YCArXG4gICAgICAgICAgYPCfk50gKipBdHRyaWJ1dGlvbjoqKiBOZXcgcGVyc29uYXMgd2lsbCBiZSBjcmVkaXRlZCB0byBcIiR7dGhpcy5jdXJyZW50VXNlcn1cIlxcblxcbmAgK1xuICAgICAgICAgIGAqKkVudmlyb25tZW50IFZhcmlhYmxlczoqKlxcbmAgK1xuICAgICAgICAgIGDigKIgXFxgRE9MTEhPVVNFX1VTRVI9JHt0aGlzLmN1cnJlbnRVc2VyfVxcYFxcbmAgK1xuICAgICAgICAgIGAke2VtYWlsID8gYOKAoiBcXGBET0xMSE9VU0VfRU1BSUw9JHtlbWFpbH1cXGBcXG5gIDogJyd9YCArXG4gICAgICAgICAgYFxcbioqTWFuYWdlbWVudDoqKlxcbmAgK1xuICAgICAgICAgIGDigKIgVXNlIFxcYGNsZWFyX3VzZXJfaWRlbnRpdHlcXGAgdG8gcmV0dXJuIHRvIGFub255bW91cyBtb2RlXFxuYCArXG4gICAgICAgICAgYOKAoiBVc2UgXFxgc2V0X3VzZXJfaWRlbnRpdHkgXCJuZXctdXNlcm5hbWVcIlxcYCB0byBjaGFuZ2UgdXNlcm5hbWVgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY2xlYXJVc2VySWRlbnRpdHkoKSB7XG4gICAgY29uc3Qgd2FzU2V0ID0gdGhpcy5jdXJyZW50VXNlciAhPT0gbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c1VzZXIgPSB0aGlzLmN1cnJlbnRVc2VyO1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHdhc1NldCBcbiAgICAgICAgICAgID8gYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqVXNlciBJZGVudGl0eSBDbGVhcmVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfkaQgKipQcmV2aW91czoqKiAke3ByZXZpb3VzVXNlcn1cXG5gICtcbiAgICAgICAgICAgICAgYPCflJIgKipDdXJyZW50OioqIEFub255bW91cyBtb2RlXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn5OdICoqRWZmZWN0OioqIE5ldyBwZXJzb25hcyB3aWxsIHVzZSBhbm9ueW1vdXMgSURzXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDimqDvuI8gKipOb3RlOioqIFRoaXMgb25seSBhZmZlY3RzIHRoZSBjdXJyZW50IHNlc3Npb24uXFxuYCArXG4gICAgICAgICAgICAgIGBUbyBwZXJzaXN0IHRoaXMgY2hhbmdlLCB1bnNldCB0aGUgXFxgRE9MTEhPVVNFX1VTRVJcXGAgZW52aXJvbm1lbnQgdmFyaWFibGUuYFxuICAgICAgICAgICAgOiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3ihLnvuI8gKipBbHJlYWR5IGluIEFub255bW91cyBNb2RlKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfkaQgTm8gdXNlciBpZGVudGl0eSB3YXMgc2V0LlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYHNldF91c2VyX2lkZW50aXR5IFwidXNlcm5hbWVcIlxcYCB0byBzZXQgeW91ciBpZGVudGl0eS5gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXIgfHwgZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICB9XG5cbiAgLy8gR2l0SHViIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnRcbiAgYXN5bmMgc2V0dXBHaXRIdWJBdXRoKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBjdXJyZW50IGF1dGggc3RhdHVzIGZpcnN0XG4gICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgICBcbiAgICAgIGlmIChjdXJyZW50U3RhdHVzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKkFscmVhZHkgQ29ubmVjdGVkIHRvIEdpdEh1YioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7Y3VycmVudFN0YXR1cy51c2VybmFtZX1cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5SRICoqUGVybWlzc2lvbnM6KiogJHtjdXJyZW50U3RhdHVzLnNjb3Blcz8uam9pbignLCAnKSB8fCAnYmFzaWMgYWNjZXNzJ31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBZb3UncmUgYWxsIHNldCEgWW91IGNhbjpcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgQnJvd3NlIHRoZSBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIEluc3RhbGwgY29udGVudFxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBTdWJtaXQgeW91ciBjcmVhdGlvbnNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBUbyBkaXNjb25uZWN0LCBzYXkgXCJkaXNjb25uZWN0IGZyb20gR2l0SHViXCJgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSW5pdGlhdGUgZGV2aWNlIGZsb3dcbiAgICAgIGNvbnN0IGRldmljZVJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5pbml0aWF0ZURldmljZUZsb3coKTtcbiAgICAgIFxuICAgICAgLy8gU3RhcnQgcG9sbGluZyBpbiBiYWNrZ3JvdW5kXG4gICAgICB0aGlzLnBvbGxGb3JBdXRoQ29tcGxldGlvbihkZXZpY2VSZXNwb25zZS5kZXZpY2VfY29kZSwgZGV2aWNlUmVzcG9uc2UuaW50ZXJ2YWwpO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gaW5zdHJ1Y3Rpb25zIHRvIHVzZXJcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogdGhpcy5naXRodWJBdXRoTWFuYWdlci5mb3JtYXRBdXRoSW5zdHJ1Y3Rpb25zKGRldmljZVJlc3BvbnNlKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc2V0dXAgR2l0SHViIGF1dGgnLCB7IGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipBdXRoZW50aWNhdGlvbiBTZXR1cCBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gc3RhcnQgR2l0SHViIGF1dGhlbnRpY2F0aW9uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGNoZWNrR2l0SHViQXV0aCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgICBcbiAgICAgIGlmIChzdGF0dXMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqR2l0SHViIENvbm5lY3RlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7c3RhdHVzLnVzZXJuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCflJEgKipQZXJtaXNzaW9uczoqKiAke3N0YXR1cy5zY29wZXM/LmpvaW4oJywgJykgfHwgJ2Jhc2ljIGFjY2Vzcyd9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipBdmFpbGFibGUgQWN0aW9uczoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinIUgU3VibWl0IGNvbnRlbnRcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBFdmVyeXRoaW5nIGlzIHdvcmtpbmcgcHJvcGVybHkhYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5oYXNUb2tlbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKaoO+4jyAqKkdpdEh1YiBUb2tlbiBJbnZhbGlkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBBIEdpdEh1YiB0b2tlbiB3YXMgZm91bmQgYnV0IGl0IGFwcGVhcnMgdG8gYmUgaW52YWxpZCBvciBleHBpcmVkLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCoqVG8gZml4IHRoaXM6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAxLiBTYXkgXCJzZXQgdXAgR2l0SHViXCIgdG8gYXV0aGVudGljYXRlIGFnYWluXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMi4gT3IgY2hlY2sgeW91ciBHSVRIVUJfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGVcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBOb3RlOiBCcm93c2UgYW5kIGluc3RhbGwgc3RpbGwgd29yayB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5SSICoqTm90IENvbm5lY3RlZCB0byBHaXRIdWIqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFlvdSdyZSBub3QgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWIuXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipXaGF0IHdvcmtzIHdpdGhvdXQgYXV0aDoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4pyFIEluc3RhbGwgY29tbXVuaXR5IGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinYwgU3VibWl0IHlvdXIgb3duIGNvbnRlbnQgKHJlcXVpcmVzIGF1dGgpXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVG8gY29ubmVjdCwganVzdCBzYXkgXCJzZXQgdXAgR2l0SHViXCIgb3IgXCJjb25uZWN0IHRvIEdpdEh1YlwiYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNoZWNrIEdpdEh1YiBhdXRoJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqVW5hYmxlIHRvIENoZWNrIEF1dGhlbnRpY2F0aW9uKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGNsZWFyR2l0SHViQXV0aCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5jbGVhckF1dGhlbnRpY2F0aW9uKCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqR2l0SHViIERpc2Nvbm5lY3RlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFlvdXIgR2l0SHViIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xlYXJlZC5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgKipXaGF0IHN0aWxsIHdvcmtzOioqXFxuYCArXG4gICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgYOKdjCBTdWJtaXQgY29udGVudCAocmVxdWlyZXMgcmVjb25uZWN0aW9uKVxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBUbyByZWNvbm5lY3QgbGF0ZXIsIGp1c3Qgc2F5IFwiY29ubmVjdCB0byBHaXRIdWJcIlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGDimqDvuI8gKipOb3RlOioqIFRvIGZ1bGx5IHJlbW92ZSBhdXRoZW50aWNhdGlvbiwgYWxzbyB1bnNldCB0aGUgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLmBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFyIEdpdEh1YiBhdXRoJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqRmFpbGVkIHRvIENsZWFyIEF1dGhlbnRpY2F0aW9uKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb2xsIGZvciBhdXRoIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcG9sbEZvckF1dGhDb21wbGV0aW9uKGRldmljZUNvZGU6IHN0cmluZywgaW50ZXJ2YWw6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5wb2xsRm9yVG9rZW4oZGV2aWNlQ29kZSwgaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgYXV0aFN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuY29tcGxldGVBdXRoZW50aWNhdGlvbih0b2tlblJlc3BvbnNlKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHN1Y2Nlc3MgKHVzZXIgd2lsbCBzZWUgdGhpcyBpbiB0aGVpciBuZXh0IGludGVyYWN0aW9uKVxuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JywgeyBcbiAgICAgICAgdXNlcm5hbWU6IGF1dGhTdGF0dXMudXNlcm5hbWUsXG4gICAgICAgIHNjb3BlczogYXV0aFN0YXR1cy5zY29wZXMgXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGVycm9yIGJ1dCBkb24ndCB0aHJvdyAtIHRoaXMgcnVucyBpbiBiYWNrZ3JvdW5kXG4gICAgICBsb2dnZXIuZXJyb3IoJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBwb2xsaW5nIGZhaWxlZCcsIHsgZXJyb3IgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hhdC1iYXNlZCBwZXJzb25hIG1hbmFnZW1lbnQgdG9vbHNcbiAgYXN5bmMgY3JlYXRlUGVyc29uYShuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIGNhdGVnb3J5OiBzdHJpbmcsIGluc3RydWN0aW9uczogc3RyaW5nLCB0cmlnZ2Vycz86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBmaWVsZHNcbiAgICAgIGlmICghbmFtZSB8fCAhZGVzY3JpcHRpb24gfHwgIWNhdGVnb3J5IHx8ICFpbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipNaXNzaW5nIFJlcXVpcmVkIEZpZWxkcyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSBwcm92aWRlIGFsbCByZXF1aXJlZCBmaWVsZHM6XFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKm5hbWUqKjogRGlzcGxheSBuYW1lIGZvciB0aGUgcGVyc29uYVxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKipkZXNjcmlwdGlvbioqOiBCcmllZiBkZXNjcmlwdGlvbiBvZiB3aGF0IGl0IGRvZXNcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqY2F0ZWdvcnkqKjogY3JlYXRpdmUsIHByb2Zlc3Npb25hbCwgZWR1Y2F0aW9uYWwsIGdhbWluZywgb3IgcGVyc29uYWxcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqaW5zdHJ1Y3Rpb25zKio6IFRoZSBwZXJzb25hJ3MgYmVoYXZpb3JhbCBndWlkZWxpbmVzXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYCoqT3B0aW9uYWw6KipcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqdHJpZ2dlcnMqKjogQ29tbWEtc2VwYXJhdGVkIGtleXdvcmRzIGZvciBhY3RpdmF0aW9uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgYW5kIHZhbGlkYXRlIGlucHV0c1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkZXNjcmlwdGlvbiwgNTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZEluc3RydWN0aW9ucyA9IHNhbml0aXplSW5wdXQoaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZFRyaWdnZXJzID0gdHJpZ2dlcnMgPyBzYW5pdGl6ZUlucHV0KHRyaWdnZXJzLCAyMDApIDogJyc7XG5cbiAgICAgIC8vIFZhbGlkYXRlIG5hbWUgbGVuZ3RoIGFuZCBmb3JtYXRcbiAgICAgIGlmIChzYW5pdGl6ZWROYW1lLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJzb25hIG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAyIGNoYXJhY3RlcnMgbG9uZycpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBjYXRlZ29yeVxuICAgICAgY29uc3QgdmFsaWRhdGVkQ2F0ZWdvcnkgPSB2YWxpZGF0ZUNhdGVnb3J5KGNhdGVnb3J5KTtcblxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBzaXplc1xuICAgICAgdmFsaWRhdGVDb250ZW50U2l6ZShzYW5pdGl6ZWRJbnN0cnVjdGlvbnMsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpO1xuICAgICAgdmFsaWRhdGVDb250ZW50U2l6ZShzYW5pdGl6ZWREZXNjcmlwdGlvbiwgMjAwMCk7IC8vIDJLQiBtYXggZm9yIGRlc2NyaXB0aW9uXG5cbiAgICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgIGNvbnN0IG5hbWVWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHNhbml0aXplZE5hbWUpO1xuICAgICAgaWYgKCFuYW1lVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmFtZSBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6ICR7bmFtZVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzY1ZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoc2FuaXRpemVkRGVzY3JpcHRpb24pO1xuICAgICAgaWYgKCFkZXNjVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVzY3JpcHRpb24gY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OiAke2Rlc2NWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc3RydWN0aW9uc1ZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoc2FuaXRpemVkSW5zdHJ1Y3Rpb25zKTtcbiAgICAgIGlmICghaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5pc1ZhbGlkICYmIGluc3RydWN0aW9uc1ZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN0cnVjdGlvbnMgY29udGFpbiBzZWN1cml0eSB0aHJlYXRzOiAke2luc3RydWN0aW9uc1ZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgbWV0YWRhdGFcbiAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKHNhbml0aXplZE5hbWUsIHRoaXMuY3VycmVudFVzZXIgfHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdmFsaWRhdGVGaWxlbmFtZShgJHtzbHVnaWZ5KHNhbml0aXplZE5hbWUpfS5tZGApO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgZmlsZW5hbWUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQYXRoVmFsaWRhdG9yLnZhbGlkYXRlUGVyc29uYVBhdGgoZmlsZVBhdGgpO1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKaoO+4jyAqKlBlcnNvbmEgQWxyZWFkeSBFeGlzdHMqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgQSBwZXJzb25hIGZpbGUgbmFtZWQgXCIke2ZpbGVuYW1lfVwiIGFscmVhZHkgZXhpc3RzLlxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGVkaXRfcGVyc29uYVxcYCB0byBtb2RpZnkgaXQsIG9yIGNob29zZSBhIGRpZmZlcmVudCBuYW1lLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWQgd2l0aCBjcmVhdGlvblxuICAgIH1cblxuICAgICAgLy8gUGFyc2UgYW5kIHNhbml0aXplIHRyaWdnZXJzXG4gICAgICBjb25zdCB0cmlnZ2VyTGlzdCA9IHNhbml0aXplZFRyaWdnZXJzID8gXG4gICAgICAgIHNhbml0aXplZFRyaWdnZXJzLnNwbGl0KCcsJykubWFwKHQgPT4gc2FuaXRpemVJbnB1dCh0LnRyaW0oKSwgNTApKS5maWx0ZXIodCA9PiB0Lmxlbmd0aCA+IDApIDogXG4gICAgICAgIFtdO1xuXG4gICAgICAvLyBDcmVhdGUgcGVyc29uYSBtZXRhZGF0YSB3aXRoIHNhbml0aXplZCB2YWx1ZXNcbiAgICAgIGNvbnN0IG1ldGFkYXRhOiBQZXJzb25hTWV0YWRhdGEgPSB7XG4gICAgICAgIG5hbWU6IHNhbml0aXplZE5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZWREZXNjcmlwdGlvbixcbiAgICAgICAgdW5pcXVlX2lkOiB1bmlxdWVJZCxcbiAgICAgICAgYXV0aG9yLFxuICAgICAgICB0cmlnZ2VyczogdHJpZ2dlckxpc3QsXG4gICAgICAgIHZlcnNpb246IFwiMS4wXCIsXG4gICAgICAgIGNhdGVnb3J5OiB2YWxpZGF0ZWRDYXRlZ29yeSxcbiAgICAgICAgYWdlX3JhdGluZzogXCJhbGxcIixcbiAgICAgICAgY29udGVudF9mbGFnczogW1widXNlci1jcmVhdGVkXCJdLFxuICAgICAgICBhaV9nZW5lcmF0ZWQ6IHRydWUsXG4gICAgICAgIGdlbmVyYXRpb25fbWV0aG9kOiBcIkNsYXVkZVwiLFxuICAgICAgICBwcmljZTogXCJmcmVlXCIsXG4gICAgICAgIHJldmVudWVfc3BsaXQ6IFwiODAvMjBcIixcbiAgICAgICAgbGljZW5zZTogXCJDQy1CWS1TQS00LjBcIixcbiAgICAgICAgY3JlYXRlZF9kYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgZnVsbCBwZXJzb25hIGNvbnRlbnQgd2l0aCBzYW5pdGl6ZWQgdmFsdWVzXG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgY29uc3QgcGVyc29uYUNvbnRlbnQgPSBgLS0tXG4ke2Zyb250bWF0dGVyfVxuLS0tXG5cbiMgJHtzYW5pdGl6ZWROYW1lfVxuXG4ke3Nhbml0aXplZEluc3RydWN0aW9uc31cblxuIyMgUmVzcG9uc2UgU3R5bGVcbi0gRm9sbG93IHRoZSBiZWhhdmlvcmFsIGd1aWRlbGluZXMgYWJvdmVcbi0gTWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCB0aGUgcGVyc29uYSdzIGNoYXJhY3RlclxuLSBBZGFwdCByZXNwb25zZXMgdG8gbWF0Y2ggdGhlIGludGVuZGVkIHB1cnBvc2VcblxuIyMgVXNhZ2UgTm90ZXNcbi0gQ3JlYXRlZCB2aWEgRG9sbGhvdXNlTUNQIGNoYXQgaW50ZXJmYWNlXG4tIEF1dGhvcjogJHthdXRob3J9XG4tIFZlcnNpb246IDEuMGA7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGZpbmFsIGNvbnRlbnQgc2l6ZVxuICAgICAgdmFsaWRhdGVDb250ZW50U2l6ZShwZXJzb25hQ29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBmaWxlIGxvY2tpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgcGVyc29uYToke3Nhbml0aXplZE5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBEb3VibGUtY2hlY2sgZmlsZSBkb2Vzbid0IGV4aXN0IChpbiBjYXNlIG9mIHJhY2UgY29uZGl0aW9uKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQZXJzb25hIGZpbGUgXCIke2ZpbGVuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAvLyBJZiBlcnJvciBpcyBub3QgRU5PRU5UIChmaWxlIG5vdCBmb3VuZCksIHJlLXRocm93IGl0XG4gICAgICAgICAgaWYgKGVycm9yLmNvZGUgIT09ICdFTk9FTlQnICYmIGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFdyaXRlIHRoZSBmaWxlIGF0b21pY2FsbHlcbiAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmaWxlUGF0aCwgcGVyc29uYUNvbnRlbnQpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlbG9hZCBwZXJzb25hcyB0byBpbmNsdWRlIHRoZSBuZXcgb25lXG4gICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipQZXJzb25hIENyZWF0ZWQgU3VjY2Vzc2Z1bGx5ISoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn46tICoqJHtzYW5pdGl6ZWROYW1lfSoqIGJ5ICR7YXV0aG9yfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+TgSBDYXRlZ29yeTogJHtjYXRlZ29yeX1cXG5gICtcbiAgICAgICAgICAgICAgYPCfhpQgVW5pcXVlIElEOiAke3VuaXF1ZUlkfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+ThCBTYXZlZCBhczogJHtmaWxlbmFtZX1cXG5gICtcbiAgICAgICAgICAgICAgYPCfk4ogVG90YWwgcGVyc29uYXM6ICR7dGhpcy5wZXJzb25hcy5zaXplfVxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+OryAqKlJlYWR5IHRvIHVzZToqKiBcXGBhY3RpdmF0ZV9wZXJzb25hIFwiJHtzYW5pdGl6ZWROYW1lfVwiXFxgXFxuYCArXG4gICAgICAgICAgICAgIGDwn5OkICoqU2hhcmUgaXQ6KiogXFxgc3VibWl0X2NvbnRlbnQgXCIke3Nhbml0aXplZE5hbWV9XCJcXGBcXG5gICtcbiAgICAgICAgICAgICAgYOKcj++4jyAqKkVkaXQgaXQ6KiogXFxgZWRpdF9wZXJzb25hIFwiJHtzYW5pdGl6ZWROYW1lfVwiIFwiZmllbGRcIiBcIm5ldyB2YWx1ZVwiXFxgYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqRXJyb3IgQ3JlYXRpbmcgUGVyc29uYSoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gd3JpdGUgcGVyc29uYSBmaWxlOiAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHBlcm1pc3Npb25zIGFuZCB0cnkgYWdhaW4uYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlZhbGlkYXRpb24gRXJyb3IqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgJHtzYW5pdGl6ZWQubWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBmaXggdGhlIGlzc3VlIGFuZCB0cnkgYWdhaW4uYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBlZGl0UGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCFwZXJzb25hSWRlbnRpZmllciB8fCAhZmllbGQgfHwgIXZhbHVlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipNaXNzaW5nIFBhcmFtZXRlcnMqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNhZ2U6IFxcYGVkaXRfcGVyc29uYSBcInBlcnNvbmFfbmFtZVwiIFwiZmllbGRcIiBcIm5ld192YWx1ZVwiXFxgXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAqKkVkaXRhYmxlIGZpZWxkczoqKlxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqbmFtZSoqIC0gRGlzcGxheSBuYW1lXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKipkZXNjcmlwdGlvbioqIC0gQnJpZWYgZGVzY3JpcHRpb25cXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKmNhdGVnb3J5KiogLSBjcmVhdGl2ZSwgcHJvZmVzc2lvbmFsLCBlZHVjYXRpb25hbCwgZ2FtaW5nLCBwZXJzb25hbFxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqaW5zdHJ1Y3Rpb25zKiogLSBNYWluIHBlcnNvbmEgY29udGVudFxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqdHJpZ2dlcnMqKiAtIENvbW1hLXNlcGFyYXRlZCBrZXl3b3Jkc1xcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqdmVyc2lvbioqIC0gVmVyc2lvbiBudW1iZXJgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBlcnNvbmFcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBwZXJzb25hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqUGVyc29uYSBOb3QgRm91bmQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcGVyc29uYTogXCIke3BlcnNvbmFJZGVudGlmaWVyfVwiXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgbGlzdF9wZXJzb25hc1xcYCB0byBzZWUgYXZhaWxhYmxlIHBlcnNvbmFzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRGaWVsZHMgPSBbJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnY2F0ZWdvcnknLCAnaW5zdHJ1Y3Rpb25zJywgJ3RyaWdnZXJzJywgJ3ZlcnNpb24nXTtcbiAgICBpZiAoIXZhbGlkRmllbGRzLmluY2x1ZGVzKGZpZWxkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipJbnZhbGlkIEZpZWxkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEZpZWxkIFwiJHtmaWVsZH1cIiBpcyBub3QgZWRpdGFibGUuXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAqKlZhbGlkIGZpZWxkczoqKiAke3ZhbGlkRmllbGRzLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgcGVyc29uYS5maWxlbmFtZSk7XG4gICAgbGV0IGlzRGVmYXVsdCA9IGlzRGVmYXVsdFBlcnNvbmEocGVyc29uYS5maWxlbmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCBjdXJyZW50IGZpbGVcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBVc2Ugc2VjdXJlIFlBTUwgcGFyc2VyXG4gICAgICBsZXQgcGFyc2VkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGZpbGVDb250ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqU2VjdXJpdHkgRXJyb3IqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYENhbm5vdCBlZGl0IHBlcnNvbmEgZHVlIHRvIHNlY3VyaXR5IHRocmVhdDogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIGVkaXRpbmcgYSBkZWZhdWx0IHBlcnNvbmEsIGNyZWF0ZSBhIGNvcHkgaW5zdGVhZFxuICAgICAgaWYgKGlzRGVmYXVsdCkge1xuICAgICAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIHRoZSBjb3B5XG4gICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuY3VycmVudFVzZXIgfHwgZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQocGVyc29uYS5tZXRhZGF0YS5uYW1lLCBhdXRob3IpO1xuICAgICAgICBjb25zdCBuZXdGaWxlbmFtZSA9IGAke3VuaXF1ZUlkfS5tZGA7XG4gICAgICAgIGNvbnN0IG5ld0ZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMucGVyc29uYXNEaXIsIG5ld0ZpbGVuYW1lKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBjb3B5IG9mIHRoZSBkZWZhdWx0IHBlcnNvbmFcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IFBhdGhWYWxpZGF0b3Iuc2FmZVJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVzZSBmaWxlIGxvY2tpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2hlbiBjcmVhdGluZyB0aGUgY29weVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2soYHBlcnNvbmE6JHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9LWNvcHlgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShuZXdGaWxlUGF0aCwgY29udGVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZpbGUgcGF0aCB0byBwb2ludCB0byB0aGUgY29weVxuICAgICAgICBmaWxlUGF0aCA9IG5ld0ZpbGVQYXRoO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmlxdWVfaWQgaW4gdGhlIG1ldGFkYXRhXG4gICAgICAgIHBhcnNlZC5kYXRhLnVuaXF1ZV9pZCA9IHVuaXF1ZUlkO1xuICAgICAgICBwYXJzZWQuZGF0YS5hdXRob3IgPSBhdXRob3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZCA9IGZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBuZXcgdmFsdWUgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgIGNvbnN0IHZhbHVlVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSk7XG4gICAgICBpZiAoIXZhbHVlVmFsaWRhdGlvbi5pc1ZhbGlkICYmIHZhbHVlVmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlNlY3VyaXR5IFZhbGlkYXRpb24gRmFpbGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFRoZSBuZXcgdmFsdWUgY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OlxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICR7dmFsdWVWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJ1xcbuKAoiAnKX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSByZW1vdmUgdGhlc2UgcGF0dGVybnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVc2Ugc2FuaXRpemVkIHZhbHVlIGlmIG5lZWRlZFxuICAgICAgbGV0IHNhbml0aXplZFZhbHVlID0gdmFsdWVWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgdmFsdWU7XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyByZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgZnJvbSBkaXNwbGF5IG91dHB1dFxuICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gc2FuaXRpemVkVmFsdWUucmVwbGFjZSgvWzsmfGAkKCldL2csICcnKTtcbiAgICAgIFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ2luc3RydWN0aW9ucycpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYWluIGNvbnRlbnRcbiAgICAgICAgcGFyc2VkLmNvbnRlbnQgPSBzYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEZpZWxkID09PSAndHJpZ2dlcnMnKSB7XG4gICAgICAgIC8vIFBhcnNlIHRyaWdnZXJzIGFzIGNvbW1hLXNlcGFyYXRlZCBsaXN0XG4gICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZWRWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0Lmxlbmd0aCA+IDApO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICdjYXRlZ29yeScpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgY2F0ZWdvcnlcbiAgICAgICAgY29uc3QgdmFsaWRDYXRlZ29yaWVzID0gWydjcmVhdGl2ZScsICdwcm9mZXNzaW9uYWwnLCAnZWR1Y2F0aW9uYWwnLCAnZ2FtaW5nJywgJ3BlcnNvbmFsJ107XG4gICAgICAgIGlmICghdmFsaWRDYXRlZ29yaWVzLmluY2x1ZGVzKHNhbml0aXplZFZhbHVlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkludmFsaWQgQ2F0ZWdvcnkqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgQ2F0ZWdvcnkgbXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRDYXRlZ29yaWVzLmpvaW4oJywgJyl9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBZb3UgcHJvdmlkZWQ6IFwiJHtzYW5pdGl6ZWRWYWx1ZX1cImAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgbWV0YWRhdGEgZmllbGRcbiAgICAgICAgLy8gRm9yIG5hbWUgZmllbGQsIGFwcGx5IGFkZGl0aW9uYWwgc2FuaXRpemF0aW9uIHRvIHJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVyc1xuICAgICAgICBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnbmFtZScpIHtcbiAgICAgICAgICBwYXJzZWQuZGF0YVtub3JtYWxpemVkRmllbGRdID0gc2FuaXRpemVJbnB1dChzYW5pdGl6ZWRWYWx1ZSwgMTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJzZWQuZGF0YVtub3JtYWxpemVkRmllbGRdID0gc2FuaXRpemVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHZlcnNpb24gYW5kIG1vZGlmaWNhdGlvbiBpbmZvXG4gICAgICBpZiAobm9ybWFsaXplZEZpZWxkICE9PSAndmVyc2lvbicpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYXJzZWQuZGF0YS52ZXJzaW9uIHx8ICcxLjAnO1xuICAgICAgICBjb25zdCB2ZXJzaW9uUGFydHMgPSBjdXJyZW50VmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgICAgICB2ZXJzaW9uUGFydHNbMV0gPSAodmVyc2lvblBhcnRzWzFdIHx8IDApICsgMTtcbiAgICAgICAgcGFyc2VkLmRhdGEudmVyc2lvbiA9IHZlcnNpb25QYXJ0cy5qb2luKCcuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2VuZXJhdGUgZmlsZSBjb250ZW50XG4gICAgICAvLyBVc2Ugc2VjdXJlIFlBTUwgc3RyaW5naWZpY2F0aW9uXG4gICAgICBjb25zdCBzZWN1cmVQYXJzZXIgPSBTZWN1cmVZYW1sUGFyc2VyLmNyZWF0ZVNlY3VyZU1hdHRlclBhcnNlcigpO1xuICAgICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBzZWN1cmVQYXJzZXIuc3RyaW5naWZ5KHBhcnNlZC5jb250ZW50LCBwYXJzZWQuZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIFVzZSBmaWxlIGxvY2tpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgcGVyc29uYToke3BlcnNvbmEubWV0YWRhdGEubmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFdyaXRlIHVwZGF0ZWQgZmlsZSBhdG9taWNhbGx5XG4gICAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZmlsZVBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZWxvYWQgcGVyc29uYXNcbiAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlBlcnNvbmEgVXBkYXRlZCBTdWNjZXNzZnVsbHkhKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgKGlzRGVmYXVsdCA/IGDwn5OLICoqTm90ZToqKiBDcmVhdGVkIGEgY29weSBvZiB0aGUgZGVmYXVsdCBwZXJzb25hIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbC5cXG5cXG5gIDogJycpICtcbiAgICAgICAgICAgICAgYPCfjq0gKiokeyhwYXJzZWQuZGF0YS5uYW1lIHx8IHBlcnNvbmEubWV0YWRhdGEubmFtZSB8fCAnJykucmVwbGFjZSgvWzsmfGAkKCldL2csICcnKX0qKlxcbmAgK1xuICAgICAgICAgICAgICBg8J+TnSAqKkZpZWxkIFVwZGF0ZWQ6KiogJHtmaWVsZH1cXG5gICtcbiAgICAgICAgICAgICAgYPCflIQgKipOZXcgVmFsdWU6KiogJHtub3JtYWxpemVkRmllbGQgPT09ICdpbnN0cnVjdGlvbnMnID8gJ0NvbnRlbnQgdXBkYXRlZCcgOiBkaXNwbGF5VmFsdWV9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OKICoqVmVyc2lvbjoqKiAke3BhcnNlZC5kYXRhLnZlcnNpb259XFxuYCArXG4gICAgICAgICAgICAgIChpc0RlZmF1bHQgPyBg8J+GlCAqKk5ldyBJRDoqKiAke3BhcnNlZC5kYXRhLnVuaXF1ZV9pZH1cXG5gIDogJycpICtcbiAgICAgICAgICAgICAgYFxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGdldF9wZXJzb25hX2RldGFpbHMgXCIkeyhwYXJzZWQuZGF0YS5uYW1lIHx8IHBlcnNvbmEubWV0YWRhdGEubmFtZSB8fCAnJykucmVwbGFjZSgvWzsmfGAkKCldL2csICcnKX1cIlxcYCB0byBzZWUgYWxsIGNoYW5nZXMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqRXJyb3IgVXBkYXRpbmcgUGVyc29uYSoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIHBlcnNvbmE6ICR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgZmlsZSBwZXJtaXNzaW9ucyBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICBpZiAoIXBlcnNvbmFJZGVudGlmaWVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipNaXNzaW5nIFBlcnNvbmEgSWRlbnRpZmllcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2FnZTogXFxgdmFsaWRhdGVfcGVyc29uYSBcInBlcnNvbmFfbmFtZVwiXFxgXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgbGlzdF9wZXJzb25hc1xcYCB0byBzZWUgYXZhaWxhYmxlIHBlcnNvbmFzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGVyc29uYVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBlcnNvbmFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipQZXJzb25hIE5vdCBGb3VuZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBwZXJzb25hOiBcIiR7cGVyc29uYUlkZW50aWZpZXJ9XCJcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBsaXN0X3BlcnNvbmFzXFxgIHRvIHNlZSBhdmFpbGFibGUgcGVyc29uYXMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0aW9uIGNoZWNrc1xuICAgIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHBlcnNvbmEubWV0YWRhdGE7XG5cbiAgICAvLyBSZXF1aXJlZCBmaWVsZCBjaGVja3NcbiAgICBpZiAoIW1ldGFkYXRhLm5hbWUgfHwgbWV0YWRhdGEubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpc3N1ZXMucHVzaChcIk1pc3Npbmcgb3IgZW1wdHkgJ25hbWUnIGZpZWxkXCIpO1xuICAgIH1cbiAgICBpZiAoIW1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8IG1ldGFkYXRhLmRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKFwiTWlzc2luZyBvciBlbXB0eSAnZGVzY3JpcHRpb24nIGZpZWxkXCIpO1xuICAgIH1cbiAgICBpZiAoIXBlcnNvbmEuY29udGVudCB8fCBwZXJzb25hLmNvbnRlbnQudHJpbSgpLmxlbmd0aCA8IDUwKSB7XG4gICAgICBpc3N1ZXMucHVzaChcIlBlcnNvbmEgY29udGVudCBpcyB0b28gc2hvcnQgKG1pbmltdW0gNTAgY2hhcmFjdGVycylcIik7XG4gICAgfVxuXG4gICAgLy8gQ2F0ZWdvcnkgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkQ2F0ZWdvcmllcyA9IFsnY3JlYXRpdmUnLCAncHJvZmVzc2lvbmFsJywgJ2VkdWNhdGlvbmFsJywgJ2dhbWluZycsICdwZXJzb25hbCcsICdnZW5lcmFsJ107XG4gICAgaWYgKG1ldGFkYXRhLmNhdGVnb3J5ICYmICF2YWxpZENhdGVnb3JpZXMuaW5jbHVkZXMobWV0YWRhdGEuY2F0ZWdvcnkpKSB7XG4gICAgICBpc3N1ZXMucHVzaChgSW52YWxpZCBjYXRlZ29yeSAnJHttZXRhZGF0YS5jYXRlZ29yeX0nLiBNdXN0IGJlIG9uZSBvZjogJHt2YWxpZENhdGVnb3JpZXMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBBZ2UgcmF0aW5nIHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZEFnZVJhdGluZ3MgPSBbJ2FsbCcsICcxMysnLCAnMTgrJ107XG4gICAgaWYgKG1ldGFkYXRhLmFnZV9yYXRpbmcgJiYgIXZhbGlkQWdlUmF0aW5ncy5pbmNsdWRlcyhtZXRhZGF0YS5hZ2VfcmF0aW5nKSkge1xuICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCBhZ2VfcmF0aW5nICcke21ldGFkYXRhLmFnZV9yYXRpbmd9Jy4gU2hvdWxkIGJlIG9uZSBvZjogJHt2YWxpZEFnZVJhdGluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25hbCBmaWVsZCB3YXJuaW5nc1xuICAgIGlmICghbWV0YWRhdGEudHJpZ2dlcnMgfHwgbWV0YWRhdGEudHJpZ2dlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiTm8gdHJpZ2dlciBrZXl3b3JkcyBkZWZpbmVkIC0gdXNlcnMgbWF5IGhhdmUgZGlmZmljdWx0eSBmaW5kaW5nIHRoaXMgcGVyc29uYVwiKTtcbiAgICB9XG4gICAgaWYgKCFtZXRhZGF0YS52ZXJzaW9uKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiTm8gdmVyc2lvbiBzcGVjaWZpZWQgLSBkZWZhdWx0aW5nIHRvICcxLjAnXCIpO1xuICAgIH1cbiAgICBpZiAoIW1ldGFkYXRhLnVuaXF1ZV9pZCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIk5vIHVuaXF1ZV9pZCAtIG9uZSB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5XCIpO1xuICAgIH1cblxuICAgIC8vIENvbnRlbnQgcXVhbGl0eSBjaGVja3NcbiAgICBpZiAocGVyc29uYS5jb250ZW50Lmxlbmd0aCA+IDUwMDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJQZXJzb25hIGNvbnRlbnQgaXMgdmVyeSBsb25nIC0gY29uc2lkZXIgYnJlYWtpbmcgaXQgaW50byBzZWN0aW9uc1wiKTtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhLm5hbWUgJiYgbWV0YWRhdGEubmFtZS5sZW5ndGggPiA1MCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIlBlcnNvbmEgbmFtZSBpcyB2ZXJ5IGxvbmcgLSBjb25zaWRlciBzaG9ydGVuaW5nIGZvciBiZXR0ZXIgZGlzcGxheVwiKTtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhLmRlc2NyaXB0aW9uICYmIG1ldGFkYXRhLmRlc2NyaXB0aW9uLmxlbmd0aCA+IDIwMCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIkRlc2NyaXB0aW9uIGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIGtlZXBpbmcgaXQgdW5kZXIgMjAwIGNoYXJhY3RlcnNcIik7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgdmFsaWRhdGlvbiByZXBvcnRcbiAgICBsZXQgcmVwb3J0ID0gYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiyAqKlZhbGlkYXRpb24gUmVwb3J0OiAke3BlcnNvbmEubWV0YWRhdGEubmFtZX0qKlxcblxcbmA7XG4gICAgXG4gICAgaWYgKGlzc3Vlcy5sZW5ndGggPT09IDAgJiYgd2FybmluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXBvcnQgKz0gYOKchSAqKkFsbCBDaGVja3MgUGFzc2VkISoqXFxuXFxuYCArXG4gICAgICAgIGDwn46tICoqUGVyc29uYToqKiAke21ldGFkYXRhLm5hbWV9XFxuYCArXG4gICAgICAgIGDwn5OBICoqQ2F0ZWdvcnk6KiogJHttZXRhZGF0YS5jYXRlZ29yeSB8fCAnZ2VuZXJhbCd9XFxuYCArXG4gICAgICAgIGDwn5OKICoqVmVyc2lvbjoqKiAke21ldGFkYXRhLnZlcnNpb24gfHwgJzEuMCd9XFxuYCArXG4gICAgICAgIGDwn5OdICoqQ29udGVudCBMZW5ndGg6KiogJHtwZXJzb25hLmNvbnRlbnQubGVuZ3RofSBjaGFyYWN0ZXJzXFxuYCArXG4gICAgICAgIGDwn5SXICoqVHJpZ2dlcnM6KiogJHttZXRhZGF0YS50cmlnZ2Vycz8ubGVuZ3RoIHx8IDB9IGtleXdvcmRzXFxuXFxuYCArXG4gICAgICAgIGBUaGlzIHBlcnNvbmEgbWVldHMgYWxsIHZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIGFuZCBpcyByZWFkeSBmb3IgdXNlIWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc3N1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXBvcnQgKz0gYOKdjCAqKklzc3VlcyBGb3VuZCAoJHtpc3N1ZXMubGVuZ3RofSk6KipcXG5gO1xuICAgICAgICBpc3N1ZXMuZm9yRWFjaCgoaXNzdWUsIGkpID0+IHtcbiAgICAgICAgICByZXBvcnQgKz0gYCAgICR7aSArIDF9LiAke2lzc3VlfVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG5cbiAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg4pqg77iPICoqV2FybmluZ3MgKCR7d2FybmluZ3MubGVuZ3RofSk6KipcXG5gO1xuICAgICAgICB3YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nLCBpKSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICAke2kgKyAxfS4gJHt3YXJuaW5nfVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc3N1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXBvcnQgKz0gYCoqUmVjb21tZW5kYXRpb246KiogRml4IHRoZSBpc3N1ZXMgYWJvdmUgYmVmb3JlIHVzaW5nIHRoaXMgcGVyc29uYS5cXG5gO1xuICAgICAgICByZXBvcnQgKz0gYFVzZSBcXGBlZGl0X3BlcnNvbmEgXCIke3BlcnNvbmEubWV0YWRhdGEubmFtZX1cIiBcImZpZWxkXCIgXCJ2YWx1ZVwiXFxgIHRvIG1ha2UgY29ycmVjdGlvbnMuYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcG9ydCArPSBgKipTdGF0dXM6KiogUGVyc29uYSBpcyBmdW5jdGlvbmFsIGJ1dCBjb3VsZCBiZSBpbXByb3ZlZC5cXG5gO1xuICAgICAgICByZXBvcnQgKz0gYEFkZHJlc3Mgd2FybmluZ3MgYWJvdmUgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2UuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogcmVwb3J0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gcmV0cnlOZXR3b3JrT3BlcmF0aW9uIGlzIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZUNoZWNrZXJcblxuICAvLyBBdXRvLXVwZGF0ZSBtYW5hZ2VtZW50IHRvb2xzXG4gIGFzeW5jIGNoZWNrRm9yVXBkYXRlcygpIHtcbiAgICBpZiAoIXRoaXMudXBkYXRlTWFuYWdlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpICsgXCLinYwgVXBkYXRlIGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSAoaW5pdGlhbGl6YXRpb24gZmFpbGVkKVwiIH1dXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IHRoaXMudXBkYXRlTWFuYWdlci5jaGVja0ZvclVwZGF0ZXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpICsgdGV4dCB9XVxuICAgIH07XG4gIH1cblxuICAvLyBVcGRhdGUgaGVscGVyIG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuICBhc3luYyB1cGRhdGVTZXJ2ZXIoY29uZmlybTogYm9vbGVhbikge1xuICAgIGlmICghY29uZmlybSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSArIFxuICAgICAgICAgICAgJ+KaoO+4jyAqKlVwZGF0ZSBDb25maXJtYXRpb24gUmVxdWlyZWQqKlxcblxcbicgK1xuICAgICAgICAgICAgJ1RvIHByb2NlZWQgd2l0aCB0aGUgdXBkYXRlLCB5b3UgbXVzdCBjb25maXJtOlxcbicgK1xuICAgICAgICAgICAgJ2B1cGRhdGVfc2VydmVyIHRydWVgXFxuXFxuJyArXG4gICAgICAgICAgICAnKipXaGF0IHdpbGwgaGFwcGVuOioqXFxuJyArXG4gICAgICAgICAgICAn4oCiIEJhY2t1cCBjdXJyZW50IHZlcnNpb25cXG4nICtcbiAgICAgICAgICAgICfigKIgUHVsbCBsYXRlc3QgY2hhbmdlcyBmcm9tIEdpdEh1YlxcbicgK1xuICAgICAgICAgICAgJ+KAoiBVcGRhdGUgZGVwZW5kZW5jaWVzXFxuJyArXG4gICAgICAgICAgICAn4oCiIFJlYnVpbGQgVHlwZVNjcmlwdFxcbicgK1xuICAgICAgICAgICAgJ+KAoiBSZXN0YXJ0IHNlcnZlciAod2lsbCBkaXNjb25uZWN0IHRlbXBvcmFyaWx5KVxcblxcbicgK1xuICAgICAgICAgICAgJyoqUHJlcmVxdWlzaXRlczoqKlxcbicgK1xuICAgICAgICAgICAgJ+KAoiBHaXQgcmVwb3NpdG9yeSBtdXN0IGJlIGNsZWFuIChubyB1bmNvbW1pdHRlZCBjaGFuZ2VzKVxcbicgK1xuICAgICAgICAgICAgJ+KAoiBOZXR3b3JrIGNvbm5lY3Rpb24gcmVxdWlyZWRcXG4nICtcbiAgICAgICAgICAgICfigKIgU3VmZmljaWVudCBkaXNrIHNwYWNlIGZvciBiYWNrdXAnXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy51cGRhdGVNYW5hZ2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyBcIuKdjCBVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBmYWlsZWQpXCIgfV1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgdGhpcy51cGRhdGVNYW5hZ2VyLnVwZGF0ZVNlcnZlcihjb25maXJtLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJvbGxiYWNrIGhlbHBlciBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cbiAgYXN5bmMgcm9sbGJhY2tVcGRhdGUoY29uZmlybTogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy51cGRhdGVNYW5hZ2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyBcIuKdjCBVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBmYWlsZWQpXCIgfV1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgdGhpcy51cGRhdGVNYW5hZ2VyLnJvbGxiYWNrVXBkYXRlKGNvbmZpcm0sIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gVmVyc2lvbiBhbmQgZ2l0IGluZm8gbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG4gIC8vIFN0YXR1cyBoZWxwZXIgbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG4gIGFzeW5jIGdldFNlcnZlclN0YXR1cygpIHtcbiAgICAvLyBBZGQgcGVyc29uYSBpbmZvcm1hdGlvbiB0byB0aGUgc3RhdHVzXG4gICAgY29uc3QgcGVyc29uYUluZm8gPSBgXG4qKvCfjq0gUGVyc29uYSBJbmZvcm1hdGlvbjoqKlxu4oCiICoqVG90YWwgUGVyc29uYXM6KiogJHt0aGlzLnBlcnNvbmFzLnNpemV9XG7igKIgKipBY3RpdmUgUGVyc29uYToqKiAke3RoaXMuYWN0aXZlUGVyc29uYSB8fCAnTm9uZSd9XG7igKIgKipVc2VyIElkZW50aXR5OioqICR7dGhpcy5jdXJyZW50VXNlciB8fCAnQW5vbnltb3VzJ31cbuKAoiAqKlBlcnNvbmFzIERpcmVjdG9yeToqKiAke3RoaXMucGVyc29uYXNEaXJ9YDtcbiAgICBcbiAgICBpZiAoIXRoaXMudXBkYXRlTWFuYWdlcikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFVwZGF0ZSBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgKGluaXRpYWxpemF0aW9uIGZhaWxlZClcXG5cXG4ke3BlcnNvbmFJbmZvfWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogZXJyb3JNZXNzYWdlIH1dXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IHRoaXMudXBkYXRlTWFuYWdlci5nZXRTZXJ2ZXJTdGF0dXModGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgIC8vIEluc2VydCBwZXJzb25hIGluZm8gaW50byB0aGUgc3RhdHVzIHRleHRcbiAgICBjb25zdCB1cGRhdGVkVGV4dCA9IHRleHQucmVwbGFjZSgnKipBdmFpbGFibGUgQ29tbWFuZHM6KionLCBwZXJzb25hSW5mbyArICdcXG5cXG4qKkF2YWlsYWJsZSBDb21tYW5kczoqKicpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogdXBkYXRlZFRleHQgfV1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY29udmVydFRvR2l0SW5zdGFsbGF0aW9uKHRhcmdldERpcj86IHN0cmluZywgY29uZmlybTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLnVwZGF0ZU1hbmFnZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSArIFwi4p2MIFVwZGF0ZSBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgKGluaXRpYWxpemF0aW9uIGZhaWxlZClcIiB9XVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy51cGRhdGVNYW5hZ2VyLmNvbnZlcnRUb0dpdEluc3RhbGxhdGlvbih0YXJnZXREaXIsIGNvbmZpcm0sIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHJlc3VsdC50ZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZlcnNpb24gYW5kIGRlcGVuZGVuY3kgbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3NcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIHRyeSB7XG4gICAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICAgIGlmIChjb25maWcuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmVuYWJsZWQgPSBjb25maWcuZW5hYmxlZDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc3R5bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZSA9IGNvbmZpZy5zdHlsZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuY3VzdG9tRm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgY3VzdG9tIGZvcm1hdCBiZWZvcmUgYXBwbHlpbmdcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlQ3VzdG9tRm9ybWF0KGNvbmZpZy5jdXN0b21Gb3JtYXQpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEludmFsaWQgY3VzdG9tIGZvcm1hdDogJHt2YWxpZGF0aW9uLmVycm9yfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID0gY29uZmlnLmN1c3RvbUZvcm1hdDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zaG93VmVyc2lvbiA9IGNvbmZpZy5zaG93VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd0F1dGhvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dBdXRob3IgPSBjb25maWcuc2hvd0F1dGhvcjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd0NhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0NhdGVnb3J5ID0gY29uZmlnLnNob3dDYXRlZ29yeTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZW1vamkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5lbW9qaSA9IGNvbmZpZy5lbW9qaTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuYnJhY2tldFN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuYnJhY2tldFN0eWxlID0gY29uZmlnLmJyYWNrZXRTdHlsZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBleGFtcGxlIG9mIHdoYXQgdGhlIGluZGljYXRvciB3b3VsZCBsb29rIGxpa2VcbiAgICAgIGxldCBleGFtcGxlSW5kaWNhdG9yID0gXCJcIjtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHRoaXMuYWN0aXZlUGVyc29uYSk7XG4gICAgICAgIGlmIChwZXJzb25hKSB7XG4gICAgICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNob3cgZXhhbXBsZSB3aXRoIHNhbXBsZSBkYXRhXG4gICAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICBuYW1lOiBcIkV4YW1wbGUgUGVyc29uYVwiLFxuICAgICAgICAgIHZlcnNpb246IFwiMS4wXCIsXG4gICAgICAgICAgYXV0aG9yOiBcIkB1c2VybmFtZVwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImNyZWF0aXZlXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSBJbmRpY2F0b3IgY29uZmlndXJhdGlvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseSFcblxuQ3VycmVudCBzZXR0aW5nczpcbi0gRW5hYmxlZDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbmFibGVkfVxuLSBTdHlsZTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZX1cbi0gU2hvdyBWZXJzaW9uOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dWZXJzaW9ufVxuLSBTaG93IEF1dGhvcjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93QXV0aG9yfVxuLSBTaG93IENhdGVnb3J5OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dDYXRlZ29yeX1cbi0gRW1vamk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW1vaml9XG4tIEJyYWNrZXRzOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmJyYWNrZXRTdHlsZX1cbiR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID8gYC0gQ3VzdG9tIEZvcm1hdDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXR9YCA6ICcnfVxuXG5FeGFtcGxlIGluZGljYXRvcjogJHtleGFtcGxlSW5kaWNhdG9yIHx8IFwiKG5vbmUgLSBpbmRpY2F0b3JzIGRpc2FibGVkKVwifVxuXG5Ob3RlOiBDb25maWd1cmF0aW9uIGlzIHRlbXBvcmFyeSBmb3IgdGhpcyBzZXNzaW9uLiBUbyBtYWtlIHBlcm1hbmVudCwgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlczpcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTkFCTEVEPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TVFlMRT1mdWxsL21pbmltYWwvY29tcGFjdC9jdXN0b21cbi0gRE9MTEhPVVNFX0lORElDQVRPUl9GT1JNQVQ9XCJjdXN0b20gZm9ybWF0IHRlbXBsYXRlXCJcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX1ZFUlNJT049dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfQVVUSE9SPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX0NBVEVHT1JZPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTU9KST3wn46tXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfQlJBQ0tFVFM9c3F1YXJlL3JvdW5kL2N1cmx5L2FuZ2xlL25vbmVgXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3IgY29uZmlndXJpbmcgaW5kaWNhdG9yOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyBnZXRJbmRpY2F0b3JDb25maWcoKSB7XG4gICAgLy8gU2hvdyBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGV4YW1wbGVcbiAgICBsZXQgZXhhbXBsZUluZGljYXRvciA9IFwiXCI7XG4gICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYSkge1xuICAgICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHRoaXMuYWN0aXZlUGVyc29uYSk7XG4gICAgICBpZiAocGVyc29uYSkge1xuICAgICAgICBleGFtcGxlSW5kaWNhdG9yID0gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHZlcnNpb246IHBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgICBhdXRob3I6IHBlcnNvbmEubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICAgIGNhdGVnb3J5OiBwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTaG93IGV4YW1wbGUgd2l0aCBzYW1wbGUgZGF0YVxuICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICBuYW1lOiBcIkV4YW1wbGUgUGVyc29uYVwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMFwiLFxuICAgICAgICBhdXRob3I6IFwiQHVzZXJuYW1lXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImNyZWF0aXZlXCJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5OKIEN1cnJlbnQgSW5kaWNhdG9yIENvbmZpZ3VyYXRpb246XG5cblNldHRpbmdzOlxuLSBFbmFibGVkOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmVuYWJsZWR9XG4tIFN0eWxlOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnN0eWxlfVxuLSBTaG93IFZlcnNpb246ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd1ZlcnNpb259XG4tIFNob3cgQXV0aG9yOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dBdXRob3J9XG4tIFNob3cgQ2F0ZWdvcnk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0NhdGVnb3J5fVxuLSBFbW9qaTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbW9qaX1cbi0gQnJhY2tldHM6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuYnJhY2tldFN0eWxlfVxuLSBTZXBhcmF0b3I6IFwiJHt0aGlzLmluZGljYXRvckNvbmZpZy5zZXBhcmF0b3J9XCJcbiR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID8gYC0gQ3VzdG9tIEZvcm1hdDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXR9YCA6ICcnfVxuXG5BdmFpbGFibGUgc3R5bGVzOlxuLSBmdWxsOiBb8J+OrSBQZXJzb25hIE5hbWUgdjEuMCBieSBAYXV0aG9yXVxuLSBtaW5pbWFsOiDwn46tIFBlcnNvbmEgTmFtZVxuLSBjb21wYWN0OiBbUGVyc29uYSBOYW1lIHYxLjBdXG4tIGN1c3RvbTogVXNlIHlvdXIgb3duIGZvcm1hdCB3aXRoIHBsYWNlaG9sZGVyc1xuXG5FeGFtcGxlIHdpdGggY3VycmVudCBzZXR0aW5nczogJHtleGFtcGxlSW5kaWNhdG9yIHx8IFwiKG5vbmUgLSBpbmRpY2F0b3JzIGRpc2FibGVkKVwifVxuXG5QbGFjZWhvbGRlcnMgZm9yIGN1c3RvbSBmb3JtYXQ6XG4tIHtlbW9qaX0gLSBUaGUgY29uZmlndXJlZCBlbW9qaVxuLSB7bmFtZX0gLSBQZXJzb25hIG5hbWVcbi0ge3ZlcnNpb259IC0gUGVyc29uYSB2ZXJzaW9uXG4tIHthdXRob3J9IC0gUGVyc29uYSBhdXRob3Jcbi0ge2NhdGVnb3J5fSAtIFBlcnNvbmEgY2F0ZWdvcnlgXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG5cblxuICAvKipcbiAgICogRXhwb3J0IGEgc2luZ2xlIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGV4cG9ydFBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgYSBzaW5nbGUgbG9va3VwIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hTmFtZSk7XG4gICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgLy8gVHJ5IGJ5IGZpbGVuYW1lXG4gICAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09PSBwZXJzb25hTmFtZSk7XG4gICAgICAgIGlmICghcGVyc29uYSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFBlcnNvbmEgbm90IGZvdW5kOiAke3BlcnNvbmFOYW1lfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBvcnREYXRhID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZXhwb3J0UGVyc29uYShwZXJzb25hKTtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLnRvQmFzZTY0KGV4cG9ydERhdGEpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZm9ybWF0RXhwb3J0UmVzdWx0KHBlcnNvbmEsIGJhc2U2NCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtyZXN1bHR9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXhwb3J0IGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYWxsIHBlcnNvbmFzXG4gICAqL1xuICBhc3luYyBleHBvcnRBbGxQZXJzb25hcyhpbmNsdWRlRGVmYXVsdHMgPSB0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlcnNvbmFzQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpO1xuICAgICAgY29uc3QgYnVuZGxlID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZXhwb3J0QnVuZGxlKHBlcnNvbmFzQXJyYXksIGluY2x1ZGVEZWZhdWx0cyk7XG4gICAgICBjb25zdCBiYXNlNjQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci50b0Jhc2U2NChidW5kbGUpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIuZm9ybWF0QnVuZGxlUmVzdWx0KGJ1bmRsZSwgYmFzZTY0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdH1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFeHBvcnQgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGltcG9ydFBlcnNvbmEoc291cmNlOiBzdHJpbmcsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5wZXJzb25hSW1wb3J0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW1wb3J0IGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSAoaW5pdGlhbGl6YXRpb24gaW4gcHJvZ3Jlc3MpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFJbXBvcnRlci5pbXBvcnRQZXJzb25hKHNvdXJjZSwgdGhpcy5wZXJzb25hcywgb3ZlcndyaXRlKTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIC8vIFJlbG9hZCBwZXJzb25hcyB0byBpbmNsdWRlIHRoZSBuZXcgb25lXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAke3Jlc3VsdC5tZXNzYWdlfVxcblxcblBlcnNvbmEgXCIke3Jlc3VsdC5wZXJzb25hPy5tZXRhZGF0YS5uYW1lfVwiIGlzIG5vdyBhdmFpbGFibGUuXFxuVG90YWwgcGVyc29uYXM6ICR7dGhpcy5wZXJzb25hcy5zaXplfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgJHtyZXN1bHQubWVzc2FnZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW1wb3J0IGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSBhIHBlcnNvbmEgdmlhIFVSTFxuICAgKi9cbiAgYXN5bmMgc2hhcmVQZXJzb25hKHBlcnNvbmFOYW1lOiBzdHJpbmcsIGV4cGlyeURheXMgPSA3KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IHZhbGlkYXRlZFBlcnNvbmFOYW1lID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihwZXJzb25hTmFtZSk7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRFeHBpcnlEYXlzID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVFeHBpcnlEYXlzKGV4cGlyeURheXMpO1xuICAgICAgXG4gICAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodmFsaWRhdGVkUGVyc29uYU5hbWUpO1xuICAgICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAgIC8vIFRyeSBieSBmaWxlbmFtZVxuICAgICAgICBjb25zdCBieUZpbGVuYW1lID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PT0gdmFsaWRhdGVkUGVyc29uYU5hbWUpO1xuICAgICAgICBpZiAoIWJ5RmlsZW5hbWUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBQZXJzb25hIG5vdCBmb3VuZDogJHt2YWxpZGF0ZWRQZXJzb25hTmFtZX1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcGVyc29uYU5hbWUgPSBieUZpbGVuYW1lLm1ldGFkYXRhLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYVNoYXJlci5zaGFyZVBlcnNvbmEodGhpcy5wZXJzb25hcy5nZXQocGVyc29uYU5hbWUpISwgdmFsaWRhdGVkRXhwaXJ5RGF5cyk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtyZXN1bHQubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBTaGFyZSBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGZyb20gYSBzaGFyZWQgVVJMXG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tVXJsKHVybDogc3RyaW5nLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBVUkxcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFVybCA9IE1DUElucHV0VmFsaWRhdG9yLnZhbGlkYXRlSW1wb3J0VXJsKHVybCk7XG4gICAgICBcbiAgICAgIGNvbnN0IGZldGNoUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hU2hhcmVyLmltcG9ydEZyb21VcmwodmFsaWRhdGVkVXJsKTtcbiAgICAgIFxuICAgICAgaWYgKCFmZXRjaFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICR7ZmV0Y2hSZXN1bHQubWVzc2FnZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gSW1wb3J0IHRoZSBmZXRjaGVkIGRhdGFcbiAgICAgIGlmICghdGhpcy5wZXJzb25hSW1wb3J0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW1wb3J0IGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSAoaW5pdGlhbGl6YXRpb24gaW4gcHJvZ3Jlc3MpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBpbXBvcnRSZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFJbXBvcnRlci5pbXBvcnRQZXJzb25hKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShmZXRjaFJlc3VsdC5kYXRhKSxcbiAgICAgICAgdGhpcy5wZXJzb25hcyxcbiAgICAgICAgb3ZlcndyaXRlXG4gICAgICApO1xuXG4gICAgICBpZiAoaW1wb3J0UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSBTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgZnJvbSBVUkwhXFxuXFxuJHtpbXBvcnRSZXN1bHQubWVzc2FnZX1cXG5Ub3RhbCBwZXJzb25hczogJHt0aGlzLnBlcnNvbmFzLnNpemV9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAke2ltcG9ydFJlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZnJvbSBVUkwgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBTdGRpb1NlcnZlclRyYW5zcG9ydCgpO1xuICAgIGxvZ2dlci5pbmZvKFwiU3RhcnRpbmcgRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcbiAgICBcbiAgICAvLyBTZXQgdXAgZ3JhY2VmdWwgc2h1dGRvd24gaGFuZGxlcnNcbiAgICBjb25zdCBjbGVhbnVwID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oXCJTaHV0dGluZyBkb3duIERvbGxob3VzZU1DUCBzZXJ2ZXIuLi5cIik7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENsZWFuIHVwIEdpdEh1YiBhdXRoIG1hbmFnZXJcbiAgICAgICAgaWYgKHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyLmNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYW4gdXAgYW55IG90aGVyIHJlc291cmNlc1xuICAgICAgICBpZiAodGhpcy51cGRhdGVNYW5hZ2VyKSB7XG4gICAgICAgICAgLy8gVXBkYXRlTWFuYWdlciBtaWdodCBoYXZlIGFjdGl2ZSBvcGVyYXRpb25zIHRvb1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcIkNsZWFuaW5nIHVwIHVwZGF0ZSBtYW5hZ2VyLi4uXCIpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuaW5mbyhcIkNsZWFudXAgY29tcGxldGVkXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIGNsZWFudXBcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH07XG4gICAgXG4gICAgLy8gUmVnaXN0ZXIgc2h1dGRvd24gaGFuZGxlcnNcbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbignU0lHSFVQJywgY2xlYW51cCk7XG4gICAgXG4gICAgYXdhaXQgdGhpcy5zZXJ2ZXIuY29ubmVjdCh0cmFuc3BvcnQpO1xuICAgIC8vIE1hcmsgdGhhdCBNQ1AgaXMgbm93IGNvbm5lY3RlZCAtIG5vIG1vcmUgY29uc29sZSBvdXRwdXQgYWxsb3dlZFxuICAgIGxvZ2dlci5zZXRNQ1BDb25uZWN0ZWQoKTtcbiAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcnVubmluZyBvbiBzdGRpb1wiKTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgaXMgYWxyZWFkeSBhdCBjbGFzcyBkZWNsYXJhdGlvblxuXG4vLyBPbmx5IHN0YXJ0IHRoZSBzZXJ2ZXIgaWYgdGhpcyBmaWxlIGlzIGJlaW5nIHJ1biBkaXJlY3RseSAobm90IGltcG9ydGVkIGJ5IHRlc3RzKVxuLy8gSGFuZGxlIGRpZmZlcmVudCBleGVjdXRpb24gbWV0aG9kcyAoZGlyZWN0LCBucHgsIENMSSlcbmNvbnN0IGlzRGlyZWN0RXhlY3V0aW9uID0gaW1wb3J0Lm1ldGEudXJsID09PSBgZmlsZTovLyR7cHJvY2Vzcy5hcmd2WzFdfWA7XG5jb25zdCBpc05weEV4ZWN1dGlvbiA9IHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uaW5jbHVkZXMoJ25weCcpO1xuY29uc3QgaXNDbGlFeGVjdXRpb24gPSBwcm9jZXNzLmFyZ3ZbMV0/LmVuZHNXaXRoKCcvZG9sbGhvdXNlbWNwJykgfHwgcHJvY2Vzcy5hcmd2WzFdPy5lbmRzV2l0aCgnXFxcXGRvbGxob3VzZW1jcCcpO1xuY29uc3QgaXNUZXN0ID0gcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQ7XG5cbi8vIFByb2dyZXNzaXZlIHN0YXJ0dXAgd2l0aCByZXRyaWVzIGZvciBucHgvQ0xJIGV4ZWN1dGlvblxuY29uc3QgU1RBUlRVUF9ERUxBWVMgPSBbMTAsIDUwLCAxMDAsIDIwMF07IC8vIFByb2dyZXNzaXZlIGRlbGF5cyBpbiBtc1xuXG5hc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcldpdGhSZXRyeShyZXRyaWVzTGVmdCA9IFNUQVJUVVBfREVMQVlTLmxlbmd0aCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNlcnZlciA9IG5ldyBEb2xsaG91c2VNQ1BTZXJ2ZXIoKTtcbiAgICBhd2FpdCBzZXJ2ZXIucnVuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHJldHJpZXNMZWZ0ID4gMCAmJiAoaXNOcHhFeGVjdXRpb24gfHwgaXNDbGlFeGVjdXRpb24pKSB7XG4gICAgICAvLyBUcnkgYWdhaW4gd2l0aCBhIGxvbmdlciBkZWxheVxuICAgICAgY29uc3QgZGVsYXlJbmRleCA9IFNUQVJUVVBfREVMQVlTLmxlbmd0aCAtIHJldHJpZXNMZWZ0O1xuICAgICAgY29uc3QgZGVsYXkgPSBTVEFSVFVQX0RFTEFZU1tkZWxheUluZGV4XTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgcmV0dXJuIHN0YXJ0U2VydmVyV2l0aFJldHJ5KHJldHJpZXNMZWZ0IC0gMSk7XG4gICAgfVxuICAgIC8vIEZpbmFsIGZhaWx1cmUgLSBtaW5pbWFsIGVycm9yIG1lc3NhZ2UgZm9yIHNlY3VyaXR5XG4gICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZFwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuaWYgKChpc0RpcmVjdEV4ZWN1dGlvbiB8fCBpc05weEV4ZWN1dGlvbiB8fCBpc0NsaUV4ZWN1dGlvbikgJiYgIWlzVGVzdCkge1xuICBzdGFydFNlcnZlcldpdGhSZXRyeSgpLmNhdGNoKCgpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gU2VydmVyIHN0YXJ0dXAgZmFpbGVkXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59Il19