@cartanova/qgrid-cli 2.10.10 → 2.11.1

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 (302) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -70
  24. package/bundle/dist/application/request-log/request-log.types.js +1 -1
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +32 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +1 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +1 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/server-bootstrap.js +4 -2
  41. package/bundle/dist/server-error-handler.js +1 -1
  42. package/bundle/dist/sonamu.config.js +37 -8
  43. package/bundle/dist/startup-migrations.js +17 -7
  44. package/bundle/dist/testing/global.js +1 -1
  45. package/bundle/dist/testing/schema-bench.js +0 -0
  46. package/bundle/dist/testing/test-database-name.js +1 -1
  47. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  49. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  50. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  51. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  52. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  53. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  54. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  55. package/bundle/dist/utils/providers/common/effort.js +3 -3
  56. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  57. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  58. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  59. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  60. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  61. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  62. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  63. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  64. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  65. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  66. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  67. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  68. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  69. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  70. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  71. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  72. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  73. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  74. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  75. package/bundle/dist/utils/providers/grok/index.js +11 -0
  76. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  77. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  78. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  79. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  80. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  81. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  82. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  83. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  84. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  85. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  86. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  87. package/bundle/dist/utils/quiet-hours.js +1 -1
  88. package/bundle/dist/utils/slack-notify.js +14 -8
  89. package/bundle/dist/utils/subset-loaders.js +4 -5
  90. package/bundle/src/application/monit/log-buffer.ts +23 -9
  91. package/bundle/src/application/monit/monit.frame.ts +22 -5
  92. package/bundle/src/application/monit/monit.types.ts +6 -0
  93. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  94. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  95. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  96. package/bundle/src/application/qgrid/oauth.ts +51 -15
  97. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  98. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  99. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
  101. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  103. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  104. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  105. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  106. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  107. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  108. package/bundle/src/application/qgrid/token-death.ts +4 -0
  109. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  110. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  111. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  112. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  113. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  114. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  115. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  116. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  117. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  118. package/bundle/src/application/request-log/request-log.model.ts +277 -146
  119. package/bundle/src/application/request-log/request-log.types.ts +6 -0
  120. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  121. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  122. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  123. package/bundle/src/application/setting/setting.constant.ts +9 -0
  124. package/bundle/src/application/setting/setting.model.ts +12 -2
  125. package/bundle/src/application/setting/setting.store.ts +5 -1
  126. package/bundle/src/application/setting/setting.types.ts +8 -0
  127. package/bundle/src/application/sonamu.generated.http +133 -0
  128. package/bundle/src/application/sonamu.generated.sso.ts +2 -0
  129. package/bundle/src/application/sonamu.generated.ts +15 -0
  130. package/bundle/src/application/token/token.identity.test.ts +20 -0
  131. package/bundle/src/application/token/token.model.ts +66 -7
  132. package/bundle/src/application/token/token.types.ts +24 -1
  133. package/bundle/src/i18n/en.ts +19 -0
  134. package/bundle/src/i18n/ko.ts +21 -0
  135. package/bundle/src/i18n/sd.generated.ts +23 -2
  136. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  137. package/bundle/src/server-bootstrap.ts +4 -2
  138. package/bundle/src/server-error-handler.ts +1 -0
  139. package/bundle/src/sonamu.config.ts +69 -7
  140. package/bundle/src/startup-migrations.ts +27 -9
  141. package/bundle/src/testing/global.ts +20 -0
  142. package/bundle/src/testing/schema-bench.ts +105 -30
  143. package/bundle/src/testing/test-database-name.ts +2 -0
  144. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  145. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  146. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  147. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  148. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  149. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  150. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  151. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  152. package/bundle/src/utils/providers/common/effort.ts +9 -2
  153. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  154. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  155. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  156. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  157. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  158. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  159. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  160. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  161. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  162. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  163. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  164. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  165. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  166. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  167. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  168. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  169. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  170. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  171. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  172. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  173. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  174. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  175. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  176. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  177. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  178. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  179. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  180. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  181. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  182. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  183. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  184. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  185. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  186. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  187. package/bundle/src/utils/providers/grok/index.ts +20 -0
  188. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  189. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  190. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  191. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  192. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  193. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  194. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  195. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  196. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  197. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  198. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  199. package/bundle/src/utils/quiet-hours.ts +12 -1
  200. package/bundle/src/utils/slack-notify.ts +44 -13
  201. package/bundle/src/utils/subset-loaders.ts +7 -7
  202. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  203. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  204. package/bundle/web-dist/client/assets/index-C96h3feE.js +32 -0
  205. package/bundle/web-dist/client/assets/logs-DBM6U0QD.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BBjXa7vB.js +1 -0
  207. package/bundle/web-dist/client/assets/routes-Crz_PQzi.js +5 -0
  208. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-B5lc3aIC.js} +5 -5
  209. package/bundle/web-dist/client/assets/settings-Cdwm3OBB.js +1 -0
  210. package/bundle/web-dist/client/assets/show-DBUhALT1.js +2 -0
  211. package/bundle/web-dist/client/assets/tokens-CVQAVJTo.js +1 -0
  212. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  213. package/bundle/web-dist/client/assets/use-oauth-login-flow-BfxYI4Oh.js +1 -0
  214. package/bundle/web-dist/client/assets/use-update-token-mutation-qKBC2sn7.js +1 -0
  215. package/bundle/web-dist/client/assets/{vendor-tanstack-DJRQAbrY.js → vendor-tanstack-DRPs09ai.js} +1 -1
  216. package/bundle/web-dist/client/index.html +5 -5
  217. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  218. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-AKiHfZWp.js} +129 -2
  219. package/bundle/web-dist/server/assets/{logs-BMyR98rU.js → logs-B7QmGJq3.js} +18 -14
  220. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-DFt7x3bh.js} +13 -12
  221. package/bundle/web-dist/server/assets/{plus-BZ9I0VgC.js → plus-DaYQRpBt.js} +1 -1
  222. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-Cv23mm1K.js} +2 -129
  223. package/bundle/web-dist/server/assets/{refresh-cw-CztCFis-.js → refresh-cw-BpXNsAy-.js} +1 -1
  224. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-eHE6YbaF.js} +1 -1
  225. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-_Y-PJfgO.js} +110 -39
  226. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-CMJ8AHbO.js} +582 -172
  227. package/bundle/web-dist/server/assets/{settings-CBUZ47Xx.js → settings-JwJKxn2e.js} +14 -14
  228. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-BEv6z1v_.js} +90 -60
  229. package/bundle/web-dist/server/assets/{tokens-DxrBW512.js → tokens-CNT4mI-f.js} +162 -50
  230. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  231. package/bundle/web-dist/server/assets/use-oauth-login-flow-jkAkT3X6.js +2345 -0
  232. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-Sm6kh02m.js} +1 -1
  233. package/bundle/web-dist/server/entry-server.generated.js +1644 -21655
  234. package/dist/cli.js +9 -9
  235. package/package.json +4 -11
  236. package/postinstall.mjs +12 -0
  237. package/skills/qgrid/SKILL.md +1 -0
  238. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  239. package/skills/qgrid/references/decision-rationale.md +23 -0
  240. package/skills/qgrid/references/grok-runtime.md +89 -0
  241. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  242. package/skills/qgrid/references/repo-map.md +10 -0
  243. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  244. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  245. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  246. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  247. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  248. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  249. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  250. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  251. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  252. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  253. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  254. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  255. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  262. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  263. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  264. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  265. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  266. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  269. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  270. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  271. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  272. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  273. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  274. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  275. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  276. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  277. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  278. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  279. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  280. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  281. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  282. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  283. package/bundle/dist/testing/setup-mocks.js +0 -16
  284. package/bundle/src/testing/setup-mocks.ts +0 -44
  285. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  286. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  287. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  288. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  289. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  290. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  291. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  292. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  293. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  294. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  295. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  296. package/dist/cli.d.ts +0 -10
  297. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  298. /package/bundle/web-dist/client/assets/{plus-B62CuqT8.js → plus-BsQdY7PS.js} +0 -0
  299. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  300. /package/bundle/web-dist/client/assets/{refresh-cw-NNcU0Cmq.js → refresh-cw-D9IUmT23.js} +0 -0
  301. /package/bundle/web-dist/client/assets/{request-model-CojtinqK.js → request-model-Bpp_rkK8.js} +0 -0
  302. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,1265 +0,0 @@
1
- //#region ../../node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js
2
- let SOURCEMAPPING_URL = "sourceMa";
3
- SOURCEMAPPING_URL += "ppingURL";
4
- const isWindows = typeof process < "u" && process.platform === "win32";
5
- /**
6
- * Undo {@link wrapId}'s `/@id/` and null byte replacements.
7
- */
8
- function unwrapId(id) {
9
- return id.startsWith("/@id/") ? id.slice(5).replace("__x00__", "\0") : id;
10
- }
11
- const windowsSlashRE = /\\/g;
12
- function slash(p) {
13
- return p.replace(windowsSlashRE, "/");
14
- }
15
- const postfixRE = /[?#].*$/;
16
- function cleanUrl(url) {
17
- return url.replace(postfixRE, "");
18
- }
19
- function isPrimitive(value) {
20
- return !value || typeof value != "object" && typeof value != "function";
21
- }
22
- const AsyncFunction = async function() {}.constructor;
23
- let asyncFunctionDeclarationPaddingLineCount;
24
- function getAsyncFunctionDeclarationPaddingLineCount() {
25
- if (asyncFunctionDeclarationPaddingLineCount === void 0) {
26
- let body = "/*code*/", source = new AsyncFunction("a", "b", body).toString();
27
- asyncFunctionDeclarationPaddingLineCount = source.slice(0, source.indexOf(body)).split("\n").length - 1;
28
- }
29
- return asyncFunctionDeclarationPaddingLineCount;
30
- }
31
- function promiseWithResolvers() {
32
- let resolve, reject;
33
- return {
34
- promise: new Promise((_resolve, _reject) => {
35
- resolve = _resolve, reject = _reject;
36
- }),
37
- resolve,
38
- reject
39
- };
40
- }
41
- const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
42
- function normalizeWindowsPath(input = "") {
43
- return input && input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
44
- }
45
- const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
46
- const _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
47
- function cwd() {
48
- return typeof process < "u" && typeof process.cwd == "function" ? process.cwd().replace(/\\/g, "/") : "/";
49
- }
50
- const resolve = function(...arguments_) {
51
- arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
52
- let resolvedPath = "", resolvedAbsolute = !1;
53
- for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
54
- let path = index >= 0 ? arguments_[index] : cwd();
55
- !path || path.length === 0 || (resolvedPath = `${path}/${resolvedPath}`, resolvedAbsolute = isAbsolute(path));
56
- }
57
- return resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute), resolvedAbsolute && !isAbsolute(resolvedPath) ? `/${resolvedPath}` : resolvedPath.length > 0 ? resolvedPath : ".";
58
- };
59
- function normalizeString(path, allowAboveRoot) {
60
- let res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, char = null;
61
- for (let index = 0; index <= path.length; ++index) {
62
- if (index < path.length) char = path[index];
63
- else if (char === "/") break;
64
- else char = "/";
65
- if (char === "/") {
66
- if (!(lastSlash === index - 1 || dots === 1)) if (dots === 2) {
67
- if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
68
- if (res.length > 2) {
69
- let lastSlashIndex = res.lastIndexOf("/");
70
- lastSlashIndex === -1 ? (res = "", lastSegmentLength = 0) : (res = res.slice(0, lastSlashIndex), lastSegmentLength = res.length - 1 - res.lastIndexOf("/")), lastSlash = index, dots = 0;
71
- continue;
72
- } else if (res.length > 0) {
73
- res = "", lastSegmentLength = 0, lastSlash = index, dots = 0;
74
- continue;
75
- }
76
- }
77
- allowAboveRoot && (res += res.length > 0 ? "/.." : "..", lastSegmentLength = 2);
78
- } else res.length > 0 ? res += `/${path.slice(lastSlash + 1, index)}` : res = path.slice(lastSlash + 1, index), lastSegmentLength = index - lastSlash - 1;
79
- lastSlash = index, dots = 0;
80
- } else char === "." && dots !== -1 ? ++dots : dots = -1;
81
- }
82
- return res;
83
- }
84
- const isAbsolute = function(p) {
85
- return _IS_ABSOLUTE_RE.test(p);
86
- };
87
- const dirname = function(p) {
88
- let segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
89
- return segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0]) && (segments[0] += "/"), segments.join("/") || (isAbsolute(p) ? "/" : ".");
90
- };
91
- const textDecoder = new TextDecoder();
92
- const decodeBase64 = typeof Buffer == "function" && typeof Buffer.from == "function" ? (base64) => Buffer.from(base64, "base64").toString("utf-8") : (base64) => textDecoder.decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
93
- const percentRegEx = /%/g;
94
- const backslashRegEx = /\\/g;
95
- const newlineRegEx = /\n/g;
96
- const carriageReturnRegEx = /\r/g;
97
- const tabRegEx = /\t/g;
98
- const questionRegex = /\?/g;
99
- const hashRegex = /#/g;
100
- function encodePathChars(filepath) {
101
- return filepath.indexOf("%") !== -1 && (filepath = filepath.replace(percentRegEx, "%25")), !isWindows && filepath.indexOf("\\") !== -1 && (filepath = filepath.replace(backslashRegEx, "%5C")), filepath.indexOf("\n") !== -1 && (filepath = filepath.replace(newlineRegEx, "%0A")), filepath.indexOf("\r") !== -1 && (filepath = filepath.replace(carriageReturnRegEx, "%0D")), filepath.indexOf(" ") !== -1 && (filepath = filepath.replace(tabRegEx, "%09")), filepath;
102
- }
103
- const posixDirname = dirname;
104
- const posixResolve = resolve;
105
- function posixPathToFileHref(posixPath) {
106
- let resolved = posixResolve(posixPath), filePathLast = posixPath.charCodeAt(posixPath.length - 1);
107
- return (filePathLast === 47 || isWindows && filePathLast === 92) && resolved[resolved.length - 1] !== "/" && (resolved += "/"), resolved = encodePathChars(resolved), resolved.indexOf("?") !== -1 && (resolved = resolved.replace(questionRegex, "%3F")), resolved.indexOf("#") !== -1 && (resolved = resolved.replace(hashRegex, "%23")), new URL(`file://${resolved}`).href;
108
- }
109
- function toWindowsPath(path) {
110
- return path.replace(/\//g, "\\");
111
- }
112
- var comma = 44;
113
- var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
114
- var intToChar = /* @__PURE__ */ new Uint8Array(64);
115
- var charToInt = /* @__PURE__ */ new Uint8Array(128);
116
- for (let i = 0; i < chars.length; i++) {
117
- let c = chars.charCodeAt(i);
118
- intToChar[i] = c, charToInt[c] = i;
119
- }
120
- function decodeInteger(reader, relative) {
121
- let value = 0, shift = 0, integer = 0;
122
- do
123
- integer = charToInt[reader.next()], value |= (integer & 31) << shift, shift += 5;
124
- while (integer & 32);
125
- let shouldNegate = value & 1;
126
- return value >>>= 1, shouldNegate && (value = -2147483648 | -value), relative + value;
127
- }
128
- function hasMoreVlq(reader, max) {
129
- return reader.pos >= max ? !1 : reader.peek() !== comma;
130
- }
131
- var StringReader = class {
132
- constructor(buffer) {
133
- this.pos = 0, this.buffer = buffer;
134
- }
135
- next() {
136
- return this.buffer.charCodeAt(this.pos++);
137
- }
138
- peek() {
139
- return this.buffer.charCodeAt(this.pos);
140
- }
141
- indexOf(char) {
142
- let { buffer, pos } = this, idx = buffer.indexOf(char, pos);
143
- return idx === -1 ? buffer.length : idx;
144
- }
145
- };
146
- function decode(mappings) {
147
- let { length } = mappings, reader = new StringReader(mappings), decoded = [], genColumn = 0, sourcesIndex = 0, sourceLine = 0, sourceColumn = 0, namesIndex = 0;
148
- do {
149
- let semi = reader.indexOf(";"), line = [], sorted = !0, lastCol = 0;
150
- for (genColumn = 0; reader.pos < semi;) {
151
- let seg;
152
- genColumn = decodeInteger(reader, genColumn), genColumn < lastCol && (sorted = !1), lastCol = genColumn, hasMoreVlq(reader, semi) ? (sourcesIndex = decodeInteger(reader, sourcesIndex), sourceLine = decodeInteger(reader, sourceLine), sourceColumn = decodeInteger(reader, sourceColumn), hasMoreVlq(reader, semi) ? (namesIndex = decodeInteger(reader, namesIndex), seg = [
153
- genColumn,
154
- sourcesIndex,
155
- sourceLine,
156
- sourceColumn,
157
- namesIndex
158
- ]) : seg = [
159
- genColumn,
160
- sourcesIndex,
161
- sourceLine,
162
- sourceColumn
163
- ]) : seg = [genColumn], line.push(seg), reader.pos++;
164
- }
165
- sorted || sort(line), decoded.push(line), reader.pos = semi + 1;
166
- } while (reader.pos <= length);
167
- return decoded;
168
- }
169
- function sort(line) {
170
- line.sort(sortComparator);
171
- }
172
- function sortComparator(a, b) {
173
- return a[0] - b[0];
174
- }
175
- var COLUMN = 0;
176
- var SOURCES_INDEX = 1;
177
- var SOURCE_LINE = 2;
178
- var SOURCE_COLUMN = 3;
179
- var NAMES_INDEX = 4;
180
- var found = !1;
181
- function binarySearch(haystack, needle, low, high) {
182
- for (; low <= high;) {
183
- let mid = low + (high - low >> 1), cmp = haystack[mid][COLUMN] - needle;
184
- if (cmp === 0) return found = !0, mid;
185
- cmp < 0 ? low = mid + 1 : high = mid - 1;
186
- }
187
- return found = !1, low - 1;
188
- }
189
- function upperBound(haystack, needle, index) {
190
- for (let i = index + 1; i < haystack.length && haystack[i][COLUMN] === needle; index = i++);
191
- return index;
192
- }
193
- function lowerBound(haystack, needle, index) {
194
- for (let i = index - 1; i >= 0 && haystack[i][COLUMN] === needle; index = i--);
195
- return index;
196
- }
197
- function memoizedBinarySearch(haystack, needle, state, key) {
198
- let { lastKey, lastNeedle, lastIndex } = state, low = 0, high = haystack.length - 1;
199
- if (key === lastKey) {
200
- if (needle === lastNeedle) return found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle, lastIndex;
201
- needle >= lastNeedle ? low = lastIndex === -1 ? 0 : lastIndex : high = lastIndex;
202
- }
203
- return state.lastKey = key, state.lastNeedle = needle, state.lastIndex = binarySearch(haystack, needle, low, high);
204
- }
205
- var LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)";
206
- var COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)";
207
- function cast(map) {
208
- return map;
209
- }
210
- function decodedMappings(map) {
211
- var _a;
212
- return (_a = cast(map))._decoded || (_a._decoded = decode(cast(map)._encoded));
213
- }
214
- function originalPositionFor(map, needle) {
215
- let { line, column, bias } = needle;
216
- if (line--, line < 0) throw Error(LINE_GTR_ZERO);
217
- if (column < 0) throw Error(COL_GTR_EQ_ZERO);
218
- let decoded = decodedMappings(map);
219
- if (line >= decoded.length) return OMapping(null, null, null, null);
220
- let segments = decoded[line], index = traceSegmentInternal(segments, cast(map)._decodedMemo, line, column, bias || 1);
221
- if (index === -1) return OMapping(null, null, null, null);
222
- let segment = segments[index];
223
- if (segment.length === 1) return OMapping(null, null, null, null);
224
- let { names, resolvedSources } = map;
225
- return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
226
- }
227
- function OMapping(source, line, column, name) {
228
- return {
229
- source,
230
- line,
231
- column,
232
- name
233
- };
234
- }
235
- function traceSegmentInternal(segments, memo, line, column, bias) {
236
- let index = memoizedBinarySearch(segments, column, memo, line);
237
- return found ? index = (bias === -1 ? upperBound : lowerBound)(segments, column, index) : bias === -1 && index++, index === -1 || index === segments.length ? -1 : index;
238
- }
239
- var DecodedMap = class {
240
- _encoded;
241
- _decoded;
242
- _decodedMemo;
243
- url;
244
- file;
245
- version;
246
- names = [];
247
- resolvedSources;
248
- constructor(map, from) {
249
- this.map = map;
250
- let { mappings, names, sources } = map;
251
- this.version = map.version, this.names = names || [], this._encoded = mappings || "", this._decodedMemo = memoizedState(), this.url = from, this.file = from;
252
- let originDir = posixDirname(from);
253
- this.resolvedSources = (sources || []).map((s) => posixResolve(originDir, s || ""));
254
- }
255
- };
256
- function memoizedState() {
257
- return {
258
- lastKey: -1,
259
- lastNeedle: -1,
260
- lastIndex: -1
261
- };
262
- }
263
- function getOriginalPosition(map, needle) {
264
- let result = originalPositionFor(map, needle);
265
- return result.column == null ? null : result;
266
- }
267
- const MODULE_RUNNER_SOURCEMAPPING_REGEXP = RegExp(`//# ${SOURCEMAPPING_URL}=data:application/json;base64,(.+)`);
268
- var EvaluatedModuleNode = class {
269
- importers = /* @__PURE__ */ new Set();
270
- imports = /* @__PURE__ */ new Set();
271
- evaluated = !1;
272
- meta;
273
- promise;
274
- exports;
275
- file;
276
- map;
277
- constructor(id, url) {
278
- this.id = id, this.url = url, this.file = cleanUrl(id);
279
- }
280
- };
281
- var EvaluatedModules = class {
282
- idToModuleMap = /* @__PURE__ */ new Map();
283
- fileToModulesMap = /* @__PURE__ */ new Map();
284
- urlToIdModuleMap = /* @__PURE__ */ new Map();
285
- /**
286
- * Returns the module node by the resolved module ID. Usually, module ID is
287
- * the file system path with query and/or hash. It can also be a virtual module.
288
- *
289
- * Module runner graph will have 1 to 1 mapping with the server module graph.
290
- * @param id Resolved module ID
291
- */
292
- getModuleById(id) {
293
- return this.idToModuleMap.get(id);
294
- }
295
- /**
296
- * Returns all modules related to the file system path. Different modules
297
- * might have different query parameters or hash, so it's possible to have
298
- * multiple modules for the same file.
299
- * @param file The file system path of the module
300
- */
301
- getModulesByFile(file) {
302
- return this.fileToModulesMap.get(file);
303
- }
304
- /**
305
- * Returns the module node by the URL that was used in the import statement.
306
- * Unlike module graph on the server, the URL is not resolved and is used as is.
307
- * @param url Server URL that was used in the import statement
308
- */
309
- getModuleByUrl(url) {
310
- return this.urlToIdModuleMap.get(unwrapId(url));
311
- }
312
- /**
313
- * Ensure that module is in the graph. If the module is already in the graph,
314
- * it will return the existing module node. Otherwise, it will create a new
315
- * module node and add it to the graph.
316
- * @param id Resolved module ID
317
- * @param url URL that was used in the import statement
318
- */
319
- ensureModule(id, url) {
320
- if (id = normalizeModuleId(id), this.idToModuleMap.has(id)) {
321
- let moduleNode = this.idToModuleMap.get(id);
322
- return this.urlToIdModuleMap.set(url, moduleNode), moduleNode;
323
- }
324
- let moduleNode = new EvaluatedModuleNode(id, url);
325
- this.idToModuleMap.set(id, moduleNode), this.urlToIdModuleMap.set(url, moduleNode);
326
- let fileModules = this.fileToModulesMap.get(moduleNode.file) || /* @__PURE__ */ new Set();
327
- return fileModules.add(moduleNode), this.fileToModulesMap.set(moduleNode.file, fileModules), moduleNode;
328
- }
329
- invalidateModule(node) {
330
- node.evaluated = !1, node.meta = void 0, node.map = void 0, node.promise = void 0, node.exports = void 0, node.imports.clear();
331
- }
332
- /**
333
- * Extracts the inlined source map from the module code and returns the decoded
334
- * source map. If the source map is not inlined, it will return null.
335
- * @param id Resolved module ID
336
- */
337
- getModuleSourceMapById(id) {
338
- let mod = this.getModuleById(id);
339
- if (!mod) return null;
340
- if (mod.map) return mod.map;
341
- if (!mod.meta || !("code" in mod.meta)) return null;
342
- let pattern = `//# ${SOURCEMAPPING_URL}=data:application/json;base64,`, lastIndex = mod.meta.code.lastIndexOf(pattern);
343
- if (lastIndex === -1) return null;
344
- let mapString = MODULE_RUNNER_SOURCEMAPPING_REGEXP.exec(mod.meta.code.slice(lastIndex))?.[1];
345
- return mapString ? (mod.map = new DecodedMap(JSON.parse(decodeBase64(mapString)), mod.file), mod.map) : null;
346
- }
347
- clear() {
348
- this.idToModuleMap.clear(), this.fileToModulesMap.clear(), this.urlToIdModuleMap.clear();
349
- }
350
- };
351
- const prefixedBuiltins = /* @__PURE__ */ new Set([
352
- "node:sea",
353
- "node:sqlite",
354
- "node:test",
355
- "node:test/reporters"
356
- ]);
357
- function normalizeModuleId(file) {
358
- return prefixedBuiltins.has(file) ? file : slash(file).replace(/^\/@fs\//, isWindows ? "" : "/").replace(/^node:/, "").replace(/^\/+/, "/").replace(/^file:\/+/, isWindows ? "" : "/");
359
- }
360
- var HMRContext = class {
361
- newListeners;
362
- constructor(hmrClient, ownerPath) {
363
- this.hmrClient = hmrClient, this.ownerPath = ownerPath, hmrClient.dataMap.has(ownerPath) || hmrClient.dataMap.set(ownerPath, {});
364
- let mod = hmrClient.hotModulesMap.get(ownerPath);
365
- mod && (mod.callbacks = []);
366
- let staleListeners = hmrClient.ctxToListenersMap.get(ownerPath);
367
- if (staleListeners) for (let [event, staleFns] of staleListeners) {
368
- let listeners = hmrClient.customListenersMap.get(event);
369
- listeners && hmrClient.customListenersMap.set(event, listeners.filter((l) => !staleFns.includes(l)));
370
- }
371
- this.newListeners = /* @__PURE__ */ new Map(), hmrClient.ctxToListenersMap.set(ownerPath, this.newListeners);
372
- }
373
- get data() {
374
- return this.hmrClient.dataMap.get(this.ownerPath);
375
- }
376
- accept(deps, callback) {
377
- if (typeof deps == "function" || !deps) this.acceptDeps([this.ownerPath], ([mod]) => deps?.(mod));
378
- else if (typeof deps == "string") this.acceptDeps([deps], ([mod]) => callback?.(mod));
379
- else if (Array.isArray(deps)) this.acceptDeps(deps, callback);
380
- else throw Error("invalid hot.accept() usage.");
381
- }
382
- acceptExports(_, callback) {
383
- this.acceptDeps([this.ownerPath], ([mod]) => callback?.(mod));
384
- }
385
- dispose(cb) {
386
- this.hmrClient.disposeMap.set(this.ownerPath, cb);
387
- }
388
- prune(cb) {
389
- this.hmrClient.pruneMap.set(this.ownerPath, cb);
390
- }
391
- decline() {}
392
- invalidate(message) {
393
- let firstInvalidatedBy = this.hmrClient.currentFirstInvalidatedBy ?? this.ownerPath;
394
- this.hmrClient.notifyListeners("vite:invalidate", {
395
- path: this.ownerPath,
396
- message,
397
- firstInvalidatedBy
398
- }), this.send("vite:invalidate", {
399
- path: this.ownerPath,
400
- message,
401
- firstInvalidatedBy
402
- }), this.hmrClient.logger.debug(`invalidate ${this.ownerPath}${message ? `: ${message}` : ""}`);
403
- }
404
- on(event, cb) {
405
- let addToMap = (map) => {
406
- let existing = map.get(event) || [];
407
- existing.push(cb), map.set(event, existing);
408
- };
409
- addToMap(this.hmrClient.customListenersMap), addToMap(this.newListeners);
410
- }
411
- off(event, cb) {
412
- let removeFromMap = (map) => {
413
- let existing = map.get(event);
414
- if (existing === void 0) return;
415
- let pruned = existing.filter((l) => l !== cb);
416
- if (pruned.length === 0) {
417
- map.delete(event);
418
- return;
419
- }
420
- map.set(event, pruned);
421
- };
422
- removeFromMap(this.hmrClient.customListenersMap), removeFromMap(this.newListeners);
423
- }
424
- send(event, data) {
425
- this.hmrClient.send({
426
- type: "custom",
427
- event,
428
- data
429
- });
430
- }
431
- acceptDeps(deps, callback = () => {}) {
432
- let mod = this.hmrClient.hotModulesMap.get(this.ownerPath) || {
433
- id: this.ownerPath,
434
- callbacks: []
435
- };
436
- mod.callbacks.push({
437
- deps,
438
- fn: callback
439
- }), this.hmrClient.hotModulesMap.set(this.ownerPath, mod);
440
- }
441
- };
442
- var HMRClient = class {
443
- hotModulesMap = /* @__PURE__ */ new Map();
444
- disposeMap = /* @__PURE__ */ new Map();
445
- pruneMap = /* @__PURE__ */ new Map();
446
- dataMap = /* @__PURE__ */ new Map();
447
- customListenersMap = /* @__PURE__ */ new Map();
448
- ctxToListenersMap = /* @__PURE__ */ new Map();
449
- currentFirstInvalidatedBy;
450
- constructor(logger, transport, importUpdatedModule) {
451
- this.logger = logger, this.transport = transport, this.importUpdatedModule = importUpdatedModule;
452
- }
453
- async notifyListeners(event, data) {
454
- let cbs = this.customListenersMap.get(event);
455
- cbs && await Promise.allSettled(cbs.map((cb) => cb(data)));
456
- }
457
- send(payload) {
458
- this.transport.send(payload).catch((err) => {
459
- this.logger.error(err);
460
- });
461
- }
462
- clear() {
463
- this.hotModulesMap.clear(), this.disposeMap.clear(), this.pruneMap.clear(), this.dataMap.clear(), this.customListenersMap.clear(), this.ctxToListenersMap.clear();
464
- }
465
- async prunePaths(paths) {
466
- await Promise.all(paths.map((path) => {
467
- let disposer = this.disposeMap.get(path);
468
- if (disposer) return disposer(this.dataMap.get(path));
469
- })), await Promise.all(paths.map((path) => {
470
- let fn = this.pruneMap.get(path);
471
- if (fn) return fn(this.dataMap.get(path));
472
- }));
473
- }
474
- warnFailedUpdate(err, path) {
475
- (!(err instanceof Error) || !err.message.includes("fetch")) && this.logger.error(err), this.logger.error(`Failed to reload ${path}. This could be due to syntax errors or importing non-existent modules. (see errors above)`);
476
- }
477
- updateQueue = [];
478
- pendingUpdateQueue = !1;
479
- /**
480
- * buffer multiple hot updates triggered by the same src change
481
- * so that they are invoked in the same order they were sent.
482
- * (otherwise the order may be inconsistent because of the http request round trip)
483
- */
484
- async queueUpdate(payload) {
485
- if (this.updateQueue.push(this.fetchUpdate(payload)), !this.pendingUpdateQueue) {
486
- this.pendingUpdateQueue = !0, await Promise.resolve(), this.pendingUpdateQueue = !1;
487
- let loading = [...this.updateQueue];
488
- this.updateQueue = [], (await Promise.all(loading)).forEach((fn) => fn && fn());
489
- }
490
- }
491
- async fetchUpdate(update) {
492
- let { path, acceptedPath, firstInvalidatedBy } = update, mod = this.hotModulesMap.get(path);
493
- if (!mod) return;
494
- let fetchedModule, isSelfUpdate = path === acceptedPath, qualifiedCallbacks = mod.callbacks.filter(({ deps }) => deps.includes(acceptedPath));
495
- if (isSelfUpdate || qualifiedCallbacks.length > 0) {
496
- let disposer = this.disposeMap.get(acceptedPath);
497
- disposer && await disposer(this.dataMap.get(acceptedPath));
498
- try {
499
- fetchedModule = await this.importUpdatedModule(update);
500
- } catch (e) {
501
- this.warnFailedUpdate(e, acceptedPath);
502
- }
503
- }
504
- return () => {
505
- try {
506
- this.currentFirstInvalidatedBy = firstInvalidatedBy;
507
- for (let { deps, fn } of qualifiedCallbacks) fn(deps.map((dep) => dep === acceptedPath ? fetchedModule : void 0));
508
- let loggedPath = isSelfUpdate ? path : `${acceptedPath} via ${path}`;
509
- this.logger.debug(`hot updated: ${loggedPath}`);
510
- } finally {
511
- this.currentFirstInvalidatedBy = void 0;
512
- }
513
- };
514
- }
515
- };
516
- /**
517
- * Vite converts `import { } from 'foo'` to `const _ = __vite_ssr_import__('foo')`.
518
- * Top-level imports and dynamic imports work slightly differently in Node.js.
519
- * This function normalizes the differences so it matches prod behaviour.
520
- */
521
- function analyzeImportedModDifference(mod, rawId, moduleType, metadata) {
522
- if (!metadata?.isDynamicImport && metadata?.importedNames?.length) {
523
- let missingBindings = metadata.importedNames.filter((s) => !(s in mod));
524
- if (missingBindings.length) {
525
- let lastBinding = missingBindings[missingBindings.length - 1];
526
- throw SyntaxError(moduleType === "module" ? `[vite] The requested module '${rawId}' does not provide an export named '${lastBinding}'` : `\
527
- [vite] Named export '${lastBinding}' not found. The requested module '${rawId}' is a CommonJS module, which may not support all module.exports as named exports.
528
- CommonJS modules can always be imported via the default export, for example using:
529
-
530
- import pkg from '${rawId}';
531
- const {${missingBindings.join(", ")}} = pkg;
532
- `);
533
- }
534
- }
535
- }
536
- let nanoid = (size = 21) => {
537
- let id = "", i = size | 0;
538
- for (; i--;) id += "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[Math.random() * 64 | 0];
539
- return id;
540
- };
541
- function reviveInvokeError(e) {
542
- let error = Error(e.message || "Unknown invoke error");
543
- return Object.assign(error, e, { runnerError: /* @__PURE__ */ Error("RunnerError") }), error;
544
- }
545
- const createInvokeableTransport = (transport) => {
546
- if (transport.invoke) return {
547
- ...transport,
548
- async invoke(name, data) {
549
- let result = await transport.invoke({
550
- type: "custom",
551
- event: "vite:invoke",
552
- data: {
553
- id: "send",
554
- name,
555
- data
556
- }
557
- });
558
- if ("error" in result) throw reviveInvokeError(result.error);
559
- return result.result;
560
- }
561
- };
562
- if (!transport.send || !transport.connect) throw Error("transport must implement send and connect when invoke is not implemented");
563
- let rpcPromises = /* @__PURE__ */ new Map();
564
- return {
565
- ...transport,
566
- connect({ onMessage, onDisconnection }) {
567
- return transport.connect({
568
- onMessage(payload) {
569
- if (payload.type === "custom" && payload.event === "vite:invoke") {
570
- let data = payload.data;
571
- if (data.id.startsWith("response:")) {
572
- let invokeId = data.id.slice(9), promise = rpcPromises.get(invokeId);
573
- if (!promise) return;
574
- promise.timeoutId && clearTimeout(promise.timeoutId), rpcPromises.delete(invokeId);
575
- let { error, result } = data.data;
576
- error ? promise.reject(error) : promise.resolve(result);
577
- return;
578
- }
579
- }
580
- onMessage(payload);
581
- },
582
- onDisconnection
583
- });
584
- },
585
- disconnect() {
586
- return rpcPromises.forEach((promise) => {
587
- promise.reject(/* @__PURE__ */ Error(`transport was disconnected, cannot call ${JSON.stringify(promise.name)}`));
588
- }), rpcPromises.clear(), transport.disconnect?.();
589
- },
590
- send(data) {
591
- return transport.send(data);
592
- },
593
- async invoke(name, data) {
594
- let promiseId = nanoid(), wrappedData = {
595
- type: "custom",
596
- event: "vite:invoke",
597
- data: {
598
- name,
599
- id: `send:${promiseId}`,
600
- data
601
- }
602
- }, sendPromise = transport.send(wrappedData), { promise, resolve, reject } = promiseWithResolvers(), timeout = transport.timeout ?? 6e4, timeoutId;
603
- timeout > 0 && (timeoutId = setTimeout(() => {
604
- rpcPromises.delete(promiseId), reject(/* @__PURE__ */ Error(`transport invoke timed out after ${timeout}ms (data: ${JSON.stringify(wrappedData)})`));
605
- }, timeout), timeoutId?.unref?.()), rpcPromises.set(promiseId, {
606
- resolve,
607
- reject,
608
- name,
609
- timeoutId
610
- }), sendPromise && sendPromise.catch((err) => {
611
- clearTimeout(timeoutId), rpcPromises.delete(promiseId), reject(err);
612
- });
613
- try {
614
- return await promise;
615
- } catch (err) {
616
- throw reviveInvokeError(err);
617
- }
618
- }
619
- };
620
- };
621
- const normalizeModuleRunnerTransport = (transport) => {
622
- let invokeableTransport = createInvokeableTransport(transport), isConnected = !invokeableTransport.connect, connectingPromise;
623
- return {
624
- ...transport,
625
- ...invokeableTransport.connect ? { async connect(onMessage) {
626
- if (isConnected) return;
627
- if (connectingPromise) {
628
- await connectingPromise;
629
- return;
630
- }
631
- let maybePromise = invokeableTransport.connect({
632
- onMessage: onMessage ?? (() => {}),
633
- onDisconnection() {
634
- isConnected = !1;
635
- }
636
- });
637
- maybePromise && (connectingPromise = maybePromise, await connectingPromise, connectingPromise = void 0), isConnected = !0;
638
- } } : {},
639
- ...invokeableTransport.disconnect ? { async disconnect() {
640
- isConnected && (connectingPromise && await connectingPromise, isConnected = !1, await invokeableTransport.disconnect());
641
- } } : {},
642
- async send(data) {
643
- if (invokeableTransport.send) {
644
- if (!isConnected) if (connectingPromise) await connectingPromise;
645
- else throw Error("send was called before connect");
646
- await invokeableTransport.send(data);
647
- }
648
- },
649
- async invoke(name, data) {
650
- if (!isConnected) if (connectingPromise) await connectingPromise;
651
- else throw Error("invoke was called before connect");
652
- return invokeableTransport.invoke(name, data);
653
- }
654
- };
655
- };
656
- const createWebSocketModuleRunnerTransport = (options) => {
657
- let pingInterval = options.pingInterval ?? 3e4, ws, pingIntervalId;
658
- return {
659
- async connect({ onMessage, onDisconnection }) {
660
- let socket = options.createConnection();
661
- socket.addEventListener("message", async ({ data }) => {
662
- onMessage(JSON.parse(data));
663
- });
664
- let isOpened = socket.readyState === socket.OPEN;
665
- isOpened || await new Promise((resolve, reject) => {
666
- socket.addEventListener("open", () => {
667
- isOpened = !0, resolve();
668
- }, { once: !0 }), socket.addEventListener("close", async () => {
669
- if (!isOpened) {
670
- reject(/* @__PURE__ */ Error("WebSocket closed without opened."));
671
- return;
672
- }
673
- onMessage({
674
- type: "custom",
675
- event: "vite:ws:disconnect",
676
- data: { webSocket: socket }
677
- }), onDisconnection();
678
- });
679
- }), onMessage({
680
- type: "custom",
681
- event: "vite:ws:connect",
682
- data: { webSocket: socket }
683
- }), ws = socket, pingIntervalId = setInterval(() => {
684
- socket.readyState === socket.OPEN && socket.send(JSON.stringify({ type: "ping" }));
685
- }, pingInterval);
686
- },
687
- disconnect() {
688
- clearInterval(pingIntervalId), ws?.close();
689
- },
690
- send(data) {
691
- ws.send(JSON.stringify(data));
692
- }
693
- };
694
- };
695
- function createIsBuiltin(builtins) {
696
- let plainBuiltinsSet = new Set(builtins.filter((builtin) => typeof builtin == "string")), regexBuiltins = builtins.filter((builtin) => typeof builtin != "string");
697
- return (id) => plainBuiltinsSet.has(id) || regexBuiltins.some((regexp) => regexp.test(id));
698
- }
699
- const ssrModuleExportsKey = "__vite_ssr_exports__";
700
- const ssrImportKey = "__vite_ssr_import__";
701
- const ssrDynamicImportKey = "__vite_ssr_dynamic_import__";
702
- const ssrExportAllKey = "__vite_ssr_exportAll__";
703
- const ssrExportNameKey = "__vite_ssr_exportName__";
704
- const ssrImportMetaKey = "__vite_ssr_import_meta__";
705
- const noop = () => {};
706
- const silentConsole = {
707
- debug: noop,
708
- error: noop
709
- };
710
- const hmrLogger = {
711
- debug: (...msg) => console.log("[vite]", ...msg),
712
- error: (error) => console.log("[vite]", error)
713
- };
714
- function createHMRHandler(handler) {
715
- let queue = new Queue();
716
- return (payload) => queue.enqueue(() => handler(payload));
717
- }
718
- var Queue = class {
719
- queue = [];
720
- pending = !1;
721
- enqueue(promise) {
722
- return new Promise((resolve, reject) => {
723
- this.queue.push({
724
- promise,
725
- resolve,
726
- reject
727
- }), this.dequeue();
728
- });
729
- }
730
- dequeue() {
731
- if (this.pending) return !1;
732
- let item = this.queue.shift();
733
- return item ? (this.pending = !0, item.promise().then(item.resolve).catch(item.reject).finally(() => {
734
- this.pending = !1, this.dequeue();
735
- }), !0) : !1;
736
- }
737
- };
738
- function createHMRHandlerForRunner(runner) {
739
- return createHMRHandler(async (payload) => {
740
- let hmrClient = runner.hmrClient;
741
- if (!(!hmrClient || runner.isClosed())) switch (payload.type) {
742
- case "connected":
743
- hmrClient.logger.debug("connected.");
744
- break;
745
- case "update":
746
- await hmrClient.notifyListeners("vite:beforeUpdate", payload), await Promise.all(payload.updates.map(async (update) => {
747
- if (update.type === "js-update") return update.acceptedPath = unwrapId(update.acceptedPath), update.path = unwrapId(update.path), hmrClient.queueUpdate(update);
748
- hmrClient.logger.error("css hmr is not supported in runner mode.");
749
- })), await hmrClient.notifyListeners("vite:afterUpdate", payload);
750
- break;
751
- case "custom":
752
- await hmrClient.notifyListeners(payload.event, payload.data);
753
- break;
754
- case "full-reload": {
755
- let { triggeredBy } = payload, clearEntrypointUrls = triggeredBy ? getModulesEntrypoints(runner, getModulesByFile(runner, slash(triggeredBy))) : findAllEntrypoints(runner);
756
- if (!clearEntrypointUrls.size) break;
757
- hmrClient.logger.debug("program reload"), await hmrClient.notifyListeners("vite:beforeFullReload", payload), runner.evaluatedModules.clear();
758
- for (let url of clearEntrypointUrls) {
759
- if (runner.isClosed()) break;
760
- try {
761
- await runner.import(url);
762
- } catch (err) {
763
- if (runner.isClosed()) break;
764
- err.code !== "ERR_OUTDATED_OPTIMIZED_DEP" && hmrClient.logger.error(`An error happened during full reload\n${err.message}\n${err.stack}`);
765
- }
766
- }
767
- break;
768
- }
769
- case "prune":
770
- await hmrClient.notifyListeners("vite:beforePrune", payload), await hmrClient.prunePaths(payload.paths);
771
- break;
772
- case "error": {
773
- await hmrClient.notifyListeners("vite:error", payload);
774
- let err = payload.err;
775
- hmrClient.logger.error(`Internal Server Error\n${err.message}\n${err.stack}`);
776
- break;
777
- }
778
- case "ping": break;
779
- default: return payload;
780
- }
781
- });
782
- }
783
- function getModulesByFile(runner, file) {
784
- let nodes = runner.evaluatedModules.getModulesByFile(file);
785
- return nodes ? [...nodes].map((node) => node.id) : [];
786
- }
787
- function getModulesEntrypoints(runner, modules, visited = /* @__PURE__ */ new Set(), entrypoints = /* @__PURE__ */ new Set()) {
788
- for (let moduleId of modules) {
789
- if (visited.has(moduleId)) continue;
790
- visited.add(moduleId);
791
- let module = runner.evaluatedModules.getModuleById(moduleId);
792
- if (module) {
793
- if (!module.importers.size) {
794
- entrypoints.add(module.url);
795
- continue;
796
- }
797
- for (let importer of module.importers) getModulesEntrypoints(runner, [importer], visited, entrypoints);
798
- }
799
- }
800
- return entrypoints;
801
- }
802
- function findAllEntrypoints(runner, entrypoints = /* @__PURE__ */ new Set()) {
803
- for (let mod of runner.evaluatedModules.idToModuleMap.values()) mod.importers.size || entrypoints.add(mod.url);
804
- return entrypoints;
805
- }
806
- const sourceMapCache = {};
807
- const fileContentsCache = {};
808
- const evaluatedModulesCache = /* @__PURE__ */ new Set();
809
- const retrieveFileHandlers = /* @__PURE__ */ new Set();
810
- const retrieveSourceMapHandlers = /* @__PURE__ */ new Set();
811
- const createExecHandlers = (handlers) => ((...args) => {
812
- for (let handler of handlers) {
813
- let result = handler(...args);
814
- if (result) return result;
815
- }
816
- return null;
817
- });
818
- const retrieveFileFromHandlers = createExecHandlers(retrieveFileHandlers);
819
- const retrieveSourceMapFromHandlers = createExecHandlers(retrieveSourceMapHandlers);
820
- let overridden = !1;
821
- const originalPrepare = Error.prepareStackTrace;
822
- function resetInterceptor(runner, options) {
823
- evaluatedModulesCache.delete(runner.evaluatedModules), options.retrieveFile && retrieveFileHandlers.delete(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.delete(options.retrieveSourceMap), evaluatedModulesCache.size === 0 && (Error.prepareStackTrace = originalPrepare, overridden = !1);
824
- }
825
- function interceptStackTrace(runner, options = {}) {
826
- return overridden ||= (Error.prepareStackTrace = prepareStackTrace, !0), evaluatedModulesCache.add(runner.evaluatedModules), options.retrieveFile && retrieveFileHandlers.add(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.add(options.retrieveSourceMap), () => resetInterceptor(runner, options);
827
- }
828
- function supportRelativeURL(file, url) {
829
- if (!file) return url;
830
- let dir = posixDirname(slash(file)), match = /^\w+:\/\/[^/]*/.exec(dir), protocol = match ? match[0] : "", startPath = dir.slice(protocol.length);
831
- return protocol && /^\/\w:/.test(startPath) ? (protocol += "/", protocol + slash(posixResolve(startPath, url))) : protocol + posixResolve(startPath, url);
832
- }
833
- function getRunnerSourceMap(position) {
834
- for (let moduleGraph of evaluatedModulesCache) {
835
- let sourceMap = moduleGraph.getModuleSourceMapById(position.source);
836
- if (sourceMap) return {
837
- url: position.source,
838
- map: sourceMap,
839
- vite: !0
840
- };
841
- }
842
- return null;
843
- }
844
- function retrieveFile(path) {
845
- if (path in fileContentsCache) return fileContentsCache[path];
846
- let content = retrieveFileFromHandlers(path);
847
- return typeof content == "string" ? (fileContentsCache[path] = content, content) : null;
848
- }
849
- function retrieveSourceMapURL(source) {
850
- let fileData = retrieveFile(source);
851
- if (!fileData) return null;
852
- let re = /\/\/[@#]\s*sourceMappingURL=([^\s'"]+)\s*$|\/\*[@#]\s*sourceMappingURL=[^\s*'"]+\s*\*\/\s*$/gm, lastMatch, match;
853
- for (; match = re.exec(fileData);) lastMatch = match;
854
- return lastMatch ? lastMatch[1] : null;
855
- }
856
- const reSourceMap = /^data:application\/json[^,]+base64,/;
857
- function retrieveSourceMap(source) {
858
- let urlAndMap = retrieveSourceMapFromHandlers(source);
859
- if (urlAndMap) return urlAndMap;
860
- let sourceMappingURL = retrieveSourceMapURL(source);
861
- if (!sourceMappingURL) return null;
862
- let sourceMapData;
863
- if (reSourceMap.test(sourceMappingURL)) {
864
- let rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(",") + 1);
865
- sourceMapData = Buffer.from(rawData, "base64").toString(), sourceMappingURL = source;
866
- } else sourceMappingURL = supportRelativeURL(source, sourceMappingURL), sourceMapData = retrieveFile(sourceMappingURL);
867
- return sourceMapData ? {
868
- url: sourceMappingURL,
869
- map: sourceMapData
870
- } : null;
871
- }
872
- function mapSourcePosition(position) {
873
- if (!position.source) return position;
874
- let sourceMap = getRunnerSourceMap(position);
875
- if (sourceMap ||= sourceMapCache[position.source], !sourceMap) {
876
- let urlAndMap = retrieveSourceMap(position.source);
877
- if (urlAndMap && urlAndMap.map) {
878
- let url = urlAndMap.url;
879
- sourceMap = sourceMapCache[position.source] = {
880
- url,
881
- map: new DecodedMap(typeof urlAndMap.map == "string" ? JSON.parse(urlAndMap.map) : urlAndMap.map, url)
882
- };
883
- let contents = sourceMap.map?.map.sourcesContent;
884
- sourceMap.map && contents && sourceMap.map.resolvedSources.forEach((source, i) => {
885
- let content = contents[i];
886
- if (content && source && url) {
887
- let contentUrl = supportRelativeURL(url, source);
888
- fileContentsCache[contentUrl] = content;
889
- }
890
- });
891
- } else sourceMap = sourceMapCache[position.source] = {
892
- url: null,
893
- map: null
894
- };
895
- }
896
- if (sourceMap.map && sourceMap.url) {
897
- let originalPosition = getOriginalPosition(sourceMap.map, position);
898
- if (originalPosition && originalPosition.source != null) return originalPosition.source = supportRelativeURL(sourceMap.url, originalPosition.source), sourceMap.vite && (originalPosition._vite = !0), originalPosition;
899
- }
900
- return position;
901
- }
902
- function mapEvalOrigin(origin) {
903
- let match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
904
- if (match) {
905
- let position = mapSourcePosition({
906
- name: null,
907
- source: match[2],
908
- line: +match[3],
909
- column: match[4] - 1
910
- });
911
- return `eval at ${match[1]} (${position.source}:${position.line}:${position.column + 1})`;
912
- }
913
- return match = /^eval at ([^(]+) \((.+)\)$/.exec(origin), match ? `eval at ${match[1]} (${mapEvalOrigin(match[2])})` : origin;
914
- }
915
- function CallSiteToString() {
916
- let fileName, fileLocation = "";
917
- if (this.isNative()) fileLocation = "native";
918
- else {
919
- fileName = this.getScriptNameOrSourceURL(), !fileName && this.isEval() && (fileLocation = this.getEvalOrigin(), fileLocation += ", "), fileName ? fileLocation += fileName : fileLocation += "<anonymous>";
920
- let lineNumber = this.getLineNumber();
921
- if (lineNumber != null) {
922
- fileLocation += `:${lineNumber}`;
923
- let columnNumber = this.getColumnNumber();
924
- columnNumber && (fileLocation += `:${columnNumber}`);
925
- }
926
- }
927
- let line = "", functionName = this.getFunctionName(), addSuffix = !0, isConstructor = this.isConstructor();
928
- if (this.isToplevel() || isConstructor) isConstructor ? line += `new ${functionName || "<anonymous>"}` : functionName ? line += functionName : (line += fileLocation, addSuffix = !1);
929
- else {
930
- let typeName = this.getTypeName();
931
- typeName === "[object Object]" && (typeName = "null");
932
- let methodName = this.getMethodName();
933
- functionName ? (typeName && functionName.indexOf(typeName) !== 0 && (line += `${typeName}.`), line += functionName, methodName && functionName.indexOf(`.${methodName}`) !== functionName.length - methodName.length - 1 && (line += ` [as ${methodName}]`)) : line += `${typeName}.${methodName || "<anonymous>"}`;
934
- }
935
- return addSuffix && (line += ` (${fileLocation})`), line;
936
- }
937
- function cloneCallSite(frame) {
938
- let object = {};
939
- return Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach((name) => {
940
- let key = name;
941
- object[key] = /^(?:is|get)/.test(name) ? function() {
942
- return frame[key].call(frame);
943
- } : frame[key];
944
- }), object.toString = CallSiteToString, object;
945
- }
946
- function wrapCallSite(frame, state) {
947
- if (state === void 0 && (state = {
948
- nextPosition: null,
949
- curPosition: null
950
- }), frame.isNative()) return state.curPosition = null, frame;
951
- let source = frame.getFileName() || frame.getScriptNameOrSourceURL();
952
- if (source) {
953
- let position = mapSourcePosition({
954
- name: null,
955
- source,
956
- line: frame.getLineNumber() ?? 0,
957
- column: (frame.getColumnNumber() ?? 1) - 1
958
- });
959
- state.curPosition = position, frame = cloneCallSite(frame);
960
- let originalFunctionName = frame.getFunctionName;
961
- return frame.getFunctionName = function() {
962
- let name = state.nextPosition == null ? originalFunctionName() : state.nextPosition.name || originalFunctionName();
963
- return name === "eval" && "_vite" in position ? null : name;
964
- }, frame.getFileName = function() {
965
- return position.source ?? null;
966
- }, frame.getLineNumber = function() {
967
- return position.line;
968
- }, frame.getColumnNumber = function() {
969
- return position.column + 1;
970
- }, frame.getScriptNameOrSourceURL = function() {
971
- return position.source;
972
- }, frame;
973
- }
974
- let origin = frame.isEval() && frame.getEvalOrigin();
975
- return origin ? (origin = mapEvalOrigin(origin), frame = cloneCallSite(frame), frame.getEvalOrigin = function() {
976
- return origin || void 0;
977
- }, frame) : frame;
978
- }
979
- function prepareStackTrace(error, stack) {
980
- let errorString = `${error.name || "Error"}: ${error.message || ""}`, state = {
981
- nextPosition: null,
982
- curPosition: null
983
- }, processedStack = [];
984
- for (let i = stack.length - 1; i >= 0; i--) processedStack.push(`\n at ${wrapCallSite(stack[i], state)}`), state.nextPosition = state.curPosition;
985
- return state.curPosition = state.nextPosition = null, errorString + processedStack.reverse().join("");
986
- }
987
- function enableSourceMapSupport(runner) {
988
- if (runner.options.sourcemapInterceptor === "node") {
989
- if (typeof process > "u") throw TypeError("Cannot use \"sourcemapInterceptor: 'node'\" because global \"process\" variable is not available.");
990
- if (typeof process.setSourceMapsEnabled != "function") throw TypeError("Cannot use \"sourcemapInterceptor: 'node'\" because \"process.setSourceMapsEnabled\" function is not available. Please use Node >= 16.6.0.");
991
- let isEnabledAlready = process.sourceMapsEnabled ?? !1;
992
- return process.setSourceMapsEnabled(!0), () => !isEnabledAlready && process.setSourceMapsEnabled(!1);
993
- }
994
- return interceptStackTrace(runner, typeof runner.options.sourcemapInterceptor == "object" ? runner.options.sourcemapInterceptor : void 0);
995
- }
996
- var ESModulesEvaluator = class {
997
- startOffset = getAsyncFunctionDeclarationPaddingLineCount();
998
- async runInlinedModule(context, code) {
999
- await new AsyncFunction(ssrModuleExportsKey, ssrImportMetaKey, ssrImportKey, ssrDynamicImportKey, ssrExportAllKey, ssrExportNameKey, "\"use strict\";" + code)(context[ssrModuleExportsKey], context[ssrImportMetaKey], context[ssrImportKey], context[ssrDynamicImportKey], context[ssrExportAllKey], context[ssrExportNameKey]), Object.seal(context[ssrModuleExportsKey]);
1000
- }
1001
- runExternalModule(filepath) {
1002
- return import(filepath);
1003
- }
1004
- };
1005
- const customizationHookNamespace = "vite-module-runner:import-meta-resolve/v1/";
1006
- const customizationHooksModule = `
1007
-
1008
- export async function resolve(specifier, context, nextResolve) {
1009
- if (specifier.startsWith(${JSON.stringify(customizationHookNamespace)})) {
1010
- const data = specifier.slice(${JSON.stringify(customizationHookNamespace)}.length)
1011
- const [parsedSpecifier, parsedImporter] = JSON.parse(data)
1012
- specifier = parsedSpecifier
1013
- context.parentURL = parsedImporter
1014
- }
1015
- return nextResolve(specifier, context)
1016
- }
1017
-
1018
- `;
1019
- function customizationHookResolve(specifier, context, nextResolve) {
1020
- if (specifier.startsWith(customizationHookNamespace)) {
1021
- let data = specifier.slice(42), [parsedSpecifier, parsedImporter] = JSON.parse(data);
1022
- specifier = parsedSpecifier, context.parentURL = parsedImporter;
1023
- }
1024
- return nextResolve(specifier, context);
1025
- }
1026
- let isHookRegistered = !1;
1027
- function createImportMetaResolver() {
1028
- if (isHookRegistered) return importMetaResolveWithCustomHook;
1029
- let module;
1030
- try {
1031
- module = typeof process < "u" ? process.getBuiltinModule("node:module").Module : void 0;
1032
- } catch {
1033
- return;
1034
- }
1035
- if (module) {
1036
- if (module.registerHooks) return module.registerHooks({ resolve: customizationHookResolve }), isHookRegistered = !0, importMetaResolveWithCustomHook;
1037
- if (module.register) {
1038
- try {
1039
- let hookModuleContent = `data:text/javascript,${encodeURI(customizationHooksModule)}`;
1040
- module.register(hookModuleContent);
1041
- } catch (e) {
1042
- if ("code" in e && e.code === "ERR_NETWORK_IMPORT_DISALLOWED") return;
1043
- throw e;
1044
- }
1045
- return isHookRegistered = !0, importMetaResolveWithCustomHook;
1046
- }
1047
- }
1048
- }
1049
- function importMetaResolveWithCustomHook(specifier, importer) {
1050
- return import.meta.resolve(`${customizationHookNamespace}${JSON.stringify([specifier, importer])}`);
1051
- }
1052
- const envProxy = new Proxy({}, { get(_, p) {
1053
- throw Error(`[module runner] Dynamic access of "import.meta.env" is not supported. Please, use "import.meta.env.${String(p)}" instead.`);
1054
- } });
1055
- function createDefaultImportMeta(modulePath) {
1056
- let href = posixPathToFileHref(modulePath), filename = modulePath, dirname = posixDirname(modulePath);
1057
- return {
1058
- filename: isWindows ? toWindowsPath(filename) : filename,
1059
- dirname: isWindows ? toWindowsPath(dirname) : dirname,
1060
- url: href,
1061
- env: envProxy,
1062
- resolve(_id, _parent) {
1063
- throw Error("[module runner] \"import.meta.resolve\" is not supported.");
1064
- },
1065
- glob() {
1066
- throw Error("[module runner] \"import.meta.glob\" is statically replaced during file transformation. Make sure to reference it by the full name.");
1067
- }
1068
- };
1069
- }
1070
- /**
1071
- * Create import.meta object for Node.js.
1072
- */
1073
- function createNodeImportMeta(modulePath) {
1074
- let defaultMeta = createDefaultImportMeta(modulePath), href = defaultMeta.url, importMetaResolver = createImportMetaResolver();
1075
- return {
1076
- ...defaultMeta,
1077
- main: !1,
1078
- resolve(id, parent) {
1079
- return (importMetaResolver ?? defaultMeta.resolve)(id, parent ?? href);
1080
- }
1081
- };
1082
- }
1083
- var ModuleRunner = class {
1084
- evaluatedModules;
1085
- hmrClient;
1086
- transport;
1087
- resetSourceMapSupport;
1088
- concurrentModuleNodePromises = /* @__PURE__ */ new Map();
1089
- isBuiltin;
1090
- builtinsPromise;
1091
- closed = !1;
1092
- constructor(options, evaluator = new ESModulesEvaluator(), debug) {
1093
- if (this.options = options, this.evaluator = evaluator, this.debug = debug, this.evaluatedModules = options.evaluatedModules ?? new EvaluatedModules(), this.transport = normalizeModuleRunnerTransport(options.transport), options.hmr !== !1) {
1094
- let optionsHmr = options.hmr ?? !0;
1095
- if (this.hmrClient = new HMRClient(optionsHmr === !0 || optionsHmr.logger === void 0 ? hmrLogger : optionsHmr.logger === !1 ? silentConsole : optionsHmr.logger, this.transport, ({ acceptedPath }) => this.import(acceptedPath)), !this.transport.connect) throw Error("HMR is not supported by this runner transport, but `hmr` option was set to true");
1096
- this.transport.connect(createHMRHandlerForRunner(this));
1097
- } else this.transport.connect?.();
1098
- options.sourcemapInterceptor !== !1 && (this.resetSourceMapSupport = enableSourceMapSupport(this));
1099
- }
1100
- /**
1101
- * URL to execute. Accepts file path, server path or id relative to the root.
1102
- */
1103
- async import(url) {
1104
- let fetchedModule = await this.cachedModule(url);
1105
- return await this.cachedRequest(url, fetchedModule);
1106
- }
1107
- /**
1108
- * Clear all caches including HMR listeners.
1109
- */
1110
- clearCache() {
1111
- this.evaluatedModules.clear(), this.hmrClient?.clear();
1112
- }
1113
- /**
1114
- * Clears all caches, removes all HMR listeners, and resets source map support.
1115
- * This method doesn't stop the HMR connection.
1116
- */
1117
- async close() {
1118
- this.resetSourceMapSupport?.(), this.clearCache(), this.hmrClient = void 0, this.closed = !0, await this.transport.disconnect?.();
1119
- }
1120
- /**
1121
- * Returns `true` if the runtime has been closed by calling `close()` method.
1122
- */
1123
- isClosed() {
1124
- return this.closed;
1125
- }
1126
- processImport(exports, fetchResult, metadata) {
1127
- if (!("externalize" in fetchResult)) return exports;
1128
- let { url, type } = fetchResult;
1129
- return type !== "module" && type !== "commonjs" || analyzeImportedModDifference(exports, url, type, metadata), exports;
1130
- }
1131
- isCircularModule(mod) {
1132
- for (let importedFile of mod.imports) if (mod.importers.has(importedFile)) return !0;
1133
- return !1;
1134
- }
1135
- isCircularImport(importers, moduleUrl, visited = /* @__PURE__ */ new Set()) {
1136
- for (let importer of importers) {
1137
- if (visited.has(importer)) continue;
1138
- if (visited.add(importer), importer === moduleUrl) return !0;
1139
- let mod = this.evaluatedModules.getModuleById(importer);
1140
- if (mod && mod.importers.size && this.isCircularImport(mod.importers, moduleUrl, visited)) return !0;
1141
- }
1142
- return !1;
1143
- }
1144
- async cachedRequest(url, mod, callstack = [], metadata) {
1145
- let meta = mod.meta, moduleId = meta.id, { importers } = mod, importee = callstack[callstack.length - 1];
1146
- if (importee && importers.add(importee), mod.evaluated && mod.promise) return this.processImport(await mod.promise, meta, metadata);
1147
- if ((callstack.includes(moduleId) || this.isCircularModule(mod) || this.isCircularImport(importers, moduleId)) && mod.exports) return this.processImport(mod.exports, meta, metadata);
1148
- let debugTimer;
1149
- this.debug && (debugTimer = setTimeout(() => {
1150
- this.debug(`[module runner] module ${moduleId} takes over 2s to load.\n${`stack:\n${[...callstack, moduleId].reverse().map((p) => ` - ${p}`).join("\n")}`}`);
1151
- }, 2e3));
1152
- try {
1153
- if (mod.promise) return this.processImport(await mod.promise, meta, metadata);
1154
- let promise = this.directRequest(url, mod, callstack);
1155
- return mod.promise = promise, mod.evaluated = !1, this.processImport(await promise, meta, metadata);
1156
- } finally {
1157
- mod.evaluated = !0, debugTimer && clearTimeout(debugTimer);
1158
- }
1159
- }
1160
- async cachedModule(url, importer) {
1161
- let cached = this.concurrentModuleNodePromises.get(url);
1162
- if (cached) this.debug?.("[module runner] using cached module info for", url);
1163
- else {
1164
- let cachedModule = this.evaluatedModules.getModuleByUrl(url);
1165
- cached = this.getModuleInformation(url, importer, cachedModule).finally(() => {
1166
- this.concurrentModuleNodePromises.delete(url);
1167
- }), this.concurrentModuleNodePromises.set(url, cached);
1168
- }
1169
- return cached;
1170
- }
1171
- ensureBuiltins() {
1172
- if (!this.isBuiltin) return this.builtinsPromise ??= (async () => {
1173
- try {
1174
- this.debug?.("[module runner] fetching builtins from server");
1175
- let builtins = (await this.transport.invoke("getBuiltins", [])).map((builtin) => typeof builtin == "object" && builtin && "type" in builtin ? builtin.type === "string" ? builtin.value : new RegExp(builtin.source, builtin.flags) : builtin);
1176
- this.isBuiltin = createIsBuiltin(builtins), this.debug?.("[module runner] builtins loaded:", builtins);
1177
- } finally {
1178
- this.builtinsPromise = void 0;
1179
- }
1180
- })(), this.builtinsPromise;
1181
- }
1182
- async getModuleInformation(url, importer, cachedModule) {
1183
- if (this.closed) throw Error("Vite module runner has been closed.");
1184
- await this.ensureBuiltins(), this.debug?.("[module runner] fetching", url);
1185
- let isCached = !!(typeof cachedModule == "object" && cachedModule.meta), fetchedModule = url.startsWith("data:") || this.isBuiltin?.(url) ? {
1186
- externalize: url,
1187
- type: "builtin"
1188
- } : await this.transport.invoke("fetchModule", [
1189
- url,
1190
- importer,
1191
- {
1192
- cached: isCached,
1193
- startOffset: this.evaluator.startOffset
1194
- }
1195
- ]);
1196
- if ("cache" in fetchedModule) {
1197
- if (!cachedModule || !cachedModule.meta) throw Error(`Module "${url}" was mistakenly invalidated during fetch phase.`);
1198
- return cachedModule;
1199
- }
1200
- let moduleId = "externalize" in fetchedModule ? fetchedModule.externalize : fetchedModule.id, moduleUrl = "url" in fetchedModule ? fetchedModule.url : url, module = this.evaluatedModules.ensureModule(moduleId, moduleUrl);
1201
- return "invalidate" in fetchedModule && fetchedModule.invalidate && this.evaluatedModules.invalidateModule(module), fetchedModule.url = moduleUrl, fetchedModule.id = moduleId, module.meta = fetchedModule, module;
1202
- }
1203
- async directRequest(url, mod, _callstack) {
1204
- let fetchResult = mod.meta, moduleId = fetchResult.id, callstack = [..._callstack, moduleId], request = async (dep, metadata) => {
1205
- let importer = "file" in fetchResult && fetchResult.file || moduleId, depMod = await this.cachedModule(dep, importer);
1206
- return depMod.importers.add(moduleId), mod.imports.add(depMod.id), this.cachedRequest(dep, depMod, callstack, metadata);
1207
- }, dynamicRequest = async (dep) => (dep = String(dep), dep[0] === "." && (dep = posixResolve(posixDirname(url), dep)), request(dep, { isDynamicImport: !0 }));
1208
- if ("externalize" in fetchResult) {
1209
- let { externalize } = fetchResult;
1210
- this.debug?.("[module runner] externalizing", externalize);
1211
- let exports = await this.evaluator.runExternalModule(externalize);
1212
- return mod.exports = exports, exports;
1213
- }
1214
- let { code, file } = fetchResult;
1215
- if (code == null) {
1216
- let importer = callstack[callstack.length - 2];
1217
- throw Error(`[module runner] Failed to load "${url}"${importer ? ` imported from ${importer}` : ""}`);
1218
- }
1219
- let createImportMeta = this.options.createImportMeta ?? createDefaultImportMeta, modulePath = cleanUrl(file || moduleId), href = posixPathToFileHref(modulePath), meta = await createImportMeta(modulePath), exports = Object.create(null);
1220
- Object.defineProperty(exports, Symbol.toStringTag, {
1221
- value: "Module",
1222
- enumerable: !1,
1223
- configurable: !1
1224
- }), mod.exports = exports;
1225
- let hotContext;
1226
- this.hmrClient && Object.defineProperty(meta, "hot", {
1227
- enumerable: !0,
1228
- get: () => {
1229
- if (!this.hmrClient) throw Error("[module runner] HMR client was closed.");
1230
- return this.debug?.("[module runner] creating hmr context for", mod.url), hotContext ||= new HMRContext(this.hmrClient, mod.url), hotContext;
1231
- },
1232
- set: (value) => {
1233
- hotContext = value;
1234
- }
1235
- });
1236
- let context = {
1237
- [ssrImportKey]: request,
1238
- [ssrDynamicImportKey]: dynamicRequest,
1239
- [ssrModuleExportsKey]: exports,
1240
- [ssrExportAllKey]: (obj) => exportAll(exports, obj),
1241
- [ssrExportNameKey]: (name, getter) => Object.defineProperty(exports, name, {
1242
- enumerable: !0,
1243
- configurable: !0,
1244
- get: getter
1245
- }),
1246
- [ssrImportMetaKey]: meta
1247
- };
1248
- return this.debug?.("[module runner] executing", href), await this.evaluator.runInlinedModule(context, code, mod), exports;
1249
- }
1250
- };
1251
- function exportAll(exports, sourceModule) {
1252
- if (exports !== sourceModule && !(isPrimitive(sourceModule) || Array.isArray(sourceModule) || sourceModule instanceof Promise)) {
1253
- for (let key in sourceModule) if (key !== "default" && key !== "__esModule" && !(key in exports)) try {
1254
- Object.defineProperty(exports, key, {
1255
- enumerable: !0,
1256
- configurable: !0,
1257
- get: () => sourceModule[key]
1258
- });
1259
- } catch {}
1260
- }
1261
- }
1262
- //#endregion
1263
- export { ESModulesEvaluator, EvaluatedModules, ModuleRunner, createDefaultImportMeta, createNodeImportMeta, createWebSocketModuleRunnerTransport, normalizeModuleId, ssrDynamicImportKey, ssrExportAllKey, ssrExportNameKey, ssrImportKey, ssrImportMetaKey, ssrModuleExportsKey };
1264
-
1265
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXJ1bm5lci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdml0ZUA4LjAuM19AZW1uYXBpK2NvcmVAMS4xMS4yX0BlbW5hcGkrcnVudGltZUAxLjExLjJfQHR5cGVzK25vZGVAMjUuMC43X2VzYnVpbGRAMC4yNy40XzViMzVmYzFmYjg1ZDJhZjRkMTA1ZTBkNzRmOTQwZjUwL25vZGVfbW9kdWxlcy92aXRlL2Rpc3Qvbm9kZS9tb2R1bGUtcnVubmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBTT1VSQ0VNQVBQSU5HX1VSTCA9IFwic291cmNlTWFcIjtcblNPVVJDRU1BUFBJTkdfVVJMICs9IFwicHBpbmdVUkxcIjtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvdXRpbHMudHNcbmNvbnN0IGlzV2luZG93cyA9IHR5cGVvZiBwcm9jZXNzIDwgXCJ1XCIgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiO1xuLyoqXG4qIFVuZG8ge0BsaW5rIHdyYXBJZH0ncyBgL0BpZC9gIGFuZCBudWxsIGJ5dGUgcmVwbGFjZW1lbnRzLlxuKi9cbmZ1bmN0aW9uIHVud3JhcElkKGlkKSB7XG5cdHJldHVybiBpZC5zdGFydHNXaXRoKFwiL0BpZC9cIikgPyBpZC5zbGljZSg1KS5yZXBsYWNlKFwiX194MDBfX1wiLCBcIlxcMFwiKSA6IGlkO1xufVxuY29uc3Qgd2luZG93c1NsYXNoUkUgPSAvXFxcXC9nO1xuZnVuY3Rpb24gc2xhc2gocCkge1xuXHRyZXR1cm4gcC5yZXBsYWNlKHdpbmRvd3NTbGFzaFJFLCBcIi9cIik7XG59XG5jb25zdCBwb3N0Zml4UkUgPSAvWz8jXS4qJC87XG5mdW5jdGlvbiBjbGVhblVybCh1cmwpIHtcblx0cmV0dXJuIHVybC5yZXBsYWNlKHBvc3RmaXhSRSwgXCJcIik7XG59XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuXHRyZXR1cm4gIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPSBcImZ1bmN0aW9uXCI7XG59XG5jb25zdCBBc3luY0Z1bmN0aW9uID0gYXN5bmMgZnVuY3Rpb24oKSB7fS5jb25zdHJ1Y3RvcjtcbmxldCBhc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50O1xuZnVuY3Rpb24gZ2V0QXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudCgpIHtcblx0aWYgKGFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvblBhZGRpbmdMaW5lQ291bnQgPT09IHZvaWQgMCkge1xuXHRcdGxldCBib2R5ID0gXCIvKmNvZGUqL1wiLCBzb3VyY2UgPSBuZXcgQXN5bmNGdW5jdGlvbihcImFcIiwgXCJiXCIsIGJvZHkpLnRvU3RyaW5nKCk7XG5cdFx0YXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudCA9IHNvdXJjZS5zbGljZSgwLCBzb3VyY2UuaW5kZXhPZihib2R5KSkuc3BsaXQoXCJcXG5cIikubGVuZ3RoIC0gMTtcblx0fVxuXHRyZXR1cm4gYXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudDtcbn1cbmZ1bmN0aW9uIHByb21pc2VXaXRoUmVzb2x2ZXJzKCkge1xuXHRsZXQgcmVzb2x2ZSwgcmVqZWN0O1xuXHRyZXR1cm4ge1xuXHRcdHByb21pc2U6IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZSA9IF9yZXNvbHZlLCByZWplY3QgPSBfcmVqZWN0O1xuXHRcdH0pLFxuXHRcdHJlc29sdmUsXG5cdFx0cmVqZWN0XG5cdH07XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcGF0aGVAMi4wLjMvbm9kZV9tb2R1bGVzL3BhdGhlL2Rpc3Qvc2hhcmVkL3BhdGhlLk0tZVRodE5aLm1qc1xuY29uc3QgX0RSSVZFX0xFVFRFUl9TVEFSVF9SRSA9IC9eW0EtWmEtel06XFwvLztcbmZ1bmN0aW9uIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKGlucHV0ID0gXCJcIikge1xuXHRyZXR1cm4gaW5wdXQgJiYgaW5wdXQucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikucmVwbGFjZShfRFJJVkVfTEVUVEVSX1NUQVJUX1JFLCAocikgPT4gci50b1VwcGVyQ2FzZSgpKTtcbn1cbmNvbnN0IF9JU19BQlNPTFVURV9SRSA9IC9eWy9cXFxcXSg/IVsvXFxcXF0pfF5bL1xcXFxdezJ9KD8hXFwuKXxeW0EtWmEtel06Wy9cXFxcXS8sIF9EUklWRV9MRVRURVJfUkUgPSAvXltBLVphLXpdOiQvO1xuZnVuY3Rpb24gY3dkKCkge1xuXHRyZXR1cm4gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiAmJiB0eXBlb2YgcHJvY2Vzcy5jd2QgPT0gXCJmdW5jdGlvblwiID8gcHJvY2Vzcy5jd2QoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKSA6IFwiL1wiO1xufVxuY29uc3QgcmVzb2x2ZSA9IGZ1bmN0aW9uKC4uLmFyZ3VtZW50c18pIHtcblx0YXJndW1lbnRzXyA9IGFyZ3VtZW50c18ubWFwKChhcmd1bWVudCkgPT4gbm9ybWFsaXplV2luZG93c1BhdGgoYXJndW1lbnQpKTtcblx0bGV0IHJlc29sdmVkUGF0aCA9IFwiXCIsIHJlc29sdmVkQWJzb2x1dGUgPSAhMTtcblx0Zm9yIChsZXQgaW5kZXggPSBhcmd1bWVudHNfLmxlbmd0aCAtIDE7IGluZGV4ID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpbmRleC0tKSB7XG5cdFx0bGV0IHBhdGggPSBpbmRleCA+PSAwID8gYXJndW1lbnRzX1tpbmRleF0gOiBjd2QoKTtcblx0XHQhcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCB8fCAocmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YCwgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCkpO1xuXHR9XG5cdHJldHVybiByZXNvbHZlZFBhdGggPSBub3JtYWxpemVTdHJpbmcocmVzb2x2ZWRQYXRoLCAhcmVzb2x2ZWRBYnNvbHV0ZSksIHJlc29sdmVkQWJzb2x1dGUgJiYgIWlzQWJzb2x1dGUocmVzb2x2ZWRQYXRoKSA/IGAvJHtyZXNvbHZlZFBhdGh9YCA6IHJlc29sdmVkUGF0aC5sZW5ndGggPiAwID8gcmVzb2x2ZWRQYXRoIDogXCIuXCI7XG59O1xuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nKHBhdGgsIGFsbG93QWJvdmVSb290KSB7XG5cdGxldCByZXMgPSBcIlwiLCBsYXN0U2VnbWVudExlbmd0aCA9IDAsIGxhc3RTbGFzaCA9IC0xLCBkb3RzID0gMCwgY2hhciA9IG51bGw7XG5cdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gcGF0aC5sZW5ndGg7ICsraW5kZXgpIHtcblx0XHRpZiAoaW5kZXggPCBwYXRoLmxlbmd0aCkgY2hhciA9IHBhdGhbaW5kZXhdO1xuXHRcdGVsc2UgaWYgKGNoYXIgPT09IFwiL1wiKSBicmVhaztcblx0XHRlbHNlIGNoYXIgPSBcIi9cIjtcblx0XHRpZiAoY2hhciA9PT0gXCIvXCIpIHtcblx0XHRcdGlmICghKGxhc3RTbGFzaCA9PT0gaW5kZXggLSAxIHx8IGRvdHMgPT09IDEpKSBpZiAoZG90cyA9PT0gMikge1xuXHRcdFx0XHRpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gXCIuXCIgfHwgcmVzW3Jlcy5sZW5ndGggLSAyXSAhPT0gXCIuXCIpIHtcblx0XHRcdFx0XHRpZiAocmVzLmxlbmd0aCA+IDIpIHtcblx0XHRcdFx0XHRcdGxldCBsYXN0U2xhc2hJbmRleCA9IHJlcy5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdFx0XHRsYXN0U2xhc2hJbmRleCA9PT0gLTEgPyAocmVzID0gXCJcIiwgbGFzdFNlZ21lbnRMZW5ndGggPSAwKSA6IChyZXMgPSByZXMuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpLCBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKFwiL1wiKSksIGxhc3RTbGFzaCA9IGluZGV4LCBkb3RzID0gMDtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocmVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHJlcyA9IFwiXCIsIGxhc3RTZWdtZW50TGVuZ3RoID0gMCwgbGFzdFNsYXNoID0gaW5kZXgsIGRvdHMgPSAwO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFsbG93QWJvdmVSb290ICYmIChyZXMgKz0gcmVzLmxlbmd0aCA+IDAgPyBcIi8uLlwiIDogXCIuLlwiLCBsYXN0U2VnbWVudExlbmd0aCA9IDIpO1xuXHRcdFx0fSBlbHNlIHJlcy5sZW5ndGggPiAwID8gcmVzICs9IGAvJHtwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KX1gIDogcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpbmRleCksIGxhc3RTZWdtZW50TGVuZ3RoID0gaW5kZXggLSBsYXN0U2xhc2ggLSAxO1xuXHRcdFx0bGFzdFNsYXNoID0gaW5kZXgsIGRvdHMgPSAwO1xuXHRcdH0gZWxzZSBjaGFyID09PSBcIi5cIiAmJiBkb3RzICE9PSAtMSA/ICsrZG90cyA6IGRvdHMgPSAtMTtcblx0fVxuXHRyZXR1cm4gcmVzO1xufVxuY29uc3QgaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHApIHtcblx0cmV0dXJuIF9JU19BQlNPTFVURV9SRS50ZXN0KHApO1xufSwgZGlybmFtZSA9IGZ1bmN0aW9uKHApIHtcblx0bGV0IHNlZ21lbnRzID0gbm9ybWFsaXplV2luZG93c1BhdGgocCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSk7XG5cdHJldHVybiBzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgX0RSSVZFX0xFVFRFUl9SRS50ZXN0KHNlZ21lbnRzWzBdKSAmJiAoc2VnbWVudHNbMF0gKz0gXCIvXCIpLCBzZWdtZW50cy5qb2luKFwiL1wiKSB8fCAoaXNBYnNvbHV0ZShwKSA/IFwiL1wiIDogXCIuXCIpO1xufSwgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKSwgZGVjb2RlQmFzZTY0ID0gdHlwZW9mIEJ1ZmZlciA9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIEJ1ZmZlci5mcm9tID09IFwiZnVuY3Rpb25cIiA/IChiYXNlNjQpID0+IEJ1ZmZlci5mcm9tKGJhc2U2NCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGYtOFwiKSA6IChiYXNlNjQpID0+IHRleHREZWNvZGVyLmRlY29kZShVaW50OEFycmF5LmZyb20oYXRvYihiYXNlNjQpLCAoYykgPT4gYy5jaGFyQ29kZUF0KDApKSksIHBlcmNlbnRSZWdFeCA9IC8lL2csIGJhY2tzbGFzaFJlZ0V4ID0gL1xcXFwvZywgbmV3bGluZVJlZ0V4ID0gL1xcbi9nLCBjYXJyaWFnZVJldHVyblJlZ0V4ID0gL1xcci9nLCB0YWJSZWdFeCA9IC9cXHQvZywgcXVlc3Rpb25SZWdleCA9IC9cXD8vZywgaGFzaFJlZ2V4ID0gLyMvZztcbmZ1bmN0aW9uIGVuY29kZVBhdGhDaGFycyhmaWxlcGF0aCkge1xuXHRyZXR1cm4gZmlsZXBhdGguaW5kZXhPZihcIiVcIikgIT09IC0xICYmIChmaWxlcGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UocGVyY2VudFJlZ0V4LCBcIiUyNVwiKSksICFpc1dpbmRvd3MgJiYgZmlsZXBhdGguaW5kZXhPZihcIlxcXFxcIikgIT09IC0xICYmIChmaWxlcGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UoYmFja3NsYXNoUmVnRXgsIFwiJTVDXCIpKSwgZmlsZXBhdGguaW5kZXhPZihcIlxcblwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShuZXdsaW5lUmVnRXgsIFwiJTBBXCIpKSwgZmlsZXBhdGguaW5kZXhPZihcIlxcclwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShjYXJyaWFnZVJldHVyblJlZ0V4LCBcIiUwRFwiKSksIGZpbGVwYXRoLmluZGV4T2YoXCJcdFwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZSh0YWJSZWdFeCwgXCIlMDlcIikpLCBmaWxlcGF0aDtcbn1cbmNvbnN0IHBvc2l4RGlybmFtZSA9IGRpcm5hbWUsIHBvc2l4UmVzb2x2ZSA9IHJlc29sdmU7XG5mdW5jdGlvbiBwb3NpeFBhdGhUb0ZpbGVIcmVmKHBvc2l4UGF0aCkge1xuXHRsZXQgcmVzb2x2ZWQgPSBwb3NpeFJlc29sdmUocG9zaXhQYXRoKSwgZmlsZVBhdGhMYXN0ID0gcG9zaXhQYXRoLmNoYXJDb2RlQXQocG9zaXhQYXRoLmxlbmd0aCAtIDEpO1xuXHRyZXR1cm4gKGZpbGVQYXRoTGFzdCA9PT0gNDcgfHwgaXNXaW5kb3dzICYmIGZpbGVQYXRoTGFzdCA9PT0gOTIpICYmIHJlc29sdmVkW3Jlc29sdmVkLmxlbmd0aCAtIDFdICE9PSBcIi9cIiAmJiAocmVzb2x2ZWQgKz0gXCIvXCIpLCByZXNvbHZlZCA9IGVuY29kZVBhdGhDaGFycyhyZXNvbHZlZCksIHJlc29sdmVkLmluZGV4T2YoXCI/XCIpICE9PSAtMSAmJiAocmVzb2x2ZWQgPSByZXNvbHZlZC5yZXBsYWNlKHF1ZXN0aW9uUmVnZXgsIFwiJTNGXCIpKSwgcmVzb2x2ZWQuaW5kZXhPZihcIiNcIikgIT09IC0xICYmIChyZXNvbHZlZCA9IHJlc29sdmVkLnJlcGxhY2UoaGFzaFJlZ2V4LCBcIiUyM1wiKSksIG5ldyBVUkwoYGZpbGU6Ly8ke3Jlc29sdmVkfWApLmhyZWY7XG59XG5mdW5jdGlvbiB0b1dpbmRvd3NQYXRoKHBhdGgpIHtcblx0cmV0dXJuIHBhdGgucmVwbGFjZSgvXFwvL2csIFwiXFxcXFwiKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AanJpZGdld2VsbCtzb3VyY2VtYXAtY29kZWNAMS41LjUvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYy9kaXN0L3NvdXJjZW1hcC1jb2RlYy5tanNcbnZhciBjb21tYSA9IDQ0LCBjaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLCBpbnRUb0NoYXIgPSBuZXcgVWludDhBcnJheSg2NCksIGNoYXJUb0ludCA9IG5ldyBVaW50OEFycmF5KDEyOCk7XG5mb3IgKGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG5cdGxldCBjID0gY2hhcnMuY2hhckNvZGVBdChpKTtcblx0aW50VG9DaGFyW2ldID0gYywgY2hhclRvSW50W2NdID0gaTtcbn1cbmZ1bmN0aW9uIGRlY29kZUludGVnZXIocmVhZGVyLCByZWxhdGl2ZSkge1xuXHRsZXQgdmFsdWUgPSAwLCBzaGlmdCA9IDAsIGludGVnZXIgPSAwO1xuXHRkb1xuXHRcdGludGVnZXIgPSBjaGFyVG9JbnRbcmVhZGVyLm5leHQoKV0sIHZhbHVlIHw9IChpbnRlZ2VyICYgMzEpIDw8IHNoaWZ0LCBzaGlmdCArPSA1O1xuXHR3aGlsZSAoaW50ZWdlciAmIDMyKTtcblx0bGV0IHNob3VsZE5lZ2F0ZSA9IHZhbHVlICYgMTtcblx0cmV0dXJuIHZhbHVlID4+Pj0gMSwgc2hvdWxkTmVnYXRlICYmICh2YWx1ZSA9IC0yMTQ3NDgzNjQ4IHwgLXZhbHVlKSwgcmVsYXRpdmUgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGhhc01vcmVWbHEocmVhZGVyLCBtYXgpIHtcblx0cmV0dXJuIHJlYWRlci5wb3MgPj0gbWF4ID8gITEgOiByZWFkZXIucGVlaygpICE9PSBjb21tYTtcbn1cbnZhciBTdHJpbmdSZWFkZXIgPSBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuXHRcdHRoaXMucG9zID0gMCwgdGhpcy5idWZmZXIgPSBidWZmZXI7XG5cdH1cblx0bmV4dCgpIHtcblx0XHRyZXR1cm4gdGhpcy5idWZmZXIuY2hhckNvZGVBdCh0aGlzLnBvcysrKTtcblx0fVxuXHRwZWVrKCkge1xuXHRcdHJldHVybiB0aGlzLmJ1ZmZlci5jaGFyQ29kZUF0KHRoaXMucG9zKTtcblx0fVxuXHRpbmRleE9mKGNoYXIpIHtcblx0XHRsZXQgeyBidWZmZXIsIHBvcyB9ID0gdGhpcywgaWR4ID0gYnVmZmVyLmluZGV4T2YoY2hhciwgcG9zKTtcblx0XHRyZXR1cm4gaWR4ID09PSAtMSA/IGJ1ZmZlci5sZW5ndGggOiBpZHg7XG5cdH1cbn07XG5mdW5jdGlvbiBkZWNvZGUobWFwcGluZ3MpIHtcblx0bGV0IHsgbGVuZ3RoIH0gPSBtYXBwaW5ncywgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihtYXBwaW5ncyksIGRlY29kZWQgPSBbXSwgZ2VuQ29sdW1uID0gMCwgc291cmNlc0luZGV4ID0gMCwgc291cmNlTGluZSA9IDAsIHNvdXJjZUNvbHVtbiA9IDAsIG5hbWVzSW5kZXggPSAwO1xuXHRkbyB7XG5cdFx0bGV0IHNlbWkgPSByZWFkZXIuaW5kZXhPZihcIjtcIiksIGxpbmUgPSBbXSwgc29ydGVkID0gITAsIGxhc3RDb2wgPSAwO1xuXHRcdGZvciAoZ2VuQ29sdW1uID0gMDsgcmVhZGVyLnBvcyA8IHNlbWk7KSB7XG5cdFx0XHRsZXQgc2VnO1xuXHRcdFx0Z2VuQ29sdW1uID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIGdlbkNvbHVtbiksIGdlbkNvbHVtbiA8IGxhc3RDb2wgJiYgKHNvcnRlZCA9ICExKSwgbGFzdENvbCA9IGdlbkNvbHVtbiwgaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpID8gKHNvdXJjZXNJbmRleCA9IGRlY29kZUludGVnZXIocmVhZGVyLCBzb3VyY2VzSW5kZXgpLCBzb3VyY2VMaW5lID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHNvdXJjZUxpbmUpLCBzb3VyY2VDb2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgc291cmNlQ29sdW1uKSwgaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpID8gKG5hbWVzSW5kZXggPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgbmFtZXNJbmRleCksIHNlZyA9IFtcblx0XHRcdFx0Z2VuQ29sdW1uLFxuXHRcdFx0XHRzb3VyY2VzSW5kZXgsXG5cdFx0XHRcdHNvdXJjZUxpbmUsXG5cdFx0XHRcdHNvdXJjZUNvbHVtbixcblx0XHRcdFx0bmFtZXNJbmRleFxuXHRcdFx0XSkgOiBzZWcgPSBbXG5cdFx0XHRcdGdlbkNvbHVtbixcblx0XHRcdFx0c291cmNlc0luZGV4LFxuXHRcdFx0XHRzb3VyY2VMaW5lLFxuXHRcdFx0XHRzb3VyY2VDb2x1bW5cblx0XHRcdF0pIDogc2VnID0gW2dlbkNvbHVtbl0sIGxpbmUucHVzaChzZWcpLCByZWFkZXIucG9zKys7XG5cdFx0fVxuXHRcdHNvcnRlZCB8fCBzb3J0KGxpbmUpLCBkZWNvZGVkLnB1c2gobGluZSksIHJlYWRlci5wb3MgPSBzZW1pICsgMTtcblx0fSB3aGlsZSAocmVhZGVyLnBvcyA8PSBsZW5ndGgpO1xuXHRyZXR1cm4gZGVjb2RlZDtcbn1cbmZ1bmN0aW9uIHNvcnQobGluZSkge1xuXHRsaW5lLnNvcnQoc29ydENvbXBhcmF0b3IpO1xufVxuZnVuY3Rpb24gc29ydENvbXBhcmF0b3IoYSwgYikge1xuXHRyZXR1cm4gYVswXSAtIGJbMF07XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGpyaWRnZXdlbGwrdHJhY2UtbWFwcGluZ0AwLjMuMzEvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmcvZGlzdC90cmFjZS1tYXBwaW5nLm1qc1xudmFyIENPTFVNTiA9IDAsIFNPVVJDRVNfSU5ERVggPSAxLCBTT1VSQ0VfTElORSA9IDIsIFNPVVJDRV9DT0xVTU4gPSAzLCBOQU1FU19JTkRFWCA9IDQsIGZvdW5kID0gITE7XG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgbG93LCBoaWdoKSB7XG5cdGZvciAoOyBsb3cgPD0gaGlnaDspIHtcblx0XHRsZXQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cgPj4gMSksIGNtcCA9IGhheXN0YWNrW21pZF1bQ09MVU1OXSAtIG5lZWRsZTtcblx0XHRpZiAoY21wID09PSAwKSByZXR1cm4gZm91bmQgPSAhMCwgbWlkO1xuXHRcdGNtcCA8IDAgPyBsb3cgPSBtaWQgKyAxIDogaGlnaCA9IG1pZCAtIDE7XG5cdH1cblx0cmV0dXJuIGZvdW5kID0gITEsIGxvdyAtIDE7XG59XG5mdW5jdGlvbiB1cHBlckJvdW5kKGhheXN0YWNrLCBuZWVkbGUsIGluZGV4KSB7XG5cdGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCBoYXlzdGFjay5sZW5ndGggJiYgaGF5c3RhY2tbaV1bQ09MVU1OXSA9PT0gbmVlZGxlOyBpbmRleCA9IGkrKyk7XG5cdHJldHVybiBpbmRleDtcbn1cbmZ1bmN0aW9uIGxvd2VyQm91bmQoaGF5c3RhY2ssIG5lZWRsZSwgaW5kZXgpIHtcblx0Zm9yIChsZXQgaSA9IGluZGV4IC0gMTsgaSA+PSAwICYmIGhheXN0YWNrW2ldW0NPTFVNTl0gPT09IG5lZWRsZTsgaW5kZXggPSBpLS0pO1xuXHRyZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBtZW1vaXplZEJpbmFyeVNlYXJjaChoYXlzdGFjaywgbmVlZGxlLCBzdGF0ZSwga2V5KSB7XG5cdGxldCB7IGxhc3RLZXksIGxhc3ROZWVkbGUsIGxhc3RJbmRleCB9ID0gc3RhdGUsIGxvdyA9IDAsIGhpZ2ggPSBoYXlzdGFjay5sZW5ndGggLSAxO1xuXHRpZiAoa2V5ID09PSBsYXN0S2V5KSB7XG5cdFx0aWYgKG5lZWRsZSA9PT0gbGFzdE5lZWRsZSkgcmV0dXJuIGZvdW5kID0gbGFzdEluZGV4ICE9PSAtMSAmJiBoYXlzdGFja1tsYXN0SW5kZXhdW0NPTFVNTl0gPT09IG5lZWRsZSwgbGFzdEluZGV4O1xuXHRcdG5lZWRsZSA+PSBsYXN0TmVlZGxlID8gbG93ID0gbGFzdEluZGV4ID09PSAtMSA/IDAgOiBsYXN0SW5kZXggOiBoaWdoID0gbGFzdEluZGV4O1xuXHR9XG5cdHJldHVybiBzdGF0ZS5sYXN0S2V5ID0ga2V5LCBzdGF0ZS5sYXN0TmVlZGxlID0gbmVlZGxlLCBzdGF0ZS5sYXN0SW5kZXggPSBiaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgbG93LCBoaWdoKTtcbn1cbnZhciBMSU5FX0dUUl9aRVJPID0gXCJgbGluZWAgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAobGluZXMgc3RhcnQgYXQgbGluZSAxKVwiLCBDT0xfR1RSX0VRX1pFUk8gPSBcImBjb2x1bW5gIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgKGNvbHVtbnMgc3RhcnQgYXQgY29sdW1uIDApXCI7XG5mdW5jdGlvbiBjYXN0KG1hcCkge1xuXHRyZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gZGVjb2RlZE1hcHBpbmdzKG1hcCkge1xuXHR2YXIgX2E7XG5cdHJldHVybiAoX2EgPSBjYXN0KG1hcCkpLl9kZWNvZGVkIHx8IChfYS5fZGVjb2RlZCA9IGRlY29kZShjYXN0KG1hcCkuX2VuY29kZWQpKTtcbn1cbmZ1bmN0aW9uIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwLCBuZWVkbGUpIHtcblx0bGV0IHsgbGluZSwgY29sdW1uLCBiaWFzIH0gPSBuZWVkbGU7XG5cdGlmIChsaW5lLS0sIGxpbmUgPCAwKSB0aHJvdyBFcnJvcihMSU5FX0dUUl9aRVJPKTtcblx0aWYgKGNvbHVtbiA8IDApIHRocm93IEVycm9yKENPTF9HVFJfRVFfWkVSTyk7XG5cdGxldCBkZWNvZGVkID0gZGVjb2RlZE1hcHBpbmdzKG1hcCk7XG5cdGlmIChsaW5lID49IGRlY29kZWQubGVuZ3RoKSByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cdGxldCBzZWdtZW50cyA9IGRlY29kZWRbbGluZV0sIGluZGV4ID0gdHJhY2VTZWdtZW50SW50ZXJuYWwoc2VnbWVudHMsIGNhc3QobWFwKS5fZGVjb2RlZE1lbW8sIGxpbmUsIGNvbHVtbiwgYmlhcyB8fCAxKTtcblx0aWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIE9NYXBwaW5nKG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuXHRsZXQgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKHNlZ21lbnQubGVuZ3RoID09PSAxKSByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cdGxldCB7IG5hbWVzLCByZXNvbHZlZFNvdXJjZXMgfSA9IG1hcDtcblx0cmV0dXJuIE9NYXBwaW5nKHJlc29sdmVkU291cmNlc1tzZWdtZW50W1NPVVJDRVNfSU5ERVhdXSwgc2VnbWVudFtTT1VSQ0VfTElORV0gKyAxLCBzZWdtZW50W1NPVVJDRV9DT0xVTU5dLCBzZWdtZW50Lmxlbmd0aCA9PT0gNSA/IG5hbWVzW3NlZ21lbnRbTkFNRVNfSU5ERVhdXSA6IG51bGwpO1xufVxuZnVuY3Rpb24gT01hcHBpbmcoc291cmNlLCBsaW5lLCBjb2x1bW4sIG5hbWUpIHtcblx0cmV0dXJuIHtcblx0XHRzb3VyY2UsXG5cdFx0bGluZSxcblx0XHRjb2x1bW4sXG5cdFx0bmFtZVxuXHR9O1xufVxuZnVuY3Rpb24gdHJhY2VTZWdtZW50SW50ZXJuYWwoc2VnbWVudHMsIG1lbW8sIGxpbmUsIGNvbHVtbiwgYmlhcykge1xuXHRsZXQgaW5kZXggPSBtZW1vaXplZEJpbmFyeVNlYXJjaChzZWdtZW50cywgY29sdW1uLCBtZW1vLCBsaW5lKTtcblx0cmV0dXJuIGZvdW5kID8gaW5kZXggPSAoYmlhcyA9PT0gLTEgPyB1cHBlckJvdW5kIDogbG93ZXJCb3VuZCkoc2VnbWVudHMsIGNvbHVtbiwgaW5kZXgpIDogYmlhcyA9PT0gLTEgJiYgaW5kZXgrKywgaW5kZXggPT09IC0xIHx8IGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggPyAtMSA6IGluZGV4O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvc291cmNlbWFwL2RlY29kZXIudHNcbnZhciBEZWNvZGVkTWFwID0gY2xhc3Mge1xuXHRfZW5jb2RlZDtcblx0X2RlY29kZWQ7XG5cdF9kZWNvZGVkTWVtbztcblx0dXJsO1xuXHRmaWxlO1xuXHR2ZXJzaW9uO1xuXHRuYW1lcyA9IFtdO1xuXHRyZXNvbHZlZFNvdXJjZXM7XG5cdGNvbnN0cnVjdG9yKG1hcCwgZnJvbSkge1xuXHRcdHRoaXMubWFwID0gbWFwO1xuXHRcdGxldCB7IG1hcHBpbmdzLCBuYW1lcywgc291cmNlcyB9ID0gbWFwO1xuXHRcdHRoaXMudmVyc2lvbiA9IG1hcC52ZXJzaW9uLCB0aGlzLm5hbWVzID0gbmFtZXMgfHwgW10sIHRoaXMuX2VuY29kZWQgPSBtYXBwaW5ncyB8fCBcIlwiLCB0aGlzLl9kZWNvZGVkTWVtbyA9IG1lbW9pemVkU3RhdGUoKSwgdGhpcy51cmwgPSBmcm9tLCB0aGlzLmZpbGUgPSBmcm9tO1xuXHRcdGxldCBvcmlnaW5EaXIgPSBwb3NpeERpcm5hbWUoZnJvbSk7XG5cdFx0dGhpcy5yZXNvbHZlZFNvdXJjZXMgPSAoc291cmNlcyB8fCBbXSkubWFwKChzKSA9PiBwb3NpeFJlc29sdmUob3JpZ2luRGlyLCBzIHx8IFwiXCIpKTtcblx0fVxufTtcbmZ1bmN0aW9uIG1lbW9pemVkU3RhdGUoKSB7XG5cdHJldHVybiB7XG5cdFx0bGFzdEtleTogLTEsXG5cdFx0bGFzdE5lZWRsZTogLTEsXG5cdFx0bGFzdEluZGV4OiAtMVxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0T3JpZ2luYWxQb3NpdGlvbihtYXAsIG5lZWRsZSkge1xuXHRsZXQgcmVzdWx0ID0gb3JpZ2luYWxQb3NpdGlvbkZvcihtYXAsIG5lZWRsZSk7XG5cdHJldHVybiByZXN1bHQuY29sdW1uID09IG51bGwgPyBudWxsIDogcmVzdWx0O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvZXZhbHVhdGVkTW9kdWxlcy50c1xuY29uc3QgTU9EVUxFX1JVTk5FUl9TT1VSQ0VNQVBQSU5HX1JFR0VYUCA9IFJlZ0V4cChgLy8jICR7U09VUkNFTUFQUElOR19VUkx9PWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsKC4rKWApO1xudmFyIEV2YWx1YXRlZE1vZHVsZU5vZGUgPSBjbGFzcyB7XG5cdGltcG9ydGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGltcG9ydHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRldmFsdWF0ZWQgPSAhMTtcblx0bWV0YTtcblx0cHJvbWlzZTtcblx0ZXhwb3J0cztcblx0ZmlsZTtcblx0bWFwO1xuXHRjb25zdHJ1Y3RvcihpZCwgdXJsKSB7XG5cdFx0dGhpcy5pZCA9IGlkLCB0aGlzLnVybCA9IHVybCwgdGhpcy5maWxlID0gY2xlYW5VcmwoaWQpO1xuXHR9XG59LCBFdmFsdWF0ZWRNb2R1bGVzID0gY2xhc3Mge1xuXHRpZFRvTW9kdWxlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0ZmlsZVRvTW9kdWxlc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdHVybFRvSWRNb2R1bGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHQvKipcblx0KiBSZXR1cm5zIHRoZSBtb2R1bGUgbm9kZSBieSB0aGUgcmVzb2x2ZWQgbW9kdWxlIElELiBVc3VhbGx5LCBtb2R1bGUgSUQgaXNcblx0KiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCB3aXRoIHF1ZXJ5IGFuZC9vciBoYXNoLiBJdCBjYW4gYWxzbyBiZSBhIHZpcnR1YWwgbW9kdWxlLlxuXHQqXG5cdCogTW9kdWxlIHJ1bm5lciBncmFwaCB3aWxsIGhhdmUgMSB0byAxIG1hcHBpbmcgd2l0aCB0aGUgc2VydmVyIG1vZHVsZSBncmFwaC5cblx0KiBAcGFyYW0gaWQgUmVzb2x2ZWQgbW9kdWxlIElEXG5cdCovXG5cdGdldE1vZHVsZUJ5SWQoaWQpIHtcblx0XHRyZXR1cm4gdGhpcy5pZFRvTW9kdWxlTWFwLmdldChpZCk7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJucyBhbGwgbW9kdWxlcyByZWxhdGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBwYXRoLiBEaWZmZXJlbnQgbW9kdWxlc1xuXHQqIG1pZ2h0IGhhdmUgZGlmZmVyZW50IHF1ZXJ5IHBhcmFtZXRlcnMgb3IgaGFzaCwgc28gaXQncyBwb3NzaWJsZSB0byBoYXZlXG5cdCogbXVsdGlwbGUgbW9kdWxlcyBmb3IgdGhlIHNhbWUgZmlsZS5cblx0KiBAcGFyYW0gZmlsZSBUaGUgZmlsZSBzeXN0ZW0gcGF0aCBvZiB0aGUgbW9kdWxlXG5cdCovXG5cdGdldE1vZHVsZXNCeUZpbGUoZmlsZSkge1xuXHRcdHJldHVybiB0aGlzLmZpbGVUb01vZHVsZXNNYXAuZ2V0KGZpbGUpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgdGhlIG1vZHVsZSBub2RlIGJ5IHRoZSBVUkwgdGhhdCB3YXMgdXNlZCBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudC5cblx0KiBVbmxpa2UgbW9kdWxlIGdyYXBoIG9uIHRoZSBzZXJ2ZXIsIHRoZSBVUkwgaXMgbm90IHJlc29sdmVkIGFuZCBpcyB1c2VkIGFzIGlzLlxuXHQqIEBwYXJhbSB1cmwgU2VydmVyIFVSTCB0aGF0IHdhcyB1c2VkIGluIHRoZSBpbXBvcnQgc3RhdGVtZW50XG5cdCovXG5cdGdldE1vZHVsZUJ5VXJsKHVybCkge1xuXHRcdHJldHVybiB0aGlzLnVybFRvSWRNb2R1bGVNYXAuZ2V0KHVud3JhcElkKHVybCkpO1xuXHR9XG5cdC8qKlxuXHQqIEVuc3VyZSB0aGF0IG1vZHVsZSBpcyBpbiB0aGUgZ3JhcGguIElmIHRoZSBtb2R1bGUgaXMgYWxyZWFkeSBpbiB0aGUgZ3JhcGgsXG5cdCogaXQgd2lsbCByZXR1cm4gdGhlIGV4aXN0aW5nIG1vZHVsZSBub2RlLiBPdGhlcndpc2UsIGl0IHdpbGwgY3JlYXRlIGEgbmV3XG5cdCogbW9kdWxlIG5vZGUgYW5kIGFkZCBpdCB0byB0aGUgZ3JhcGguXG5cdCogQHBhcmFtIGlkIFJlc29sdmVkIG1vZHVsZSBJRFxuXHQqIEBwYXJhbSB1cmwgVVJMIHRoYXQgd2FzIHVzZWQgaW4gdGhlIGltcG9ydCBzdGF0ZW1lbnRcblx0Ki9cblx0ZW5zdXJlTW9kdWxlKGlkLCB1cmwpIHtcblx0XHRpZiAoaWQgPSBub3JtYWxpemVNb2R1bGVJZChpZCksIHRoaXMuaWRUb01vZHVsZU1hcC5oYXMoaWQpKSB7XG5cdFx0XHRsZXQgbW9kdWxlTm9kZSA9IHRoaXMuaWRUb01vZHVsZU1hcC5nZXQoaWQpO1xuXHRcdFx0cmV0dXJuIHRoaXMudXJsVG9JZE1vZHVsZU1hcC5zZXQodXJsLCBtb2R1bGVOb2RlKSwgbW9kdWxlTm9kZTtcblx0XHR9XG5cdFx0bGV0IG1vZHVsZU5vZGUgPSBuZXcgRXZhbHVhdGVkTW9kdWxlTm9kZShpZCwgdXJsKTtcblx0XHR0aGlzLmlkVG9Nb2R1bGVNYXAuc2V0KGlkLCBtb2R1bGVOb2RlKSwgdGhpcy51cmxUb0lkTW9kdWxlTWFwLnNldCh1cmwsIG1vZHVsZU5vZGUpO1xuXHRcdGxldCBmaWxlTW9kdWxlcyA9IHRoaXMuZmlsZVRvTW9kdWxlc01hcC5nZXQobW9kdWxlTm9kZS5maWxlKSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdHJldHVybiBmaWxlTW9kdWxlcy5hZGQobW9kdWxlTm9kZSksIHRoaXMuZmlsZVRvTW9kdWxlc01hcC5zZXQobW9kdWxlTm9kZS5maWxlLCBmaWxlTW9kdWxlcyksIG1vZHVsZU5vZGU7XG5cdH1cblx0aW52YWxpZGF0ZU1vZHVsZShub2RlKSB7XG5cdFx0bm9kZS5ldmFsdWF0ZWQgPSAhMSwgbm9kZS5tZXRhID0gdm9pZCAwLCBub2RlLm1hcCA9IHZvaWQgMCwgbm9kZS5wcm9taXNlID0gdm9pZCAwLCBub2RlLmV4cG9ydHMgPSB2b2lkIDAsIG5vZGUuaW1wb3J0cy5jbGVhcigpO1xuXHR9XG5cdC8qKlxuXHQqIEV4dHJhY3RzIHRoZSBpbmxpbmVkIHNvdXJjZSBtYXAgZnJvbSB0aGUgbW9kdWxlIGNvZGUgYW5kIHJldHVybnMgdGhlIGRlY29kZWRcblx0KiBzb3VyY2UgbWFwLiBJZiB0aGUgc291cmNlIG1hcCBpcyBub3QgaW5saW5lZCwgaXQgd2lsbCByZXR1cm4gbnVsbC5cblx0KiBAcGFyYW0gaWQgUmVzb2x2ZWQgbW9kdWxlIElEXG5cdCovXG5cdGdldE1vZHVsZVNvdXJjZU1hcEJ5SWQoaWQpIHtcblx0XHRsZXQgbW9kID0gdGhpcy5nZXRNb2R1bGVCeUlkKGlkKTtcblx0XHRpZiAoIW1vZCkgcmV0dXJuIG51bGw7XG5cdFx0aWYgKG1vZC5tYXApIHJldHVybiBtb2QubWFwO1xuXHRcdGlmICghbW9kLm1ldGEgfHwgIShcImNvZGVcIiBpbiBtb2QubWV0YSkpIHJldHVybiBudWxsO1xuXHRcdGxldCBwYXR0ZXJuID0gYC8vIyAke1NPVVJDRU1BUFBJTkdfVVJMfT1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGAsIGxhc3RJbmRleCA9IG1vZC5tZXRhLmNvZGUubGFzdEluZGV4T2YocGF0dGVybik7XG5cdFx0aWYgKGxhc3RJbmRleCA9PT0gLTEpIHJldHVybiBudWxsO1xuXHRcdGxldCBtYXBTdHJpbmcgPSBNT0RVTEVfUlVOTkVSX1NPVVJDRU1BUFBJTkdfUkVHRVhQLmV4ZWMobW9kLm1ldGEuY29kZS5zbGljZShsYXN0SW5kZXgpKT8uWzFdO1xuXHRcdHJldHVybiBtYXBTdHJpbmcgPyAobW9kLm1hcCA9IG5ldyBEZWNvZGVkTWFwKEpTT04ucGFyc2UoZGVjb2RlQmFzZTY0KG1hcFN0cmluZykpLCBtb2QuZmlsZSksIG1vZC5tYXApIDogbnVsbDtcblx0fVxuXHRjbGVhcigpIHtcblx0XHR0aGlzLmlkVG9Nb2R1bGVNYXAuY2xlYXIoKSwgdGhpcy5maWxlVG9Nb2R1bGVzTWFwLmNsZWFyKCksIHRoaXMudXJsVG9JZE1vZHVsZU1hcC5jbGVhcigpO1xuXHR9XG59O1xuY29uc3QgcHJlZml4ZWRCdWlsdGlucyA9IG5ldyBTZXQoW1xuXHRcIm5vZGU6c2VhXCIsXG5cdFwibm9kZTpzcWxpdGVcIixcblx0XCJub2RlOnRlc3RcIixcblx0XCJub2RlOnRlc3QvcmVwb3J0ZXJzXCJcbl0pO1xuZnVuY3Rpb24gbm9ybWFsaXplTW9kdWxlSWQoZmlsZSkge1xuXHRyZXR1cm4gcHJlZml4ZWRCdWlsdGlucy5oYXMoZmlsZSkgPyBmaWxlIDogc2xhc2goZmlsZSkucmVwbGFjZSgvXlxcL0Bmc1xcLy8sIGlzV2luZG93cyA/IFwiXCIgOiBcIi9cIikucmVwbGFjZSgvXm5vZGU6LywgXCJcIikucmVwbGFjZSgvXlxcLysvLCBcIi9cIikucmVwbGFjZSgvXmZpbGU6XFwvKy8sIGlzV2luZG93cyA/IFwiXCIgOiBcIi9cIik7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvc2hhcmVkL2htci50c1xudmFyIEhNUkNvbnRleHQgPSBjbGFzcyB7XG5cdG5ld0xpc3RlbmVycztcblx0Y29uc3RydWN0b3IoaG1yQ2xpZW50LCBvd25lclBhdGgpIHtcblx0XHR0aGlzLmhtckNsaWVudCA9IGhtckNsaWVudCwgdGhpcy5vd25lclBhdGggPSBvd25lclBhdGgsIGhtckNsaWVudC5kYXRhTWFwLmhhcyhvd25lclBhdGgpIHx8IGhtckNsaWVudC5kYXRhTWFwLnNldChvd25lclBhdGgsIHt9KTtcblx0XHRsZXQgbW9kID0gaG1yQ2xpZW50LmhvdE1vZHVsZXNNYXAuZ2V0KG93bmVyUGF0aCk7XG5cdFx0bW9kICYmIChtb2QuY2FsbGJhY2tzID0gW10pO1xuXHRcdGxldCBzdGFsZUxpc3RlbmVycyA9IGhtckNsaWVudC5jdHhUb0xpc3RlbmVyc01hcC5nZXQob3duZXJQYXRoKTtcblx0XHRpZiAoc3RhbGVMaXN0ZW5lcnMpIGZvciAobGV0IFtldmVudCwgc3RhbGVGbnNdIG9mIHN0YWxlTGlzdGVuZXJzKSB7XG5cdFx0XHRsZXQgbGlzdGVuZXJzID0gaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcC5nZXQoZXZlbnQpO1xuXHRcdFx0bGlzdGVuZXJzICYmIGhtckNsaWVudC5jdXN0b21MaXN0ZW5lcnNNYXAuc2V0KGV2ZW50LCBsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiAhc3RhbGVGbnMuaW5jbHVkZXMobCkpKTtcblx0XHR9XG5cdFx0dGhpcy5uZXdMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBobXJDbGllbnQuY3R4VG9MaXN0ZW5lcnNNYXAuc2V0KG93bmVyUGF0aCwgdGhpcy5uZXdMaXN0ZW5lcnMpO1xuXHR9XG5cdGdldCBkYXRhKCkge1xuXHRcdHJldHVybiB0aGlzLmhtckNsaWVudC5kYXRhTWFwLmdldCh0aGlzLm93bmVyUGF0aCk7XG5cdH1cblx0YWNjZXB0KGRlcHMsIGNhbGxiYWNrKSB7XG5cdFx0aWYgKHR5cGVvZiBkZXBzID09IFwiZnVuY3Rpb25cIiB8fCAhZGVwcykgdGhpcy5hY2NlcHREZXBzKFt0aGlzLm93bmVyUGF0aF0sIChbbW9kXSkgPT4gZGVwcz8uKG1vZCkpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiBkZXBzID09IFwic3RyaW5nXCIpIHRoaXMuYWNjZXB0RGVwcyhbZGVwc10sIChbbW9kXSkgPT4gY2FsbGJhY2s/Lihtb2QpKTtcblx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KGRlcHMpKSB0aGlzLmFjY2VwdERlcHMoZGVwcywgY2FsbGJhY2spO1xuXHRcdGVsc2UgdGhyb3cgRXJyb3IoXCJpbnZhbGlkIGhvdC5hY2NlcHQoKSB1c2FnZS5cIik7XG5cdH1cblx0YWNjZXB0RXhwb3J0cyhfLCBjYWxsYmFjaykge1xuXHRcdHRoaXMuYWNjZXB0RGVwcyhbdGhpcy5vd25lclBhdGhdLCAoW21vZF0pID0+IGNhbGxiYWNrPy4obW9kKSk7XG5cdH1cblx0ZGlzcG9zZShjYikge1xuXHRcdHRoaXMuaG1yQ2xpZW50LmRpc3Bvc2VNYXAuc2V0KHRoaXMub3duZXJQYXRoLCBjYik7XG5cdH1cblx0cHJ1bmUoY2IpIHtcblx0XHR0aGlzLmhtckNsaWVudC5wcnVuZU1hcC5zZXQodGhpcy5vd25lclBhdGgsIGNiKTtcblx0fVxuXHRkZWNsaW5lKCkge31cblx0aW52YWxpZGF0ZShtZXNzYWdlKSB7XG5cdFx0bGV0IGZpcnN0SW52YWxpZGF0ZWRCeSA9IHRoaXMuaG1yQ2xpZW50LmN1cnJlbnRGaXJzdEludmFsaWRhdGVkQnkgPz8gdGhpcy5vd25lclBhdGg7XG5cdFx0dGhpcy5obXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTppbnZhbGlkYXRlXCIsIHtcblx0XHRcdHBhdGg6IHRoaXMub3duZXJQYXRoLFxuXHRcdFx0bWVzc2FnZSxcblx0XHRcdGZpcnN0SW52YWxpZGF0ZWRCeVxuXHRcdH0pLCB0aGlzLnNlbmQoXCJ2aXRlOmludmFsaWRhdGVcIiwge1xuXHRcdFx0cGF0aDogdGhpcy5vd25lclBhdGgsXG5cdFx0XHRtZXNzYWdlLFxuXHRcdFx0Zmlyc3RJbnZhbGlkYXRlZEJ5XG5cdFx0fSksIHRoaXMuaG1yQ2xpZW50LmxvZ2dlci5kZWJ1ZyhgaW52YWxpZGF0ZSAke3RoaXMub3duZXJQYXRofSR7bWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIn1gKTtcblx0fVxuXHRvbihldmVudCwgY2IpIHtcblx0XHRsZXQgYWRkVG9NYXAgPSAobWFwKSA9PiB7XG5cdFx0XHRsZXQgZXhpc3RpbmcgPSBtYXAuZ2V0KGV2ZW50KSB8fCBbXTtcblx0XHRcdGV4aXN0aW5nLnB1c2goY2IpLCBtYXAuc2V0KGV2ZW50LCBleGlzdGluZyk7XG5cdFx0fTtcblx0XHRhZGRUb01hcCh0aGlzLmhtckNsaWVudC5jdXN0b21MaXN0ZW5lcnNNYXApLCBhZGRUb01hcCh0aGlzLm5ld0xpc3RlbmVycyk7XG5cdH1cblx0b2ZmKGV2ZW50LCBjYikge1xuXHRcdGxldCByZW1vdmVGcm9tTWFwID0gKG1hcCkgPT4ge1xuXHRcdFx0bGV0IGV4aXN0aW5nID0gbWFwLmdldChldmVudCk7XG5cdFx0XHRpZiAoZXhpc3RpbmcgPT09IHZvaWQgMCkgcmV0dXJuO1xuXHRcdFx0bGV0IHBydW5lZCA9IGV4aXN0aW5nLmZpbHRlcigobCkgPT4gbCAhPT0gY2IpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0bWFwLmRlbGV0ZShldmVudCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdG1hcC5zZXQoZXZlbnQsIHBydW5lZCk7XG5cdFx0fTtcblx0XHRyZW1vdmVGcm9tTWFwKHRoaXMuaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcCksIHJlbW92ZUZyb21NYXAodGhpcy5uZXdMaXN0ZW5lcnMpO1xuXHR9XG5cdHNlbmQoZXZlbnQsIGRhdGEpIHtcblx0XHR0aGlzLmhtckNsaWVudC5zZW5kKHtcblx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRldmVudCxcblx0XHRcdGRhdGFcblx0XHR9KTtcblx0fVxuXHRhY2NlcHREZXBzKGRlcHMsIGNhbGxiYWNrID0gKCkgPT4ge30pIHtcblx0XHRsZXQgbW9kID0gdGhpcy5obXJDbGllbnQuaG90TW9kdWxlc01hcC5nZXQodGhpcy5vd25lclBhdGgpIHx8IHtcblx0XHRcdGlkOiB0aGlzLm93bmVyUGF0aCxcblx0XHRcdGNhbGxiYWNrczogW11cblx0XHR9O1xuXHRcdG1vZC5jYWxsYmFja3MucHVzaCh7XG5cdFx0XHRkZXBzLFxuXHRcdFx0Zm46IGNhbGxiYWNrXG5cdFx0fSksIHRoaXMuaG1yQ2xpZW50LmhvdE1vZHVsZXNNYXAuc2V0KHRoaXMub3duZXJQYXRoLCBtb2QpO1xuXHR9XG59LCBITVJDbGllbnQgPSBjbGFzcyB7XG5cdGhvdE1vZHVsZXNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRkaXNwb3NlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0cHJ1bmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRkYXRhTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0Y3VzdG9tTGlzdGVuZXJzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0Y3R4VG9MaXN0ZW5lcnNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRjdXJyZW50Rmlyc3RJbnZhbGlkYXRlZEJ5O1xuXHRjb25zdHJ1Y3Rvcihsb2dnZXIsIHRyYW5zcG9ydCwgaW1wb3J0VXBkYXRlZE1vZHVsZSkge1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyLCB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydCwgdGhpcy5pbXBvcnRVcGRhdGVkTW9kdWxlID0gaW1wb3J0VXBkYXRlZE1vZHVsZTtcblx0fVxuXHRhc3luYyBub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIGRhdGEpIHtcblx0XHRsZXQgY2JzID0gdGhpcy5jdXN0b21MaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50KTtcblx0XHRjYnMgJiYgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNicy5tYXAoKGNiKSA9PiBjYihkYXRhKSkpO1xuXHR9XG5cdHNlbmQocGF5bG9hZCkge1xuXHRcdHRoaXMudHJhbnNwb3J0LnNlbmQocGF5bG9hZCkuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoZXJyKTtcblx0XHR9KTtcblx0fVxuXHRjbGVhcigpIHtcblx0XHR0aGlzLmhvdE1vZHVsZXNNYXAuY2xlYXIoKSwgdGhpcy5kaXNwb3NlTWFwLmNsZWFyKCksIHRoaXMucHJ1bmVNYXAuY2xlYXIoKSwgdGhpcy5kYXRhTWFwLmNsZWFyKCksIHRoaXMuY3VzdG9tTGlzdGVuZXJzTWFwLmNsZWFyKCksIHRoaXMuY3R4VG9MaXN0ZW5lcnNNYXAuY2xlYXIoKTtcblx0fVxuXHRhc3luYyBwcnVuZVBhdGhzKHBhdGhzKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwocGF0aHMubWFwKChwYXRoKSA9PiB7XG5cdFx0XHRsZXQgZGlzcG9zZXIgPSB0aGlzLmRpc3Bvc2VNYXAuZ2V0KHBhdGgpO1xuXHRcdFx0aWYgKGRpc3Bvc2VyKSByZXR1cm4gZGlzcG9zZXIodGhpcy5kYXRhTWFwLmdldChwYXRoKSk7XG5cdFx0fSkpLCBhd2FpdCBQcm9taXNlLmFsbChwYXRocy5tYXAoKHBhdGgpID0+IHtcblx0XHRcdGxldCBmbiA9IHRoaXMucHJ1bmVNYXAuZ2V0KHBhdGgpO1xuXHRcdFx0aWYgKGZuKSByZXR1cm4gZm4odGhpcy5kYXRhTWFwLmdldChwYXRoKSk7XG5cdFx0fSkpO1xuXHR9XG5cdHdhcm5GYWlsZWRVcGRhdGUoZXJyLCBwYXRoKSB7XG5cdFx0KCEoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHx8ICFlcnIubWVzc2FnZS5pbmNsdWRlcyhcImZldGNoXCIpKSAmJiB0aGlzLmxvZ2dlci5lcnJvcihlcnIpLCB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbG9hZCAke3BhdGh9LiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBzeW50YXggZXJyb3JzIG9yIGltcG9ydGluZyBub24tZXhpc3RlbnQgbW9kdWxlcy4gKHNlZSBlcnJvcnMgYWJvdmUpYCk7XG5cdH1cblx0dXBkYXRlUXVldWUgPSBbXTtcblx0cGVuZGluZ1VwZGF0ZVF1ZXVlID0gITE7XG5cdC8qKlxuXHQqIGJ1ZmZlciBtdWx0aXBsZSBob3QgdXBkYXRlcyB0cmlnZ2VyZWQgYnkgdGhlIHNhbWUgc3JjIGNoYW5nZVxuXHQqIHNvIHRoYXQgdGhleSBhcmUgaW52b2tlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgc2VudC5cblx0KiAob3RoZXJ3aXNlIHRoZSBvcmRlciBtYXkgYmUgaW5jb25zaXN0ZW50IGJlY2F1c2Ugb2YgdGhlIGh0dHAgcmVxdWVzdCByb3VuZCB0cmlwKVxuXHQqL1xuXHRhc3luYyBxdWV1ZVVwZGF0ZShwYXlsb2FkKSB7XG5cdFx0aWYgKHRoaXMudXBkYXRlUXVldWUucHVzaCh0aGlzLmZldGNoVXBkYXRlKHBheWxvYWQpKSwgIXRoaXMucGVuZGluZ1VwZGF0ZVF1ZXVlKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdVcGRhdGVRdWV1ZSA9ICEwLCBhd2FpdCBQcm9taXNlLnJlc29sdmUoKSwgdGhpcy5wZW5kaW5nVXBkYXRlUXVldWUgPSAhMTtcblx0XHRcdGxldCBsb2FkaW5nID0gWy4uLnRoaXMudXBkYXRlUXVldWVdO1xuXHRcdFx0dGhpcy51cGRhdGVRdWV1ZSA9IFtdLCAoYXdhaXQgUHJvbWlzZS5hbGwobG9hZGluZykpLmZvckVhY2goKGZuKSA9PiBmbiAmJiBmbigpKTtcblx0XHR9XG5cdH1cblx0YXN5bmMgZmV0Y2hVcGRhdGUodXBkYXRlKSB7XG5cdFx0bGV0IHsgcGF0aCwgYWNjZXB0ZWRQYXRoLCBmaXJzdEludmFsaWRhdGVkQnkgfSA9IHVwZGF0ZSwgbW9kID0gdGhpcy5ob3RNb2R1bGVzTWFwLmdldChwYXRoKTtcblx0XHRpZiAoIW1vZCkgcmV0dXJuO1xuXHRcdGxldCBmZXRjaGVkTW9kdWxlLCBpc1NlbGZVcGRhdGUgPSBwYXRoID09PSBhY2NlcHRlZFBhdGgsIHF1YWxpZmllZENhbGxiYWNrcyA9IG1vZC5jYWxsYmFja3MuZmlsdGVyKCh7IGRlcHMgfSkgPT4gZGVwcy5pbmNsdWRlcyhhY2NlcHRlZFBhdGgpKTtcblx0XHRpZiAoaXNTZWxmVXBkYXRlIHx8IHF1YWxpZmllZENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRsZXQgZGlzcG9zZXIgPSB0aGlzLmRpc3Bvc2VNYXAuZ2V0KGFjY2VwdGVkUGF0aCk7XG5cdFx0XHRkaXNwb3NlciAmJiBhd2FpdCBkaXNwb3Nlcih0aGlzLmRhdGFNYXAuZ2V0KGFjY2VwdGVkUGF0aCkpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZmV0Y2hlZE1vZHVsZSA9IGF3YWl0IHRoaXMuaW1wb3J0VXBkYXRlZE1vZHVsZSh1cGRhdGUpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHR0aGlzLndhcm5GYWlsZWRVcGRhdGUoZSwgYWNjZXB0ZWRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuY3VycmVudEZpcnN0SW52YWxpZGF0ZWRCeSA9IGZpcnN0SW52YWxpZGF0ZWRCeTtcblx0XHRcdFx0Zm9yIChsZXQgeyBkZXBzLCBmbiB9IG9mIHF1YWxpZmllZENhbGxiYWNrcykgZm4oZGVwcy5tYXAoKGRlcCkgPT4gZGVwID09PSBhY2NlcHRlZFBhdGggPyBmZXRjaGVkTW9kdWxlIDogdm9pZCAwKSk7XG5cdFx0XHRcdGxldCBsb2dnZWRQYXRoID0gaXNTZWxmVXBkYXRlID8gcGF0aCA6IGAke2FjY2VwdGVkUGF0aH0gdmlhICR7cGF0aH1gO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5kZWJ1ZyhgaG90IHVwZGF0ZWQ6ICR7bG9nZ2VkUGF0aH1gKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHRoaXMuY3VycmVudEZpcnN0SW52YWxpZGF0ZWRCeSA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9zc3JUcmFuc2Zvcm0udHNcbi8qKlxuKiBWaXRlIGNvbnZlcnRzIGBpbXBvcnQgeyB9IGZyb20gJ2ZvbydgIHRvIGBjb25zdCBfID0gX192aXRlX3Nzcl9pbXBvcnRfXygnZm9vJylgLlxuKiBUb3AtbGV2ZWwgaW1wb3J0cyBhbmQgZHluYW1pYyBpbXBvcnRzIHdvcmsgc2xpZ2h0bHkgZGlmZmVyZW50bHkgaW4gTm9kZS5qcy5cbiogVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIHRoZSBkaWZmZXJlbmNlcyBzbyBpdCBtYXRjaGVzIHByb2QgYmVoYXZpb3VyLlxuKi9cbmZ1bmN0aW9uIGFuYWx5emVJbXBvcnRlZE1vZERpZmZlcmVuY2UobW9kLCByYXdJZCwgbW9kdWxlVHlwZSwgbWV0YWRhdGEpIHtcblx0aWYgKCFtZXRhZGF0YT8uaXNEeW5hbWljSW1wb3J0ICYmIG1ldGFkYXRhPy5pbXBvcnRlZE5hbWVzPy5sZW5ndGgpIHtcblx0XHRsZXQgbWlzc2luZ0JpbmRpbmdzID0gbWV0YWRhdGEuaW1wb3J0ZWROYW1lcy5maWx0ZXIoKHMpID0+ICEocyBpbiBtb2QpKTtcblx0XHRpZiAobWlzc2luZ0JpbmRpbmdzLmxlbmd0aCkge1xuXHRcdFx0bGV0IGxhc3RCaW5kaW5nID0gbWlzc2luZ0JpbmRpbmdzW21pc3NpbmdCaW5kaW5ncy5sZW5ndGggLSAxXTtcblx0XHRcdHRocm93IFN5bnRheEVycm9yKG1vZHVsZVR5cGUgPT09IFwibW9kdWxlXCIgPyBgW3ZpdGVdIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICcke3Jhd0lkfScgZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJyR7bGFzdEJpbmRpbmd9J2AgOiBgXFxcblt2aXRlXSBOYW1lZCBleHBvcnQgJyR7bGFzdEJpbmRpbmd9JyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICcke3Jhd0lkfScgaXMgYSBDb21tb25KUyBtb2R1bGUsIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbkNvbW1vbkpTIG1vZHVsZXMgY2FuIGFsd2F5cyBiZSBpbXBvcnRlZCB2aWEgdGhlIGRlZmF1bHQgZXhwb3J0LCBmb3IgZXhhbXBsZSB1c2luZzpcblxuaW1wb3J0IHBrZyBmcm9tICcke3Jhd0lkfSc7XG5jb25zdCB7JHttaXNzaW5nQmluZGluZ3Muam9pbihcIiwgXCIpfX0gPSBwa2c7XG5gKTtcblx0XHR9XG5cdH1cbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9uYW5vaWRANS4xLjcvbm9kZV9tb2R1bGVzL25hbm9pZC9ub24tc2VjdXJlL2luZGV4LmpzXG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuXHRsZXQgaWQgPSBcIlwiLCBpID0gc2l6ZSB8IDA7XG5cdGZvciAoOyBpLS07KSBpZCArPSBcInVzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3RcIltNYXRoLnJhbmRvbSgpICogNjQgfCAwXTtcblx0cmV0dXJuIGlkO1xufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvbW9kdWxlUnVubmVyVHJhbnNwb3J0LnRzXG5mdW5jdGlvbiByZXZpdmVJbnZva2VFcnJvcihlKSB7XG5cdGxldCBlcnJvciA9IEVycm9yKGUubWVzc2FnZSB8fCBcIlVua25vd24gaW52b2tlIGVycm9yXCIpO1xuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihlcnJvciwgZSwgeyBydW5uZXJFcnJvcjogLyogQF9fUFVSRV9fICovIEVycm9yKFwiUnVubmVyRXJyb3JcIikgfSksIGVycm9yO1xufVxuY29uc3QgY3JlYXRlSW52b2tlYWJsZVRyYW5zcG9ydCA9ICh0cmFuc3BvcnQpID0+IHtcblx0aWYgKHRyYW5zcG9ydC5pbnZva2UpIHJldHVybiB7XG5cdFx0Li4udHJhbnNwb3J0LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gYXdhaXQgdHJhbnNwb3J0Lmludm9rZSh7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGV2ZW50OiBcInZpdGU6aW52b2tlXCIsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRpZDogXCJzZW5kXCIsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRkYXRhXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHRocm93IHJldml2ZUludm9rZUVycm9yKHJlc3VsdC5lcnJvcik7XG5cdFx0XHRyZXR1cm4gcmVzdWx0LnJlc3VsdDtcblx0XHR9XG5cdH07XG5cdGlmICghdHJhbnNwb3J0LnNlbmQgfHwgIXRyYW5zcG9ydC5jb25uZWN0KSB0aHJvdyBFcnJvcihcInRyYW5zcG9ydCBtdXN0IGltcGxlbWVudCBzZW5kIGFuZCBjb25uZWN0IHdoZW4gaW52b2tlIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTtcblx0bGV0IHJwY1Byb21pc2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0cmV0dXJuIHtcblx0XHQuLi50cmFuc3BvcnQsXG5cdFx0Y29ubmVjdCh7IG9uTWVzc2FnZSwgb25EaXNjb25uZWN0aW9uIH0pIHtcblx0XHRcdHJldHVybiB0cmFuc3BvcnQuY29ubmVjdCh7XG5cdFx0XHRcdG9uTWVzc2FnZShwYXlsb2FkKSB7XG5cdFx0XHRcdFx0aWYgKHBheWxvYWQudHlwZSA9PT0gXCJjdXN0b21cIiAmJiBwYXlsb2FkLmV2ZW50ID09PSBcInZpdGU6aW52b2tlXCIpIHtcblx0XHRcdFx0XHRcdGxldCBkYXRhID0gcGF5bG9hZC5kYXRhO1xuXHRcdFx0XHRcdFx0aWYgKGRhdGEuaWQuc3RhcnRzV2l0aChcInJlc3BvbnNlOlwiKSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgaW52b2tlSWQgPSBkYXRhLmlkLnNsaWNlKDkpLCBwcm9taXNlID0gcnBjUHJvbWlzZXMuZ2V0KGludm9rZUlkKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFwcm9taXNlKSByZXR1cm47XG5cdFx0XHRcdFx0XHRcdHByb21pc2UudGltZW91dElkICYmIGNsZWFyVGltZW91dChwcm9taXNlLnRpbWVvdXRJZCksIHJwY1Byb21pc2VzLmRlbGV0ZShpbnZva2VJZCk7XG5cdFx0XHRcdFx0XHRcdGxldCB7IGVycm9yLCByZXN1bHQgfSA9IGRhdGEuZGF0YTtcblx0XHRcdFx0XHRcdFx0ZXJyb3IgPyBwcm9taXNlLnJlamVjdChlcnJvcikgOiBwcm9taXNlLnJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvbk1lc3NhZ2UocGF5bG9hZCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uRGlzY29ubmVjdGlvblxuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRkaXNjb25uZWN0KCkge1xuXHRcdFx0cmV0dXJuIHJwY1Byb21pc2VzLmZvckVhY2goKHByb21pc2UpID0+IHtcblx0XHRcdFx0cHJvbWlzZS5yZWplY3QoLyogQF9fUFVSRV9fICovIEVycm9yKGB0cmFuc3BvcnQgd2FzIGRpc2Nvbm5lY3RlZCwgY2Fubm90IGNhbGwgJHtKU09OLnN0cmluZ2lmeShwcm9taXNlLm5hbWUpfWApKTtcblx0XHRcdH0pLCBycGNQcm9taXNlcy5jbGVhcigpLCB0cmFuc3BvcnQuZGlzY29ubmVjdD8uKCk7XG5cdFx0fSxcblx0XHRzZW5kKGRhdGEpIHtcblx0XHRcdHJldHVybiB0cmFuc3BvcnQuc2VuZChkYXRhKTtcblx0XHR9LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRsZXQgcHJvbWlzZUlkID0gbmFub2lkKCksIHdyYXBwZWREYXRhID0ge1xuXHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRldmVudDogXCJ2aXRlOmludm9rZVwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRpZDogYHNlbmQ6JHtwcm9taXNlSWR9YCxcblx0XHRcdFx0XHRkYXRhXG5cdFx0XHRcdH1cblx0XHRcdH0sIHNlbmRQcm9taXNlID0gdHJhbnNwb3J0LnNlbmQod3JhcHBlZERhdGEpLCB7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9ID0gcHJvbWlzZVdpdGhSZXNvbHZlcnMoKSwgdGltZW91dCA9IHRyYW5zcG9ydC50aW1lb3V0ID8/IDZlNCwgdGltZW91dElkO1xuXHRcdFx0dGltZW91dCA+IDAgJiYgKHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRycGNQcm9taXNlcy5kZWxldGUocHJvbWlzZUlkKSwgcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBFcnJvcihgdHJhbnNwb3J0IGludm9rZSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zIChkYXRhOiAke0pTT04uc3RyaW5naWZ5KHdyYXBwZWREYXRhKX0pYCkpO1xuXHRcdFx0fSwgdGltZW91dCksIHRpbWVvdXRJZD8udW5yZWY/LigpKSwgcnBjUHJvbWlzZXMuc2V0KHByb21pc2VJZCwge1xuXHRcdFx0XHRyZXNvbHZlLFxuXHRcdFx0XHRyZWplY3QsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRpbWVvdXRJZFxuXHRcdFx0fSksIHNlbmRQcm9taXNlICYmIHNlbmRQcm9taXNlLmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXRJZCksIHJwY1Byb21pc2VzLmRlbGV0ZShwcm9taXNlSWQpLCByZWplY3QoZXJyKTtcblx0XHRcdH0pO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIGF3YWl0IHByb21pc2U7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhyb3cgcmV2aXZlSW52b2tlRXJyb3IoZXJyKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59LCBub3JtYWxpemVNb2R1bGVSdW5uZXJUcmFuc3BvcnQgPSAodHJhbnNwb3J0KSA9PiB7XG5cdGxldCBpbnZva2VhYmxlVHJhbnNwb3J0ID0gY3JlYXRlSW52b2tlYWJsZVRyYW5zcG9ydCh0cmFuc3BvcnQpLCBpc0Nvbm5lY3RlZCA9ICFpbnZva2VhYmxlVHJhbnNwb3J0LmNvbm5lY3QsIGNvbm5lY3RpbmdQcm9taXNlO1xuXHRyZXR1cm4ge1xuXHRcdC4uLnRyYW5zcG9ydCxcblx0XHQuLi5pbnZva2VhYmxlVHJhbnNwb3J0LmNvbm5lY3QgPyB7IGFzeW5jIGNvbm5lY3Qob25NZXNzYWdlKSB7XG5cdFx0XHRpZiAoaXNDb25uZWN0ZWQpIHJldHVybjtcblx0XHRcdGlmIChjb25uZWN0aW5nUHJvbWlzZSkge1xuXHRcdFx0XHRhd2FpdCBjb25uZWN0aW5nUHJvbWlzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IG1heWJlUHJvbWlzZSA9IGludm9rZWFibGVUcmFuc3BvcnQuY29ubmVjdCh7XG5cdFx0XHRcdG9uTWVzc2FnZTogb25NZXNzYWdlID8/ICgoKSA9PiB7fSksXG5cdFx0XHRcdG9uRGlzY29ubmVjdGlvbigpIHtcblx0XHRcdFx0XHRpc0Nvbm5lY3RlZCA9ICExO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdG1heWJlUHJvbWlzZSAmJiAoY29ubmVjdGluZ1Byb21pc2UgPSBtYXliZVByb21pc2UsIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlLCBjb25uZWN0aW5nUHJvbWlzZSA9IHZvaWQgMCksIGlzQ29ubmVjdGVkID0gITA7XG5cdFx0fSB9IDoge30sXG5cdFx0Li4uaW52b2tlYWJsZVRyYW5zcG9ydC5kaXNjb25uZWN0ID8geyBhc3luYyBkaXNjb25uZWN0KCkge1xuXHRcdFx0aXNDb25uZWN0ZWQgJiYgKGNvbm5lY3RpbmdQcm9taXNlICYmIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlLCBpc0Nvbm5lY3RlZCA9ICExLCBhd2FpdCBpbnZva2VhYmxlVHJhbnNwb3J0LmRpc2Nvbm5lY3QoKSk7XG5cdFx0fSB9IDoge30sXG5cdFx0YXN5bmMgc2VuZChkYXRhKSB7XG5cdFx0XHRpZiAoaW52b2tlYWJsZVRyYW5zcG9ydC5zZW5kKSB7XG5cdFx0XHRcdGlmICghaXNDb25uZWN0ZWQpIGlmIChjb25uZWN0aW5nUHJvbWlzZSkgYXdhaXQgY29ubmVjdGluZ1Byb21pc2U7XG5cdFx0XHRcdGVsc2UgdGhyb3cgRXJyb3IoXCJzZW5kIHdhcyBjYWxsZWQgYmVmb3JlIGNvbm5lY3RcIik7XG5cdFx0XHRcdGF3YWl0IGludm9rZWFibGVUcmFuc3BvcnQuc2VuZChkYXRhKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRpZiAoIWlzQ29ubmVjdGVkKSBpZiAoY29ubmVjdGluZ1Byb21pc2UpIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlO1xuXHRcdFx0ZWxzZSB0aHJvdyBFcnJvcihcImludm9rZSB3YXMgY2FsbGVkIGJlZm9yZSBjb25uZWN0XCIpO1xuXHRcdFx0cmV0dXJuIGludm9rZWFibGVUcmFuc3BvcnQuaW52b2tlKG5hbWUsIGRhdGEpO1xuXHRcdH1cblx0fTtcbn0sIGNyZWF0ZVdlYlNvY2tldE1vZHVsZVJ1bm5lclRyYW5zcG9ydCA9IChvcHRpb25zKSA9PiB7XG5cdGxldCBwaW5nSW50ZXJ2YWwgPSBvcHRpb25zLnBpbmdJbnRlcnZhbCA/PyAzZTQsIHdzLCBwaW5nSW50ZXJ2YWxJZDtcblx0cmV0dXJuIHtcblx0XHRhc3luYyBjb25uZWN0KHsgb25NZXNzYWdlLCBvbkRpc2Nvbm5lY3Rpb24gfSkge1xuXHRcdFx0bGV0IHNvY2tldCA9IG9wdGlvbnMuY3JlYXRlQ29ubmVjdGlvbigpO1xuXHRcdFx0c29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jICh7IGRhdGEgfSkgPT4ge1xuXHRcdFx0XHRvbk1lc3NhZ2UoSlNPTi5wYXJzZShkYXRhKSk7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBpc09wZW5lZCA9IHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTjtcblx0XHRcdGlzT3BlbmVkIHx8IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0c29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsICgpID0+IHtcblx0XHRcdFx0XHRpc09wZW5lZCA9ICEwLCByZXNvbHZlKCk7XG5cdFx0XHRcdH0sIHsgb25jZTogITAgfSksIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGlmICghaXNPcGVuZWQpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgvKiBAX19QVVJFX18gKi8gRXJyb3IoXCJXZWJTb2NrZXQgY2xvc2VkIHdpdGhvdXQgb3BlbmVkLlwiKSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9uTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IFwidml0ZTp3czpkaXNjb25uZWN0XCIsXG5cdFx0XHRcdFx0XHRkYXRhOiB7IHdlYlNvY2tldDogc29ja2V0IH1cblx0XHRcdFx0XHR9KSwgb25EaXNjb25uZWN0aW9uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSksIG9uTWVzc2FnZSh7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGV2ZW50OiBcInZpdGU6d3M6Y29ubmVjdFwiLFxuXHRcdFx0XHRkYXRhOiB7IHdlYlNvY2tldDogc29ja2V0IH1cblx0XHRcdH0pLCB3cyA9IHNvY2tldCwgcGluZ0ludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG5cdFx0XHRcdHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTiAmJiBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwicGluZ1wiIH0pKTtcblx0XHRcdH0sIHBpbmdJbnRlcnZhbCk7XG5cdFx0fSxcblx0XHRkaXNjb25uZWN0KCkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChwaW5nSW50ZXJ2YWxJZCksIHdzPy5jbG9zZSgpO1xuXHRcdH0sXG5cdFx0c2VuZChkYXRhKSB7XG5cdFx0XHR3cy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblx0XHR9XG5cdH07XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9idWlsdGluLnRzXG5mdW5jdGlvbiBjcmVhdGVJc0J1aWx0aW4oYnVpbHRpbnMpIHtcblx0bGV0IHBsYWluQnVpbHRpbnNTZXQgPSBuZXcgU2V0KGJ1aWx0aW5zLmZpbHRlcigoYnVpbHRpbikgPT4gdHlwZW9mIGJ1aWx0aW4gPT0gXCJzdHJpbmdcIikpLCByZWdleEJ1aWx0aW5zID0gYnVpbHRpbnMuZmlsdGVyKChidWlsdGluKSA9PiB0eXBlb2YgYnVpbHRpbiAhPSBcInN0cmluZ1wiKTtcblx0cmV0dXJuIChpZCkgPT4gcGxhaW5CdWlsdGluc1NldC5oYXMoaWQpIHx8IHJlZ2V4QnVpbHRpbnMuc29tZSgocmVnZXhwKSA9PiByZWdleHAudGVzdChpZCkpO1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvY29uc3RhbnRzLnRzXG5jb25zdCBzc3JNb2R1bGVFeHBvcnRzS2V5ID0gXCJfX3ZpdGVfc3NyX2V4cG9ydHNfX1wiLCBzc3JJbXBvcnRLZXkgPSBcIl9fdml0ZV9zc3JfaW1wb3J0X19cIiwgc3NyRHluYW1pY0ltcG9ydEtleSA9IFwiX192aXRlX3Nzcl9keW5hbWljX2ltcG9ydF9fXCIsIHNzckV4cG9ydEFsbEtleSA9IFwiX192aXRlX3Nzcl9leHBvcnRBbGxfX1wiLCBzc3JFeHBvcnROYW1lS2V5ID0gXCJfX3ZpdGVfc3NyX2V4cG9ydE5hbWVfX1wiLCBzc3JJbXBvcnRNZXRhS2V5ID0gXCJfX3ZpdGVfc3NyX2ltcG9ydF9tZXRhX19cIiwgbm9vcCA9ICgpID0+IHt9LCBzaWxlbnRDb25zb2xlID0ge1xuXHRkZWJ1Zzogbm9vcCxcblx0ZXJyb3I6IG5vb3Bcbn0sIGhtckxvZ2dlciA9IHtcblx0ZGVidWc6ICguLi5tc2cpID0+IGNvbnNvbGUubG9nKFwiW3ZpdGVdXCIsIC4uLm1zZyksXG5cdGVycm9yOiAoZXJyb3IpID0+IGNvbnNvbGUubG9nKFwiW3ZpdGVdXCIsIGVycm9yKVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvaG1ySGFuZGxlci50c1xuZnVuY3Rpb24gY3JlYXRlSE1SSGFuZGxlcihoYW5kbGVyKSB7XG5cdGxldCBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXHRyZXR1cm4gKHBheWxvYWQpID0+IHF1ZXVlLmVucXVldWUoKCkgPT4gaGFuZGxlcihwYXlsb2FkKSk7XG59XG52YXIgUXVldWUgPSBjbGFzcyB7XG5cdHF1ZXVlID0gW107XG5cdHBlbmRpbmcgPSAhMTtcblx0ZW5xdWV1ZShwcm9taXNlKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRoaXMucXVldWUucHVzaCh7XG5cdFx0XHRcdHByb21pc2UsXG5cdFx0XHRcdHJlc29sdmUsXG5cdFx0XHRcdHJlamVjdFxuXHRcdFx0fSksIHRoaXMuZGVxdWV1ZSgpO1xuXHRcdH0pO1xuXHR9XG5cdGRlcXVldWUoKSB7XG5cdFx0aWYgKHRoaXMucGVuZGluZykgcmV0dXJuICExO1xuXHRcdGxldCBpdGVtID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXHRcdHJldHVybiBpdGVtID8gKHRoaXMucGVuZGluZyA9ICEwLCBpdGVtLnByb21pc2UoKS50aGVuKGl0ZW0ucmVzb2x2ZSkuY2F0Y2goaXRlbS5yZWplY3QpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5wZW5kaW5nID0gITEsIHRoaXMuZGVxdWV1ZSgpO1xuXHRcdH0pLCAhMCkgOiAhMTtcblx0fVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2htckhhbmRsZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUhNUkhhbmRsZXJGb3JSdW5uZXIocnVubmVyKSB7XG5cdHJldHVybiBjcmVhdGVITVJIYW5kbGVyKGFzeW5jIChwYXlsb2FkKSA9PiB7XG5cdFx0bGV0IGhtckNsaWVudCA9IHJ1bm5lci5obXJDbGllbnQ7XG5cdFx0aWYgKCEoIWhtckNsaWVudCB8fCBydW5uZXIuaXNDbG9zZWQoKSkpIHN3aXRjaCAocGF5bG9hZC50eXBlKSB7XG5cdFx0XHRjYXNlIFwiY29ubmVjdGVkXCI6XG5cdFx0XHRcdGhtckNsaWVudC5sb2dnZXIuZGVidWcoXCJjb25uZWN0ZWQuXCIpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJ1cGRhdGVcIjpcblx0XHRcdFx0YXdhaXQgaG1yQ2xpZW50Lm5vdGlmeUxpc3RlbmVycyhcInZpdGU6YmVmb3JlVXBkYXRlXCIsIHBheWxvYWQpLCBhd2FpdCBQcm9taXNlLmFsbChwYXlsb2FkLnVwZGF0ZXMubWFwKGFzeW5jICh1cGRhdGUpID0+IHtcblx0XHRcdFx0XHRpZiAodXBkYXRlLnR5cGUgPT09IFwianMtdXBkYXRlXCIpIHJldHVybiB1cGRhdGUuYWNjZXB0ZWRQYXRoID0gdW53cmFwSWQodXBkYXRlLmFjY2VwdGVkUGF0aCksIHVwZGF0ZS5wYXRoID0gdW53cmFwSWQodXBkYXRlLnBhdGgpLCBobXJDbGllbnQucXVldWVVcGRhdGUodXBkYXRlKTtcblx0XHRcdFx0XHRobXJDbGllbnQubG9nZ2VyLmVycm9yKFwiY3NzIGhtciBpcyBub3Qgc3VwcG9ydGVkIGluIHJ1bm5lciBtb2RlLlwiKTtcblx0XHRcdFx0fSkpLCBhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTphZnRlclVwZGF0ZVwiLCBwYXlsb2FkKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiY3VzdG9tXCI6XG5cdFx0XHRcdGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMocGF5bG9hZC5ldmVudCwgcGF5bG9hZC5kYXRhKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZnVsbC1yZWxvYWRcIjoge1xuXHRcdFx0XHRsZXQgeyB0cmlnZ2VyZWRCeSB9ID0gcGF5bG9hZCwgY2xlYXJFbnRyeXBvaW50VXJscyA9IHRyaWdnZXJlZEJ5ID8gZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgZ2V0TW9kdWxlc0J5RmlsZShydW5uZXIsIHNsYXNoKHRyaWdnZXJlZEJ5KSkpIDogZmluZEFsbEVudHJ5cG9pbnRzKHJ1bm5lcik7XG5cdFx0XHRcdGlmICghY2xlYXJFbnRyeXBvaW50VXJscy5zaXplKSBicmVhaztcblx0XHRcdFx0aG1yQ2xpZW50LmxvZ2dlci5kZWJ1ZyhcInByb2dyYW0gcmVsb2FkXCIpLCBhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTpiZWZvcmVGdWxsUmVsb2FkXCIsIHBheWxvYWQpLCBydW5uZXIuZXZhbHVhdGVkTW9kdWxlcy5jbGVhcigpO1xuXHRcdFx0XHRmb3IgKGxldCB1cmwgb2YgY2xlYXJFbnRyeXBvaW50VXJscykge1xuXHRcdFx0XHRcdGlmIChydW5uZXIuaXNDbG9zZWQoKSkgYnJlYWs7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHJ1bm5lci5pbXBvcnQodXJsKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRcdGlmIChydW5uZXIuaXNDbG9zZWQoKSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRlcnIuY29kZSAhPT0gXCJFUlJfT1VUREFURURfT1BUSU1JWkVEX0RFUFwiICYmIGhtckNsaWVudC5sb2dnZXIuZXJyb3IoYEFuIGVycm9yIGhhcHBlbmVkIGR1cmluZyBmdWxsIHJlbG9hZFxcbiR7ZXJyLm1lc3NhZ2V9XFxuJHtlcnIuc3RhY2t9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcInBydW5lXCI6XG5cdFx0XHRcdGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMoXCJ2aXRlOmJlZm9yZVBydW5lXCIsIHBheWxvYWQpLCBhd2FpdCBobXJDbGllbnQucHJ1bmVQYXRocyhwYXlsb2FkLnBhdGhzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZXJyb3JcIjoge1xuXHRcdFx0XHRhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTplcnJvclwiLCBwYXlsb2FkKTtcblx0XHRcdFx0bGV0IGVyciA9IHBheWxvYWQuZXJyO1xuXHRcdFx0XHRobXJDbGllbnQubG9nZ2VyLmVycm9yKGBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcXG4ke2Vyci5tZXNzYWdlfVxcbiR7ZXJyLnN0YWNrfWApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJwaW5nXCI6IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIHBheWxvYWQ7XG5cdFx0fVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldE1vZHVsZXNCeUZpbGUocnVubmVyLCBmaWxlKSB7XG5cdGxldCBub2RlcyA9IHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmdldE1vZHVsZXNCeUZpbGUoZmlsZSk7XG5cdHJldHVybiBub2RlcyA/IFsuLi5ub2Rlc10ubWFwKChub2RlKSA9PiBub2RlLmlkKSA6IFtdO1xufVxuZnVuY3Rpb24gZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgbW9kdWxlcywgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIGVudHJ5cG9pbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkge1xuXHRmb3IgKGxldCBtb2R1bGVJZCBvZiBtb2R1bGVzKSB7XG5cdFx0aWYgKHZpc2l0ZWQuaGFzKG1vZHVsZUlkKSkgY29udGludWU7XG5cdFx0dmlzaXRlZC5hZGQobW9kdWxlSWQpO1xuXHRcdGxldCBtb2R1bGUgPSBydW5uZXIuZXZhbHVhdGVkTW9kdWxlcy5nZXRNb2R1bGVCeUlkKG1vZHVsZUlkKTtcblx0XHRpZiAobW9kdWxlKSB7XG5cdFx0XHRpZiAoIW1vZHVsZS5pbXBvcnRlcnMuc2l6ZSkge1xuXHRcdFx0XHRlbnRyeXBvaW50cy5hZGQobW9kdWxlLnVybCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZXQgaW1wb3J0ZXIgb2YgbW9kdWxlLmltcG9ydGVycykgZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgW2ltcG9ydGVyXSwgdmlzaXRlZCwgZW50cnlwb2ludHMpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZW50cnlwb2ludHM7XG59XG5mdW5jdGlvbiBmaW5kQWxsRW50cnlwb2ludHMocnVubmVyLCBlbnRyeXBvaW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcblx0Zm9yIChsZXQgbW9kIG9mIHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmlkVG9Nb2R1bGVNYXAudmFsdWVzKCkpIG1vZC5pbXBvcnRlcnMuc2l6ZSB8fCBlbnRyeXBvaW50cy5hZGQobW9kLnVybCk7XG5cdHJldHVybiBlbnRyeXBvaW50cztcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3NvdXJjZW1hcC9pbnRlcmNlcHRvci50c1xuY29uc3Qgc291cmNlTWFwQ2FjaGUgPSB7fSwgZmlsZUNvbnRlbnRzQ2FjaGUgPSB7fSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgcmV0cmlldmVGaWxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCByZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgY3JlYXRlRXhlY0hhbmRsZXJzID0gKGhhbmRsZXJzKSA9PiAoKC4uLmFyZ3MpID0+IHtcblx0Zm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycykge1xuXHRcdGxldCByZXN1bHQgPSBoYW5kbGVyKC4uLmFyZ3MpO1xuXHRcdGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59KSwgcmV0cmlldmVGaWxlRnJvbUhhbmRsZXJzID0gY3JlYXRlRXhlY0hhbmRsZXJzKHJldHJpZXZlRmlsZUhhbmRsZXJzKSwgcmV0cmlldmVTb3VyY2VNYXBGcm9tSGFuZGxlcnMgPSBjcmVhdGVFeGVjSGFuZGxlcnMocmV0cmlldmVTb3VyY2VNYXBIYW5kbGVycyk7XG5sZXQgb3ZlcnJpZGRlbiA9ICExO1xuY29uc3Qgb3JpZ2luYWxQcmVwYXJlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG5mdW5jdGlvbiByZXNldEludGVyY2VwdG9yKHJ1bm5lciwgb3B0aW9ucykge1xuXHRldmFsdWF0ZWRNb2R1bGVzQ2FjaGUuZGVsZXRlKHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzKSwgb3B0aW9ucy5yZXRyaWV2ZUZpbGUgJiYgcmV0cmlldmVGaWxlSGFuZGxlcnMuZGVsZXRlKG9wdGlvbnMucmV0cmlldmVGaWxlKSwgb3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCAmJiByZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzLmRlbGV0ZShvcHRpb25zLnJldHJpZXZlU291cmNlTWFwKSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlLnNpemUgPT09IDAgJiYgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb3JpZ2luYWxQcmVwYXJlLCBvdmVycmlkZGVuID0gITEpO1xufVxuZnVuY3Rpb24gaW50ZXJjZXB0U3RhY2tUcmFjZShydW5uZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb3ZlcnJpZGRlbiB8fD0gKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJlcGFyZVN0YWNrVHJhY2UsICEwKSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlLmFkZChydW5uZXIuZXZhbHVhdGVkTW9kdWxlcyksIG9wdGlvbnMucmV0cmlldmVGaWxlICYmIHJldHJpZXZlRmlsZUhhbmRsZXJzLmFkZChvcHRpb25zLnJldHJpZXZlRmlsZSksIG9wdGlvbnMucmV0cmlldmVTb3VyY2VNYXAgJiYgcmV0cmlldmVTb3VyY2VNYXBIYW5kbGVycy5hZGQob3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCksICgpID0+IHJlc2V0SW50ZXJjZXB0b3IocnVubmVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHN1cHBvcnRSZWxhdGl2ZVVSTChmaWxlLCB1cmwpIHtcblx0aWYgKCFmaWxlKSByZXR1cm4gdXJsO1xuXHRsZXQgZGlyID0gcG9zaXhEaXJuYW1lKHNsYXNoKGZpbGUpKSwgbWF0Y2ggPSAvXlxcdys6XFwvXFwvW14vXSovLmV4ZWMoZGlyKSwgcHJvdG9jb2wgPSBtYXRjaCA/IG1hdGNoWzBdIDogXCJcIiwgc3RhcnRQYXRoID0gZGlyLnNsaWNlKHByb3RvY29sLmxlbmd0aCk7XG5cdHJldHVybiBwcm90b2NvbCAmJiAvXlxcL1xcdzovLnRlc3Qoc3RhcnRQYXRoKSA/IChwcm90b2NvbCArPSBcIi9cIiwgcHJvdG9jb2wgKyBzbGFzaChwb3NpeFJlc29sdmUoc3RhcnRQYXRoLCB1cmwpKSkgOiBwcm90b2NvbCArIHBvc2l4UmVzb2x2ZShzdGFydFBhdGgsIHVybCk7XG59XG5mdW5jdGlvbiBnZXRSdW5uZXJTb3VyY2VNYXAocG9zaXRpb24pIHtcblx0Zm9yIChsZXQgbW9kdWxlR3JhcGggb2YgZXZhbHVhdGVkTW9kdWxlc0NhY2hlKSB7XG5cdFx0bGV0IHNvdXJjZU1hcCA9IG1vZHVsZUdyYXBoLmdldE1vZHVsZVNvdXJjZU1hcEJ5SWQocG9zaXRpb24uc291cmNlKTtcblx0XHRpZiAoc291cmNlTWFwKSByZXR1cm4ge1xuXHRcdFx0dXJsOiBwb3NpdGlvbi5zb3VyY2UsXG5cdFx0XHRtYXA6IHNvdXJjZU1hcCxcblx0XHRcdHZpdGU6ICEwXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJldHJpZXZlRmlsZShwYXRoKSB7XG5cdGlmIChwYXRoIGluIGZpbGVDb250ZW50c0NhY2hlKSByZXR1cm4gZmlsZUNvbnRlbnRzQ2FjaGVbcGF0aF07XG5cdGxldCBjb250ZW50ID0gcmV0cmlldmVGaWxlRnJvbUhhbmRsZXJzKHBhdGgpO1xuXHRyZXR1cm4gdHlwZW9mIGNvbnRlbnQgPT0gXCJzdHJpbmdcIiA/IChmaWxlQ29udGVudHNDYWNoZVtwYXRoXSA9IGNvbnRlbnQsIGNvbnRlbnQpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIHJldHJpZXZlU291cmNlTWFwVVJMKHNvdXJjZSkge1xuXHRsZXQgZmlsZURhdGEgPSByZXRyaWV2ZUZpbGUoc291cmNlKTtcblx0aWYgKCFmaWxlRGF0YSkgcmV0dXJuIG51bGw7XG5cdGxldCByZSA9IC9cXC9cXC9bQCNdXFxzKnNvdXJjZU1hcHBpbmdVUkw9KFteXFxzJ1wiXSspXFxzKiR8XFwvXFwqW0AjXVxccypzb3VyY2VNYXBwaW5nVVJMPVteXFxzKidcIl0rXFxzKlxcKlxcL1xccyokL2dtLCBsYXN0TWF0Y2gsIG1hdGNoO1xuXHRmb3IgKDsgbWF0Y2ggPSByZS5leGVjKGZpbGVEYXRhKTspIGxhc3RNYXRjaCA9IG1hdGNoO1xuXHRyZXR1cm4gbGFzdE1hdGNoID8gbGFzdE1hdGNoWzFdIDogbnVsbDtcbn1cbmNvbnN0IHJlU291cmNlTWFwID0gL15kYXRhOmFwcGxpY2F0aW9uXFwvanNvblteLF0rYmFzZTY0LC87XG5mdW5jdGlvbiByZXRyaWV2ZVNvdXJjZU1hcChzb3VyY2UpIHtcblx0bGV0IHVybEFuZE1hcCA9IHJldHJpZXZlU291cmNlTWFwRnJvbUhhbmRsZXJzKHNvdXJjZSk7XG5cdGlmICh1cmxBbmRNYXApIHJldHVybiB1cmxBbmRNYXA7XG5cdGxldCBzb3VyY2VNYXBwaW5nVVJMID0gcmV0cmlldmVTb3VyY2VNYXBVUkwoc291cmNlKTtcblx0aWYgKCFzb3VyY2VNYXBwaW5nVVJMKSByZXR1cm4gbnVsbDtcblx0bGV0IHNvdXJjZU1hcERhdGE7XG5cdGlmIChyZVNvdXJjZU1hcC50ZXN0KHNvdXJjZU1hcHBpbmdVUkwpKSB7XG5cdFx0bGV0IHJhd0RhdGEgPSBzb3VyY2VNYXBwaW5nVVJMLnNsaWNlKHNvdXJjZU1hcHBpbmdVUkwuaW5kZXhPZihcIixcIikgKyAxKTtcblx0XHRzb3VyY2VNYXBEYXRhID0gQnVmZmVyLmZyb20ocmF3RGF0YSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKSwgc291cmNlTWFwcGluZ1VSTCA9IHNvdXJjZTtcblx0fSBlbHNlIHNvdXJjZU1hcHBpbmdVUkwgPSBzdXBwb3J0UmVsYXRpdmVVUkwoc291cmNlLCBzb3VyY2VNYXBwaW5nVVJMKSwgc291cmNlTWFwRGF0YSA9IHJldHJpZXZlRmlsZShzb3VyY2VNYXBwaW5nVVJMKTtcblx0cmV0dXJuIHNvdXJjZU1hcERhdGEgPyB7XG5cdFx0dXJsOiBzb3VyY2VNYXBwaW5nVVJMLFxuXHRcdG1hcDogc291cmNlTWFwRGF0YVxuXHR9IDogbnVsbDtcbn1cbmZ1bmN0aW9uIG1hcFNvdXJjZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG5cdGlmICghcG9zaXRpb24uc291cmNlKSByZXR1cm4gcG9zaXRpb247XG5cdGxldCBzb3VyY2VNYXAgPSBnZXRSdW5uZXJTb3VyY2VNYXAocG9zaXRpb24pO1xuXHRpZiAoc291cmNlTWFwIHx8PSBzb3VyY2VNYXBDYWNoZVtwb3NpdGlvbi5zb3VyY2VdLCAhc291cmNlTWFwKSB7XG5cdFx0bGV0IHVybEFuZE1hcCA9IHJldHJpZXZlU291cmNlTWFwKHBvc2l0aW9uLnNvdXJjZSk7XG5cdFx0aWYgKHVybEFuZE1hcCAmJiB1cmxBbmRNYXAubWFwKSB7XG5cdFx0XHRsZXQgdXJsID0gdXJsQW5kTWFwLnVybDtcblx0XHRcdHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG5cdFx0XHRcdHVybCxcblx0XHRcdFx0bWFwOiBuZXcgRGVjb2RlZE1hcCh0eXBlb2YgdXJsQW5kTWFwLm1hcCA9PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh1cmxBbmRNYXAubWFwKSA6IHVybEFuZE1hcC5tYXAsIHVybClcblx0XHRcdH07XG5cdFx0XHRsZXQgY29udGVudHMgPSBzb3VyY2VNYXAubWFwPy5tYXAuc291cmNlc0NvbnRlbnQ7XG5cdFx0XHRzb3VyY2VNYXAubWFwICYmIGNvbnRlbnRzICYmIHNvdXJjZU1hcC5tYXAucmVzb2x2ZWRTb3VyY2VzLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuXHRcdFx0XHRsZXQgY29udGVudCA9IGNvbnRlbnRzW2ldO1xuXHRcdFx0XHRpZiAoY29udGVudCAmJiBzb3VyY2UgJiYgdXJsKSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRlbnRVcmwgPSBzdXBwb3J0UmVsYXRpdmVVUkwodXJsLCBzb3VyY2UpO1xuXHRcdFx0XHRcdGZpbGVDb250ZW50c0NhY2hlW2NvbnRlbnRVcmxdID0gY29udGVudDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG5cdFx0XHR1cmw6IG51bGwsXG5cdFx0XHRtYXA6IG51bGxcblx0XHR9O1xuXHR9XG5cdGlmIChzb3VyY2VNYXAubWFwICYmIHNvdXJjZU1hcC51cmwpIHtcblx0XHRsZXQgb3JpZ2luYWxQb3NpdGlvbiA9IGdldE9yaWdpbmFsUG9zaXRpb24oc291cmNlTWFwLm1hcCwgcG9zaXRpb24pO1xuXHRcdGlmIChvcmlnaW5hbFBvc2l0aW9uICYmIG9yaWdpbmFsUG9zaXRpb24uc291cmNlICE9IG51bGwpIHJldHVybiBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSA9IHN1cHBvcnRSZWxhdGl2ZVVSTChzb3VyY2VNYXAudXJsLCBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSksIHNvdXJjZU1hcC52aXRlICYmIChvcmlnaW5hbFBvc2l0aW9uLl92aXRlID0gITApLCBvcmlnaW5hbFBvc2l0aW9uO1xuXHR9XG5cdHJldHVybiBwb3NpdGlvbjtcbn1cbmZ1bmN0aW9uIG1hcEV2YWxPcmlnaW4ob3JpZ2luKSB7XG5cdGxldCBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKyk6KFxcZCspOihcXGQrKVxcKSQvLmV4ZWMob3JpZ2luKTtcblx0aWYgKG1hdGNoKSB7XG5cdFx0bGV0IHBvc2l0aW9uID0gbWFwU291cmNlUG9zaXRpb24oe1xuXHRcdFx0bmFtZTogbnVsbCxcblx0XHRcdHNvdXJjZTogbWF0Y2hbMl0sXG5cdFx0XHRsaW5lOiArbWF0Y2hbM10sXG5cdFx0XHRjb2x1bW46IG1hdGNoWzRdIC0gMVxuXHRcdH0pO1xuXHRcdHJldHVybiBgZXZhbCBhdCAke21hdGNoWzFdfSAoJHtwb3NpdGlvbi5zb3VyY2V9OiR7cG9zaXRpb24ubGluZX06JHtwb3NpdGlvbi5jb2x1bW4gKyAxfSlgO1xuXHR9XG5cdHJldHVybiBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKylcXCkkLy5leGVjKG9yaWdpbiksIG1hdGNoID8gYGV2YWwgYXQgJHttYXRjaFsxXX0gKCR7bWFwRXZhbE9yaWdpbihtYXRjaFsyXSl9KWAgOiBvcmlnaW47XG59XG5mdW5jdGlvbiBDYWxsU2l0ZVRvU3RyaW5nKCkge1xuXHRsZXQgZmlsZU5hbWUsIGZpbGVMb2NhdGlvbiA9IFwiXCI7XG5cdGlmICh0aGlzLmlzTmF0aXZlKCkpIGZpbGVMb2NhdGlvbiA9IFwibmF0aXZlXCI7XG5cdGVsc2Uge1xuXHRcdGZpbGVOYW1lID0gdGhpcy5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKSwgIWZpbGVOYW1lICYmIHRoaXMuaXNFdmFsKCkgJiYgKGZpbGVMb2NhdGlvbiA9IHRoaXMuZ2V0RXZhbE9yaWdpbigpLCBmaWxlTG9jYXRpb24gKz0gXCIsIFwiKSwgZmlsZU5hbWUgPyBmaWxlTG9jYXRpb24gKz0gZmlsZU5hbWUgOiBmaWxlTG9jYXRpb24gKz0gXCI8YW5vbnltb3VzPlwiO1xuXHRcdGxldCBsaW5lTnVtYmVyID0gdGhpcy5nZXRMaW5lTnVtYmVyKCk7XG5cdFx0aWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkge1xuXHRcdFx0ZmlsZUxvY2F0aW9uICs9IGA6JHtsaW5lTnVtYmVyfWA7XG5cdFx0XHRsZXQgY29sdW1uTnVtYmVyID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKTtcblx0XHRcdGNvbHVtbk51bWJlciAmJiAoZmlsZUxvY2F0aW9uICs9IGA6JHtjb2x1bW5OdW1iZXJ9YCk7XG5cdFx0fVxuXHR9XG5cdGxldCBsaW5lID0gXCJcIiwgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRGdW5jdGlvbk5hbWUoKSwgYWRkU3VmZml4ID0gITAsIGlzQ29uc3RydWN0b3IgPSB0aGlzLmlzQ29uc3RydWN0b3IoKTtcblx0aWYgKHRoaXMuaXNUb3BsZXZlbCgpIHx8IGlzQ29uc3RydWN0b3IpIGlzQ29uc3RydWN0b3IgPyBsaW5lICs9IGBuZXcgJHtmdW5jdGlvbk5hbWUgfHwgXCI8YW5vbnltb3VzPlwifWAgOiBmdW5jdGlvbk5hbWUgPyBsaW5lICs9IGZ1bmN0aW9uTmFtZSA6IChsaW5lICs9IGZpbGVMb2NhdGlvbiwgYWRkU3VmZml4ID0gITEpO1xuXHRlbHNlIHtcblx0XHRsZXQgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7XG5cdFx0dHlwZU5hbWUgPT09IFwiW29iamVjdCBPYmplY3RdXCIgJiYgKHR5cGVOYW1lID0gXCJudWxsXCIpO1xuXHRcdGxldCBtZXRob2ROYW1lID0gdGhpcy5nZXRNZXRob2ROYW1lKCk7XG5cdFx0ZnVuY3Rpb25OYW1lID8gKHR5cGVOYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKHR5cGVOYW1lKSAhPT0gMCAmJiAobGluZSArPSBgJHt0eXBlTmFtZX0uYCksIGxpbmUgKz0gZnVuY3Rpb25OYW1lLCBtZXRob2ROYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKGAuJHttZXRob2ROYW1lfWApICE9PSBmdW5jdGlvbk5hbWUubGVuZ3RoIC0gbWV0aG9kTmFtZS5sZW5ndGggLSAxICYmIChsaW5lICs9IGAgW2FzICR7bWV0aG9kTmFtZX1dYCkpIDogbGluZSArPSBgJHt0eXBlTmFtZX0uJHttZXRob2ROYW1lIHx8IFwiPGFub255bW91cz5cIn1gO1xuXHR9XG5cdHJldHVybiBhZGRTdWZmaXggJiYgKGxpbmUgKz0gYCAoJHtmaWxlTG9jYXRpb259KWApLCBsaW5lO1xufVxuZnVuY3Rpb24gY2xvbmVDYWxsU2l0ZShmcmFtZSkge1xuXHRsZXQgb2JqZWN0ID0ge307XG5cdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnJhbWUpKS5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0bGV0IGtleSA9IG5hbWU7XG5cdFx0b2JqZWN0W2tleV0gPSAvXig/OmlzfGdldCkvLnRlc3QobmFtZSkgPyBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmcmFtZVtrZXldLmNhbGwoZnJhbWUpO1xuXHRcdH0gOiBmcmFtZVtrZXldO1xuXHR9KSwgb2JqZWN0LnRvU3RyaW5nID0gQ2FsbFNpdGVUb1N0cmluZywgb2JqZWN0O1xufVxuZnVuY3Rpb24gd3JhcENhbGxTaXRlKGZyYW1lLCBzdGF0ZSkge1xuXHRpZiAoc3RhdGUgPT09IHZvaWQgMCAmJiAoc3RhdGUgPSB7XG5cdFx0bmV4dFBvc2l0aW9uOiBudWxsLFxuXHRcdGN1clBvc2l0aW9uOiBudWxsXG5cdH0pLCBmcmFtZS5pc05hdGl2ZSgpKSByZXR1cm4gc3RhdGUuY3VyUG9zaXRpb24gPSBudWxsLCBmcmFtZTtcblx0bGV0IHNvdXJjZSA9IGZyYW1lLmdldEZpbGVOYW1lKCkgfHwgZnJhbWUuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMKCk7XG5cdGlmIChzb3VyY2UpIHtcblx0XHRsZXQgcG9zaXRpb24gPSBtYXBTb3VyY2VQb3NpdGlvbih7XG5cdFx0XHRuYW1lOiBudWxsLFxuXHRcdFx0c291cmNlLFxuXHRcdFx0bGluZTogZnJhbWUuZ2V0TGluZU51bWJlcigpID8/IDAsXG5cdFx0XHRjb2x1bW46IChmcmFtZS5nZXRDb2x1bW5OdW1iZXIoKSA/PyAxKSAtIDFcblx0XHR9KTtcblx0XHRzdGF0ZS5jdXJQb3NpdGlvbiA9IHBvc2l0aW9uLCBmcmFtZSA9IGNsb25lQ2FsbFNpdGUoZnJhbWUpO1xuXHRcdGxldCBvcmlnaW5hbEZ1bmN0aW9uTmFtZSA9IGZyYW1lLmdldEZ1bmN0aW9uTmFtZTtcblx0XHRyZXR1cm4gZnJhbWUuZ2V0RnVuY3Rpb25OYW1lID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgbmFtZSA9IHN0YXRlLm5leHRQb3NpdGlvbiA9PSBudWxsID8gb3JpZ2luYWxGdW5jdGlvbk5hbWUoKSA6IHN0YXRlLm5leHRQb3NpdGlvbi5uYW1lIHx8IG9yaWdpbmFsRnVuY3Rpb25OYW1lKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJldmFsXCIgJiYgXCJfdml0ZVwiIGluIHBvc2l0aW9uID8gbnVsbCA6IG5hbWU7XG5cdFx0fSwgZnJhbWUuZ2V0RmlsZU5hbWUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwb3NpdGlvbi5zb3VyY2UgPz8gbnVsbDtcblx0XHR9LCBmcmFtZS5nZXRMaW5lTnVtYmVyID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcG9zaXRpb24ubGluZTtcblx0XHR9LCBmcmFtZS5nZXRDb2x1bW5OdW1iZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwb3NpdGlvbi5jb2x1bW4gKyAxO1xuXHRcdH0sIGZyYW1lLmdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHBvc2l0aW9uLnNvdXJjZTtcblx0XHR9LCBmcmFtZTtcblx0fVxuXHRsZXQgb3JpZ2luID0gZnJhbWUuaXNFdmFsKCkgJiYgZnJhbWUuZ2V0RXZhbE9yaWdpbigpO1xuXHRyZXR1cm4gb3JpZ2luID8gKG9yaWdpbiA9IG1hcEV2YWxPcmlnaW4ob3JpZ2luKSwgZnJhbWUgPSBjbG9uZUNhbGxTaXRlKGZyYW1lKSwgZnJhbWUuZ2V0RXZhbE9yaWdpbiA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBvcmlnaW4gfHwgdm9pZCAwO1xuXHR9LCBmcmFtZSkgOiBmcmFtZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTdGFja1RyYWNlKGVycm9yLCBzdGFjaykge1xuXHRsZXQgZXJyb3JTdHJpbmcgPSBgJHtlcnJvci5uYW1lIHx8IFwiRXJyb3JcIn06ICR7ZXJyb3IubWVzc2FnZSB8fCBcIlwifWAsIHN0YXRlID0ge1xuXHRcdG5leHRQb3NpdGlvbjogbnVsbCxcblx0XHRjdXJQb3NpdGlvbjogbnVsbFxuXHR9LCBwcm9jZXNzZWRTdGFjayA9IFtdO1xuXHRmb3IgKGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHByb2Nlc3NlZFN0YWNrLnB1c2goYFxcbiAgICBhdCAke3dyYXBDYWxsU2l0ZShzdGFja1tpXSwgc3RhdGUpfWApLCBzdGF0ZS5uZXh0UG9zaXRpb24gPSBzdGF0ZS5jdXJQb3NpdGlvbjtcblx0cmV0dXJuIHN0YXRlLmN1clBvc2l0aW9uID0gc3RhdGUubmV4dFBvc2l0aW9uID0gbnVsbCwgZXJyb3JTdHJpbmcgKyBwcm9jZXNzZWRTdGFjay5yZXZlcnNlKCkuam9pbihcIlwiKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3NvdXJjZW1hcC9pbmRleC50c1xuZnVuY3Rpb24gZW5hYmxlU291cmNlTWFwU3VwcG9ydChydW5uZXIpIHtcblx0aWYgKHJ1bm5lci5vcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yID09PSBcIm5vZGVcIikge1xuXHRcdGlmICh0eXBlb2YgcHJvY2VzcyA+IFwidVwiKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlIFxcXCJzb3VyY2VtYXBJbnRlcmNlcHRvcjogJ25vZGUnXFxcIiBiZWNhdXNlIGdsb2JhbCBcXFwicHJvY2Vzc1xcXCIgdmFyaWFibGUgaXMgbm90IGF2YWlsYWJsZS5cIik7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkICE9IFwiZnVuY3Rpb25cIikgdGhyb3cgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSBcXFwic291cmNlbWFwSW50ZXJjZXB0b3I6ICdub2RlJ1xcXCIgYmVjYXVzZSBcXFwicHJvY2Vzcy5zZXRTb3VyY2VNYXBzRW5hYmxlZFxcXCIgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIHVzZSBOb2RlID49IDE2LjYuMC5cIik7XG5cdFx0bGV0IGlzRW5hYmxlZEFscmVhZHkgPSBwcm9jZXNzLnNvdXJjZU1hcHNFbmFibGVkID8/ICExO1xuXHRcdHJldHVybiBwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkKCEwKSwgKCkgPT4gIWlzRW5hYmxlZEFscmVhZHkgJiYgcHJvY2Vzcy5zZXRTb3VyY2VNYXBzRW5hYmxlZCghMSk7XG5cdH1cblx0cmV0dXJuIGludGVyY2VwdFN0YWNrVHJhY2UocnVubmVyLCB0eXBlb2YgcnVubmVyLm9wdGlvbnMuc291cmNlbWFwSW50ZXJjZXB0b3IgPT0gXCJvYmplY3RcIiA/IHJ1bm5lci5vcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yIDogdm9pZCAwKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2VzbUV2YWx1YXRvci50c1xudmFyIEVTTW9kdWxlc0V2YWx1YXRvciA9IGNsYXNzIHtcblx0c3RhcnRPZmZzZXQgPSBnZXRBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50KCk7XG5cdGFzeW5jIHJ1bklubGluZWRNb2R1bGUoY29udGV4dCwgY29kZSkge1xuXHRcdGF3YWl0IG5ldyBBc3luY0Z1bmN0aW9uKHNzck1vZHVsZUV4cG9ydHNLZXksIHNzckltcG9ydE1ldGFLZXksIHNzckltcG9ydEtleSwgc3NyRHluYW1pY0ltcG9ydEtleSwgc3NyRXhwb3J0QWxsS2V5LCBzc3JFeHBvcnROYW1lS2V5LCBcIlxcXCJ1c2Ugc3RyaWN0XFxcIjtcIiArIGNvZGUpKGNvbnRleHRbc3NyTW9kdWxlRXhwb3J0c0tleV0sIGNvbnRleHRbc3NySW1wb3J0TWV0YUtleV0sIGNvbnRleHRbc3NySW1wb3J0S2V5XSwgY29udGV4dFtzc3JEeW5hbWljSW1wb3J0S2V5XSwgY29udGV4dFtzc3JFeHBvcnRBbGxLZXldLCBjb250ZXh0W3NzckV4cG9ydE5hbWVLZXldKSwgT2JqZWN0LnNlYWwoY29udGV4dFtzc3JNb2R1bGVFeHBvcnRzS2V5XSk7XG5cdH1cblx0cnVuRXh0ZXJuYWxNb2R1bGUoZmlsZXBhdGgpIHtcblx0XHRyZXR1cm4gaW1wb3J0KGZpbGVwYXRoKTtcblx0fVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2ltcG9ydE1ldGFSZXNvbHZlci50c1xuY29uc3QgY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UgPSBcInZpdGUtbW9kdWxlLXJ1bm5lcjppbXBvcnQtbWV0YS1yZXNvbHZlL3YxL1wiLCBjdXN0b21pemF0aW9uSG9va3NNb2R1bGUgPSBgXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpIHtcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCR7SlNPTi5zdHJpbmdpZnkoY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UpfSkpIHtcbiAgICBjb25zdCBkYXRhID0gc3BlY2lmaWVyLnNsaWNlKCR7SlNPTi5zdHJpbmdpZnkoY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UpfS5sZW5ndGgpXG4gICAgY29uc3QgW3BhcnNlZFNwZWNpZmllciwgcGFyc2VkSW1wb3J0ZXJdID0gSlNPTi5wYXJzZShkYXRhKVxuICAgIHNwZWNpZmllciA9IHBhcnNlZFNwZWNpZmllclxuICAgIGNvbnRleHQucGFyZW50VVJMID0gcGFyc2VkSW1wb3J0ZXJcbiAgfVxuICByZXR1cm4gbmV4dFJlc29sdmUoc3BlY2lmaWVyLCBjb250ZXh0KVxufVxuXG5gO1xuZnVuY3Rpb24gY3VzdG9taXphdGlvbkhvb2tSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpIHtcblx0aWYgKHNwZWNpZmllci5zdGFydHNXaXRoKGN1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlKSkge1xuXHRcdGxldCBkYXRhID0gc3BlY2lmaWVyLnNsaWNlKDQyKSwgW3BhcnNlZFNwZWNpZmllciwgcGFyc2VkSW1wb3J0ZXJdID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRzcGVjaWZpZXIgPSBwYXJzZWRTcGVjaWZpZXIsIGNvbnRleHQucGFyZW50VVJMID0gcGFyc2VkSW1wb3J0ZXI7XG5cdH1cblx0cmV0dXJuIG5leHRSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCk7XG59XG5sZXQgaXNIb29rUmVnaXN0ZXJlZCA9ICExO1xuZnVuY3Rpb24gY3JlYXRlSW1wb3J0TWV0YVJlc29sdmVyKCkge1xuXHRpZiAoaXNIb29rUmVnaXN0ZXJlZCkgcmV0dXJuIGltcG9ydE1ldGFSZXNvbHZlV2l0aEN1c3RvbUhvb2s7XG5cdGxldCBtb2R1bGU7XG5cdHRyeSB7XG5cdFx0bW9kdWxlID0gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiA/IHByb2Nlc3MuZ2V0QnVpbHRpbk1vZHVsZShcIm5vZGU6bW9kdWxlXCIpLk1vZHVsZSA6IHZvaWQgMDtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmIChtb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLnJlZ2lzdGVySG9va3MpIHJldHVybiBtb2R1bGUucmVnaXN0ZXJIb29rcyh7IHJlc29sdmU6IGN1c3RvbWl6YXRpb25Ib29rUmVzb2x2ZSB9KSwgaXNIb29rUmVnaXN0ZXJlZCA9ICEwLCBpbXBvcnRNZXRhUmVzb2x2ZVdpdGhDdXN0b21Ib29rO1xuXHRcdGlmIChtb2R1bGUucmVnaXN0ZXIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxldCBob29rTW9kdWxlQ29udGVudCA9IGBkYXRhOnRleHQvamF2YXNjcmlwdCwke2VuY29kZVVSSShjdXN0b21pemF0aW9uSG9va3NNb2R1bGUpfWA7XG5cdFx0XHRcdG1vZHVsZS5yZWdpc3Rlcihob29rTW9kdWxlQ29udGVudCk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChcImNvZGVcIiBpbiBlICYmIGUuY29kZSA9PT0gXCJFUlJfTkVUV09SS19JTVBPUlRfRElTQUxMT1dFRFwiKSByZXR1cm47XG5cdFx0XHRcdHRocm93IGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXNIb29rUmVnaXN0ZXJlZCA9ICEwLCBpbXBvcnRNZXRhUmVzb2x2ZVdpdGhDdXN0b21Ib29rO1xuXHRcdH1cblx0fVxufVxuZnVuY3Rpb24gaW1wb3J0TWV0YVJlc29sdmVXaXRoQ3VzdG9tSG9vayhzcGVjaWZpZXIsIGltcG9ydGVyKSB7XG5cdHJldHVybiBpbXBvcnQubWV0YS5yZXNvbHZlKGAke2N1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlfSR7SlNPTi5zdHJpbmdpZnkoW3NwZWNpZmllciwgaW1wb3J0ZXJdKX1gKTtcbn1cbmAke2N1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlfWA7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbW9kdWxlLXJ1bm5lci9jcmVhdGVJbXBvcnRNZXRhLnRzXG5jb25zdCBlbnZQcm94eSA9IG5ldyBQcm94eSh7fSwgeyBnZXQoXywgcCkge1xuXHR0aHJvdyBFcnJvcihgW21vZHVsZSBydW5uZXJdIER5bmFtaWMgYWNjZXNzIG9mIFwiaW1wb3J0Lm1ldGEuZW52XCIgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlLCB1c2UgXCJpbXBvcnQubWV0YS5lbnYuJHtTdHJpbmcocCl9XCIgaW5zdGVhZC5gKTtcbn0gfSk7XG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0SW1wb3J0TWV0YShtb2R1bGVQYXRoKSB7XG5cdGxldCBocmVmID0gcG9zaXhQYXRoVG9GaWxlSHJlZihtb2R1bGVQYXRoKSwgZmlsZW5hbWUgPSBtb2R1bGVQYXRoLCBkaXJuYW1lID0gcG9zaXhEaXJuYW1lKG1vZHVsZVBhdGgpO1xuXHRyZXR1cm4ge1xuXHRcdGZpbGVuYW1lOiBpc1dpbmRvd3MgPyB0b1dpbmRvd3NQYXRoKGZpbGVuYW1lKSA6IGZpbGVuYW1lLFxuXHRcdGRpcm5hbWU6IGlzV2luZG93cyA/IHRvV2luZG93c1BhdGgoZGlybmFtZSkgOiBkaXJuYW1lLFxuXHRcdHVybDogaHJlZixcblx0XHRlbnY6IGVudlByb3h5LFxuXHRcdHJlc29sdmUoX2lkLCBfcGFyZW50KSB7XG5cdFx0XHR0aHJvdyBFcnJvcihcIlttb2R1bGUgcnVubmVyXSBcXFwiaW1wb3J0Lm1ldGEucmVzb2x2ZVxcXCIgaXMgbm90IHN1cHBvcnRlZC5cIik7XG5cdFx0fSxcblx0XHRnbG9iKCkge1xuXHRcdFx0dGhyb3cgRXJyb3IoXCJbbW9kdWxlIHJ1bm5lcl0gXFxcImltcG9ydC5tZXRhLmdsb2JcXFwiIGlzIHN0YXRpY2FsbHkgcmVwbGFjZWQgZHVyaW5nIGZpbGUgdHJhbnNmb3JtYXRpb24uIE1ha2Ugc3VyZSB0byByZWZlcmVuY2UgaXQgYnkgdGhlIGZ1bGwgbmFtZS5cIik7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4qIENyZWF0ZSBpbXBvcnQubWV0YSBvYmplY3QgZm9yIE5vZGUuanMuXG4qL1xuZnVuY3Rpb24gY3JlYXRlTm9kZUltcG9ydE1ldGEobW9kdWxlUGF0aCkge1xuXHRsZXQgZGVmYXVsdE1ldGEgPSBjcmVhdGVEZWZhdWx0SW1wb3J0TWV0YShtb2R1bGVQYXRoKSwgaHJlZiA9IGRlZmF1bHRNZXRhLnVybCwgaW1wb3J0TWV0YVJlc29sdmVyID0gY3JlYXRlSW1wb3J0TWV0YVJlc29sdmVyKCk7XG5cdHJldHVybiB7XG5cdFx0Li4uZGVmYXVsdE1ldGEsXG5cdFx0bWFpbjogITEsXG5cdFx0cmVzb2x2ZShpZCwgcGFyZW50KSB7XG5cdFx0XHRyZXR1cm4gKGltcG9ydE1ldGFSZXNvbHZlciA/PyBkZWZhdWx0TWV0YS5yZXNvbHZlKShpZCwgcGFyZW50ID8/IGhyZWYpO1xuXHRcdH1cblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3J1bm5lci50c1xudmFyIE1vZHVsZVJ1bm5lciA9IGNsYXNzIHtcblx0ZXZhbHVhdGVkTW9kdWxlcztcblx0aG1yQ2xpZW50O1xuXHR0cmFuc3BvcnQ7XG5cdHJlc2V0U291cmNlTWFwU3VwcG9ydDtcblx0Y29uY3VycmVudE1vZHVsZU5vZGVQcm9taXNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdGlzQnVpbHRpbjtcblx0YnVpbHRpbnNQcm9taXNlO1xuXHRjbG9zZWQgPSAhMTtcblx0Y29uc3RydWN0b3Iob3B0aW9ucywgZXZhbHVhdG9yID0gbmV3IEVTTW9kdWxlc0V2YWx1YXRvcigpLCBkZWJ1Zykge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMgPSBvcHRpb25zLCB0aGlzLmV2YWx1YXRvciA9IGV2YWx1YXRvciwgdGhpcy5kZWJ1ZyA9IGRlYnVnLCB0aGlzLmV2YWx1YXRlZE1vZHVsZXMgPSBvcHRpb25zLmV2YWx1YXRlZE1vZHVsZXMgPz8gbmV3IEV2YWx1YXRlZE1vZHVsZXMoKSwgdGhpcy50cmFuc3BvcnQgPSBub3JtYWxpemVNb2R1bGVSdW5uZXJUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpLCBvcHRpb25zLmhtciAhPT0gITEpIHtcblx0XHRcdGxldCBvcHRpb25zSG1yID0gb3B0aW9ucy5obXIgPz8gITA7XG5cdFx0XHRpZiAodGhpcy5obXJDbGllbnQgPSBuZXcgSE1SQ2xpZW50KG9wdGlvbnNIbXIgPT09ICEwIHx8IG9wdGlvbnNIbXIubG9nZ2VyID09PSB2b2lkIDAgPyBobXJMb2dnZXIgOiBvcHRpb25zSG1yLmxvZ2dlciA9PT0gITEgPyBzaWxlbnRDb25zb2xlIDogb3B0aW9uc0htci5sb2dnZXIsIHRoaXMudHJhbnNwb3J0LCAoeyBhY2NlcHRlZFBhdGggfSkgPT4gdGhpcy5pbXBvcnQoYWNjZXB0ZWRQYXRoKSksICF0aGlzLnRyYW5zcG9ydC5jb25uZWN0KSB0aHJvdyBFcnJvcihcIkhNUiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcnVubmVyIHRyYW5zcG9ydCwgYnV0IGBobXJgIG9wdGlvbiB3YXMgc2V0IHRvIHRydWVcIik7XG5cdFx0XHR0aGlzLnRyYW5zcG9ydC5jb25uZWN0KGNyZWF0ZUhNUkhhbmRsZXJGb3JSdW5uZXIodGhpcykpO1xuXHRcdH0gZWxzZSB0aGlzLnRyYW5zcG9ydC5jb25uZWN0Py4oKTtcblx0XHRvcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yICE9PSAhMSAmJiAodGhpcy5yZXNldFNvdXJjZU1hcFN1cHBvcnQgPSBlbmFibGVTb3VyY2VNYXBTdXBwb3J0KHRoaXMpKTtcblx0fVxuXHQvKipcblx0KiBVUkwgdG8gZXhlY3V0ZS4gQWNjZXB0cyBmaWxlIHBhdGgsIHNlcnZlciBwYXRoIG9yIGlkIHJlbGF0aXZlIHRvIHRoZSByb290LlxuXHQqL1xuXHRhc3luYyBpbXBvcnQodXJsKSB7XG5cdFx0bGV0IGZldGNoZWRNb2R1bGUgPSBhd2FpdCB0aGlzLmNhY2hlZE1vZHVsZSh1cmwpO1xuXHRcdHJldHVybiBhd2FpdCB0aGlzLmNhY2hlZFJlcXVlc3QodXJsLCBmZXRjaGVkTW9kdWxlKTtcblx0fVxuXHQvKipcblx0KiBDbGVhciBhbGwgY2FjaGVzIGluY2x1ZGluZyBITVIgbGlzdGVuZXJzLlxuXHQqL1xuXHRjbGVhckNhY2hlKCkge1xuXHRcdHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5jbGVhcigpLCB0aGlzLmhtckNsaWVudD8uY2xlYXIoKTtcblx0fVxuXHQvKipcblx0KiBDbGVhcnMgYWxsIGNhY2hlcywgcmVtb3ZlcyBhbGwgSE1SIGxpc3RlbmVycywgYW5kIHJlc2V0cyBzb3VyY2UgbWFwIHN1cHBvcnQuXG5cdCogVGhpcyBtZXRob2QgZG9lc24ndCBzdG9wIHRoZSBITVIgY29ubmVjdGlvbi5cblx0Ki9cblx0YXN5bmMgY2xvc2UoKSB7XG5cdFx0dGhpcy5yZXNldFNvdXJjZU1hcFN1cHBvcnQ/LigpLCB0aGlzLmNsZWFyQ2FjaGUoKSwgdGhpcy5obXJDbGllbnQgPSB2b2lkIDAsIHRoaXMuY2xvc2VkID0gITAsIGF3YWl0IHRoaXMudHJhbnNwb3J0LmRpc2Nvbm5lY3Q/LigpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgYHRydWVgIGlmIHRoZSBydW50aW1lIGhhcyBiZWVuIGNsb3NlZCBieSBjYWxsaW5nIGBjbG9zZSgpYCBtZXRob2QuXG5cdCovXG5cdGlzQ2xvc2VkKCkge1xuXHRcdHJldHVybiB0aGlzLmNsb3NlZDtcblx0fVxuXHRwcm9jZXNzSW1wb3J0KGV4cG9ydHMsIGZldGNoUmVzdWx0LCBtZXRhZGF0YSkge1xuXHRcdGlmICghKFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaFJlc3VsdCkpIHJldHVybiBleHBvcnRzO1xuXHRcdGxldCB7IHVybCwgdHlwZSB9ID0gZmV0Y2hSZXN1bHQ7XG5cdFx0cmV0dXJuIHR5cGUgIT09IFwibW9kdWxlXCIgJiYgdHlwZSAhPT0gXCJjb21tb25qc1wiIHx8IGFuYWx5emVJbXBvcnRlZE1vZERpZmZlcmVuY2UoZXhwb3J0cywgdXJsLCB0eXBlLCBtZXRhZGF0YSksIGV4cG9ydHM7XG5cdH1cblx0aXNDaXJjdWxhck1vZHVsZShtb2QpIHtcblx0XHRmb3IgKGxldCBpbXBvcnRlZEZpbGUgb2YgbW9kLmltcG9ydHMpIGlmIChtb2QuaW1wb3J0ZXJzLmhhcyhpbXBvcnRlZEZpbGUpKSByZXR1cm4gITA7XG5cdFx0cmV0dXJuICExO1xuXHR9XG5cdGlzQ2lyY3VsYXJJbXBvcnQoaW1wb3J0ZXJzLCBtb2R1bGVVcmwsIHZpc2l0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSB7XG5cdFx0Zm9yIChsZXQgaW1wb3J0ZXIgb2YgaW1wb3J0ZXJzKSB7XG5cdFx0XHRpZiAodmlzaXRlZC5oYXMoaW1wb3J0ZXIpKSBjb250aW51ZTtcblx0XHRcdGlmICh2aXNpdGVkLmFkZChpbXBvcnRlciksIGltcG9ydGVyID09PSBtb2R1bGVVcmwpIHJldHVybiAhMDtcblx0XHRcdGxldCBtb2QgPSB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuZ2V0TW9kdWxlQnlJZChpbXBvcnRlcik7XG5cdFx0XHRpZiAobW9kICYmIG1vZC5pbXBvcnRlcnMuc2l6ZSAmJiB0aGlzLmlzQ2lyY3VsYXJJbXBvcnQobW9kLmltcG9ydGVycywgbW9kdWxlVXJsLCB2aXNpdGVkKSkgcmV0dXJuICEwO1xuXHRcdH1cblx0XHRyZXR1cm4gITE7XG5cdH1cblx0YXN5bmMgY2FjaGVkUmVxdWVzdCh1cmwsIG1vZCwgY2FsbHN0YWNrID0gW10sIG1ldGFkYXRhKSB7XG5cdFx0bGV0IG1ldGEgPSBtb2QubWV0YSwgbW9kdWxlSWQgPSBtZXRhLmlkLCB7IGltcG9ydGVycyB9ID0gbW9kLCBpbXBvcnRlZSA9IGNhbGxzdGFja1tjYWxsc3RhY2subGVuZ3RoIC0gMV07XG5cdFx0aWYgKGltcG9ydGVlICYmIGltcG9ydGVycy5hZGQoaW1wb3J0ZWUpLCBtb2QuZXZhbHVhdGVkICYmIG1vZC5wcm9taXNlKSByZXR1cm4gdGhpcy5wcm9jZXNzSW1wb3J0KGF3YWl0IG1vZC5wcm9taXNlLCBtZXRhLCBtZXRhZGF0YSk7XG5cdFx0aWYgKChjYWxsc3RhY2suaW5jbHVkZXMobW9kdWxlSWQpIHx8IHRoaXMuaXNDaXJjdWxhck1vZHVsZShtb2QpIHx8IHRoaXMuaXNDaXJjdWxhckltcG9ydChpbXBvcnRlcnMsIG1vZHVsZUlkKSkgJiYgbW9kLmV4cG9ydHMpIHJldHVybiB0aGlzLnByb2Nlc3NJbXBvcnQobW9kLmV4cG9ydHMsIG1ldGEsIG1ldGFkYXRhKTtcblx0XHRsZXQgZGVidWdUaW1lcjtcblx0XHR0aGlzLmRlYnVnICYmIChkZWJ1Z1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLmRlYnVnKGBbbW9kdWxlIHJ1bm5lcl0gbW9kdWxlICR7bW9kdWxlSWR9IHRha2VzIG92ZXIgMnMgdG8gbG9hZC5cXG4ke2BzdGFjazpcXG4ke1suLi5jYWxsc3RhY2ssIG1vZHVsZUlkXS5yZXZlcnNlKCkubWFwKChwKSA9PiBgICAtICR7cH1gKS5qb2luKFwiXFxuXCIpfWB9YCk7XG5cdFx0fSwgMmUzKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChtb2QucHJvbWlzZSkgcmV0dXJuIHRoaXMucHJvY2Vzc0ltcG9ydChhd2FpdCBtb2QucHJvbWlzZSwgbWV0YSwgbWV0YWRhdGEpO1xuXHRcdFx0bGV0IHByb21pc2UgPSB0aGlzLmRpcmVjdFJlcXVlc3QodXJsLCBtb2QsIGNhbGxzdGFjayk7XG5cdFx0XHRyZXR1cm4gbW9kLnByb21pc2UgPSBwcm9taXNlLCBtb2QuZXZhbHVhdGVkID0gITEsIHRoaXMucHJvY2Vzc0ltcG9ydChhd2FpdCBwcm9taXNlLCBtZXRhLCBtZXRhZGF0YSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdG1vZC5ldmFsdWF0ZWQgPSAhMCwgZGVidWdUaW1lciAmJiBjbGVhclRpbWVvdXQoZGVidWdUaW1lcik7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGNhY2hlZE1vZHVsZSh1cmwsIGltcG9ydGVyKSB7XG5cdFx0bGV0IGNhY2hlZCA9IHRoaXMuY29uY3VycmVudE1vZHVsZU5vZGVQcm9taXNlcy5nZXQodXJsKTtcblx0XHRpZiAoY2FjaGVkKSB0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gdXNpbmcgY2FjaGVkIG1vZHVsZSBpbmZvIGZvclwiLCB1cmwpO1xuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IGNhY2hlZE1vZHVsZSA9IHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5nZXRNb2R1bGVCeVVybCh1cmwpO1xuXHRcdFx0Y2FjaGVkID0gdGhpcy5nZXRNb2R1bGVJbmZvcm1hdGlvbih1cmwsIGltcG9ydGVyLCBjYWNoZWRNb2R1bGUpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbmN1cnJlbnRNb2R1bGVOb2RlUHJvbWlzZXMuZGVsZXRlKHVybCk7XG5cdFx0XHR9KSwgdGhpcy5jb25jdXJyZW50TW9kdWxlTm9kZVByb21pc2VzLnNldCh1cmwsIGNhY2hlZCk7XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZWQ7XG5cdH1cblx0ZW5zdXJlQnVpbHRpbnMoKSB7XG5cdFx0aWYgKCF0aGlzLmlzQnVpbHRpbikgcmV0dXJuIHRoaXMuYnVpbHRpbnNQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGZldGNoaW5nIGJ1aWx0aW5zIGZyb20gc2VydmVyXCIpO1xuXHRcdFx0XHRsZXQgYnVpbHRpbnMgPSAoYXdhaXQgdGhpcy50cmFuc3BvcnQuaW52b2tlKFwiZ2V0QnVpbHRpbnNcIiwgW10pKS5tYXAoKGJ1aWx0aW4pID0+IHR5cGVvZiBidWlsdGluID09IFwib2JqZWN0XCIgJiYgYnVpbHRpbiAmJiBcInR5cGVcIiBpbiBidWlsdGluID8gYnVpbHRpbi50eXBlID09PSBcInN0cmluZ1wiID8gYnVpbHRpbi52YWx1ZSA6IG5ldyBSZWdFeHAoYnVpbHRpbi5zb3VyY2UsIGJ1aWx0aW4uZmxhZ3MpIDogYnVpbHRpbik7XG5cdFx0XHRcdHRoaXMuaXNCdWlsdGluID0gY3JlYXRlSXNCdWlsdGluKGJ1aWx0aW5zKSwgdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGJ1aWx0aW5zIGxvYWRlZDpcIiwgYnVpbHRpbnMpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0dGhpcy5idWlsdGluc1Byb21pc2UgPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0fSkoKSwgdGhpcy5idWlsdGluc1Byb21pc2U7XG5cdH1cblx0YXN5bmMgZ2V0TW9kdWxlSW5mb3JtYXRpb24odXJsLCBpbXBvcnRlciwgY2FjaGVkTW9kdWxlKSB7XG5cdFx0aWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBFcnJvcihcIlZpdGUgbW9kdWxlIHJ1bm5lciBoYXMgYmVlbiBjbG9zZWQuXCIpO1xuXHRcdGF3YWl0IHRoaXMuZW5zdXJlQnVpbHRpbnMoKSwgdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGZldGNoaW5nXCIsIHVybCk7XG5cdFx0bGV0IGlzQ2FjaGVkID0gISEodHlwZW9mIGNhY2hlZE1vZHVsZSA9PSBcIm9iamVjdFwiICYmIGNhY2hlZE1vZHVsZS5tZXRhKSwgZmV0Y2hlZE1vZHVsZSA9IHVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgfHwgdGhpcy5pc0J1aWx0aW4/Lih1cmwpID8ge1xuXHRcdFx0ZXh0ZXJuYWxpemU6IHVybCxcblx0XHRcdHR5cGU6IFwiYnVpbHRpblwiXG5cdFx0fSA6IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmludm9rZShcImZldGNoTW9kdWxlXCIsIFtcblx0XHRcdHVybCxcblx0XHRcdGltcG9ydGVyLFxuXHRcdFx0e1xuXHRcdFx0XHRjYWNoZWQ6IGlzQ2FjaGVkLFxuXHRcdFx0XHRzdGFydE9mZnNldDogdGhpcy5ldmFsdWF0b3Iuc3RhcnRPZmZzZXRcblx0XHRcdH1cblx0XHRdKTtcblx0XHRpZiAoXCJjYWNoZVwiIGluIGZldGNoZWRNb2R1bGUpIHtcblx0XHRcdGlmICghY2FjaGVkTW9kdWxlIHx8ICFjYWNoZWRNb2R1bGUubWV0YSkgdGhyb3cgRXJyb3IoYE1vZHVsZSBcIiR7dXJsfVwiIHdhcyBtaXN0YWtlbmx5IGludmFsaWRhdGVkIGR1cmluZyBmZXRjaCBwaGFzZS5gKTtcblx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGU7XG5cdFx0fVxuXHRcdGxldCBtb2R1bGVJZCA9IFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaGVkTW9kdWxlID8gZmV0Y2hlZE1vZHVsZS5leHRlcm5hbGl6ZSA6IGZldGNoZWRNb2R1bGUuaWQsIG1vZHVsZVVybCA9IFwidXJsXCIgaW4gZmV0Y2hlZE1vZHVsZSA/IGZldGNoZWRNb2R1bGUudXJsIDogdXJsLCBtb2R1bGUgPSB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuZW5zdXJlTW9kdWxlKG1vZHVsZUlkLCBtb2R1bGVVcmwpO1xuXHRcdHJldHVybiBcImludmFsaWRhdGVcIiBpbiBmZXRjaGVkTW9kdWxlICYmIGZldGNoZWRNb2R1bGUuaW52YWxpZGF0ZSAmJiB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuaW52YWxpZGF0ZU1vZHVsZShtb2R1bGUpLCBmZXRjaGVkTW9kdWxlLnVybCA9IG1vZHVsZVVybCwgZmV0Y2hlZE1vZHVsZS5pZCA9IG1vZHVsZUlkLCBtb2R1bGUubWV0YSA9IGZldGNoZWRNb2R1bGUsIG1vZHVsZTtcblx0fVxuXHRhc3luYyBkaXJlY3RSZXF1ZXN0KHVybCwgbW9kLCBfY2FsbHN0YWNrKSB7XG5cdFx0bGV0IGZldGNoUmVzdWx0ID0gbW9kLm1ldGEsIG1vZHVsZUlkID0gZmV0Y2hSZXN1bHQuaWQsIGNhbGxzdGFjayA9IFsuLi5fY2FsbHN0YWNrLCBtb2R1bGVJZF0sIHJlcXVlc3QgPSBhc3luYyAoZGVwLCBtZXRhZGF0YSkgPT4ge1xuXHRcdFx0bGV0IGltcG9ydGVyID0gXCJmaWxlXCIgaW4gZmV0Y2hSZXN1bHQgJiYgZmV0Y2hSZXN1bHQuZmlsZSB8fCBtb2R1bGVJZCwgZGVwTW9kID0gYXdhaXQgdGhpcy5jYWNoZWRNb2R1bGUoZGVwLCBpbXBvcnRlcik7XG5cdFx0XHRyZXR1cm4gZGVwTW9kLmltcG9ydGVycy5hZGQobW9kdWxlSWQpLCBtb2QuaW1wb3J0cy5hZGQoZGVwTW9kLmlkKSwgdGhpcy5jYWNoZWRSZXF1ZXN0KGRlcCwgZGVwTW9kLCBjYWxsc3RhY2ssIG1ldGFkYXRhKTtcblx0XHR9LCBkeW5hbWljUmVxdWVzdCA9IGFzeW5jIChkZXApID0+IChkZXAgPSBTdHJpbmcoZGVwKSwgZGVwWzBdID09PSBcIi5cIiAmJiAoZGVwID0gcG9zaXhSZXNvbHZlKHBvc2l4RGlybmFtZSh1cmwpLCBkZXApKSwgcmVxdWVzdChkZXAsIHsgaXNEeW5hbWljSW1wb3J0OiAhMCB9KSk7XG5cdFx0aWYgKFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaFJlc3VsdCkge1xuXHRcdFx0bGV0IHsgZXh0ZXJuYWxpemUgfSA9IGZldGNoUmVzdWx0O1xuXHRcdFx0dGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGV4dGVybmFsaXppbmdcIiwgZXh0ZXJuYWxpemUpO1xuXHRcdFx0bGV0IGV4cG9ydHMgPSBhd2FpdCB0aGlzLmV2YWx1YXRvci5ydW5FeHRlcm5hbE1vZHVsZShleHRlcm5hbGl6ZSk7XG5cdFx0XHRyZXR1cm4gbW9kLmV4cG9ydHMgPSBleHBvcnRzLCBleHBvcnRzO1xuXHRcdH1cblx0XHRsZXQgeyBjb2RlLCBmaWxlIH0gPSBmZXRjaFJlc3VsdDtcblx0XHRpZiAoY29kZSA9PSBudWxsKSB7XG5cdFx0XHRsZXQgaW1wb3J0ZXIgPSBjYWxsc3RhY2tbY2FsbHN0YWNrLmxlbmd0aCAtIDJdO1xuXHRcdFx0dGhyb3cgRXJyb3IoYFttb2R1bGUgcnVubmVyXSBGYWlsZWQgdG8gbG9hZCBcIiR7dXJsfVwiJHtpbXBvcnRlciA/IGAgaW1wb3J0ZWQgZnJvbSAke2ltcG9ydGVyfWAgOiBcIlwifWApO1xuXHRcdH1cblx0XHRsZXQgY3JlYXRlSW1wb3J0TWV0YSA9IHRoaXMub3B0aW9ucy5jcmVhdGVJbXBvcnRNZXRhID8/IGNyZWF0ZURlZmF1bHRJbXBvcnRNZXRhLCBtb2R1bGVQYXRoID0gY2xlYW5VcmwoZmlsZSB8fCBtb2R1bGVJZCksIGhyZWYgPSBwb3NpeFBhdGhUb0ZpbGVIcmVmKG1vZHVsZVBhdGgpLCBtZXRhID0gYXdhaXQgY3JlYXRlSW1wb3J0TWV0YShtb2R1bGVQYXRoKSwgZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuXHRcdFx0dmFsdWU6IFwiTW9kdWxlXCIsXG5cdFx0XHRlbnVtZXJhYmxlOiAhMSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogITFcblx0XHR9KSwgbW9kLmV4cG9ydHMgPSBleHBvcnRzO1xuXHRcdGxldCBob3RDb250ZXh0O1xuXHRcdHRoaXMuaG1yQ2xpZW50ICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXRhLCBcImhvdFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuaG1yQ2xpZW50KSB0aHJvdyBFcnJvcihcIlttb2R1bGUgcnVubmVyXSBITVIgY2xpZW50IHdhcyBjbG9zZWQuXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGNyZWF0aW5nIGhtciBjb250ZXh0IGZvclwiLCBtb2QudXJsKSwgaG90Q29udGV4dCB8fD0gbmV3IEhNUkNvbnRleHQodGhpcy5obXJDbGllbnQsIG1vZC51cmwpLCBob3RDb250ZXh0O1xuXHRcdFx0fSxcblx0XHRcdHNldDogKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGhvdENvbnRleHQgPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRsZXQgY29udGV4dCA9IHtcblx0XHRcdFtzc3JJbXBvcnRLZXldOiByZXF1ZXN0LFxuXHRcdFx0W3NzckR5bmFtaWNJbXBvcnRLZXldOiBkeW5hbWljUmVxdWVzdCxcblx0XHRcdFtzc3JNb2R1bGVFeHBvcnRzS2V5XTogZXhwb3J0cyxcblx0XHRcdFtzc3JFeHBvcnRBbGxLZXldOiAob2JqKSA9PiBleHBvcnRBbGwoZXhwb3J0cywgb2JqKSxcblx0XHRcdFtzc3JFeHBvcnROYW1lS2V5XTogKG5hbWUsIGdldHRlcikgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0XHRcdGdldDogZ2V0dGVyXG5cdFx0XHR9KSxcblx0XHRcdFtzc3JJbXBvcnRNZXRhS2V5XTogbWV0YVxuXHRcdH07XG5cdFx0cmV0dXJuIHRoaXMuZGVidWc/LihcIlttb2R1bGUgcnVubmVyXSBleGVjdXRpbmdcIiwgaHJlZiksIGF3YWl0IHRoaXMuZXZhbHVhdG9yLnJ1bklubGluZWRNb2R1bGUoY29udGV4dCwgY29kZSwgbW9kKSwgZXhwb3J0cztcblx0fVxufTtcbmZ1bmN0aW9uIGV4cG9ydEFsbChleHBvcnRzLCBzb3VyY2VNb2R1bGUpIHtcblx0aWYgKGV4cG9ydHMgIT09IHNvdXJjZU1vZHVsZSAmJiAhKGlzUHJpbWl0aXZlKHNvdXJjZU1vZHVsZSkgfHwgQXJyYXkuaXNBcnJheShzb3VyY2VNb2R1bGUpIHx8IHNvdXJjZU1vZHVsZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG5cdFx0Zm9yIChsZXQga2V5IGluIHNvdXJjZU1vZHVsZSkgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiAmJiAhKGtleSBpbiBleHBvcnRzKSkgdHJ5IHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0XHRcdGdldDogKCkgPT4gc291cmNlTW9kdWxlW2tleV1cblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2gge31cblx0fVxufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBFU01vZHVsZXNFdmFsdWF0b3IsIEV2YWx1YXRlZE1vZHVsZXMsIE1vZHVsZVJ1bm5lciwgY3JlYXRlRGVmYXVsdEltcG9ydE1ldGEsIGNyZWF0ZU5vZGVJbXBvcnRNZXRhLCBjcmVhdGVXZWJTb2NrZXRNb2R1bGVSdW5uZXJUcmFuc3BvcnQsIG5vcm1hbGl6ZU1vZHVsZUlkLCBzc3JEeW5hbWljSW1wb3J0S2V5LCBzc3JFeHBvcnRBbGxLZXksIHNzckV4cG9ydE5hbWVLZXksIHNzckltcG9ydEtleSwgc3NySW1wb3J0TWV0YUtleSwgc3NyTW9kdWxlRXhwb3J0c0tleSB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFJLG9CQUFvQjtBQUN4QixxQkFBcUI7QUFHckIsTUFBTSxZQUFZLE9BQU8sVUFBVSxPQUFPLFFBQVEsYUFB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