@runcore-sh/runcore 0.5.6 → 0.5.7

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 (174) hide show
  1. package/dictionary.json +2 -2
  2. package/dist/.extensions/ext-byok.json +1 -0
  3. package/dist/.extensions/ext-hosted.json +1 -0
  4. package/dist/.extensions/ext-spawn.json +1 -0
  5. package/dist/agents/autonomous.d.ts.map +1 -1
  6. package/dist/agents/runtime/bus.d.ts +1 -0
  7. package/dist/agents/runtime/bus.d.ts.map +1 -1
  8. package/dist/agents/spawn.d.ts.map +1 -1
  9. package/dist/auth/middleware.d.ts.map +1 -1
  10. package/dist/auth/middleware.js +3 -2
  11. package/dist/auth/middleware.js.map +1 -1
  12. package/dist/calendar/routes.d.ts.map +1 -1
  13. package/dist/calendar/routes.js +8 -7
  14. package/dist/calendar/routes.js.map +1 -1
  15. package/dist/files/registry.d.ts +4 -5
  16. package/dist/files/registry.d.ts.map +1 -1
  17. package/dist/files/registry.js +4 -5
  18. package/dist/files/registry.js.map +1 -1
  19. package/dist/files/store.d.ts +2 -0
  20. package/dist/files/store.d.ts.map +1 -1
  21. package/dist/files/store.js +5 -1
  22. package/dist/files/store.js.map +1 -1
  23. package/dist/instance.d.ts +2 -0
  24. package/dist/instance.d.ts.map +1 -1
  25. package/dist/instance.js +2 -0
  26. package/dist/instance.js.map +1 -1
  27. package/dist/lib/paths.d.ts.map +1 -1
  28. package/dist/lib/paths.js +15 -1
  29. package/dist/lib/paths.js.map +1 -1
  30. package/dist/library/brain-shadow.d.ts.map +1 -1
  31. package/dist/library/brain-shadow.js +5 -4
  32. package/dist/library/brain-shadow.js.map +1 -1
  33. package/dist/library/routes.d.ts.map +1 -1
  34. package/dist/library/routes.js +10 -9
  35. package/dist/library/routes.js.map +1 -1
  36. package/dist/llm/cache.d.ts.map +1 -1
  37. package/dist/llm/cache.js +7 -5
  38. package/dist/llm/cache.js.map +1 -1
  39. package/dist/llm/complete.js +2 -0
  40. package/dist/llm/complete.js.map +1 -1
  41. package/dist/llm/providers/ollama.d.ts.map +1 -1
  42. package/dist/llm/providers/ollama.js +32 -7
  43. package/dist/llm/providers/ollama.js.map +1 -1
  44. package/dist/llm/providers/openrouter.d.ts.map +1 -1
  45. package/dist/llm/providers/openrouter.js +105 -12
  46. package/dist/llm/providers/openrouter.js.map +1 -1
  47. package/dist/llm/providers/types.d.ts +18 -0
  48. package/dist/llm/providers/types.d.ts.map +1 -1
  49. package/dist/llm/retry.d.ts.map +1 -1
  50. package/dist/llm/retry.js +6 -0
  51. package/dist/llm/retry.js.map +1 -1
  52. package/dist/llm/tools/handlers.d.ts +27 -0
  53. package/dist/llm/tools/handlers.d.ts.map +1 -0
  54. package/dist/llm/tools/handlers.js +842 -0
  55. package/dist/llm/tools/handlers.js.map +1 -0
  56. package/dist/llm/tools/index.d.ts +12 -0
  57. package/dist/llm/tools/index.d.ts.map +1 -0
  58. package/dist/llm/tools/index.js +10 -0
  59. package/dist/llm/tools/index.js.map +1 -0
  60. package/dist/llm/tools/loop.d.ts +47 -0
  61. package/dist/llm/tools/loop.d.ts.map +1 -0
  62. package/dist/llm/tools/loop.js +126 -0
  63. package/dist/llm/tools/loop.js.map +1 -0
  64. package/dist/llm/tools/registry.d.ts +27 -0
  65. package/dist/llm/tools/registry.d.ts.map +1 -0
  66. package/dist/llm/tools/registry.js +60 -0
  67. package/dist/llm/tools/registry.js.map +1 -0
  68. package/dist/llm/tools/schemas.d.ts +92 -0
  69. package/dist/llm/tools/schemas.d.ts.map +1 -0
  70. package/dist/llm/tools/schemas.js +154 -0
  71. package/dist/llm/tools/schemas.js.map +1 -0
  72. package/dist/llm/tools/types.d.ts +44 -0
  73. package/dist/llm/tools/types.d.ts.map +1 -0
  74. package/dist/llm/tools/types.js +9 -0
  75. package/dist/llm/tools/types.js.map +1 -0
  76. package/dist/mcp-server.d.ts +1 -1
  77. package/dist/mcp-server.js +249 -5
  78. package/dist/mcp-server.js.map +1 -1
  79. package/dist/memory/visual.d.ts.map +1 -1
  80. package/dist/memory/visual.js +3 -6
  81. package/dist/memory/visual.js.map +1 -1
  82. package/dist/openloop/foldback.js +1 -1
  83. package/dist/openloop/foldback.js.map +1 -1
  84. package/dist/openloop/resolution-scanner.d.ts.map +1 -1
  85. package/dist/openloop/resolution-scanner.js +76 -63
  86. package/dist/openloop/resolution-scanner.js.map +1 -1
  87. package/dist/plugins/github/index.d.ts +49 -0
  88. package/dist/plugins/github/index.d.ts.map +1 -0
  89. package/dist/plugins/github/index.js +153 -0
  90. package/dist/plugins/github/index.js.map +1 -0
  91. package/dist/plugins/index.d.ts +1 -2
  92. package/dist/plugins/index.d.ts.map +1 -1
  93. package/dist/plugins/index.js +79 -2
  94. package/dist/plugins/index.js.map +1 -1
  95. package/dist/plugins/slack/index.d.ts +43 -0
  96. package/dist/plugins/slack/index.d.ts.map +1 -0
  97. package/dist/plugins/slack/index.js +158 -0
  98. package/dist/plugins/slack/index.js.map +1 -0
  99. package/dist/plugins/twilio/index.d.ts +41 -0
  100. package/dist/plugins/twilio/index.d.ts.map +1 -0
  101. package/dist/plugins/twilio/index.js +102 -0
  102. package/dist/plugins/twilio/index.js.map +1 -0
  103. package/dist/pulse/tier.d.ts +1 -1
  104. package/dist/pulse/tier.js +2 -2
  105. package/dist/pulse/tier.js.map +1 -1
  106. package/dist/search/gemini.d.ts +27 -0
  107. package/dist/search/gemini.d.ts.map +1 -0
  108. package/dist/search/gemini.js +103 -0
  109. package/dist/search/gemini.js.map +1 -0
  110. package/dist/server.d.ts.map +1 -1
  111. package/dist/server.js +850 -536
  112. package/dist/server.js.map +1 -1
  113. package/dist/services/routine-patterns.d.ts.map +1 -1
  114. package/dist/services/routine-patterns.js +6 -0
  115. package/dist/services/routine-patterns.js.map +1 -1
  116. package/dist/services/traceInsights.d.ts +5 -0
  117. package/dist/services/traceInsights.d.ts.map +1 -1
  118. package/dist/services/traceInsights.js +18 -1
  119. package/dist/services/traceInsights.js.map +1 -1
  120. package/dist/settings.d.ts +1 -1
  121. package/dist/settings.d.ts.map +1 -1
  122. package/dist/types.d.ts +26 -2
  123. package/dist/types.d.ts.map +1 -1
  124. package/dist/vault/store.d.ts +1 -1
  125. package/dist/vault/store.d.ts.map +1 -1
  126. package/dist/webhooks/mount.d.ts.map +1 -1
  127. package/dist/whiteboard/store.d.ts +40 -0
  128. package/dist/whiteboard/store.d.ts.map +1 -0
  129. package/dist/whiteboard/store.js +280 -0
  130. package/dist/whiteboard/store.js.map +1 -0
  131. package/dist/whiteboard/types.d.ts +55 -0
  132. package/dist/whiteboard/types.d.ts.map +1 -0
  133. package/dist/whiteboard/types.js +9 -0
  134. package/dist/whiteboard/types.js.map +1 -0
  135. package/dist/whiteboard/weight.d.ts +23 -0
  136. package/dist/whiteboard/weight.d.ts.map +1 -0
  137. package/dist/whiteboard/weight.js +126 -0
  138. package/dist/whiteboard/weight.js.map +1 -0
  139. package/package.json +2 -2
  140. package/public/avatar/cache/0cdaf9c41eff4347.mp4 +0 -0
  141. package/public/avatar/cache/3dacc4ea1082ae36.mp4 +0 -0
  142. package/public/avatar/cache/44f5db0bfdde93c6.mp4 +0 -0
  143. package/public/avatar/cache/5628fd10fe55e529.mp4 +0 -0
  144. package/public/avatar/cache/7ee2ab1577690c8a.mp4 +0 -0
  145. package/public/avatar/cache/8c470929e814b6b0.mp4 +0 -0
  146. package/public/avatar/cache/8c908421ce52bf91.mp4 +0 -0
  147. package/public/avatar/cache/9532f8782a42a89c.mp4 +0 -0
  148. package/public/avatar/cache/9ce0dddd0cc4d7a1.mp4 +0 -0
  149. package/public/avatar/cache/a6508e00b6711143.mp4 +0 -0
  150. package/public/avatar/cache/ba61810a8915e0c7.mp4 +0 -0
  151. package/public/avatar/cache/c07bee3a10c917cf.mp4 +0 -0
  152. package/public/avatar/cache/d69175900ea4ea2a.mp4 +0 -0
  153. package/public/avatar/cache/e61039bc8d39cb93.mp4 +0 -0
  154. package/public/avatar/cache/e61c6b7047e2cbdb.mp4 +0 -0
  155. package/public/avatar/cache/efd93c9b18930cf6.mp4 +0 -0
  156. package/public/avatar/cache/f052d74f5c4abab7.mp4 +0 -0
  157. package/public/avatar/cache/f7c0be3429a4ef97.mp4 +0 -0
  158. package/public/avatar/cache/fc8e480f63fe4e35.mp4 +0 -0
  159. package/public/index.html +225 -51
  160. package/public/search-flyout.js +324 -0
  161. package/public/whiteboard.html +915 -0
  162. package/public/avatar/cache/06fa55aececcc478.mp4 +0 -0
  163. package/public/avatar/cache/07a65738ba170827.mp4 +0 -0
  164. package/public/avatar/cache/1185fd491f413406.mp4 +0 -0
  165. package/public/avatar/cache/272c004a41087de5.mp4 +0 -0
  166. package/public/avatar/cache/332384e088ca214b.mp4 +0 -0
  167. package/public/avatar/cache/5d9a960bbf71732c.mp4 +0 -0
  168. package/public/avatar/cache/5e0954401e15af89.mp4 +0 -0
  169. package/public/avatar/cache/b35f7a3d558f22cb.mp4 +0 -0
  170. package/public/avatar/cache/be89f49970672374.mp4 +0 -0
  171. package/public/avatar/cache/c900811e3382ac6d.mp4 +0 -0
  172. package/public/avatar/cache/d42a73667acf5716.mp4 +0 -0
  173. package/public/avatar/cache/e539f247a8908603.mp4 +0 -0
  174. package/public/avatar/cache/ec95af57d33b3f07.mp4 +0 -0
@@ -0,0 +1 @@
1
+ {"manifest":{"name":"ext-spawn","version":"0.5.6","minCoreVersion":"0.5.6","tier":"spawn","modules":[{"path":"agents/spawn.js","hash":"sha256:f25020e1e2f46d9f78ae0a02c41c6e4c5a236e67eac898ee1def4c23b006d41c"},{"path":"agents/governed-spawn.js","hash":"sha256:44e1423ec89e2f1b94ec9650968cddc30a0b99c436c98bfb1043b4509341eaca"},{"path":"agents/governance.js","hash":"sha256:9ce8aa22bd1975f34bfafa8a43f949a28e218ff3b23f903f96eda8e9438fc66a"},{"path":"agents/spawn-policy.js","hash":"sha256:516fee2d4d0309e7483262af75701dd50090738de9371eaeaf8e107daf22c140"},{"path":"agents/runtime/bus.js","hash":"sha256:00b5b3219e4d65cf4cd811a67dced2223a8b8d9962330de7a57f8c864d941715"},{"path":"agents/runtime/config.js","hash":"sha256:6095a1149f92525584f626a41b6b9d3dd034790139646055041e3c8c46096df1"},{"path":"agents/runtime/driver.js","hash":"sha256:d6267bbc4df25153596040cd83ac22f207f3c116521439e8ca853306d09209ab"},{"path":"agents/runtime/errors.js","hash":"sha256:c70ddac24d220b9d97389f118fde3276b1136640246ff5047f05a1e9cb9158cd"},{"path":"agents/runtime/index.js","hash":"sha256:21f1d62d27fa368906e47886be1cc71301041fa79139c5853bedee69e6e94b37"},{"path":"agents/runtime/lifecycle.js","hash":"sha256:f5a6766d46803a48043d7bb0aeb31d707204b93d9cb1114cbfbd22206ba39649"},{"path":"agents/runtime/manager.js","hash":"sha256:31a73c8cfaf437fe677b54519904d39544563969f5141da8df2f2d5e1a46dd3b"},{"path":"agents/runtime/registry.js","hash":"sha256:bd2d3ed2399990989a5df25414184fbd4a96ee3d393b00585b842bfc1ca46d13"},{"path":"agents/runtime/resources.js","hash":"sha256:85f753a3cd6dff765c42f8f103d20d0e5aa45983dc5a7b7881d19a21271cb176"},{"path":"agents/runtime/types.js","hash":"sha256:b8c1fd95a151e763cd7012fb52ec42eb8551ce8f97a75bb29b83c18cf2bb8995"},{"path":"agents/instance-manager.js","hash":"sha256:3731c25f6fb8048a16d575c36c18e895b3294adde16a342ed6842366b393277f"},{"path":"agents/monitor.js","hash":"sha256:c0e91f457d5cff37166d2b36af88ebffae0b7d67631b11f92514609ffce2ef4b"},{"path":"agents/heartbeat.js","hash":"sha256:43a276c2ab6fb95aea246a8a7f2bf12fd1344efacd4eae4044d1fce13b1d447c"},{"path":"agents/orchestration.js","hash":"sha256:ffead91341f0912d0b27e8133e3e8e6f27b7517d97b011c763b72d3d966eaf0f"},{"path":"agents/workflow.js","hash":"sha256:172c193c60a560347e3d3b37a3dbda3907208fcf5c1b2f870e84f1d52512334f"},{"path":"agents/autonomous.js","hash":"sha256:c8c5d5fff341b9b4a69335a16700cc2193aa4fad972454ea2527d00379dac081"},{"path":"agents/reflection.js","hash":"sha256:73d014d4df2797671d31880a8ca0900eb2106ddb34991803e7775878b5d10281"},{"path":"agents/dedup-guard.js","hash":"sha256:da56d9d436c7251b4209c2ae250896dede75a6f1a8fd1e9afe6eed5f5d848bb1"},{"path":"agents/recover.js","hash":"sha256:00249e3534e03074b79ae06bc649a6ed94710b2dd1028f2aa8f0032d696319ae"},{"path":"agents/issue-reporter.js","hash":"sha256:7094d599b77a881b80c201135936381c01b15882c5d13e3eb7df65646de3d9eb"},{"path":"agents/issues.js","hash":"sha256:75f0fef063536425a4a4a365ba3411f97e45b507ce3edb72e0afcc47107586a9"},{"path":"agents/feed.js","hash":"sha256:9069a44ae1dca2310c13b875477e2ba1e8d750e8bbff22668479514b7610ae95"},{"path":"agents/commit.js","hash":"sha256:d5c5715976c4c75b819e5713aee4ccc18c2e222dbb0b64d02b2721029f128434"},{"path":"agents/continue.js","hash":"sha256:31839523ca4793f4cf71e2acc052357558ae60cf77a43cb4cc3be679870e5ce2"},{"path":"agents/cooldown.js","hash":"sha256:d73cc9a3b86a6de5f391170e8a10db619eb05f65e0989cd998994b51e79ff268"},{"path":"agents/locks.js","hash":"sha256:e9712730607126fe9a3f0d71f430ac16431df3b11ad1184c0511542f01875eb3"},{"path":"agents/triage.js","hash":"sha256:8ed7e7770b046253d9b9fff0741a3db1e2b5227487058a9c6fdba36494226a89"},{"path":"agents/memory.js","hash":"sha256:6b2c2198cb4b36c8a851d17602bfad2a8ddb950acb3f2f3fc5bade46c3e300b7"}],"dependencies":{}},"files":{"agents/spawn.js":"aW1wb3J0IHsgc3Bhd24gfSBmcm9tICJub2RlOmNoaWxkX3Byb2Nlc3MiOwppbXBvcnQgeyB3cml0ZUZpbGVTeW5jLCBta2RpclN5bmMgfSBmcm9tICJub2RlOmZzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IHdyaXRlVGFzaywgdXBkYXRlVGFzaywgcmVhZFRhc2ssIHJlYWRUYXNrT3V0cHV0LCBsaXN0VGFza3MsIExPR1NfRElSIH0gZnJvbSAiLi9zdG9yZS5qcyI7CmltcG9ydCB7IHB1c2hOb3RpZmljYXRpb24gfSBmcm9tICIuLi9nb2Fscy9ub3RpZmljYXRpb25zLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyByZW1lbWJlclRhc2tPdXRjb21lLCByZWNvcmRTY2FyIH0gZnJvbSAiLi9tZW1vcnkuanMiOwppbXBvcnQgeyBtYWtlQ2FsbCB9IGZyb20gIi4uL3R3aWxpby9jYWxsLmpzIjsKaW1wb3J0IHsgYXR0ZW1wdFJlY292ZXJ5LCByZWNvcmRSZWNvdmVyeUZhaWx1cmUgfSBmcm9tICIuL3JlY292ZXIuanMiOwppbXBvcnQgeyBUYXNrQ29vbGRvd25NYW5hZ2VyIH0gZnJvbSAiLi9jb29sZG93bi5qcyI7CmltcG9ydCB7IHRyaWFnZUFnZW50T3V0cHV0IH0gZnJvbSAiLi90cmlhZ2UuanMiOwppbXBvcnQgeyByZWxlYXNlTG9ja3MgfSBmcm9tICIuL2xvY2tzLmpzIjsKaW1wb3J0IHsgcmVjb3JkQWdlbnRTcGF3biwgcmVjb3JkQWdlbnRDb21wbGV0aW9uIH0gZnJvbSAiLi4vbWV0cmljcy9jb2xsZWN0b3IuanMiOwppbXBvcnQgeyByZWNvcmRTcGF3blJhdGVCbG9jaywgcmVjb3JkQnJpZGdlUmVwb3J0IGFzIHJlY29yZEJyaWRnZVJlcG9ydE1ldHJpYyB9IGZyb20gIi4uL21ldHJpY3MvZmlyZXdhbGwtbWV0cmljcy5qcyI7CmltcG9ydCB7IHRyYWNlQWdlbnRTcGF3biB9IGZyb20gIi4uL3RyYWNpbmcvaW5zdHJ1bWVudC5qcyI7CmltcG9ydCB7IGdldENvcnJlbGF0aW9uSWQgfSBmcm9tICIuLi90cmFjaW5nL2NvcnJlbGF0aW9uLmpzIjsKaW1wb3J0IHsgY29tcGxldGVDaGF0IH0gZnJvbSAiLi4vbGxtL2NvbXBsZXRlLmpzIjsKaW1wb3J0IHsgcmVzb2x2ZUFnZW50TW9kZWxBc3luYywgcmVzb2x2ZUFnZW50UHJvdmlkZXIgfSBmcm9tICIuLi9zZXR0aW5ncy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IHJlc29sdmVFbnYsIGdldEluc3RhbmNlTmFtZSwgZ2V0SW5zdGFuY2VOYW1lTG93ZXIsIGdldEFsZXJ0RW1haWxGcm9tIH0gZnJvbSAiLi4vaW5zdGFuY2UuanMiOwppbXBvcnQgeyBza2lsbFJlZ2lzdHJ5IGFzIF9za2lsbFJlZ2lzdHJ5IH0gZnJvbSAiLi4vc2tpbGxzL3JlZ2lzdHJ5LmpzIjsKaW1wb3J0IHsgZ2V0Qm9hcmRQcm92aWRlciB9IGZyb20gIi4uL2JvYXJkL3Byb3ZpZGVyLmpzIjsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKaW1wb3J0IHsgcHJvY2Vzc0FnZW50SXNzdWVzIH0gZnJvbSAiLi9pc3N1ZXMuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImFnZW50LXNwYXduIik7Ci8qKgogKiBVcGRhdGUgYSBib2FyZCB0YXNrJ3Mgc3RhdGUvYXNzaWduZWUuIEJlc3QtZWZmb3J0IOKAlCBmYWlsdXJlcyBhcmUgbG9nZ2VkLCBub3QgdGhyb3duLgogKiBVc2VkIHRvIG1vdmUgYm9hcmQgaXRlbXMgdGhyb3VnaCBpbl9wcm9ncmVzcyDihpIgZG9uZS90b2RvIGFzIGFnZW50cyB3b3JrLgogKiBFeHBvcnRlZCBzbyB0aGUgbW9uaXRvciBjYW4gYWxzbyB1cGRhdGUgYm9hcmQgc3RhdGUgb24gcmVjb3ZlcmVkIGNvbXBsZXRpb25zLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUJvYXJkVGFza1N0YXRlKGJvYXJkVGFza0lkLCBjaGFuZ2VzKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJwID0gZ2V0Qm9hcmRQcm92aWRlcigpOwogICAgICAgIGNvbnN0IHN0b3JlID0gYnA/LmdldFN0b3JlPy4oKTsKICAgICAgICBpZiAoc3RvcmUpIHsKICAgICAgICAgICAgYXdhaXQgc3RvcmUudXBkYXRlKGJvYXJkVGFza0lkLCBjaGFuZ2VzKTsKICAgICAgICAgICAgbG9nLmRlYnVnKGBCb2FyZCB0YXNrICR7Ym9hcmRUYXNrSWR9IHVwZGF0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoY2hhbmdlcyl9YCk7CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gdXBkYXRlIGJvYXJkIHRhc2sgJHtib2FyZFRhc2tJZH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApOwogICAgfQp9Ci8qKiBUcmFjayByZWNlbnQgZmFpbHVyZXMg4oCUIGVtYWlsIGZpcnN0LCBwaG9uZSBvbmx5IGFzIGxhc3QgcmVzb3J0LiAqLwpjb25zdCByZWNlbnRGYWlsdXJlcyA9IFtdOwpjb25zdCBGQUlMVVJFX1dJTkRPV19NUyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcwpjb25zdCBFTUFJTF9USFJFU0hPTEQgPSAyOyAvLyAyKyBmYWlsdXJlcyBpbiB3aW5kb3cg4oaSIGVtYWlsCmNvbnN0IENBTExfVEhSRVNIT0xEID0gNTsgLy8gNSsgZmFpbHVyZXMgaW4gd2luZG93IOKGkiBwaG9uZSAobGFzdCByZXNvcnQpCmxldCBsYXN0RW1haWxUaW1lID0gMDsKbGV0IGxhc3RDYWxsVGltZSA9IDA7CmNvbnN0IEVNQUlMX0NPT0xET1dOX01TID0gMTAgKiA2MCAqIDEwMDA7IC8vIERvbid0IGVtYWlsIG1vcmUgdGhhbiBvbmNlIHBlciAxMCBtaW4KY29uc3QgQ0FMTF9DT09MRE9XTl9NUyA9IDMwICogNjAgKiAxMDAwOyAvLyBEb24ndCBjYWxsIG1vcmUgdGhhbiBvbmNlIHBlciAzMCBtaW4KLyoqCiAqIEdsb2JhbCBzcGF3biByYXRlIGxpbWl0ZXIg4oCUIHByZXZlbnRzIGJ1cnN0LXNwYXduaW5nIGFnZW50cy4KICogVHJhY2tzIHRpbWVzdGFtcHMgb2YgcmVjZW50IHNwYXducyBhbmQgZW5mb3JjZXMgbWluaW11bSBzcGFjaW5nLgogKi8KY29uc3QgcmVjZW50U3Bhd25UaW1lc3RhbXBzID0gW107CmNvbnN0IFNQQVdOX1JBVEVfV0lORE9XX01TID0gNjBfMDAwOyAvLyAxIG1pbnV0ZSB3aW5kb3cKY29uc3QgTUFYX1NQQVdOU19QRVJfV0lORE9XID0gMTA7IC8vIE1heCAxMCBzcGF3bnMgcGVyIG1pbnV0ZQpmdW5jdGlvbiBpc1NwYXduUmF0ZUxpbWl0ZWQoKSB7CiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgLy8gUHJ1bmUgb2xkIGVudHJpZXMKICAgIHdoaWxlIChyZWNlbnRTcGF3blRpbWVzdGFtcHMubGVuZ3RoID4gMCAmJiByZWNlbnRTcGF3blRpbWVzdGFtcHNbMF0gPCBub3cgLSBTUEFXTl9SQVRFX1dJTkRPV19NUykgewogICAgICAgIHJlY2VudFNwYXduVGltZXN0YW1wcy5zaGlmdCgpOwogICAgfQogICAgcmV0dXJuIHJlY2VudFNwYXduVGltZXN0YW1wcy5sZW5ndGggPj0gTUFYX1NQQVdOU19QRVJfV0lORE9XOwp9CmZ1bmN0aW9uIHJlY29yZFNwYXduKCkgewogICAgcmVjZW50U3Bhd25UaW1lc3RhbXBzLnB1c2goRGF0ZS5ub3coKSk7Cn0KLy8g4pSA4pSA4pSAIFNraWxsIEVucmljaG1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBFbnJpY2ggYSB0YXNrJ3MgcHJvbXB0IHdpdGggbWF0Y2hlZCBza2lsbCBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgU2tpbGxSZWdpc3RyeS4KICogVHJhbnNwYXJlbnQ6IGlmIHRoZSByZWdpc3RyeSBpc24ndCBpbml0aWFsaXplZCBvciBubyBza2lsbHMgbWF0Y2gsIHJldHVybnMgdGhlCiAqIG9yaWdpbmFsIHByb21wdCB1bmNoYW5nZWQuCiAqLwphc3luYyBmdW5jdGlvbiBlbnJpY2hQcm9tcHRXaXRoU2tpbGxzKHRhc2spIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgbWF0Y2hlZCA9IGF3YWl0IF9za2lsbFJlZ2lzdHJ5LmZpbmRCeVRyaWdnZXIodGFzay5sYWJlbCk7CiAgICAgICAgaWYgKCFtYXRjaGVkKQogICAgICAgICAgICByZXR1cm4gdGFzay5wcm9tcHQ7CiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IF9za2lsbFJlZ2lzdHJ5LmdldENvbnRlbnQobWF0Y2hlZC5pZCk7CiAgICAgICAgaWYgKCFjb250ZW50KQogICAgICAgICAgICByZXR1cm4gdGFzay5wcm9tcHQ7CiAgICAgICAgY29uc3Qgc2tpbGxQcm9tcHRzID0gW2A8c2tpbGwgbmFtZT0iJHttYXRjaGVkLm5hbWV9IiB0eXBlPSIke21hdGNoZWQudHlwZX0iPlxuJHtjb250ZW50fVxuPC9za2lsbD5gXTsKICAgICAgICBjb25zdCBza2lsbE5hbWVzID0gW21hdGNoZWQubmFtZV07CiAgICAgICAgbG9nLmluZm8oYEVucmljaGluZyBhZ2VudCAiJHt0YXNrLmxhYmVsfSIgd2l0aCBza2lsbDogJHtza2lsbE5hbWVzLmpvaW4oIiwgIil9YCwgeyB0YXNrSWQ6IHRhc2suaWQgfSk7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgdGFzay5wcm9tcHQsCiAgICAgICAgICAgICIiLAogICAgICAgICAgICAiLS0tIiwKICAgICAgICAgICAgIiMjIFJlbGV2YW50IFNraWxscyIsCiAgICAgICAgICAgICIiLAogICAgICAgICAgICAuLi5za2lsbFByb21wdHMsCiAgICAgICAgXS5qb2luKCJcbiIpOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy53YXJuKGBTa2lsbCBlbnJpY2htZW50IGZhaWxlZCBmb3IgIiR7dGFzay5sYWJlbH0iLCB1c2luZyBvcmlnaW5hbCBwcm9tcHQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsIHsgdGFza0lkOiB0YXNrLmlkIH0pOwogICAgICAgIHJldHVybiB0YXNrLnByb21wdDsKICAgIH0KfQovKiogTWFwIG9mIHRhc2sgSUQg4oaSIHNwYXduZWQgQ2hpbGRQcm9jZXNzIChvbmx5IGZvciB0YXNrcyB3ZSBzcGF3bmVkIHRoaXMgc2Vzc2lvbikuICovCmNvbnN0IGFjdGl2ZVByb2Nlc3NlcyA9IG5ldyBNYXAoKTsKLyoqIFRhc2tzIHRoYXQgZmVsbCBiYWNrIGZyb20gcG9vbCB0byBkaXJlY3Qg4oCUIHNraXAgcmVjb3ZlcnkgdG8gcHJldmVudCBkb3VibGUtcmV0cnkuICovCmNvbnN0IHBvb2xGYWxsYmFja1Rhc2tzID0gbmV3IFNldCgpOwovKiogVHJhY2sgYmF0Y2ggbWVtYmVyc2hpcDogc2Vzc2lvbklkIOKGkiBzZXQgb2YgdGFzayBJRHMgc3Bhd25lZCB0b2dldGhlci4gKi8KY29uc3Qgc2Vzc2lvbkJhdGNoZXMgPSBuZXcgTWFwKCk7Ci8qKiBDb2xsZWN0IHJlc3VsdHMgZnJvbSBlYWNoIGFnZW50IGFzIHRoZXkgZmluaXNoIChzZXNzaW9uSWQg4oaSIHJlc3VsdHNbXSkgKi8KY29uc3QgYmF0Y2hSZXN1bHRzID0gbmV3IE1hcCgpOwovKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGFsbCBhZ2VudHMgZnJvbSBhIHNlc3Npb24gYmF0Y2ggaGF2ZSBjb21wbGV0ZWQuICovCmxldCBvbkJhdGNoQ29tcGxldGUgPSBudWxsOwovKiogUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3Igd2hlbiBhbiBhZ2VudCBiYXRjaCBmaW5pc2hlcy4gKi8KZXhwb3J0IGZ1bmN0aW9uIHNldE9uQmF0Y2hDb21wbGV0ZShjYikgewogICAgb25CYXRjaENvbXBsZXRlID0gY2I7Cn0KLyoqIE1hcCBvZiB0YXNrIElEIOKGkiB0aW1lb3V0IHRpbWVyLiAqLwpjb25zdCBhY3RpdmVUaW1lcnMgPSBuZXcgTWFwKCk7CmV4cG9ydCB7IGFjdGl2ZVByb2Nlc3NlcyB9OwovKiogQ2hlY2sgaWYgYW55IGFnZW50cyBhcmUgY3VycmVudGx5IHJ1bm5pbmcgKGFjdGl2ZSBwcm9jZXNzZXMgb3IgcGVuZGluZyBiYXRjaGVzKS4gKi8KZXhwb3J0IGZ1bmN0aW9uIGlzQWdlbnRzQnVzeSgpIHsKICAgIHJldHVybiBhY3RpdmVQcm9jZXNzZXMuc2l6ZSA+IDAgfHwgc2Vzc2lvbkJhdGNoZXMuc2l6ZSA+IDA7Cn0KLyoqIE51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIGFnZW50IHByb2Nlc3Nlcy4gKi8KZXhwb3J0IGZ1bmN0aW9uIGFjdGl2ZUFnZW50Q291bnQoKSB7CiAgICByZXR1cm4gYWN0aXZlUHJvY2Vzc2VzLnNpemU7Cn0KLyoqIFJlZmVyZW5jZSB0byB0aGUgcnVudGltZSBwb29sLiBTZXQgdmlhIHNldEFnZW50UG9vbCgpIHdoZW4gdGhlIHBvb2wgaXMgaW5pdGlhbGl6ZWQuICovCmxldCBhZ2VudFBvb2wgPSBudWxsOwovKiogV2lyZSB0aGUgcnVudGltZSBwb29sIGludG8gc3Bhd24udHMgc28gc3Bhd25BZ2VudCBkZWxlZ2F0ZXMgdG8gaXQuICovCmV4cG9ydCBmdW5jdGlvbiBzZXRBZ2VudFBvb2wocG9vbCkgewogICAgYWdlbnRQb29sID0gcG9vbDsKfQovKiogQ2hlY2sgaWYgdGhlIHJ1bnRpbWUgcG9vbCBpcyBhY3RpdmUuICovCmV4cG9ydCBmdW5jdGlvbiBoYXNBZ2VudFBvb2woKSB7CiAgICByZXR1cm4gYWdlbnRQb29sICE9PSBudWxsICYmICFhZ2VudFBvb2wuaXNTaHV0dGluZ0Rvd247Cn0KLyoqCiAqIFNwYXduIHRoZSBjbGF1ZGUgQ0xJIGZvciBhIHRhc2suCiAqCiAqIFdoZW4gdGhlIHJ1bnRpbWUgQWdlbnRQb29sIGlzIGF2YWlsYWJsZSwgZGVsZWdhdGVzIHRvIGl0IGZvciBsaWZlY3ljbGUKICogbWFuYWdlbWVudCwgcmVzb3VyY2UgdHJhY2tpbmcsIGNpcmN1aXQgYnJlYWtlcnMsIGFuZCBpc29sYXRpb24uCiAqIEZhbGxzIGJhY2sgdG8gZGlyZWN0IHByb2Nlc3Mgc3Bhd25pbmcgd2hlbiB0aGUgcG9vbCBpc24ndCBpbml0aWFsaXplZC4KICoKICogTXV0YXRlcyB0YXNrIGluLXBsYWNlIChzdGF0dXMsIHBpZCwgc3RhcnRlZEF0KSBhbmQgd3JpdGVzIHRvIGRpc2suCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25BZ2VudCh0YXNrKSB7CiAgICByZXR1cm4gdHJhY2VBZ2VudFNwYXduKHRhc2suaWQsIHRhc2subGFiZWwsIHRhc2sub3JpZ2luLCBhc3luYyAoc3BhbikgPT4gewogICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBnZXRDb3JyZWxhdGlvbklkKCk7CiAgICAgICAgaWYgKGNvcnJlbGF0aW9uSWQpIHsKICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoImRhc2guY29ycmVsYXRpb25faWQiLCBjb3JyZWxhdGlvbklkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhc2suc2Vzc2lvbklkKSB7CiAgICAgICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCJhZ2VudC5zZXNzaW9uX2lkIiwgdGFzay5zZXNzaW9uSWQpOwogICAgICAgIH0KICAgICAgICBsb2cuaW5mbyhgU3Bhd25pbmcgYWdlbnQ6ICR7dGFzay5sYWJlbH1gLCB7IHRhc2tJZDogdGFzay5pZCwgb3JpZ2luOiB0YXNrLm9yaWdpbiwgc2Vzc2lvbklkOiB0YXNrLnNlc3Npb25JZCB9KTsKICAgICAgICAvLyBFbnJpY2ggcHJvbXB0IHdpdGggbWF0Y2hlZCBza2lsbCBpbnN0cnVjdGlvbnMgKHRyYW5zcGFyZW50IOKAlCBuby1vcCBpZiByZWdpc3RyeSB1bmF2YWlsYWJsZSkKICAgICAgICB0YXNrLnByb21wdCA9IGF3YWl0IGVucmljaFByb21wdFdpdGhTa2lsbHModGFzayk7CiAgICAgICAgLy8gR2xvYmFsIHNwYXduIHJhdGUgbGltaXRlciDigJQgcHJldmVudCBidXJzdC1zcGF3bmluZwogICAgICAgIGlmIChpc1NwYXduUmF0ZUxpbWl0ZWQoKSkgewogICAgICAgICAgICBsb2cud2FybihgU3Bhd24gcmF0ZS1saW1pdGVkLCBza2lwcGluZzogJHt0YXNrLmxhYmVsfWAsIHsgdGFza0lkOiB0YXNrLmlkIH0pOwogICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgiYWdlbnQucmF0ZV9saW1pdGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIHJlY29yZFNwYXduUmF0ZUJsb2NrKCk7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBTcGF3biByYXRlLWxpbWl0ZWQsIHNraXBwaW5nOiAke3Rhc2subGFiZWx9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogYE1heCAke01BWF9TUEFXTlNfUEVSX1dJTkRPV30gc3Bhd25zIHBlciAke1NQQVdOX1JBVEVfV0lORE9XX01TIC8gMTAwMH1zYCwKICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgICAgICByZWFzb246ICJzcGF3biByYXRlIGxpbWl0IGV4Y2VlZGVkIiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcmVjb3JkU3Bhd24oKTsKICAgICAgICAvLyBEZWxlZ2F0ZSB0byBydW50aW1lIHBvb2wgd2hlbiBhdmFpbGFibGUKICAgICAgICBpZiAoYWdlbnRQb29sICYmICFhZ2VudFBvb2wuaXNTaHV0dGluZ0Rvd24pIHsKICAgICAgICAgICAgbG9nLmRlYnVnKGBVc2luZyBwb29sIHNwYXduIGZvcjogJHt0YXNrLmxhYmVsfWAsIHsgdGFza0lkOiB0YXNrLmlkIH0pOwogICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgiYWdlbnQuc3Bhd25fbW9kZSIsICJwb29sIik7CiAgICAgICAgICAgIHJldHVybiBzcGF3blZpYVBvb2wodGFzayk7CiAgICAgICAgfQogICAgICAgIC8vIEZhbGxiYWNrOiBkaXJlY3QgcHJvY2VzcyBzcGF3bmluZyAob3JpZ2luYWwgYmVoYXZpb3IpCiAgICAgICAgbG9nLmRlYnVnKGBVc2luZyBkaXJlY3Qgc3Bhd24gZm9yOiAke3Rhc2subGFiZWx9YCwgeyB0YXNrSWQ6IHRhc2suaWQgfSk7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoImFnZW50LnNwYXduX21vZGUiLCAiZGlyZWN0Iik7CiAgICAgICAgcmV0dXJuIHNwYXduRGlyZWN0KHRhc2spOwogICAgfSk7Cn0KLyoqCiAqIFNwYXduIHRocm91Z2ggdGhlIEFnZW50UG9vbCBydW50aW1lLgogKiBUaGUgcG9vbCBoYW5kbGVzIHJlc291cmNlIGFsbG9jYXRpb24sIGNpcmN1aXQgYnJlYWtlcnMsIGlzb2xhdGlvbiwgYW5kIG1vbml0b3JpbmcuCiAqLwphc3luYyBmdW5jdGlvbiBzcGF3blZpYVBvb2wodGFzaykgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGFnZW50UG9vbC5zcGF3bih7CiAgICAgICAgICAgIHRhc2tJZDogdGFzay5pZCwKICAgICAgICAgICAgbGFiZWw6IHRhc2subGFiZWwsCiAgICAgICAgICAgIHByb21wdDogdGFzay5wcm9tcHQsCiAgICAgICAgICAgIGN3ZDogdGFzay5jd2QsCiAgICAgICAgICAgIG9yaWdpbjogdGFzay5vcmlnaW4sCiAgICAgICAgICAgIHRhZ3M6IHRhc2suc2Vzc2lvbklkID8gW2BzZXNzaW9uOiR7dGFzay5zZXNzaW9uSWR9YF0gOiBbXSwKICAgICAgICAgICAgY29uZmlnOiB7CiAgICAgICAgICAgICAgICB0aW1lb3V0TXM6IHRhc2sudGltZW91dE1zID8/IDYwMDAwMCwKICAgICAgICAgICAgICAgIG1heFJldHJpZXM6IDIsCiAgICAgICAgICAgICAgICBiYWNrb2ZmTXM6IDIwMDAsCiAgICAgICAgICAgICAgICBiYWNrb2ZmTXVsdGlwbGllcjogMiwKICAgICAgICAgICAgICAgIG1heEJhY2tvZmZNczogMzAwMDAsCiAgICAgICAgICAgICAgICBlbnY6IHt9LAogICAgICAgICAgICAgICAgaXNvbGF0aW9uOiAic2hhcmVkIiwKICAgICAgICAgICAgICAgIHByaW9yaXR5OiA1MCwKICAgICAgICAgICAgfSwKICAgICAgICB9KTsKICAgICAgICAvLyBTeW5jIHRhc2sgc3RhdGUgZnJvbSBydW50aW1lIGluc3RhbmNlCiAgICAgICAgdGFzay5zdGF0dXMgPSAicnVubmluZyI7CiAgICAgICAgdGFzay5waWQgPSBpbnN0YW5jZS5waWQ7CiAgICAgICAgdGFzay5zdGFydGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgYXdhaXQgd3JpdGVUYXNrKHRhc2spOwogICAgICAgIC8vIE1vdmUgYm9hcmQgdGFzayB0byBpbl9wcm9ncmVzcyBhbmQgd3JpdGUgYmFjayB0aGUgYWdlbnQgdGFzayBJRCBmb3IgY2F1c2FsIGJhY2tyZWZzCiAgICAgICAgaWYgKHRhc2suYm9hcmRUYXNrSWQpIHsKICAgICAgICAgICAgdXBkYXRlQm9hcmRUYXNrU3RhdGUodGFzay5ib2FyZFRhc2tJZCwgeyBzdGF0ZTogImluX3Byb2dyZXNzIiwgYXNzaWduZWU6IGAke2dldEluc3RhbmNlTmFtZUxvd2VyKCl9LWFnZW50YCwgYWdlbnRUYXNrSWQ6IHRhc2suaWQgfSk7CiAgICAgICAgfQogICAgICAgIC8vIFRyYWNrIGJhdGNoIG1lbWJlcnNoaXAgKHN0aWxsIG5lZWRlZCBmb3IgY29udGludWF0aW9uKQogICAgICAgIGlmICh0YXNrLnNlc3Npb25JZCkgewogICAgICAgICAgICBpZiAoIXNlc3Npb25CYXRjaGVzLmhhcyh0YXNrLnNlc3Npb25JZCkpIHsKICAgICAgICAgICAgICAgIHNlc3Npb25CYXRjaGVzLnNldCh0YXNrLnNlc3Npb25JZCwgbmV3IFNldCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXNzaW9uQmF0Y2hlcy5nZXQodGFzay5zZXNzaW9uSWQpLmFkZCh0YXNrLmlkKTsKICAgICAgICB9CiAgICAgICAgLy8gTGlzdGVuIGZvciBjb21wbGV0aW9uIHZpYSB0aGUgcnVudGltZSBidXMKICAgICAgICAvLyBVc2UgLm9uKCkgd2l0aCBzZWxmLXJlbW92YWwgaW5zdGVhZCBvZiAub25jZSgpIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucwogICAgICAgIC8vIHdoZXJlIGFub3RoZXIgYWdlbnQncyBldmVudCBjb25zdW1lcyB0aGlzIGxpc3RlbmVyCiAgICAgICAgY29uc3Qgb25Db21wbGV0ZWQgPSAoZGF0YSkgPT4gewogICAgICAgICAgICBpZiAoZGF0YS5hZ2VudElkID09PSBpbnN0YW5jZS5pZCkgewogICAgICAgICAgICAgICAgYWdlbnRQb29sPy5ydW50aW1lTWFuYWdlci5idXMub2ZmKCJhZ2VudDpjb21wbGV0ZWQiLCBvbkNvbXBsZXRlZCk7CiAgICAgICAgICAgICAgICBhZ2VudFBvb2w/LnJ1bnRpbWVNYW5hZ2VyLmJ1cy5vZmYoImFnZW50OmZhaWxlZCIsIG9uRmFpbGVkKTsKICAgICAgICAgICAgICAgIGhhbmRsZVBvb2xDb21wbGV0aW9uKHRhc2ssICJjb21wbGV0ZWQiLCBkYXRhLmV4aXRDb2RlID8/IDApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBvbkZhaWxlZCA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgIGlmIChkYXRhLmFnZW50SWQgPT09IGluc3RhbmNlLmlkKSB7CiAgICAgICAgICAgICAgICBhZ2VudFBvb2w/LnJ1bnRpbWVNYW5hZ2VyLmJ1cy5vZmYoImFnZW50OmNvbXBsZXRlZCIsIG9uQ29tcGxldGVkKTsKICAgICAgICAgICAgICAgIGFnZW50UG9vbD8ucnVudGltZU1hbmFnZXIuYnVzLm9mZigiYWdlbnQ6ZmFpbGVkIiwgb25GYWlsZWQpOwogICAgICAgICAgICAgICAgaGFuZGxlUG9vbENvbXBsZXRpb24odGFzaywgImZhaWxlZCIsIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhZ2VudFBvb2wucnVudGltZU1hbmFnZXIuYnVzLm9uKCJhZ2VudDpjb21wbGV0ZWQiLCBvbkNvbXBsZXRlZCk7CiAgICAgICAgYWdlbnRQb29sLnJ1bnRpbWVNYW5hZ2VyLmJ1cy5vbigiYWdlbnQ6ZmFpbGVkIiwgb25GYWlsZWQpOwogICAgICAgIHJlY29yZEFnZW50U3Bhd24oKTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogYFNwYXduZWQgYWdlbnQgdmlhIHBvb2w6ICR7dGFzay5sYWJlbH1gLAogICAgICAgICAgICBkZXRhaWw6IGBJbnN0YW5jZSAke2luc3RhbmNlLmlkfSwgUElEICR7aW5zdGFuY2UucGlkfSwgdGFzayAke3Rhc2suaWR9YCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6IHRhc2sub3JpZ2luID09PSAiYWkiID8gIkFVVE9OT01PVVMiIDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJwbGFubmVyIHNlbGVjdGVkIGZyb20gYmFja2xvZyIgOiAidXNlciBjaGF0IHRyaWdnZXJlZCBhZ2VudCIsCiAgICAgICAgfSk7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgLy8gUG9vbCByZWplY3RlZCB0aGUgc3Bhd24gKGNpcmN1aXQgYnJlYWtlciwgcmVzb3VyY2VzLCBldGMuKQogICAgICAgIC8vIEZhbGwgYmFjayB0byBkaXJlY3Qgc3Bhd25pbmcsIGJ1dCBtYXJrIHRhc2sgdG8gc2tpcCByZWNvdmVyeQogICAgICAgIC8vIChwb29sIGFscmVhZHkgaGFuZGxlcyByZXRyaWVzIOKAlCBkb24ndCBkb3VibGUgdXAgd2l0aCByZWNvdmVyeSBhZ2VudHMpCiAgICAgICAgcG9vbEZhbGxiYWNrVGFza3MuYWRkKHRhc2suaWQpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgUG9vbCBzcGF3biBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBkaXJlY3QgKG5vIHJlY292ZXJ5KTogJHt0YXNrLmxhYmVsfWAsCiAgICAgICAgICAgIGRldGFpbDogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogdGFzay5vcmlnaW4gPT09ICJhaSIgPyAiQVVUT05PTU9VUyIgOiAiUFJPTVBURUQiLAogICAgICAgICAgICByZWFzb246ICJwb29sIHNwYXduIGZhaWxlZCwgZmFsbGluZyBiYWNrIiwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc3Bhd25EaXJlY3QodGFzayk7CiAgICB9Cn0KLyoqIEhhbmRsZSBjb21wbGV0aW9uIGNhbGxiYWNrcyB3aGVuIHNwYXduZWQgdmlhIHBvb2wuICovCmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVBvb2xDb21wbGV0aW9uKHRhc2ssIHN0YXR1cywgZXhpdENvZGUpIHsKICAgIGxvZy5pbmZvKGBBZ2VudCAke3N0YXR1c306ICR7dGFzay5sYWJlbH1gLCB7IHRhc2tJZDogdGFzay5pZCwgZXhpdENvZGUsIHNlc3Npb25JZDogdGFzay5zZXNzaW9uSWQgfSk7CiAgICAvLyBSZWxlYXNlIGZpbGUgbG9ja3MgaGVsZCBieSB0aGlzIGFnZW50CiAgICByZWxlYXNlTG9ja3ModGFzay5pZCkuY2F0Y2goKGVycikgPT4gewogICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gcmVsZWFzZSBsb2NrcyBmb3IgYWdlbnQgJHt0YXNrLmlkfTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7CiAgICB9KTsKICAgIC8vIFJlY29yZCBhZ2VudCBjb21wbGV0aW9uIG1ldHJpYwogICAgaWYgKHRhc2suc3RhcnRlZEF0KSB7CiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBuZXcgRGF0ZSh0YXNrLnN0YXJ0ZWRBdCkuZ2V0VGltZSgpOwogICAgICAgIHJlY29yZEFnZW50Q29tcGxldGlvbihkdXJhdGlvbk1zLCBzdGF0dXMgPT09ICJjb21wbGV0ZWQiKTsKICAgIH0KICAgIC8vIERBU0gtMTQzOiBSZWNvcmQgY29vbGRvd24gSU1NRURJQVRFTFkgb24gZmFpbHVyZSDigJQgYmVmb3JlIHNldHRpbmcKICAgIC8vIGJvYXJkIHRhc2sgYmFjayB0byAidG9kbyIuIFRoaXMgY2xvc2VzIHRoZSByYWNlIHdpbmRvdyB3aGVyZSB0aGUKICAgIC8vIGF1dG9ub21vdXMgbG9vcCByZS1wbGFucyB0aGUgc2FtZSB0YXNrIGJlZm9yZSBiYXRjaC1sZXZlbCBjb29sZG93biBmaXJlcy4KICAgIGlmIChzdGF0dXMgPT09ICJmYWlsZWQiICYmIHRhc2suYm9hcmRUYXNrSWQpIHsKICAgICAgICBUYXNrQ29vbGRvd25NYW5hZ2VyLmdldEluc3RhbmNlKCkucmVjb3JkRmFpbHVyZSh0YXNrLmJvYXJkVGFza0lkLCB0YXNrLmxhYmVsLCBgUG9vbCB0ZXJtaW5hbCBmYWlsdXJlIChleGl0ICR7ZXhpdENvZGV9KWApOwogICAgfQogICAgLy8gVXBkYXRlIGJvYXJkIHRhc2sgc3RhdGU6IGRvbmUgb24gc3VjY2VzcywgYmFjayB0byB0b2RvIG9uIGZhaWx1cmUKICAgIGlmICh0YXNrLmJvYXJkVGFza0lkKSB7CiAgICAgICAgaWYgKHN0YXR1cyA9PT0gImNvbXBsZXRlZCIpIHsKICAgICAgICAgICAgYXdhaXQgdXBkYXRlQm9hcmRUYXNrU3RhdGUodGFzay5ib2FyZFRhc2tJZCwgeyBzdGF0ZTogImRvbmUiIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gRmFpbGVkOiBtb3ZlIGJhY2sgdG8gdG9kbyBhbmQgY2xlYXIgYXNzaWduZWUgc28gaXQgY2FuIGJlIHJldHJpZWQKICAgICAgICAgICAgYXdhaXQgdXBkYXRlQm9hcmRUYXNrU3RhdGUodGFzay5ib2FyZFRhc2tJZCwgeyBzdGF0ZTogInRvZG8iLCBhc3NpZ25lZTogbnVsbCB9KTsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZWFkVGFza091dHB1dCh0YXNrLmlkKS5jYXRjaCgoKSA9PiAiIik7CiAgICBjb25zdCByZXN1bHRTdW1tYXJ5ID0gb3V0cHV0LnRyaW0oKS5zbGljZSgwLCAxMDAwKSB8fCB1bmRlZmluZWQ7CiAgICAvLyBQcm9jZXNzIGlzc3VlIHJlcG9ydHMgZnJvbSByZWFkLW9ubHkgYXV0b25vbW91cyBhZ2VudHMKICAgIGlmICh0YXNrLnJlYWRPbmx5ICYmIHN0YXR1cyA9PT0gImNvbXBsZXRlZCIgJiYgb3V0cHV0KSB7CiAgICAgICAgcHJvY2Vzc0FnZW50SXNzdWVzKG91dHB1dCwgdGFzay5pZCkuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICBsb2cud2FybihgRmFpbGVkIHRvIHByb2Nlc3MgaXNzdWVzIGZyb20gJHt0YXNrLmlkfTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBOb3RpZmljYXRpb25zCiAgICBjb25zdCBvdXRwdXRTbmlwcGV0ID0gcmVzdWx0U3VtbWFyeSA/IGBcbk91dHB1dDpcbiR7cmVzdWx0U3VtbWFyeX1gIDogIiI7CiAgICBwdXNoTm90aWZpY2F0aW9uKHsKICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgbWVzc2FnZTogYEFnZW50IHRhc2sgIiR7dGFzay5sYWJlbH0iICR7c3RhdHVzfSAoZXhpdCAke2V4aXRDb2RlfSkuJHtvdXRwdXRTbmlwcGV0fWAsCiAgICB9KTsKICAgIC8vIFRyaWFnZTogY2hlY2sgaWYgYWdlbnQgc3VyZmFjZWQgcXVlc3Rpb25zIGZvciB0aGUgaHVtYW4KICAgIGNvbnN0IG5lZWRzSHVtYW4gPSBhd2FpdCB0cmlhZ2VBZ2VudE91dHB1dCh7IC4uLnRhc2ssIHN0YXR1cywgZXhpdENvZGU6IGV4aXRDb2RlID8/IHVuZGVmaW5lZCB9LCBvdXRwdXQpLmNhdGNoKCgpID0+IGZhbHNlKTsKICAgIC8vIE9uIGZhaWx1cmUgdmlhIHBvb2w6IHRoZSBSdW50aW1lTWFuYWdlciBhbHJlYWR5IGhhbmRsZXMgcmV0cmllcyBhdCB0aGUKICAgIC8vIGluc3RhbmNlIGxldmVsIChtYXliZVJldHJ5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZikuIERvbid0IGFsc28gc3Bhd24KICAgIC8vIGEgcmVjb3ZlcnkgYWdlbnQg4oCUIHRoYXQgY3JlYXRlcyBkb3VibGUtcmV0cnkgZmFuLW91dC4gT25seSB0cmFjayBmb3IKICAgIC8vIHBob25lIGFsZXJ0cyBhbmQgcmVjb3JkIGlmIHRoaXMgd2FzIGEgcmVjb3ZlcnkgdGFzayB0aGF0IGZhaWxlZC4KICAgIGlmIChzdGF0dXMgPT09ICJmYWlsZWQiKSB7CiAgICAgICAgaWYgKHRhc2subGFiZWwuc3RhcnRzV2l0aCgiRml4OiAiKSkgewogICAgICAgICAgICByZWNvcmRSZWNvdmVyeUZhaWx1cmUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFuZWVkc0h1bWFuKSB7CiAgICAgICAgICAgIHRyYWNrRmFpbHVyZUZvckFsZXJ0KHRhc2subGFiZWwpOwogICAgICAgIH0KICAgIH0KICAgIC8vIFBvc3QtY29tcGxldGlvbiByZWZsZWN0aW9uIGZvciBhdXRvbm9tb3VzIHRhc2tzIChza2lwIGZvciByZWNvdmVyeSBhZ2VudHMg4oCUCiAgICAvLyBzZXNzaW9uLWxldmVsIHJlZmxlY3Rpb24gYWxyZWFkeSBjb3ZlcnMgdGhlbSwgYW5kIHBlci1hZ2VudCBMTE0gY2FsbHMgYWRkIGxhdGVuY3kpCiAgICBpZiAoIXRhc2subGFiZWwuc3RhcnRzV2l0aCgiRml4OiAiKSkgewogICAgICAgIHJlZmxlY3RPbkNvbXBsZXRpb24oeyAuLi50YXNrLCBzdGF0dXMsIGV4aXRDb2RlOiBleGl0Q29kZSA/PyB1bmRlZmluZWQgfSwgb3V0cHV0KS5jYXRjaCgoKSA9PiB7IH0pOwogICAgfQogICAgLy8gU2NhciBldmFsdWF0aW9uIGZvciBzdWNjZXNzZnVsIEZpeDogYWdlbnRzIOKAlCBjaGVjayBpZiB0aGUgcmVwYWlyIHF1YWxpZmllcyBhcyBhIHNjYXIKICAgIGlmICh0YXNrLmxhYmVsLnN0YXJ0c1dpdGgoIkZpeDogIikgJiYgc3RhdHVzID09PSAiY29tcGxldGVkIikgewogICAgICAgIGV2YWx1YXRlU2Nhcih7IC4uLnRhc2ssIHN0YXR1cywgZXhpdENvZGU6IGV4aXRDb2RlID8/IHVuZGVmaW5lZCB9LCBvdXRwdXQpLmNhdGNoKCgpID0+IHsgfSk7CiAgICB9CiAgICAvLyBCYXRjaCBjb250aW51YXRpb24KICAgIGlmICh0YXNrLnNlc3Npb25JZCAmJiBzZXNzaW9uQmF0Y2hlcy5oYXModGFzay5zZXNzaW9uSWQpKSB7CiAgICAgICAgY29uc3QgYmF0Y2ggPSBzZXNzaW9uQmF0Y2hlcy5nZXQodGFzay5zZXNzaW9uSWQpOwogICAgICAgIGJhdGNoLmRlbGV0ZSh0YXNrLmlkKTsKICAgICAgICBpZiAoIWJhdGNoUmVzdWx0cy5oYXModGFzay5zZXNzaW9uSWQpKSB7CiAgICAgICAgICAgIGJhdGNoUmVzdWx0cy5zZXQodGFzay5zZXNzaW9uSWQsIFtdKTsKICAgICAgICB9CiAgICAgICAgYmF0Y2hSZXN1bHRzLmdldCh0YXNrLnNlc3Npb25JZCkucHVzaCh7IGxhYmVsOiB0YXNrLmxhYmVsLCBzdGF0dXMgfSk7CiAgICAgICAgaWYgKGJhdGNoLnNpemUgPT09IDApIHsKICAgICAgICAgICAgc2Vzc2lvbkJhdGNoZXMuZGVsZXRlKHRhc2suc2Vzc2lvbklkKTsKICAgICAgICAgICAgY29uc3QgYWxsUmVzdWx0cyA9IGJhdGNoUmVzdWx0cy5nZXQodGFzay5zZXNzaW9uSWQpID8/IFt7IGxhYmVsOiB0YXNrLmxhYmVsLCBzdGF0dXMgfV07CiAgICAgICAgICAgIGJhdGNoUmVzdWx0cy5kZWxldGUodGFzay5zZXNzaW9uSWQpOwogICAgICAgICAgICBpZiAob25CYXRjaENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzaWQgPSB0YXNrLnNlc3Npb25JZDsKICAgICAgICAgICAgICAgIC8vIDUwMG1zIHNldHRsZW1lbnQ6IHRhc2sgc3RvcmUgd3JpdGVzIGFyZSBzeW5jLCBqdXN0IG5lZWQgbWV0YWRhdGEgZmx1c2gKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYWdlbnQiLCBzdW1tYXJ5OiBgQWdlbnQgYmF0Y2ggY29tcGxldGUgZm9yIHNlc3Npb24gJHtzaWR9ICgke2FsbFJlc3VsdHMubGVuZ3RofSBhZ2VudHMpYCwgYWN0aW9uTGFiZWw6IHRhc2sub3JpZ2luID09PSAiYWkiID8gIkFVVE9OT01PVVMiIDogIlBST01QVEVEIiwgcmVhc29uOiAiYWdlbnQgYmF0Y2ggY29tcGxldGVkIiB9KTsKICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUob25CYXRjaENvbXBsZXRlKHNpZCwgYWxsUmVzdWx0cykpLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhZ2VudCIsIHN1bW1hcnk6IGBBdXRvLWNvbnRpbnVlIGNhbGxiYWNrIGVycm9yOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICJiYXRjaCBjb250aW51YXRpb24gZXJyb3IiIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKiogU2VuZCBhZ2VudCBmYWlsdXJlIGFsZXJ0IGVtYWlsIHZpYSBSZXNlbmQgKGZpcmUtYW5kLWZvcmdldCkuICovCmFzeW5jIGZ1bmN0aW9uIHNlbmRGYWlsdXJlRW1haWwoY291bnQsIG5hbWVzKSB7CiAgICBjb25zdCBhcGlLZXkgPSBwcm9jZXNzLmVudi5SRVNFTkRfQVBJX0tFWTsKICAgIGlmICghYXBpS2V5KSB7CiAgICAgICAgbG9nLndhcm4oIk5vIFJFU0VORF9BUElfS0VZIOKAlCBza2lwcGluZyBhZ2VudCBmYWlsdXJlIGVtYWlsIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgiaHR0cHM6Ly9hcGkucmVzZW5kLmNvbS9lbWFpbHMiLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthcGlLZXl9YCB9LAogICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICBmcm9tOiBgJHtnZXRJbnN0YW5jZU5hbWUoKX0gPCR7Z2V0QWxlcnRFbWFpbEZyb20oKX0+YCwKICAgICAgICAgICAgICAgIHRvOiBbcmVzb2x2ZUVudigiQUxFUlRfRU1BSUxfVE8iKSA/PyAiIl0uZmlsdGVyKEJvb2xlYW4pLAogICAgICAgICAgICAgICAgc3ViamVjdDogYFtBR0VOVCBBTEVSVF0gJHtjb3VudH0gYWdlbnQgZmFpbHVyZXMgaW4gdGhlIGxhc3QgZmV3IG1pbnV0ZXNgLAogICAgICAgICAgICAgICAgaHRtbDogYDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bWF4LXdpZHRoOjYwMHB4OyI+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmNTllMGI7Y29sb3I6d2hpdGU7cGFkZGluZzoxNnB4O2JvcmRlci1yYWRpdXM6OHB4IDhweCAwIDA7Ij4KICAgICAgICAgICAgPGgyIHN0eWxlPSJtYXJnaW46MDsiPkFnZW50IEZhaWx1cmVzPC9oMj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjZTVlN2ViO2JvcmRlci10b3A6bm9uZTtwYWRkaW5nOjE2cHg7Ym9yZGVyLXJhZGl1czowIDAgOHB4IDhweDsiPgogICAgICAgICAgICA8cD48c3Ryb25nPiR7Y291bnR9IGFnZW50czwvc3Ryb25nPiBmYWlsZWQgd2l0aGluIGEgNS1taW51dGUgd2luZG93LjwvcD4KICAgICAgICAgICAgPHA+PHN0cm9uZz5BZ2VudHM6PC9zdHJvbmc+ICR7bmFtZXN9PC9wPgogICAgICAgICAgICA8cCBzdHlsZT0iY29sb3I6IzZiNzI4MDtmb250LXNpemU6MTJweDsiPkNoZWNrIHRoZSBhZ2VudCBsb2dzIGF0IC9vcHMgZm9yIGRldGFpbHMuIEEgcGhvbmUgY2FsbCB3aWxsIGZvbGxvdyBvbmx5IGlmIGZhaWx1cmVzIGNvbnRpbnVlIHRvIGVzY2FsYXRlLjwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PmAsCiAgICAgICAgICAgIH0pLAogICAgICAgIH0pOwogICAgICAgIGlmIChyZXMub2spIHsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhZ2VudCIsIHN1bW1hcnk6IGBFbWFpbGVkIHlvdSBhYm91dCAke2NvdW50fSBhZ2VudCBmYWlsdXJlc2AgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsb2cuZXJyb3IoIkFnZW50IGZhaWx1cmUgZW1haWwgZmFpbGVkIiwgeyBzdGF0dXM6IHJlcy5zdGF0dXMgfSk7CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy5lcnJvcigiQWdlbnQgZmFpbHVyZSBlbWFpbCBleGNlcHRpb24iLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTsKICAgIH0KfQovKiogVHJhY2sgZmFpbHVyZSDigJQgZW1haWwgZmlyc3QsIHBob25lIG9ubHkgYXMgbGFzdCByZXNvcnQuICovCmZ1bmN0aW9uIHRyYWNrRmFpbHVyZUZvckFsZXJ0KGxhYmVsKSB7CiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgcmVjZW50RmFpbHVyZXMucHVzaCh7IGxhYmVsLCB0aW1lOiBub3cgfSk7CiAgICB3aGlsZSAocmVjZW50RmFpbHVyZXMubGVuZ3RoID4gMCAmJiByZWNlbnRGYWlsdXJlc1swXS50aW1lIDwgbm93IC0gRkFJTFVSRV9XSU5ET1dfTVMpIHsKICAgICAgICByZWNlbnRGYWlsdXJlcy5zaGlmdCgpOwogICAgfQogICAgY29uc3QgY291bnQgPSByZWNlbnRGYWlsdXJlcy5sZW5ndGg7CiAgICBjb25zdCBuYW1lcyA9IHJlY2VudEZhaWx1cmVzLm1hcCgoZikgPT4gZi5sYWJlbCkuam9pbigiLCAiKTsKICAgIC8vIFRpZXIgMTogRW1haWwgYXQgMisgZmFpbHVyZXMKICAgIGlmIChjb3VudCA+PSBFTUFJTF9USFJFU0hPTEQgJiYgbm93IC0gbGFzdEVtYWlsVGltZSA+IEVNQUlMX0NPT0xET1dOX01TKSB7CiAgICAgICAgbGFzdEVtYWlsVGltZSA9IG5vdzsKICAgICAgICBzZW5kRmFpbHVyZUVtYWlsKGNvdW50LCBuYW1lcykuY2F0Y2goKCkgPT4geyB9KTsKICAgIH0KICAgIC8vIFRpZXIgMjogUGhvbmUgY2FsbCBhdCA1KyBmYWlsdXJlcyAobGFzdCByZXNvcnQsIGFmdGVyIGVtYWlsKQogICAgaWYgKGNvdW50ID49IENBTExfVEhSRVNIT0xEICYmIG5vdyAtIGxhc3RDYWxsVGltZSA+IENBTExfQ09PTERPV05fTVMpIHsKICAgICAgICBsYXN0Q2FsbFRpbWUgPSBub3c7CiAgICAgICAgbWFrZUNhbGwoewogICAgICAgICAgICBtZXNzYWdlOiBgSGV5LCBpdCdzICR7Z2V0SW5zdGFuY2VOYW1lKCl9LiAke2NvdW50fSBhZ2VudHMgaGF2ZSBmYWlsZWQgaW4gdGhlIGxhc3QgZmV3IG1pbnV0ZXMuIEkgYWxyZWFkeSBzZW50IHlvdSBhbiBlbWFpbCB3aXRoIGRldGFpbHMuIFRoaXMgaXMgZ2V0dGluZyBzZXJpb3VzIOKAlCBwbGVhc2UgY2hlY2sgdGhlIGxvZ3MuYCwKICAgICAgICB9KS50aGVuKChyKSA9PiB7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYWdlbnQiLCBzdW1tYXJ5OiByLm9rID8gYENhbGxlZCB5b3UgYWJvdXQgJHtjb3VudH0gYWdlbnQgZmFpbHVyZXMgKGVzY2FsYXRlZCBmcm9tIGVtYWlsKWAgOiBgRmFpbGVkIHRvIGNhbGw6ICR7ci5tZXNzYWdlfWAgfSk7CiAgICAgICAgfSkuY2F0Y2goKCkgPT4geyB9KTsKICAgIH0KfQovKiogRGlyZWN0IHByb2Nlc3Mgc3Bhd25pbmcg4oCUIG9yaWdpbmFsIGJlaGF2aW9yIHdpdGhvdXQgcnVudGltZSBwb29sLiAqLwphc3luYyBmdW5jdGlvbiBzcGF3bkRpcmVjdCh0YXNrKSB7CiAgICBjb25zdCBzdGRvdXRQYXRoID0gam9pbihMT0dTX0RJUiwgYCR7dGFzay5pZH0uc3Rkb3V0LmxvZ2ApOwogICAgY29uc3Qgc3RkZXJyUGF0aCA9IGpvaW4oTE9HU19ESVIsIGAke3Rhc2suaWR9LnN0ZGVyci5sb2dgKTsKICAgIGNvbnN0IHByb21wdFBhdGggPSBqb2luKExPR1NfRElSLCBgJHt0YXNrLmlkfS5wcm9tcHQudHh0YCk7CiAgICAvLyBXcml0ZSBwcm9tcHQgdG8gZmlsZSB0byBhdm9pZCBzaGVsbCBlc2NhcGluZyBpc3N1ZXMKICAgIHdyaXRlRmlsZVN5bmMocHJvbXB0UGF0aCwgdGFzay5wcm9tcHQsICJ1dGYtOCIpOwogICAgLy8gQ2xlYW4gZW52aXJvbm1lbnQ6IHJlbW92ZSBDTEFVREVDT0RFIHRvIGFsbG93IG5lc3RlZCBDbGF1ZGUgQ29kZSBzZXNzaW9ucy4KICAgIC8vIENsYXVkZSBDTEkgcmVmdXNlcyB0byBydW4gaW5zaWRlIGFub3RoZXIgc2Vzc2lvbiBpZiB0aGlzIGVudiB2YXIgaXMgc2V0LgogICAgY29uc3QgY2xlYW5FbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07CiAgICBkZWxldGUgY2xlYW5FbnYuQ0xBVURFQ09ERTsKICAgIC8vIFVzZSBub2RlIGFzIHRoZSB3cmFwcGVyIOKAlCBhdm9pZHMgYWxsIHNoZWxsIGVuY29kaW5nL2VzY2FwaW5nIGlzc3Vlcy4KICAgIC8vIHNwYXduU3luYyB3aXRoIHdpbmRvd3NIaWRlIHByZXZlbnRzIGNsYXVkZSBmcm9tIG9wZW5pbmcgYSBjb25zb2xlIHdpbmRvdy4KICAgIGNvbnN0IHdyYXBwZXJTY3JpcHQgPSBgCiAgICBjb25zdCBmcyA9IHJlcXVpcmUoImZzIik7CiAgICBjb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgiY2hpbGRfcHJvY2VzcyIpOwogICAgY29uc3QgcHJvbXB0ID0gZnMucmVhZEZpbGVTeW5jKCR7SlNPTi5zdHJpbmdpZnkocHJvbXB0UGF0aCl9LCAidXRmLTgiKTsKICAgIGNvbnN0IHIgPSBzcGF3blN5bmMoImNsYXVkZSIsIFsKICAgICAgIi0tcHJpbnQiLCAiLS1vdXRwdXQtZm9ybWF0IiwgInRleHQiLCAiLS1kYW5nZXJvdXNseS1za2lwLXBlcm1pc3Npb25zIiwgcHJvbXB0CiAgICBdLCB7CiAgICAgIGN3ZDogJHtKU09OLnN0cmluZ2lmeSh0YXNrLmN3ZCl9LAogICAgICBlbmNvZGluZzogInV0Zi04IiwKICAgICAgbWF4QnVmZmVyOiA1MCAqIDEwMjQgKiAxMDI0LAogICAgICB0aW1lb3V0OiAke3Rhc2sudGltZW91dE1zID8/IDYwMDAwMH0sCiAgICAgIHdpbmRvd3NIaWRlOiB0cnVlCiAgICB9KTsKICAgIGZzLndyaXRlRmlsZVN5bmMoJHtKU09OLnN0cmluZ2lmeShzdGRvdXRQYXRoKX0sIHIuc3Rkb3V0IHx8ICIiLCAidXRmLTgiKTsKICAgIGZzLndyaXRlRmlsZVN5bmMoJHtKU09OLnN0cmluZ2lmeShzdGRlcnJQYXRoKX0sIHIuc3RkZXJyIHx8ICIiLCAidXRmLTgiKTsKICAgIHByb2Nlc3MuZXhpdChyLnN0YXR1cyB8fCAwKTsKICBgOwogICAgY29uc3QgY2hpbGQgPSBzcGF3bihwcm9jZXNzLmV4ZWNQYXRoLCBbIi0tZXZhbCIsIHdyYXBwZXJTY3JpcHRdLCB7CiAgICAgICAgY3dkOiB0YXNrLmN3ZCwKICAgICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgICBzdGRpbzogImlnbm9yZSIsCiAgICAgICAgZW52OiBjbGVhbkVudiwKICAgICAgICB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgIH0pOwogICAgLy8gTGV0IHRoZSBpbnN0YW5jZSBleGl0IHdpdGhvdXQga2lsbGluZyB0aGUgY2hpbGQKICAgIGNoaWxkLnVucmVmKCk7CiAgICB0YXNrLnN0YXR1cyA9ICJydW5uaW5nIjsKICAgIHRhc2sucGlkID0gY2hpbGQucGlkOwogICAgdGFzay5zdGFydGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICBhd2FpdCB3cml0ZVRhc2sodGFzayk7CiAgICBhY3RpdmVQcm9jZXNzZXMuc2V0KHRhc2suaWQsIGNoaWxkKTsKICAgIC8vIE1vdmUgYm9hcmQgdGFzayB0byBpbl9wcm9ncmVzcyBhbmQgd3JpdGUgYmFjayB0aGUgYWdlbnQgdGFzayBJRCBmb3IgY2F1c2FsIGJhY2tyZWZzCiAgICBpZiAodGFzay5ib2FyZFRhc2tJZCkgewogICAgICAgIHVwZGF0ZUJvYXJkVGFza1N0YXRlKHRhc2suYm9hcmRUYXNrSWQsIHsgc3RhdGU6ICJpbl9wcm9ncmVzcyIsIGFzc2lnbmVlOiBgJHtnZXRJbnN0YW5jZU5hbWVMb3dlcigpfS1hZ2VudGAsIGFnZW50VGFza0lkOiB0YXNrLmlkIH0pOwogICAgfQogICAgLy8gVHJhY2sgYmF0Y2g6IGdyb3VwIHRhc2tzIGJ5IHNlc3Npb25JZCBzbyB3ZSBrbm93IHdoZW4gYSBiYXRjaCBmaW5pc2hlcwogICAgaWYgKHRhc2suc2Vzc2lvbklkKSB7CiAgICAgICAgaWYgKCFzZXNzaW9uQmF0Y2hlcy5oYXModGFzay5zZXNzaW9uSWQpKSB7CiAgICAgICAgICAgIHNlc3Npb25CYXRjaGVzLnNldCh0YXNrLnNlc3Npb25JZCwgbmV3IFNldCgpKTsKICAgICAgICB9CiAgICAgICAgc2Vzc2lvbkJhdGNoZXMuZ2V0KHRhc2suc2Vzc2lvbklkKS5hZGQodGFzay5pZCk7CiAgICB9CiAgICByZWNvcmRBZ2VudFNwYXduKCk7CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgIHN1bW1hcnk6IGBTcGF3bmVkIGFnZW50OiAke3Rhc2subGFiZWx9YCwKICAgICAgICBkZXRhaWw6IGBQSUQgJHtjaGlsZC5waWR9LCB0YXNrICR7dGFzay5pZH1gLAogICAgICAgIGFjdGlvbkxhYmVsOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgcmVhc29uOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJwbGFubmVyIHNlbGVjdGVkIGZyb20gYmFja2xvZyIgOiAidXNlciBjaGF0IHRyaWdnZXJlZCBhZ2VudCIsCiAgICB9KTsKICAgIC8vIEV4aXQgaGFuZGxlcgogICAgY2hpbGQub24oImV4aXQiLCBhc3luYyAoY29kZSkgPT4gewogICAgICAgIGxvZy5pbmZvKGBBZ2VudCBwcm9jZXNzIGV4aXRlZDogJHt0YXNrLmxhYmVsfWAsIHsgdGFza0lkOiB0YXNrLmlkLCBleGl0Q29kZTogY29kZSwgcGlkOiBjaGlsZC5waWQgfSk7CiAgICAgICAgYWN0aXZlUHJvY2Vzc2VzLmRlbGV0ZSh0YXNrLmlkKTsKICAgICAgICBjbGVhclRhc2tUaW1lcih0YXNrLmlkKTsKICAgICAgICAvLyBSZWxlYXNlIGZpbGUgbG9ja3MgaGVsZCBieSB0aGlzIGFnZW50CiAgICAgICAgcmVsZWFzZUxvY2tzKHRhc2suaWQpLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byByZWxlYXNlIGxvY2tzIGZvciBhZ2VudCAke3Rhc2suaWR9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTsKICAgICAgICB9KTsKICAgICAgICAvLyBCcmllZiBkZWxheSB0byBlbnN1cmUgZmlsZSBidWZmZXJzIGFyZSBmbHVzaGVkLgogICAgICAgIC8vIHdyaXRlRmlsZVN5bmMgaW4gdGhlIHdyYXBwZXIgc2NyaXB0IGd1YXJhbnRlZXMgZGF0YSBpcyBvbiBkaXNrLAogICAgICAgIC8vIGJ1dCB0aGUgT1MgbWF5IHN0aWxsIGJlIHVwZGF0aW5nIGZpbGUgbWV0YWRhdGEuIDEwMG1zIGlzIHN1ZmZpY2llbnQuCiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTAwKSk7CiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVhZFRhc2tPdXRwdXQodGFzay5pZCk7CiAgICAgICAgY29uc3QgcmVzdWx0U3VtbWFyeSA9IG91dHB1dC50cmltKCkuc2xpY2UoMCwgMTAwMCkgfHwgdW5kZWZpbmVkOwogICAgICAgIC8vIERldGVybWluZSBzdWNjZXNzOiBleGl0IDAgaXMgY2xlYW4gc3VjY2VzcywgYnV0IGEgbnVsbC9ub24temVybyBleGl0IGNvZGUKICAgICAgICAvLyB3aXRoIHN1YnN0YW50aWFsIG91dHB1dCBsaWtlbHkgbWVhbnMgdGhlIGFnZW50IGRpZCBpdHMgd29yayBidXQgdGhlIHByb2Nlc3MKICAgICAgICAvLyBleGl0ZWQgdW5jbGVhbmx5IChzaWduYWwsIHRpbWVvdXQsIGNsYXVkZSBDTEkgcXVpcmspLiBUcnVzdCB0aGUgb3V0cHV0LgogICAgICAgIGNvbnN0IGhhc1N1YnN0YW50aWFsT3V0cHV0ID0gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAxMDA7CiAgICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBjb2RlID09PSAwIHx8IChjb2RlID09IG51bGwgJiYgaGFzU3Vic3RhbnRpYWxPdXRwdXQpCiAgICAgICAgICAgID8gImNvbXBsZXRlZCIKICAgICAgICAgICAgOiAiZmFpbGVkIjsKICAgICAgICAvLyBSZWNvcmQgYWdlbnQgY29tcGxldGlvbiBtZXRyaWMKICAgICAgICBpZiAodGFzay5zdGFydGVkQXQpIHsKICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBuZXcgRGF0ZSh0YXNrLnN0YXJ0ZWRBdCkuZ2V0VGltZSgpOwogICAgICAgICAgICByZWNvcmRBZ2VudENvbXBsZXRpb24oZHVyYXRpb25NcywgZmluYWxTdGF0dXMgPT09ICJjb21wbGV0ZWQiKTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdXBkYXRlVGFzayh0YXNrLmlkLCB7CiAgICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsCiAgICAgICAgICAgIGV4aXRDb2RlOiBjb2RlID8/IHVuZGVmaW5lZCwKICAgICAgICAgICAgZmluaXNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICByZXN1bHRTdW1tYXJ5LAogICAgICAgIH0pOwogICAgICAgIC8vIERBU0gtMTQzOiBSZWNvcmQgY29vbGRvd24gSU1NRURJQVRFTFkgb24gZmFpbHVyZSDigJQgYmVmb3JlIHNldHRpbmcKICAgICAgICAvLyBib2FyZCB0YXNrIGJhY2sgdG8gInRvZG8iLiBQcmV2ZW50cyBhdXRvbm9tb3VzIHJlLXBsYW5uaW5nIHJhY2UuCiAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09PSAiZmFpbGVkIiAmJiB0YXNrLmJvYXJkVGFza0lkKSB7CiAgICAgICAgICAgIFRhc2tDb29sZG93bk1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWNvcmRGYWlsdXJlKHRhc2suYm9hcmRUYXNrSWQsIHRhc2subGFiZWwsIGBEaXJlY3Qgc3Bhd24gZmFpbHVyZSAoZXhpdCAke2NvZGV9KWApOwogICAgICAgIH0KICAgICAgICAvLyBVcGRhdGUgYm9hcmQgdGFzayBzdGF0ZTogZG9uZSBvbiBzdWNjZXNzLCBiYWNrIHRvIHRvZG8gb24gZmFpbHVyZQogICAgICAgIGlmICh0YXNrLmJvYXJkVGFza0lkKSB7CiAgICAgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PT0gImNvbXBsZXRlZCIpIHsKICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZUJvYXJkVGFza1N0YXRlKHRhc2suYm9hcmRUYXNrSWQsIHsgc3RhdGU6ICJkb25lIiB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZUJvYXJkVGFza1N0YXRlKHRhc2suYm9hcmRUYXNrSWQsIHsgc3RhdGU6ICJ0b2RvIiwgYXNzaWduZWU6IG51bGwgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRHVyYWJsZSBtZW1vcnkg4oCUIHN1cnZpdmVzIHJlc3RhcnRzLCByZXRyaWV2YWJsZSBieSBmdXR1cmUgdHVybnMKICAgICAgICByZW1lbWJlclRhc2tPdXRjb21lKHsgLi4udGFzaywgc3RhdHVzOiBmaW5hbFN0YXR1cywgZXhpdENvZGU6IGNvZGUgPz8gdW5kZWZpbmVkIH0sIG91dHB1dCkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICAvLyBQb3N0LWNvbXBsZXRpb24gcmVmbGVjdGlvbiBmb3IgYXV0b25vbW91cyB0YXNrcyAoc2tpcCBmb3IgcmVjb3ZlcnkgYWdlbnRzIOKAlAogICAgICAgIC8vIHNlc3Npb24tbGV2ZWwgcmVmbGVjdGlvbiBhbHJlYWR5IGNvdmVycyB0aGVtLCBhbmQgcGVyLWFnZW50IExMTSBjYWxscyBhZGQgbGF0ZW5jeSkKICAgICAgICBpZiAoIXRhc2subGFiZWwuc3RhcnRzV2l0aCgiRml4OiAiKSkgewogICAgICAgICAgICByZWZsZWN0T25Db21wbGV0aW9uKHsgLi4udGFzaywgc3RhdHVzOiBmaW5hbFN0YXR1cywgZXhpdENvZGU6IGNvZGUgPz8gdW5kZWZpbmVkIH0sIG91dHB1dCkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICB9CiAgICAgICAgLy8gU2NhciBldmFsdWF0aW9uIGZvciBzdWNjZXNzZnVsIEZpeDogYWdlbnRzIOKAlCBjaGVjayBpZiB0aGUgcmVwYWlyIHF1YWxpZmllcyBhcyBhIHNjYXIKICAgICAgICBpZiAodGFzay5sYWJlbC5zdGFydHNXaXRoKCJGaXg6ICIpICYmIGZpbmFsU3RhdHVzID09PSAiY29tcGxldGVkIikgewogICAgICAgICAgICBldmFsdWF0ZVNjYXIoeyAuLi50YXNrLCBzdGF0dXM6IGZpbmFsU3RhdHVzLCBleGl0Q29kZTogY29kZSA/PyB1bmRlZmluZWQgfSwgb3V0cHV0KS5jYXRjaCgoKSA9PiB7IH0pOwogICAgICAgIH0KICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50ICR7ZmluYWxTdGF0dXN9OiAke3Rhc2subGFiZWx9YCwKICAgICAgICAgICAgZGV0YWlsOiBgRXhpdCBjb2RlICR7Y29kZX0sIHRhc2sgJHt0YXNrLmlkfWAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgIHJlYXNvbjogYGFnZW50ICR7ZmluYWxTdGF0dXN9YCwKICAgICAgICB9KTsKICAgICAgICBjb25zdCBvdXRwdXRTbmlwcGV0ID0gcmVzdWx0U3VtbWFyeQogICAgICAgICAgICA/IGBcbk91dHB1dDpcbiR7cmVzdWx0U3VtbWFyeX1gCiAgICAgICAgICAgIDogIiI7CiAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCB0YXNrICIke3Rhc2subGFiZWx9IiAke2ZpbmFsU3RhdHVzfSAoZXhpdCAke2NvZGV9KS4ke291dHB1dFNuaXBwZXR9YCwKICAgICAgICB9KTsKICAgICAgICAvLyBUcmlhZ2U6IGNoZWNrIGlmIGFnZW50IHN1cmZhY2VkIHF1ZXN0aW9ucyBmb3IgdGhlIGh1bWFuCiAgICAgICAgY29uc3QgbmVlZHNIdW1hbiA9IGF3YWl0IHRyaWFnZUFnZW50T3V0cHV0KHsgLi4udGFzaywgc3RhdHVzOiBmaW5hbFN0YXR1cywgZXhpdENvZGU6IGNvZGUgPz8gdW5kZWZpbmVkIH0sIG91dHB1dCkuY2F0Y2goKCkgPT4gZmFsc2UpOwogICAgICAgIC8vIE9uIGZhaWx1cmU6IGF0dGVtcHQgcmVjb3ZlcnkgT05MWSBpZiBub3QgYmxvY2tlZCBvbiBodW1hbiBxdWVzdGlvbnMKICAgICAgICAvLyBhbmQgbm90IGEgcG9vbC1mYWxsYmFjayB0YXNrIChwb29sIGFscmVhZHkgaGFuZGxlcyByZXRyaWVzKQogICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PT0gImZhaWxlZCIgJiYgIW5lZWRzSHVtYW4pIHsKICAgICAgICAgICAgLy8gUmVjb3JkIGlmIHRoaXMgd2FzIGl0c2VsZiBhIHJlY292ZXJ5IGFnZW50IHRoYXQgZmFpbGVkCiAgICAgICAgICAgIGlmICh0YXNrLmxhYmVsLnN0YXJ0c1dpdGgoIkZpeDogIikpIHsKICAgICAgICAgICAgICAgIHJlY29yZFJlY292ZXJ5RmFpbHVyZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlzUG9vbEZhbGxiYWNrID0gcG9vbEZhbGxiYWNrVGFza3MuaGFzKHRhc2suaWQpOwogICAgICAgICAgICBpZiAoaXNQb29sRmFsbGJhY2spIHsKICAgICAgICAgICAgICAgIHBvb2xGYWxsYmFja1Rhc2tzLmRlbGV0ZSh0YXNrLmlkKTsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYFNraXBwaW5nIHJlY292ZXJ5IGZvciBwb29sLWZhbGxiYWNrIHRhc2s6ICR7dGFzay5sYWJlbH1gLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAicG9vbC1mYWxsYmFjayB0YXNrIOKAlCBubyBkb3VibGUgcmV0cnkiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhdHRlbXB0UmVjb3ZlcnkoeyAuLi50YXNrLCBzdGF0dXM6ICJmYWlsZWQiLCBleGl0Q29kZTogY29kZSA/PyB1bmRlZmluZWQgfSwgb3V0cHV0KS5jYXRjaCgoKSA9PiB7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyYWNrRmFpbHVyZUZvckFsZXJ0KHRhc2subGFiZWwpOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHdhcyB0aGUgbGFzdCBhZ2VudCBpbiBhIGJhdGNoIOKGkiB0cmlnZ2VyIGNvbnRpbnVhdGlvbgogICAgICAgIGlmICh0YXNrLnNlc3Npb25JZCAmJiBzZXNzaW9uQmF0Y2hlcy5oYXModGFzay5zZXNzaW9uSWQpKSB7CiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gc2Vzc2lvbkJhdGNoZXMuZ2V0KHRhc2suc2Vzc2lvbklkKTsKICAgICAgICAgICAgYmF0Y2guZGVsZXRlKHRhc2suaWQpOwogICAgICAgICAgICAvLyBDb2xsZWN0IHRoaXMgYWdlbnQncyByZXN1bHQKICAgICAgICAgICAgaWYgKCFiYXRjaFJlc3VsdHMuaGFzKHRhc2suc2Vzc2lvbklkKSkgewogICAgICAgICAgICAgICAgYmF0Y2hSZXN1bHRzLnNldCh0YXNrLnNlc3Npb25JZCwgW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJhdGNoUmVzdWx0cy5nZXQodGFzay5zZXNzaW9uSWQpLnB1c2goeyBsYWJlbDogdGFzay5sYWJlbCwgc3RhdHVzOiBmaW5hbFN0YXR1cyB9KTsKICAgICAgICAgICAgaWYgKGJhdGNoLnNpemUgPT09IDApIHsKICAgICAgICAgICAgICAgIHNlc3Npb25CYXRjaGVzLmRlbGV0ZSh0YXNrLnNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXN1bHRzID0gYmF0Y2hSZXN1bHRzLmdldCh0YXNrLnNlc3Npb25JZCkgPz8gW3sgbGFiZWw6IHRhc2subGFiZWwsIHN0YXR1czogZmluYWxTdGF0dXMgfV07CiAgICAgICAgICAgICAgICBiYXRjaFJlc3VsdHMuZGVsZXRlKHRhc2suc2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgIC8vIEFsbCBhZ2VudHMgZG9uZSDigJQgcGFzcyBhbGwgcmVzdWx0cyB0byBjb250aW51YXRpb24KICAgICAgICAgICAgICAgIGlmIChvbkJhdGNoQ29tcGxldGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWQgPSB0YXNrLnNlc3Npb25JZDsKICAgICAgICAgICAgICAgICAgICAvLyA1MDBtcyBzZXR0bGVtZW50OiB0YXNrIHN0b3JlIHdyaXRlcyBhcmUgc3luYywganVzdCBuZWVkIG1ldGFkYXRhIGZsdXNoCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYWdlbnQiLCBzdW1tYXJ5OiBgQWdlbnQgYmF0Y2ggY29tcGxldGUgZm9yIHNlc3Npb24gJHtzaWR9ICgke2FsbFJlc3VsdHMubGVuZ3RofSBhZ2VudHMpYCwgYWN0aW9uTGFiZWw6IHRhc2sub3JpZ2luID09PSAiYWkiID8gIkFVVE9OT01PVVMiIDogIlBST01QVEVEIiwgcmVhc29uOiAiYWdlbnQgYmF0Y2ggY29tcGxldGVkIiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKG9uQmF0Y2hDb21wbGV0ZShzaWQsIGFsbFJlc3VsdHMpKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImFnZW50Iiwgc3VtbWFyeTogYEF1dG8tY29udGludWUgY2FsbGJhY2sgZXJyb3I6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogImJhdGNoIGNvbnRpbnVhdGlvbiBlcnJvciIgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIC8vIEVycm9yIGhhbmRsZXIgKHNwYXduIGZhaWx1cmUpCiAgICBjaGlsZC5vbigiZXJyb3IiLCBhc3luYyAoZXJyKSA9PiB7CiAgICAgICAgYWN0aXZlUHJvY2Vzc2VzLmRlbGV0ZSh0YXNrLmlkKTsKICAgICAgICBjbGVhclRhc2tUaW1lcih0YXNrLmlkKTsKICAgICAgICBwb29sRmFsbGJhY2tUYXNrcy5kZWxldGUodGFzay5pZCk7CiAgICAgICAgLy8gUmVjb3JkIGFnZW50IGZhaWx1cmUgbWV0cmljIOKAlCBiYWxhbmNlcyB0aGUgaW4tZmxpZ2h0IGdhdWdlIGZyb20gcmVjb3JkQWdlbnRTcGF3bigpCiAgICAgICAgaWYgKHRhc2suc3RhcnRlZEF0KSB7CiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUodGFzay5zdGFydGVkQXQpLmdldFRpbWUoKTsKICAgICAgICAgICAgcmVjb3JkQWdlbnRDb21wbGV0aW9uKGR1cmF0aW9uTXMsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFNwYXduZWQgYnV0IG5ldmVyIGdvdCBzdGFydGVkQXQg4oCUIHN0aWxsIG5lZWQgdG8gZGVjcmVtZW50IGluLWZsaWdodAogICAgICAgICAgICByZWNvcmRBZ2VudENvbXBsZXRpb24oMCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICAvLyBSZWxlYXNlIGZpbGUgbG9ja3MgaGVsZCBieSB0aGlzIGFnZW50CiAgICAgICAgcmVsZWFzZUxvY2tzKHRhc2suaWQpLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgYXdhaXQgdXBkYXRlVGFzayh0YXNrLmlkLCB7CiAgICAgICAgICAgIHN0YXR1czogImZhaWxlZCIsCiAgICAgICAgICAgIGVycm9yOiBlcnIubWVzc2FnZSwKICAgICAgICAgICAgZmluaXNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIH0pOwogICAgICAgIHJlbWVtYmVyVGFza091dGNvbWUoeyAuLi50YXNrLCBzdGF0dXM6ICJmYWlsZWQiLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50IHNwYXduIGVycm9yOiAke3Rhc2subGFiZWx9YCwKICAgICAgICAgICAgZGV0YWlsOiBlcnIubWVzc2FnZSwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6IHRhc2sub3JpZ2luID09PSAiYWkiID8gIkFVVE9OT01PVVMiIDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiAiYWdlbnQgc3Bhd24gZXJyb3IiLAogICAgICAgIH0pOwogICAgICAgIHB1c2hOb3RpZmljYXRpb24oewogICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgdGFzayAiJHt0YXNrLmxhYmVsfSIgZmFpbGVkIHRvIHNwYXduOiAke2Vyci5tZXNzYWdlfWAsCiAgICAgICAgfSk7CiAgICAgICAgLy8gQ2xlYW4gdXAgYmF0Y2ggbWVtYmVyc2hpcCBzbyBiYXRjaCBjb21wbGV0aW9uIGlzbid0IHN0dWNrCiAgICAgICAgaWYgKHRhc2suc2Vzc2lvbklkICYmIHNlc3Npb25CYXRjaGVzLmhhcyh0YXNrLnNlc3Npb25JZCkpIHsKICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBzZXNzaW9uQmF0Y2hlcy5nZXQodGFzay5zZXNzaW9uSWQpOwogICAgICAgICAgICBiYXRjaC5kZWxldGUodGFzay5pZCk7CiAgICAgICAgICAgIGlmICghYmF0Y2hSZXN1bHRzLmhhcyh0YXNrLnNlc3Npb25JZCkpIHsKICAgICAgICAgICAgICAgIGJhdGNoUmVzdWx0cy5zZXQodGFzay5zZXNzaW9uSWQsIFtdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiYXRjaFJlc3VsdHMuZ2V0KHRhc2suc2Vzc2lvbklkKS5wdXNoKHsgbGFiZWw6IHRhc2subGFiZWwsIHN0YXR1czogImZhaWxlZCIgfSk7CiAgICAgICAgICAgIGlmIChiYXRjaC5zaXplID09PSAwKSB7CiAgICAgICAgICAgICAgICBzZXNzaW9uQmF0Y2hlcy5kZWxldGUodGFzay5zZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgY29uc3QgYWxsUmVzdWx0cyA9IGJhdGNoUmVzdWx0cy5nZXQodGFzay5zZXNzaW9uSWQpID8/IFt7IGxhYmVsOiB0YXNrLmxhYmVsLCBzdGF0dXM6ICJmYWlsZWQiIH1dOwogICAgICAgICAgICAgICAgYmF0Y2hSZXN1bHRzLmRlbGV0ZSh0YXNrLnNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICBpZiAob25CYXRjaENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lkID0gdGFzay5zZXNzaW9uSWQ7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShvbkJhdGNoQ29tcGxldGUoc2lkLCBhbGxSZXN1bHRzKSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgLy8gVGltZW91dAogICAgaWYgKHRhc2sudGltZW91dE1zICYmIHRhc2sudGltZW91dE1zID4gMCkgewogICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmIChhY3RpdmVQcm9jZXNzZXMuaGFzKHRhc2suaWQpKSB7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCB0aW1lZCBvdXQ6ICR7dGFzay5sYWJlbH1gLAogICAgICAgICAgICAgICAgICAgIGRldGFpbDogYEtpbGxpbmcgUElEICR7Y2hpbGQucGlkfSBhZnRlciAke3Rhc2sudGltZW91dE1zfW1zYCwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25MYWJlbDogdGFzay5vcmlnaW4gPT09ICJhaSIgPyAiQVVUT05PTU9VUyIgOiAiUFJPTVBURUQiLAogICAgICAgICAgICAgICAgICAgIHJlYXNvbjogImFnZW50IHRpbWVvdXQgZXhjZWVkZWQiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAid2luMzIiICYmIGNoaWxkLnBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICBzcGF3bigidGFza2tpbGwiLCBbIi9waWQiLCBTdHJpbmcoY2hpbGQucGlkKSwgIi9UIiwgIi9GIl0sIHsgc2hlbGw6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5raWxsKCJTSUdURVJNIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCB0YXNrLnRpbWVvdXRNcyk7CiAgICAgICAgYWN0aXZlVGltZXJzLnNldCh0YXNrLmlkLCB0aW1lcik7CiAgICB9Cn0KLyoqIENhbmNlbCBhIHJ1bm5pbmcgYWdlbnQgdGFzay4gVHJpZXMgcG9vbCBmaXJzdCwgdGhlbiBkaXJlY3QgcHJvY2VzcyBraWxsLiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuY2VsQWdlbnQodGFza0lkKSB7CiAgICAvLyBUcnkgY2FuY2VsbGluZyB2aWEgcG9vbCAoaXQgdHJhY2tzIHJ1bnRpbWUgaW5zdGFuY2VzIGJ5IHRhc2tJZCkKICAgIGlmIChhZ2VudFBvb2wpIHsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGFnZW50UG9vbC5ydW50aW1lTWFuYWdlci5nZXRCeVRhc2tJZCh0YXNrSWQpOwogICAgICAgIGlmIChpbnN0YW5jZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgYXdhaXQgYWdlbnRQb29sLnRlcm1pbmF0ZShpbnN0YW5jZS5pZCwgIkNhbmNlbGxlZCBieSB1c2VyIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIGRpcmVjdCBjYW5jZWxsYXRpb24KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIERpcmVjdCBwcm9jZXNzIGtpbGwgKGZvciBsZWdhY3kvZGlyZWN0IHNwYXducykKICAgIGNvbnN0IGNoaWxkID0gYWN0aXZlUHJvY2Vzc2VzLmdldCh0YXNrSWQpOwogICAgaWYgKGNoaWxkKSB7CiAgICAgICAgYWN0aXZlUHJvY2Vzc2VzLmRlbGV0ZSh0YXNrSWQpOwogICAgICAgIGNsZWFyVGFza1RpbWVyKHRhc2tJZCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICJ3aW4zMiIgJiYgY2hpbGQucGlkKSB7CiAgICAgICAgICAgICAgICBzcGF3bigidGFza2tpbGwiLCBbIi9waWQiLCBTdHJpbmcoY2hpbGQucGlkKSwgIi9UIiwgIi9GIl0sIHsgc2hlbGw6IHRydWUgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjaGlsZC5raWxsKCJTSUdURVJNIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggeyB9CiAgICB9CiAgICAvLyBSZWxlYXNlIGZpbGUgbG9ja3MgaGVsZCBieSB0aGlzIGFnZW50CiAgICByZWxlYXNlTG9ja3ModGFza0lkKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byByZWxlYXNlIGxvY2tzIG9uIGNhbmNlbCBmb3IgJHt0YXNrSWR9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTsKICAgIH0pOwogICAgLy8gUmVjb3JkIGNhbmNlbGxhdGlvbiBhcyBhIGZhaWxlZCBjb21wbGV0aW9uIHRvIGtlZXAgaW4tZmxpZ2h0IGdhdWdlIGFjY3VyYXRlCiAgICBjb25zdCB0YXNrUmVjb3JkID0gYXdhaXQgcmVhZFRhc2sodGFza0lkKTsKICAgIGlmICh0YXNrUmVjb3JkPy5zdGFydGVkQXQpIHsKICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKHRhc2tSZWNvcmQuc3RhcnRlZEF0KS5nZXRUaW1lKCk7CiAgICAgICAgcmVjb3JkQWdlbnRDb21wbGV0aW9uKGR1cmF0aW9uTXMsIGZhbHNlKTsKICAgIH0KICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB1cGRhdGVUYXNrKHRhc2tJZCwgewogICAgICAgIHN0YXR1czogImNhbmNlbGxlZCIsCiAgICAgICAgZmluaXNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgfSk7CiAgICBpZiAodXBkYXRlZCkgewogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgY2FuY2VsbGVkOiAke3VwZGF0ZWQubGFiZWx9YCwKICAgICAgICAgICAgZGV0YWlsOiBgVGFzayAke3Rhc2tJZH1gLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogdXBkYXRlZC5vcmlnaW4gPT09ICJhaSIgPyAiQVVUT05PTU9VUyIgOiAiUFJPTVBURUQiLAogICAgICAgICAgICByZWFzb246ICJhZ2VudCBjYW5jZWxsZWQgYnkgdXNlciIsCiAgICAgICAgfSk7CiAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCB0YXNrICIke3VwZGF0ZWQubGFiZWx9IiB3YXMgY2FuY2VsbGVkLmAsCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdXBkYXRlZCAhPT0gbnVsbDsKfQovLyDilIDilIDilIAgUmVmbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29uc3QgcmVmbGVjdGlvbkxvZyA9IGNyZWF0ZUxvZ2dlcigicmVmbGVjdGlvbiIpOwpjb25zdCBSRUZMRUNUSU9OX1BST01QVCA9IGBZb3UgYXJlIHJlZmxlY3Rpbmcgb24gYSBjb21wbGV0ZWQgYXV0b25vbW91cyBhZ2VudCB0YXNrLiBBbnN3ZXIgY29uY2lzZWx5IGluIEpTT046CnsKICAibW92ZWRHb2FsRm9yd2FyZCI6IHRydWUvZmFsc2UsCiAgImhpdEd1YXJkcmFpbCI6IHRydWUvZmFsc2UsCiAgImFkanVzdG1lbnQiOiAid2hhdCB0byBkbyBkaWZmZXJlbnRseSBuZXh0IHRpbWUsIG9yIG51bGwgaWYgbm90aGluZyIsCiAgInN1bW1hcnkiOiAiMSBzZW50ZW5jZTogd2hhdCBoYXBwZW5lZCBhbmQgd2FzIGl0IHVzZWZ1bD8iCn0KQmUgaG9uZXN0LiBJZiB0aGUgdGFzayBmYWlsZWQgb3IgcHJvZHVjZWQgbm90aGluZyB1c2VmdWwsIHNheSBzby5gOwphc3luYyBmdW5jdGlvbiByZWZsZWN0T25Db21wbGV0aW9uKHRhc2ssIG91dHB1dCkgewogICAgLy8gT25seSByZWZsZWN0IG9uIGF1dG9ub21vdXMgYWN0aW9ucwogICAgaWYgKHRhc2sub3JpZ2luICE9PSAiYWkiKQogICAgICAgIHJldHVybjsKICAgIHRyeSB7CiAgICAgICAgLy8gVGllciAxOiBNaWNyby1yZWZsZWN0aW9uIGZvciByb3V0aW5lIHN1Y2Nlc3NlcyDigJQgc2tpcCBMTE0gY2FsbAogICAgICAgIGNvbnN0IGlzUm91dGluZVN1Y2Nlc3MgPSB0YXNrLmV4aXRDb2RlID09PSAwICYmIG91dHB1dC50cmltKCkubGVuZ3RoID4gMTAwOwogICAgICAgIGlmIChpc1JvdXRpbmVTdWNjZXNzKSB7CiAgICAgICAgICAgIGNvbnN0IG1pY3JvUmVmbGVjdGlvbiA9IHsKICAgICAgICAgICAgICAgIG1vdmVkR29hbEZvcndhcmQ6IHRydWUsCiAgICAgICAgICAgICAgICBoaXRHdWFyZHJhaWw6IGZhbHNlLAogICAgICAgICAgICAgICAgYWRqdXN0bWVudDogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYENvbXBsZXRlZCAiJHt0YXNrLmxhYmVsfSIgc3VjY2Vzc2Z1bGx5LmAsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVRhc2sodGFzay5pZCwgeyByZWZsZWN0aW9uOiBtaWNyb1JlZmxlY3Rpb24gfSk7CiAgICAgICAgICAgIHJlZmxlY3Rpb25Mb2cuaW5mbyhgTWljcm8tcmVmbGVjdGlvbiAocm91dGluZSBzdWNjZXNzKTogIiR7dGFzay5sYWJlbH0iYCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gVGllciAyOiBGdWxsIExMTSByZWZsZWN0aW9uIGZvciBub24tcm91dGluZSBjb21wbGV0aW9ucwogICAgICAgIGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZUFnZW50UHJvdmlkZXIoKTsKICAgICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHJlc29sdmVBZ2VudE1vZGVsQXN5bmMoKTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbXBsZXRlQ2hhdCh7CiAgICAgICAgICAgIG1lc3NhZ2VzOiBbCiAgICAgICAgICAgICAgICB7IHJvbGU6ICJzeXN0ZW0iLCBjb250ZW50OiBSRUZMRUNUSU9OX1BST01QVCB9LAogICAgICAgICAgICAgICAgeyByb2xlOiAidXNlciIsIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhc2subGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogdGFzay5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0LnNsaWNlKDAsIDEwMDApLAogICAgICAgICAgICAgICAgICAgICAgICBleGl0Q29kZTogdGFzay5leGl0Q29kZSwKICAgICAgICAgICAgICAgICAgICB9KSB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBtb2RlbCwKICAgICAgICAgICAgcHJvdmlkZXIsCiAgICAgICAgfSk7CiAgICAgICAgLy8gUGFyc2UgSlNPTiByZXNwb25zZSDigJQgc3RyaXAgbWFya2Rvd24gZmVuY2VzIGlmIHByZXNlbnQKICAgICAgICBjb25zdCBqc29uU3RyID0gcmVzcG9uc2UucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xzKi9pLCAiIikucmVwbGFjZSgvXHMqYGBgJC9pLCAiIikudHJpbSgpOwogICAgICAgIGNvbnN0IHJlZmxlY3Rpb24gPSBKU09OLnBhcnNlKGpzb25TdHIpOwogICAgICAgIC8vIFdyaXRlIHJlZmxlY3Rpb24gdG8gdGFzayByZWNvcmQKICAgICAgICBhd2FpdCB1cGRhdGVUYXNrKHRhc2suaWQsIHsgcmVmbGVjdGlvbiB9KTsKICAgICAgICAvLyBMb2cgcmVmbGVjdGl2ZSBhY3Rpdml0eSBlbnRyeSAob25seSBmb3Igbm9uLXJvdXRpbmUgY2FzZXMgdGhhdCB3YXJyYW50ZWQgTExNIGFuYWx5c2lzKQogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgUmVmbGVjdGlvbiBvbiAiJHt0YXNrLmxhYmVsfSI6ICR7cmVmbGVjdGlvbi5zdW1tYXJ5fWAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiUkVGTEVDVElWRSIsCiAgICAgICAgICAgIHJlYXNvbjogInBvc3QtY29tcGxldGlvbiBhdXRvbm9tb3VzIHJlZmxlY3Rpb24iLAogICAgICAgICAgICBiYWNrcmVmOiB0YXNrLmlkLAogICAgICAgIH0pOwogICAgICAgIHJlZmxlY3Rpb25Mb2cuaW5mbyhgUmVmbGVjdGVkIG9uICIke3Rhc2subGFiZWx9IjogJHtyZWZsZWN0aW9uLnN1bW1hcnl9YCk7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVmbGVjdGlvbkxvZy53YXJuKGBSZWZsZWN0aW9uIGZhaWxlZCBmb3IgIiR7dGFzay5sYWJlbH0iOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTsKICAgIH0KfQovLyDilIDilIDilIAgU2NhciBFdmFsdWF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBTQ0FSX0VWQUxfUFJPTVBUID0gYFlvdSBhcmUgZXZhbHVhdGluZyB3aGV0aGVyIGEgY29tcGxldGVkICJGaXg6IiBhZ2VudCdzIHdvcmsgcXVhbGlmaWVzIGFzIGEgc2NhciDigJQgYSBzZWxmLXJlcGFpciBwcm92ZW4gYnkgY29kZSwgdGVzdHMsIGFuZCB2YWxpZGF0aW9uLgoKQSBmaXggcXVhbGlmaWVzIGFzIGEgc2NhciBPTkxZIGlmIHRoZSBvdXRwdXQgc2hvd3MgQUxMIG9mIHRoZXNlOgoxLiBBIGNsZWFyIHJvb3QgY2F1c2Ugd2FzIGlkZW50aWZpZWQgKHRoZSAiYW5jaG9yIikKMi4gQ29kZSB3YXMgY2hhbmdlZCB0byBjb3JyZWN0IHRoZSBkZWZlY3QKMy4gVGVzdHMgb3IgdmFsaWRhdGlvbiB3ZXJlIGFkZGVkL3J1biB0byBwcm92ZSB0aGUgZml4IHdvcmtzCgpSZXNwb25kIGluIEpTT046CnsKICAiaXNTY2FyIjogdHJ1ZS9mYWxzZSwKICAiYW5jaG9yIjogInJvb3QgY2F1c2UgZGVzY3JpcHRpb24gKG9yIG51bGwgaWYgbm90IGEgc2NhcikiLAogICJ3b3VuZFN1bW1hcnkiOiAib25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9yaWdpbmFsIGZhaWx1cmUgKG9yIG51bGwpIiwKICAiYXJ0aWZhY3RzIjogewogICAgInByZXZlbnRpb24iOiBbIm1lYXN1cmVzIGFkZGVkIHRvIHByZXZlbnQgcmVjdXJyZW5jZSJdLAogICAgImRldGVjdGlvbiI6IFsic2lnbmFscyBhZGRlZCB0byBkZXRlY3QgdGhlIGlzc3VlIGVhcmxpZXIiXSwKICAgICJjb3JyZWN0aW9uIjogWyJjb2RlIGNoYW5nZXMgdGhhdCBjb3JyZWN0ZWQgdGhlIGRlZmVjdCJdLAogICAgInJlZ3Jlc3Npb25UZXN0cyI6IFsidGVzdCBmaWxlcy9jYXNlcyB0aGF0IGd1YXJkIGFnYWluc3QgcmVncmVzc2lvbiJdCiAgfQp9CgpJZiB0aGUgZml4IHdhcyBwYXJ0aWFsLCB1bnRlc3RlZCwgb3IganVzdCBhIHdvcmthcm91bmQsIHNldCBpc1NjYXIgdG8gZmFsc2UuYDsKLyoqCiAqIEV2YWx1YXRlIHdoZXRoZXIgYSBjb21wbGV0ZWQgRml4OiBhZ2VudCBwcm9kdWNlZCBhIHNjYXItd29ydGh5IHJlcGFpci4KICogQ2FsbGVkIGZvciBzdWNjZXNzZnVsIEZpeDogYWdlbnRzIGFmdGVyIGNvbXBsZXRpb24uCiAqLwphc3luYyBmdW5jdGlvbiBldmFsdWF0ZVNjYXIodGFzaywgb3V0cHV0KSB7CiAgICAvLyBPbmx5IGV2YWx1YXRlIHN1Y2Nlc3NmdWwgRml4OiBhZ2VudHMKICAgIGlmICghdGFzay5sYWJlbC5zdGFydHNXaXRoKCJGaXg6ICIpKQogICAgICAgIHJldHVybjsKICAgIGlmICh0YXNrLnN0YXR1cyAhPT0gImNvbXBsZXRlZCIpCiAgICAgICAgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBwcm92aWRlciA9IHJlc29sdmVBZ2VudFByb3ZpZGVyKCk7CiAgICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCByZXNvbHZlQWdlbnRNb2RlbEFzeW5jKCk7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb21wbGV0ZUNoYXQoewogICAgICAgICAgICBtZXNzYWdlczogWwogICAgICAgICAgICAgICAgeyByb2xlOiAic3lzdGVtIiwgY29udGVudDogU0NBUl9FVkFMX1BST01QVCB9LAogICAgICAgICAgICAgICAgeyByb2xlOiAidXNlciIsIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhc2subGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0LnNsaWNlKDAsIDIwMDApLAogICAgICAgICAgICAgICAgICAgICAgICBleGl0Q29kZTogdGFzay5leGl0Q29kZSwKICAgICAgICAgICAgICAgICAgICB9KSB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBtb2RlbCwKICAgICAgICAgICAgcHJvdmlkZXIsCiAgICAgICAgfSk7CiAgICAgICAgY29uc3QganNvblN0ciA9IHJlc3BvbnNlLnJlcGxhY2UoL15gYGAoPzpqc29uKT9ccyovaSwgIiIpLnJlcGxhY2UoL1xzKmBgYCQvaSwgIiIpLnRyaW0oKTsKICAgICAgICBjb25zdCBldmFsdWF0aW9uID0gSlNPTi5wYXJzZShqc29uU3RyKTsKICAgICAgICBpZiAoIWV2YWx1YXRpb24uaXNTY2FyKSB7CiAgICAgICAgICAgIHJlZmxlY3Rpb25Mb2cuaW5mbyhgRml4ICIke3Rhc2subGFiZWx9IiBkaWQgbm90IHF1YWxpZnkgYXMgc2NhcmApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGF3YWl0IHJlY29yZFNjYXIoewogICAgICAgICAgICBhbmNob3I6IGV2YWx1YXRpb24uYW5jaG9yLAogICAgICAgICAgICB3b3VuZFN1bW1hcnk6IGV2YWx1YXRpb24ud291bmRTdW1tYXJ5LAogICAgICAgICAgICBoZWFsZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBhZ2VudElkOiB0YXNrLmlkLAogICAgICAgICAgICBhcnRpZmFjdHM6IHsKICAgICAgICAgICAgICAgIHByZXZlbnRpb246IGV2YWx1YXRpb24uYXJ0aWZhY3RzPy5wcmV2ZW50aW9uID8/IFtdLAogICAgICAgICAgICAgICAgZGV0ZWN0aW9uOiBldmFsdWF0aW9uLmFydGlmYWN0cz8uZGV0ZWN0aW9uID8/IFtdLAogICAgICAgICAgICAgICAgY29ycmVjdGlvbjogZXZhbHVhdGlvbi5hcnRpZmFjdHM/LmNvcnJlY3Rpb24gPz8gW10sCiAgICAgICAgICAgICAgICByZWdyZXNzaW9uVGVzdHM6IGV2YWx1YXRpb24uYXJ0aWZhY3RzPy5yZWdyZXNzaW9uVGVzdHMgPz8gW10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBTY2FyIHJlY29yZGVkIGZvciAiJHt0YXNrLmxhYmVsfSI6ICR7ZXZhbHVhdGlvbi53b3VuZFN1bW1hcnl9YCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJSRUZMRUNUSVZFIiwKICAgICAgICAgICAgcmVhc29uOiAiZml4IGFnZW50IHByb2R1Y2VkIHZhbGlkYXRlZCBzZWxmLXJlcGFpciIsCiAgICAgICAgICAgIGJhY2tyZWY6IHRhc2suaWQsCiAgICAgICAgfSk7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVmbGVjdGlvbkxvZy53YXJuKGBTY2FyIGV2YWx1YXRpb24gZmFpbGVkIGZvciAiJHt0YXNrLmxhYmVsfSI6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApOwogICAgfQp9Ci8qKgogKiBHZW5lcmF0ZSBhIGNvbnNvbGlkYXRlZCBoYW5kb2ZmIHJlcG9ydCB3aGVuIGEgYm9hcmQgdGFzayBoaXRzIDMrIGZhaWx1cmVzLgogKiBQZXJzaXN0cyB0byBicmFpbi9hZ2VudHMvYnJpZGdlLXJlcG9ydHMvIGFuZCBwdXNoZXMgYSBub3RpZmljYXRpb24uCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCcmlkZ2VSZXBvcnQoYm9hcmRUYXNrSWQsIHRhc2tMYWJlbCwgZmFpbHVyZUNvdW50KSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGFsbFRhc2tzID0gYXdhaXQgbGlzdFRhc2tzKCk7CiAgICAgICAgY29uc3QgcmVsYXRlZCA9IGFsbFRhc2tzCiAgICAgICAgICAgIC5maWx0ZXIoKHQpID0+IHQubGFiZWwgPT09IHRhc2tMYWJlbCB8fCB0LmxhYmVsID09PSBgRml4OiAke3Rhc2tMYWJlbH1gKQogICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGEuY3JlYXRlZEF0ID8/ICIiKS5sb2NhbGVDb21wYXJlKGIuY3JlYXRlZEF0ID8/ICIiKSk7CiAgICAgICAgY29uc3QgYXR0ZW1wdHMgPSByZWxhdGVkCiAgICAgICAgICAgIC5maWx0ZXIoKHQpID0+IHQubGFiZWwgPT09IHRhc2tMYWJlbCkKICAgICAgICAgICAgLm1hcCgodCwgaSkgPT4gKHsKICAgICAgICAgICAgcm91bmQ6IGkgKyAxLAogICAgICAgICAgICBleGl0Q29kZTogdC5leGl0Q29kZSA/PyBudWxsLAogICAgICAgICAgICBvdXRwdXRTbmlwcGV0OiAodC5yZXN1bHRTdW1tYXJ5ID8/ICIiKS5zbGljZSgwLCAzMDApLAogICAgICAgICAgICB0aW1lc3RhbXA6IHQuZmluaXNoZWRBdCA/PyB0LmNyZWF0ZWRBdCA/PyAiIiwKICAgICAgICB9KSk7CiAgICAgICAgY29uc3QgcmVjb3ZlcnlBdHRlbXB0cyA9IHJlbGF0ZWQKICAgICAgICAgICAgLmZpbHRlcigodCkgPT4gdC5sYWJlbC5zdGFydHNXaXRoKCJGaXg6ICIpKQogICAgICAgICAgICAubWFwKCh0KSA9PiBgUmVjb3ZlcnkgJHt0LnN0YXR1c306ICR7KHQucmVzdWx0U3VtbWFyeSA/PyAiIikuc2xpY2UoMCwgMjAwKX1gKTsKICAgICAgICBjb25zdCByb290Q2F1c2VzID0gW107CiAgICAgICAgZm9yIChjb25zdCB0IG9mIHJlbGF0ZWQpIHsKICAgICAgICAgICAgaWYgKHQucmVmbGVjdGlvbj8uYWRqdXN0bWVudCkKICAgICAgICAgICAgICAgIHJvb3RDYXVzZXMucHVzaCh0LnJlZmxlY3Rpb24uYWRqdXN0bWVudCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcG9ydCA9IHsKICAgICAgICAgICAgdGFza0lkOiBib2FyZFRhc2tJZCwKICAgICAgICAgICAgdGFza0xhYmVsLAogICAgICAgICAgICBmYWlsdXJlQ291bnQsCiAgICAgICAgICAgIGF0dGVtcHRzLAogICAgICAgICAgICByb290Q2F1c2VzOiBbLi4ubmV3IFNldChyb290Q2F1c2VzKV0sCiAgICAgICAgICAgIHJlY292ZXJ5QXR0ZW1wdHMsCiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiByb290Q2F1c2VzLmxlbmd0aCA+IDAKICAgICAgICAgICAgICAgID8gYFJlcGVhdGVkIHJvb3QgY2F1c2U6ICR7cm9vdENhdXNlc1swXX0uIE1hbnVhbCBpbnZlc3RpZ2F0aW9uIG5lZWRlZC5gCiAgICAgICAgICAgICAgICA6IGAke2ZhaWx1cmVDb3VudH0gZmFpbHVyZXMgd2l0aCBubyBjbGVhciByb290IGNhdXNlLiBDaGVjayBhZ2VudCBsb2dzIGZvciAke3Rhc2tMYWJlbH0uYCwKICAgICAgICB9OwogICAgICAgIGNvbnN0IHJlcG9ydFRleHQgPSBbCiAgICAgICAgICAgIGAjIyBCcmlkZ2UgUmVwb3J0OiAiJHt0YXNrTGFiZWx9ImAsCiAgICAgICAgICAgIGAqKiR7ZmFpbHVyZUNvdW50fSBjb25zZWN1dGl2ZSBmYWlsdXJlcyoqIOKAlCBoYW5kaW5nIG9mZiB0byBodW1hbi5gLAogICAgICAgICAgICBgYCwKICAgICAgICAgICAgYCMjIyBBdHRlbXB0c2AsCiAgICAgICAgICAgIC4uLmF0dGVtcHRzLm1hcCgoYSkgPT4gYC0gUm91bmQgJHthLnJvdW5kfSAoZXhpdCAke2EuZXhpdENvZGV9KTogJHthLm91dHB1dFNuaXBwZXQuc2xpY2UoMCwgMTAwKX0uLi5gKSwKICAgICAgICAgICAgYGAsCiAgICAgICAgICAgIGAjIyMgUm9vdCBDYXVzZXMgSWRlbnRpZmllZGAsCiAgICAgICAgICAgIC4uLihyb290Q2F1c2VzLmxlbmd0aCA+IDAgPyByb290Q2F1c2VzLm1hcCgocikgPT4gYC0gJHtyfWApIDogWyItIE5vIHJvb3QgY2F1c2VzIGlkZW50aWZpZWQgYnkgcmVmbGVjdGlvbiJdKSwKICAgICAgICAgICAgYGAsCiAgICAgICAgICAgIGAjIyMgUmVjb3ZlcnkgQXR0ZW1wdHNgLAogICAgICAgICAgICAuLi4ocmVjb3ZlcnlBdHRlbXB0cy5sZW5ndGggPiAwID8gcmVjb3ZlcnlBdHRlbXB0cy5tYXAoKHIpID0+IGAtICR7cn1gKSA6IFsiLSBOb25lIl0pLAogICAgICAgICAgICBgYCwKICAgICAgICAgICAgYCMjIyBSZWNvbW1lbmRhdGlvbmAsCiAgICAgICAgICAgIHJlcG9ydC5yZWNvbW1lbmRhdGlvbiwKICAgICAgICBdLmpvaW4oIlxuIik7CiAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlcG9ydFRleHQsCiAgICAgICAgfSk7CiAgICAgICAgcmVjb3JkQnJpZGdlUmVwb3J0TWV0cmljKCk7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBCcmlkZ2UgcmVwb3J0IGdlbmVyYXRlZCBmb3IgIiR7dGFza0xhYmVsfSIgKCR7ZmFpbHVyZUNvdW50fSBmYWlsdXJlcylgLAogICAgICAgICAgICBkZXRhaWw6IEpTT04uc3RyaW5naWZ5KHJlcG9ydCksCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgIHJlYXNvbjogInN0cnVjdHVyYWwgaW1wYXNzZSDigJQgcmVwZWF0ZWQgc2FtZS10YXNrIGZhaWx1cmVzIiwKICAgICAgICB9KTsKICAgICAgICAvLyBQZXJzaXN0IGFzIGJyYWluIGRvY3VtZW50IGZvciBmdXR1cmUgcmVmZXJlbmNlCiAgICAgICAgY29uc3QgcmVwb3J0c0RpciA9IGpvaW4oQlJBSU5fRElSLCAiYWdlbnRzIiwgImJyaWRnZS1yZXBvcnRzIik7CiAgICAgICAgbWtkaXJTeW5jKHJlcG9ydHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgIGNvbnN0IHJlcG9ydFBhdGggPSBqb2luKHJlcG9ydHNEaXIsIGAke2JvYXJkVGFza0lkfS0ke0RhdGUubm93KCl9Lm1kYCk7CiAgICAgICAgd3JpdGVGaWxlU3luYyhyZXBvcnRQYXRoLCByZXBvcnRUZXh0LCAidXRmLTgiKTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICByZWZsZWN0aW9uTG9nLndhcm4oYEJyaWRnZSByZXBvcnQgZmFpbGVkIGZvciAiJHt0YXNrTGFiZWx9IjogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7CiAgICB9Cn0KZnVuY3Rpb24gY2xlYXJUYXNrVGltZXIodGFza0lkKSB7CiAgICBjb25zdCB0aW1lciA9IGFjdGl2ZVRpbWVycy5nZXQodGFza0lkKTsKICAgIGlmICh0aW1lcikgewogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgYWN0aXZlVGltZXJzLmRlbGV0ZSh0YXNrSWQpOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXduLmpzLm1hcA==","agents/governed-spawn.js":"LyoqCiAqIEdvdmVybmVkIEFnZW50IFNwYXduIOKAlCBDT1JFLTkKICoKICogSGlnaC1sZXZlbCBlbnRyeSBwb2ludCBmb3Igc3Bhd25pbmcgQ2xhdWRlIENvZGUgYWdlbnRzIHdpdGggZnVsbAogKiBnb3Zlcm5hbmNlIGNvbnRyb2xzLiBDb21wb3NlczoKICoKICogMS4gR292ZXJuYW5jZSBnYXRlICh2b3VjaGVyICsgbG9ja2VkIHBhdGhzICsgcHJpbmNpcGxlcykKICogMi4gQWdlbnQgc3Bhd25pbmcgKHZpYSBleGlzdGluZyBwb29sIG9yIGRpcmVjdCBzcGF3bikKICogMy4gSGVhcnRiZWF0IG1vbml0b3JpbmcgKHNpbGVuY2UgKyBkcmlmdCBkZXRlY3Rpb24pCiAqIDQuIExpZmVjeWNsZSBtYW5hZ2VtZW50IChjbGVhbnVwIG9uIGNvbXBsZXRpb24vdGVybWluYXRpb24pCiAqCiAqIFRoaXMgcmVwbGFjZXMgcmF3IGAtLWRhbmdlcm91c2x5LXNraXAtcGVybWlzc2lvbnNgIHdpdGggYSBnb3Zlcm5lZAogKiBlcXVpdmFsZW50IHdoZXJlIHZvdWNoZXJzLCBsb2NrZWQgcGF0aHMsIGFuZCBwcmluY2lwbGVzIHJlcGxhY2UgdGhlCiAqIGludGVyYWN0aXZlIHBlcm1pc3Npb24gcHJvbXB0LgogKi8KaW1wb3J0IHsgZ292ZXJuYW5jZUdhdGUsIHJldm9rZUdvdmVybmFuY2VWb3VjaGVyLCBuYXJyb3dTY29wZUNlaWxpbmcsIH0gZnJvbSAiLi9nb3Zlcm5hbmNlLmpzIjsKaW1wb3J0IHsgY3JlYXRlSGVhcnRiZWF0VHJhY2tlciwgcmVtb3ZlSGVhcnRiZWF0VHJhY2tlciwgZXh0cmFjdFRhc2tLZXl3b3JkcywgfSBmcm9tICIuL2hlYXJ0YmVhdC5qcyI7CmltcG9ydCB7IGxvZ0FjdGl2aXR5LCBnZW5lcmF0ZVRyYWNlSWQgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyByZXNvbHZlVGFza1JvdXRlQXN5bmMgfSBmcm9tICIuLi9zZXR0aW5ncy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ292ZXJuZWQtc3Bhd24iKTsKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEdvdmVybmVkIHNwYXduCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKioKICogU3Bhd24gYSBDbGF1ZGUgQ29kZSBhZ2VudCB3aXRoIGZ1bGwgZ292ZXJuYW5jZSBjb250cm9scy4KICoKICogRmxvdzoKICogMS4gUnVuIGdvdmVybmFuY2UgZ2F0ZSAodm91Y2hlciArIGxvY2tlZCBwYXRocyArIHByaW5jaXBsZXMpCiAqIDIuIElmIGRlbmllZCDihpIgcmV0dXJuIGZhaWx1cmUgd2l0aCByZWFzb24KICogMy4gU3Bhd24gYWdlbnQgdmlhIHBvb2wgd2l0aCBnb3Zlcm5lZCBwcm9tcHQKICogNC4gQXR0YWNoIGhlYXJ0YmVhdCB0cmFja2VyCiAqIDUuIFdpcmUgbGlmZWN5Y2xlIGNsZWFudXAgKHZvdWNoZXIgcmV2b2NhdGlvbiBvbiBleGl0KQogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdvdmVybmVkU3Bhd24ocmVxdWVzdCwgZGVwcykgewogICAgY29uc3QgdHJhY2VJZCA9IGdlbmVyYXRlVHJhY2VJZCgpOwogICAgY29uc3QgeyBsdG0sIHBvb2wgfSA9IGRlcHM7CiAgICBsb2cuaW5mbygiR292ZXJuZWQgc3Bhd24gcmVxdWVzdGVkIiwgewogICAgICAgIHRhc2tJZDogcmVxdWVzdC50YXNrSWQsCiAgICAgICAgbGFiZWw6IHJlcXVlc3QubGFiZWwsCiAgICAgICAgb3JpZ2luOiByZXF1ZXN0Lm9yaWdpbiwKICAgICAgICB0cmFjZUlkLAogICAgfSk7CiAgICAvLyAxLiBSdW4gZ292ZXJuYW5jZSBnYXRlIChzY29wZSBjZWlsaW5nIHZhbGlkYXRlZCBoZXJlKQogICAgY29uc3QgZ292T3B0cyA9IHsKICAgICAgICB0YXNrSWQ6IHJlcXVlc3QudGFza0lkLAogICAgICAgIGxhYmVsOiByZXF1ZXN0LmxhYmVsLAogICAgICAgIHByb21wdDogcmVxdWVzdC5wcm9tcHQsCiAgICAgICAgb3JpZ2luOiByZXF1ZXN0Lm9yaWdpbiwKICAgICAgICBsdG0sCiAgICAgICAgdm91Y2hlclR0bE1pbnV0ZXM6IHJlcXVlc3Qudm91Y2hlclR0bE1pbnV0ZXMsCiAgICAgICAgc2tpcFZvdWNoZXI6IHJlcXVlc3Quc2tpcFZvdWNoZXIsCiAgICAgICAgYWdlbnRUeXBlOiByZXF1ZXN0LmFnZW50VHlwZSwKICAgICAgICBjdXJyZW50QWdlbnRDb3VudDogcmVxdWVzdC5jdXJyZW50QWdlbnRDb3VudCwKICAgICAgICBjdXJyZW50VHlwZUNvdW50OiByZXF1ZXN0LmN1cnJlbnRUeXBlQ291bnQsCiAgICAgICAgY3dkOiByZXF1ZXN0LmN3ZCwKICAgICAgICBzY29wZUNlaWxpbmc6IHJlcXVlc3Quc2NvcGVDZWlsaW5nLAogICAgfTsKICAgIGNvbnN0IGdvdmVybmFuY2UgPSBhd2FpdCBnb3Zlcm5hbmNlR2F0ZShnb3ZPcHRzKTsKICAgIC8vIDIuIENoZWNrIGdvdmVybmFuY2UgZGVjaXNpb24KICAgIGlmICghZ292ZXJuYW5jZS5hbGxvd2VkKSB7CiAgICAgICAgbG9nLndhcm4oIkdvdmVybmVkIHNwYXduIGRlbmllZCIsIHsKICAgICAgICAgICAgdGFza0lkOiByZXF1ZXN0LnRhc2tJZCwKICAgICAgICAgICAgcmVhc29uOiBnb3Zlcm5hbmNlLmRlbmllZFJlYXNvbiwKICAgICAgICAgICAgdHJhY2VJZCwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSwKICAgICAgICAgICAgZ292ZXJuYW5jZSwKICAgICAgICAgICAgdHJhY2VJZCwKICAgICAgICAgICAgZGVuaWVkUmVhc29uOiBnb3Zlcm5hbmNlLmRlbmllZFJlYXNvbiwKICAgICAgICB9OwogICAgfQogICAgLy8gMy4gU3Bhd24gYWdlbnQgdmlhIHBvb2wKICAgIGlmICghcG9vbCkgewogICAgICAgIGNvbnN0IHJlYXNvbiA9ICJObyBhZ2VudCBwb29sIGF2YWlsYWJsZSDigJQgY2Fubm90IHNwYXduIGdvdmVybmVkIGFnZW50IjsKICAgICAgICBsb2cuZXJyb3IocmVhc29uLCB7IHRhc2tJZDogcmVxdWVzdC50YXNrSWQgfSk7CiAgICAgICAgLy8gUmV2b2tlIHRoZSB2b3VjaGVyIHNpbmNlIHdlIGNhbid0IHVzZSBpdAogICAgICAgIGlmIChnb3Zlcm5hbmNlLnZvdWNoZXJUb2tlbikgewogICAgICAgICAgICBhd2FpdCByZXZva2VHb3Zlcm5hbmNlVm91Y2hlcihsdG0sIGdvdmVybmFuY2Uudm91Y2hlclRva2VuKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsCiAgICAgICAgICAgIGdvdmVybmFuY2UsCiAgICAgICAgICAgIHRyYWNlSWQsCiAgICAgICAgICAgIGRlbmllZFJlYXNvbjogcmVhc29uLAogICAgICAgIH07CiAgICB9CiAgICAvLyBDb21wdXRlIGVmZmVjdGl2ZSBzY29wZSBjZWlsaW5nIGZvciB0aGlzIGFnZW50IGFuZCBpdHMgY2hpbGRyZW4KICAgIGNvbnN0IGVmZmVjdGl2ZUNlaWxpbmcgPSBuYXJyb3dTY29wZUNlaWxpbmcocmVxdWVzdC5zY29wZUNlaWxpbmcsIHJlcXVlc3QuY3dkKTsKICAgIC8vIFJlc29sdmUgbW9kZWwgcm91dGluZyBmb3IgdGhpcyB0YXNrIHR5cGUKICAgIGNvbnN0IHJvdXRlID0gYXdhaXQgcmVzb2x2ZVRhc2tSb3V0ZUFzeW5jKHJlcXVlc3QuYWdlbnRUeXBlKTsKICAgIGxvZy5pbmZvKCJUYXNrIHJvdXRlIHJlc29sdmVkIiwgewogICAgICAgIHRhc2tJZDogcmVxdWVzdC50YXNrSWQsCiAgICAgICAgYWdlbnRUeXBlOiByZXF1ZXN0LmFnZW50VHlwZSwKICAgICAgICBwcm92aWRlcjogcm91dGUucHJvdmlkZXIsCiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsID8/ICJhdXRvIiwKICAgIH0pOwogICAgbGV0IGluc3RhbmNlOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBzcGF3blJlcXVlc3QgPSB7CiAgICAgICAgICAgIHRhc2tJZDogcmVxdWVzdC50YXNrSWQsCiAgICAgICAgICAgIGxhYmVsOiByZXF1ZXN0LmxhYmVsLAogICAgICAgICAgICBwcm9tcHQ6IGdvdmVybmFuY2UuZ292ZXJuZWRQcm9tcHQsCiAgICAgICAgICAgIGN3ZDogcmVxdWVzdC5jd2QsCiAgICAgICAgICAgIG9yaWdpbjogcmVxdWVzdC5vcmlnaW4sCiAgICAgICAgICAgIHRhZ3M6IFsKICAgICAgICAgICAgICAgIC4uLihyZXF1ZXN0LnRhZ3MgPz8gW10pLAogICAgICAgICAgICAgICAgImdvdmVybmVkIiwKICAgICAgICAgICAgICAgIGdvdmVybmFuY2Uudm91Y2hlclRva2VuID8gYHZvdWNoZXI6JHtnb3Zlcm5hbmNlLnZvdWNoZXJUb2tlbn1gIDogInZvdWNoZXI6bm9uZSIsCiAgICAgICAgICAgICAgICBgc2NvcGUtY2VpbGluZzoke2VmZmVjdGl2ZUNlaWxpbmd9YCwKICAgICAgICAgICAgICAgIGByb3V0ZToke3JvdXRlLnByb3ZpZGVyfS8ke3JvdXRlLm1vZGVsID8/ICJhdXRvIn1gLAogICAgICAgICAgICBdLAogICAgICAgICAgICBwYXJlbnRJZDogcmVxdWVzdC5wYXJlbnRJZCwKICAgICAgICAgICAgY29uZmlnOiB7CiAgICAgICAgICAgICAgICBlbnY6IHsKICAgICAgICAgICAgICAgICAgICAvLyBJbmplY3Qgcm91dGVkIHByb3ZpZGVyL21vZGVsIGludG8gY2hpbGQgYWdlbnQncyBlbnZpcm9ubWVudAogICAgICAgICAgICAgICAgICAgIC4uLihyb3V0ZS5wcm92aWRlciA/IHsgQ09SRV9UQVNLX1BST1ZJREVSOiByb3V0ZS5wcm92aWRlciB9IDoge30pLAogICAgICAgICAgICAgICAgICAgIC4uLihyb3V0ZS5tb2RlbCA/IHsgQ09SRV9UQVNLX01PREVMOiByb3V0ZS5tb2RlbCB9IDoge30pLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgICAgIGluc3RhbmNlID0gYXdhaXQgcG9vbC5zcGF3bihzcGF3blJlcXVlc3QpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgR292ZXJuZWQgYWdlbnQgc3Bhd25lZDogJHtyZXF1ZXN0LmxhYmVsfWAsCiAgICAgICAgICAgIGRldGFpbDogYEluc3RhbmNlOiAke2luc3RhbmNlLmlkfSwgUElEOiAke2luc3RhbmNlLnBpZH0sIHZvdWNoZXI6ICR7Z292ZXJuYW5jZS52b3VjaGVyVG9rZW4gPz8gIm5vbmUifWAsCiAgICAgICAgICAgIHRyYWNlSWQsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiByZXF1ZXN0Lm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgIHJlYXNvbjogImdvdmVybmVkLXNwYXduIiwKICAgICAgICB9KTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zdCByZWFzb24gPSBgU3Bhd24gZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gOwogICAgICAgIGxvZy5lcnJvcihyZWFzb24sIHsgdGFza0lkOiByZXF1ZXN0LnRhc2tJZCwgdHJhY2VJZCB9KTsKICAgICAgICAvLyBSZXZva2Ugdm91Y2hlciBvbiBzcGF3biBmYWlsdXJlCiAgICAgICAgaWYgKGdvdmVybmFuY2Uudm91Y2hlclRva2VuKSB7CiAgICAgICAgICAgIGF3YWl0IHJldm9rZUdvdmVybmFuY2VWb3VjaGVyKGx0bSwgZ292ZXJuYW5jZS52b3VjaGVyVG9rZW4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSwKICAgICAgICAgICAgZ292ZXJuYW5jZSwKICAgICAgICAgICAgdHJhY2VJZCwKICAgICAgICAgICAgZGVuaWVkUmVhc29uOiByZWFzb24sCiAgICAgICAgfTsKICAgIH0KICAgIC8vIDQuIEF0dGFjaCBoZWFydGJlYXQgdHJhY2tlcgogICAgY29uc3QgdGFza0tleXdvcmRzID0gZXh0cmFjdFRhc2tLZXl3b3JkcyhyZXF1ZXN0LnByb21wdCk7CiAgICBjb25zdCBoZWFydGJlYXQgPSBjcmVhdGVIZWFydGJlYXRUcmFja2VyKHJlcXVlc3QudGFza0lkLCBpbnN0YW5jZS5pZCwgewogICAgICAgIHRhc2tEZXNjcmlwdGlvbjogcmVxdWVzdC5wcm9tcHQsCiAgICAgICAgdGFza0tleXdvcmRzLAogICAgICAgIC4uLnJlcXVlc3QuaGVhcnRiZWF0LAogICAgfSwgYXN5bmMgKGluc3RhbmNlSWQsIHJlYXNvbikgPT4gewogICAgICAgIC8vIFRlcm1pbmF0aW9uIGNhbGxiYWNrIGZyb20gaGVhcnRiZWF0CiAgICAgICAgbG9nLndhcm4oIkhlYXJ0YmVhdCB0cmlnZ2VyZWQgdGVybWluYXRpb24iLCB7IGluc3RhbmNlSWQsIHJlYXNvbiwgdHJhY2VJZCB9KTsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBwb29sLnRlcm1pbmF0ZShpbnN0YW5jZUlkLCByZWFzb24pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHRlcm1pbmF0ZSB2aWEgaGVhcnRiZWF0IiwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VJZCwKICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0pOwogICAgaGVhcnRiZWF0LnN0YXJ0KCk7CiAgICAvLyA1LiBXaXJlIGxpZmVjeWNsZSBjbGVhbnVwIHZpYSBidXMgZXZlbnRzCiAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IGFzeW5jIChldmVudCkgPT4gewogICAgICAgIGlmIChldmVudC5hZ2VudElkICE9PSBpbnN0YW5jZS5pZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHRlcm1pbmFsU3RhdGVzID0gbmV3IFNldChbImNvbXBsZXRlZCIsICJmYWlsZWQiLCAidGVybWluYXRlZCJdKTsKICAgICAgICBpZiAoIXRlcm1pbmFsU3RhdGVzLmhhcyhldmVudC5uZXdTdGF0ZSkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBSZW1vdmUgaGFuZGxlcgogICAgICAgIHBvb2wucnVudGltZU1hbmFnZXIuYnVzLm9mZigiYWdlbnQ6bGlmZWN5Y2xlIiwgY2xlYW51cEhhbmRsZXIpOwogICAgICAgIC8vIFN0b3AgaGVhcnRiZWF0CiAgICAgICAgcmVtb3ZlSGVhcnRiZWF0VHJhY2tlcihpbnN0YW5jZS5pZCk7CiAgICAgICAgLy8gUmV2b2tlIHZvdWNoZXIKICAgICAgICBpZiAoZ292ZXJuYW5jZS52b3VjaGVyVG9rZW4pIHsKICAgICAgICAgICAgYXdhaXQgcmV2b2tlR292ZXJuYW5jZVZvdWNoZXIobHRtLCBnb3Zlcm5hbmNlLnZvdWNoZXJUb2tlbik7CiAgICAgICAgfQogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgR292ZXJuZWQgYWdlbnQgJHtldmVudC5uZXdTdGF0ZX06ICR7cmVxdWVzdC5sYWJlbH1gLAogICAgICAgICAgICBkZXRhaWw6IGBJbnN0YW5jZTogJHtpbnN0YW5jZS5pZH0sIHZvdWNoZXIgcmV2b2tlZDogJHtnb3Zlcm5hbmNlLnZvdWNoZXJUb2tlbiA/PyAibm9uZSJ9YCwKICAgICAgICAgICAgdHJhY2VJZCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6IHJlcXVlc3Qub3JpZ2luID09PSAiYWkiID8gIkFVVE9OT01PVVMiIDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiAiZ292ZXJuZWQtbGlmZWN5Y2xlIiwKICAgICAgICB9KTsKICAgIH07CiAgICBwb29sLnJ1bnRpbWVNYW5hZ2VyLmJ1cy5vbigiYWdlbnQ6bGlmZWN5Y2xlIiwgY2xlYW51cEhhbmRsZXIpOwogICAgbG9nLmluZm8oIkdvdmVybmVkIHNwYXduIGNvbXBsZXRlIiwgewogICAgICAgIHRhc2tJZDogcmVxdWVzdC50YXNrSWQsCiAgICAgICAgaW5zdGFuY2VJZDogaW5zdGFuY2UuaWQsCiAgICAgICAgcGlkOiBpbnN0YW5jZS5waWQsCiAgICAgICAgdm91Y2hlclRva2VuOiBnb3Zlcm5hbmNlLnZvdWNoZXJUb2tlbiwKICAgICAgICBoZWFydGJlYXRLZXl3b3JkczogdGFza0tleXdvcmRzLnNsaWNlKDAsIDUpLAogICAgICAgIHRyYWNlSWQsCiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgICAgc3VjY2VzczogdHJ1ZSwKICAgICAgICBpbnN0YW5jZSwKICAgICAgICBnb3Zlcm5hbmNlLAogICAgICAgIGhlYXJ0YmVhdCwKICAgICAgICB0cmFjZUlkLAogICAgICAgIHNjb3BlQ2VpbGluZzogZWZmZWN0aXZlQ2VpbGluZywKICAgIH07Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z292ZXJuZWQtc3Bhd24uanMubWFw","agents/governance.js":"LyoqCiAqIEFnZW50IEdvdmVybmFuY2UgR2F0ZSDigJQgQ09SRS05CiAqCiAqIFByZS1zcGF3biB2YWxpZGF0aW9uIHRoYXQgcmVwbGFjZXMgdGhlIGAtLWRhbmdlcm91c2x5LXNraXAtcGVybWlzc2lvbnNgCiAqIHByb21wdCB3aXRoIHZvdWNoZXItYmFzZWQgYXV0aG9yaXphdGlvbiwgbG9ja2VkLXBhdGggZW5mb3JjZW1lbnQsIGFuZAogKiBwcmluY2lwbGUgaW5qZWN0aW9uLgogKgogKiBFdmVyeSBnb3Zlcm5lZCBzcGF3bjoKICogMS4gSXNzdWVzIGEgc2NvcGVkIHZvdWNoZXIgZm9yIHRoZSB0YXNrCiAqIDIuIFJlYWRzIGxvY2tlZCBwYXRocyBhbmQgYnVpbGRzIGEgZGVueS1saXN0IGZvciB0aGUgYWdlbnQncyBwcm9tcHQKICogMy4gSW5qZWN0cyBjb3JlIHByaW5jaXBsZXMgYXMgYmVoYXZpb3JhbCBjb25zdHJhaW50cwogKiA0LiBXcmFwcyB0aGUgcHJvbXB0IHdpdGggZ292ZXJuYW5jZSBwcmVhbWJsZQogKiA1LiBMb2dzIHRoZSBnb3Zlcm5hbmNlIGRlY2lzaW9uIHRvIHRoZSBhdWRpdCB0cmFpbAogKi8KaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IGlzc3VlVm91Y2hlciwgY2hlY2tWb3VjaGVyLCByZXZva2VWb3VjaGVyIH0gZnJvbSAiLi4vdm91Y2hlci5qcyI7CmltcG9ydCB7IGxvYWRMb2NrZWRQYXRocyB9IGZyb20gIi4uL2xpYi9sb2NrZWQuanMiOwppbXBvcnQgeyBjaGVja1NwYXduUG9saWN5LCBsb2FkU3Bhd25Qb2xpY3kgfSBmcm9tICIuL3NwYXduLXBvbGljeS5qcyI7CmltcG9ydCB7IGxvZ0FjdGl2aXR5IH0gZnJvbSAiLi4vYWN0aXZpdHkvbG9nLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJnb3Zlcm5hbmNlIik7CmltcG9ydCB7IEJSQUlOX0RJUiB9IGZyb20gIi4uL2xpYi9wYXRocy5qcyI7Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBHb3Zlcm5hbmNlIHByZWFtYmxlIGNvbXBvbmVudHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIGJ1aWxkTG9ja2VkUGF0aHNTZWN0aW9uKHBhdGhzKSB7CiAgICBpZiAocGF0aHMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAiIjsKICAgIGNvbnN0IHBhdGhMaXN0ID0gcGF0aHMubWFwKChwKSA9PiBgICAtIGJyYWluLyR7cH1gKS5qb2luKCJcbiIpOwogICAgcmV0dXJuIGAKIyMgTG9ja2VkIFBhdGhzIChETyBOT1QgQUNDRVNTKQpUaGUgZm9sbG93aW5nIHBhdGhzIGFyZSBsb2NrZWQgYnkgZ292ZXJuYW5jZSBwb2xpY3kuIERvIE5PVCByZWFkLCB3cml0ZSwgb3IKcmVmZXJlbmNlIHRoZXNlIGZpbGVzLiBWaW9sYXRpb25zIHdpbGwgYmUgbG9nZ2VkIGFuZCBtYXkgdGVybWluYXRlIHlvdXIgc2Vzc2lvbi4KCiR7cGF0aExpc3R9CmA7Cn0KZnVuY3Rpb24gYnVpbGRWb3VjaGVyU2VjdGlvbih0b2tlbiwgc2NvcGUpIHsKICAgIHJldHVybiBgCiMjIEdvdmVybmFuY2UgVm91Y2hlcgpZb3UgYXJlIG9wZXJhdGluZyB1bmRlciB2b3VjaGVyIFxgJHt0b2tlbn1cYCB3aXRoIHNjb3BlIFxgJHtzY29wZX1cYC4KVGhpcyB2b3VjaGVyIGlzIHRpbWUtbGltaXRlZC4gSWYgeW91IHJlY2VpdmUgYSBnb3Zlcm5hbmNlIHZpb2xhdGlvbiwgc3RvcCBpbW1lZGlhdGVseS4KYDsKfQphc3luYyBmdW5jdGlvbiBsb2FkUHJpbmNpcGxlcygpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcHJpbmNpcGxlc1BhdGggPSBqb2luKEJSQUlOX0RJUiwgImlkZW50aXR5IiwgInByaW5jaXBsZXMubWQiKTsKICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocHJpbmNpcGxlc1BhdGgsICJ1dGYtOCIpOwogICAgICAgIC8vIEV4dHJhY3QganVzdCB0aGUga2V5IHByaW5jaXBsZXMsIG5vdCB0aGUgZnVsbCBkb2N1bWVudAogICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgiXG4iKTsKICAgICAgICBjb25zdCBrZXlQcmluY2lwbGVzID0gW107CiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIioqIikgJiYgbGluZS5lbmRzV2l0aCgiKioiKSkgewogICAgICAgICAgICAgICAga2V5UHJpbmNpcGxlcy5wdXNoKGxpbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChrZXlQcmluY2lwbGVzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIHJldHVybiBgCiMjIE9wZXJhdGluZyBQcmluY2lwbGVzCllvdSBtdXN0IGFkaGVyZSB0byB0aGVzZSBwcmluY2lwbGVzIGR1cmluZyBleGVjdXRpb246CiR7a2V5UHJpbmNpcGxlcy5tYXAoKHApID0+IGAtICR7cH1gKS5qb2luKCJcbiIpfQpgOwogICAgfQogICAgY2F0Y2ggewogICAgICAgIGxvZy53YXJuKCJDb3VsZCBub3QgbG9hZCBwcmluY2lwbGVzIOKAlCBwcm9jZWVkaW5nIHdpdGhvdXQgdGhlbSIpOwogICAgICAgIHJldHVybiAiIjsKICAgIH0KfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2NvcGUgY2VpbGluZyB2YWxpZGF0aW9uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKioKICogQ2hlY2sgdGhhdCBhIHdvcmtpbmcgZGlyZWN0b3J5IGZhbGxzIHdpdGhpbiB0aGUgc2NvcGUgY2VpbGluZy4KICogQm90aCBwYXRocyBhcmUgcmVzb2x2ZWQgdG8gYWJzb2x1dGUgYmVmb3JlIGNvbXBhcmlzb24uCiAqIFJldHVybnMgbnVsbCBpZiB2YWxpZCwgb3IgYSBkZW5pYWwgcmVhc29uIHN0cmluZyBpZiBvdXQgb2Ygc2NvcGUuCiAqLwpmdW5jdGlvbiB2YWxpZGF0ZVNjb3BlQ2VpbGluZyhjd2QsIGNlaWxpbmcpIHsKICAgIGlmICghY2VpbGluZykKICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm8gY2VpbGluZyA9IG5vIGNvbnN0cmFpbnQKICAgIGlmICghY3dkKQogICAgICAgIHJldHVybiBudWxsOyAvLyBObyBjd2QgPSB3aWxsIGRlZmF1bHQgdG8gcHJvY2Vzcy5jd2QoKSwgY2hlY2tlZCBhdCBzcGF3biB0aW1lCiAgICBjb25zdCByZXNvbHZlZEN3ZCA9IHJlc29sdmUoY3dkKS5yZXBsYWNlKC9cXC9nLCAiLyIpLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCByZXNvbHZlZENlaWxpbmcgPSByZXNvbHZlKGNlaWxpbmcpLnJlcGxhY2UoL1xcL2csICIvIikudG9Mb3dlckNhc2UoKTsKICAgIC8vIGN3ZCBtdXN0IGJlIGVxdWFsIHRvIG9yIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBjZWlsaW5nCiAgICBpZiAocmVzb2x2ZWRDd2QgPT09IHJlc29sdmVkQ2VpbGluZykKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGlmIChyZXNvbHZlZEN3ZC5zdGFydHNXaXRoKHJlc29sdmVkQ2VpbGluZyArICIvIikpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gYFNjb3BlIHZpb2xhdGlvbjogY3dkICIke2N3ZH0iIGVzY2FwZXMgY2VpbGluZyAiJHtjZWlsaW5nfSIuIEFnZW50cyBjYW5ub3Qgd2lkZW4gdGhlaXIgcGFyZW50J3Mgc2NvcGUuYDsKfQovKioKICogQ29tcHV0ZSB0aGUgZWZmZWN0aXZlIHNjb3BlIGNlaWxpbmcgZm9yIGEgY2hpbGQgYWdlbnQuCiAqIFRha2VzIHRoZSBuYXJyb3dlciBvZjogcGFyZW50J3MgY2VpbGluZyB2cyByZXF1ZXN0ZWQgY3dkLgogKiBJZiBubyBwYXJlbnQgY2VpbGluZyBleGlzdHMsIHRoZSBjd2QgaXRzZWxmIGJlY29tZXMgdGhlIGNlaWxpbmcuCiAqLwpleHBvcnQgZnVuY3Rpb24gbmFycm93U2NvcGVDZWlsaW5nKHBhcmVudENlaWxpbmcsIGN3ZCkgewogICAgY29uc3QgZWZmZWN0aXZlQ3dkID0gY3dkIHx8IHByb2Nlc3MuY3dkKCk7CiAgICBpZiAoIXBhcmVudENlaWxpbmcpCiAgICAgICAgcmV0dXJuIHJlc29sdmUoZWZmZWN0aXZlQ3dkKTsKICAgIGNvbnN0IHJlc29sdmVkQ3dkID0gcmVzb2x2ZShlZmZlY3RpdmVDd2QpLnJlcGxhY2UoL1xcL2csICIvIikudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IHJlc29sdmVkQ2VpbGluZyA9IHJlc29sdmUocGFyZW50Q2VpbGluZykucmVwbGFjZSgvXFwvZywgIi8iKS50b0xvd2VyQ2FzZSgpOwogICAgLy8gUmV0dXJuIHdoaWNoZXZlciBpcyBkZWVwZXIgKG1vcmUgc3BlY2lmaWMpCiAgICBpZiAocmVzb2x2ZWRDd2Quc3RhcnRzV2l0aChyZXNvbHZlZENlaWxpbmcgKyAiLyIpIHx8IHJlc29sdmVkQ3dkID09PSByZXNvbHZlZENlaWxpbmcpIHsKICAgICAgICByZXR1cm4gcmVzb2x2ZShlZmZlY3RpdmVDd2QpOyAvLyBjd2QgaXMgaW5zaWRlIGNlaWxpbmcg4oCUIHVzZSBjd2QgKG5hcnJvd2VyKQogICAgfQogICAgLy8gY3dkIGlzIG91dHNpZGUgY2VpbGluZyDigJQgdGhpcyBzaG91bGRuJ3QgaGFwcGVuIGlmIHZhbGlkYXRpb24gcnVucyBmaXJzdCwKICAgIC8vIGJ1dCByZXR1cm4gY2VpbGluZyBhcyB0aGUgc2FmZSBmYWxsYmFjawogICAgcmV0dXJuIHJlc29sdmUocGFyZW50Q2VpbGluZyk7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE1haW4gZ292ZXJuYW5jZSBnYXRlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKioKICogUnVuIHRoZSBnb3Zlcm5hbmNlIGdhdGUgYmVmb3JlIHNwYXduaW5nIGFuIGFnZW50LgogKiBSZXR1cm5zIGEgR292ZXJuYW5jZURlY2lzaW9uIHdpdGggdGhlIGdvdmVybmVkIHByb21wdCAob3IgZGVuaWFsKS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnb3Zlcm5hbmNlR2F0ZShvcHRzKSB7CiAgICBjb25zdCB7IHRhc2tJZCwgbGFiZWwsIHByb21wdCwgb3JpZ2luLCBsdG0sIHNjb3BlOiBzY29wZU92ZXJyaWRlLCB2b3VjaGVyVHRsTWludXRlcyA9IDMwLCBza2lwVm91Y2hlciA9IGZhbHNlLCB9ID0gb3B0czsKICAgIGNvbnN0IHNjb3BlID0gc2NvcGVPdmVycmlkZSA/PyBgYWdlbnQ6c3Bhd246JHt0YXNrSWR9YDsKICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgIC8vIDAuIFNjb3BlIGNlaWxpbmcgY2hlY2sg4oCUIGJlZm9yZSBhbnl0aGluZyBlbHNlCiAgICBjb25zdCBzY29wZVZpb2xhdGlvbiA9IHZhbGlkYXRlU2NvcGVDZWlsaW5nKG9wdHMuY3dkLCBvcHRzLnNjb3BlQ2VpbGluZyk7CiAgICBpZiAoc2NvcGVWaW9sYXRpb24pIHsKICAgICAgICBsb2cud2FybihzY29wZVZpb2xhdGlvbiwgeyB0YXNrSWQsIGN3ZDogb3B0cy5jd2QsIGNlaWxpbmc6IG9wdHMuc2NvcGVDZWlsaW5nIH0pOwogICAgICAgIGNvbnN0IGF1ZGl0RW50cnkgPSB7CiAgICAgICAgICAgIHRpbWVzdGFtcCwKICAgICAgICAgICAgdGFza0lkLAogICAgICAgICAgICBsYWJlbCwKICAgICAgICAgICAgZGVjaXNpb246ICJkZW55IiwKICAgICAgICAgICAgbG9ja2VkUGF0aENvdW50OiAwLAogICAgICAgICAgICByZWFzb246IHNjb3BlVmlvbGF0aW9uLAogICAgICAgIH07CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBHb3Zlcm5hbmNlIERFTklFRCAoc2NvcGUgY2VpbGluZyk6ICR7bGFiZWx9YCwKICAgICAgICAgICAgZGV0YWlsOiBzY29wZVZpb2xhdGlvbiwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6IG9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgIHJlYXNvbjogImdvdmVybmFuY2UtZ2F0ZSIsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYWxsb3dlZDogZmFsc2UsCiAgICAgICAgICAgIGRlbmllZFJlYXNvbjogc2NvcGVWaW9sYXRpb24sCiAgICAgICAgICAgIGdvdmVybmVkUHJvbXB0OiBwcm9tcHQsCiAgICAgICAgICAgIGxvY2tlZFBhdGhzOiBbXSwKICAgICAgICAgICAgYXVkaXRFbnRyeSwKICAgICAgICB9OwogICAgfQogICAgLy8gMS4gTG9hZCBsb2NrZWQgcGF0aHMKICAgIGNvbnN0IGxvY2tlZFBhdGhzID0gYXdhaXQgbG9hZExvY2tlZFBhdGhzKCk7CiAgICAvLyAxYi4gU3Bhd24gcG9saWN5IGNoZWNrIChpZiBhZ2VudFR5cGUgcHJvdmlkZWQpCiAgICBpZiAob3B0cy5hZ2VudFR5cGUpIHsKICAgICAgICBhd2FpdCBsb2FkU3Bhd25Qb2xpY3koKTsKICAgICAgICBjb25zdCBzcGF3bkNoZWNrID0gY2hlY2tTcGF3blBvbGljeShvcHRzLmFnZW50VHlwZSwgb3B0cy5jdXJyZW50QWdlbnRDb3VudCA/PyAwLCBvcHRzLmN1cnJlbnRUeXBlQ291bnQgPz8gMCk7CiAgICAgICAgaWYgKCFzcGF3bkNoZWNrLmFsbG93ZWQpIHsKICAgICAgICAgICAgY29uc3QgcmVhc29uID0gYFNwYXduIHBvbGljeSBkZW5pZWQ6ICR7c3Bhd25DaGVjay5yZWFzb259YDsKICAgICAgICAgICAgbG9nLndhcm4ocmVhc29uLCB7IHRhc2tJZCwgYWdlbnRUeXBlOiBvcHRzLmFnZW50VHlwZSB9KTsKICAgICAgICAgICAgY29uc3QgYXVkaXRFbnRyeSA9IHsKICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgIHRhc2tJZCwKICAgICAgICAgICAgICAgIGxhYmVsLAogICAgICAgICAgICAgICAgZGVjaXNpb246ICJkZW55IiwKICAgICAgICAgICAgICAgIGxvY2tlZFBhdGhDb3VudDogbG9ja2VkUGF0aHMubGVuZ3RoLAogICAgICAgICAgICAgICAgcmVhc29uLAogICAgICAgICAgICB9OwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgR292ZXJuYW5jZSBERU5JRUQgKHNwYXduIHBvbGljeSk6ICR7bGFiZWx9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogcmVhc29uLAogICAgICAgICAgICAgICAgYWN0aW9uTGFiZWw6IG9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgICAgICByZWFzb246ICJnb3Zlcm5hbmNlLWdhdGUiLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGFsbG93ZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgZGVuaWVkUmVhc29uOiByZWFzb24sCiAgICAgICAgICAgICAgICBnb3Zlcm5lZFByb21wdDogcHJvbXB0LAogICAgICAgICAgICAgICAgbG9ja2VkUGF0aHMsCiAgICAgICAgICAgICAgICBhdWRpdEVudHJ5LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIC8vIDIuIElzc3VlIHZvdWNoZXIgKHVubGVzcyBza2lwcGVkIGZvciBzeXN0ZW0gdGFza3MpCiAgICBsZXQgdm91Y2hlclRva2VuOwogICAgaWYgKCFza2lwVm91Y2hlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZvdWNoZXJUb2tlbiA9IGF3YWl0IGlzc3VlVm91Y2hlcihsdG0sIHNjb3BlLCB2b3VjaGVyVHRsTWludXRlcyk7CiAgICAgICAgICAgIGxvZy5pbmZvKCJWb3VjaGVyIGlzc3VlZCBmb3IgYWdlbnQiLCB7IHRhc2tJZCwgdG9rZW46IHZvdWNoZXJUb2tlbiwgc2NvcGUgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc3QgcmVhc29uID0gYFZvdWNoZXIgaXNzdWFuY2UgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gOwogICAgICAgICAgICBsb2cuZXJyb3IocmVhc29uLCB7IHRhc2tJZCB9KTsKICAgICAgICAgICAgY29uc3QgYXVkaXRFbnRyeSA9IHsKICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgIHRhc2tJZCwKICAgICAgICAgICAgICAgIGxhYmVsLAogICAgICAgICAgICAgICAgZGVjaXNpb246ICJkZW55IiwKICAgICAgICAgICAgICAgIGxvY2tlZFBhdGhDb3VudDogbG9ja2VkUGF0aHMubGVuZ3RoLAogICAgICAgICAgICAgICAgcmVhc29uLAogICAgICAgICAgICB9OwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgR292ZXJuYW5jZSBERU5JRUQ6ICR7bGFiZWx9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogcmVhc29uLAogICAgICAgICAgICAgICAgYWN0aW9uTGFiZWw6IG9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgICAgICByZWFzb246ICJnb3Zlcm5hbmNlLWdhdGUiLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGFsbG93ZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgZGVuaWVkUmVhc29uOiByZWFzb24sCiAgICAgICAgICAgICAgICBnb3Zlcm5lZFByb21wdDogcHJvbXB0LAogICAgICAgICAgICAgICAgbG9ja2VkUGF0aHMsCiAgICAgICAgICAgICAgICBhdWRpdEVudHJ5LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIC8vIDMuIExvYWQgcHJpbmNpcGxlcwogICAgY29uc3QgcHJpbmNpcGxlc1NlY3Rpb24gPSBhd2FpdCBsb2FkUHJpbmNpcGxlcygpOwogICAgLy8gNC4gQnVpbGQgZ292ZXJuZWQgcHJvbXB0CiAgICBjb25zdCBzY29wZVNlY3Rpb24gPSBvcHRzLnNjb3BlQ2VpbGluZwogICAgICAgID8gYFxuIyMgU2NvcGUgQ2VpbGluZ1xuWW91IG1heSBvbmx5IG9wZXJhdGUgd2l0aGluOiBcYCR7cmVzb2x2ZShvcHRzLnNjb3BlQ2VpbGluZyl9XGBcbkRvIE5PVCByZWFkLCB3cml0ZSwgb3IgYWNjZXNzIGZpbGVzIG91dHNpZGUgdGhpcyBkaXJlY3RvcnkuIFN1Yi1hZ2VudHNcbnlvdSBzcGF3biBpbmhlcml0IHRoaXMgY2VpbGluZyBhbmQgY2Fubm90IHdpZGVuIGl0LlxuYAogICAgICAgIDogIiI7CiAgICBjb25zdCBnb3Zlcm5hbmNlUHJlYW1ibGUgPSBbCiAgICAgICAgIiMjIEdvdmVybmFuY2UgQ29udGV4dCIsCiAgICAgICAgIlRoaXMgYWdlbnQgc2Vzc2lvbiBpcyBnb3Zlcm5lZCBieSB0aGUgQ29yZSBvcmNoZXN0cmF0aW9uIHN5c3RlbS4iLAogICAgICAgICJZb3UgYXJlIHJ1bm5pbmcgd2l0aCBgLS1kYW5nZXJvdXNseS1za2lwLXBlcm1pc3Npb25zYC4gSW4gZXhjaGFuZ2UsIiwKICAgICAgICAiZ292ZXJuYW5jZSBjb250cm9scyByZXBsYWNlIHRoZSBwZXJtaXNzaW9uIHByb21wdC4gVmlvbGF0aW5nIHRoZXNlIiwKICAgICAgICAiY29udHJvbHMgd2lsbCB0ZXJtaW5hdGUgeW91ciBzZXNzaW9uLiIsCiAgICAgICAgIiIsCiAgICAgICAgdm91Y2hlclRva2VuID8gYnVpbGRWb3VjaGVyU2VjdGlvbih2b3VjaGVyVG9rZW4sIHNjb3BlKSA6ICIiLAogICAgICAgIHNjb3BlU2VjdGlvbiwKICAgICAgICBidWlsZExvY2tlZFBhdGhzU2VjdGlvbihsb2NrZWRQYXRocyksCiAgICAgICAgcHJpbmNpcGxlc1NlY3Rpb24sCiAgICAgICAgIiMjIEhlYXJ0YmVhdCBSZXF1aXJlbWVudCIsCiAgICAgICAgIllvdXIgYWN0aW9ucyBhcmUgbW9uaXRvcmVkLiBFeHRlbmRlZCBzaWxlbmNlIChubyBmaWxlIHdyaXRlcywgbm8gb3V0cHV0KSIsCiAgICAgICAgIndpbGwgdHJpZ2dlciBhIHRpbWVvdXQgYW5kIHRlcm1pbmF0aW9uLiBTdGF5IG9uIHRhc2suIiwKICAgICAgICAiIiwKICAgICAgICAiLS0tIiwKICAgICAgICAiIiwKICAgIF0KICAgICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgICAgLmpvaW4oIlxuIik7CiAgICBjb25zdCBnb3Zlcm5lZFByb21wdCA9IGdvdmVybmFuY2VQcmVhbWJsZSArIHByb21wdDsKICAgIC8vIDUuIExvZyB0aGUgZGVjaXNpb24KICAgIGNvbnN0IGF1ZGl0RW50cnkgPSB7CiAgICAgICAgdGltZXN0YW1wLAogICAgICAgIHRhc2tJZCwKICAgICAgICBsYWJlbCwKICAgICAgICBkZWNpc2lvbjogImFsbG93IiwKICAgICAgICB2b3VjaGVyVG9rZW4sCiAgICAgICAgdm91Y2hlclNjb3BlOiBzY29wZSwKICAgICAgICBsb2NrZWRQYXRoQ291bnQ6IGxvY2tlZFBhdGhzLmxlbmd0aCwKICAgIH07CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgIHN1bW1hcnk6IGBHb3Zlcm5hbmNlIEFMTE9XRUQ6ICR7bGFiZWx9YCwKICAgICAgICBkZXRhaWw6IGBWb3VjaGVyOiAke3ZvdWNoZXJUb2tlbiA/PyAic2tpcHBlZCJ9LCBsb2NrZWQgcGF0aHM6ICR7bG9ja2VkUGF0aHMubGVuZ3RofWAsCiAgICAgICAgYWN0aW9uTGFiZWw6IG9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgcmVhc29uOiAiZ292ZXJuYW5jZS1nYXRlIiwKICAgIH0pOwogICAgbG9nLmluZm8oIkdvdmVybmFuY2UgZ2F0ZSBwYXNzZWQiLCB7IHRhc2tJZCwgbGFiZWwsIHZvdWNoZXJUb2tlbiB9KTsKICAgIHJldHVybiB7CiAgICAgICAgYWxsb3dlZDogdHJ1ZSwKICAgICAgICB2b3VjaGVyVG9rZW4sCiAgICAgICAgZ292ZXJuZWRQcm9tcHQsCiAgICAgICAgbG9ja2VkUGF0aHMsCiAgICAgICAgYXVkaXRFbnRyeSwKICAgIH07Cn0KLyoqCiAqIFJldm9rZSBhIGdvdmVybmFuY2Ugdm91Y2hlciAoY2FsbCBvbiBhZ2VudCBjb21wbGV0aW9uIG9yIHRlcm1pbmF0aW9uKS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXZva2VHb3Zlcm5hbmNlVm91Y2hlcihsdG0sIHRva2VuKSB7CiAgICB0cnkgewogICAgICAgIGF3YWl0IHJldm9rZVZvdWNoZXIobHRtLCB0b2tlbik7CiAgICAgICAgbG9nLmluZm8oIkdvdmVybmFuY2Ugdm91Y2hlciByZXZva2VkIiwgeyB0b2tlbiB9KTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cud2FybigiRmFpbGVkIHRvIHJldm9rZSB2b3VjaGVyIiwgewogICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSwKICAgICAgICB9KTsKICAgIH0KfQovKioKICogVmFsaWRhdGUgdGhhdCBhIHZvdWNoZXIgaXMgc3RpbGwgYWN0aXZlIChmb3IgbWlkLXNlc3Npb24gY2hlY2tzKS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUdvdmVybmFuY2VWb3VjaGVyKGx0bSwgdG9rZW4pIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrVm91Y2hlcihsdG0sIHRva2VuKTsKICAgIHJldHVybiByZXN1bHQudmFsaWQ7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z292ZXJuYW5jZS5qcy5tYXA=","agents/spawn-policy.js":"LyoqCiAqIFNwYXduIFBvbGljeSBMb2FkZXIg4oCUIGdvdmVybnMgd2hhdCBhZ2VudCB0eXBlcyBjYW4gYmUgc3Bhd25lZCBhbmQgaG93IG1hbnkuCiAqCiAqIFJlYWRzIGJyYWluL3RlbXBsYXRlcy9zcGF3bi1wb2xpY3kueWFtbCAob3IgaW5zdGFuY2Utc3BlY2lmaWMgcGF0aCkuCiAqIFByb3ZpZGVzIGNoZWNrU3Bhd25Qb2xpY3koKSBmb3IgdGhlIGdvdmVybmFuY2UgZ2F0ZSB0byBjYWxsIGJlZm9yZSBzcGF3bi4KICoKICogSGFuZC1yb2xsZWQgWUFNTCBwYXJzZXIgKG5vIGV4dGVybmFsIGRlcHMpLgogKi8KaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSAibm9kZTpmcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImFnZW50cy5zcGF3bi1wb2xpY3kiKTsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKY29uc3QgREVGQVVMVF9QT0xJQ1lfUEFUSCA9IGpvaW4oQlJBSU5fRElSLCAidGVtcGxhdGVzIiwgInNwYXduLXBvbGljeS55YW1sIik7Ci8vIOKUgOKUgCBDYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IGNhY2hlZCA9IG51bGw7Ci8vIOKUgOKUgCBZQU1MIHBhcnNlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gcGFyc2VTcGF3blBvbGljeShyYXcpIHsKICAgIGNvbnN0IGxpbmVzID0gcmF3LnNwbGl0KCJcbiIpOwogICAgbGV0IG93bmVyID0gIiI7CiAgICBsZXQgZ292ZXJuZWRCeSA9ICIiOwogICAgbGV0IG1heEFnZW50cyA9IDQ7CiAgICBsZXQgcmVxdWlyZU93bmVyQXBwcm92YWwgPSB0cnVlOwogICAgY29uc3QgYWxsb3dlZFR5cGVzID0gbmV3IE1hcCgpOwogICAgY29uc3QgZGVueVR5cGVzID0gW107CiAgICBsZXQgc2VjdGlvbiA9ICJyb290IjsKICAgIGxldCBjdXJyZW50VHlwZSA9ICIiOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbUVuZCgpOwogICAgICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLm1hdGNoKC9eXHMqIy8pKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCBpbmRlbnQgPSAobGluZS5tYXRjaCgvXihccyopLykgPz8gWyIiLCAiIl0pWzFdLmxlbmd0aDsKICAgICAgICAvLyBUb3AtbGV2ZWwga2V5OiB2YWx1ZQogICAgICAgIGlmIChpbmRlbnQgPT09IDApIHsKICAgICAgICAgICAgY29uc3Qga3YgPSB0cmltbWVkLm1hdGNoKC9eKFx3W1x3X10qKVxzKjpccyooLispJC8pOwogICAgICAgICAgICBpZiAoa3YpIHsKICAgICAgICAgICAgICAgIGNvbnN0IFssIGtleSwgdmFsXSA9IGt2OwogICAgICAgICAgICAgICAgY29uc3QgdW5xdW90ZWQgPSB2YWwucmVwbGFjZSgvXlsiJ118WyInXSQvZywgIiIpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICJvd25lciIpCiAgICAgICAgICAgICAgICAgICAgb3duZXIgPSB1bnF1b3RlZDsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gImdvdmVybmVkX2J5IikKICAgICAgICAgICAgICAgICAgICBnb3Zlcm5lZEJ5ID0gdW5xdW90ZWQ7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09ICJtYXhfYWdlbnRzIikKICAgICAgICAgICAgICAgICAgICBtYXhBZ2VudHMgPSBwYXJzZUludCh1bnF1b3RlZCwgMTApIHx8IDQ7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09ICJyZXF1aXJlX293bmVyX2FwcHJvdmFsIikKICAgICAgICAgICAgICAgICAgICByZXF1aXJlT3duZXJBcHByb3ZhbCA9IHVucXVvdGVkID09PSAidHJ1ZSI7CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gInJvb3QiOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2VjdGlvbiBoZWFkZXIKICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IHRyaW1tZWQubWF0Y2goL14oXHdbXHdfXSopXHMqOlxzKiQvKTsKICAgICAgICAgICAgaWYgKHNlY3Rpb25IZWFkZXIpIHsKICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uSGVhZGVyWzFdID09PSAiYWxsb3dlZF90eXBlcyIpCiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9ICJhbGxvd2VkX3R5cGVzIjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlY3Rpb25IZWFkZXJbMV0gPT09ICJkZW55X3R5cGVzIikKICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID0gImRlbnlfdHlwZXMiOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPSAicm9vdCI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBVbmRlciBhbGxvd2VkX3R5cGVzIOKAlCB0eXBlIG5hbWUgaGVhZGVycyAoaW5kZW50IDIpCiAgICAgICAgaWYgKHNlY3Rpb24gPT09ICJhbGxvd2VkX3R5cGVzIiAmJiBpbmRlbnQgPj0gMikgewogICAgICAgICAgICBjb25zdCB0eXBlSGVhZGVyID0gdHJpbW1lZC50cmltKCkubWF0Y2goL14oW1x3LV0rKVxzKjpccyokLyk7CiAgICAgICAgICAgIGlmICh0eXBlSGVhZGVyKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50VHlwZSA9IHR5cGVIZWFkZXJbMV07CiAgICAgICAgICAgICAgICBhbGxvd2VkVHlwZXMuc2V0KGN1cnJlbnRUeXBlLCB7IG1heDogMSwgYXV0b1NwYXduOiBmYWxzZSB9KTsKICAgICAgICAgICAgICAgIHNlY3Rpb24gPSAiYWxsb3dlZF90eXBlX2VudHJ5IjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVuZGVyIGEgc3BlY2lmaWMgYWxsb3dlZCB0eXBlIGVudHJ5IChpbmRlbnQgNCkKICAgICAgICBpZiAoc2VjdGlvbiA9PT0gImFsbG93ZWRfdHlwZV9lbnRyeSIgJiYgaW5kZW50ID49IDQpIHsKICAgICAgICAgICAgY29uc3Qga3YgPSB0cmltbWVkLnRyaW0oKS5tYXRjaCgvXihcd1tcd19dKilccyo6XHMqKC4rKSQvKTsKICAgICAgICAgICAgaWYgKGt2KSB7CiAgICAgICAgICAgICAgICBjb25zdCBbLCBrZXksIHZhbF0gPSBrdjsKICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYWxsb3dlZFR5cGVzLmdldChjdXJyZW50VHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAibWF4IikKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubWF4ID0gcGFyc2VJbnQodmFsLCAxMCkgfHwgMTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09ICJhdXRvX3NwYXduIikKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuYXV0b1NwYXduID0gdmFsLnRyaW0oKSA9PT0gInRydWUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTmV3IHR5cGUgaGVhZGVyIGF0IGluZGVudCAyIOKAlCBnbyBiYWNrIHRvIGFsbG93ZWRfdHlwZXMKICAgICAgICAgICAgY29uc3QgdHlwZUhlYWRlciA9IHRyaW1tZWQudHJpbSgpLm1hdGNoKC9eKFtcdy1dKylccyo6XHMqJC8pOwogICAgICAgICAgICBpZiAodHlwZUhlYWRlcikgewogICAgICAgICAgICAgICAgY3VycmVudFR5cGUgPSB0eXBlSGVhZGVyWzFdOwogICAgICAgICAgICAgICAgYWxsb3dlZFR5cGVzLnNldChjdXJyZW50VHlwZSwgeyBtYXg6IDEsIGF1dG9TcGF3bjogZmFsc2UgfSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBkZW55X3R5cGVzIGxpc3QgaXRlbXMKICAgICAgICBpZiAoc2VjdGlvbiA9PT0gImRlbnlfdHlwZXMiKSB7CiAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gdHJpbW1lZC5tYXRjaCgvXlxzKy1ccysoLispJC8pOwogICAgICAgICAgICBpZiAobGlzdEl0ZW0pIHsKICAgICAgICAgICAgICAgIGRlbnlUeXBlcy5wdXNoKGxpc3RJdGVtWzFdLnJlcGxhY2UoL15bIiddfFsiJ10kL2csICIiKS50cmltKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgb3duZXIsIGdvdmVybmVkQnksIG1heEFnZW50cywgYWxsb3dlZFR5cGVzLCBkZW55VHlwZXMsIHJlcXVpcmVPd25lckFwcHJvdmFsIH07Cn0KLy8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBMb2FkIGFuZCBjYWNoZSB0aGUgc3Bhd24gcG9saWN5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTcGF3blBvbGljeShwb2xpY3lQYXRoKSB7CiAgICBpZiAoY2FjaGVkKQogICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICBjb25zdCBmaWxlUGF0aCA9IHBvbGljeVBhdGggPz8gREVGQVVMVF9QT0xJQ1lfUEFUSDsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICJ1dGYtOCIpOwogICAgICAgIGNhY2hlZCA9IHBhcnNlU3Bhd25Qb2xpY3kocmF3KTsKICAgICAgICBsb2cuaW5mbygiU3Bhd24gcG9saWN5IGxvYWRlZCIsIHsKICAgICAgICAgICAgbWF4QWdlbnRzOiBjYWNoZWQubWF4QWdlbnRzLAogICAgICAgICAgICBhbGxvd2VkVHlwZXM6IEFycmF5LmZyb20oY2FjaGVkLmFsbG93ZWRUeXBlcy5rZXlzKCkpLAogICAgICAgICAgICBkZW55VHlwZXM6IGNhY2hlZC5kZW55VHlwZXMsCiAgICAgICAgfSk7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgaWYgKGVyci5jb2RlID09PSAiRU5PRU5UIikgewogICAgICAgICAgICBsb2cud2FybigiTm8gc3Bhd24tcG9saWN5LnlhbWwgZm91bmQg4oCUIHVzaW5nIHBlcm1pc3NpdmUgZGVmYXVsdHMiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gcGFyc2Ugc3Bhd24tcG9saWN5LnlhbWwiLCB7IGVycm9yOiBlcnIubWVzc2FnZSB9KTsKICAgICAgICB9CiAgICAgICAgY2FjaGVkID0gewogICAgICAgICAgICBvd25lcjogIiIsCiAgICAgICAgICAgIGdvdmVybmVkQnk6ICIiLAogICAgICAgICAgICBtYXhBZ2VudHM6IDQsCiAgICAgICAgICAgIGFsbG93ZWRUeXBlczogbmV3IE1hcCgpLAogICAgICAgICAgICBkZW55VHlwZXM6IFtdLAogICAgICAgICAgICByZXF1aXJlT3duZXJBcHByb3ZhbDogZmFsc2UsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBjYWNoZWQ7Cn0KLyoqCiAqIEdldCB0aGUgY2FjaGVkIHNwYXduIHBvbGljeSAobG9hZHMgc3luY2hyb25vdXNseSBpZiBub3QgY2FjaGVkKS4KICovCmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blBvbGljeSgpIHsKICAgIGlmICghY2FjaGVkKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGV4aXN0c1N5bmMoREVGQVVMVF9QT0xJQ1lfUEFUSCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhERUZBVUxUX1BPTElDWV9QQVRILCAidXRmLTgiKTsKICAgICAgICAgICAgICAgIGNhY2hlZCA9IHBhcnNlU3Bhd25Qb2xpY3kocmF3KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0cwogICAgICAgIH0KICAgICAgICBpZiAoIWNhY2hlZCkgewogICAgICAgICAgICBjYWNoZWQgPSB7CiAgICAgICAgICAgICAgICBvd25lcjogIiIsCiAgICAgICAgICAgICAgICBnb3Zlcm5lZEJ5OiAiIiwKICAgICAgICAgICAgICAgIG1heEFnZW50czogNCwKICAgICAgICAgICAgICAgIGFsbG93ZWRUeXBlczogbmV3IE1hcCgpLAogICAgICAgICAgICAgICAgZGVueVR5cGVzOiBbXSwKICAgICAgICAgICAgICAgIHJlcXVpcmVPd25lckFwcHJvdmFsOiBmYWxzZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FjaGVkOwp9Ci8qKgogKiBDaGVjayB3aGV0aGVyIHNwYXduaW5nIGFuIGFnZW50IG9mIHRoZSBnaXZlbiB0eXBlIGlzIGFsbG93ZWQuCiAqCiAqIEBwYXJhbSBhZ2VudFR5cGUgICAtIFRoZSBhZ2VudCB0eXBlIHRvIHNwYXduIChlLmcuICJhZG1pbmlzdHJhdGlvbiIsICJicmFuZCIpCiAqIEBwYXJhbSBjdXJyZW50Q291bnQgLSBUb3RhbCBudW1iZXIgb2YgY3VycmVudGx5IHJ1bm5pbmcgYWdlbnRzCiAqIEBwYXJhbSB0eXBlQ291bnQgICAgLSBOdW1iZXIgb2YgY3VycmVudGx5IHJ1bm5pbmcgYWdlbnRzIG9mIHRoaXMgc3BlY2lmaWMgdHlwZQogKi8KZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU3Bhd25Qb2xpY3koYWdlbnRUeXBlLCBjdXJyZW50Q291bnQsIHR5cGVDb3VudCkgewogICAgY29uc3QgcG9saWN5ID0gZ2V0U3Bhd25Qb2xpY3koKTsKICAgIC8vIENoZWNrIGRlbnkgbGlzdAogICAgaWYgKHBvbGljeS5kZW55VHlwZXMuaW5jbHVkZXMoYWdlbnRUeXBlKSkgewogICAgICAgIHJldHVybiB7IGFsbG93ZWQ6IGZhbHNlLCByZWFzb246IGBBZ2VudCB0eXBlICIke2FnZW50VHlwZX0iIGlzIGRlbmllZCBieSBzcGF3biBwb2xpY3lgIH07CiAgICB9CiAgICAvLyBDaGVjayBnbG9iYWwgbWF4CiAgICBpZiAoY3VycmVudENvdW50ID49IHBvbGljeS5tYXhBZ2VudHMpIHsKICAgICAgICByZXR1cm4geyBhbGxvd2VkOiBmYWxzZSwgcmVhc29uOiBgTWF4IGFnZW50cyByZWFjaGVkICgke3BvbGljeS5tYXhBZ2VudHN9KWAgfTsKICAgIH0KICAgIC8vIENoZWNrIHR5cGUtc3BlY2lmaWMgbWF4CiAgICBjb25zdCB0eXBlQ29uZmlnID0gcG9saWN5LmFsbG93ZWRUeXBlcy5nZXQoYWdlbnRUeXBlKTsKICAgIGlmICh0eXBlQ29uZmlnICYmIHR5cGVDb3VudCA+PSB0eXBlQ29uZmlnLm1heCkgewogICAgICAgIHJldHVybiB7IGFsbG93ZWQ6IGZhbHNlLCByZWFzb246IGBNYXggIiR7YWdlbnRUeXBlfSIgYWdlbnRzIHJlYWNoZWQgKCR7dHlwZUNvbmZpZy5tYXh9KWAgfTsKICAgIH0KICAgIC8vIElmIHRoZSB0eXBlIGlzbid0IGluIGFsbG93ZWRfdHlwZXMgYW5kIHRoZSBtYXAgaXMgbm9uLWVtcHR5LCBpdCdzIGltcGxpY2l0bHkgZGVuaWVkCiAgICBpZiAocG9saWN5LmFsbG93ZWRUeXBlcy5zaXplID4gMCAmJiAhdHlwZUNvbmZpZykgewogICAgICAgIHJldHVybiB7IGFsbG93ZWQ6IGZhbHNlLCByZWFzb246IGBBZ2VudCB0eXBlICIke2FnZW50VHlwZX0iIGlzIG5vdCBpbiBhbGxvd2VkX3R5cGVzYCB9OwogICAgfQogICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSB9Owp9Ci8qKgogKiBGb3JjZSByZWxvYWQgb2Ygc3Bhd24gcG9saWN5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbG9hZFNwYXduUG9saWN5KHBvbGljeVBhdGgpIHsKICAgIGNhY2hlZCA9IG51bGw7CiAgICByZXR1cm4gbG9hZFNwYXduUG9saWN5KHBvbGljeVBhdGgpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXduLXBvbGljeS5qcy5tYXA=","agents/runtime/bus.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIEludGVyLWFnZW50IGV2ZW50IGJ1cy4KICoKICogRXZlbnRFbWl0dGVyLWJhc2VkIHB1Yi9zdWIgd2l0aCB0eXBlZCBldmVudHMsIG1lc3NhZ2Ugcm91dGluZywKICogYW5kIHJlcXVlc3QvcmVzcG9uc2UgY29ycmVsYXRpb24gcGF0dGVybnMuCiAqLwppbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICJub2RlOmV2ZW50cyI7CmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAibm9kZTpjcnlwdG8iOwpleHBvcnQgY2xhc3MgUnVudGltZUJ1cyB7CiAgICBlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgLyoqIFBlbmRpbmcgcmVxdWVzdC9yZXNwb25zZSBjYWxsYmFja3Mga2V5ZWQgYnkgY29ycmVsYXRpb25JZC4gKi8KICAgIHBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXAoKTsKICAgIC8qKiBQZXItYWdlbnQgbWVzc2FnZSBzdWJzY3JpcHRpb25zLiAqLwogICAgYWdlbnRTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLy8gUHJldmVudCBtZW1vcnkgbGVhayB3YXJuaW5ncyBmb3IgbWFueSBhZ2VudCBsaXN0ZW5lcnMKICAgICAgICB0aGlzLmVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKDIwMCk7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBUeXBlZCBwdWIvc3ViIGZvciBydW50aW1lIGV2ZW50cwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgb24oZXZlbnQsIGhhbmRsZXIpIHsKICAgICAgICB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGhhbmRsZXIpOwogICAgfQogICAgb2ZmKGV2ZW50LCBoYW5kbGVyKSB7CiAgICAgICAgdGhpcy5lbWl0dGVyLm9mZihldmVudCwgaGFuZGxlcik7CiAgICB9CiAgICBvbmNlKGV2ZW50LCBoYW5kbGVyKSB7CiAgICAgICAgdGhpcy5lbWl0dGVyLm9uY2UoZXZlbnQsIGhhbmRsZXIpOwogICAgfQogICAgZW1pdChldmVudCwgZGF0YSkgewogICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KGV2ZW50LCBkYXRhKTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVyLWFnZW50IG1lc3NhZ2luZwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIFNlbmQgYSBtZXNzYWdlIHRvIGEgc3BlY2lmaWMgYWdlbnQgb3IgYnJvYWRjYXN0IHRvIGFsbC4gKi8KICAgIHNlbmQobWVzc2FnZSkgewogICAgICAgIGNvbnN0IGZ1bGwgPSB7CiAgICAgICAgICAgIC4uLm1lc3NhZ2UsCiAgICAgICAgICAgIGlkOiBnZW5lcmF0ZU1lc3NhZ2VJZCgpLAogICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICB9OwogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByZXNwb25zZSB0byBhIHBlbmRpbmcgcmVxdWVzdAogICAgICAgIGlmIChmdWxsLmNvcnJlbGF0aW9uSWQgJiYgdGhpcy5wZW5kaW5nUmVxdWVzdHMuaGFzKGZ1bGwuY29ycmVsYXRpb25JZCkpIHsKICAgICAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChmdWxsLmNvcnJlbGF0aW9uSWQpOwogICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUoZnVsbC5jb3JyZWxhdGlvbklkKTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHBlbmRpbmcudGltZXIpOwogICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUoZnVsbCk7CiAgICAgICAgfQogICAgICAgIC8vIEVtaXQgb24gdGhlIGJ1cyBmb3IgbGlzdGVuZXJzCiAgICAgICAgdGhpcy5lbWl0KCJhZ2VudDptZXNzYWdlIiwgZnVsbCk7CiAgICAgICAgcmV0dXJuIGZ1bGw7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgYSByZXF1ZXN0IGFuZCB3YWl0IGZvciBhIGNvcnJlbGF0ZWQgcmVzcG9uc2UuCiAgICAgKiBUaW1lcyBvdXQgYWZ0ZXIgdGltZW91dE1zIChkZWZhdWx0IDMwcykuCiAgICAgKi8KICAgIHJlcXVlc3QobWVzc2FnZSwgdGltZW91dE1zID0gMzBfMDAwKSB7CiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGdlbmVyYXRlTWVzc2FnZUlkKCk7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShjb3JyZWxhdGlvbklkKTsKICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFJlcXVlc3QgdG8gJHttZXNzYWdlLnRvfSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgKSk7CiAgICAgICAgICAgIH0sIHRpbWVvdXRNcyk7CiAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLnNldChjb3JyZWxhdGlvbklkLCB7IHJlc29sdmUsIHJlamVjdCwgdGltZXIgfSk7CiAgICAgICAgICAgIC8vIEVtaXQgdGhlIG91dGJvdW5kIHJlcXVlc3QgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyBzZW5kKCkgdG8gYXZvaWQKICAgICAgICAgICAgLy8gc2VuZCgpJ3MgY29ycmVsYXRpb25JZCBjaGVjayByZXNvbHZpbmcgdGhlIHBlbmRpbmcgcmVxdWVzdCBpbW1lZGlhdGVseQogICAgICAgICAgICBjb25zdCBvdXRib3VuZCA9IHsKICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkLAogICAgICAgICAgICAgICAgaWQ6IGdlbmVyYXRlTWVzc2FnZUlkKCksCiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5lbWl0KCJhZ2VudDptZXNzYWdlIiwgb3V0Ym91bmQpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBTdWJzY3JpYmUgYW4gYWdlbnQgdG8gcmVjZWl2ZSBtZXNzYWdlcy4gV2hlbiBhIG1lc3NhZ2UgaXMgc2VudCB0bwogICAgICogdGhpcyBhZ2VudCdzIElEIChvciBicm9hZGNhc3QgdG8gIioiKSwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgogICAgICovCiAgICBzdWJzY3JpYmUoYWdlbnRJZCwgaGFuZGxlcikgewogICAgICAgIGlmICghdGhpcy5hZ2VudFN1YnNjcmlwdGlvbnMuaGFzKGFnZW50SWQpKSB7CiAgICAgICAgICAgIHRoaXMuYWdlbnRTdWJzY3JpcHRpb25zLnNldChhZ2VudElkLCBuZXcgU2V0KCkpOwogICAgICAgIH0KICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IChtc2cpID0+IHsKICAgICAgICAgICAgaWYgKG1zZy50byA9PT0gYWdlbnRJZCB8fCBtc2cudG8gPT09ICIqIikgewogICAgICAgICAgICAgICAgLy8gU2tpcCBleHBpcmVkIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICBpZiAobXNnLnR0bE1zKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKG1zZy50aW1lc3RhbXApLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWdlID4gbXNnLnR0bE1zKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYW5kbGVyKG1zZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8vIFN0b3JlIGEga2V5IGZvciB0aGUgaGFuZGxlciBzbyB3ZSBjYW4gY2xlYW4gdXAKICAgICAgICBjb25zdCBoYW5kbGVyS2V5ID0gYG1zZzoke2FnZW50SWR9YDsKICAgICAgICB0aGlzLmVtaXR0ZXIub24oaGFuZGxlcktleSwgd3JhcHBlZEhhbmRsZXIpOwogICAgICAgIHRoaXMuYWdlbnRTdWJzY3JpcHRpb25zLmdldChhZ2VudElkKS5hZGQoaGFuZGxlcktleSk7CiAgICAgICAgLy8gQWxzbyBsaXN0ZW4gdG8gdGhlIGdsb2JhbCBhZ2VudDptZXNzYWdlIHRvcGljIGZvciByb3V0aW5nCiAgICAgICAgY29uc3QgZ2xvYmFsSGFuZGxlciA9IChtc2cpID0+IHsKICAgICAgICAgICAgaWYgKG1zZy50byA9PT0gYWdlbnRJZCB8fCBtc2cudG8gPT09ICIqIikgewogICAgICAgICAgICAgICAgaWYgKG1zZy50dGxNcykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBuZXcgRGF0ZShtc2cudGltZXN0YW1wKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFnZSA+IG1zZy50dGxNcykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGFuZGxlcihtc2cpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB0aGlzLmVtaXR0ZXIub24oImFnZW50Om1lc3NhZ2UiLCBnbG9iYWxIYW5kbGVyKTsKICAgICAgICAvLyBTdG9yZSBjbGVhbnVwIHJlZgogICAgICAgIHRoaXMuYWdlbnRTdWJzY3JpcHRpb25zLmdldChhZ2VudElkKS5hZGQoYGNsZWFudXA6JHthZ2VudElkfToke0RhdGUubm93KCl9YCk7CiAgICAgICAgLy8gU3RvcmUgYWN0dWFsIGhhbmRsZXIgcmVmIGZvciBjbGVhbnVwCiAgICAgICAgdGhpcy5fZ2xvYmFsSGFuZGxlcnMuc2V0KGFnZW50SWQsIGdsb2JhbEhhbmRsZXIpOwogICAgfQogICAgLy8gU3RvcmUgZ2xvYmFsIGhhbmRsZXJzIGZvciBjbGVhbnVwCiAgICBfZ2xvYmFsSGFuZGxlcnMgPSBuZXcgTWFwKCk7CiAgICAvKiogVW5zdWJzY3JpYmUgYW4gYWdlbnQgZnJvbSBhbGwgbWVzc2FnZXMuICovCiAgICB1bnN1YnNjcmliZShhZ2VudElkKSB7CiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuX2dsb2JhbEhhbmRsZXJzLmdldChhZ2VudElkKTsKICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgICB0aGlzLmVtaXR0ZXIub2ZmKCJhZ2VudDptZXNzYWdlIiwgaGFuZGxlcik7CiAgICAgICAgICAgIHRoaXMuX2dsb2JhbEhhbmRsZXJzLmRlbGV0ZShhZ2VudElkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5hZ2VudFN1YnNjcmlwdGlvbnMuZGVsZXRlKGFnZW50SWQpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gTGlmZWN5Y2xlIGV2ZW50IGhlbHBlcnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVtaXRMaWZlY3ljbGUoZXZlbnQpIHsKICAgICAgICB0aGlzLmVtaXQoImFnZW50OmxpZmVjeWNsZSIsIGV2ZW50KTsKICAgIH0KICAgIGVtaXRFcnJvcihhZ2VudElkLCBlcnJvcikgewogICAgICAgIHRoaXMuZW1pdCgiYWdlbnQ6ZXJyb3IiLCB7IGFnZW50SWQsIGVycm9yIH0pOwogICAgfQogICAgZW1pdFNwYXduZWQoYWdlbnRJZCwgcGlkKSB7CiAgICAgICAgdGhpcy5lbWl0KCJhZ2VudDpzcGF3bmVkIiwgeyBhZ2VudElkLCBwaWQgfSk7CiAgICB9CiAgICBlbWl0Q29tcGxldGVkKGFnZW50SWQsIGV4aXRDb2RlKSB7CiAgICAgICAgdGhpcy5lbWl0KCJhZ2VudDpjb21wbGV0ZWQiLCB7IGFnZW50SWQsIGV4aXRDb2RlIH0pOwogICAgfQogICAgZW1pdEZhaWxlZChhZ2VudElkLCBlcnJvcikgewogICAgICAgIHRoaXMuZW1pdCgiYWdlbnQ6ZmFpbGVkIiwgeyBhZ2VudElkLCBlcnJvciB9KTsKICAgIH0KICAgIGVtaXRSZXNvdXJjZVdhcm5pbmcodXNhZ2UpIHsKICAgICAgICB0aGlzLmVtaXQoInJ1bnRpbWU6cmVzb3VyY2Utd2FybmluZyIsIHsgdXNhZ2UgfSk7CiAgICB9CiAgICBlbWl0U2h1dGRvd24ocmVhc29uKSB7CiAgICAgICAgdGhpcy5lbWl0KCJydW50aW1lOnNodXRkb3duIiwgeyByZWFzb24gfSk7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBDbGVhbnVwCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogQ2xlYXIgYWxsIGxpc3RlbmVycyBhbmQgcGVuZGluZyByZXF1ZXN0cy4gRm9yIHNodXRkb3duLiAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICBmb3IgKGNvbnN0IFssIHBlbmRpbmddIG9mIHRoaXMucGVuZGluZ1JlcXVlc3RzKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dChwZW5kaW5nLnRpbWVyKTsKICAgICAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKCJCdXMgZGVzdHJveWVkIikpOwogICAgICAgIH0KICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5jbGVhcigpOwogICAgICAgIHRoaXMuX2dsb2JhbEhhbmRsZXJzLmNsZWFyKCk7CiAgICAgICAgdGhpcy5hZ2VudFN1YnNjcmlwdGlvbnMuY2xlYXIoKTsKICAgICAgICB0aGlzLmVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7CiAgICB9Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEhlbHBlcnMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIGdlbmVyYXRlTWVzc2FnZUlkKCkgewogICAgcmV0dXJuIGBtc2dfJHtEYXRlLm5vdygpfV8ke3JhbmRvbUJ5dGVzKDQpLnRvU3RyaW5nKCJoZXgiKX1gOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1cy5qcy5tYXA=","agents/runtime/config.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIENvbmZpZ3VyYXRpb24uCiAqCiAqIExvYWRzIGRlZmF1bHRzLCBtZXJnZXMgZW52IHZhciBvdmVycmlkZXMsIHByb2R1Y2VzIGEgZnJvemVuIFJ1bnRpbWVDb25maWcuCiAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB1c2UgdGhlIENPUkVfUlVOVElNRV8gcHJlZml4IChEQVNIX1JVTlRJTUVfIGFsc28gc3VwcG9ydGVkKS4KICovCmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyByZXNvbHZlRW52IH0gZnJvbSAiLi4vLi4vaW5zdGFuY2UuanMiOwppbXBvcnQgeyBCUkFJTl9ESVIgfSBmcm9tICIuLi8uLi9saWIvcGF0aHMuanMiOwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGVmYXVsdHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNvbnN0IERFRkFVTFRTID0gewogICAgbWF4Q29uY3VycmVudEFnZW50czogNSwKICAgIGRlZmF1bHRUaW1lb3V0TXM6IDEwICogNjAgKiAxMDAwLCAvLyAxMCBtaW51dGVzCiAgICBkZWZhdWx0TWF4UmV0cmllczogMiwKICAgIGRlZmF1bHRCYWNrb2ZmTXM6IDJfMDAwLAogICAgZGVmYXVsdEJhY2tvZmZNdWx0aXBsaWVyOiAyLAogICAgZGVmYXVsdE1heEJhY2tvZmZNczogMzBfMDAwLAogICAgbWF4VG90YWxNZW1vcnlNQjogMjA0OCwgLy8gMiBHQiBhZ2dyZWdhdGUgY2FwCiAgICBkZWZhdWx0TWVtb3J5TGltaXRNQjogNTEyLAogICAgZGVmYXVsdENwdVdlaWdodDogNTAsCiAgICBtb25pdG9ySW50ZXJ2YWxNczogMTBfMDAwLCAvLyAxMCBzZWNvbmRzCiAgICBwZXJzaXN0RGlyOiBqb2luKEJSQUlOX0RJUiwgImFnZW50cyIsICJydW50aW1lIiksCn07Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBFbnYgdmFyIHJlc29sdmVyCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBlbnZJbnQoc3VmZml4KSB7CiAgICBjb25zdCB2ID0gcmVzb2x2ZUVudihzdWZmaXgpOwogICAgaWYgKHYgPT0gbnVsbCkKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgY29uc3QgbiA9IHBhcnNlSW50KHYsIDEwKTsKICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogdW5kZWZpbmVkOwp9CmZ1bmN0aW9uIGVudlN0cihzdWZmaXgpIHsKICAgIHJldHVybiByZXNvbHZlRW52KHN1ZmZpeCkgfHwgdW5kZWZpbmVkOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQdWJsaWMgQVBJCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKiogQnVpbGQgUnVudGltZUNvbmZpZyBmcm9tIGRlZmF1bHRzICsgZW52IHZhciBvdmVycmlkZXMuICovCmV4cG9ydCBmdW5jdGlvbiBsb2FkUnVudGltZUNvbmZpZyhvdmVycmlkZXMpIHsKICAgIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICBtYXhDb25jdXJyZW50QWdlbnRzOiBvdmVycmlkZXM/Lm1heENvbmN1cnJlbnRBZ2VudHMgPz8KICAgICAgICAgICAgZW52SW50KCJSVU5USU1FX01BWF9BR0VOVFMiKSA/PwogICAgICAgICAgICBERUZBVUxUUy5tYXhDb25jdXJyZW50QWdlbnRzLAogICAgICAgIGRlZmF1bHRUaW1lb3V0TXM6IG92ZXJyaWRlcz8uZGVmYXVsdFRpbWVvdXRNcyA/PwogICAgICAgICAgICBlbnZJbnQoIlJVTlRJTUVfVElNRU9VVF9NUyIpID8/CiAgICAgICAgICAgIERFRkFVTFRTLmRlZmF1bHRUaW1lb3V0TXMsCiAgICAgICAgZGVmYXVsdE1heFJldHJpZXM6IG92ZXJyaWRlcz8uZGVmYXVsdE1heFJldHJpZXMgPz8KICAgICAgICAgICAgZW52SW50KCJSVU5USU1FX01BWF9SRVRSSUVTIikgPz8KICAgICAgICAgICAgREVGQVVMVFMuZGVmYXVsdE1heFJldHJpZXMsCiAgICAgICAgZGVmYXVsdEJhY2tvZmZNczogb3ZlcnJpZGVzPy5kZWZhdWx0QmFja29mZk1zID8/CiAgICAgICAgICAgIGVudkludCgiUlVOVElNRV9CQUNLT0ZGX01TIikgPz8KICAgICAgICAgICAgREVGQVVMVFMuZGVmYXVsdEJhY2tvZmZNcywKICAgICAgICBkZWZhdWx0QmFja29mZk11bHRpcGxpZXI6IG92ZXJyaWRlcz8uZGVmYXVsdEJhY2tvZmZNdWx0aXBsaWVyID8/CiAgICAgICAgICAgIGVudkludCgiUlVOVElNRV9CQUNLT0ZGX01VTFQiKSA/PwogICAgICAgICAgICBERUZBVUxUUy5kZWZhdWx0QmFja29mZk11bHRpcGxpZXIsCiAgICAgICAgZGVmYXVsdE1heEJhY2tvZmZNczogb3ZlcnJpZGVzPy5kZWZhdWx0TWF4QmFja29mZk1zID8/CiAgICAgICAgICAgIGVudkludCgiUlVOVElNRV9NQVhfQkFDS09GRl9NUyIpID8/CiAgICAgICAgICAgIERFRkFVTFRTLmRlZmF1bHRNYXhCYWNrb2ZmTXMsCiAgICAgICAgbWF4VG90YWxNZW1vcnlNQjogb3ZlcnJpZGVzPy5tYXhUb3RhbE1lbW9yeU1CID8/CiAgICAgICAgICAgIGVudkludCgiUlVOVElNRV9NQVhfTUVNT1JZX01CIikgPz8KICAgICAgICAgICAgREVGQVVMVFMubWF4VG90YWxNZW1vcnlNQiwKICAgICAgICBkZWZhdWx0TWVtb3J5TGltaXRNQjogb3ZlcnJpZGVzPy5kZWZhdWx0TWVtb3J5TGltaXRNQiA/PwogICAgICAgICAgICBlbnZJbnQoIlJVTlRJTUVfREVGQVVMVF9NRU1fTUIiKSA/PwogICAgICAgICAgICBERUZBVUxUUy5kZWZhdWx0TWVtb3J5TGltaXRNQiwKICAgICAgICBkZWZhdWx0Q3B1V2VpZ2h0OiBvdmVycmlkZXM/LmRlZmF1bHRDcHVXZWlnaHQgPz8KICAgICAgICAgICAgZW52SW50KCJSVU5USU1FX0RFRkFVTFRfQ1BVIikgPz8KICAgICAgICAgICAgREVGQVVMVFMuZGVmYXVsdENwdVdlaWdodCwKICAgICAgICBtb25pdG9ySW50ZXJ2YWxNczogb3ZlcnJpZGVzPy5tb25pdG9ySW50ZXJ2YWxNcyA/PwogICAgICAgICAgICBlbnZJbnQoIlJVTlRJTUVfTU9OSVRPUl9NUyIpID8/CiAgICAgICAgICAgIERFRkFVTFRTLm1vbml0b3JJbnRlcnZhbE1zLAogICAgICAgIHBlcnNpc3REaXI6IG92ZXJyaWRlcz8ucGVyc2lzdERpciA/PwogICAgICAgICAgICBlbnZTdHIoIlJVTlRJTUVfUEVSU0lTVF9ESVIiKSA/PwogICAgICAgICAgICBERUZBVUxUUy5wZXJzaXN0RGlyLAogICAgfTsKICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNvbmZpZyk7Cn0KLyoqIEJ1aWxkIHBlci1pbnN0YW5jZSBjb25maWcgYnkgbWVyZ2luZyBydW50aW1lIGRlZmF1bHRzIHdpdGggcmVxdWVzdCBvdmVycmlkZXMuICovCmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW5zdGFuY2VDb25maWcocnVudGltZUNvbmZpZywgb3ZlcnJpZGVzKSB7CiAgICByZXR1cm4gewogICAgICAgIHRpbWVvdXRNczogb3ZlcnJpZGVzPy50aW1lb3V0TXMgPz8gcnVudGltZUNvbmZpZy5kZWZhdWx0VGltZW91dE1zLAogICAgICAgIG1heFJldHJpZXM6IG92ZXJyaWRlcz8ubWF4UmV0cmllcyA/PyBydW50aW1lQ29uZmlnLmRlZmF1bHRNYXhSZXRyaWVzLAogICAgICAgIGJhY2tvZmZNczogb3ZlcnJpZGVzPy5iYWNrb2ZmTXMgPz8gcnVudGltZUNvbmZpZy5kZWZhdWx0QmFja29mZk1zLAogICAgICAgIGJhY2tvZmZNdWx0aXBsaWVyOiBvdmVycmlkZXM/LmJhY2tvZmZNdWx0aXBsaWVyID8/IHJ1bnRpbWVDb25maWcuZGVmYXVsdEJhY2tvZmZNdWx0aXBsaWVyLAogICAgICAgIG1heEJhY2tvZmZNczogb3ZlcnJpZGVzPy5tYXhCYWNrb2ZmTXMgPz8gcnVudGltZUNvbmZpZy5kZWZhdWx0TWF4QmFja29mZk1zLAogICAgICAgIGVudjogb3ZlcnJpZGVzPy5lbnYgPz8ge30sCiAgICAgICAgaXNvbGF0aW9uOiBvdmVycmlkZXM/Lmlzb2xhdGlvbiA/PyAic2hhcmVkIiwKICAgICAgICBwcmlvcml0eTogb3ZlcnJpZGVzPy5wcmlvcml0eSA/PyA1MCwKICAgIH07Cn0KLyoqIEJ1aWxkIHJlc291cmNlIGFsbG9jYXRpb24gZnJvbSBydW50aW1lIGRlZmF1bHRzIHdpdGggcmVxdWVzdCBvdmVycmlkZXMuICovCmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVzb3VyY2VzKHJ1bnRpbWVDb25maWcsIG92ZXJyaWRlcykgewogICAgcmV0dXJuIHsKICAgICAgICBtZW1vcnlMaW1pdE1COiBvdmVycmlkZXM/Lm1lbW9yeUxpbWl0TUIgPz8gcnVudGltZUNvbmZpZy5kZWZhdWx0TWVtb3J5TGltaXRNQiwKICAgICAgICBjcHVXZWlnaHQ6IG92ZXJyaWRlcz8uY3B1V2VpZ2h0ID8/IHJ1bnRpbWVDb25maWcuZGVmYXVsdENwdVdlaWdodCwKICAgIH07Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZmlnLmpzLm1hcA==","agents/runtime/driver.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIENsYXVkZSBDTEkgYWdlbnQgZHJpdmVyLgogKgogKiBJbXBsZW1lbnRzIHRoZSBBZ2VudERyaXZlciBpbnRlcmZhY2UgdXNpbmcgdGhlIGV4aXN0aW5nIENvcmUgYWdlbnQKICogc3Bhd24gbWFjaGluZXJ5LiBUaGlzIGJyaWRnZXMgdGhlIG5ldyBydW50aW1lIGxheWVyIHdpdGggdGhlIHByb3ZlbgogKiBwcm9jZXNzIHNwYXduaW5nIGluIHNyYy9hZ2VudHMvc3Bhd24udHMuCiAqLwppbXBvcnQgeyBzcGF3biB9IGZyb20gIm5vZGU6Y2hpbGRfcHJvY2VzcyI7CmltcG9ydCB7IHdyaXRlRmlsZVN5bmMgfSBmcm9tICJub2RlOmZzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IExPR1NfRElSIH0gZnJvbSAiLi4vc3RvcmUuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi8uLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImFnZW50LWRyaXZlciIpOwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUHJvY2VzcyB0cmFja2luZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoqIE1hcCBvZiBpbnN0YW5jZSBJRCDihpIgY2hpbGQgcHJvY2VzcyAob25seSBmb3IgY3VycmVudCBzZXNzaW9uKS4gKi8KY29uc3QgcHJvY2Vzc2VzID0gbmV3IE1hcCgpOwovKiogTWFwIG9mIGluc3RhbmNlIElEIOKGkiB0aW1lb3V0IHRpbWVyLiAqLwpjb25zdCB0aW1lcnMgPSBuZXcgTWFwKCk7Ci8qKiBFeGl0IGhhbmRsZXJzIHJlZ2lzdGVyZWQgcGVyIGluc3RhbmNlLiAqLwpjb25zdCBleGl0SGFuZGxlcnMgPSBuZXcgTWFwKCk7Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDbGF1ZGUgQ0xJIERyaXZlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXhwb3J0IGNsYXNzIENsYXVkZUNsaURyaXZlciB7CiAgICBuYW1lID0gImNsYXVkZS1jbGkiOwogICAgLyoqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIHdoZW4gYSBwcm9jZXNzIGV4aXRzLiAqLwogICAgb25FeGl0KGluc3RhbmNlSWQsIGhhbmRsZXIpIHsKICAgICAgICBleGl0SGFuZGxlcnMuc2V0KGluc3RhbmNlSWQsIGhhbmRsZXIpOwogICAgfQogICAgYXN5bmMgc3Bhd24oaW5zdGFuY2UpIHsKICAgICAgICBjb25zdCBzdGRvdXRQYXRoID0gam9pbihMT0dTX0RJUiwgYCR7aW5zdGFuY2UudGFza0lkfS5zdGRvdXQubG9nYCk7CiAgICAgICAgY29uc3Qgc3RkZXJyUGF0aCA9IGpvaW4oTE9HU19ESVIsIGAke2luc3RhbmNlLnRhc2tJZH0uc3RkZXJyLmxvZ2ApOwogICAgICAgIGNvbnN0IHByb21wdFBhdGggPSBqb2luKExPR1NfRElSLCBgJHtpbnN0YW5jZS50YXNrSWR9LnByb21wdC50eHRgKTsKICAgICAgICAvLyBSZXNvbHZlIHByb21wdDogaWYgcmVzdW1pbmcgd2l0aCBjaGVja3BvaW50LCBwcmVwZW5kIGNvbnRleHQKICAgICAgICBjb25zdCBwcm9tcHQgPSBpbnN0YW5jZS5jaGVja3BvaW50RGF0YQogICAgICAgICAgICA/IGBbUmVzdW1pbmcgZnJvbSBwcmV2aW91cyBzZXNzaW9uXVxuXG5QcmV2aW91cyBjb250ZXh0OlxuJHtpbnN0YW5jZS5jaGVja3BvaW50RGF0YX1cblxuQ29udGludWUgdGhlIHRhc2suYAogICAgICAgICAgICA6IHRoaXMucmVzb2x2ZVByb21wdChpbnN0YW5jZSk7CiAgICAgICAgd3JpdGVGaWxlU3luYyhwcm9tcHRQYXRoLCBwcm9tcHQsICJ1dGYtOCIpOwogICAgICAgIC8vIENsZWFuIGVudiB0byBhbGxvdyBuZXN0ZWQgQ2xhdWRlIENvZGUgc2Vzc2lvbnMKICAgICAgICBjb25zdCBjbGVhbkVudiA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmluc3RhbmNlLmNvbmZpZy5lbnYgfTsKICAgICAgICBkZWxldGUgY2xlYW5FbnYuQ0xBVURFQ09ERTsKICAgICAgICBjb25zdCB0YXNrQ3dkID0gaW5zdGFuY2UuY3dkIHx8IHByb2Nlc3MuY3dkKCk7CiAgICAgICAgY29uc3Qgd3JhcHBlclNjcmlwdCA9IGANCiAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgiZnMiKTsNCiAgICAgIGNvbnN0IHsgc3Bhd25TeW5jIH0gPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIik7DQogICAgICBjb25zdCBwcm9tcHQgPSBmcy5yZWFkRmlsZVN5bmMoJHtKU09OLnN0cmluZ2lmeShwcm9tcHRQYXRoKX0sICJ1dGYtOCIpOw0KICAgICAgY29uc3QgciA9IHNwYXduU3luYygiY2xhdWRlIiwgWw0KICAgICAgICAiLS1wcmludCIsICItLW91dHB1dC1mb3JtYXQiLCAidGV4dCIsICItLWRhbmdlcm91c2x5LXNraXAtcGVybWlzc2lvbnMiLCBwcm9tcHQNCiAgICAgIF0sIHsNCiAgICAgICAgY3dkOiAke0pTT04uc3RyaW5naWZ5KHRhc2tDd2QpfSwNCiAgICAgICAgZW5jb2Rpbmc6ICJ1dGYtOCIsDQogICAgICAgIG1heEJ1ZmZlcjogNTAgKiAxMDI0ICogMTAyNCwNCiAgICAgICAgdGltZW91dDogJHtpbnN0YW5jZS5jb25maWcudGltZW91dE1zfSwNCiAgICAgICAgd2luZG93c0hpZGU6IHRydWUNCiAgICAgIH0pOw0KICAgICAgZnMud3JpdGVGaWxlU3luYygke0pTT04uc3RyaW5naWZ5KHN0ZG91dFBhdGgpfSwgci5zdGRvdXQgfHwgIiIsICJ1dGYtOCIpOw0KICAgICAgZnMud3JpdGVGaWxlU3luYygke0pTT04uc3RyaW5naWZ5KHN0ZGVyclBhdGgpfSwgci5zdGRlcnIgfHwgIiIsICJ1dGYtOCIpOw0KICAgICAgcHJvY2Vzcy5leGl0KHIuc3RhdHVzIHx8IDApOw0KICAgIGA7CiAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihwcm9jZXNzLmV4ZWNQYXRoLCBbIi0tZXZhbCIsIHdyYXBwZXJTY3JpcHRdLCB7CiAgICAgICAgICAgIGN3ZDogdGFza0N3ZCwKICAgICAgICAgICAgZGV0YWNoZWQ6IHRydWUsCiAgICAgICAgICAgIHN0ZGlvOiAiaWdub3JlIiwKICAgICAgICAgICAgZW52OiBjbGVhbkVudiwKICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgfSk7CiAgICAgICAgY2hpbGQudW5yZWYoKTsKICAgICAgICBwcm9jZXNzZXMuc2V0KGluc3RhbmNlLmlkLCBjaGlsZCk7CiAgICAgICAgbG9nLmluZm8oIkFnZW50IHByb2Nlc3Mgc3Bhd25lZCIsIHsgaW5zdGFuY2VJZDogaW5zdGFuY2UuaWQsIHRhc2tJZDogaW5zdGFuY2UudGFza0lkLCBwaWQ6IGNoaWxkLnBpZCwgbGFiZWw6IGluc3RhbmNlLm1ldGFkYXRhLmxhYmVsIH0pOwogICAgICAgIC8vIFdpcmUgZXhpdCBoYW5kbGVyIOKAlCBjbGFzc2lmeSBleGl0IHJlYXNvbiBmb3IgZGlhZ25vc3RpY3MKICAgICAgICBjaGlsZC5vbigiZXhpdCIsIChjb2RlLCBzaWduYWwpID0+IHsKICAgICAgICAgICAgY29uc3QgcmVhc29uID0gc2lnbmFsCiAgICAgICAgICAgICAgICA/IGBzaWduYWw6JHtzaWduYWx9YCAvLyBraWxsZWQgZXh0ZXJuYWxseSBvciBieSB0aW1lb3V0CiAgICAgICAgICAgICAgICA6IGNvZGUgPT09IG51bGwKICAgICAgICAgICAgICAgICAgICA/ICJleGl0Om51bGwgKGxpa2VseSB0aW1lb3V0IG9yIE9PTSkiCiAgICAgICAgICAgICAgICAgICAgOiBjb2RlID09PSAwCiAgICAgICAgICAgICAgICAgICAgICAgID8gImNsZWFuIGV4aXQiCiAgICAgICAgICAgICAgICAgICAgICAgIDogYGV4aXQgY29kZSAke2NvZGV9YDsKICAgICAgICAgICAgbG9nLmluZm8oIkFnZW50IHByb2Nlc3MgZXhpdGVkIiwgeyBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pZCwgdGFza0lkOiBpbnN0YW5jZS50YXNrSWQsIGV4aXRDb2RlOiBjb2RlLCBzaWduYWwsIHJlYXNvbiB9KTsKICAgICAgICAgICAgLy8gTG9nIHN0ZGVyciBjb250ZW50IGZvciBmYWlsZWQgZXhpdHMgdG8gYWlkIGRlYnVnZ2luZwogICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkgewogICAgICAgICAgICAgICAgaW1wb3J0KCJub2RlOmZzL3Byb21pc2VzIikudGhlbigoeyByZWFkRmlsZSB9KSA9PiByZWFkRmlsZShzdGRlcnJQYXRoLCAidXRmLTgiKS50aGVuKChzdGRlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RkZXJyLnRyaW0oKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQWdlbnQgc3RkZXJyIG91dHB1dCIsIHsgaW5zdGFuY2VJZDogaW5zdGFuY2UuaWQsIHN0ZGVycjogc3RkZXJyLnNsaWNlKC0xMDAwKSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9jZXNzZXMuZGVsZXRlKGluc3RhbmNlLmlkKTsKICAgICAgICAgICAgY2xlYXJUaW1lcihpbnN0YW5jZS5pZCk7CiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBleGl0SGFuZGxlcnMuZ2V0KGluc3RhbmNlLmlkKTsKICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgIGV4aXRIYW5kbGVycy5kZWxldGUoaW5zdGFuY2UuaWQpOwogICAgICAgICAgICAgICAgLy8gU21hbGwgZGVsYXkgZm9yIGZpbGUgZmx1c2gKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gaGFuZGxlcihjb2RlKSwgMzAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIC8vIFdpcmUgZXJyb3IgaGFuZGxlcgogICAgICAgIGNoaWxkLm9uKCJlcnJvciIsIChlcnIpID0+IHsKICAgICAgICAgICAgbG9nLmVycm9yKCJBZ2VudCBwcm9jZXNzIGVycm9yIiwgeyBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pZCwgdGFza0lkOiBpbnN0YW5jZS50YXNrSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9KTsKICAgICAgICAgICAgcHJvY2Vzc2VzLmRlbGV0ZShpbnN0YW5jZS5pZCk7CiAgICAgICAgICAgIGNsZWFyVGltZXIoaW5zdGFuY2UuaWQpOwogICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gZXhpdEhhbmRsZXJzLmdldChpbnN0YW5jZS5pZCk7CiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBleGl0SGFuZGxlcnMuZGVsZXRlKGluc3RhbmNlLmlkKTsKICAgICAgICAgICAgICAgIGhhbmRsZXIoLTEpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8gU2V0IHRpbWVvdXQKICAgICAgICBpZiAoaW5zdGFuY2UuY29uZmlnLnRpbWVvdXRNcyA+IDApIHsKICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZXMuaGFzKGluc3RhbmNlLmlkKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudGVybWluYXRlKGluc3RhbmNlKS5jYXRjaCgoKSA9PiB7IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBpbnN0YW5jZS5jb25maWcudGltZW91dE1zKTsKICAgICAgICAgICAgdGltZXJzLnNldChpbnN0YW5jZS5pZCwgdGltZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2hpbGQucGlkOwogICAgfQogICAgYXN5bmMgcGF1c2UoaW5zdGFuY2UpIHsKICAgICAgICBsb2cuaW5mbygiUGF1c2luZyBhZ2VudCBwcm9jZXNzIiwgeyBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pZCwgdGFza0lkOiBpbnN0YW5jZS50YXNrSWQgfSk7CiAgICAgICAgLy8gQ2xhdWRlIENMSSBwcm9jZXNzZXMgY2FuJ3QgYmUgdHJ1bHkgcGF1c2VkLiBXZSBraWxsIHRoZSBwcm9jZXNzCiAgICAgICAgLy8gYW5kIHNhdmUgcGFydGlhbCBvdXRwdXQgYXMgY2hlY2twb2ludCBkYXRhIGZvciByZXN1bXB0aW9uLgogICAgICAgIGNvbnN0IGNoaWxkID0gcHJvY2Vzc2VzLmdldChpbnN0YW5jZS5pZCk7CiAgICAgICAgaWYgKCFjaGlsZCkKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAvLyBSZWFkIGFueSBvdXRwdXQgc28gZmFyIGFzIGNoZWNrcG9pbnQKICAgICAgICBsZXQgY2hlY2twb2ludDsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCB7IHJlYWRGaWxlIH0gPSBhd2FpdCBpbXBvcnQoIm5vZGU6ZnMvcHJvbWlzZXMiKTsKICAgICAgICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgcmVhZEZpbGUoam9pbihMT0dTX0RJUiwgYCR7aW5zdGFuY2UudGFza0lkfS5zdGRvdXQubG9nYCksICJ1dGYtOCIpOwogICAgICAgICAgICBpZiAoc3Rkb3V0LnRyaW0oKSkgewogICAgICAgICAgICAgICAgY2hlY2twb2ludCA9IHN0ZG91dC50cmltKCkuc2xpY2UoMCwgMjAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAvLyBObyBvdXRwdXQgeWV0CiAgICAgICAgfQogICAgICAgIC8vIEtpbGwgdGhlIHByb2Nlc3MKICAgICAgICBhd2FpdCB0aGlzLnRlcm1pbmF0ZShpbnN0YW5jZSk7CiAgICAgICAgcmV0dXJuIGNoZWNrcG9pbnQ7CiAgICB9CiAgICBhc3luYyByZXN1bWUoaW5zdGFuY2UsIGNoZWNrcG9pbnQpIHsKICAgICAgICAvLyBTdG9yZSBjaGVja3BvaW50IGRhdGEgb24gdGhlIGluc3RhbmNlIGZvciBzcGF3biB0byB1c2UKICAgICAgICBpZiAoY2hlY2twb2ludCkgewogICAgICAgICAgICBpbnN0YW5jZS5jaGVja3BvaW50RGF0YSA9IGNoZWNrcG9pbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnNwYXduKGluc3RhbmNlKTsKICAgIH0KICAgIGFzeW5jIHRlcm1pbmF0ZShpbnN0YW5jZSkgewogICAgICAgIGxvZy5pbmZvKCJUZXJtaW5hdGluZyBhZ2VudCBwcm9jZXNzIiwgeyBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pZCwgdGFza0lkOiBpbnN0YW5jZS50YXNrSWQsIHBpZDogaW5zdGFuY2UucGlkIH0pOwogICAgICAgIGNvbnN0IGNoaWxkID0gcHJvY2Vzc2VzLmdldChpbnN0YW5jZS5pZCk7CiAgICAgICAgY2xlYXJUaW1lcihpbnN0YW5jZS5pZCk7CiAgICAgICAgZXhpdEhhbmRsZXJzLmRlbGV0ZShpbnN0YW5jZS5pZCk7CiAgICAgICAgaWYgKCFjaGlsZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHByb2Nlc3Nlcy5kZWxldGUoaW5zdGFuY2UuaWQpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAid2luMzIiICYmIGNoaWxkLnBpZCkgewogICAgICAgICAgICAgICAgc3Bhd24oInRhc2traWxsIiwgWyIvcGlkIiwgU3RyaW5nKGNoaWxkLnBpZCksICIvVCIsICIvRiJdLCB7IHNoZWxsOiB0cnVlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2hpbGQua2lsbCgiU0lHVEVSTSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzIGFscmVhZHkgZXhpdGVkIGR1cmluZyB0ZXJtaW5hdGUiLCB7IGluc3RhbmNlSWQ6IGluc3RhbmNlLmlkIH0pOwogICAgICAgIH0KICAgIH0KICAgIGlzQWxpdmUoaW5zdGFuY2UpIHsKICAgICAgICAvLyBDaGVjayBvdXIgdHJhY2tlZCBwcm9jZXNzZXMgZmlyc3QKICAgICAgICBpZiAocHJvY2Vzc2VzLmhhcyhpbnN0YW5jZS5pZCkpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIC8vIEZhbGwgYmFjayB0byBQSUQgY2hlY2sgZm9yIHJlY292ZXJlZCBwcm9jZXNzZXMKICAgICAgICBpZiAoaW5zdGFuY2UucGlkKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwoaW5zdGFuY2UucGlkLCAwKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSGVscGVycwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHJlc29sdmVQcm9tcHQoaW5zdGFuY2UpIHsKICAgICAgICAvLyBUaGUgcHJvbXB0IGlzIHN0b3JlZCBvbiB0aGUgbGlua2VkIEFnZW50VGFzay4KICAgICAgICAvLyBUaGUgcnVudGltZSBtYW5hZ2VyIHdpbGwgc2V0IHRoaXMgYmVmb3JlIGNhbGxpbmcgc3Bhd24uCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLl9wcm9tcHQgPz8gIiI7CiAgICB9CiAgICAvKiogR2V0IHRoZSBwcm9jZXNzIGZvciBhbiBpbnN0YW5jZSAoZm9yIG1vbml0b3JpbmcpLiAqLwogICAgZ2V0UHJvY2VzcyhpbnN0YW5jZUlkKSB7CiAgICAgICAgcmV0dXJuIHByb2Nlc3Nlcy5nZXQoaW5zdGFuY2VJZCk7CiAgICB9CiAgICAvKiogR2V0IGFsbCB0cmFja2VkIGluc3RhbmNlIElEcy4gKi8KICAgIGdldEFjdGl2ZUlkcygpIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShwcm9jZXNzZXMua2V5cygpKTsKICAgIH0KfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSGVscGVycwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gY2xlYXJUaW1lcihpbnN0YW5jZUlkKSB7CiAgICBjb25zdCB0aW1lciA9IHRpbWVycy5nZXQoaW5zdGFuY2VJZCk7CiAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHRpbWVycy5kZWxldGUoaW5zdGFuY2VJZCk7CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJpdmVyLmpzLm1hcA==","agents/runtime/errors.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIEVycm9yIHR5cGVzIGFuZCBjb2Rlcy4KICovCi8qKiBSdW50aW1lLXNwZWNpZmljIGVycm9yIHdpdGggc3RydWN0dXJlZCBjb2RlIGFuZCByZWNvdmVyYWJpbGl0eSBmbGFnLiAqLwpleHBvcnQgY2xhc3MgUnVudGltZUVycm9yIGV4dGVuZHMgRXJyb3IgewogICAgY29kZTsKICAgIHJlY292ZXJhYmxlOwogICAgY29udGV4dDsKICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIHJlY292ZXJhYmxlID0gZmFsc2UsIGNvbnRleHQpIHsKICAgICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOwogICAgICAgIHRoaXMucmVjb3ZlcmFibGUgPSByZWNvdmVyYWJsZTsKICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwogICAgICAgIHRoaXMubmFtZSA9ICJSdW50aW1lRXJyb3IiOwogICAgfQp9Ci8qKiBBbGwga25vd24gZXJyb3IgY29kZXMuICovCmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0gewogICAgLy8gUmVzb3VyY2UgbGltaXRzCiAgICBSRVNPVVJDRV9FWEhBVVNURUQ6ICJSRVNPVVJDRV9FWEhBVVNURUQiLAogICAgTUFYX0FHRU5UU19SRUFDSEVEOiAiTUFYX0FHRU5UU19SRUFDSEVEIiwKICAgIE1FTU9SWV9MSU1JVF9FWENFRURFRDogIk1FTU9SWV9MSU1JVF9FWENFRURFRCIsCiAgICAvLyBMaWZlY3ljbGUKICAgIElOVkFMSURfVFJBTlNJVElPTjogIklOVkFMSURfVFJBTlNJVElPTiIsCiAgICBBR0VOVF9OT1RfRk9VTkQ6ICJBR0VOVF9OT1RfRk9VTkQiLAogICAgQUxSRUFEWV9URVJNSU5BVEVEOiAiQUxSRUFEWV9URVJNSU5BVEVEIiwKICAgIC8vIFNwYXduaW5nCiAgICBTUEFXTl9GQUlMRUQ6ICJTUEFXTl9GQUlMRUQiLAogICAgUkVTVU1FX0ZBSUxFRDogIlJFU1VNRV9GQUlMRUQiLAogICAgUEFVU0VfTk9UX1NVUFBPUlRFRDogIlBBVVNFX05PVF9TVVBQT1JURUQiLAogICAgLy8gRXhlY3V0aW9uCiAgICBUSU1FT1VUOiAiVElNRU9VVCIsCiAgICBEUklWRVJfRVJST1I6ICJEUklWRVJfRVJST1IiLAogICAgTUFYX1JFVFJJRVNfRVhDRUVERUQ6ICJNQVhfUkVUUklFU19FWENFRURFRCIsCiAgICAvLyBTeXN0ZW0KICAgIFNIVVRET1dOX0lOX1BST0dSRVNTOiAiU0hVVERPV05fSU5fUFJPR1JFU1MiLAogICAgUkVHSVNUUllfQ09SUlVQVDogIlJFR0lTVFJZX0NPUlJVUFQiLAogICAgQlVTX0RFTElWRVJZX0ZBSUxFRDogIkJVU19ERUxJVkVSWV9GQUlMRUQiLAp9OwovLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFw","agents/runtime/index.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIFB1YmxpYyBBUEkuCiAqCiAqIFJlLWV4cG9ydHMgdGhlIGNvcmUgcnVudGltZSBjb21wb25lbnRzIGFuZCBwcm92aWRlcyBhIGNvbnZlbmllbmNlCiAqIGZhY3RvcnkgZm9yIGNyZWF0aW5nIGEgZnVsbHkgY29uZmlndXJlZCBSdW50aW1lTWFuYWdlci4KICovCmV4cG9ydCB7IFZBTElEX1RSQU5TSVRJT05TLCBURVJNSU5BTF9TVEFURVMgfSBmcm9tICIuL3R5cGVzLmpzIjsKLy8gRXJyb3JzCmV4cG9ydCB7IFJ1bnRpbWVFcnJvciwgRXJyb3JDb2RlcyB9IGZyb20gIi4vZXJyb3JzLmpzIjsKLy8gQ29uZmlndXJhdGlvbgpleHBvcnQgeyBsb2FkUnVudGltZUNvbmZpZywgcmVzb2x2ZUluc3RhbmNlQ29uZmlnLCByZXNvbHZlUmVzb3VyY2VzIH0gZnJvbSAiLi9jb25maWcuanMiOwovLyBMaWZlY3ljbGUgc3RhdGUgbWFjaGluZQpleHBvcnQgeyBpc1ZhbGlkVHJhbnNpdGlvbiwgYXNzZXJ0VHJhbnNpdGlvbiwgaXNUZXJtaW5hbCwgdHJhbnNpdGlvbiwgc2hvdWxkUmV0cnksIHByZXBhcmVSZXRyeSwgcmVhY2hhYmxlU3RhdGVzLCBpc0FjdGl2ZSwgfSBmcm9tICIuL2xpZmVjeWNsZS5qcyI7Ci8vIFJlc291cmNlcwpleHBvcnQgeyBSZXNvdXJjZVBvb2wgfSBmcm9tICIuL3Jlc291cmNlcy5qcyI7Ci8vIEV2ZW50IGJ1cwpleHBvcnQgeyBSdW50aW1lQnVzIH0gZnJvbSAiLi9idXMuanMiOwovLyBSZWdpc3RyeQpleHBvcnQgeyBBZ2VudFJlZ2lzdHJ5IH0gZnJvbSAiLi9yZWdpc3RyeS5qcyI7Ci8vIERyaXZlcgpleHBvcnQgeyBDbGF1ZGVDbGlEcml2ZXIgfSBmcm9tICIuL2RyaXZlci5qcyI7Ci8vIE1hbmFnZXIKZXhwb3J0IHsgUnVudGltZU1hbmFnZXIgfSBmcm9tICIuL21hbmFnZXIuanMiOwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRmFjdG9yeQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW1wb3J0IHsgUnVudGltZU1hbmFnZXIgfSBmcm9tICIuL21hbmFnZXIuanMiOwppbXBvcnQgeyBDbGF1ZGVDbGlEcml2ZXIgfSBmcm9tICIuL2RyaXZlci5qcyI7Ci8qKiBNb2R1bGUtbGV2ZWwgc2luZ2xldG9uLiAqLwpsZXQgX21hbmFnZXIgPSBudWxsOwovKioKICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgUnVudGltZU1hbmFnZXIgd2l0aCB0aGUgZGVmYXVsdCBDbGF1ZGUgQ0xJIGRyaXZlci4KICogUmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZSBvbiBzdWJzZXF1ZW50IGNhbGxzIChzaW5nbGV0b24pLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJ1bnRpbWUoY29uZmlnT3ZlcnJpZGVzKSB7CiAgICBpZiAoX21hbmFnZXIpCiAgICAgICAgcmV0dXJuIF9tYW5hZ2VyOwogICAgY29uc3QgZHJpdmVyID0gbmV3IENsYXVkZUNsaURyaXZlcigpOwogICAgX21hbmFnZXIgPSBuZXcgUnVudGltZU1hbmFnZXIoZHJpdmVyLCBjb25maWdPdmVycmlkZXMpOwogICAgYXdhaXQgX21hbmFnZXIuaW5pdCgpOwogICAgcmV0dXJuIF9tYW5hZ2VyOwp9Ci8qKiBHZXQgdGhlIGN1cnJlbnQgcnVudGltZSBtYW5hZ2VyIChvciBudWxsIGlmIG5vdCBpbml0aWFsaXplZCkuICovCmV4cG9ydCBmdW5jdGlvbiBnZXRSdW50aW1lKCkgewogICAgcmV0dXJuIF9tYW5hZ2VyOwp9Ci8qKiBTaHV0IGRvd24gYW5kIGNsZWFyIHRoZSBzaW5nbGV0b24gcnVudGltZS4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNodXRkb3duUnVudGltZShyZWFzb24pIHsKICAgIGlmIChfbWFuYWdlcikgewogICAgICAgIGF3YWl0IF9tYW5hZ2VyLnNodXRkb3duKHJlYXNvbik7CiAgICAgICAgX21hbmFnZXIgPSBudWxsOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcA==","agents/runtime/lifecycle.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIExpZmVjeWNsZSBzdGF0ZSBtYWNoaW5lLgogKgogKiBFbmZvcmNlcyB2YWxpZCBzdGF0ZSB0cmFuc2l0aW9ucyB3aXRoIGd1YXJkcyBhbmQgaG9va3MuCiAqIEV2ZXJ5IHRyYW5zaXRpb24gaXMgdmFsaWRhdGVkLCB0aW1lc3RhbXBlZCwgYW5kIGVtaXRzIGEgTGlmZWN5Y2xlRXZlbnQuCiAqLwppbXBvcnQgeyBWQUxJRF9UUkFOU0lUSU9OUywgVEVSTUlOQUxfU1RBVEVTIH0gZnJvbSAiLi90eXBlcy5qcyI7CmltcG9ydCB7IFJ1bnRpbWVFcnJvciwgRXJyb3JDb2RlcyB9IGZyb20gIi4vZXJyb3JzLmpzIjsKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRyYW5zaXRpb24gdmFsaWRhdGlvbgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoqIENoZWNrIGlmIGEgdHJhbnNpdGlvbiBmcm9tIOKGkiB0byBpcyB2YWxpZCBwZXIgdGhlIHN0YXRlIG1hY2hpbmUuICovCmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHJhbnNpdGlvbihmcm9tLCB0bykgewogICAgcmV0dXJuIFZBTElEX1RSQU5TSVRJT05TW2Zyb21dPy5pbmNsdWRlcyh0bykgPz8gZmFsc2U7Cn0KLyoqIEFzc2VydCBhIHRyYW5zaXRpb24gaXMgdmFsaWQ7IHRocm93IFJ1bnRpbWVFcnJvciBpZiBub3QuICovCmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUcmFuc2l0aW9uKGZyb20sIHRvKSB7CiAgICBpZiAoIWlzVmFsaWRUcmFuc2l0aW9uKGZyb20sIHRvKSkgewogICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoRXJyb3JDb2Rlcy5JTlZBTElEX1RSQU5TSVRJT04sIGBJbnZhbGlkIHN0YXRlIHRyYW5zaXRpb246ICR7ZnJvbX0g4oaSICR7dG99YCwgZmFsc2UsIHsgZnJvbSwgdG8sIHZhbGlkVGFyZ2V0czogVkFMSURfVFJBTlNJVElPTlNbZnJvbV0gfSk7CiAgICB9Cn0KLyoqIENoZWNrIGlmIGFuIGFnZW50IGlzIGluIGEgdGVybWluYWwgc3RhdGUuICovCmV4cG9ydCBmdW5jdGlvbiBpc1Rlcm1pbmFsKHN0YXRlKSB7CiAgICByZXR1cm4gVEVSTUlOQUxfU1RBVEVTLmhhcyhzdGF0ZSk7Cn0KLyoqCiAqIEFwcGx5IGEgc3RhdGUgdHJhbnNpdGlvbiB0byBhbiBhZ2VudCBpbnN0YW5jZS4KICoKICogLSBWYWxpZGF0ZXMgdGhlIHRyYW5zaXRpb24KICogLSBVcGRhdGVzIHN0YXRlICsgdGltZXN0YW1wcwogKiAtIFJldHVybnMgdGhlIExpZmVjeWNsZUV2ZW50IGZvciBlbWlzc2lvbgogKgogKiBNdXRhdGVzIHRoZSBpbnN0YW5jZSBpbiBwbGFjZSAoY29uc2lzdGVudCB3aXRoIGV4aXN0aW5nIENvcmUgcGF0dGVybnMpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHRyYW5zaXRpb24oaW5zdGFuY2UsIG5ld1N0YXRlLCByZWFzb24sIGVycm9yKSB7CiAgICBhc3NlcnRUcmFuc2l0aW9uKGluc3RhbmNlLnN0YXRlLCBuZXdTdGF0ZSk7CiAgICBjb25zdCBldmVudCA9IHsKICAgICAgICBhZ2VudElkOiBpbnN0YW5jZS5pZCwKICAgICAgICBwcmV2aW91c1N0YXRlOiBpbnN0YW5jZS5zdGF0ZSwKICAgICAgICBuZXdTdGF0ZSwKICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICByZWFzb24sCiAgICB9OwogICAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTsKICAgIGluc3RhbmNlLnVwZGF0ZWRBdCA9IGV2ZW50LnRpbWVzdGFtcDsKICAgIC8vIFNldCBzdGF0ZS1zcGVjaWZpYyB0aW1lc3RhbXBzCiAgICBpZiAobmV3U3RhdGUgPT09ICJwYXVzZWQiKSB7CiAgICAgICAgaW5zdGFuY2UucGF1c2VkQXQgPSBldmVudC50aW1lc3RhbXA7CiAgICB9CiAgICBlbHNlIGlmIChpc1Rlcm1pbmFsKG5ld1N0YXRlKSkgewogICAgICAgIGluc3RhbmNlLnRlcm1pbmF0ZWRBdCA9IGV2ZW50LnRpbWVzdGFtcDsKICAgIH0KICAgIC8vIEF0dGFjaCBlcnJvciBpZiB0cmFuc2l0aW9uaW5nIHRvIGZhaWxlZAogICAgaWYgKG5ld1N0YXRlID09PSAiZmFpbGVkIiAmJiBlcnJvcikgewogICAgICAgIGluc3RhbmNlLmVycm9yID0gZXJyb3I7CiAgICB9CiAgICByZXR1cm4gZXZlbnQ7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJldHJ5IGxvZ2ljCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKioKICogRGV0ZXJtaW5lIGlmIGFuIGFnZW50IHNob3VsZCBiZSByZXRyaWVkIGFmdGVyIGZhaWx1cmUuCiAqIFJldHVybnMgdGhlIGRlbGF5IGluIG1zIGJlZm9yZSByZXRyeSwgb3IgbnVsbCBpZiBubyByZXRyeSBzaG91bGQgb2NjdXIuCiAqCiAqIFVzZXMgZXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGppdHRlciB0byBwcmV2ZW50IHRodW5kZXJpbmctaGVyZCB3aGVuCiAqIG11bHRpcGxlIGFnZW50cyBmYWlsIHNpbXVsdGFuZW91c2x5LgogKi8KZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJldHJ5KGluc3RhbmNlKSB7CiAgICBjb25zdCB7IG1heFJldHJpZXMsIGJhY2tvZmZNcywgYmFja29mZk11bHRpcGxpZXIsIG1heEJhY2tvZmZNcyB9ID0gaW5zdGFuY2UuY29uZmlnOwogICAgaWYgKGluc3RhbmNlLnJldHJ5Q291bnQgPj0gbWF4UmV0cmllcykKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGlmIChpbnN0YW5jZS5lcnJvciAmJiAhaW5zdGFuY2UuZXJyb3IucmVjb3ZlcmFibGUpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBiYXNlRGVsYXkgPSBiYWNrb2ZmTXMgKiBNYXRoLnBvdyhiYWNrb2ZmTXVsdGlwbGllciwgaW5zdGFuY2UucmV0cnlDb3VudCk7CiAgICAvLyBBZGQgwrEyNSUgaml0dGVyIHRvIHByZXZlbnQgc3luY2hyb25pemVkIHJldHJpZXMKICAgIGNvbnN0IGppdHRlciA9IGJhc2VEZWxheSAqIDAuMjUgKiAoMiAqIE1hdGgucmFuZG9tKCkgLSAxKTsKICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYmFzZURlbGF5ICsgaml0dGVyKSwgbWF4QmFja29mZk1zKTsKICAgIHJldHVybiBNYXRoLnJvdW5kKGRlbGF5KTsKfQovKioKICogUHJlcGFyZSBhbiBpbnN0YW5jZSBmb3IgcmV0cnk6IGluY3JlbWVudCBjb3VudGVyLCBjbGVhciBlcnJvciwgcmVzZXQgdG8gaW5pdGlhbGl6aW5nLgogKiBSZXR1cm5zIHRoZSBMaWZlY3ljbGVFdmVudCBmb3IgdGhlIHRyYW5zaXRpb24gYmFjayB0byBpbml0aWFsaXppbmcuCiAqCiAqIFRoZSBjYWxsZXIgc2hvdWxkIHRyYW5zaXRpb24gdGhyb3VnaCBmYWlsZWQgZmlyc3QsIHRoZW4gY2FsbCB0aGlzIHRvIHJlc2V0LgogKiBUaGlzIGRvZXMgYSBkaXJlY3Qgc3RhdGUgb3ZlcnJpZGUgc2luY2UgZmFpbGVkIOKGkiBpbml0aWFsaXppbmcgaXNuJ3QgaW4gdGhlCiAqIHN0YW5kYXJkIEZTTSDigJQgcmV0cmllcyBhcmUgYSBydW50aW1lLWxldmVsIGNvbmNlcm4uCiAqLwpleHBvcnQgZnVuY3Rpb24gcHJlcGFyZVJldHJ5KGluc3RhbmNlKSB7CiAgICBjb25zdCBldmVudCA9IHsKICAgICAgICBhZ2VudElkOiBpbnN0YW5jZS5pZCwKICAgICAgICBwcmV2aW91c1N0YXRlOiBpbnN0YW5jZS5zdGF0ZSwKICAgICAgICBuZXdTdGF0ZTogImluaXRpYWxpemluZyIsCiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgcmVhc29uOiBgUmV0cnkgYXR0ZW1wdCAke2luc3RhbmNlLnJldHJ5Q291bnQgKyAxfS8ke2luc3RhbmNlLmNvbmZpZy5tYXhSZXRyaWVzfWAsCiAgICB9OwogICAgaW5zdGFuY2UucmV0cnlDb3VudCArPSAxOwogICAgaW5zdGFuY2Uuc3RhdGUgPSAiaW5pdGlhbGl6aW5nIjsKICAgIGluc3RhbmNlLmVycm9yID0gdW5kZWZpbmVkOwogICAgaW5zdGFuY2UucGlkID0gdW5kZWZpbmVkOwogICAgaW5zdGFuY2UudXBkYXRlZEF0ID0gZXZlbnQudGltZXN0YW1wOwogICAgaW5zdGFuY2UudGVybWluYXRlZEF0ID0gdW5kZWZpbmVkOwogICAgcmV0dXJuIGV2ZW50Owp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb252ZW5pZW5jZSBxdWVyaWVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKiogUmV0dXJucyBhbGwgc3RhdGVzIHJlYWNoYWJsZSBmcm9tIHRoZSBnaXZlbiBzdGF0ZS4gKi8KZXhwb3J0IGZ1bmN0aW9uIHJlYWNoYWJsZVN0YXRlcyhmcm9tKSB7CiAgICByZXR1cm4gVkFMSURfVFJBTlNJVElPTlNbZnJvbV0gPz8gW107Cn0KLyoqIENoZWNrIGlmIGFuIGFnZW50IGlzIGN1cnJlbnRseSBhY3RpdmUgKG5vdCB0ZXJtaW5hbCkuICovCmV4cG9ydCBmdW5jdGlvbiBpc0FjdGl2ZShzdGF0ZSkgewogICAgcmV0dXJuICFpc1Rlcm1pbmFsKHN0YXRlKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1saWZlY3ljbGUuanMubWFw","agents/runtime/manager.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIFJ1bnRpbWVNYW5hZ2VyLgogKgogKiBUaGUgY2VudHJhbCBvcmNoZXN0cmF0b3IgdGhhdCB0aWVzIHRvZ2V0aGVyIGxpZmVjeWNsZSBtYW5hZ2VtZW50LAogKiByZXNvdXJjZSBhbGxvY2F0aW9uLCB0aGUgZXZlbnQgYnVzLCByZWdpc3RyeSBwZXJzaXN0ZW5jZSwgYW5kIHRoZQogKiBhZ2VudCBkcml2ZXIuIFByb3ZpZGVzIHRoZSBoaWdoLWxldmVsIEFQSSBmb3Igc3Bhd25pbmcsIHBhdXNpbmcsCiAqIHJlc3VtaW5nLCBhbmQgdGVybWluYXRpbmcgYWdlbnQgaW5zdGFuY2VzLgogKgogKiBVc2FnZToKICogICBjb25zdCBtYW5hZ2VyID0gbmV3IFJ1bnRpbWVNYW5hZ2VyKGRyaXZlciwgY29uZmlnT3ZlcnJpZGVzKTsKICogICBhd2FpdCBtYW5hZ2VyLmluaXQoKTsKICogICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IG1hbmFnZXIuc3Bhd24oeyB0YXNrSWQsIGxhYmVsLCBwcm9tcHQsIG9yaWdpbiB9KTsKICogICBhd2FpdCBtYW5hZ2VyLnBhdXNlKGluc3RhbmNlLmlkKTsKICogICBhd2FpdCBtYW5hZ2VyLnJlc3VtZShpbnN0YW5jZS5pZCk7CiAqICAgYXdhaXQgbWFuYWdlci50ZXJtaW5hdGUoaW5zdGFuY2UuaWQpOwogKiAgIGF3YWl0IG1hbmFnZXIuc2h1dGRvd24oKTsKICovCmltcG9ydCB7IFJ1bnRpbWVFcnJvciwgRXJyb3JDb2RlcyB9IGZyb20gIi4vZXJyb3JzLmpzIjsKaW1wb3J0IHsgbG9hZFJ1bnRpbWVDb25maWcsIHJlc29sdmVJbnN0YW5jZUNvbmZpZywgcmVzb2x2ZVJlc291cmNlcyB9IGZyb20gIi4vY29uZmlnLmpzIjsKaW1wb3J0IHsgdHJhbnNpdGlvbiwgc2hvdWxkUmV0cnksIHByZXBhcmVSZXRyeSwgaXNUZXJtaW5hbCB9IGZyb20gIi4vbGlmZWN5Y2xlLmpzIjsKaW1wb3J0IHsgUmVzb3VyY2VQb29sIH0gZnJvbSAiLi9yZXNvdXJjZXMuanMiOwppbXBvcnQgeyBSdW50aW1lQnVzIH0gZnJvbSAiLi9idXMuanMiOwppbXBvcnQgeyBBZ2VudFJlZ2lzdHJ5IH0gZnJvbSAiLi9yZWdpc3RyeS5qcyI7CmltcG9ydCB7IGxvZ0FjdGl2aXR5IH0gZnJvbSAiLi4vLi4vYWN0aXZpdHkvbG9nLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgcmVtZW1iZXJUYXNrT3V0Y29tZSB9IGZyb20gIi4uL21lbW9yeS5qcyI7CmltcG9ydCB7IHJlYWRUYXNrLCByZWFkVGFza091dHB1dCwgdXBkYXRlVGFzayB9IGZyb20gIi4uL3N0b3JlLmpzIjsKaW1wb3J0IHsgdXBkYXRlQm9hcmRUYXNrU3RhdGUgfSBmcm9tICIuLi9zcGF3bi5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiYWdlbnQtcnVudGltZSIpOwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUnVudGltZU1hbmFnZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmV4cG9ydCBjbGFzcyBSdW50aW1lTWFuYWdlciB7CiAgICBjb25maWc7CiAgICBidXM7CiAgICByZXNvdXJjZXM7CiAgICByZWdpc3RyeTsKICAgIGRyaXZlcjsKICAgIG1vbml0b3JUaW1lciA9IG51bGw7CiAgICBzaHV0ZG93blJlcXVlc3RlZCA9IGZhbHNlOwogICAgLy8g4pSA4pSAIFJldHJ5IGxvb3AgZ3VhcmRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqIFByZXZlbnRzIGNvbmN1cnJlbnQgaGFuZGxlRXhpdCBjYWxscyBmb3IgdGhlIHNhbWUgaW5zdGFuY2UuICovCiAgICBoYW5kbGVFeGl0R3VhcmQgPSBuZXcgU2V0KCk7CiAgICAvKiogVHJhY2tzIGluc3RhbmNlcyB3aXRoIGEgcGVuZGluZyByZXRyeSB0aW1lb3V0IChwcmV2ZW50cyBkdXBsaWNhdGUgc2NoZWR1bGluZykuICovCiAgICByZXRyeVBlbmRpbmcgPSBuZXcgU2V0KCk7CiAgICAvLyDilIDilIAgR2xvYmFsIHJldHJ5IGJ1ZGdldCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKiBSb2xsaW5nIHdpbmRvdyBvZiByZXRyeSB0aW1lc3RhbXBzIGFjcm9zcyBhbGwgaW5zdGFuY2VzLiAqLwogICAgZ2xvYmFsUmV0cnlUaW1lc3RhbXBzID0gW107CiAgICAvKioKICAgICAqIE1heCByZXRyaWVzIGFjcm9zcyBhbGwgaW5zdGFuY2VzIHdpdGhpbiB0aGUgYnVkZ2V0IHdpbmRvdy4KICAgICAqIFNjYWxlZCB0byAzw5cgbWF4Q29uY3VycmVudEFnZW50cyB0byBhdm9pZCBidWRnZXQgZXhoYXVzdGlvbiB3aGVuIGEgZnVsbAogICAgICogYmF0Y2ggZmFpbHMgKGVhY2ggYWdlbnQgZ2V0cyBtYXhSZXRyaWVzPTIsIHNvIDUgYWdlbnRzID0gMTAgcmV0cmllcwogICAgICogd2hpY2ggcHJldmlvdXNseSBleGhhdXN0ZWQgdGhlIGVudGlyZSBidWRnZXQgaW4gb25lIGJhdGNoKS4KICAgICAqLwogICAgZ2xvYmFsUmV0cnlCdWRnZXQ7CiAgICAvKiogUm9sbGluZyB3aW5kb3cgZm9yIHRoZSBnbG9iYWwgcmV0cnkgYnVkZ2V0IChtcykuICovCiAgICBzdGF0aWMgR0xPQkFMX1JFVFJZX1dJTkRPV19NUyA9IDUgKiA2MF8wMDA7IC8vIDUgbWludXRlcwogICAgY29uc3RydWN0b3IoZHJpdmVyLCBjb25maWdPdmVycmlkZXMpIHsKICAgICAgICB0aGlzLmNvbmZpZyA9IGxvYWRSdW50aW1lQ29uZmlnKGNvbmZpZ092ZXJyaWRlcyk7CiAgICAgICAgdGhpcy5kcml2ZXIgPSBkcml2ZXI7CiAgICAgICAgdGhpcy5idXMgPSBuZXcgUnVudGltZUJ1cygpOwogICAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IFJlc291cmNlUG9vbCh0aGlzLmNvbmZpZyk7CiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBBZ2VudFJlZ2lzdHJ5KHRoaXMuY29uZmlnLnBlcnNpc3REaXIpOwogICAgICAgIC8vIFNjYWxlIHJldHJ5IGJ1ZGdldDogM8OXIG1heCBjb25jdXJyZW50IGFnZW50cyBlbnN1cmVzIG9uZSBiYWQgYmF0Y2gKICAgICAgICAvLyBkb2Vzbid0IGV4aGF1c3QgdGhlIGVudGlyZSBidWRnZXQgKDUgYWdlbnRzIMOXIDIgcmV0cmllcyA9IDEwLCBidWRnZXQgPSAxNSkKICAgICAgICB0aGlzLmdsb2JhbFJldHJ5QnVkZ2V0ID0gTWF0aC5tYXgoMTAsIHRoaXMuY29uZmlnLm1heENvbmN1cnJlbnRBZ2VudHMgKiAzKTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEluaXRpYWxpemF0aW9uICYgc2h1dGRvd24KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBJbml0aWFsaXplIHRoZSBydW50aW1lOiBsb2FkIHJlZ2lzdHJ5LCByZWNvdmVyIGFnZW50cywgc3RhcnQgbW9uaXRvci4gKi8KICAgIGFzeW5jIGluaXQoKSB7CiAgICAgICAgY29uc3QgdDAgPSBEYXRlLm5vdygpOwogICAgICAgIGxvZy5pbmZvKCJJbml0aWFsaXppbmcgYWdlbnQgcnVudGltZSIsIHsgZHJpdmVyOiB0aGlzLmRyaXZlci5uYW1lLCBtYXhBZ2VudHM6IHRoaXMuY29uZmlnLm1heENvbmN1cnJlbnRBZ2VudHMgfSk7CiAgICAgICAgY29uc3QgdDEgPSBEYXRlLm5vdygpOwogICAgICAgIGF3YWl0IHRoaXMucmVnaXN0cnkuaW5pdCgpOwogICAgICAgIGNvbnN0IHJlZ2lzdHJ5TXMgPSBEYXRlLm5vdygpIC0gdDE7CiAgICAgICAgY29uc3QgdDIgPSBEYXRlLm5vdygpOwogICAgICAgIGF3YWl0IHRoaXMucmVjb3ZlckFnZW50cygpOwogICAgICAgIGNvbnN0IHJlY292ZXJ5TXMgPSBEYXRlLm5vdygpIC0gdDI7CiAgICAgICAgdGhpcy5zdGFydE1vbml0b3IoKTsKICAgICAgICBjb25zdCB0b3RhbE1zID0gRGF0ZS5ub3coKSAtIHQwOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiAiQWdlbnQgcnVudGltZSBpbml0aWFsaXplZCIsCiAgICAgICAgICAgIGRldGFpbDogYERyaXZlcjogJHt0aGlzLmRyaXZlci5uYW1lfSwgbWF4IGFnZW50czogJHt0aGlzLmNvbmZpZy5tYXhDb25jdXJyZW50QWdlbnRzfSwgaW5pdCAke3RvdGFsTXN9bXMgW3JlZ2lzdHJ5OiR7cmVnaXN0cnlNc31tcyByZWNvdmVyeToke3JlY292ZXJ5TXN9bXNdYCwKICAgICAgICB9KTsKICAgIH0KICAgIC8qKiBHcmFjZWZ1bCBzaHV0ZG93bjogdGVybWluYXRlIGFjdGl2ZSBhZ2VudHMsIHN0b3AgbW9uaXRvciwgY2xlYW4gdXAuICovCiAgICBhc3luYyBzaHV0ZG93bihyZWFzb24gPSAiUnVudGltZSBzaHV0ZG93biIpIHsKICAgICAgICBpZiAodGhpcy5zaHV0ZG93blJlcXVlc3RlZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGxvZy5pbmZvKCJTaHV0dGluZyBkb3duIGFnZW50IHJ1bnRpbWUiLCB7IHJlYXNvbiB9KTsKICAgICAgICB0aGlzLnNodXRkb3duUmVxdWVzdGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmJ1cy5lbWl0U2h1dGRvd24ocmVhc29uKTsKICAgICAgICB0aGlzLnN0b3BNb25pdG9yKCk7CiAgICAgICAgLy8gVGVybWluYXRlIGFsbCBhY3RpdmUgYWdlbnRzCiAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5yZWdpc3RyeS5saXN0QWN0aXZlKCk7CiAgICAgICAgY29uc3QgdGVybWluYXRpb25zID0gYWN0aXZlLm1hcCgoaW5zdCkgPT4gdGhpcy50ZXJtaW5hdGUoaW5zdC5pZCwgcmVhc29uKS5jYXRjaCgoKSA9PiB7IH0pKTsKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGVybWluYXRpb25zKTsKICAgICAgICAvLyBDbGVhbiB1cCByZXNvdXJjZXMsIHJldHJ5IGd1YXJkcywgYW5kIGJ1cwogICAgICAgIHRoaXMucmVzb3VyY2VzLmNsZWFyKCk7CiAgICAgICAgdGhpcy5oYW5kbGVFeGl0R3VhcmQuY2xlYXIoKTsKICAgICAgICB0aGlzLnJldHJ5UGVuZGluZy5jbGVhcigpOwogICAgICAgIHRoaXMuZ2xvYmFsUmV0cnlUaW1lc3RhbXBzLmxlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5idXMuZGVzdHJveSgpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiAiQWdlbnQgcnVudGltZSBzaHV0IGRvd24iLAogICAgICAgICAgICBkZXRhaWw6IGBSZWFzb246ICR7cmVhc29ufSwgdGVybWluYXRlZCAke2FjdGl2ZS5sZW5ndGh9IGFnZW50c2AsCiAgICAgICAgfSk7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBDb3JlIGxpZmVjeWNsZSBvcGVyYXRpb25zCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogU3Bhd24gYSBuZXcgYWdlbnQgaW5zdGFuY2UuICovCiAgICBhc3luYyBzcGF3bihyZXF1ZXN0KSB7CiAgICAgICAgbG9nLmluZm8oYFNwYXduaW5nIGFnZW50IGluc3RhbmNlOiAke3JlcXVlc3QubGFiZWx9YCwgeyB0YXNrSWQ6IHJlcXVlc3QudGFza0lkLCBvcmlnaW46IHJlcXVlc3Qub3JpZ2luIH0pOwogICAgICAgIGlmICh0aGlzLnNodXRkb3duUmVxdWVzdGVkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoRXJyb3JDb2Rlcy5TSFVURE9XTl9JTl9QUk9HUkVTUywgIlJ1bnRpbWUgaXMgc2h1dHRpbmcgZG93biIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHJlc29sdmVJbnN0YW5jZUNvbmZpZyh0aGlzLmNvbmZpZywgcmVxdWVzdC5jb25maWcpOwogICAgICAgIGNvbnN0IHJlc291cmNlQWxsb2MgPSByZXNvbHZlUmVzb3VyY2VzKHRoaXMuY29uZmlnLCByZXF1ZXN0LnJlc291cmNlcyk7CiAgICAgICAgLy8gQ2hlY2sgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IOKAlCBxdWV1ZSBpZiBub3QgYXZhaWxhYmxlCiAgICAgICAgaWYgKCF0aGlzLnJlc291cmNlcy5jYW5BbGxvY2F0ZShyZXNvdXJjZUFsbG9jKSkgewogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgcXVldWVkIChyZXNvdXJjZXMgZXhoYXVzdGVkKTogJHtyZXF1ZXN0LmxhYmVsfWAsCiAgICAgICAgICAgICAgICBkZXRhaWw6IGBBY3RpdmU6ICR7dGhpcy5yZXNvdXJjZXMuYWN0aXZlQ291bnR9LyR7dGhpcy5jb25maWcubWF4Q29uY3VycmVudEFnZW50c31gLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNvdXJjZXMuZW5xdWV1ZShyZXF1ZXN0LCBpbnN0YW5jZUNvbmZpZy5wcmlvcml0eSk7CiAgICAgICAgfQogICAgICAgIC8vIENyZWF0ZSB0aGUgaW5zdGFuY2UKICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB7CiAgICAgICAgICAgIGlkOiB0aGlzLnJlZ2lzdHJ5LmdlbmVyYXRlSWQoKSwKICAgICAgICAgICAgdGFza0lkOiByZXF1ZXN0LnRhc2tJZCwKICAgICAgICAgICAgc3RhdGU6ICJpbml0aWFsaXppbmciLAogICAgICAgICAgICBjd2Q6IHJlcXVlc3QuY3dkLAogICAgICAgICAgICBjb25maWc6IGluc3RhbmNlQ29uZmlnLAogICAgICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlQWxsb2MsCiAgICAgICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICAgICAgICBsYWJlbDogcmVxdWVzdC5sYWJlbCwKICAgICAgICAgICAgICAgIG9yaWdpbjogcmVxdWVzdC5vcmlnaW4sCiAgICAgICAgICAgICAgICBwYXJlbnRJZDogcmVxdWVzdC5wYXJlbnRJZCwKICAgICAgICAgICAgICAgIHRhZ3M6IHJlcXVlc3QudGFncyA/PyBbXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmV0cnlDb3VudDogMCwKICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csCiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LAogICAgICAgIH07CiAgICAgICAgLy8gU3RvcmUgdGhlIHByb21wdCBvbiB0aGUgaW5zdGFuY2UgZm9yIHRoZSBkcml2ZXIKICAgICAgICBpbnN0YW5jZS5fcHJvbXB0ID0gcmVxdWVzdC5wcm9tcHQ7CiAgICAgICAgLy8gUmVnaXN0ZXIgYW5kIGFsbG9jYXRlIHJlc291cmNlcwogICAgICAgIGF3YWl0IHRoaXMucmVnaXN0cnkucmVnaXN0ZXIoaW5zdGFuY2UpOwogICAgICAgIHRoaXMucmVzb3VyY2VzLmFsbG9jYXRlKGluc3RhbmNlLmlkLCByZXNvdXJjZUFsbG9jKTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogYFNwYXduaW5nIGFnZW50OiAke3JlcXVlc3QubGFiZWx9YCwKICAgICAgICAgICAgZGV0YWlsOiBgSW5zdGFuY2UgJHtpbnN0YW5jZS5pZH0sIHRhc2sgJHtyZXF1ZXN0LnRhc2tJZH1gLAogICAgICAgIH0pOwogICAgICAgIC8vIEF0dGVtcHQgdG8gc3Bhd24gdmlhIGRyaXZlcgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHBpZCA9IGF3YWl0IHRoaXMuZHJpdmVyLnNwYXduKGluc3RhbmNlKTsKICAgICAgICAgICAgaW5zdGFuY2UucGlkID0gcGlkOwogICAgICAgICAgICBjb25zdCBldmVudCA9IHRyYW5zaXRpb24oaW5zdGFuY2UsICJydW5uaW5nIiwgIlNwYXduZWQgc3VjY2Vzc2Z1bGx5Iik7CiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0cnkudXBkYXRlKGluc3RhbmNlLmlkLCB7CiAgICAgICAgICAgICAgICBzdGF0ZTogaW5zdGFuY2Uuc3RhdGUsCiAgICAgICAgICAgICAgICBwaWQsCiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IGluc3RhbmNlLnVwZGF0ZWRBdCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuYnVzLmVtaXRMaWZlY3ljbGUoZXZlbnQpOwogICAgICAgICAgICB0aGlzLmJ1cy5lbWl0U3Bhd25lZChpbnN0YW5jZS5pZCwgcGlkKTsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXhpdCBoYW5kbGVyIHdpdGggZHJpdmVyCiAgICAgICAgICAgIGlmICgib25FeGl0IiBpbiB0aGlzLmRyaXZlciAmJiB0eXBlb2YgdGhpcy5kcml2ZXIub25FeGl0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlcgogICAgICAgICAgICAgICAgICAgIC5vbkV4aXQoaW5zdGFuY2UuaWQsIChjb2RlKSA9PiB0aGlzLmhhbmRsZUV4aXQoaW5zdGFuY2UuaWQsIGNvZGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgcnVubmluZzogJHtyZXF1ZXN0LmxhYmVsfWAsCiAgICAgICAgICAgICAgICBkZXRhaWw6IGBQSUQgJHtwaWR9LCBpbnN0YW5jZSAke2luc3RhbmNlLmlkfWAsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnRvQWdlbnRFcnJvcihlcnIsIEVycm9yQ29kZXMuU1BBV05fRkFJTEVELCB0cnVlKTsKICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0cmFuc2l0aW9uKGluc3RhbmNlLCAiZmFpbGVkIiwgIlNwYXduIGZhaWxlZCIsIGVycm9yKTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RyeS51cGRhdGUoaW5zdGFuY2UuaWQsIHsKICAgICAgICAgICAgICAgIHN0YXRlOiAiZmFpbGVkIiwKICAgICAgICAgICAgICAgIGVycm9yLAogICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBpbnN0YW5jZS51cGRhdGVkQXQsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnJlc291cmNlcy5yZWxlYXNlKGluc3RhbmNlLmlkKTsKICAgICAgICAgICAgdGhpcy5idXMuZW1pdExpZmVjeWNsZShldmVudCk7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJldHJ5IGlzIHBvc3NpYmxlIEJFRk9SRSBlbWl0dGluZyB0ZXJtaW5hbCBmYWlsdXJlLgogICAgICAgICAgICAvLyBTYW1lIGZpeCBhcyBoYW5kbGVFeGl0OiBwcmV2ZW50IGV4dGVybmFsIGxpc3RlbmVycyBmcm9tIGZpcmluZwogICAgICAgICAgICAvLyBwcmVtYXR1cmVseSB3aGlsZSByZXRyaWVzIGFyZSBzdGlsbCBwZW5kaW5nLgogICAgICAgICAgICBjb25zdCByZXRyeURlbGF5ID0gc2hvdWxkUmV0cnkoaW5zdGFuY2UpOwogICAgICAgICAgICBpZiAocmV0cnlEZWxheSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgc3Bhd24gZmFpbGVkLCB3aWxsIHJldHJ5OiAke3JlcXVlc3QubGFiZWx9YCwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGBBdHRlbXB0ICR7aW5zdGFuY2UucmV0cnlDb3VudCArIDF9LyR7aW5zdGFuY2UuY29uZmlnLm1heFJldHJpZXN9LCBiYWNrb2ZmICR7cmV0cnlEZWxheX1tc2AsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWF5YmVSZXRyeShpbnN0YW5jZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBmYWlsdXJlIOKAlCBub3RpZnkgZXh0ZXJuYWwgbGlzdGVuZXJzCiAgICAgICAgICAgICAgICB0aGlzLmJ1cy5lbWl0RmFpbGVkKGluc3RhbmNlLmlkLCBlcnJvcik7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCBzcGF3biBmYWlsZWQgKHRlcm1pbmFsKTogJHtyZXF1ZXN0LmxhYmVsfWAsCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBlcnIubWVzc2FnZSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9CiAgICB9CiAgICAvKiogUGF1c2UgYSBydW5uaW5nIGFnZW50LiAqLwogICAgYXN5bmMgcGF1c2UoaW5zdGFuY2VJZCwgcmVhc29uKSB7CiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnJlcXVpcmVJbnN0YW5jZShpbnN0YW5jZUlkKTsKICAgICAgICB0aGlzLmFzc2VydFN0YXRlKGluc3RhbmNlLCAicnVubmluZyIpOwogICAgICAgIGxldCBjaGVja3BvaW50OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNoZWNrcG9pbnQgPSBhd2FpdCB0aGlzLmRyaXZlci5wYXVzZShpbnN0YW5jZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50IHBhdXNlIGZhaWxlZDogJHtpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbH1gLAogICAgICAgICAgICAgICAgZGV0YWlsOiBlcnIubWVzc2FnZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgaWYgKGNoZWNrcG9pbnQpIHsKICAgICAgICAgICAgaW5zdGFuY2UuY2hlY2twb2ludERhdGEgPSBjaGVja3BvaW50OwogICAgICAgIH0KICAgICAgICBjb25zdCBldmVudCA9IHRyYW5zaXRpb24oaW5zdGFuY2UsICJwYXVzZWQiLCByZWFzb24gPz8gIlBhdXNlZCBieSByZXF1ZXN0Iik7CiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RyeS51cGRhdGUoaW5zdGFuY2VJZCwgewogICAgICAgICAgICBzdGF0ZTogInBhdXNlZCIsCiAgICAgICAgICAgIGNoZWNrcG9pbnREYXRhOiBpbnN0YW5jZS5jaGVja3BvaW50RGF0YSwKICAgICAgICAgICAgcGF1c2VkQXQ6IGluc3RhbmNlLnBhdXNlZEF0LAogICAgICAgICAgICB1cGRhdGVkQXQ6IGluc3RhbmNlLnVwZGF0ZWRBdCwKICAgICAgICB9KTsKICAgICAgICB0aGlzLnJlc291cmNlcy5yZWxlYXNlKGluc3RhbmNlSWQpOwogICAgICAgIHRoaXMuYnVzLmVtaXRMaWZlY3ljbGUoZXZlbnQpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgcGF1c2VkOiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgIGRldGFpbDogY2hlY2twb2ludCA/ICJDaGVja3BvaW50IHNhdmVkIiA6ICJObyBjaGVja3BvaW50IiwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9CiAgICAvKiogUmVzdW1lIGEgcGF1c2VkIGFnZW50LiAqLwogICAgYXN5bmMgcmVzdW1lKGluc3RhbmNlSWQpIHsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMucmVxdWlyZUluc3RhbmNlKGluc3RhbmNlSWQpOwogICAgICAgIHRoaXMuYXNzZXJ0U3RhdGUoaW5zdGFuY2UsICJwYXVzZWQiKTsKICAgICAgICAvLyBDaGVjayByZXNvdXJjZSBhdmFpbGFiaWxpdHkKICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2VzLmNhbkFsbG9jYXRlKGluc3RhbmNlLnJlc291cmNlcykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihFcnJvckNvZGVzLlJFU09VUkNFX0VYSEFVU1RFRCwgIkNhbm5vdCByZXN1bWU6IHJlc291cmNlcyB1bmF2YWlsYWJsZSIsIHRydWUpOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bWVFdmVudCA9IHRyYW5zaXRpb24oaW5zdGFuY2UsICJyZXN1bWluZyIsICJSZXN1bWluZyBmcm9tIHBhdXNlIik7CiAgICAgICAgdGhpcy5idXMuZW1pdExpZmVjeWNsZShyZXN1bWVFdmVudCk7CiAgICAgICAgLy8gUmUtYWxsb2NhdGUgcmVzb3VyY2VzCiAgICAgICAgdGhpcy5yZXNvdXJjZXMuYWxsb2NhdGUoaW5zdGFuY2VJZCwgaW5zdGFuY2UucmVzb3VyY2VzKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwaWQgPSBhd2FpdCB0aGlzLmRyaXZlci5yZXN1bWUoaW5zdGFuY2UsIGluc3RhbmNlLmNoZWNrcG9pbnREYXRhKTsKICAgICAgICAgICAgaW5zdGFuY2UucGlkID0gcGlkOwogICAgICAgICAgICBpbnN0YW5jZS5wYXVzZWRBdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgY29uc3QgcnVuRXZlbnQgPSB0cmFuc2l0aW9uKGluc3RhbmNlLCAicnVubmluZyIsICJSZXN1bWVkIHN1Y2Nlc3NmdWxseSIpOwogICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnVwZGF0ZShpbnN0YW5jZUlkLCB7CiAgICAgICAgICAgICAgICBzdGF0ZTogInJ1bm5pbmciLAogICAgICAgICAgICAgICAgcGlkLAogICAgICAgICAgICAgICAgcGF1c2VkQXQ6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogaW5zdGFuY2UudXBkYXRlZEF0LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5idXMuZW1pdExpZmVjeWNsZShydW5FdmVudCk7CiAgICAgICAgICAgIHRoaXMuYnVzLmVtaXRTcGF3bmVkKGluc3RhbmNlSWQsIHBpZCk7CiAgICAgICAgICAgIC8vIFJlLXJlZ2lzdGVyIGV4aXQgaGFuZGxlcgogICAgICAgICAgICBpZiAoIm9uRXhpdCIgaW4gdGhpcy5kcml2ZXIgJiYgdHlwZW9mIHRoaXMuZHJpdmVyLm9uRXhpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIKICAgICAgICAgICAgICAgICAgICAub25FeGl0KGluc3RhbmNlSWQsIChjb2RlKSA9PiB0aGlzLmhhbmRsZUV4aXQoaW5zdGFuY2VJZCwgY29kZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCByZXN1bWVkOiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgICAgICBkZXRhaWw6IGBQSUQgJHtwaWR9LCBpbnN0YW5jZSAke2luc3RhbmNlSWR9YCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMudG9BZ2VudEVycm9yKGVyciwgRXJyb3JDb2Rlcy5SRVNVTUVfRkFJTEVELCB0cnVlKTsKICAgICAgICAgICAgY29uc3QgZmFpbEV2ZW50ID0gdHJhbnNpdGlvbihpbnN0YW5jZSwgImZhaWxlZCIsICJSZXN1bWUgZmFpbGVkIiwgZXJyb3IpOwogICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnVwZGF0ZShpbnN0YW5jZUlkLCB7CiAgICAgICAgICAgICAgICBzdGF0ZTogImZhaWxlZCIsCiAgICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogaW5zdGFuY2UudXBkYXRlZEF0LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMucmVsZWFzZShpbnN0YW5jZUlkKTsKICAgICAgICAgICAgdGhpcy5idXMuZW1pdExpZmVjeWNsZShmYWlsRXZlbnQpOwogICAgICAgICAgICB0aGlzLmJ1cy5lbWl0RmFpbGVkKGluc3RhbmNlSWQsIGVycm9yKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50IHJlc3VtZSBmYWlsZWQ6ICR7aW5zdGFuY2UubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgfQogICAgfQogICAgLyoqIFRlcm1pbmF0ZSBhbiBhZ2VudCAoZnJvbSBhbnkgYWN0aXZlIHN0YXRlKS4gKi8KICAgIGFzeW5jIHRlcm1pbmF0ZShpbnN0YW5jZUlkLCByZWFzb24pIHsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMucmVxdWlyZUluc3RhbmNlKGluc3RhbmNlSWQpOwogICAgICAgIGlmIChpc1Rlcm1pbmFsKGluc3RhbmNlLnN0YXRlKSkgewogICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7IC8vIEFscmVhZHkgZG9uZQogICAgICAgIH0KICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRlcm1pbmF0aW5nCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgdGVybUV2ZW50ID0gdHJhbnNpdGlvbihpbnN0YW5jZSwgInRlcm1pbmF0aW5nIiwgcmVhc29uID8/ICJUZXJtaW5hdGVkIGJ5IHJlcXVlc3QiKTsKICAgICAgICAgICAgdGhpcy5idXMuZW1pdExpZmVjeWNsZSh0ZXJtRXZlbnQpOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIC8vIElmIHRyYW5zaXRpb24gaXNuJ3QgdmFsaWQgZnJvbSBjdXJyZW50IHN0YXRlLCBmb3JjZSBpdAogICAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9ICJ0ZXJtaW5hdGluZyI7CiAgICAgICAgICAgIGluc3RhbmNlLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgLy8gS2lsbCB0aGUgcHJvY2VzcwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnRlcm1pbmF0ZShpbnN0YW5jZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgLy8gQmVzdCBlZmZvcnQg4oCUIHByb2Nlc3MgbWF5IGFscmVhZHkgYmUgZGVhZAogICAgICAgIH0KICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRlcm1pbmF0ZWQKICAgICAgICBjb25zdCBmaW5hbEV2ZW50ID0gdHJhbnNpdGlvbihpbnN0YW5jZSwgInRlcm1pbmF0ZWQiLCByZWFzb24gPz8gIlRlcm1pbmF0ZWQiKTsKICAgICAgICAvLyBTa2lwIGRpc2sgcGVyc2lzdCDigJQgR0Mgd2lsbCBkZWxldGUgdGhpcyBmaWxlIHdpdGhpbiBnY1R0bE1zLgogICAgICAgIC8vIE9uIHJlc3RhcnQsIGRyaXZlci5pc0FsaXZlKCkgcmV0dXJucyBmYWxzZSDihpIgcmVjb3ZlcnkgaGFuZGxlcyBjb3JyZWN0bHkuCiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RyeS51cGRhdGUoaW5zdGFuY2VJZCwgewogICAgICAgICAgICBzdGF0ZTogInRlcm1pbmF0ZWQiLAogICAgICAgICAgICB0ZXJtaW5hdGVkQXQ6IGluc3RhbmNlLnRlcm1pbmF0ZWRBdCwKICAgICAgICAgICAgdXBkYXRlZEF0OiBpbnN0YW5jZS51cGRhdGVkQXQsCiAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgdGhpcy5yZXNvdXJjZXMucmVsZWFzZShpbnN0YW5jZUlkKTsKICAgICAgICB0aGlzLmJ1cy51bnN1YnNjcmliZShpbnN0YW5jZUlkKTsKICAgICAgICB0aGlzLmJ1cy5lbWl0TGlmZWN5Y2xlKGZpbmFsRXZlbnQpOwogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgQWdlbnRUYXNrCiAgICAgICAgYXdhaXQgdXBkYXRlVGFzayhpbnN0YW5jZS50YXNrSWQsIHsKICAgICAgICAgICAgc3RhdHVzOiAiY2FuY2VsbGVkIiwKICAgICAgICAgICAgZmluaXNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIH0pLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCB0ZXJtaW5hdGVkOiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgIGRldGFpbDogYFJlYXNvbjogJHtyZWFzb24gPz8gInJlcXVlc3RlZCJ9LCBpbnN0YW5jZSAke2luc3RhbmNlSWR9YCwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBRdWVyaWVzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogR2V0IGFuIGFnZW50IGluc3RhbmNlIGJ5IElELiAqLwogICAgZ2V0SW5zdGFuY2UoaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXQoaWQpOwogICAgfQogICAgLyoqIEdldCBhbiBpbnN0YW5jZSBieSBpdHMgbGlua2VkIHRhc2sgSUQuICovCiAgICBnZXRCeVRhc2tJZCh0YXNrSWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRCeVRhc2tJZCh0YXNrSWQpOwogICAgfQogICAgLyoqIExpc3QgYWxsIGluc3RhbmNlcywgb3B0aW9uYWxseSBmaWx0ZXJlZC4gKi8KICAgIGxpc3RJbnN0YW5jZXMoZmlsdGVyKSB7CiAgICAgICAgaWYgKGZpbHRlcj8uc3RhdGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5Lmxpc3QoeyBzdGF0ZXM6IGZpbHRlci5zdGF0ZXMgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5Lmxpc3QoKTsKICAgIH0KICAgIC8qKiBMaXN0IGFsbCBhY3RpdmUgKG5vbi10ZXJtaW5hbCkgaW5zdGFuY2VzLiAqLwogICAgbGlzdEFjdGl2ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5saXN0QWN0aXZlKCk7CiAgICB9CiAgICAvKiogR2V0IGEgc25hcHNob3Qgb2YgY3VycmVudCByZXNvdXJjZSB1c2FnZS4gKi8KICAgIGdldFJlc291cmNlU25hcHNob3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzLnNuYXBzaG90KCk7CiAgICB9CiAgICAvKiogR2V0IGluc3RhbmNlIGNvdW50cyBieSBzdGF0ZS4gKi8KICAgIGdldFN0YXRlQ291bnRzKCkgewogICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmNvdW50QnlTdGF0ZSgpOwogICAgfQogICAgLyoqIFJlbW92ZSBhIHRlcm1pbmF0ZWQgaW5zdGFuY2UgZnJvbSB0aGUgcmVnaXN0cnkgYW5kIGRpc2suICovCiAgICBhc3luYyByZW1vdmVJbnN0YW5jZShpZCkgewogICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlbW92ZShpZCk7CiAgICB9CiAgICAvKiogUmVtb3ZlIG11bHRpcGxlIHRlcm1pbmF0ZWQgaW5zdGFuY2VzIGluIHBhcmFsbGVsLiAqLwogICAgYXN5bmMgcmVtb3ZlSW5zdGFuY2VzKGlkcykgewogICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlbW92ZU1hbnkoaWRzKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIG11bHRpcGxlIGluc3RhbmNlcyBmcm9tIGluLW1lbW9yeSByZWdpc3RyeSBvbmx5IChubyBmaWxlIEkvTykuCiAgICAgKiBSZXR1cm5zIHRoZSBjb3VudCByZW1vdmVkIGFuZCB0aGVpciBwZXJzaXN0IGZpbGUgcGF0aHMgZm9yIGNhbGxlci1tYW5hZ2VkCiAgICAgKiBiYXRjaCBkZWxldGlvbi4KICAgICAqLwogICAgcmVtb3ZlSW5zdGFuY2VzSW5NZW1vcnkoaWRzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVtb3ZlTWFueUluTWVtb3J5KGlkcyk7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBJbnRlci1hZ2VudCBtZXNzYWdpbmcKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBTZW5kIGEgbWVzc2FnZSBiZXR3ZWVuIGFnZW50cy4gKi8KICAgIHNlbmRNZXNzYWdlKGZyb20sIHRvLCB0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYnVzLnNlbmQoeyBmcm9tLCB0bywgdHlwZSwgcGF5bG9hZCB9KTsKICAgIH0KICAgIC8qKiBTZW5kIGEgcmVxdWVzdCBhbmQgYXdhaXQgYSBjb3JyZWxhdGVkIHJlc3BvbnNlLiAqLwogICAgYXN5bmMgcmVxdWVzdFJlc3BvbnNlKGZyb20sIHRvLCB0eXBlLCBwYXlsb2FkLCB0aW1lb3V0TXMpIHsKICAgICAgICByZXR1cm4gdGhpcy5idXMucmVxdWVzdCh7IGZyb20sIHRvLCB0eXBlLCBwYXlsb2FkIH0sIHRpbWVvdXRNcyk7CiAgICB9CiAgICAvKiogU3Vic2NyaWJlIGFuIGFnZW50IHRvIHJlY2VpdmUgbWVzc2FnZXMuICovCiAgICBzdWJzY3JpYmVBZ2VudChhZ2VudElkLCBoYW5kbGVyKSB7CiAgICAgICAgdGhpcy5idXMuc3Vic2NyaWJlKGFnZW50SWQsIGhhbmRsZXIpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gRXZlbnQgc3Vic2NyaXB0aW9ucyAoZm9yIGV4dGVybmFsIGNvbnN1bWVycykKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBTdWJzY3JpYmUgdG8gbGlmZWN5Y2xlIGV2ZW50cy4gKi8KICAgIG9uTGlmZWN5Y2xlKGhhbmRsZXIpIHsKICAgICAgICB0aGlzLmJ1cy5vbigiYWdlbnQ6bGlmZWN5Y2xlIiwgaGFuZGxlcik7CiAgICB9CiAgICAvKiogU3Vic2NyaWJlIHRvIGFnZW50IGVycm9yIGV2ZW50cy4gKi8KICAgIG9uRXJyb3IoaGFuZGxlcikgewogICAgICAgIHRoaXMuYnVzLm9uKCJhZ2VudDplcnJvciIsIGhhbmRsZXIpOwogICAgfQogICAgLyoqIFN1YnNjcmliZSB0byByZXNvdXJjZSB3YXJuaW5nIGV2ZW50cy4gKi8KICAgIG9uUmVzb3VyY2VXYXJuaW5nKGhhbmRsZXIpIHsKICAgICAgICB0aGlzLmJ1cy5vbigicnVudGltZTpyZXNvdXJjZS13YXJuaW5nIiwgaGFuZGxlcik7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBJbnRlcm5hbDogcHJvY2VzcyBleGl0IGhhbmRsaW5nCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBhc3luYyBoYW5kbGVFeGl0KGluc3RhbmNlSWQsIGNvZGUpIHsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMucmVnaXN0cnkuZ2V0KGluc3RhbmNlSWQpOwogICAgICAgIGlmICghaW5zdGFuY2UgfHwgaXNUZXJtaW5hbChpbnN0YW5jZS5zdGF0ZSkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBHdWFyZDogcHJldmVudCBjb25jdXJyZW50IGhhbmRsZUV4aXQgZm9yIHRoZSBzYW1lIGluc3RhbmNlLgogICAgICAgIC8vIE1vbml0b3IgcG9sbCArIGRyaXZlciBleGl0IGhhbmRsZXIgY2FuIHJhY2UsIGNhdXNpbmcgZHVwbGljYXRlIHJldHJ5IHNjaGVkdWxpbmcuCiAgICAgICAgaWYgKHRoaXMuaGFuZGxlRXhpdEd1YXJkLmhhcyhpbnN0YW5jZUlkKSkgewogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgaGFuZGxlRXhpdCBza2lwcGVkIChjb25jdXJyZW50IGNhbGwpOiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgICAgICBkZXRhaWw6IGBJbnN0YW5jZSAke2luc3RhbmNlSWR9LCBleGl0IGNvZGUgJHtjb2RlfSDigJQgYW5vdGhlciBoYW5kbGVFeGl0IGlzIGFscmVhZHkgcHJvY2Vzc2luZ2AsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaGFuZGxlRXhpdEd1YXJkLmFkZChpbnN0YW5jZUlkKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4aXRJbm5lcihpbnN0YW5jZUlkLCBpbnN0YW5jZSwgY29kZSk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLmhhbmRsZUV4aXRHdWFyZC5kZWxldGUoaW5zdGFuY2VJZCk7CiAgICAgICAgfQogICAgfQogICAgYXN5bmMgaGFuZGxlRXhpdElubmVyKGluc3RhbmNlSWQsIGluc3RhbmNlLCBjb2RlKSB7CiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVhZFRhc2tPdXRwdXQoaW5zdGFuY2UudGFza0lkKS5jYXRjaCgoKSA9PiAiIik7CiAgICAgICAgY29uc3QgcmVzdWx0U3VtbWFyeSA9IG91dHB1dC50cmltKCkuc2xpY2UoMCwgMTAwMCkgfHwgdW5kZWZpbmVkOwogICAgICAgIC8vIE51bGwgZXhpdCBjb2RlIChzaWduYWwvcmVzdGFydCkgd2l0aCBzdWJzdGFudGlhbCBvdXRwdXQgaXMgdHJlYXRlZCBhcyBzdWNjZXNzLAogICAgICAgIC8vIG1hdGNoaW5nIHRoZSBzYW1lIGxvZ2ljIGluIHNwYXduLnRzLiBXaXRob3V0IHRoaXMsIFJ1bnRpbWVNYW5hZ2VyIHJldHJpZXMKICAgICAgICAvLyBhZ2VudHMgdGhhdCBzcGF3bi50cyBhbHJlYWR5IG1hcmtlZCBhcyBjb21wbGV0ZWQuCiAgICAgICAgY29uc3QgaGFzU3Vic3RhbnRpYWxPdXRwdXQgPSBvdXRwdXQudHJpbSgpLmxlbmd0aCA+IDEwMDsKICAgICAgICBjb25zdCBzdWNjZXNzID0gY29kZSA9PT0gMCB8fCAoY29kZSA9PSBudWxsICYmIGhhc1N1YnN0YW50aWFsT3V0cHV0KTsKICAgICAgICBpZiAoc3VjY2VzcykgewogICAgICAgICAgICBjb25zdCBldmVudCA9IHRyYW5zaXRpb24oaW5zdGFuY2UsICJjb21wbGV0ZWQiLCBgRXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7CiAgICAgICAgICAgIC8vIFNraXAgZGlzayBwZXJzaXN0IOKAlCBHQyB3aWxsIGRlbGV0ZSB0aGlzIGZpbGUgd2l0aGluIGdjVHRsTXMuCiAgICAgICAgICAgIC8vIE9uIHJlc3RhcnQsIGRyaXZlci5pc0FsaXZlKCkgcmV0dXJucyBmYWxzZSDihpIgcmVjb3ZlcnkgaGFuZGxlcyBjb3JyZWN0bHkuCiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0cnkudXBkYXRlKGluc3RhbmNlSWQsIHsKICAgICAgICAgICAgICAgIHN0YXRlOiAiY29tcGxldGVkIiwKICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogaW5zdGFuY2UudXBkYXRlZEF0LAogICAgICAgICAgICAgICAgdGVybWluYXRlZEF0OiBpbnN0YW5jZS50ZXJtaW5hdGVkQXQsCiAgICAgICAgICAgIH0sIHRydWUpOwogICAgICAgICAgICB0aGlzLnJlc291cmNlcy5yZWxlYXNlKGluc3RhbmNlSWQpOwogICAgICAgICAgICB0aGlzLmJ1cy5lbWl0TGlmZWN5Y2xlKGV2ZW50KTsKICAgICAgICAgICAgdGhpcy5idXMuZW1pdENvbXBsZXRlZChpbnN0YW5jZUlkLCBjb2RlID8/IHVuZGVmaW5lZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBDbGFzc2lmeSByZWNvdmVyYWJpbGl0eSBiYXNlZCBvbiBleGl0IGNvZGUgYW5kIGNvbnRleHQ6CiAgICAgICAgICAgIC8vIC0gbnVsbCArIG5lYXIgdGltZW91dDogdGltZW91dCBraWxsIOKAlCBub3QgcmVjb3ZlcmFibGUgKHJldHJ5aW5nIHdpbGwgdGltZW91dCBhZ2FpbikKICAgICAgICAgICAgLy8gLSBudWxsIChzaWduYWwvT09NL2tpbGxlZCk6IHBvdGVudGlhbGx5IHJlY292ZXJhYmxlICh3b3J0aCByZXRyeWluZykKICAgICAgICAgICAgLy8gLSBub24temVybzogY2hlY2sgb3V0cHV0IGZvciBkZXRlcm1pbmlzdGljIGZhaWx1cmUgcGF0dGVybnMKICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBuZXcgRGF0ZShpbnN0YW5jZS5jcmVhdGVkQXQpLmdldFRpbWUoKTsKICAgICAgICAgICAgY29uc3QgaXNUaW1lb3V0ID0gY29kZSA9PT0gbnVsbCAmJiBlbGFwc2VkID49IGluc3RhbmNlLmNvbmZpZy50aW1lb3V0TXMgKiAwLjk7CiAgICAgICAgICAgIGNvbnN0IGlzRGV0ZXJtaW5pc3RpY0ZhaWx1cmUgPSBpc1RpbWVvdXQgfHwgdGhpcy5pc0RldGVybWluaXN0aWNGYWlsdXJlKG91dHB1dCwgY29kZSk7CiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJhYmxlID0gIWlzRGV0ZXJtaW5pc3RpY0ZhaWx1cmU7CiAgICAgICAgICAgIGlmIChpc1RpbWVvdXQpIHsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50IHRpbWVkIG91dDogJHtpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbH1gLAogICAgICAgICAgICAgICAgICAgIGRldGFpbDogYEVsYXBzZWQgJHtNYXRoLnJvdW5kKGVsYXBzZWQgLyAxMDAwKX1zIG9mICR7TWF0aC5yb3VuZChpbnN0YW5jZS5jb25maWcudGltZW91dE1zIC8gMTAwMCl9cyBsaW1pdCDigJQgd2lsbCBub3QgcmV0cnlgLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnRvQWdlbnRFcnJvcihuZXcgRXJyb3IoYFByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCksIEVycm9yQ29kZXMuRFJJVkVSX0VSUk9SLCByZWNvdmVyYWJsZSk7CiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdHJhbnNpdGlvbihpbnN0YW5jZSwgImZhaWxlZCIsIGBFeGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gLCBlcnJvcik7CiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0cnkudXBkYXRlKGluc3RhbmNlSWQsIHsKICAgICAgICAgICAgICAgIHN0YXRlOiAiZmFpbGVkIiwKICAgICAgICAgICAgICAgIGVycm9yLAogICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBpbnN0YW5jZS51cGRhdGVkQXQsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBSZWxlYXNlIHJlc291cmNlcyBiZWZvcmUgcmV0cnkgY2hlY2sgKG1heWJlUmV0cnkgcmUtYWxsb2NhdGVzIGlmIG5lZWRlZCkKICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMucmVsZWFzZShpbnN0YW5jZUlkKTsKICAgICAgICAgICAgdGhpcy5idXMuZW1pdExpZmVjeWNsZShldmVudCk7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJldHJ5IGlzIHBvc3NpYmxlIEJFRk9SRSBlbWl0dGluZyB0ZXJtaW5hbCBmYWlsdXJlLgogICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGV4dGVybmFsIGxpc3RlbmVycyAoc3Bhd24udHMgYmF0Y2ggdHJhY2tpbmcpIGZyb20KICAgICAgICAgICAgLy8gcHJlbWF0dXJlbHkgcHJvY2Vzc2luZyB0aGUgZmFpbHVyZSB3aGlsZSByZXRyaWVzIGFyZSBzdGlsbCBwZW5kaW5nLAogICAgICAgICAgICAvLyB3aGljaCB3YXMgY2F1c2luZyByZXRyeSBsb29wIGZhbi1vdXQ6IGNvbnRpbnVhdGlvbiBzcGF3bmVkIG5ldyBhZ2VudHMKICAgICAgICAgICAgLy8gd2hpbGUgdGhlIFJ1bnRpbWVNYW5hZ2VyIHdhcyBzdGlsbCByZXRyeWluZyB0aGUgb3JpZ2luYWwuCiAgICAgICAgICAgIGNvbnN0IHJldHJ5RGVsYXkgPSBzaG91bGRSZXRyeShpbnN0YW5jZSk7CiAgICAgICAgICAgIGlmIChyZXRyeURlbGF5ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCBmYWlsZWQsIHdpbGwgcmV0cnk6ICR7aW5zdGFuY2UubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGBBdHRlbXB0ICR7aW5zdGFuY2UucmV0cnlDb3VudCArIDF9LyR7aW5zdGFuY2UuY29uZmlnLm1heFJldHJpZXN9LCBiYWNrb2ZmICR7cmV0cnlEZWxheX1tcywgZXhpdCBjb2RlICR7Y29kZX0sIHJlY292ZXJhYmxlPSR7cmVjb3ZlcmFibGV9LCBpbnN0YW5jZSAke2luc3RhbmNlSWR9YCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYXliZVJldHJ5KGluc3RhbmNlKTsKICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRG9uJ3QgZW1pdCBhZ2VudDpmYWlsZWQgb3IgdXBkYXRlIHRhc2sgc3RvcmUg4oCUIHJldHJ5IHBlbmRpbmcKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUZXJtaW5hbCBmYWlsdXJlIOKAlCBubyBtb3JlIHJldHJpZXMsIG5vdGlmeSBleHRlcm5hbCBsaXN0ZW5lcnMKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50IGZhaWxlZCAodGVybWluYWwsIG5vIHJldHJpZXMgbGVmdCk6ICR7aW5zdGFuY2UubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogYEV4aXQgY29kZSAke2NvZGV9LCByZXRyeUNvdW50PSR7aW5zdGFuY2UucmV0cnlDb3VudH0vJHtpbnN0YW5jZS5jb25maWcubWF4UmV0cmllc30sIHJlY292ZXJhYmxlPSR7cmVjb3ZlcmFibGV9LCBpbnN0YW5jZSAke2luc3RhbmNlSWR9YCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuYnVzLmVtaXRGYWlsZWQoaW5zdGFuY2VJZCwgZXJyb3IpOwogICAgICAgIH0KICAgICAgICAvLyDilIDilIAgRmluYWxpemUgKHJlYWNoZWQgb25seSBmb3IgdGVybWluYWwgc3VjY2VzcyBvciB0ZXJtaW5hbCBmYWlsdXJlKSDilIDilIAKICAgICAgICB0aGlzLmJ1cy51bnN1YnNjcmliZShpbnN0YW5jZUlkKTsKICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHN1Y2Nlc3MgPyAiY29tcGxldGVkIiA6ICJmYWlsZWQiOwogICAgICAgIGF3YWl0IHVwZGF0ZVRhc2soaW5zdGFuY2UudGFza0lkLCB7CiAgICAgICAgICAgIHN0YXR1czogbmV3U3RhdGUsCiAgICAgICAgICAgIGV4aXRDb2RlOiBjb2RlID8/IHVuZGVmaW5lZCwKICAgICAgICAgICAgZmluaXNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICByZXN1bHRTdW1tYXJ5LAogICAgICAgIH0pLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgLy8gUGVyc2lzdCB0byBlcGlzb2RpYyBtZW1vcnkKICAgICAgICBjb25zdCB0YXNrID0gYXdhaXQgcmVhZFRhc2soaW5zdGFuY2UudGFza0lkKS5jYXRjaCgoKSA9PiBudWxsKTsKICAgICAgICBpZiAodGFzaykgewogICAgICAgICAgICByZW1lbWJlclRhc2tPdXRjb21lKHsgLi4udGFzaywgc3RhdHVzOiBuZXdTdGF0ZSwgZXhpdENvZGU6IGNvZGUgPz8gdW5kZWZpbmVkIH0sIG91dHB1dCkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICB9CiAgICAgICAgLy8gU3luYyBib2FyZCB0YXNrIHN0YXRlIChzdXJ2aXZlcyBzZXJ2ZXIgcmVzdGFydHMg4oCUIGlubGluZSBzcGF3biBsaXN0ZW5lcnMgZG9uJ3QpCiAgICAgICAgaWYgKHRhc2s/LmJvYXJkVGFza0lkKSB7CiAgICAgICAgICAgIHVwZGF0ZUJvYXJkVGFza1N0YXRlKHRhc2suYm9hcmRUYXNrSWQsIHN1Y2Nlc3MKICAgICAgICAgICAgICAgID8geyBzdGF0ZTogImRvbmUiIH0KICAgICAgICAgICAgICAgIDogeyBzdGF0ZTogInRvZG8iLCBhc3NpZ25lZTogbnVsbCB9KS5jYXRjaCgoKSA9PiB7IH0pOwogICAgICAgIH0KICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50ICR7bmV3U3RhdGV9OiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgIGRldGFpbDogYEV4aXQgY29kZSAke2NvZGV9LCBpbnN0YW5jZSAke2luc3RhbmNlSWR9YCwKICAgICAgICB9KTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFsOiByZXRyeSBsb2dpYwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqCiAgICAgKiBFbWl0IHRlcm1pbmFsIGZhaWx1cmUgZXZlbnQgYW5kIGZpbmFsaXplIHRhc2sgc3RvcmUgKyBtZW1vcnkuCiAgICAgKiBDYWxsZWQgd2hlbiBhbGwgcmV0cmllcyBhcmUgZXhoYXVzdGVkIG9yIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yIG9jY3VycwogICAgICogd2l0aGluIHRoZSByZXRyeSBwYXRoLiBUaGlzIGVuc3VyZXMgZXh0ZXJuYWwgbGlzdGVuZXJzIChzcGF3bi50cyBiYXRjaAogICAgICogdHJhY2tpbmcpIGFyZSBub3RpZmllZCBhbmQgdGhlIHRhc2sgc3RvcmUgcmVmbGVjdHMgdGhlIGZpbmFsIHN0YXRlLgogICAgICoKICAgICAqIFdpdGhvdXQgdGhpcywgdGFza3MgdGhhdCBmYWlsIGR1cmluZyByZXRyaWVzIHdvdWxkIGxlYXZlIHRoZSB0YXNrIHN0b3JlCiAgICAgKiBpbiBhIHN0YWxlICJydW5uaW5nIiBzdGF0ZSBhbmQgYmF0Y2ggY29udGludWF0aW9uIHdvdWxkIG5ldmVyIHRyaWdnZXIuCiAgICAgKi8KICAgIGFzeW5jIGZpbmFsaXplVGVybWluYWxGYWlsdXJlKGluc3RhbmNlLCBlcnJvcikgewogICAgICAgIGNvbnN0IGZpbmFsRXJyb3IgPSBlcnJvciA/PyBpbnN0YW5jZS5lcnJvciA/PyB7CiAgICAgICAgICAgIGNvZGU6IEVycm9yQ29kZXMuTUFYX1JFVFJJRVNfRVhDRUVERUQsCiAgICAgICAgICAgIG1lc3NhZ2U6ICJBZ2VudCBmYWlsZWQgYWZ0ZXIgYWxsIHJldHJ5IGF0dGVtcHRzIiwKICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIHJlY292ZXJhYmxlOiBmYWxzZSwKICAgICAgICB9OwogICAgICAgIHRoaXMuYnVzLmVtaXRGYWlsZWQoaW5zdGFuY2UuaWQsIGZpbmFsRXJyb3IpOwogICAgICAgIHRoaXMuYnVzLnVuc3Vic2NyaWJlKGluc3RhbmNlLmlkKTsKICAgICAgICAvLyBVcGRhdGUgbGlua2VkIEFnZW50VGFzawogICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJlYWRUYXNrT3V0cHV0KGluc3RhbmNlLnRhc2tJZCkuY2F0Y2goKCkgPT4gIiIpOwogICAgICAgIGNvbnN0IHJlc3VsdFN1bW1hcnkgPSBvdXRwdXQudHJpbSgpLnNsaWNlKDAsIDEwMDApIHx8IHVuZGVmaW5lZDsKICAgICAgICBhd2FpdCB1cGRhdGVUYXNrKGluc3RhbmNlLnRhc2tJZCwgewogICAgICAgICAgICBzdGF0dXM6ICJmYWlsZWQiLAogICAgICAgICAgICBmaW5pc2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIHJlc3VsdFN1bW1hcnksCiAgICAgICAgfSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICAvLyBQZXJzaXN0IHRvIGVwaXNvZGljIG1lbW9yeQogICAgICAgIGNvbnN0IHRhc2sgPSBhd2FpdCByZWFkVGFzayhpbnN0YW5jZS50YXNrSWQpLmNhdGNoKCgpID0+IG51bGwpOwogICAgICAgIGlmICh0YXNrKSB7CiAgICAgICAgICAgIHJlbWVtYmVyVGFza091dGNvbWUoeyAuLi50YXNrLCBzdGF0dXM6ICJmYWlsZWQiIH0sIG91dHB1dCkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICB9CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCBmYWlsZWQgKHRlcm1pbmFsKTogJHtpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbH1gLAogICAgICAgICAgICBkZXRhaWw6IGAke2luc3RhbmNlLnJldHJ5Q291bnR9IHJldHJpZXMgZXhoYXVzdGVkLCBpbnN0YW5jZSAke2luc3RhbmNlLmlkfWAsCiAgICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBtYXliZVJldHJ5KGluc3RhbmNlKSB7CiAgICAgICAgLy8gR3VhcmQ6IHByZXZlbnQgZHVwbGljYXRlIHJldHJ5IHNjaGVkdWxpbmcgZm9yIHRoZSBzYW1lIGluc3RhbmNlLgogICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIG1vbml0b3IgcG9sbCBhbmQgZHJpdmVyIGV4aXQgaGFuZGxlciBib3RoIHRyaWdnZXIgaGFuZGxlRXhpdC4KICAgICAgICBpZiAodGhpcy5yZXRyeVBlbmRpbmcuaGFzKGluc3RhbmNlLmlkKSkgewogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgUmV0cnkgYWxyZWFkeSBwZW5kaW5nLCBza2lwcGluZyBkdXBsaWNhdGU6ICR7aW5zdGFuY2UubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogYEluc3RhbmNlICR7aW5zdGFuY2UuaWR9LCByZXRyeUNvdW50PSR7aW5zdGFuY2UucmV0cnlDb3VudH1gLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBkZWxheSA9IHNob3VsZFJldHJ5KGluc3RhbmNlKTsKICAgICAgICBpZiAoZGVsYXkgPT09IG51bGwpIHsKICAgICAgICAgICAgLy8gUmV0cmllcyBleGhhdXN0ZWQg4oCUIGVtaXQgdGVybWluYWwgZmFpbHVyZSBmb3IgZXh0ZXJuYWwgbGlzdGVuZXJzLgogICAgICAgICAgICAvLyBoYW5kbGVFeGl0IGFuZCBzcGF3bigpIHNraXAgZW1pdHRpbmcgYWdlbnQ6ZmFpbGVkIHdoZW4gcmV0cnkgd2FzCiAgICAgICAgICAgIC8vIHBvc3NpYmxlLCBzbyB0aGlzIGlzIHRoZSB0ZXJtaW5hbCBub3RpZmljYXRpb24gcGF0aC4KICAgICAgICAgICAgY29uc3QgdGVybWluYWxFcnJvciA9IGluc3RhbmNlLmVycm9yID8/IHsKICAgICAgICAgICAgICAgIGNvZGU6IEVycm9yQ29kZXMuTUFYX1JFVFJJRVNfRVhDRUVERUQsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTWF4IHJldHJpZXMgKCR7aW5zdGFuY2UuY29uZmlnLm1heFJldHJpZXN9KSBleGNlZWRlZCBhZnRlciAke2luc3RhbmNlLnJldHJ5Q291bnR9IGF0dGVtcHRzYCwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICAgICAgcmVjb3ZlcmFibGU6IGZhbHNlLAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoaW5zdGFuY2UucmV0cnlDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50IG1heCByZXRyaWVzIGV4Y2VlZGVkOiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgJHtpbnN0YW5jZS5yZXRyeUNvdW50fS8ke2luc3RhbmNlLmNvbmZpZy5tYXhSZXRyaWVzfSBhdHRlbXB0cywgaW5zdGFuY2UgJHtpbnN0YW5jZS5pZH1gLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgdGhpcy5maW5hbGl6ZVRlcm1pbmFsRmFpbHVyZShpbnN0YW5jZSwgdGVybWluYWxFcnJvcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2sgZ2xvYmFsIHJldHJ5IGJ1ZGdldCB0byBwcmV2ZW50IHJldHJ5IHN0b3JtcyB3aGVuIG1hbnkgYWdlbnRzIGZhaWwgYXQgb25jZQogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgdGhpcy5nbG9iYWxSZXRyeVRpbWVzdGFtcHMgPSB0aGlzLmdsb2JhbFJldHJ5VGltZXN0YW1wcy5maWx0ZXIoKHQpID0+IG5vdyAtIHQgPCBSdW50aW1lTWFuYWdlci5HTE9CQUxfUkVUUllfV0lORE9XX01TKTsKICAgICAgICBpZiAodGhpcy5nbG9iYWxSZXRyeVRpbWVzdGFtcHMubGVuZ3RoID49IHRoaXMuZ2xvYmFsUmV0cnlCdWRnZXQpIHsKICAgICAgICAgICAgY29uc3QgYnVkZ2V0RXJyb3IgPSB7CiAgICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLk1BWF9SRVRSSUVTX0VYQ0VFREVELAogICAgICAgICAgICAgICAgbWVzc2FnZTogYEdsb2JhbCByZXRyeSBidWRnZXQgZXhoYXVzdGVkOiAke3RoaXMuZ2xvYmFsUmV0cnlUaW1lc3RhbXBzLmxlbmd0aH0gcmV0cmllcyBpbiAke1J1bnRpbWVNYW5hZ2VyLkdMT0JBTF9SRVRSWV9XSU5ET1dfTVMgLyA2MF8wMDB9bWluIHdpbmRvd2AsCiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgIHJlY292ZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYEdsb2JhbCByZXRyeSBidWRnZXQgZXhoYXVzdGVkLCBmYWlsaW5nOiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgICAgICBkZXRhaWw6IGAke3RoaXMuZ2xvYmFsUmV0cnlUaW1lc3RhbXBzLmxlbmd0aH0vJHt0aGlzLmdsb2JhbFJldHJ5QnVkZ2V0fSByZXRyaWVzIGluICR7UnVudGltZU1hbmFnZXIuR0xPQkFMX1JFVFJZX1dJTkRPV19NUyAvIDYwXzAwMH1taW4sIGluc3RhbmNlICR7aW5zdGFuY2UuaWR9YCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluYWxpemVUZXJtaW5hbEZhaWx1cmUoaW5zdGFuY2UsIGJ1ZGdldEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBNYXJrIHRoaXMgaW5zdGFuY2UgYXMgaGF2aW5nIGEgcGVuZGluZyByZXRyeQogICAgICAgIHRoaXMucmV0cnlQZW5kaW5nLmFkZChpbnN0YW5jZS5pZCk7CiAgICAgICAgdGhpcy5nbG9iYWxSZXRyeVRpbWVzdGFtcHMucHVzaChub3cpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgcmV0cnlpbmcgaW4gJHtkZWxheX1tczogJHtpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbH1gLAogICAgICAgICAgICBkZXRhaWw6IGBBdHRlbXB0ICR7aW5zdGFuY2UucmV0cnlDb3VudCArIDF9LyR7aW5zdGFuY2UuY29uZmlnLm1heFJldHJpZXN9LCBpbnN0YW5jZSAke2luc3RhbmNlLmlkfSwgZ2xvYmFsIHJldHJpZXM6ICR7dGhpcy5nbG9iYWxSZXRyeVRpbWVzdGFtcHMubGVuZ3RofS8ke3RoaXMuZ2xvYmFsUmV0cnlCdWRnZXR9YCwKICAgICAgICB9KTsKICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5yZXRyeVBlbmRpbmcuZGVsZXRlKGluc3RhbmNlLmlkKTsKICAgICAgICAgICAgbGV0IHJlc291cmNlc0FsbG9jYXRlZCA9IGZhbHNlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgcmV0cnlFdmVudCA9IHByZXBhcmVSZXRyeShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICB0aGlzLmJ1cy5lbWl0TGlmZWN5Y2xlKHJldHJ5RXZlbnQpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RyeS51cGRhdGUoaW5zdGFuY2UuaWQsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZTogImluaXRpYWxpemluZyIsCiAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudDogaW5zdGFuY2UucmV0cnlDb3VudCwKICAgICAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgIHBpZDogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWRBdDogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogaW5zdGFuY2UudXBkYXRlZEF0LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBSZS1yZWFkIHRoZSBvcmlnaW5hbCB0YXNrIGZvciB0aGUgcHJvbXB0CiAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gYXdhaXQgcmVhZFRhc2soaW5zdGFuY2UudGFza0lkKS5jYXRjaCgoKSA9PiBudWxsKTsKICAgICAgICAgICAgICAgIGlmICh0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuX3Byb21wdCA9IHRhc2sucHJvbXB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmUtYWxsb2NhdGUgYW5kIHNwYXduCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2VzLmNhbkFsbG9jYXRlKGluc3RhbmNlLnJlc291cmNlcykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZXNvdXJjZXMgdW5hdmFpbGFibGUg4oCUIGZhaWwgdGhlIHJldHJ5IGluc3RlYWQgb2YgbGVhdmluZyBhIHpvbWJpZQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlJFU09VUkNFX0VYSEFVU1RFRCwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFJlc291cmNlcyB1bmF2YWlsYWJsZSBmb3IgcmV0cnkgYXR0ZW1wdCAke2luc3RhbmNlLnJldHJ5Q291bnR9YCwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnN0YXRlID0gImZhaWxlZCI7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZXJyb3IgPSBlcnJvcjsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS51cGRhdGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RyeS51cGRhdGUoaW5zdGFuY2UuaWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6ICJmYWlsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBpbnN0YW5jZS51cGRhdGVkQXQsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCByZXRyeSBhYm9ydGVkIChyZXNvdXJjZXMgZXhoYXVzdGVkKTogJHtpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbH1gLAogICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGBBdHRlbXB0ICR7aW5zdGFuY2UucmV0cnlDb3VudH0vJHtpbnN0YW5jZS5jb25maWcubWF4UmV0cmllc30sIGluc3RhbmNlICR7aW5zdGFuY2UuaWR9YCwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbmFsaXplVGVybWluYWxGYWlsdXJlKGluc3RhbmNlLCBlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMuYWxsb2NhdGUoaW5zdGFuY2UuaWQsIGluc3RhbmNlLnJlc291cmNlcyk7CiAgICAgICAgICAgICAgICByZXNvdXJjZXNBbGxvY2F0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc3QgcGlkID0gYXdhaXQgdGhpcy5kcml2ZXIuc3Bhd24oaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgaW5zdGFuY2UucGlkID0gcGlkOwogICAgICAgICAgICAgICAgY29uc3QgcnVuRXZlbnQgPSB0cmFuc2l0aW9uKGluc3RhbmNlLCAicnVubmluZyIsICJSZXRyeSBzcGF3bmVkIik7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnVwZGF0ZShpbnN0YW5jZS5pZCwgewogICAgICAgICAgICAgICAgICAgIHN0YXRlOiAicnVubmluZyIsCiAgICAgICAgICAgICAgICAgICAgcGlkLAogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogaW5zdGFuY2UudXBkYXRlZEF0LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmJ1cy5lbWl0TGlmZWN5Y2xlKHJ1bkV2ZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuYnVzLmVtaXRTcGF3bmVkKGluc3RhbmNlLmlkLCBwaWQpOwogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgcmV0cnkgc3Bhd25lZDogJHtpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbH1gLAogICAgICAgICAgICAgICAgICAgIGRldGFpbDogYEF0dGVtcHQgJHtpbnN0YW5jZS5yZXRyeUNvdW50fS8ke2luc3RhbmNlLmNvbmZpZy5tYXhSZXRyaWVzfSwgUElEICR7cGlkfSwgaW5zdGFuY2UgJHtpbnN0YW5jZS5pZH1gLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoIm9uRXhpdCIgaW4gdGhpcy5kcml2ZXIgJiYgdHlwZW9mIHRoaXMuZHJpdmVyLm9uRXhpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyCiAgICAgICAgICAgICAgICAgICAgICAgIC5vbkV4aXQoaW5zdGFuY2UuaWQsIChjb2RlKSA9PiB0aGlzLmhhbmRsZUV4aXQoaW5zdGFuY2UuaWQsIGNvZGUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBvbiByZXRyeSBmYWlsdXJlOiByZWxlYXNlIHJlc291cmNlcyBhbmQgZmFpbCB0aGUgaW5zdGFuY2UKICAgICAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgem9tYmllIGFnZW50cyBzdHVjayBpbiAiaW5pdGlhbGl6aW5nIiBmb3JldmVyCiAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzQWxsb2NhdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMucmVsZWFzZShpbnN0YW5jZS5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNQQVdOX0ZBSUxFRCwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgUmV0cnkgc3Bhd24gZmFpbGVkOiAke2Vyci5tZXNzYWdlfWAsCiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgcmVjb3ZlcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGluc3RhbmNlLnN0YXRlID0gImZhaWxlZCI7CiAgICAgICAgICAgICAgICBpbnN0YW5jZS5lcnJvciA9IGVycm9yOwogICAgICAgICAgICAgICAgaW5zdGFuY2UudXBkYXRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RyeS51cGRhdGUoaW5zdGFuY2UuaWQsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZTogImZhaWxlZCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBpbnN0YW5jZS51cGRhdGVkQXQsCiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7IH0pOwogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgcmV0cnkgc3Bhd24gZmFpbGVkOiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgQXR0ZW1wdCAke2luc3RhbmNlLnJldHJ5Q291bnR9LyR7aW5zdGFuY2UuY29uZmlnLm1heFJldHJpZXN9OiAke2Vyci5tZXNzYWdlfSwgaW5zdGFuY2UgJHtpbnN0YW5jZS5pZH1gLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbmFsaXplVGVybWluYWxGYWlsdXJlKGluc3RhbmNlLCBlcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBkZWxheSk7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBJbnRlcm5hbDogcmVjb3Zlcnkgb24gc3RhcnR1cAogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgYXN5bmMgcmVjb3ZlckFnZW50cygpIHsKICAgICAgICBjb25zdCBpbnN0YW5jZXMgPSB0aGlzLnJlZ2lzdHJ5Lmxpc3RBY3RpdmUoKTsKICAgICAgICAvLyBTa2lwIHJlY292ZXJ5IGVudGlyZWx5IHdoZW4gdGhlcmUncyBub3RoaW5nIHRvIHJlY292ZXIgKGNvbGQgc3RhcnQpCiAgICAgICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgbG9nLmluZm8oIk5vIGFjdGl2ZSBpbnN0YW5jZXMgdG8gcmVjb3ZlciIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCByZWNvdmVyZWQgPSAwOwogICAgICAgIGxldCBtYXJrZWQgPSAwOwogICAgICAgIC8vIFNlcGFyYXRlIGFsaXZlLCBkZWFkLCBhbmQgaW5pdGlhbGl6aW5nIGluc3RhbmNlcyBmb3IgcGFyYWxsZWwgcmVjb3ZlcnkKICAgICAgICBjb25zdCBhbGl2ZSA9IFtdOwogICAgICAgIGNvbnN0IGRlYWQgPSBbXTsKICAgICAgICBjb25zdCBpbml0aWFsaXppbmcgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGluc3RhbmNlcykgewogICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09ICJydW5uaW5nIiB8fCBpbnN0YW5jZS5zdGF0ZSA9PT0gInJlc3VtaW5nIikgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLmlzQWxpdmUoaW5zdGFuY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgYWxpdmUucHVzaChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkZWFkLnB1c2goaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGluc3RhbmNlLnN0YXRlID09PSAiaW5pdGlhbGl6aW5nIikgewogICAgICAgICAgICAgICAgaW5pdGlhbGl6aW5nLnB1c2goaW5zdGFuY2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIENvdW50IGFsaXZlIGFnZW50cyAobm8gSS9PIG5lZWRlZCkKICAgICAgICByZWNvdmVyZWQgPSBhbGl2ZS5sZW5ndGg7CiAgICAgICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBhbGl2ZSkgewogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgUmVjb3ZlcmVkIHJ1bm5pbmcgYWdlbnQ6ICR7aW5zdGFuY2UubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogYFBJRCAke2luc3RhbmNlLnBpZH0gc3RpbGwgYWxpdmVgLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gUmVjb3ZlciBkZWFkIGFnZW50cyBpbiBwYXJhbGxlbCAoZWFjaCByZWFkcyB0YXNrIG91dHB1dCkKICAgICAgICBpZiAoZGVhZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG1hcmtlZCArPSBkZWFkLmxlbmd0aDsKICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZGVhZC5tYXAoYXN5bmMgKGluc3RhbmNlKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZWFkVGFza091dHB1dChpbnN0YW5jZS50YXNrSWQpLmNhdGNoKCgpID0+ICIiKTsKICAgICAgICAgICAgICAgIGNvbnN0IGhhc091dHB1dCA9IG91dHB1dC50cmltKCkubGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsU3RhdGUgPSBoYXNPdXRwdXQgPyAiY29tcGxldGVkIiA6ICJmYWlsZWQiOwogICAgICAgICAgICAgICAgaWYgKGhhc091dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24oaW5zdGFuY2UsICJjb21wbGV0ZWQiLCAiUmVjb3ZlcmVkIGFmdGVyIHJlc3RhcnQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkRSSVZFUl9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlByb2Nlc3MgZGllZCB3aGlsZSBydW50aW1lIHdhcyBkb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24oaW5zdGFuY2UsICJmYWlsZWQiLCAiRGllZCBkdXJpbmcgZG93bnRpbWUiLCBlcnJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnVwZGF0ZShpbnN0YW5jZS5pZCwgewogICAgICAgICAgICAgICAgICAgIHN0YXRlOiBpbnN0YW5jZS5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICBlcnJvcjogaW5zdGFuY2UuZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZEF0OiBpbnN0YW5jZS50ZXJtaW5hdGVkQXQsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBpbnN0YW5jZS51cGRhdGVkQXQsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYFJlY292ZXJlZCAke2ZpbmFsU3RhdGV9IGFnZW50OiAke2luc3RhbmNlLm1ldGFkYXRhLmxhYmVsfWAsCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgUElEICR7aW5zdGFuY2UucGlkfSB3YXMgZGVhZGAsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvLyBSZWNvdmVyIGluaXRpYWxpemluZyBhZ2VudHMgaW4gcGFyYWxsZWwKICAgICAgICBpZiAoaW5pdGlhbGl6aW5nLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbWFya2VkICs9IGluaXRpYWxpemluZy5sZW5ndGg7CiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGluaXRpYWxpemluZy5tYXAoYXN5bmMgKGluc3RhbmNlKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkRSSVZFUl9FUlJPUiwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiUnVudGltZSByZXN0YXJ0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICByZWNvdmVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKGluc3RhbmNlLCAiZmFpbGVkIiwgIlJ1bnRpbWUgcmVzdGFydGVkIiwgZXJyb3IpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RyeS51cGRhdGUoaW5zdGFuY2UuaWQsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZTogImZhaWxlZCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBpbnN0YW5jZS51cGRhdGVkQXQsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWF5YmVSZXRyeShpbnN0YW5jZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlY292ZXJlZCA+IDAgfHwgbWFya2VkID4gMCkgewogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgUnVudGltZSByZWNvdmVyeTogJHtyZWNvdmVyZWR9IGFsaXZlLCAke21hcmtlZH0gcmVzb2x2ZWRgLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBJbnRlcm5hbDogbW9uaXRvcmluZwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgc3RhcnRNb25pdG9yKCkgewogICAgICAgIGlmICh0aGlzLm1vbml0b3JUaW1lcikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMubW9uaXRvclRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICB0aGlzLm1vbml0b3JDeWNsZSgpLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogIlJ1bnRpbWUgbW9uaXRvciBlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBlcnIubWVzc2FnZSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LCB0aGlzLmNvbmZpZy5tb25pdG9ySW50ZXJ2YWxNcyk7CiAgICB9CiAgICBzdG9wTW9uaXRvcigpIHsKICAgICAgICBpZiAodGhpcy5tb25pdG9yVGltZXIpIHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm1vbml0b3JUaW1lcik7CiAgICAgICAgICAgIHRoaXMubW9uaXRvclRpbWVyID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICBhc3luYyBtb25pdG9yQ3ljbGUoKSB7CiAgICAgICAgY29uc3QgcnVubmluZyA9IHRoaXMucmVnaXN0cnkubGlzdCh7IHN0YXRlOiAicnVubmluZyIgfSk7CiAgICAgICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBydW5uaW5nKSB7CiAgICAgICAgICAgIC8vIFNraXAgaW5zdGFuY2VzIHdpdGggcGVuZGluZyByZXRyaWVzIG9yIGFjdGl2ZSBoYW5kbGVFeGl0IHByb2Nlc3NpbmcKICAgICAgICAgICAgLy8gdG8gcHJldmVudCBjb25jdXJyZW50IGV4aXQgaGFuZGxpbmcgdGhhdCBjYXVzZXMgZHVwbGljYXRlIHJldHJ5IHNjaGVkdWxpbmcKICAgICAgICAgICAgaWYgKHRoaXMucmV0cnlQZW5kaW5nLmhhcyhpbnN0YW5jZS5pZCkgfHwgdGhpcy5oYW5kbGVFeGl0R3VhcmQuaGFzKGluc3RhbmNlLmlkKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRyaXZlci5pc0FsaXZlKGluc3RhbmNlKSkgewogICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBkaWVkIHdpdGhvdXQgdHJpZ2dlcmluZyBleGl0IGhhbmRsZXIgKHJlY292ZXJlZCBQSUQpCiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4aXQoaW5zdGFuY2UuaWQsIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEVtaXQgcmVzb3VyY2Ugd2FybmluZyBpZiBuZWFyaW5nIGNhcGFjaXR5CiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnJlc291cmNlcy5zbmFwc2hvdCgpOwogICAgICAgIGNvbnN0IGFnZW50UmF0aW8gPSBzbmFwc2hvdC5hY3RpdmVBZ2VudHMgLyBzbmFwc2hvdC5tYXhBZ2VudHM7CiAgICAgICAgY29uc3QgbWVtb3J5UmF0aW8gPSBzbmFwc2hvdC50b3RhbE1lbW9yeU1CIC8gc25hcHNob3QubWF4TWVtb3J5TUI7CiAgICAgICAgaWYgKGFnZW50UmF0aW8gPiAwLjggfHwgbWVtb3J5UmF0aW8gPiAwLjgpIHsKICAgICAgICAgICAgdGhpcy5idXMuZW1pdFJlc291cmNlV2FybmluZyhzbmFwc2hvdCk7CiAgICAgICAgfQogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSGVscGVycwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgcmVxdWlyZUluc3RhbmNlKGlkKSB7CiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnJlZ2lzdHJ5LmdldChpZCk7CiAgICAgICAgaWYgKCFpbnN0YW5jZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKEVycm9yQ29kZXMuQUdFTlRfTk9UX0ZPVU5ELCBgQWdlbnQgaW5zdGFuY2Ugbm90IGZvdW5kOiAke2lkfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9CiAgICBhc3NlcnRTdGF0ZShpbnN0YW5jZSwgZXhwZWN0ZWQpIHsKICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGV4cGVjdGVkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoRXJyb3JDb2Rlcy5JTlZBTElEX1RSQU5TSVRJT04sIGBFeHBlY3RlZCBhZ2VudCBzdGF0ZSAnJHtleHBlY3RlZH0nLCBnb3QgJyR7aW5zdGFuY2Uuc3RhdGV9J2AsIGZhbHNlLCB7IGFnZW50SWQ6IGluc3RhbmNlLmlkLCBhY3R1YWw6IGluc3RhbmNlLnN0YXRlLCBleHBlY3RlZCB9KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERldGVjdCBkZXRlcm1pbmlzdGljIGZhaWx1cmVzIHRoYXQgd29uJ3Qgc3VjY2VlZCBvbiByZXRyeS4KICAgICAqIENoZWNrcyBvdXRwdXQgZm9yIHBhdHRlcm5zIGxpa2UgVHlwZVNjcmlwdCBlcnJvcnMsIG1pc3NpbmcgbW9kdWxlcywgZXRjLgogICAgICogQSBicm9hZGVyIHBhdHRlcm4gc2V0IHByZXZlbnRzIHdhc3RpbmcgcmV0cnkgYnVkZ2V0IG9uIG5vbi1yZWNvdmVyYWJsZSBlcnJvcnMuCiAgICAgKi8KICAgIGlzRGV0ZXJtaW5pc3RpY0ZhaWx1cmUob3V0cHV0LCBjb2RlKSB7CiAgICAgICAgLy8gbnVsbCBleGl0IGNvZGUgPSBzaWduYWwvT09NIOKAlCB3b3J0aCByZXRyeWluZwogICAgICAgIGlmIChjb2RlID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgLy8gQ2hlY2sgb3V0cHV0IGZvciBwYXR0ZXJucyB0aGF0IGluZGljYXRlIGEgZGV0ZXJtaW5pc3RpYyBmYWlsdXJlCiAgICAgICAgY29uc3QgdGFpbCA9IG91dHB1dC5zbGljZSgtMzAwMCk7CiAgICAgICAgY29uc3QgZGV0ZXJtaW5pc3RpY1BhdHRlcm5zID0gWwogICAgICAgICAgICAvZXJyb3IgVFNcZCs6L2ksIC8vIFR5cGVTY3JpcHQgY29tcGlsYXRpb24gZXJyb3JzCiAgICAgICAgICAgIC9TeW50YXhFcnJvcjovLCAvLyBKUy9UUyBzeW50YXggZXJyb3JzCiAgICAgICAgICAgIC9DYW5ub3QgZmluZCBtb2R1bGUvLCAvLyBNaXNzaW5nIG1vZHVsZSAod29uJ3QgYXBwZWFyIG9uIHJldHJ5KQogICAgICAgICAgICAvTW9kdWxlIG5vdCBmb3VuZC8sIC8vIFNhbWUKICAgICAgICAgICAgL0VOT0VOVC4qbm8gc3VjaCBmaWxlL2ksIC8vIE1pc3NpbmcgZmlsZQogICAgICAgICAgICAvUGVybWlzc2lvbiBkZW5pZWQvaSwgLy8gUGVybWlzc2lvbiBpc3N1ZXMgKHdvbid0IHNlbGYtcmVzb2x2ZSkKICAgICAgICAgICAgL0VBQ0NFUy8sIC8vIEFjY2VzcyBkZW5pZWQgKGZpbGVzeXN0ZW0pCiAgICAgICAgICAgIC9FTk9TUEMvaSwgLy8gRGlzayBmdWxsCiAgICAgICAgICAgIC9JbnZhbGlkIEFQSSBrZXkvaSwgLy8gQXV0aCBlcnJvcnMgKHdvbid0IHNlbGYtcmVzb2x2ZSkKICAgICAgICAgICAgL2F1dGhlbnRpY2F0aW9uIGZhaWxlZC9pLCAvLyBBdXRoIGVycm9ycwogICAgICAgICAgICAvdW5hdXRob3JpemVkL2ksIC8vIDQwMSBlcnJvcnMKICAgICAgICAgICAgL2ZvcmJpZGRlbi9pLCAvLyA0MDMgZXJyb3JzCiAgICAgICAgICAgIC8gNDAyWzpcc10vLCAvLyBQYXltZW50IHJlcXVpcmVkIChpbnN1ZmZpY2llbnQgY3JlZGl0cykKICAgICAgICAgICAgL2luc3VmZmljaWVudC5jcmVkaXRzL2ksIC8vIE9wZW5Sb3V0ZXIgY3JlZGl0IGV4aGF1c3Rpb24KICAgICAgICAgICAgL3BheW1lbnQucmVxdWlyZWQvaSwgLy8gQmlsbGluZyBlcnJvcnMKICAgICAgICAgICAgL291dCBvZi4qY3JlZGl0cy9pLCAvLyBDcmVkaXQgZXhoYXVzdGlvbiB2YXJpYW50CiAgICAgICAgICAgIC9jYW4nP3QgYWZmb3JkL2ksIC8vIE9wZW5Sb3V0ZXIgImNhbid0IGFmZm9yZCIgbWVzc2FnZQogICAgICAgICAgICAvRVJSX0lOVkFMSURfQVJHX1RZUEUvLCAvLyBQcm9ncmFtbWluZyBlcnJvcgogICAgICAgICAgICAvVHlwZUVycm9yOi4qaXMgbm90IGEgZnVuY3Rpb24vLCAvLyBQcm9ncmFtbWluZyBlcnJvcgogICAgICAgICAgICAvUmVmZXJlbmNlRXJyb3I6LywgLy8gVW5kZWZpbmVkIHZhcmlhYmxlCiAgICAgICAgICAgIC9FTk9NRU0vaSwgLy8gT3V0IG9mIG1lbW9yeSAoc3lzdGVtLWxldmVsKQogICAgICAgIF07CiAgICAgICAgcmV0dXJuIGRldGVybWluaXN0aWNQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QodGFpbCkpOwogICAgfQogICAgdG9BZ2VudEVycm9yKGVyciwgY29kZSwgcmVjb3ZlcmFibGUpIHsKICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNvZGUsCiAgICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICByZWNvdmVyYWJsZSwKICAgICAgICB9OwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hbmFnZXIuanMubWFw","agents/runtime/registry.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIEFnZW50IGluc3RhbmNlIHJlZ2lzdHJ5LgogKgogKiBJbi1tZW1vcnkgbWFwIG9mIEFnZW50SW5zdGFuY2Ugb2JqZWN0cyB3aXRoIGZpbGUtYmFja2VkIHBlcnNpc3RlbmNlLgogKiBGb2xsb3dzIENvcmUgcGF0dGVybnM6IEpTT04gZmlsZXMgaW4gYnJhaW4vYWdlbnRzL3J1bnRpbWUvLCBhdG9taWMgd3JpdGVzLgogKi8KaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUsIHJlYWRkaXIsIHJlbmFtZSwgdW5saW5rIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gIm5vZGU6Y3J5cHRvIjsKaW1wb3J0IHsgVEVSTUlOQUxfU1RBVEVTIH0gZnJvbSAiLi90eXBlcy5qcyI7Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWdpc3RyeQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXhwb3J0IGNsYXNzIEFnZW50UmVnaXN0cnkgewogICAgcGVyc2lzdERpcjsKICAgIGluc3RhbmNlcyA9IG5ldyBNYXAoKTsKICAgIGluaXRpYWxpemVkID0gZmFsc2U7CiAgICBjb25zdHJ1Y3RvcihwZXJzaXN0RGlyKSB7CiAgICAgICAgdGhpcy5wZXJzaXN0RGlyID0gcGVyc2lzdERpcjsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEluaXRpYWxpemF0aW9uCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogRW5zdXJlIHBlcnNpc3QgZGlyZWN0b3J5IGV4aXN0cyBhbmQgbG9hZCBhbGwgaW5zdGFuY2VzIGZyb20gZGlzay4gKi8KICAgIGFzeW5jIGluaXQoKSB7CiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBhd2FpdCBta2Rpcih0aGlzLnBlcnNpc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgIGF3YWl0IHRoaXMubG9hZEFsbCgpOwogICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gQ1JVRAogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEdlbmVyYXRlIGEgdW5pcXVlIGluc3RhbmNlIElELiAqLwogICAgZ2VuZXJhdGVJZCgpIHsKICAgICAgICByZXR1cm4gYHJ0XyR7RGF0ZS5ub3coKX1fJHtyYW5kb21CeXRlcyg0KS50b1N0cmluZygiaGV4Iil9YDsKICAgIH0KICAgIC8qKiBSZWdpc3RlciBhIG5ldyBpbnN0YW5jZS4gUGVyc2lzdHMgdG8gZGlzay4gKi8KICAgIGFzeW5jIHJlZ2lzdGVyKGluc3RhbmNlKSB7CiAgICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlLmlkLCBpbnN0YW5jZSk7CiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KGluc3RhbmNlKTsKICAgIH0KICAgIC8qKiBHZXQgYW4gaW5zdGFuY2UgYnkgSUQuICovCiAgICBnZXQoaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuZ2V0KGlkKTsKICAgIH0KICAgIC8qKiBHZXQgYW4gaW5zdGFuY2UgYnkgaXRzIGxpbmtlZCB0YXNrSWQuICovCiAgICBnZXRCeVRhc2tJZCh0YXNrSWQpIHsKICAgICAgICBmb3IgKGNvbnN0IGluc3Qgb2YgdGhpcy5pbnN0YW5jZXMudmFsdWVzKCkpIHsKICAgICAgICAgICAgaWYgKGluc3QudGFza0lkID09PSB0YXNrSWQpCiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGFuIGluc3RhbmNlIChtZXJnZSBwYXJ0aWFsIGZpZWxkcykuIFBlcnNpc3RzIHRvIGRpc2suCiAgICAgKiBXaGVuIGBza2lwUGVyc2lzdGAgaXMgdHJ1ZSwgdXBkYXRlcyBpbi1tZW1vcnkgb25seSAodXNlZCBmb3IgdGVybWluYWwKICAgICAqIHN0YXRlIHRyYW5zaXRpb25zIOKAlCBHQyB3aWxsIGRlbGV0ZSB0aGUgZmlsZSB3aXRoaW4gZ2NUdGxNcyBhbnl3YXksCiAgICAgKiBzbyB0aGUgZGlzayB3cml0ZSBpcyB3YXN0ZWQgSS9PKS4KICAgICAqLwogICAgYXN5bmMgdXBkYXRlKGlkLCBwYXJ0aWFsLCBza2lwUGVyc2lzdCA9IGZhbHNlKSB7CiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQoaWQpOwogICAgICAgIGlmICghaW5zdGFuY2UpCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwgcGFydGlhbCk7CiAgICAgICAgaW5zdGFuY2UudXBkYXRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgIGlmICghc2tpcFBlcnNpc3QpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KGluc3RhbmNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfQogICAgLyoqIExpc3QgYWxsIGluc3RhbmNlcywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdGF0ZS4gKi8KICAgIGxpc3QoZmlsdGVyKSB7CiAgICAgICAgaWYgKCFmaWx0ZXIpCiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuaW5zdGFuY2VzLnZhbHVlcygpKTsKICAgICAgICAvLyBVc2UgU2V0IGZvciBPKDEpIHN0YXRlIGxvb2t1cHMgd2hlbiBmaWx0ZXJpbmcgYnkgbXVsdGlwbGUgc3RhdGVzCiAgICAgICAgY29uc3Qgc3RhdGVTZXQgPSBmaWx0ZXIuc3RhdGVzID8gbmV3IFNldChmaWx0ZXIuc3RhdGVzKSA6IG51bGw7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgZm9yIChjb25zdCBpbnN0IG9mIHRoaXMuaW5zdGFuY2VzLnZhbHVlcygpKSB7CiAgICAgICAgICAgIGlmIChmaWx0ZXIuc3RhdGUgJiYgaW5zdC5zdGF0ZSAhPT0gZmlsdGVyLnN0YXRlKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChzdGF0ZVNldCAmJiAhc3RhdGVTZXQuaGFzKGluc3Quc3RhdGUpKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluc3QpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqIExpc3QgYWxsIGFjdGl2ZSAobm9uLXRlcm1pbmFsKSBpbnN0YW5jZXMuICovCiAgICBsaXN0QWN0aXZlKCkgewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuaW5zdGFuY2VzLnZhbHVlcygpKS5maWx0ZXIoKGluc3QpID0+ICFURVJNSU5BTF9TVEFURVMuaGFzKGluc3Quc3RhdGUpKTsKICAgIH0KICAgIC8qKiBDb3VudCBpbnN0YW5jZXMgYnkgc3RhdGUuICovCiAgICBjb3VudEJ5U3RhdGUoKSB7CiAgICAgICAgY29uc3QgY291bnRzID0ge307CiAgICAgICAgZm9yIChjb25zdCBpbnN0IG9mIHRoaXMuaW5zdGFuY2VzLnZhbHVlcygpKSB7CiAgICAgICAgICAgIGNvdW50c1tpbnN0LnN0YXRlXSA9IChjb3VudHNbaW5zdC5zdGF0ZV0gfHwgMCkgKyAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY291bnRzOwogICAgfQogICAgLyoqIFRvdGFsIG51bWJlciBvZiB0cmFja2VkIGluc3RhbmNlcy4gKi8KICAgIGdldCBzaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlcy5zaXplOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUGVyc2lzdGVuY2UKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBBdG9taWMgd3JpdGU6IGluc3RhbmNlIOKGkiBKU09OIGZpbGUuIFVzZXMgY29tcGFjdCBKU09OIChubyBpbmRlbnRhdGlvbikuICovCiAgICBhc3luYyBwZXJzaXN0KGluc3RhbmNlKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gam9pbih0aGlzLnBlcnNpc3REaXIsIGAke2luc3RhbmNlLmlkfS5qc29uYCk7CiAgICAgICAgY29uc3QgdG1wID0gdGFyZ2V0ICsgIi50bXAiOwogICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0bXAsIEpTT04uc3RyaW5naWZ5KGluc3RhbmNlKSwgInV0Zi04Iik7CiAgICAgICAgYXdhaXQgcmVuYW1lKHRtcCwgdGFyZ2V0KTsKICAgIH0KICAgIC8qKiBMb2FkIGFsbCBpbnN0YW5jZSBmaWxlcyBmcm9tIHRoZSBwZXJzaXN0IGRpcmVjdG9yeSAocGFyYWxsZWwgSS9PKS4gKi8KICAgIGFzeW5jIGxvYWRBbGwoKSB7CiAgICAgICAgbGV0IGZpbGVzOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZpbGVzID0gYXdhaXQgcmVhZGRpcih0aGlzLnBlcnNpc3REaXIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QganNvbkZpbGVzID0gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKCIuanNvbiIpKTsKICAgICAgICBpZiAoanNvbkZpbGVzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIC8vIFJlYWQgYWxsIGZpbGVzIGluIHBhcmFsbGVsIGluc3RlYWQgb2Ygc2VxdWVudGlhbGx5CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChqc29uRmlsZXMubWFwKChmKSA9PiByZWFkRmlsZShqb2luKHRoaXMucGVyc2lzdERpciwgZiksICJ1dGYtOCIpKSk7CiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykgewogICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gImZ1bGZpbGxlZCIpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gSlNPTi5wYXJzZShyZXN1bHQudmFsdWUpOwogICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlLmlkLCBpbnN0YW5jZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgLy8gU2tpcCBjb3JydXB0ZWQgZmlsZXMKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIENsZWFudXAKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBSZW1vdmUgYSBzaW5nbGUgaW5zdGFuY2UgZnJvbSBtZW1vcnkgYW5kIGRlbGV0ZSBpdHMgcGVyc2lzdCBmaWxlLiAqLwogICAgYXN5bmMgcmVtb3ZlKGlkKSB7CiAgICAgICAgY29uc3QgZXhpc3RlZCA9IHRoaXMuaW5zdGFuY2VzLmRlbGV0ZShpZCk7CiAgICAgICAgaWYgKGV4aXN0ZWQpIHsKICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gam9pbih0aGlzLnBlcnNpc3REaXIsIGAke2lkfS5qc29uYCk7CiAgICAgICAgICAgIGF3YWl0IHVubGluayh0YXJnZXQpLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBleGlzdGVkOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgbXVsdGlwbGUgaW5zdGFuY2VzIHdpdGggY2h1bmtlZCBmaWxlIGRlbGV0aW9uLgogICAgICogRGVsZXRlcyBmcm9tIGluLW1lbW9yeSBtYXAgZmlyc3QgKGZhc3QpLCB0aGVuIGRlbGV0ZXMgZmlsZXMgaW4gY2h1bmtzCiAgICAgKiB0byByZWR1Y2UgTlRGUyBkaXJlY3RvcnkgbG9jayBjb250ZW50aW9uIG9uIFdpbmRvd3MgKERBU0gtMTM5KS4KICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgYWN0dWFsbHkgcmVtb3ZlZC4KICAgICAqLwogICAgYXN5bmMgcmVtb3ZlTWFueShpZHMpIHsKICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlcy5kZWxldGUoaWQpKSB7CiAgICAgICAgICAgICAgICB0b0RlbGV0ZS5wdXNoKGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodG9EZWxldGUubGVuZ3RoID4gMCkgewogICAgICAgICAgICBjb25zdCBDSFVOSyA9IDIwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvRGVsZXRlLmxlbmd0aDsgaSArPSBDSFVOSykgewogICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodG9EZWxldGUuc2xpY2UoaSwgaSArIENIVU5LKS5tYXAoKGlkKSA9PiB1bmxpbmsoam9pbih0aGlzLnBlcnNpc3REaXIsIGAke2lkfS5qc29uYCkpLmNhdGNoKCgpID0+IHsgfSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9EZWxldGUubGVuZ3RoOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGZyb20gdGhlIGluLW1lbW9yeSBtYXAgb25seSAobm8gZmlsZSBJL08pLgogICAgICogUmV0dXJucyB0aGUgSURzIHRoYXQgd2VyZSBhY3R1YWxseSByZW1vdmVkIGFuZCB0aGVpciBwZXJzaXN0IGZpbGUgcGF0aHMsCiAgICAgKiBzbyB0aGUgY2FsbGVyIGNhbiBiYXRjaC1kZWxldGUgdGhlbSBhbG9uZ3NpZGUgb3RoZXIgZmlsZXMgaW4gYSBzaW5nbGUgcGFzcy4KICAgICAqLwogICAgcmVtb3ZlTWFueUluTWVtb3J5KGlkcykgewogICAgICAgIGNvbnN0IGZpbGVQYXRocyA9IFtdOwogICAgICAgIGxldCByZW1vdmVkID0gMDsKICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykgewogICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZXMuZGVsZXRlKGlkKSkgewogICAgICAgICAgICAgICAgcmVtb3ZlZCsrOwogICAgICAgICAgICAgICAgZmlsZVBhdGhzLnB1c2goam9pbih0aGlzLnBlcnNpc3REaXIsIGAke2lkfS5qc29uYCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbW92ZWQsIGZpbGVQYXRocyB9OwogICAgfQogICAgLyoqIENsZWFyIGFsbCBpbi1tZW1vcnkgaW5zdGFuY2VzLiBEb2VzIG5vdCBkZWxldGUgZmlsZXMuICovCiAgICBjbGVhcigpIHsKICAgICAgICB0aGlzLmluc3RhbmNlcy5jbGVhcigpOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdHJ5LmpzLm1hcA==","agents/runtime/resources.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIFJlc291cmNlIGFsbG9jYXRpb24gYW5kIHRyYWNraW5nLgogKgogKiBUcmFja3MgYWdncmVnYXRlIHJlc291cmNlIHVzYWdlIGFjcm9zcyBhbGwgYWN0aXZlIGFnZW50cy4KICogRW5mb3JjZXMgbGltaXRzIG9uIGNvbmN1cnJlbnQgYWdlbnRzIGFuZCB0b3RhbCBtZW1vcnkuCiAqIFF1ZXVlcyBzcGF3biByZXF1ZXN0cyB3aGVuIHJlc291cmNlcyBhcmUgZXhoYXVzdGVkLgogKi8KaW1wb3J0IHsgUnVudGltZUVycm9yLCBFcnJvckNvZGVzIH0gZnJvbSAiLi9lcnJvcnMuanMiOwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUmVzb3VyY2UgcG9vbAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXhwb3J0IGNsYXNzIFJlc291cmNlUG9vbCB7CiAgICBjb25maWc7CiAgICAvKiogQWN0aXZlIGFnZW50IGFsbG9jYXRpb25zLCBrZXllZCBieSBhZ2VudCBJRC4gKi8KICAgIGFsbG9jYXRpb25zID0gbmV3IE1hcCgpOwogICAgLyoqIFF1ZXVlZCBzcGF3biByZXF1ZXN0cyB3YWl0aW5nIGZvciByZXNvdXJjZXMsIG9yZGVyZWQgYnkgcHJpb3JpdHkuICovCiAgICB3YWl0UXVldWUgPSBbXTsKICAgIGNvbnN0cnVjdG9yKGNvbmZpZykgewogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUXVlcmllcwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEN1cnJlbnQgbnVtYmVyIG9mIGFjdGl2ZSBhZ2VudCBhbGxvY2F0aW9ucy4gKi8KICAgIGdldCBhY3RpdmVDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5hbGxvY2F0aW9ucy5zaXplOwogICAgfQogICAgLyoqIE51bWJlciBvZiBxdWV1ZWQgcmVxdWVzdHMuICovCiAgICBnZXQgcXVldWVMZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMud2FpdFF1ZXVlLmxlbmd0aDsKICAgIH0KICAgIC8qKiBUb3RhbCBtZW1vcnkgY3VycmVudGx5IGFsbG9jYXRlZC4gKi8KICAgIGdldCB0b3RhbE1lbW9yeU1CKCkgewogICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgZm9yIChjb25zdCBhbGxvYyBvZiB0aGlzLmFsbG9jYXRpb25zLnZhbHVlcygpKSB7CiAgICAgICAgICAgIHRvdGFsICs9IGFsbG9jLm1lbW9yeUxpbWl0TUI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0b3RhbDsKICAgIH0KICAgIC8qKiBTbmFwc2hvdCBvZiBjdXJyZW50IHJlc291cmNlIHVzYWdlLiAqLwogICAgc25hcHNob3QoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYWN0aXZlQWdlbnRzOiB0aGlzLmFjdGl2ZUNvdW50LAogICAgICAgICAgICBtYXhBZ2VudHM6IHRoaXMuY29uZmlnLm1heENvbmN1cnJlbnRBZ2VudHMsCiAgICAgICAgICAgIHRvdGFsTWVtb3J5TUI6IHRoaXMudG90YWxNZW1vcnlNQiwKICAgICAgICAgICAgbWF4TWVtb3J5TUI6IHRoaXMuY29uZmlnLm1heFRvdGFsTWVtb3J5TUIsCiAgICAgICAgICAgIHF1ZXVlZFJlcXVlc3RzOiB0aGlzLnF1ZXVlTGVuZ3RoLAogICAgICAgIH07CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBBbGxvY2F0aW9uCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogQ2hlY2sgaWYgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgZm9yIGEgZ2l2ZW4gYWxsb2NhdGlvbi4gKi8KICAgIGNhbkFsbG9jYXRlKHJlc291cmNlcykgewogICAgICAgIGlmICh0aGlzLmFjdGl2ZUNvdW50ID49IHRoaXMuY29uZmlnLm1heENvbmN1cnJlbnRBZ2VudHMpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAodGhpcy50b3RhbE1lbW9yeU1CICsgcmVzb3VyY2VzLm1lbW9yeUxpbWl0TUIgPiB0aGlzLmNvbmZpZy5tYXhUb3RhbE1lbW9yeU1CKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFJlc2VydmUgcmVzb3VyY2VzIGZvciBhbiBhZ2VudC4gVGhyb3dzIGlmIGxpbWl0cyBleGNlZWRlZC4KICAgICAqIENhbGwgdGhpcyBpbW1lZGlhdGVseSBiZWZvcmUgc3Bhd25pbmcuCiAgICAgKi8KICAgIGFsbG9jYXRlKGFnZW50SWQsIHJlc291cmNlcykgewogICAgICAgIGlmICh0aGlzLmFsbG9jYXRpb25zLmhhcyhhZ2VudElkKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKEVycm9yQ29kZXMuUkVTT1VSQ0VfRVhIQVVTVEVELCBgQWdlbnQgJHthZ2VudElkfSBhbHJlYWR5IGhhcyByZXNvdXJjZXMgYWxsb2NhdGVkYCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5hY3RpdmVDb3VudCA+PSB0aGlzLmNvbmZpZy5tYXhDb25jdXJyZW50QWdlbnRzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoRXJyb3JDb2Rlcy5NQVhfQUdFTlRTX1JFQUNIRUQsIGBDYW5ub3QgYWxsb2NhdGU6ICR7dGhpcy5hY3RpdmVDb3VudH0vJHt0aGlzLmNvbmZpZy5tYXhDb25jdXJyZW50QWdlbnRzfSBhZ2VudHMgYWN0aXZlYCwgdHJ1ZSwgeyBhY3RpdmVDb3VudDogdGhpcy5hY3RpdmVDb3VudCwgbWF4OiB0aGlzLmNvbmZpZy5tYXhDb25jdXJyZW50QWdlbnRzIH0pOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy50b3RhbE1lbW9yeU1CICsgcmVzb3VyY2VzLm1lbW9yeUxpbWl0TUIgPiB0aGlzLmNvbmZpZy5tYXhUb3RhbE1lbW9yeU1CKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoRXJyb3JDb2Rlcy5NRU1PUllfTElNSVRfRVhDRUVERUQsIGBDYW5ub3QgYWxsb2NhdGUgJHtyZXNvdXJjZXMubWVtb3J5TGltaXRNQn1NQjogJHt0aGlzLnRvdGFsTWVtb3J5TUJ9LyR7dGhpcy5jb25maWcubWF4VG90YWxNZW1vcnlNQn1NQiB1c2VkYCwgdHJ1ZSwgeyByZXF1ZXN0ZWQ6IHJlc291cmNlcy5tZW1vcnlMaW1pdE1CLCB1c2VkOiB0aGlzLnRvdGFsTWVtb3J5TUIsIG1heDogdGhpcy5jb25maWcubWF4VG90YWxNZW1vcnlNQiB9KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5hbGxvY2F0aW9ucy5zZXQoYWdlbnRJZCwgeyAuLi5yZXNvdXJjZXMgfSk7CiAgICB9CiAgICAvKiogUmVsZWFzZSByZXNvdXJjZXMgd2hlbiBhbiBhZ2VudCB0ZXJtaW5hdGVzLiBEcmFpbnMgdGhlIHdhaXQgcXVldWUgaWYgcG9zc2libGUuICovCiAgICByZWxlYXNlKGFnZW50SWQpIHsKICAgICAgICB0aGlzLmFsbG9jYXRpb25zLmRlbGV0ZShhZ2VudElkKTsKICAgICAgICB0aGlzLmRyYWluUXVldWUoKTsKICAgIH0KICAgIC8qKiBVcGRhdGUgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbiAoZS5nLiwgYWZ0ZXIgcmVzaXplKS4gKi8KICAgIHVwZGF0ZUFsbG9jYXRpb24oYWdlbnRJZCwgcmVzb3VyY2VzKSB7CiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuYWxsb2NhdGlvbnMuZ2V0KGFnZW50SWQpOwogICAgICAgIGlmICghY3VycmVudCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGlmIChyZXNvdXJjZXMubWVtb3J5TGltaXRNQiAhPSBudWxsKQogICAgICAgICAgICBjdXJyZW50Lm1lbW9yeUxpbWl0TUIgPSByZXNvdXJjZXMubWVtb3J5TGltaXRNQjsKICAgICAgICBpZiAocmVzb3VyY2VzLmNwdVdlaWdodCAhPSBudWxsKQogICAgICAgICAgICBjdXJyZW50LmNwdVdlaWdodCA9IHJlc291cmNlcy5jcHVXZWlnaHQ7CiAgICB9CiAgICAvKiogR2V0IHRoZSBhbGxvY2F0aW9uIGZvciBhIHNwZWNpZmljIGFnZW50LiAqLwogICAgZ2V0QWxsb2NhdGlvbihhZ2VudElkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWxsb2NhdGlvbnMuZ2V0KGFnZW50SWQpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gV2FpdCBxdWV1ZQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqCiAgICAgKiBFbnF1ZXVlIGEgc3Bhd24gcmVxdWVzdCB0byB3YWl0IGZvciByZXNvdXJjZXMuCiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUuCiAgICAgKi8KICAgIGVucXVldWUocmVxdWVzdCwgcHJpb3JpdHkgPSA1MCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIHRoaXMud2FpdFF1ZXVlLnB1c2goewogICAgICAgICAgICAgICAgcmVxdWVzdCwKICAgICAgICAgICAgICAgIHJlc29sdmUsCiAgICAgICAgICAgICAgICByZWplY3QsCiAgICAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgICAgIGVucXVldWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIFNvcnQgYnkgcHJpb3JpdHkgKGxvd2VyIG51bWJlciA9IGhpZ2hlciBwcmlvcml0eSkKICAgICAgICAgICAgdGhpcy53YWl0UXVldWUuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqIFJlamVjdCBhbGwgcXVldWVkIHJlcXVlc3RzIChlLmcuLCBvbiBzaHV0ZG93bikuICovCiAgICByZWplY3RBbGwocmVhc29uKSB7CiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLndhaXRRdWV1ZSkgewogICAgICAgICAgICBlbnRyeS5yZWplY3QobmV3IFJ1bnRpbWVFcnJvcihFcnJvckNvZGVzLlNIVVRET1dOX0lOX1BST0dSRVNTLCByZWFzb24sIGZhbHNlKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMud2FpdFF1ZXVlID0gW107CiAgICB9CiAgICAvKiogRHJhaW4gdGhlIHF1ZXVlOiByZXNvbHZlIGFzIG1hbnkgd2FpdGluZyByZXF1ZXN0cyBhcyBjYXBhY2l0eSBhbGxvd3MuICovCiAgICBkcmFpblF1ZXVlKCkgewogICAgICAgIHdoaWxlICh0aGlzLndhaXRRdWV1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLndhaXRRdWV1ZVswXTsKICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gewogICAgICAgICAgICAgICAgbWVtb3J5TGltaXRNQjogdGhpcy5jb25maWcuZGVmYXVsdE1lbW9yeUxpbWl0TUIsCiAgICAgICAgICAgICAgICBjcHVXZWlnaHQ6IHRoaXMuY29uZmlnLmRlZmF1bHRDcHVXZWlnaHQsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICghdGhpcy5jYW5BbGxvY2F0ZShyZXNvdXJjZXMpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIHRoaXMud2FpdFF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgIG5leHQucmVzb2x2ZSgpOwogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIENsZWFudXAKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBDbGVhciBhbGwgYWxsb2NhdGlvbnMgYW5kIHF1ZXVlZCByZXF1ZXN0cy4gRm9yIHNodXRkb3duLiAqLwogICAgY2xlYXIoKSB7CiAgICAgICAgdGhpcy5hbGxvY2F0aW9ucy5jbGVhcigpOwogICAgICAgIHRoaXMucmVqZWN0QWxsKCJSZXNvdXJjZSBwb29sIGNsZWFyZWQiKTsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1yZXNvdXJjZXMuanMubWFw","agents/runtime/types.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRW52aXJvbm1lbnQg4oCUIFR5cGUgZGVmaW5pdGlvbnMuCiAqCiAqIERlZmluZXMgdGhlIGNvcmUgYWJzdHJhY3Rpb25zIGZvciBhZ2VudCBsaWZlY3ljbGUgbWFuYWdlbWVudCwKICogcmVzb3VyY2UgYWxsb2NhdGlvbiwgaW50ZXItYWdlbnQgbWVzc2FnaW5nLCBhbmQgZHJpdmVyIGludGVyZmFjZS4KICovCi8qKiBBbGwgdmFsaWQgc3RhdGUgdHJhbnNpdGlvbnMuICovCmV4cG9ydCBjb25zdCBWQUxJRF9UUkFOU0lUSU9OUyA9IHsKICAgIGluaXRpYWxpemluZzogWyJydW5uaW5nIiwgImZhaWxlZCJdLAogICAgcnVubmluZzogWyJwYXVzZWQiLCAidGVybWluYXRpbmciLCAiY29tcGxldGVkIiwgImZhaWxlZCJdLAogICAgcGF1c2VkOiBbInJlc3VtaW5nIiwgInRlcm1pbmF0aW5nIl0sCiAgICByZXN1bWluZzogWyJydW5uaW5nIiwgImZhaWxlZCJdLAogICAgdGVybWluYXRpbmc6IFsidGVybWluYXRlZCJdLAogICAgdGVybWluYXRlZDogW10sCiAgICBmYWlsZWQ6IFtdLAogICAgY29tcGxldGVkOiBbXSwKfTsKLyoqIFRlcm1pbmFsIHN0YXRlcyDigJQgbm8gZnVydGhlciB0cmFuc2l0aW9ucyBwb3NzaWJsZS4gKi8KZXhwb3J0IGNvbnN0IFRFUk1JTkFMX1NUQVRFUyA9IG5ldyBTZXQoWwogICAgInRlcm1pbmF0ZWQiLAogICAgImZhaWxlZCIsCiAgICAiY29tcGxldGVkIiwKXSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcA==","agents/instance-manager.js":"LyoqCiAqIEFnZW50IEluc3RhbmNlIE1hbmFnZXIgKERBU0gtNikuCiAqCiAqIEhpZ2hlci1sZXZlbCBvcmNoZXN0cmF0b3Igb24gdG9wIG9mIFJ1bnRpbWVNYW5hZ2VyIHRoYXQgYWRkczoKICogLSBSZXN0YXJ0ICh0ZXJtaW5hdGUgKyByZXNwYXduIHdpdGggc2FtZSBjb25maWcpCiAqIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGZvciB0ZXJtaW5hdGVkIGluc3RhbmNlcwogKiAtIExvYWQtYmFsYW5jZWQgc3Bhd24gcGxhY2VtZW50CiAqIC0gSXNvbGF0aW9uIC8gc2FuZGJveGluZyBlbmZvcmNlbWVudAogKiAtIEluc3RhbmNlIGhlYWx0aCBzY29yaW5nIGFuZCBhdXRvbWF0aWMgcmVjb3ZlcnkKICogLSBMaWZlY3ljbGUgaGlzdG9yeSB0cmFja2luZyBwZXIgaW5zdGFuY2UKICogLSBCYXRjaCBvcGVyYXRpb25zIChwYXVzZS90ZXJtaW5hdGUgYnkgdGFnLCBvcmlnaW4sIGV0Yy4pCiAqIC0gUnVudGltZUJ1cyBldmVudCBpbnRlZ3JhdGlvbiBmb3IgbWV0cmljcwogKi8KaW1wb3J0IHsgdW5saW5rIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBURVJNSU5BTF9TVEFURVMgfSBmcm9tICIuL3J1bnRpbWUvdHlwZXMuanMiOwppbXBvcnQgeyBSdW50aW1lRXJyb3IsIEVycm9yQ29kZXMgfSBmcm9tICIuL3J1bnRpbWUvZXJyb3JzLmpzIjsKaW1wb3J0IHsgVEFTS1NfRElSLCBMT0dTX0RJUiB9IGZyb20gIi4vc3RvcmUuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiYWdlbnQtaW5zdGFuY2UtbWdyIik7CmNvbnN0IERFRkFVTFRfQ09ORklHID0gewogICAgZ2NJbnRlcnZhbE1zOiAzMF8wMDAsCiAgICBnY1R0bE1zOiA1ICogNjBfMDAwLAogICAgaGVhbHRoQ2hlY2tJbnRlcnZhbE1zOiAzMF8wMDAsCiAgICB1bmhlYWx0aHlUaHJlc2hvbGQ6IDMsCiAgICBtYXhIaXN0b3J5UGVySW5zdGFuY2U6IDUwLAogICAgYXV0b1JlY292ZXI6IHRydWUsCiAgICBtYXhBdXRvUmVzdGFydHM6IDIsCiAgICBzYW5kYm94Um9vdDogImJyYWluL2FnZW50cy9zYW5kYm94ZXMiLAogICAgZ2NCYXRjaFNpemU6IDEwMCwKICAgIGdjTWluSW50ZXJ2YWxNczogNV8wMDAsCn07Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJbnN0YW5jZSBNYW5hZ2VyCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHBvcnQgY2xhc3MgQWdlbnRJbnN0YW5jZU1hbmFnZXIgewogICAgY29uZmlnOwogICAgcnVudGltZTsKICAgIG1ldGEgPSBuZXcgTWFwKCk7CiAgICBnY1RpbWVyID0gbnVsbDsKICAgIGdjQWRhcHRpdmVUaW1lciA9IG51bGw7CiAgICBoZWFsdGhUaW1lciA9IG51bGw7CiAgICBkZXN0cm95ZWQgPSBmYWxzZTsKICAgIGdjUnVubmluZyA9IGZhbHNlOwogICAgZ2NNZXRyaWNzID0gewogICAgICAgIHRvdGFsQ3ljbGVzOiAwLAogICAgICAgIHRvdGFsQ29sbGVjdGVkOiAwLAogICAgICAgIHRvdGFsVGltZU1zOiAwLAogICAgICAgIHBlYWtDb2xsZWN0ZWQ6IDAsCiAgICAgICAgcGVha1RpbWVNczogMCwKICAgICAgICBjYXBwZWRDeWNsZXM6IDAsCiAgICAgICAgYWRhcHRpdmVSdW5zOiAwLAogICAgICAgIHBlYWtGaWxlRGVsZXRlTXM6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBDYWNoZWQgdGVybWluYWwgc3RhdGVzIGFycmF5IOKAlCBhdm9pZHMgc3ByZWFkaW5nIHRoZSBTZXQgZXZlcnkgR0MgY3ljbGUuCiAgICAgKiBURVJNSU5BTF9TVEFURVMgaXMgYSBSZWFkb25seVNldCB0aGF0IG5ldmVyIGNoYW5nZXMgYXQgcnVudGltZS4KICAgICAqLwogICAgdGVybWluYWxTdGF0ZXNBcnJheSA9IFsuLi5URVJNSU5BTF9TVEFURVNdOwogICAgLyoqCiAgICAgKiBIYXJkIGxpbWl0IG9uIHBlbmRpbmcgdGVybWluYWwgaW5zdGFuY2VzIGJlZm9yZSBmb3JjaW5nIHN5bmNocm9ub3VzCiAgICAgKiBjb2xsZWN0aW9uIG91dHNpZGUgdGhlIG5vcm1hbCBHQyBzY2hlZHVsZSAoQi0wMTApLgogICAgICovCiAgICBzdGF0aWMgQkFDS0xPR19IQVJEX0xJTUlUID0gNTAwOwogICAgY29uc3RydWN0b3IocnVudGltZSwgY29uZmlnKSB7CiAgICAgICAgdGhpcy5ydW50aW1lID0gcnVudGltZTsKICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLmNvbmZpZyB9OwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSW5pdGlhbGl6YXRpb24gJiBzaHV0ZG93bgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEF0dGFjaCB0byBSdW50aW1lQnVzIGV2ZW50cywgc3RhcnQgR0MgYW5kIGhlYWx0aCB0aW1lcnMuICovCiAgICBhc3luYyBpbml0KCkgewogICAgICAgIGxvZy5pbmZvKCJJbml0aWFsaXppbmcgaW5zdGFuY2UgbWFuYWdlciIsIHsgZ2NJbnRlcnZhbE1zOiB0aGlzLmNvbmZpZy5nY0ludGVydmFsTXMsIGhlYWx0aENoZWNrSW50ZXJ2YWxNczogdGhpcy5jb25maWcuaGVhbHRoQ2hlY2tJbnRlcnZhbE1zIH0pOwogICAgICAgIHRoaXMuYXR0YWNoQnVzTGlzdGVuZXJzKCk7CiAgICAgICAgdGhpcy5zdGFydEdjKCk7CiAgICAgICAgdGhpcy5zdGFydEhlYWx0aENoZWNrcygpOwogICAgICAgIC8vIE1ldGFkYXRhIGlzIGNyZWF0ZWQgbGF6aWx5IGJ5IGVuc3VyZU1ldGEoKSBvbiBmaXJzdCBhY2Nlc3MgcGVyIGluc3RhbmNlCiAgICAgICAgLy8gKHZpYSBidXMgbGlzdGVuZXJzLCBoZWFsdGggY2hlY2tzLCBvciBzcGF3bi9yZXN0YXJ0IGNhbGxzKSwgc28gdGhlcmUncwogICAgICAgIC8vIG5vIG5lZWQgZm9yIGFuIGVhZ2VyIGJvb3RzdHJhcCBsb29wIG92ZXIgYWxsIGV4aXN0aW5nIGluc3RhbmNlcy4KICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogIkluc3RhbmNlIG1hbmFnZXIgaW5pdGlhbGl6ZWQiLAogICAgICAgICAgICBkZXRhaWw6IGBHQyBldmVyeSAke3RoaXMuY29uZmlnLmdjSW50ZXJ2YWxNc31tcywgaGVhbHRoIGV2ZXJ5ICR7dGhpcy5jb25maWcuaGVhbHRoQ2hlY2tJbnRlcnZhbE1zfW1zYCwKICAgICAgICB9KTsKICAgIH0KICAgIC8qKiBTdG9wIHRpbWVycywgZGV0YWNoIGxpc3RlbmVycywgY2xlYXIgbWV0YWRhdGEuICovCiAgICBhc3luYyBzaHV0ZG93bigpIHsKICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgdGhpcy5zdG9wR2MoKTsKICAgICAgICB0aGlzLnN0b3BIZWFsdGhDaGVja3MoKTsKICAgICAgICB0aGlzLm1ldGEuY2xlYXIoKTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogIkluc3RhbmNlIG1hbmFnZXIgc2h1dCBkb3duIiwKICAgICAgICB9KTsKICAgIH0KICAgIC8qKiBHZXQgY3VtdWxhdGl2ZSBHQyBwZXJmb3JtYW5jZSBtZXRyaWNzLiAqLwogICAgZ2V0R2NNZXRyaWNzKCkgewogICAgICAgIHJldHVybiB7IC4uLnRoaXMuZ2NNZXRyaWNzIH07CiAgICB9CiAgICAvKioKICAgICAqIEZvcmNlIGFuIGltbWVkaWF0ZSBHQyBjeWNsZSwgYnlwYXNzaW5nIHRoZSB0aW1lciBzY2hlZHVsZS4KICAgICAqIFVzZWZ1bCB3aGVuIGV4dGVybmFsIGNvZGUgZGV0ZWN0cyBhIGJhY2tsb2cgb2YgdGVybWluYWwgaW5zdGFuY2VzLgogICAgICogTm8tb3AgaWYgYSBHQyBjeWNsZSBpcyBhbHJlYWR5IHJ1bm5pbmcuCiAgICAgKi8KICAgIGFzeW5jIGZvcmNlR2MoKSB7CiAgICAgICAgaWYgKHRoaXMuZ2NSdW5uaW5nIHx8IHRoaXMuZGVzdHJveWVkKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgYXdhaXQgdGhpcy5ydW5HYygpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gTGlmZWN5Y2xlIG9wZXJhdGlvbnMgKGRlbGVnYXRlICsgZW5oYW5jZSkKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBTcGF3biBhIG5ldyBhZ2VudCBpbnN0YW5jZSB3aXRoIGxvYWQtYmFsYW5jZWQgcmVzb3VyY2Ugc2VsZWN0aW9uLiAqLwogICAgYXN5bmMgc3Bhd24ocmVxdWVzdCkgewogICAgICAgIC8vIEFwcGx5IGlzb2xhdGlvbiBlbmZvcmNlbWVudAogICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZW5mb3JjZUlzb2xhdGlvbihyZXF1ZXN0KTsKICAgICAgICAvLyBMb2FkLWJhbGFuY2U6IGFkanVzdCByZXNvdXJjZSBhbGxvY2F0aW9uIGJhc2VkIG9uIGN1cnJlbnQgdXRpbGl6YXRpb24KICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLmJhbGFuY2VSZXNvdXJjZXMocmVxdWVzdC5yZXNvdXJjZXMpOwogICAgICAgIGNvbnN0IGVucmljaGVkUmVxdWVzdCA9IHsKICAgICAgICAgICAgLi4ucmVxdWVzdCwKICAgICAgICAgICAgY29uZmlnLAogICAgICAgICAgICByZXNvdXJjZXMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IHRoaXMucnVudGltZS5zcGF3bihlbnJpY2hlZFJlcXVlc3QpOwogICAgICAgIC8vIFRyYWNrIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGZvciByZXN0YXJ0IGNhcGFiaWxpdHkKICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5lbnN1cmVNZXRhKGluc3RhbmNlLmlkKTsKICAgICAgICBtZXRhLm9yaWdpbmFsUmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfQogICAgLyoqIFBhdXNlIGEgcnVubmluZyBpbnN0YW5jZS4gKi8KICAgIGFzeW5jIHBhdXNlKGluc3RhbmNlSWQsIHJlYXNvbikgewogICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWUucGF1c2UoaW5zdGFuY2VJZCwgcmVhc29uKTsKICAgIH0KICAgIC8qKiBSZXN1bWUgYSBwYXVzZWQgaW5zdGFuY2UuICovCiAgICBhc3luYyByZXN1bWUoaW5zdGFuY2VJZCkgewogICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWUucmVzdW1lKGluc3RhbmNlSWQpOwogICAgfQogICAgLyoqIFRlcm1pbmF0ZSBhbiBpbnN0YW5jZS4gKi8KICAgIGFzeW5jIHRlcm1pbmF0ZShpbnN0YW5jZUlkLCByZWFzb24pIHsKICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lLnRlcm1pbmF0ZShpbnN0YW5jZUlkLCByZWFzb24pOwogICAgfQogICAgLyoqIFJlc3RhcnQgdGltaW5nIG1ldHJpY3MgZnJvbSBsYXN0IHJlc3RhcnQgY2FsbC4gKi8KICAgIGxhc3RSZXN0YXJ0VGltaW5nOwogICAgLyoqIEdldCB0aW1pbmcgYnJlYWtkb3duIGZyb20gdGhlIG1vc3QgcmVjZW50IHJlc3RhcnQoKS4gKi8KICAgIGdldExhc3RSZXN0YXJ0VGltaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmxhc3RSZXN0YXJ0VGltaW5nOwogICAgfQogICAgLyoqCiAgICAgKiBSZXN0YXJ0IGFuIGluc3RhbmNlOiB0ZXJtaW5hdGUsIHRoZW4gcmVzcGF3biB3aXRoIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24uCiAgICAgKiBSZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgKG5ldyBJRCwgZnJlc2ggc3RhdGUpLgogICAgICoKICAgICAqIE9wdGltaXplZDogcHJlcGFyZXMgc3Bhd24gcmVxdWVzdCBjb25jdXJyZW50bHkgd2l0aCB0ZXJtaW5hdGlvbiwKICAgICAqIGFuZCB1c2VzIGZhc3QtdGVybWluYXRlIChza2lwcyByZWR1bmRhbnQgdGFzayBzdG9yZSB1cGRhdGUgc2luY2UgdGhlCiAgICAgKiB0YXNrIHdpbGwgYmUgcmUtdXNlZCBieSB0aGUgbmV3IGluc3RhbmNlKS4KICAgICAqLwogICAgYXN5bmMgcmVzdGFydChpbnN0YW5jZUlkLCByZWFzb24pIHsKICAgICAgICBjb25zdCByZXN0YXJ0U3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIGNvbnN0IHRpbWluZyA9IHsKICAgICAgICAgICAgdGVybWluYXRlTXM6IDAsCiAgICAgICAgICAgIHNwYXduUHJlcE1zOiAwLAogICAgICAgICAgICBzcGF3bk1zOiAwLAogICAgICAgICAgICB0b3RhbE1zOiAwLAogICAgICAgIH07CiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnJ1bnRpbWUuZ2V0SW5zdGFuY2UoaW5zdGFuY2VJZCk7CiAgICAgICAgaWYgKCFpbnN0YW5jZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKEVycm9yQ29kZXMuQUdFTlRfTk9UX0ZPVU5ELCBgQ2Fubm90IHJlc3RhcnQ6IGluc3RhbmNlIG5vdCBmb3VuZDogJHtpbnN0YW5jZUlkfWApOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5lbnN1cmVNZXRhKGluc3RhbmNlSWQpOwogICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWVzdCA9IG1ldGEub3JpZ2luYWxSZXF1ZXN0OwogICAgICAgIC8vIFByZXBhcmUgc3Bhd24gcmVxdWVzdCBjb25jdXJyZW50bHkgd2l0aCB0ZXJtaW5hdGlvbiDigJQgbm8gSS9PIG5lZWRlZAogICAgICAgIGNvbnN0IHByZXBTdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgY29uc3Qgc3Bhd25SZXF1ZXN0ID0gb3JpZ2luYWxSZXF1ZXN0ID8/IHsKICAgICAgICAgICAgdGFza0lkOiBpbnN0YW5jZS50YXNrSWQsCiAgICAgICAgICAgIGxhYmVsOiBpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbCwKICAgICAgICAgICAgcHJvbXB0OiAiIiwgLy8gV2lsbCBiZSByZS1yZWFkIGZyb20gdGFzayBzdG9yZSBieSBkcml2ZXIKICAgICAgICAgICAgb3JpZ2luOiBpbnN0YW5jZS5tZXRhZGF0YS5vcmlnaW4sCiAgICAgICAgICAgIHBhcmVudElkOiBpbnN0YW5jZS5tZXRhZGF0YS5wYXJlbnRJZCwKICAgICAgICAgICAgdGFnczogaW5zdGFuY2UubWV0YWRhdGEudGFncywKICAgICAgICAgICAgY29uZmlnOiBpbnN0YW5jZS5jb25maWcsCiAgICAgICAgICAgIHJlc291cmNlczogaW5zdGFuY2UucmVzb3VyY2VzLAogICAgICAgIH07CiAgICAgICAgdGltaW5nLnNwYXduUHJlcE1zID0gRGF0ZS5ub3coKSAtIHByZXBTdGFydDsKICAgICAgICAvLyBUZXJtaW5hdGUgaWYgc3RpbGwgYWN0aXZlICh1c2VzIGZhc3QgdGVybWluYXRlIOKAlCBza2lwcyB0YXNrIHN0b3JlIHVwZGF0ZQogICAgICAgIC8vIHNpbmNlIHRoZSB0YXNrIHdpbGwgYmUgcmUtdXNlZCBieSB0aGUgbmV3IGluc3RhbmNlKQogICAgICAgIGlmICghVEVSTUlOQUxfU1RBVEVTLmhhcyhpbnN0YW5jZS5zdGF0ZSkpIHsKICAgICAgICAgICAgY29uc3QgdGVybVN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW50aW1lLnRlcm1pbmF0ZShpbnN0YW5jZUlkLCByZWFzb24gPz8gIlJlc3RhcnRpbmciKTsKICAgICAgICAgICAgdGltaW5nLnRlcm1pbmF0ZU1zID0gRGF0ZS5ub3coKSAtIHRlcm1TdGFydDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3Bhd25TdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBhd2FpdCB0aGlzLnJ1bnRpbWUuc3Bhd24oc3Bhd25SZXF1ZXN0KTsKICAgICAgICB0aW1pbmcuc3Bhd25NcyA9IERhdGUubm93KCkgLSBzcGF3blN0YXJ0OwogICAgICAgIC8vIFRyYW5zZmVyIG1ldGFkYXRhIHRvIG5ldyBpbnN0YW5jZQogICAgICAgIGNvbnN0IG5ld01ldGEgPSB0aGlzLmVuc3VyZU1ldGEobmV3SW5zdGFuY2UuaWQpOwogICAgICAgIG5ld01ldGEucmVzdGFydENvdW50ID0gbWV0YS5yZXN0YXJ0Q291bnQgKyAxOwogICAgICAgIG5ld01ldGEub3JpZ2luYWxSZXF1ZXN0ID0gb3JpZ2luYWxSZXF1ZXN0OwogICAgICAgIG5ld01ldGEuY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7CiAgICAgICAgdGltaW5nLnRvdGFsTXMgPSBEYXRlLm5vdygpIC0gcmVzdGFydFN0YXJ0OwogICAgICAgIHRoaXMubGFzdFJlc3RhcnRUaW1pbmcgPSB0aW1pbmc7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCByZXN0YXJ0ZWQ6ICR7aW5zdGFuY2UubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgZGV0YWlsOiBgJHtpbnN0YW5jZUlkfSDihpIgJHtuZXdJbnN0YW5jZS5pZH0sIHJlc3RhcnQgIyR7bmV3TWV0YS5yZXN0YXJ0Q291bnR9LCAke3RpbWluZy50b3RhbE1zfW1zIFt0ZXJtOiR7dGltaW5nLnRlcm1pbmF0ZU1zfSBwcmVwOiR7dGltaW5nLnNwYXduUHJlcE1zfSBzcGF3bjoke3RpbWluZy5zcGF3bk1zfV1gLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEJhdGNoIG9wZXJhdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBQYXVzZSBhbGwgaW5zdGFuY2VzIG1hdGNoaW5nIGEgZmlsdGVyLiBSZXR1cm5zIGNvdW50IHBhdXNlZC4gKi8KICAgIGFzeW5jIHBhdXNlTWF0Y2hpbmcoZmlsdGVyLCByZWFzb24pIHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy5maWx0ZXJJbnN0YW5jZXMoZmlsdGVyKS5maWx0ZXIoKGkpID0+IGkuc3RhdGUgPT09ICJydW5uaW5nIik7CiAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICBjb25zdCBmYWlsZWQgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGluc3Qgb2YgdGFyZ2V0cykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW50aW1lLnBhdXNlKGluc3QuaWQsIHJlYXNvbiA/PyAiQmF0Y2ggcGF1c2UiKTsKICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgZmFpbGVkLnB1c2goYCR7aW5zdC5pZH06JHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBCYXRjaCBwYXVzZTogJHtjb3VudH0vJHt0YXJnZXRzLmxlbmd0aH0gYWdlbnRzIHBhdXNlZCR7ZmFpbGVkLmxlbmd0aCA+IDAgPyBgLCAke2ZhaWxlZC5sZW5ndGh9IGZhaWxlZGAgOiAiIn1gLAogICAgICAgICAgICBkZXRhaWw6IGZhaWxlZC5sZW5ndGggPiAwID8gYEZhaWxlZDogJHtmYWlsZWQuam9pbigiOyAiKX1gIDogdW5kZWZpbmVkLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjb3VudDsKICAgIH0KICAgIC8qKiBUZXJtaW5hdGUgYWxsIGluc3RhbmNlcyBtYXRjaGluZyBhIGZpbHRlci4gUmV0dXJucyBjb3VudCB0ZXJtaW5hdGVkLiAqLwogICAgYXN5bmMgdGVybWluYXRlTWF0Y2hpbmcoZmlsdGVyLCByZWFzb24pIHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy5maWx0ZXJJbnN0YW5jZXMoZmlsdGVyKS5maWx0ZXIoKGkpID0+ICFURVJNSU5BTF9TVEFURVMuaGFzKGkuc3RhdGUpKTsKICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgIGNvbnN0IGZhaWxlZCA9IFtdOwogICAgICAgIGZvciAoY29uc3QgaW5zdCBvZiB0YXJnZXRzKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJ1bnRpbWUudGVybWluYXRlKGluc3QuaWQsIHJlYXNvbiA/PyAiQmF0Y2ggdGVybWluYXRlIik7CiAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGZhaWxlZC5wdXNoKGAke2luc3QuaWR9OiR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgQmF0Y2ggdGVybWluYXRlOiAke2NvdW50fS8ke3RhcmdldHMubGVuZ3RofSBhZ2VudHMgdGVybWluYXRlZCR7ZmFpbGVkLmxlbmd0aCA+IDAgPyBgLCAke2ZhaWxlZC5sZW5ndGh9IGZhaWxlZGAgOiAiIn1gLAogICAgICAgICAgICBkZXRhaWw6IGZhaWxlZC5sZW5ndGggPiAwID8gYEZhaWxlZDogJHtmYWlsZWQuam9pbigiOyAiKX1gIDogYFJlYXNvbjogJHtyZWFzb24gPz8gImJhdGNoIG9wZXJhdGlvbiJ9YCwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gY291bnQ7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBRdWVyaWVzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogR2V0IGFuIGluc3RhbmNlIGJ5IElELiAqLwogICAgZ2V0SW5zdGFuY2UoaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lLmdldEluc3RhbmNlKGlkKTsKICAgIH0KICAgIC8qKiBMaXN0IGFsbCBpbnN0YW5jZXMsIG9wdGlvbmFsbHkgZmlsdGVyZWQuICovCiAgICBsaXN0SW5zdGFuY2VzKGZpbHRlcikgewogICAgICAgIGlmICghZmlsdGVyKQogICAgICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lLmxpc3RJbnN0YW5jZXMoKTsKICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJJbnN0YW5jZXMoZmlsdGVyKTsKICAgIH0KICAgIC8qKiBHZXQgbGlmZWN5Y2xlIGhpc3RvcnkgZm9yIGFuIGluc3RhbmNlLiAqLwogICAgZ2V0SGlzdG9yeShpbnN0YW5jZUlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWV0YS5nZXQoaW5zdGFuY2VJZCk/Lmhpc3RvcnkgPz8gW107CiAgICB9CiAgICAvKiogR2V0IHRoZSByZXN0YXJ0IGNvdW50IGZvciBhbiBpbnN0YW5jZS4gKi8KICAgIGdldFJlc3RhcnRDb3VudChpbnN0YW5jZUlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWV0YS5nZXQoaW5zdGFuY2VJZCk/LnJlc3RhcnRDb3VudCA/PyAwOwogICAgfQogICAgLyoqIEdldCBjdXJyZW50IHJlc291cmNlIHNuYXBzaG90LiAqLwogICAgZ2V0UmVzb3VyY2VTbmFwc2hvdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lLmdldFJlc291cmNlU25hcHNob3QoKTsKICAgIH0KICAgIC8qKiBHZXQgc3RhdGUgY291bnRzIGFjcm9zcyBhbGwgaW5zdGFuY2VzLiAqLwogICAgZ2V0U3RhdGVDb3VudHMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZS5nZXRTdGF0ZUNvdW50cygpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSGVhbHRoIG1vbml0b3JpbmcKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBBc3Nlc3MgaGVhbHRoIG9mIGEgc2luZ2xlIGluc3RhbmNlLiAqLwogICAgYXNzZXNzSGVhbHRoKGluc3RhbmNlSWQpIHsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMucnVudGltZS5nZXRJbnN0YW5jZShpbnN0YW5jZUlkKTsKICAgICAgICBpZiAoIWluc3RhbmNlKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkLAogICAgICAgICAgICAgICAgbGFiZWw6ICJ1bmtub3duIiwKICAgICAgICAgICAgICAgIHN0YXRlOiAidGVybWluYXRlZCIsCiAgICAgICAgICAgICAgICBoZWFsdGh5OiBmYWxzZSwKICAgICAgICAgICAgICAgIHNjb3JlOiAwLAogICAgICAgICAgICAgICAgdXB0aW1lOiAwLAogICAgICAgICAgICAgICAgcmVzdGFydENvdW50OiAwLAogICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlczogMCwKICAgICAgICAgICAgICAgIGxhc3RDaGVja2VkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICBpc3N1ZXM6IFsiSW5zdGFuY2Ugbm90IGZvdW5kIl0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmVuc3VyZU1ldGEoaW5zdGFuY2VJZCk7CiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBpc3N1ZXMgPSBbXTsKICAgICAgICBsZXQgc2NvcmUgPSAxMDA7CiAgICAgICAgLy8gVGVybWluYWwgc3RhdGVzIGFyZW4ndCB1bmhlYWx0aHkg4oCUIHRoZXkncmUganVzdCBkb25lCiAgICAgICAgaWYgKFRFUk1JTkFMX1NUQVRFUy5oYXMoaW5zdGFuY2Uuc3RhdGUpKSB7CiAgICAgICAgICAgIGNvbnN0IGlzRmFpbGVkID0gaW5zdGFuY2Uuc3RhdGUgPT09ICJmYWlsZWQiOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaW5zdGFuY2VJZCwKICAgICAgICAgICAgICAgIGxhYmVsOiBpbnN0YW5jZS5tZXRhZGF0YS5sYWJlbCwKICAgICAgICAgICAgICAgIHN0YXRlOiBpbnN0YW5jZS5zdGF0ZSwKICAgICAgICAgICAgICAgIGhlYWx0aHk6ICFpc0ZhaWxlZCwKICAgICAgICAgICAgICAgIHNjb3JlOiBpc0ZhaWxlZCA/IDAgOiAxMDAsCiAgICAgICAgICAgICAgICB1cHRpbWU6IDAsCiAgICAgICAgICAgICAgICByZXN0YXJ0Q291bnQ6IG1ldGEucmVzdGFydENvdW50LAogICAgICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlczogbWV0YS5jb25zZWN1dGl2ZUZhaWx1cmVzLAogICAgICAgICAgICAgICAgbGFzdENoZWNrZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgIGlzc3VlczogaXNGYWlsZWQgPyBbYEZhaWxlZDogJHtpbnN0YW5jZS5lcnJvcj8ubWVzc2FnZSA/PyAidW5rbm93biJ9YF0gOiBbXSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLy8gVXB0aW1lIGNhbGN1bGF0aW9uCiAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoaW5zdGFuY2UuY3JlYXRlZEF0KS5nZXRUaW1lKCk7CiAgICAgICAgY29uc3QgdXB0aW1lID0gbm93IC0gY3JlYXRlZEF0OwogICAgICAgIC8vIFRpbWUgZGVjYXk6IG9sZGVyIGV2ZW50cyBjb3VudCBsZXNzLiBVc2VzIGV4cG9uZW50aWFsIGRlY2F5IHdpdGggMzBtaW4gaGFsZi1saWZlLgogICAgICAgIC8vIEEgcmV0cnkgMzBtaW4gYWdvIGNvbnRyaWJ1dGVzIGhhbGYgdGhlIHBlbmFsdHkgb2YgYSByZXRyeSBqdXN0IG5vdy4KICAgICAgICBjb25zdCBERUNBWV9IQUxGX0xJRkVfTVMgPSAzMCAqIDYwICogMTAwMDsKICAgICAgICBjb25zdCBkZWNheSA9IE1hdGgucG93KDAuNSwgdXB0aW1lIC8gREVDQVlfSEFMRl9MSUZFX01TKTsKICAgICAgICAvLyBDaGVjazogaGlnaCByZXRyeSBjb3VudCAoZGVjYXllZCBieSBpbnN0YW5jZSBhZ2UpCiAgICAgICAgaWYgKGluc3RhbmNlLnJldHJ5Q291bnQgPiAwKSB7CiAgICAgICAgICAgIHNjb3JlIC09IE1hdGgucm91bmQoaW5zdGFuY2UucmV0cnlDb3VudCAqIDE1ICogZGVjYXkpOwogICAgICAgICAgICBpc3N1ZXMucHVzaChgJHtpbnN0YW5jZS5yZXRyeUNvdW50fSByZXRyaWVzYCk7CiAgICAgICAgfQogICAgICAgIC8vIENoZWNrOiBtYW55IHJlc3RhcnRzIChkZWNheWVkKQogICAgICAgIGlmIChtZXRhLnJlc3RhcnRDb3VudCA+IDIpIHsKICAgICAgICAgICAgc2NvcmUgLT0gTWF0aC5yb3VuZCgobWV0YS5yZXN0YXJ0Q291bnQgLSAyKSAqIDEwICogZGVjYXkpOwogICAgICAgICAgICBpc3N1ZXMucHVzaChgJHttZXRhLnJlc3RhcnRDb3VudH0gcmVzdGFydHNgKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2s6IGNvbnNlY3V0aXZlIGZhaWx1cmVzIChOT1QgZGVjYXllZCDigJQgcmVjZW50IGZhaWx1cmVzIGFsd2F5cyBtYXR0ZXIpCiAgICAgICAgaWYgKG1ldGEuY29uc2VjdXRpdmVGYWlsdXJlcyA+IDApIHsKICAgICAgICAgICAgc2NvcmUgLT0gbWV0YS5jb25zZWN1dGl2ZUZhaWx1cmVzICogMjA7CiAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGAke21ldGEuY29uc2VjdXRpdmVGYWlsdXJlc30gY29uc2VjdXRpdmUgZmFpbHVyZXNgKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2s6IHN0dWNrIGluIGluaXRpYWxpemluZyBmb3IgdG9vIGxvbmcgKD4zMHMpCiAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlID09PSAiaW5pdGlhbGl6aW5nIiAmJiB1cHRpbWUgPiAzMF8wMDApIHsKICAgICAgICAgICAgc2NvcmUgLT0gMjU7CiAgICAgICAgICAgIGlzc3Vlcy5wdXNoKCJTdHVjayBpbiBpbml0aWFsaXppbmciKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2s6IHBhdXNlZCBmb3IgYSBsb25nIHRpbWUgKD41bWluKQogICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gInBhdXNlZCIgJiYgaW5zdGFuY2UucGF1c2VkQXQpIHsKICAgICAgICAgICAgY29uc3QgcGF1c2VkRHVyYXRpb24gPSBub3cgLSBuZXcgRGF0ZShpbnN0YW5jZS5wYXVzZWRBdCkuZ2V0VGltZSgpOwogICAgICAgICAgICBpZiAocGF1c2VkRHVyYXRpb24gPiA1ICogNjBfMDAwKSB7CiAgICAgICAgICAgICAgICBzY29yZSAtPSAxMDsKICAgICAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGBQYXVzZWQgZm9yICR7TWF0aC5yb3VuZChwYXVzZWREdXJhdGlvbiAvIDYwXzAwMCl9bWluYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2s6IGFwcHJvYWNoaW5nIHRpbWVvdXQKICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09ICJydW5uaW5nIikgewogICAgICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSBpbnN0YW5jZS5jb25maWcudGltZW91dE1zOwogICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gbm93IC0gY3JlYXRlZEF0OwogICAgICAgICAgICBpZiAoZWxhcHNlZCA+IHRpbWVvdXRNcyAqIDAuOCkgewogICAgICAgICAgICAgICAgc2NvcmUgLT0gMjA7CiAgICAgICAgICAgICAgICBpc3N1ZXMucHVzaCgiQXBwcm9hY2hpbmcgdGltZW91dCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNjb3JlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBzY29yZSkpOwogICAgICAgIGNvbnN0IGhlYWx0aHkgPSBzY29yZSA+PSA1MCAmJiBtZXRhLmNvbnNlY3V0aXZlRmFpbHVyZXMgPCB0aGlzLmNvbmZpZy51bmhlYWx0aHlUaHJlc2hvbGQ7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gewogICAgICAgICAgICBpbnN0YW5jZUlkLAogICAgICAgICAgICBsYWJlbDogaW5zdGFuY2UubWV0YWRhdGEubGFiZWwsCiAgICAgICAgICAgIHN0YXRlOiBpbnN0YW5jZS5zdGF0ZSwKICAgICAgICAgICAgaGVhbHRoeSwKICAgICAgICAgICAgc2NvcmUsCiAgICAgICAgICAgIHVwdGltZSwKICAgICAgICAgICAgcmVzdGFydENvdW50OiBtZXRhLnJlc3RhcnRDb3VudCwKICAgICAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlczogbWV0YS5jb25zZWN1dGl2ZUZhaWx1cmVzLAogICAgICAgICAgICBsYXN0Q2hlY2tlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBpc3N1ZXMsCiAgICAgICAgfTsKICAgICAgICAvLyBVcGRhdGUgbWV0YQogICAgICAgIG1ldGEubGFzdEhlYWx0aENoZWNrID0gcmVzdWx0Lmxhc3RDaGVja2VkOwogICAgICAgIGlmIChoZWFsdGh5KQogICAgICAgICAgICBtZXRhLmxhc3RIZWFsdGh5ID0gcmVzdWx0Lmxhc3RDaGVja2VkOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKiogR2V0IGFnZ3JlZ2F0ZSBoZWFsdGggc3VtbWFyeS4gKi8KICAgIGdldEhlYWx0aFN1bW1hcnkoKSB7CiAgICAgICAgY29uc3QgaW5zdGFuY2VzID0gdGhpcy5ydW50aW1lLmxpc3RJbnN0YW5jZXMoKTsKICAgICAgICBjb25zdCBhc3Nlc3NtZW50cyA9IGluc3RhbmNlcwogICAgICAgICAgICAuZmlsdGVyKChpKSA9PiAhVEVSTUlOQUxfU1RBVEVTLmhhcyhpLnN0YXRlKSkKICAgICAgICAgICAgLm1hcCgoaSkgPT4gdGhpcy5hc3Nlc3NIZWFsdGgoaS5pZCkpOwogICAgICAgIGNvbnN0IGhlYWx0aHlDb3VudCA9IGFzc2Vzc21lbnRzLmZpbHRlcigoYSkgPT4gYS5oZWFsdGh5KS5sZW5ndGg7CiAgICAgICAgY29uc3QgYXZnU2NvcmUgPSBhc3Nlc3NtZW50cy5sZW5ndGggPiAwCiAgICAgICAgICAgID8gYXNzZXNzbWVudHMucmVkdWNlKChzdW0sIGEpID0+IHN1bSArIGEuc2NvcmUsIDApIC8gYXNzZXNzbWVudHMubGVuZ3RoCiAgICAgICAgICAgIDogMTAwOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRvdGFsSW5zdGFuY2VzOiBpbnN0YW5jZXMubGVuZ3RoLAogICAgICAgICAgICBhY3RpdmVJbnN0YW5jZXM6IGFzc2Vzc21lbnRzLmxlbmd0aCwKICAgICAgICAgICAgaGVhbHRoeUluc3RhbmNlczogaGVhbHRoeUNvdW50LAogICAgICAgICAgICB1bmhlYWx0aHlJbnN0YW5jZXM6IGFzc2Vzc21lbnRzLmxlbmd0aCAtIGhlYWx0aHlDb3VudCwKICAgICAgICAgICAgYXZlcmFnZVNjb3JlOiBNYXRoLnJvdW5kKGF2Z1Njb3JlKSwKICAgICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJ1bnRpbWUuZ2V0UmVzb3VyY2VTbmFwc2hvdCgpLAogICAgICAgICAgICBpbnN0YW5jZXM6IGFzc2Vzc21lbnRzLAogICAgICAgIH07CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBJbnRlci1hZ2VudCBtZXNzYWdpbmcgKHBhc3N0aHJvdWdoKQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgc2VuZE1lc3NhZ2UoZnJvbSwgdG8sIHR5cGUsIHBheWxvYWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lLnNlbmRNZXNzYWdlKGZyb20sIHRvLCB0eXBlLCBwYXlsb2FkKTsKICAgIH0KICAgIGFzeW5jIHJlcXVlc3RSZXNwb25zZShmcm9tLCB0bywgdHlwZSwgcGF5bG9hZCwgdGltZW91dE1zKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZS5yZXF1ZXN0UmVzcG9uc2UoZnJvbSwgdG8sIHR5cGUsIHBheWxvYWQsIHRpbWVvdXRNcyk7CiAgICB9CiAgICBzdWJzY3JpYmVBZ2VudChhZ2VudElkLCBoYW5kbGVyKSB7CiAgICAgICAgdGhpcy5ydW50aW1lLnN1YnNjcmliZUFnZW50KGFnZW50SWQsIGhhbmRsZXIpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gRXZlbnQgc3Vic2NyaXB0aW9ucyAocGFzc3Rocm91Z2gpCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBvbkxpZmVjeWNsZShoYW5kbGVyKSB7CiAgICAgICAgdGhpcy5ydW50aW1lLm9uTGlmZWN5Y2xlKGhhbmRsZXIpOwogICAgfQogICAgb25FcnJvcihoYW5kbGVyKSB7CiAgICAgICAgdGhpcy5ydW50aW1lLm9uRXJyb3IoaGFuZGxlcik7CiAgICB9CiAgICBvblJlc291cmNlV2FybmluZyhoYW5kbGVyKSB7CiAgICAgICAgdGhpcy5ydW50aW1lLm9uUmVzb3VyY2VXYXJuaW5nKGhhbmRsZXIpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSW50ZXJuYWw6IFJ1bnRpbWVCdXMgZXZlbnQgbGlzdGVuZXJzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBhdHRhY2hCdXNMaXN0ZW5lcnMoKSB7CiAgICAgICAgLy8gVHJhY2sgbGlmZWN5Y2xlIGV2ZW50cyBpbiBwZXItaW5zdGFuY2UgaGlzdG9yeQogICAgICAgIHRoaXMucnVudGltZS5idXMub24oImFnZW50OmxpZmVjeWNsZSIsIChldmVudCkgPT4gewogICAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5lbnN1cmVNZXRhKGV2ZW50LmFnZW50SWQpOwogICAgICAgICAgICBtZXRhLmhpc3RvcnkucHVzaCh7CiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGV2ZW50LnRpbWVzdGFtcCwKICAgICAgICAgICAgICAgIHByZXZpb3VzU3RhdGU6IGV2ZW50LnByZXZpb3VzU3RhdGUsCiAgICAgICAgICAgICAgICBuZXdTdGF0ZTogZXZlbnQubmV3U3RhdGUsCiAgICAgICAgICAgICAgICByZWFzb246IGV2ZW50LnJlYXNvbiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIFRyaW0gaGlzdG9yeSBpZiBvdmVyIGxpbWl0CiAgICAgICAgICAgIGlmIChtZXRhLmhpc3RvcnkubGVuZ3RoID4gdGhpcy5jb25maWcubWF4SGlzdG9yeVBlckluc3RhbmNlKSB7CiAgICAgICAgICAgICAgICBtZXRhLmhpc3RvcnkgPSBtZXRhLmhpc3Rvcnkuc2xpY2UoLXRoaXMuY29uZmlnLm1heEhpc3RvcnlQZXJJbnN0YW5jZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzZXQgY29uc2VjdXRpdmUgZmFpbHVyZXMgb24gc3VjY2Vzc2Z1bCB0cmFuc2l0aW9uIHRvIHJ1bm5pbmcKICAgICAgICAgICAgaWYgKGV2ZW50Lm5ld1N0YXRlID09PSAicnVubmluZyIpIHsKICAgICAgICAgICAgICAgIG1ldGEuY29uc2VjdXRpdmVGYWlsdXJlcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyBUcmFjayBmYWlsdXJlcyBmb3IgYXV0by1yZWNvdmVyeSBkZWNpc2lvbnMKICAgICAgICB0aGlzLnJ1bnRpbWUuYnVzLm9uKCJhZ2VudDpmYWlsZWQiLCAoZGF0YSkgPT4gewogICAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5lbnN1cmVNZXRhKGRhdGEuYWdlbnRJZCk7CiAgICAgICAgICAgIG1ldGEuY29uc2VjdXRpdmVGYWlsdXJlcysrOwogICAgICAgIH0pOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSW50ZXJuYWw6IGxvYWQgYmFsYW5jaW5nCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKioKICAgICAqIEFkanVzdCByZXNvdXJjZSBhbGxvY2F0aW9uIGJhc2VkIG9uIGN1cnJlbnQgc3lzdGVtIGxvYWQuCiAgICAgKiBXaGVuIHV0aWxpemF0aW9uIGlzIGhpZ2gsIHJlZHVjZSBwZXItaW5zdGFuY2UgYWxsb2NhdGlvbiB0byBmaXQgbW9yZSBhZ2VudHMuCiAgICAgKiBXaGVuIGxvdywgbGV0IHRoZW0gdXNlIGRlZmF1bHQgb3IgcmVxdWVzdGVkIGFtb3VudHMuCiAgICAgKi8KICAgIGJhbGFuY2VSZXNvdXJjZXMocmVxdWVzdGVkKSB7CiAgICAgICAgaWYgKCFyZXF1ZXN0ZWQpCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnJ1bnRpbWUuZ2V0UmVzb3VyY2VTbmFwc2hvdCgpOwogICAgICAgIGNvbnN0IG1lbW9yeVV0aWxpemF0aW9uID0gc25hcHNob3QudG90YWxNZW1vcnlNQiAvIHNuYXBzaG90Lm1heE1lbW9yeU1COwogICAgICAgIGNvbnN0IGFnZW50VXRpbGl6YXRpb24gPSBzbmFwc2hvdC5hY3RpdmVBZ2VudHMgLyBzbmFwc2hvdC5tYXhBZ2VudHM7CiAgICAgICAgLy8gSWYgdXRpbGl6YXRpb24gaXMgdW5kZXIgNjAlLCB1c2UgcmVxdWVzdGVkIHZhbHVlcyBhcy1pcwogICAgICAgIGlmIChtZW1vcnlVdGlsaXphdGlvbiA8IDAuNiAmJiBhZ2VudFV0aWxpemF0aW9uIDwgMC42KSB7CiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0ZWQ7CiAgICAgICAgfQogICAgICAgIC8vIFVuZGVyIHByZXNzdXJlOiBzY2FsZSBkb3duIG1lbW9yeSB0byBmaXQKICAgICAgICBjb25zdCBtZW1vcnlMaW1pdCA9IHJlcXVlc3RlZC5tZW1vcnlMaW1pdE1COwogICAgICAgIGlmIChtZW1vcnlMaW1pdCAmJiBtZW1vcnlVdGlsaXphdGlvbiA+IDAuOCkgewogICAgICAgICAgICBjb25zdCBhdmFpbGFibGUgPSBzbmFwc2hvdC5tYXhNZW1vcnlNQiAtIHNuYXBzaG90LnRvdGFsTWVtb3J5TUI7CiAgICAgICAgICAgIGNvbnN0IHNjYWxlZCA9IE1hdGgubWluKG1lbW9yeUxpbWl0LCBNYXRoLm1heCgxMjgsIGF2YWlsYWJsZSAqIDAuOCkpOwogICAgICAgICAgICByZXR1cm4geyAuLi5yZXF1ZXN0ZWQsIG1lbW9yeUxpbWl0TUI6IE1hdGgucm91bmQoc2NhbGVkKSB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVxdWVzdGVkOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSW50ZXJuYWw6IGlzb2xhdGlvbiBlbmZvcmNlbWVudAogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqCiAgICAgKiBFbmZvcmNlIGlzb2xhdGlvbiBzZXR0aW5ncyBvbiBzcGF3biByZXF1ZXN0cy4KICAgICAqIEZvciBzYW5kYm94ZWQgaW5zdGFuY2VzLCBhc3NpZ24gYSB1bmlxdWUgd29ya2luZyBkaXJlY3RvcnkgYW5kCiAgICAgKiBzdHJpcCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBjb3VsZCBsZWFrIGFjcm9zcyBhZ2VudHMuCiAgICAgKi8KICAgIGVuZm9yY2VJc29sYXRpb24ocmVxdWVzdCkgewogICAgICAgIGNvbnN0IGlzb2xhdGlvbiA9IHJlcXVlc3QuY29uZmlnPy5pc29sYXRpb247CiAgICAgICAgaWYgKGlzb2xhdGlvbiAhPT0gInNhbmRib3hlZCIpCiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmNvbmZpZzsKICAgICAgICBjb25zdCBzYW5pdGl6ZWRFbnYgPSB7fTsKICAgICAgICBjb25zdCBhbGxvd2VkUHJlZml4ZXMgPSBbIkNPUkVfIiwgIkRBU0hfIiwgIk5PREVfIiwgIlBBVEgiXTsKICAgICAgICBpZiAocmVxdWVzdC5jb25maWc/LmVudikgewogICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0LmNvbmZpZy5lbnYpKSB7CiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFByZWZpeGVzLnNvbWUoKHApID0+IGtleS5zdGFydHNXaXRoKHApKSkgewogICAgICAgICAgICAgICAgICAgIHNhbml0aXplZEVudltrZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgLi4ucmVxdWVzdC5jb25maWcsCiAgICAgICAgICAgIGVudjogc2FuaXRpemVkRW52LAogICAgICAgICAgICBpc29sYXRpb246ICJzYW5kYm94ZWQiLAogICAgICAgIH07CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBJbnRlcm5hbDogZ2FyYmFnZSBjb2xsZWN0aW9uCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKioKICAgICAqIFN0YXJ0IHRoZSBHQyBsb29wIHVzaW5nIGNoYWluZWQgc2V0VGltZW91dCB3aXRoIHJhbmRvbSBqaXR0ZXIgKEItMDEwKS4KICAgICAqIEppdHRlciAoMOKAkzEwcykgcHJldmVudHMgdGh1bmRlcmluZyBoZXJkIHdoZW4gbXVsdGlwbGUgdGltZXJzIGFsaWduLgogICAgICogVXNlcyBzZXRUaW1lb3V0IGNoYWluIGluc3RlYWQgb2Ygc2V0SW50ZXJ2YWwgc28gZWFjaCBjeWNsZSdzIGRlbGF5CiAgICAgKiBpcyBpbmRlcGVuZGVudCBhbmQgaW5jbHVkZXMgZnJlc2ggaml0dGVyLgogICAgICovCiAgICBzdGFydEdjKCkgewogICAgICAgIGlmICh0aGlzLmdjVGltZXIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dEdjKCk7CiAgICB9CiAgICBzY2hlZHVsZU5leHRHYygpIHsKICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMF8wMDApOyAvLyAw4oCTMTBzCiAgICAgICAgdGhpcy5nY1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMucnVuR2MoKQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogIkluc3RhbmNlIEdDIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVyci5tZXNzYWdlLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dEdjKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIHRoaXMuY29uZmlnLmdjSW50ZXJ2YWxNcyArIGppdHRlcik7CiAgICB9CiAgICBzdG9wR2MoKSB7CiAgICAgICAgaWYgKHRoaXMuZ2NUaW1lcikgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5nY1RpbWVyKTsKICAgICAgICAgICAgdGhpcy5nY1RpbWVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZ2NBZGFwdGl2ZVRpbWVyKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmdjQWRhcHRpdmVUaW1lcik7CiAgICAgICAgICAgIHRoaXMuZ2NBZGFwdGl2ZVRpbWVyID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNjaGVkdWxlIGFuIGFjY2VsZXJhdGVkIEdDIGN5Y2xlIHdoZW4gdGhlIHJlZ3VsYXIgY3ljbGUgZm91bmQgbW9yZSB3b3JrCiAgICAgKiB0aGFuIGl0IGNvdWxkIGhhbmRsZSAoYmF0Y2gtY2FwcGVkKS4gVXNlcyBnY01pbkludGVydmFsTXMgdG8gYXZvaWQKICAgICAqIHRocmFzaGluZy4gU2tpcHBlZCBpZiBhIHJlZ3VsYXIgR0MgdGltZXIgdGljayB3aWxsIGZpcmUgc29vbmVyLgogICAgICovCiAgICBzY2hlZHVsZUFkYXB0aXZlR2MocmVtYWluaW5nRWxpZ2libGUpIHsKICAgICAgICBpZiAodGhpcy5nY0FkYXB0aXZlVGltZXIgfHwgdGhpcy5kZXN0cm95ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBTY2FsZSBkZWxheTogbW9yZSBiYWNrbG9nIOKGkiBzaG9ydGVyIGRlbGF5IChmbG9vciBhdCBnY01pbkludGVydmFsTXMpCiAgICAgICAgY29uc3QgdXJnZW5jeSA9IE1hdGgubWluKDEsIHJlbWFpbmluZ0VsaWdpYmxlIC8gdGhpcy5jb25maWcuZ2NCYXRjaFNpemUpOwogICAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5tYXgodGhpcy5jb25maWcuZ2NNaW5JbnRlcnZhbE1zLCB0aGlzLmNvbmZpZy5nY0ludGVydmFsTXMgKiAoMSAtIHVyZ2VuY3kgKiAwLjgpKTsKICAgICAgICB0aGlzLmdjQWRhcHRpdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0aGlzLmdjQWRhcHRpdmVUaW1lciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZ2NNZXRyaWNzLmFkYXB0aXZlUnVucysrOwogICAgICAgICAgICB0aGlzLnJ1bkdjKCkuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiAiQWRhcHRpdmUgR0MgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgZGVsYXkpOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgdGVybWluYXRlZC9jb21wbGV0ZWQvZmFpbGVkIGluc3RhbmNlcyB0aGF0IGhhdmUgZXhjZWVkZWQgdGhlIEdDIFRUTC4KICAgICAqIENsZWFucyB1cCBib3RoIHRoZSByZWdpc3RyeSBhbmQgbG9jYWwgbWV0YWRhdGEsIHBsdXMgYXNzb2NpYXRlZCB0YXNrIGZpbGVzLgogICAgICoKICAgICAqIE9wdGltaXphdGlvbnMgKERBU0gtMTM5IC8gREFTSC0xNDEpOgogICAgICogLSBGaWx0ZXIgYXQgcmVnaXN0cnkgbGV2ZWwgdG8gYXZvaWQgc2Nhbm5pbmcgbm9uLXRlcm1pbmFsIGluc3RhbmNlcwogICAgICogLSBVc2UgSVNPIHN0cmluZyBjb21wYXJpc29uIGluc3RlYWQgb2YgRGF0ZSBwYXJzaW5nIGluIGhvdCBsb29wCiAgICAgKiAtIEJhdGNoIGZpbGUgZGVsZXRpb25zIGluIGNodW5rcyB0byByZWR1Y2UgTlRGUyBkaXJlY3RvcnkgbG9jayBjb250ZW50aW9uCiAgICAgKiAtIENvbmN1cnJlbnQtcnVuIGd1YXJkIHByZXZlbnRzIG92ZXJsYXBwaW5nIEdDIGN5Y2xlcwogICAgICogLSBBZGFwdGl2ZSBzY2hlZHVsaW5nIHJ1bnMgc29vbmVyIHdoZW4gYmF0Y2gtY2FwcGVkCiAgICAgKiAtIFRvcC1sZXZlbCBpbXBvcnRzIChubyBkeW5hbWljIGltcG9ydCBvdmVyaGVhZCBwZXIgY3ljbGUpCiAgICAgKiAtIEdDIG1ldHJpY3MgdHJhY2tpbmcgZm9yIG9ic2VydmFiaWxpdHkKICAgICAqLwogICAgYXN5bmMgcnVuR2MoKSB7CiAgICAgICAgLy8gUHJldmVudCBvdmVybGFwcGluZyBHQyBjeWNsZXMgKGFkYXB0aXZlICsgcmVndWxhciB0aW1lciBjYW4gcmFjZSkKICAgICAgICBpZiAodGhpcy5nY1J1bm5pbmcpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLmdjUnVubmluZyA9IHRydWU7CiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuR2NJbm5lcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLmdjUnVubmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGFzeW5jIHJ1bkdjSW5uZXIoc3RhcnQpIHsKICAgICAgICBjb25zdCB0aW1pbmcgPSB7CiAgICAgICAgICAgIHNjYW5NczogMCwKICAgICAgICAgICAgbWV0YUNsZWFudXBNczogMCwKICAgICAgICAgICAgcmVnaXN0cnlSZW1vdmVNczogMCwKICAgICAgICAgICAgZmlsZURlbGV0ZU1zOiAwLAogICAgICAgICAgICBwcnVuZU1zOiAwLAogICAgICAgICAgICB0b3RhbE1zOiAwLAogICAgICAgIH07CiAgICAgICAgLy8gUGhhc2UgMTogcXVlcnkgb25seSB0ZXJtaW5hbCBpbnN0YW5jZXMgdXNpbmcgY2FjaGVkIGFycmF5IChhdm9pZHMKICAgICAgICAvLyBzcHJlYWRpbmcgVEVSTUlOQUxfU1RBVEVTIGludG8gYSBuZXcgYXJyYXkgZXZlcnkgY3ljbGUpCiAgICAgICAgY29uc3QgdGVybWluYWwgPSB0aGlzLnJ1bnRpbWUubGlzdEluc3RhbmNlcyh7CiAgICAgICAgICAgIHN0YXRlczogdGhpcy50ZXJtaW5hbFN0YXRlc0FycmF5LAogICAgICAgIH0pOwogICAgICAgIGlmICh0ZXJtaW5hbC5sZW5ndGggPT09IDApCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBQcmUtY29tcHV0ZSBJU08gY3V0b2ZmIHN0cmluZyDigJQgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uIGF2b2lkcyBEYXRlIHBhcnNpbmcKICAgICAgICBjb25zdCBjdXRvZmZNcyA9IHN0YXJ0IC0gdGhpcy5jb25maWcuZ2NUdGxNczsKICAgICAgICBjb25zdCBjdXRvZmYgPSBuZXcgRGF0ZShjdXRvZmZNcykudG9JU09TdHJpbmcoKTsKICAgICAgICAvLyBQaGFzZSAyOiBpZGVudGlmeSBlbGlnaWJsZSBpbnN0YW5jZXMsIGNvdW50aW5nIHRvdGFsIGZvciBhZGFwdGl2ZSBzY2hlZHVsaW5nCiAgICAgICAgY29uc3QgZWxpZ2libGUgPSBbXTsKICAgICAgICBsZXQgdG90YWxFbGlnaWJsZSA9IDA7CiAgICAgICAgLy8gV2hlbiBiYWNrbG9nIGV4Y2VlZHMgaGFyZCBsaW1pdCwgYnlwYXNzIGJhdGNoIGNhcCBmb3IgdGhpcyBjeWNsZSAoQi0wMTApLgogICAgICAgIC8vIFRoaXMgcHJldmVudHMgdW5ib3VuZGVkIGFjY3VtdWxhdGlvbiB3aGVuIGluc3RhbmNlcyB0ZXJtaW5hdGUgZmFzdGVyCiAgICAgICAgLy8gdGhhbiBHQyBjYW4gZHJhaW4gYXQgbm9ybWFsIGJhdGNoIHNpemUuCiAgICAgICAgY29uc3QgZWZmZWN0aXZlQmF0Y2hTaXplID0gdGVybWluYWwubGVuZ3RoID4gQWdlbnRJbnN0YW5jZU1hbmFnZXIuQkFDS0xPR19IQVJEX0xJTUlUCiAgICAgICAgICAgID8gdGVybWluYWwubGVuZ3RoIC8vIHVuY2FwcGVkIOKAlCBkcmFpbiBldmVyeXRoaW5nCiAgICAgICAgICAgIDogdGhpcy5jb25maWcuZ2NCYXRjaFNpemU7CiAgICAgICAgZm9yIChjb25zdCBpbnN0IG9mIHRlcm1pbmFsKSB7CiAgICAgICAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBpbnN0LnRlcm1pbmF0ZWRBdCA/PyBpbnN0LnVwZGF0ZWRBdDsKICAgICAgICAgICAgaWYgKGZpbmlzaGVkQXQgPCBjdXRvZmYpIHsKICAgICAgICAgICAgICAgIHRvdGFsRWxpZ2libGUrKzsKICAgICAgICAgICAgICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPCBlZmZlY3RpdmVCYXRjaFNpemUpIHsKICAgICAgICAgICAgICAgICAgICBlbGlnaWJsZS5wdXNoKHsgaWQ6IGluc3QuaWQsIHRhc2tJZDogaW5zdC50YXNrSWQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGVsaWdpYmxlLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRpbWluZy5zY2FuTXMgPSBEYXRlLm5vdygpIC0gc3RhcnQ7CiAgICAgICAgLy8gUGhhc2UgMzogY2xlYXIgbG9jYWwgbWV0YWRhdGEgKHN5bmMsIGZhc3QpCiAgICAgICAgY29uc3QgbWV0YVN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICBmb3IgKGNvbnN0IHsgaWQgfSBvZiBlbGlnaWJsZSkgewogICAgICAgICAgICB0aGlzLm1ldGEuZGVsZXRlKGlkKTsKICAgICAgICB9CiAgICAgICAgdGltaW5nLm1ldGFDbGVhbnVwTXMgPSBEYXRlLm5vdygpIC0gbWV0YVN0YXJ0OwogICAgICAgIC8vIFlpZWxkIHRvIGV2ZW50IGxvb3AgYmV0d2VlbiBwaGFzZXMgc28gR0MgZG9lc24ndCBibG9jayBvdGhlciB3b3JrCiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMCkpOwogICAgICAgIC8vIFBoYXNlIDQrNSAobWVyZ2VkKTogcmVtb3ZlIGZyb20gcmVnaXN0cnkgaW4tbWVtb3J5LCB0aGVuIGRlbGV0ZSBBTEwKICAgICAgICAvLyBmaWxlcyAocmVnaXN0cnkgKyB0YXNrICsgbG9ncykgaW4gYSBzaW5nbGUgY2h1bmtlZCBwYXNzLgogICAgICAgIGNvbnN0IHJlZ2lzdHJ5U3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIGNvbnN0IGlkcyA9IGVsaWdpYmxlLm1hcCgoZSkgPT4gZS5pZCk7CiAgICAgICAgY29uc3QgeyByZW1vdmVkOiBjb2xsZWN0ZWQsIGZpbGVQYXRoczogYWxsRmlsZXMgfSA9IHRoaXMucnVudGltZS5yZW1vdmVJbnN0YW5jZXNJbk1lbW9yeShpZHMpOwogICAgICAgIC8vIEFwcGVuZCB0YXNrICsgbG9nIGZpbGUgcGF0aHMgZm9yIGluc3RhbmNlcyB0aGF0IGhhdmUgYSB0YXNrSWQKICAgICAgICBmb3IgKGNvbnN0IHsgdGFza0lkIH0gb2YgZWxpZ2libGUpIHsKICAgICAgICAgICAgaWYgKCF0YXNrSWQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgYWxsRmlsZXMucHVzaChqb2luKFRBU0tTX0RJUiwgYCR7dGFza0lkfS5qc29uYCkpOwogICAgICAgICAgICBhbGxGaWxlcy5wdXNoKGpvaW4oTE9HU19ESVIsIGAke3Rhc2tJZH0uc3Rkb3V0LmxvZ2ApKTsKICAgICAgICAgICAgYWxsRmlsZXMucHVzaChqb2luKExPR1NfRElSLCBgJHt0YXNrSWR9LnN0ZGVyci5sb2dgKSk7CiAgICAgICAgICAgIGFsbEZpbGVzLnB1c2goam9pbihMT0dTX0RJUiwgYCR7dGFza0lkfS5wcm9tcHQudHh0YCkpOwogICAgICAgIH0KICAgICAgICB0aW1pbmcucmVnaXN0cnlSZW1vdmVNcyA9IERhdGUubm93KCkgLSByZWdpc3RyeVN0YXJ0OwogICAgICAgIC8vIFNpbmdsZS1wYXNzIGNodW5rZWQgZGVsZXRpb24gZm9yIGFsbCBmaWxlIHR5cGVzLgogICAgICAgIC8vIENodW5rIHNpemUgNDAgYmFsYW5jZXMgcGFyYWxsZWxpc20gdnMgTlRGUyBkaXJlY3RvcnkgbG9jayBjb250ZW50aW9uLgogICAgICAgIGNvbnN0IGRlbGV0ZVN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICBsZXQgZmFpbENvdW50ID0gMDsKICAgICAgICBpZiAoYWxsRmlsZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBjb25zdCBDSFVOSyA9IDQwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEZpbGVzLmxlbmd0aDsgaSArPSBDSFVOSykgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxGaWxlcy5zbGljZShpLCBpICsgQ0hVTkspLm1hcCgoZikgPT4gdW5saW5rKGYpKSk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgIGlmIChyLnN0YXR1cyA9PT0gInJlamVjdGVkIikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSByLnJlYXNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU5PRU5UIGlzIGV4cGVjdGVkIChub3QgYWxsIGxvZyB0eXBlcyBleGlzdCBmb3IgZXZlcnkgdGFzaykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj8uY29kZSAhPT0gIkVOT0VOVCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGltaW5nLmZpbGVEZWxldGVNcyA9IERhdGUubm93KCkgLSBkZWxldGVTdGFydDsKICAgICAgICBpZiAoZmFpbENvdW50ID4gMCkgewogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgSW5zdGFuY2UgR0M6ICR7ZmFpbENvdW50fSBmaWxlIGRlbGV0aW9ucyBmYWlsZWRgLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gUGhhc2UgNjogcHJ1bmUgc3RhbGUgbWV0YWRhdGEgZW50cmllcyBmb3IgaW5zdGFuY2VzIG5vIGxvbmdlciBpbiByZWdpc3RyeS4KICAgICAgICAvLyBQcmV2ZW50cyB0aGUgbWV0YSBtYXAgZnJvbSBncm93aW5nIHVuYm91bmRlZGx5IHdoZW4gaW5zdGFuY2VzIGFyZSByZW1vdmVkCiAgICAgICAgLy8gZXh0ZXJuYWxseSBvciB0aHJvdWdoIG90aGVyIGNvZGUgcGF0aHMuCiAgICAgICAgY29uc3QgcHJ1bmVTdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgaWYgKHRoaXMubWV0YS5zaXplID4gdGhpcy5jb25maWcuZ2NCYXRjaFNpemUpIHsKICAgICAgICAgICAgdGhpcy5wcnVuZU9ycGhhbmVkTWV0YSgpOwogICAgICAgIH0KICAgICAgICB0aW1pbmcucHJ1bmVNcyA9IERhdGUubm93KCkgLSBwcnVuZVN0YXJ0OwogICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnQ7CiAgICAgICAgdGltaW5nLnRvdGFsTXMgPSBlbGFwc2VkOwogICAgICAgIGNvbnN0IHdhc0NhcHBlZCA9IHRvdGFsRWxpZ2libGUgPiBlbGlnaWJsZS5sZW5ndGg7CiAgICAgICAgY29uc3Qgd2FzQmFja2xvZ0ZvcmNlZCA9IHRlcm1pbmFsLmxlbmd0aCA+IEFnZW50SW5zdGFuY2VNYW5hZ2VyLkJBQ0tMT0dfSEFSRF9MSU1JVDsKICAgICAgICAvLyBVcGRhdGUgR0MgbWV0cmljcwogICAgICAgIHRoaXMuZ2NNZXRyaWNzLnRvdGFsQ3ljbGVzKys7CiAgICAgICAgdGhpcy5nY01ldHJpY3MudG90YWxDb2xsZWN0ZWQgKz0gY29sbGVjdGVkOwogICAgICAgIHRoaXMuZ2NNZXRyaWNzLnRvdGFsVGltZU1zICs9IGVsYXBzZWQ7CiAgICAgICAgdGhpcy5nY01ldHJpY3MubGFzdFJ1bkF0ID0gbmV3IERhdGUoc3RhcnQpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgdGhpcy5nY01ldHJpY3MubGFzdFBoYXNlVGltaW5nID0gdGltaW5nOwogICAgICAgIGlmIChjb2xsZWN0ZWQgPiB0aGlzLmdjTWV0cmljcy5wZWFrQ29sbGVjdGVkKQogICAgICAgICAgICB0aGlzLmdjTWV0cmljcy5wZWFrQ29sbGVjdGVkID0gY29sbGVjdGVkOwogICAgICAgIGlmIChlbGFwc2VkID4gdGhpcy5nY01ldHJpY3MucGVha1RpbWVNcykKICAgICAgICAgICAgdGhpcy5nY01ldHJpY3MucGVha1RpbWVNcyA9IGVsYXBzZWQ7CiAgICAgICAgaWYgKHRpbWluZy5maWxlRGVsZXRlTXMgPiB0aGlzLmdjTWV0cmljcy5wZWFrRmlsZURlbGV0ZU1zKQogICAgICAgICAgICB0aGlzLmdjTWV0cmljcy5wZWFrRmlsZURlbGV0ZU1zID0gdGltaW5nLmZpbGVEZWxldGVNczsKICAgICAgICBpZiAod2FzQ2FwcGVkKQogICAgICAgICAgICB0aGlzLmdjTWV0cmljcy5jYXBwZWRDeWNsZXMrKzsKICAgICAgICBsb2cuZGVidWcoIkdDIGN5Y2xlIGNvbXBsZXRlIiwgeyBjb2xsZWN0ZWQsIHRvdGFsRWxpZ2libGUsIHRlcm1pbmFsOiB0ZXJtaW5hbC5sZW5ndGgsIGVsYXBzZWQsIHdhc0NhcHBlZCwgY3ljbGU6IHRoaXMuZ2NNZXRyaWNzLnRvdGFsQ3ljbGVzIH0pOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgSW5zdGFuY2UgR0M6IGNvbGxlY3RlZCAke2NvbGxlY3RlZH0gb2YgJHt0b3RhbEVsaWdpYmxlfSBlbGlnaWJsZSAoJHt0ZXJtaW5hbC5sZW5ndGh9IHRlcm1pbmFsKWAsCiAgICAgICAgICAgIGRldGFpbDogYCR7ZWxhcHNlZH1tcyBbc2Nhbjoke3RpbWluZy5zY2FuTXN9IG1ldGE6JHt0aW1pbmcubWV0YUNsZWFudXBNc30gcmVnOiR7dGltaW5nLnJlZ2lzdHJ5UmVtb3ZlTXN9IGRlbDoke3RpbWluZy5maWxlRGVsZXRlTXN9IHBydW5lOiR7dGltaW5nLnBydW5lTXN9XSAke2FsbEZpbGVzLmxlbmd0aH0gZmlsZXMsIGN5Y2xlICMke3RoaXMuZ2NNZXRyaWNzLnRvdGFsQ3ljbGVzfSR7d2FzQ2FwcGVkID8gJywgQkFUQ0ggQ0FQUEVEJyA6ICcnfSR7d2FzQmFja2xvZ0ZvcmNlZCA/ICcsIEJBQ0tMT0cgRk9SQ0VEJyA6ICcnfWAsCiAgICAgICAgfSk7CiAgICAgICAgLy8gSWYgd2UgaGl0IHRoZSBiYXRjaCBjYXAsIHRoZXJlJ3MgbW9yZSB3b3JrIHRvIGRvIOKAlCBzY2hlZHVsZSBhbiBlYXJseSBjeWNsZQogICAgICAgIGlmICh3YXNDYXBwZWQpIHsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUFkYXB0aXZlR2ModG90YWxFbGlnaWJsZSAtIGVsaWdpYmxlLmxlbmd0aCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBQcnVuZSBtZXRhZGF0YSBlbnRyaWVzIGZvciBpbnN0YW5jZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICogVXNlcyBhIFNldCBvZiBjdXJyZW50IGluc3RhbmNlIElEcyBmb3IgTygxKSBsb29rdXBzIGluc3RlYWQgb2YgY2FsbGluZwogICAgICogZ2V0SW5zdGFuY2UoKSBwZXIgZW50cnkgKHdoaWNoIHNjYW5zIHRoZSByZWdpc3RyeSBtYXAgZWFjaCB0aW1lKS4KICAgICAqLwogICAgcHJ1bmVPcnBoYW5lZE1ldGEoKSB7CiAgICAgICAgLy8gQnVpbGQgYSBTZXQgb2YgYWxsIGtub3duIGluc3RhbmNlIElEcyAoc2luZ2xlIHBhc3Mgb3ZlciByZWdpc3RyeSkKICAgICAgICBjb25zdCBrbm93bklkcyA9IG5ldyBTZXQodGhpcy5ydW50aW1lLmxpc3RJbnN0YW5jZXMoKS5tYXAoKGkpID0+IGkuaWQpKTsKICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMubWV0YS5rZXlzKCkpIHsKICAgICAgICAgICAgaWYgKCFrbm93bklkcy5oYXMoaWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1ldGEuZGVsZXRlKGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFsOiBoZWFsdGggY2hlY2tzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBzdGFydEhlYWx0aENoZWNrcygpIHsKICAgICAgICBpZiAodGhpcy5oZWFsdGhUaW1lcikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMuaGVhbHRoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMucnVuSGVhbHRoQ2hlY2tzKCkuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiAiSGVhbHRoIGNoZWNrIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVyci5tZXNzYWdlLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIHRoaXMuY29uZmlnLmhlYWx0aENoZWNrSW50ZXJ2YWxNcyk7CiAgICB9CiAgICBzdG9wSGVhbHRoQ2hlY2tzKCkgewogICAgICAgIGlmICh0aGlzLmhlYWx0aFRpbWVyKSB7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFsdGhUaW1lcik7CiAgICAgICAgICAgIHRoaXMuaGVhbHRoVGltZXIgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUnVuIGhlYWx0aCBjaGVja3Mgb24gYWxsIGFjdGl2ZSBpbnN0YW5jZXMuCiAgICAgKiBJZiBhdXRvLXJlY292ZXJ5IGlzIGVuYWJsZWQsIHJlc3RhcnQgaW5zdGFuY2VzIHRoYXQgZXhjZWVkIHRoZQogICAgICogdW5oZWFsdGh5IHRocmVzaG9sZC4KICAgICAqLwogICAgYXN5bmMgcnVuSGVhbHRoQ2hlY2tzKCkgewogICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMucnVudGltZS5saXN0QWN0aXZlKCk7CiAgICAgICAgZm9yIChjb25zdCBpbnN0IG9mIGFjdGl2ZSkgewogICAgICAgICAgICBjb25zdCBoZWFsdGggPSB0aGlzLmFzc2Vzc0hlYWx0aChpbnN0LmlkKTsKICAgICAgICAgICAgaWYgKCFoZWFsdGguaGVhbHRoeSAmJiB0aGlzLmNvbmZpZy5hdXRvUmVjb3ZlcikgewogICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZW5zdXJlTWV0YShpbnN0LmlkKTsKICAgICAgICAgICAgICAgIGlmIChtZXRhLmNvbnNlY3V0aXZlRmFpbHVyZXMgPj0gdGhpcy5jb25maWcudW5oZWFsdGh5VGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2FwIHRvdGFsIGF1dG8tcmVzdGFydHMgdG8gcHJldmVudCBpbmZpbml0ZSByZXN0YXJ0IGxvb3BzCiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEucmVzdGFydENvdW50ID49IHRoaXMuY29uZmlnLm1heEF1dG9SZXN0YXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQXV0by1yZWNvdmVyeSBza2lwcGVkIChtYXggcmVzdGFydHMgJHt0aGlzLmNvbmZpZy5tYXhBdXRvUmVzdGFydHN9IHJlYWNoZWQpOiAke2luc3QubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogYFJlc3RhcnRzOiAke21ldGEucmVzdGFydENvdW50fSwgZmFpbHVyZXM6ICR7bWV0YS5jb25zZWN1dGl2ZUZhaWx1cmVzfWAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBdXRvLXJlY292ZXJpbmcgdW5oZWFsdGh5IGFnZW50OiAke2luc3QubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgU2NvcmU6ICR7aGVhbHRoLnNjb3JlfSwgZmFpbHVyZXM6ICR7bWV0YS5jb25zZWN1dGl2ZUZhaWx1cmVzfSwgcmVzdGFydHM6ICR7bWV0YS5yZXN0YXJ0Q291bnR9LyR7dGhpcy5jb25maWcubWF4QXV0b1Jlc3RhcnRzfWAsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0KGluc3QuaWQsICJBdXRvLXJlY292ZXJ5OiB1bmhlYWx0aHkgdGhyZXNob2xkIGV4Y2VlZGVkIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEF1dG8tcmVjb3ZlcnkgZmFpbGVkOiAke2luc3QubWV0YWRhdGEubGFiZWx9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFsOiBmaWx0ZXIgaW5zdGFuY2VzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmaWx0ZXJJbnN0YW5jZXMoZmlsdGVyKSB7CiAgICAgICAgbGV0IGluc3RhbmNlcyA9IHRoaXMucnVudGltZS5saXN0SW5zdGFuY2VzKCk7CiAgICAgICAgaWYgKGZpbHRlci5zdGF0ZXMpIHsKICAgICAgICAgICAgY29uc3Qgc3RhdGVzID0gbmV3IFNldChmaWx0ZXIuc3RhdGVzKTsKICAgICAgICAgICAgaW5zdGFuY2VzID0gaW5zdGFuY2VzLmZpbHRlcigoaSkgPT4gc3RhdGVzLmhhcyhpLnN0YXRlKSk7CiAgICAgICAgfQogICAgICAgIGlmIChmaWx0ZXIudGFncykgewogICAgICAgICAgICBjb25zdCB0YWdzID0gbmV3IFNldChmaWx0ZXIudGFncyk7CiAgICAgICAgICAgIGluc3RhbmNlcyA9IGluc3RhbmNlcy5maWx0ZXIoKGkpID0+IGkubWV0YWRhdGEudGFncy5zb21lKCh0KSA9PiB0YWdzLmhhcyh0KSkpOwogICAgICAgIH0KICAgICAgICBpZiAoZmlsdGVyLm9yaWdpbikgewogICAgICAgICAgICBpbnN0YW5jZXMgPSBpbnN0YW5jZXMuZmlsdGVyKChpKSA9PiBpLm1ldGFkYXRhLm9yaWdpbiA9PT0gZmlsdGVyLm9yaWdpbik7CiAgICAgICAgfQogICAgICAgIGlmIChmaWx0ZXIubGFiZWxQYXR0ZXJuKSB7CiAgICAgICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChmaWx0ZXIubGFiZWxQYXR0ZXJuLCAiaSIpOwogICAgICAgICAgICBpbnN0YW5jZXMgPSBpbnN0YW5jZXMuZmlsdGVyKChpKSA9PiByZS50ZXN0KGkubWV0YWRhdGEubGFiZWwpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpbHRlci5vbGRlclRoYW5NcykgewogICAgICAgICAgICBjb25zdCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gZmlsdGVyLm9sZGVyVGhhbk1zOwogICAgICAgICAgICBpbnN0YW5jZXMgPSBpbnN0YW5jZXMuZmlsdGVyKChpKSA9PiBuZXcgRGF0ZShpLmNyZWF0ZWRBdCkuZ2V0VGltZSgpIDwgY3V0b2ZmKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluc3RhbmNlczsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFsOiBtZXRhZGF0YSBoZWxwZXJzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBlbnN1cmVNZXRhKGluc3RhbmNlSWQpIHsKICAgICAgICBsZXQgbWV0YSA9IHRoaXMubWV0YS5nZXQoaW5zdGFuY2VJZCk7CiAgICAgICAgaWYgKCFtZXRhKSB7CiAgICAgICAgICAgIG1ldGEgPSB7CiAgICAgICAgICAgICAgICBoaXN0b3J5OiBbXSwKICAgICAgICAgICAgICAgIHJlc3RhcnRDb3VudDogMCwKICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXM6IDAsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMubWV0YS5zZXQoaW5zdGFuY2VJZCwgbWV0YSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZXRhOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWluc3RhbmNlLW1hbmFnZXIuanMubWFw","agents/monitor.js":"aW1wb3J0IHsgbGlzdFRhc2tzLCB1cGRhdGVUYXNrLCByZWFkVGFza091dHB1dCB9IGZyb20gIi4vc3RvcmUuanMiOwppbXBvcnQgeyBzcGF3bkFnZW50LCB1cGRhdGVCb2FyZFRhc2tTdGF0ZSB9IGZyb20gIi4vc3Bhd24uanMiOwppbXBvcnQgeyBwdXNoTm90aWZpY2F0aW9uIH0gZnJvbSAiLi4vZ29hbHMvbm90aWZpY2F0aW9ucy5qcyI7CmltcG9ydCB7IGxvZ0FjdGl2aXR5IH0gZnJvbSAiLi4vYWN0aXZpdHkvbG9nLmpzIjsKaW1wb3J0IHsgcmVtZW1iZXJUYXNrT3V0Y29tZSB9IGZyb20gIi4vbWVtb3J5LmpzIjsKaW1wb3J0IHsgcHJ1bmVSZWNvdmVyeVRyYWNraW5nLCBhdHRlbXB0UmVjb3ZlcnkgfSBmcm9tICIuL3JlY292ZXIuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBnZXRSdW50aW1lIH0gZnJvbSAiLi9ydW50aW1lL2luZGV4LmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJhZ2VudC1tb25pdG9yIik7CmNvbnN0IFBPTExfSU5URVJWQUxfTVMgPSAxNV8wMDA7CmxldCBwb2xsVGltZXIgPSBudWxsOwovKioKICogU2V0IG9mIHRhc2sgSURzIHdlJ3JlIG1vbml0b3JpbmcgKHJlY292ZXJlZCBQSURzIHRoYXQgd2UgZGlkbid0IHNwYXduKS4KICogRm9yIFBJRHMgd2Ugc3Bhd25lZCwgdGhlIGV4aXQgaGFuZGxlciBpbiBzcGF3bi50cyBoYW5kbGVzIGNvbXBsZXRpb24uCiAqIFRoaXMgc2V0IHRyYWNrcyByZWNvdmVyZWQgUElEcyB0aGF0IG5lZWQgcG9sbC1iYXNlZCBtb25pdG9yaW5nLgogKgogKiBPbmx5IGNvbnRhaW5zIHRhc2tzIE5PVCBtYW5hZ2VkIGJ5IHRoZSBSdW50aW1lTWFuYWdlciDigJQgcG9vbC1zcGF3bmVkCiAqIHRhc2tzIGFyZSBoYW5kbGVkIGJ5IHRoZSBSdW50aW1lTWFuYWdlcidzIG93biBtb25pdG9yIGN5Y2xlLgogKi8KY29uc3QgbW9uaXRvcmVkUGlkcyA9IG5ldyBNYXAoKTsKLyoqIENoZWNrIGlmIGEgcHJvY2VzcyBpcyBhbGl2ZSBieSBzZW5kaW5nIHNpZ25hbCAwLiAqLwpmdW5jdGlvbiBpc1BpZEFsaXZlKHBpZCkgewogICAgdHJ5IHsKICAgICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KLyoqCiAqIENoZWNrIGlmIGEgdGFzayBpcyBtYW5hZ2VkIGJ5IHRoZSBSdW50aW1lTWFuYWdlci4KICogVGFza3Mgc3Bhd25lZCB2aWEgdGhlIGFnZW50IHBvb2wgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcnVudGltZSBpbnN0YW5jZQogKiBhbmQgc2hvdWxkIE5PVCBiZSBkb3VibGUtcmVjb3ZlcmVkIGJ5IHRoZSBtb25pdG9yLgogKi8KZnVuY3Rpb24gaXNSdW50aW1lTWFuYWdlZCh0YXNrSWQpIHsKICAgIGNvbnN0IHJ1bnRpbWUgPSBnZXRSdW50aW1lKCk7CiAgICByZXR1cm4gcnVudGltZT8uZ2V0QnlUYXNrSWQodGFza0lkKSAhPSBudWxsOwp9Ci8qKgogKiBDYWxsZWQgb25jZSBhdCBzdGFydHVwLiBTY2FucyBhbGwgdGFzayBmaWxlcyBhbmQgcmVjb3ZlcnMgc3RhdGU6CiAqIC0gcnVubmluZyArIFBJRCBhbGl2ZSDihpIgcmVnaXN0ZXIgZm9yIG1vbml0b3JpbmcgKG9ubHkgaWYgbm90IHJ1bnRpbWUtbWFuYWdlZCkKICogLSBydW5uaW5nICsgUElEIGRlYWQg4oaSIHJlYWQgbG9nLCBtYXJrIGNvbXBsZXRlZC9mYWlsZWQgKG9ubHkgaWYgbm90IHJ1bnRpbWUtbWFuYWdlZCkKICogLSBwZW5kaW5nIOKGkiByZS1zcGF3biAob25seSBpZiBub3QgcnVudGltZS1tYW5hZ2VkKQogKgogKiBJTVBPUlRBTlQ6IENhbGwgdGhpcyBBRlRFUiBjcmVhdGVSdW50aW1lKCkgc28gdGhlIHJ1bnRpbWUgcmVnaXN0cnkgaXMKICogYXZhaWxhYmxlIGZvciBkZWR1cCBjaGVja3MuIFRhc2tzIG1hbmFnZWQgYnkgdGhlIFJ1bnRpbWVNYW5hZ2VyIGFyZQogKiBza2lwcGVkIOKAlCBpdHMgb3duIHJlY292ZXJBZ2VudHMoKSBoYW5kbGVzIHRoZW0uCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlclRhc2tzKCkgewogICAgbG9nLmluZm8oIlJlY292ZXJpbmcgdGFza3MgZnJvbSBwcmV2aW91cyBzZXNzaW9uIik7CiAgICBjb25zdCB0YXNrcyA9IGF3YWl0IGxpc3RUYXNrcygpOwogICAgbGV0IHJlY292ZXJlZCA9IDA7CiAgICBsZXQgcmVxdWV1ZWQgPSAwOwogICAgbGV0IHNraXBwZWRSdW50aW1lID0gMDsKICAgIC8vIFNlcGFyYXRlIHRhc2tzIGJ5IHJlY292ZXJ5IGFjdGlvbiBmb3IgcGFyYWxsZWwgcHJvY2Vzc2luZwogICAgY29uc3QgYWxpdmVUYXNrcyA9IFtdOwogICAgY29uc3QgZGVhZFRhc2tzID0gW107CiAgICBjb25zdCBwZW5kaW5nVGFza3MgPSBbXTsKICAgIGZvciAoY29uc3QgdGFzayBvZiB0YXNrcykgewogICAgICAgIC8vIFNraXAgdGFza3MgbWFuYWdlZCBieSB0aGUgUnVudGltZU1hbmFnZXIg4oCUIHByZXZlbnRzIGRvdWJsZS1yZWNvdmVyeQogICAgICAgIC8vIHRoYXQgY2F1c2VzIGR1cGxpY2F0ZSByZXRyaWVzICsgcmVjb3ZlcnkgYWdlbnQgZmFuLW91dCAoREFTSC04MikKICAgICAgICBpZiAoaXNSdW50aW1lTWFuYWdlZCh0YXNrLmlkKSkgewogICAgICAgICAgICBza2lwcGVkUnVudGltZSsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhc2suc3RhdHVzID09PSAicnVubmluZyIgJiYgdGFzay5waWQpIHsKICAgICAgICAgICAgaWYgKGlzUGlkQWxpdmUodGFzay5waWQpKSB7CiAgICAgICAgICAgICAgICBhbGl2ZVRhc2tzLnB1c2godGFzayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkZWFkVGFza3MucHVzaCh0YXNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0YXNrLnN0YXR1cyA9PT0gInBlbmRpbmciKSB7CiAgICAgICAgICAgIHBlbmRpbmdUYXNrcy5wdXNoKHRhc2spOwogICAgICAgIH0KICAgIH0KICAgIGlmIChza2lwcGVkUnVudGltZSA+IDApIHsKICAgICAgICBsb2cuaW5mbyhgU2tpcHBlZCAke3NraXBwZWRSdW50aW1lfSBydW50aW1lLW1hbmFnZWQgdGFzayhzKSDigJQgUnVudGltZU1hbmFnZXIgaGFuZGxlcyByZWNvdmVyeWApOwogICAgfQogICAgLy8gUmVnaXN0ZXIgYWxpdmUgcHJvY2Vzc2VzIChubyBJL08gbmVlZGVkKQogICAgZm9yIChjb25zdCB0YXNrIG9mIGFsaXZlVGFza3MpIHsKICAgICAgICBtb25pdG9yZWRQaWRzLnNldCh0YXNrLmlkLCB0YXNrLnBpZCk7CiAgICAgICAgcmVjb3ZlcmVkKys7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBSZWNvdmVyZWQgcnVubmluZyBhZ2VudDogJHt0YXNrLmxhYmVsfWAsCiAgICAgICAgICAgIGRldGFpbDogYFBJRCAke3Rhc2sucGlkfSBzdGlsbCBhbGl2ZWAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgIHJlYXNvbjogIm1vbml0b3IgcmVjb3ZlcmVkIHJ1bm5pbmcgcHJvY2VzcyIsCiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBSZWNvdmVyIGRlYWQgdGFza3MgaW4gcGFyYWxsZWwgKGVhY2ggcmVhZHMgdGFzayBvdXRwdXQgZnJvbSBkaXNrKQogICAgaWYgKGRlYWRUYXNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZGVhZFRhc2tzLm1hcChhc3luYyAodGFzaykgPT4gewogICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZWFkVGFza091dHB1dCh0YXNrLmlkKTsKICAgICAgICAgICAgY29uc3QgaGFzT3V0cHV0ID0gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAwOwogICAgICAgICAgICBjb25zdCBmaW5hbFN0YXR1cyA9IGhhc091dHB1dCA/ICJjb21wbGV0ZWQiIDogImZhaWxlZCI7CiAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVRhc2sodGFzay5pZCwgewogICAgICAgICAgICAgICAgc3RhdHVzOiBmaW5hbFN0YXR1cywKICAgICAgICAgICAgICAgIGZpbmlzaGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgIHJlc3VsdFN1bW1hcnk6IGhhc091dHB1dCA/IG91dHB1dC5zbGljZSgwLCA1MDApIDogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZXJyb3I6IGhhc091dHB1dCA/IHVuZGVmaW5lZCA6ICJQcm9jZXNzIGRpZWQgd2hpbGUgc2VydmVyIHdhcyBkb3duIChubyBvdXRwdXQpIiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSBib2FyZCB0YXNrIHN0YXRlIG9uIHJlY292ZXJ5CiAgICAgICAgICAgIGlmICh0YXNrLmJvYXJkVGFza0lkKSB7CiAgICAgICAgICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT09ICJjb21wbGV0ZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQm9hcmRUYXNrU3RhdGUodGFzay5ib2FyZFRhc2tJZCwgeyBzdGF0ZTogImRvbmUiIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQm9hcmRUYXNrU3RhdGUodGFzay5ib2FyZFRhc2tJZCwgeyBzdGF0ZTogInRvZG8iLCBhc3NpZ25lZTogbnVsbCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZW1lbWJlclRhc2tPdXRjb21lKHsgLi4udGFzaywgc3RhdHVzOiBmaW5hbFN0YXR1cywgZXJyb3I6IGhhc091dHB1dCA/IHVuZGVmaW5lZCA6ICJQcm9jZXNzIGRpZWQgd2hpbGUgc2VydmVyIHdhcyBkb3duIiB9LCBvdXRwdXQpLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBSZWNvdmVyZWQgJHtmaW5hbFN0YXR1c30gYWdlbnQ6ICR7dGFzay5sYWJlbH1gLAogICAgICAgICAgICAgICAgZGV0YWlsOiBgUElEICR7dGFzay5waWR9IHdhcyBkZWFkIG9uIHJlY292ZXJ5YCwKICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgICAgICByZWFzb246ICJtb25pdG9yIGRldGVjdGVkIHByb2Nlc3MgZXhpdCIsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBvdXRwdXRTbmlwcGV0ID0gaGFzT3V0cHV0CiAgICAgICAgICAgICAgICA/IGBcbk91dHB1dDpcbiR7b3V0cHV0LnRyaW0oKS5zbGljZSgwLCAxMDAwKX1gCiAgICAgICAgICAgICAgICA6ICIiOwogICAgICAgICAgICBwdXNoTm90aWZpY2F0aW9uKHsKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgbWVzc2FnZTogYEFnZW50IHRhc2sgIiR7dGFzay5sYWJlbH0iICR7ZmluYWxTdGF0dXN9IChyZWNvdmVyZWQgYWZ0ZXIgcmVzdGFydCkuJHtvdXRwdXRTbmlwcGV0fWAsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8vIFJlLXF1ZXVlIHBlbmRpbmcgdGFza3Mgd2l0aCBzdGFnZ2VyZWQgZGVsYXlzCiAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGVuZGluZ1Rhc2tzKSB7CiAgICAgICAgcmVxdWV1ZWQrKzsKICAgICAgICBjb25zdCBkZWxheU1zID0gcmVxdWV1ZWQgKiAyMDAwOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgUmUtcXVldWluZyBwZW5kaW5nIGFnZW50ICgke2RlbGF5TXN9bXMgZGVsYXkpOiAke3Rhc2subGFiZWx9YCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6IHRhc2sub3JpZ2luID09PSAiYWkiID8gIkFVVE9OT01PVVMiIDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiAibW9uaXRvciByZS1xdWV1aW5nIHBlbmRpbmcgdGFzayIsCiAgICAgICAgfSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHNwYXduQWdlbnQodGFzaykuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgRmFpbGVkIHRvIHJlLXNwYXduIGFnZW50OiAke3Rhc2subGFiZWx9YCwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVyci5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiB0YXNrLm9yaWdpbiA9PT0gImFpIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCIsCiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAibW9uaXRvciByZS1zcGF3biBmYWlsZWQiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIGRlbGF5TXMpOwogICAgfQogICAgaWYgKHJlY292ZXJlZCA+IDAgfHwgcmVxdWV1ZWQgPiAwIHx8IGRlYWRUYXNrcy5sZW5ndGggPiAwIHx8IHNraXBwZWRSdW50aW1lID4gMCkgewogICAgICAgIGxvZy5pbmZvKCJUYXNrIHJlY292ZXJ5IGNvbXBsZXRlIiwgeyByZWNvdmVyZWQsIHJlc29sdmVkOiBkZWFkVGFza3MubGVuZ3RoLCByZXF1ZXVlZCwgc2tpcHBlZFJ1bnRpbWUgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBBZ2VudCByZWNvdmVyeTogJHtyZWNvdmVyZWR9IHJ1bm5pbmcsICR7ZGVhZFRhc2tzLmxlbmd0aH0gcmVzb2x2ZWQsICR7cmVxdWV1ZWR9IHJlLXF1ZXVlZCR7c2tpcHBlZFJ1bnRpbWUgPiAwID8gYCwgJHtza2lwcGVkUnVudGltZX0gcnVudGltZS1tYW5hZ2VkYCA6ICIifWAsCiAgICAgICAgfSk7CiAgICB9Cn0KLyoqIFN0YXJ0IHRoZSAxNXMgcG9sbCBsb29wIGZvciBtb25pdG9yaW5nIHJlY292ZXJlZCBQSURzLiAqLwpleHBvcnQgZnVuY3Rpb24gc3RhcnRBZ2VudE1vbml0b3IoKSB7CiAgICBpZiAocG9sbFRpbWVyKQogICAgICAgIHJldHVybjsKICAgIHBvbGxUaW1lciA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsKICAgICAgICAvLyBQZXJpb2RpY2FsbHkgcHJ1bmUgdGhlIHJlY292ZXJ5IHRyYWNraW5nIHNldCB0byBwcmV2ZW50IG1lbW9yeSBncm93dGgKICAgICAgICBwcnVuZVJlY292ZXJ5VHJhY2tpbmcoKTsKICAgICAgICBmb3IgKGNvbnN0IFt0YXNrSWQsIHBpZF0gb2YgbW9uaXRvcmVkUGlkcykgewogICAgICAgICAgICBpZiAoIWlzUGlkQWxpdmUocGlkKSkgewogICAgICAgICAgICAgICAgbG9nLmluZm8oYE1vbml0b3JlZCBQSUQgZXhpdGVkYCwgeyB0YXNrSWQsIHBpZCB9KTsKICAgICAgICAgICAgICAgIG1vbml0b3JlZFBpZHMuZGVsZXRlKHRhc2tJZCk7CiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZWFkVGFza091dHB1dCh0YXNrSWQpOwogICAgICAgICAgICAgICAgY29uc3QgaGFzT3V0cHV0ID0gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBoYXNPdXRwdXQgPyAiY29tcGxldGVkIiA6ICJmYWlsZWQiOwogICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHVwZGF0ZVRhc2sodGFza0lkLCB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBmaW5hbFN0YXR1cywKICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0U3VtbWFyeTogaGFzT3V0cHV0ID8gb3V0cHV0LnNsaWNlKDAsIDUwMCkgOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGhhc091dHB1dCA/IHVuZGVmaW5lZCA6ICJQcm9jZXNzIGV4aXRlZCB3aXRoIG5vIG91dHB1dCIsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdXBkYXRlZD8ubGFiZWwgPz8gdGFza0lkOwogICAgICAgICAgICAgICAgLy8gVXBkYXRlIGJvYXJkIHRhc2sgc3RhdGUgZnJvbSBtb25pdG9yCiAgICAgICAgICAgICAgICBjb25zdCBib2FyZFRhc2tJZCA9IHVwZGF0ZWQ/LmJvYXJkVGFza0lkOwogICAgICAgICAgICAgICAgaWYgKGJvYXJkVGFza0lkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09PSAiY29tcGxldGVkIikgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVCb2FyZFRhc2tTdGF0ZShib2FyZFRhc2tJZCwgeyBzdGF0ZTogImRvbmUiIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQm9hcmRUYXNrU3RhdGUoYm9hcmRUYXNrSWQsIHsgc3RhdGU6ICJ0b2RvIiwgYXNzaWduZWU6IG51bGwgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZW1lbWJlclRhc2tPdXRjb21lKHVwZGF0ZWQsIG91dHB1dCkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFnZW50ICR7ZmluYWxTdGF0dXN9OiAke2xhYmVsfWAsCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgRGV0ZWN0ZWQgdmlhIG1vbml0b3IgcG9sbCAoUElEICR7cGlkfSlgLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiB1cGRhdGVkPy5vcmlnaW4gPT09ICJhaSIgPyAiQVVUT05PTU9VUyIgOiAiUFJPTVBURUQiLAogICAgICAgICAgICAgICAgICAgIHJlYXNvbjogIm1vbml0b3IgZGV0ZWN0ZWQgcHJvY2VzcyBleGl0IiwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0U25pcHBldCA9IGhhc091dHB1dAogICAgICAgICAgICAgICAgICAgID8gYFxuT3V0cHV0OlxuJHtvdXRwdXQudHJpbSgpLnNsaWNlKDAsIDEwMDApfWAKICAgICAgICAgICAgICAgICAgICA6ICIiOwogICAgICAgICAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCB0YXNrICIke2xhYmVsfSIgJHtmaW5hbFN0YXR1c30uJHtvdXRwdXRTbmlwcGV0fWAsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgcmVjb3ZlcnkgZm9yIGZhaWxlZCBtb25pdG9yZWQgdGFza3Mg4oCUIGJ1dCBPTkxZIGZvciB0YXNrcwogICAgICAgICAgICAgICAgLy8gbm90IG1hbmFnZWQgYnkgdGhlIFJ1bnRpbWVNYW5hZ2VyLiBSdW50aW1lLW1hbmFnZWQgdGFza3Mgc2hvdWxkIG5ldmVyCiAgICAgICAgICAgICAgICAvLyBiZSBpbiBtb25pdG9yZWRQaWRzIChmaWx0ZXJlZCBpbiByZWNvdmVyVGFza3MpLCBidXQgZ3VhcmQgaGVyZSB0b28KICAgICAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlLXJldHJ5IGZhbi1vdXQgKERBU0gtODIpLgogICAgICAgICAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09PSAiZmFpbGVkIiAmJiB1cGRhdGVkICYmIHVwZGF0ZWQub3JpZ2luID09PSAiYWkiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnVudGltZU1hbmFnZWQodGFza0lkKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhgU2tpcHBpbmcgcmVjb3ZlcnkgZm9yIHJ1bnRpbWUtbWFuYWdlZCB0YXNrOiAke2xhYmVsfWAsIHsgdGFza0lkIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdFJlY292ZXJ5KHsgLi4udXBkYXRlZCwgc3RhdHVzOiAiZmFpbGVkIiwgZXJyb3I6ICJQcm9jZXNzIGV4aXRlZCB3aXRoIG5vIG91dHB1dCIgfSwgb3V0cHV0KS5jYXRjaCgoKSA9PiB7IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sIFBPTExfSU5URVJWQUxfTVMpOwp9Ci8qKiBTdG9wIHRoZSBwb2xsIGxvb3AuICovCmV4cG9ydCBmdW5jdGlvbiBzdG9wQWdlbnRNb25pdG9yKCkgewogICAgaWYgKHBvbGxUaW1lcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbFRpbWVyKTsKICAgICAgICBwb2xsVGltZXIgPSBudWxsOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vbml0b3IuanMubWFw","agents/heartbeat.js":"LyoqCiAqIEFnZW50IEhlYXJ0YmVhdCBNb25pdG9yIOKAlCBDT1JFLTkKICoKICogQWN0aW9uLWJhc2VkIGhlYXJ0YmVhdDogZXZlcnkgYWdlbnQgYWN0aW9uIElTIHRoZSBwaW5nLgogKiBObyBwb2xsaW5nLCBubyB0aW1lci1iYXNlZCBwaW5ncy4gVGhlIGFwcGVuZC1vbmx5IGxvZyBpcyB0aGUgdHJhY2tpbmcuCiAqCiAqIE1vbml0b3JzOgogKiAxLiAqKlNpbGVuY2UgZGV0ZWN0aW9uKiog4oCUIGFnZW50IHByb2R1Y2VzIG5vIG91dHB1dCBmb3IgdG9vIGxvbmcg4oaSIHRlcm1pbmF0ZQogKiAyLiAqKkRyaWZ0IGRldGVjdGlvbioqIOKAlCBhZ2VudCdzIGFjdGlvbnMgZGl2ZXJnZSBmcm9tIHRoZSBhc3NpZ25lZCB0YXNrIOKGkiB3YXJuL3Rlcm1pbmF0ZQogKiAzLiAqKkhlYXJ0YmVhdCBsb2dnaW5nKiog4oCUIGFwcGVuZC1vbmx5IEpTT05MIHRyYWlsIG9mIGFnZW50IHB1bHNlcwogKgogKiBEZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIGV4aXN0aW5nIGFjdGl2aXR5IGxvZyBzeXN0ZW0uIEVhY2ggYWdlbnQgZ2V0cwogKiBhIEhlYXJ0YmVhdFRyYWNrZXIgdGhhdCB3YXRjaGVzIGZvciBzaWducyBvZiBsaWZlIGFuZCB0YXNrIGFkaGVyZW5jZS4KICovCmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSwgZ2VuZXJhdGVUcmFjZUlkIH0gZnJvbSAiLi4vYWN0aXZpdHkvbG9nLmpzIjsKaW1wb3J0IHsgYXBwZW5kQnJhaW5MaW5lU3luYywgZW5zdXJlQnJhaW5GaWxlU3luYywgfSBmcm9tICIuLi9saWIvYnJhaW4taW8uanMiOwppbXBvcnQgeyBCUkFJTl9ESVIgfSBmcm9tICIuLi9saWIvcGF0aHMuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImhlYXJ0YmVhdCIpOwpjb25zdCBPUFNfRElSID0gam9pbihCUkFJTl9ESVIsICJvcHMiKTsKY29uc3QgSEVBUlRCRUFUX0ZJTEUgPSBqb2luKE9QU19ESVIsICJoZWFydGJlYXRzLmpzb25sIik7CmNvbnN0IFNDSEVNQV9MSU5FID0gSlNPTi5zdHJpbmdpZnkoeyBfc2NoZW1hOiAiaGVhcnRiZWF0IiwgX3ZlcnNpb246ICIxLjAiIH0pOwovLyBFbnN1cmUgdGhlIGZpbGUgZXhpc3RzIG9uIG1vZHVsZSBsb2FkCnRyeSB7CiAgICBlbnN1cmVCcmFpbkZpbGVTeW5jKEhFQVJUQkVBVF9GSUxFLCBTQ0hFTUFfTElORSk7Cn0KY2F0Y2ggewogICAgLy8gTm9uLWZhdGFsIOKAlCB3aWxsIHJldHJ5IG9uIGZpcnN0IHdyaXRlCn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIERlZmF1bHQgY29uZmlnCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjb25zdCBERUZBVUxUX0NPTkZJRyA9IHsKICAgIHNpbGVuY2VXYXJuaW5nTXM6IDEyMF8wMDAsIC8vIDIgbWludXRlcwogICAgc2lsZW5jZVRlcm1pbmF0ZU1zOiAzMDBfMDAwLCAvLyA1IG1pbnV0ZXMKICAgIGNoZWNrSW50ZXJ2YWxNczogMTVfMDAwLCAvLyAxNSBzZWNvbmRzCiAgICB0YXNrRGVzY3JpcHRpb246ICIiLAogICAgdGFza0tleXdvcmRzOiBbXSwKICAgIG1heERyaWZ0V2FybmluZ3M6IDMsCn07Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIZWFydGJlYXQgcGVyc2lzdGVuY2UKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIHBlcnNpc3RQdWxzZShwdWxzZSkgewogICAgdHJ5IHsKICAgICAgICBlbnN1cmVCcmFpbkZpbGVTeW5jKEhFQVJUQkVBVF9GSUxFLCBTQ0hFTUFfTElORSk7CiAgICAgICAgYXBwZW5kQnJhaW5MaW5lU3luYyhIRUFSVEJFQVRfRklMRSwgSlNPTi5zdHJpbmdpZnkocHVsc2UpKTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cud2FybigiRmFpbGVkIHRvIHBlcnNpc3QgaGVhcnRiZWF0IHB1bHNlIiwgewogICAgICAgICAgICB0YXNrSWQ6IHB1bHNlLnRhc2tJZCwKICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSwKICAgICAgICB9KTsKICAgIH0KfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gS2V5d29yZCBleHRyYWN0aW9uIGZvciBkcmlmdCBkZXRlY3Rpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qKiBFeHRyYWN0IG1lYW5pbmdmdWwga2V5d29yZHMgZnJvbSBhIHRhc2sgZGVzY3JpcHRpb24uICovCmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VGFza0tleXdvcmRzKGRlc2NyaXB0aW9uKSB7CiAgICAvLyBSZW1vdmUgY29tbW9uIHN0b3Agd29yZHMgYW5kIHNob3J0IHdvcmRzLCBrZWVwIG1lYW5pbmdmdWwgdGVybXMKICAgIGNvbnN0IHN0b3BXb3JkcyA9IG5ldyBTZXQoWwogICAgICAgICJ0aGUiLCAiYSIsICJhbiIsICJhbmQiLCAib3IiLCAiYnV0IiwgImluIiwgIm9uIiwgImF0IiwgInRvIiwgImZvciIsCiAgICAgICAgIm9mIiwgIndpdGgiLCAiYnkiLCAiZnJvbSIsICJpcyIsICJhcmUiLCAid2FzIiwgIndlcmUiLCAiYmUiLCAiYmVlbiIsCiAgICAgICAgImJlaW5nIiwgImhhdmUiLCAiaGFzIiwgImhhZCIsICJkbyIsICJkb2VzIiwgImRpZCIsICJ3aWxsIiwgIndvdWxkIiwKICAgICAgICAiY291bGQiLCAic2hvdWxkIiwgIm1heSIsICJtaWdodCIsICJzaGFsbCIsICJjYW4iLCAidGhpcyIsICJ0aGF0IiwKICAgICAgICAidGhlc2UiLCAidGhvc2UiLCAiaXQiLCAiaXRzIiwgIm5vdCIsICJubyIsICJhbGwiLCAiYW55IiwgImVhY2giLAogICAgICAgICJldmVyeSIsICJpZiIsICJ0aGVuIiwgImVsc2UiLCAid2hlbiIsICJ3aGVyZSIsICJob3ciLCAid2hhdCIsICJ3aGljaCIsCiAgICAgICAgIndobyIsICJ3aG9tIiwgIndoeSIsICJzbyIsICJhcyIsICJ1cCIsICJvdXQiLCAiYWJvdXQiLCAiaW50byIsICJvdmVyIiwKICAgICAgICAiYWZ0ZXIiLCAiYmVmb3JlIiwgImJldHdlZW4iLCAidW5kZXIiLCAiYWJvdmUiLCAiYmVsb3ciLCAianVzdCIsICJhbHNvIiwKICAgICAgICAidmVyeSIsICJ0b28iLCAib25seSIsICJvd24iLCAic2FtZSIsICJ0aGFuIiwgIm90aGVyIiwgInN1Y2giLCAibW9yZSIsCiAgICAgICAgIm1vc3QiLCAic29tZSIsICJtYWtlIiwgInVzZSIsICJnZXQiLCAic2V0IiwgImFkZCIsICJydW4iLCAiZmlsZSIsCiAgICBdKTsKICAgIHJldHVybiBkZXNjcmlwdGlvbgogICAgICAgIC50b0xvd2VyQ2FzZSgpCiAgICAgICAgLnJlcGxhY2UoL1teYS16MC05XHMtXS9nLCAiICIpCiAgICAgICAgLnNwbGl0KC9ccysvKQogICAgICAgIC5maWx0ZXIoKHcpID0+IHcubGVuZ3RoID4gMiAmJiAhc3RvcFdvcmRzLmhhcyh3KSkKICAgICAgICAuc2xpY2UoMCwgMjApOyAvLyBDYXAgYXQgMjAga2V5d29yZHMKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2ltcGxlIGRyaWZ0IGhldXJpc3RpYwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoqCiAqIFNjb3JlIGhvdyByZWxldmFudCBhbiBhY3Rpb24gc3VtbWFyeSBpcyB0byB0aGUgb3JpZ2luYWwgdGFzay4KICogUmV0dXJucyAwLjAgKG5vIG92ZXJsYXApIHRvIDEuMCAocGVyZmVjdCBvdmVybGFwKS4KICogVXNlcyBzaW1wbGUga2V5d29yZCBvdmVybGFwIOKAlCBub3Qgc2VtYW50aWMsIGJ1dCBmYXN0IGFuZCB0cmFuc3BhcmVudC4KICovCmZ1bmN0aW9uIGRyaWZ0U2NvcmUoYWN0aW9uU3VtbWFyeSwgdGFza0tleXdvcmRzKSB7CiAgICBpZiAodGFza0tleXdvcmRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gMS4wOyAvLyBObyBrZXl3b3JkcyA9IG5vIGRyaWZ0IGRldGVjdGlvbgogICAgY29uc3QgYWN0aW9uV29yZHMgPSBuZXcgU2V0KGFjdGlvblN1bW1hcnkKICAgICAgICAudG9Mb3dlckNhc2UoKQogICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOVxzLV0vZywgIiAiKQogICAgICAgIC5zcGxpdCgvXHMrLykKICAgICAgICAuZmlsdGVyKCh3KSA9PiB3Lmxlbmd0aCA+IDIpKTsKICAgIGxldCBtYXRjaGVzID0gMDsKICAgIGZvciAoY29uc3Qga3cgb2YgdGFza0tleXdvcmRzKSB7CiAgICAgICAgaWYgKGFjdGlvbldvcmRzLmhhcyhrdykpCiAgICAgICAgICAgIG1hdGNoZXMrKzsKICAgIH0KICAgIHJldHVybiBtYXRjaGVzIC8gdGFza0tleXdvcmRzLmxlbmd0aDsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSGVhcnRiZWF0VHJhY2tlciDigJQgcGVyLWFnZW50IGluc3RhbmNlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHBvcnQgY2xhc3MgSGVhcnRiZWF0VHJhY2tlciB7CiAgICB0YXNrSWQ7CiAgICBpbnN0YW5jZUlkOwogICAgY29uZmlnOwogICAgb25UZXJtaW5hdGU7CiAgICBsYXN0UHVsc2VBdDsKICAgIGRyaWZ0V2FybmluZ3MgPSAwOwogICAgdG90YWxQdWxzZXMgPSAwOwogICAgY2hlY2tUaW1lciA9IG51bGw7CiAgICB0ZXJtaW5hdGVkID0gZmFsc2U7CiAgICB0cmFjZUlkOwogICAgY29uc3RydWN0b3IodGFza0lkLCBpbnN0YW5jZUlkLCBjb25maWcsIG9uVGVybWluYXRlKSB7CiAgICAgICAgdGhpcy50YXNrSWQgPSB0YXNrSWQ7CiAgICAgICAgdGhpcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDsKICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLmNvbmZpZyB9OwogICAgICAgIHRoaXMub25UZXJtaW5hdGUgPSBvblRlcm1pbmF0ZTsKICAgICAgICB0aGlzLmxhc3RQdWxzZUF0ID0gRGF0ZS5ub3coKTsKICAgICAgICB0aGlzLnRyYWNlSWQgPSBnZW5lcmF0ZVRyYWNlSWQoKTsKICAgICAgICAvLyBJZiB0YXNrIGRlc2NyaXB0aW9uIHByb3ZpZGVkIGJ1dCBubyBrZXl3b3JkcywgZXh0cmFjdCB0aGVtCiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRhc2tEZXNjcmlwdGlvbiAmJiB0aGlzLmNvbmZpZy50YXNrS2V5d29yZHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuY29uZmlnLnRhc2tLZXl3b3JkcyA9IGV4dHJhY3RUYXNrS2V5d29yZHModGhpcy5jb25maWcudGFza0Rlc2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICAvKiogU3RhcnQgbW9uaXRvcmluZyB0aGUgYWdlbnQncyBoZWFydGJlYXQuICovCiAgICBzdGFydCgpIHsKICAgICAgICBpZiAodGhpcy5jaGVja1RpbWVyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5yZWNvcmRQdWxzZSgic3Bhd24iLCAiQWdlbnQgc3Bhd25lZCwgaGVhcnRiZWF0IHRyYWNraW5nIHN0YXJ0ZWQiKTsKICAgICAgICB0aGlzLmNoZWNrVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICB9LCB0aGlzLmNvbmZpZy5jaGVja0ludGVydmFsTXMpOwogICAgICAgIGxvZy5pbmZvKCJIZWFydGJlYXQgdHJhY2tpbmcgc3RhcnRlZCIsIHsKICAgICAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tJZCwKICAgICAgICAgICAgaW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZUlkLAogICAgICAgICAgICBrZXl3b3JkczogdGhpcy5jb25maWcudGFza0tleXdvcmRzLnNsaWNlKDAsIDUpLAogICAgICAgIH0pOwogICAgfQogICAgLyoqIFN0b3AgbW9uaXRvcmluZyAoY2FsbCBvbiBhZ2VudCBjb21wbGV0aW9uKS4gKi8KICAgIHN0b3AocmVhc29uID0gImNvbXBsZXRlIikgewogICAgICAgIGlmICh0aGlzLmNoZWNrVGltZXIpIHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNoZWNrVGltZXIpOwogICAgICAgICAgICB0aGlzLmNoZWNrVGltZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlY29yZFB1bHNlKHJlYXNvbiwgYEhlYXJ0YmVhdCB0cmFja2luZyBzdG9wcGVkOiAke3JlYXNvbn1gKTsKICAgICAgICBsb2cuaW5mbygiSGVhcnRiZWF0IHRyYWNraW5nIHN0b3BwZWQiLCB7CiAgICAgICAgICAgIHRhc2tJZDogdGhpcy50YXNrSWQsCiAgICAgICAgICAgIGluc3RhbmNlSWQ6IHRoaXMuaW5zdGFuY2VJZCwKICAgICAgICAgICAgcmVhc29uLAogICAgICAgICAgICB0b3RhbFB1bHNlczogdGhpcy50b3RhbFB1bHNlcywKICAgICAgICAgICAgZHJpZnRXYXJuaW5nczogdGhpcy5kcmlmdFdhcm5pbmdzLAogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBSZWNvcmQgYSBoZWFydGJlYXQgcHVsc2UuIENhbGwgdGhpcyB3aGVuZXZlciB0aGUgYWdlbnQgcHJvZHVjZXMKICAgICAqIG9ic2VydmFibGUgb3V0cHV0IChmaWxlIHdyaXRlLCBzdGRvdXQsIGNoZWNrcG9pbnQpLgogICAgICovCiAgICByZWNvcmRQdWxzZSh0eXBlLCBkZXRhaWwsIGFjdGlvblN1bW1hcnkpIHsKICAgICAgICBpZiAodGhpcy50ZXJtaW5hdGVkKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5sYXN0UHVsc2VBdCA9IERhdGUubm93KCk7CiAgICAgICAgdGhpcy50b3RhbFB1bHNlcysrOwogICAgICAgIGNvbnN0IHB1bHNlID0gewogICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tJZCwKICAgICAgICAgICAgaW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZUlkLAogICAgICAgICAgICB0eXBlLAogICAgICAgICAgICBkZXRhaWwsCiAgICAgICAgICAgIGFjdGlvblN1bW1hcnksCiAgICAgICAgfTsKICAgICAgICBwZXJzaXN0UHVsc2UocHVsc2UpOwogICAgICAgIC8vIERyaWZ0IGRldGVjdGlvbiBvbiBhY3Rpb24gcHVsc2VzCiAgICAgICAgaWYgKHR5cGUgPT09ICJhY3Rpb24iICYmIGFjdGlvblN1bW1hcnkgJiYgdGhpcy5jb25maWcudGFza0tleXdvcmRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSBkcmlmdFNjb3JlKGFjdGlvblN1bW1hcnksIHRoaXMuY29uZmlnLnRhc2tLZXl3b3Jkcyk7CiAgICAgICAgICAgIGlmIChzY29yZSA8IDAuMSkgewogICAgICAgICAgICAgICAgdGhpcy5kcmlmdFdhcm5pbmdzKys7CiAgICAgICAgICAgICAgICBsb2cud2FybigiRHJpZnQgZGV0ZWN0ZWQiLCB7CiAgICAgICAgICAgICAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tJZCwKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiB0aGlzLmluc3RhbmNlSWQsCiAgICAgICAgICAgICAgICAgICAgc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uU3VtbWFyeTogYWN0aW9uU3VtbWFyeS5zbGljZSgwLCAxMDApLAogICAgICAgICAgICAgICAgICAgIGRyaWZ0V2FybmluZ3M6IHRoaXMuZHJpZnRXYXJuaW5ncywKICAgICAgICAgICAgICAgICAgICBtYXhEcmlmdFdhcm5pbmdzOiB0aGlzLmNvbmZpZy5tYXhEcmlmdFdhcm5pbmdzLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBEcmlmdCB3YXJuaW5nICgke3RoaXMuZHJpZnRXYXJuaW5nc30vJHt0aGlzLmNvbmZpZy5tYXhEcmlmdFdhcm5pbmdzfSk6ICR7dGhpcy50YXNrSWR9YCwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGBTY29yZTogJHtzY29yZS50b0ZpeGVkKDIpfSwgYWN0aW9uOiAke2FjdGlvblN1bW1hcnkuc2xpY2UoMCwgMjAwKX1gLAogICAgICAgICAgICAgICAgICAgIHRyYWNlSWQ6IHRoaXMudHJhY2VJZCwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLAogICAgICAgICAgICAgICAgICAgIHJlYXNvbjogImhlYXJ0YmVhdC1kcmlmdCIsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyaWZ0V2FybmluZ3MgPj0gdGhpcy5jb25maWcubWF4RHJpZnRXYXJuaW5ncykgewogICAgICAgICAgICAgICAgICAgIHRoaXMudGVybWluYXRlQWdlbnQoYERyaWZ0IGxpbWl0IGV4Y2VlZGVkICgke3RoaXMuZHJpZnRXYXJuaW5nc30gd2FybmluZ3MpYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2NvcmUgPiAwLjMpIHsKICAgICAgICAgICAgICAgIC8vIEdvb2Qgc2lnbmFsIOKAlCByZXNldCBkcmlmdCBjb3VudGVyIG9uIGNsZWFybHkgcmVsZXZhbnQgYWN0aW9ucwogICAgICAgICAgICAgICAgdGhpcy5kcmlmdFdhcm5pbmdzID0gTWF0aC5tYXgoMCwgdGhpcy5kcmlmdFdhcm5pbmdzIC0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKiogR2V0IHRoZSBjdXJyZW50IGhlYXJ0YmVhdCBzdGF0dXMuICovCiAgICBnZXRTdGF0dXMoKSB7CiAgICAgICAgY29uc3Qgc2lsZW5jZU1zID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdFB1bHNlQXQ7CiAgICAgICAgbGV0IHN0YXRlID0gImhlYWx0aHkiOwogICAgICAgIGlmICh0aGlzLnRlcm1pbmF0ZWQpIHsKICAgICAgICAgICAgc3RhdGUgPSAidGVybWluYXRlZCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNpbGVuY2VNcyA+IHRoaXMuY29uZmlnLnNpbGVuY2VUZXJtaW5hdGVNcykgewogICAgICAgICAgICBzdGF0ZSA9ICJjcml0aWNhbCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNpbGVuY2VNcyA+IHRoaXMuY29uZmlnLnNpbGVuY2VXYXJuaW5nTXMgfHwKICAgICAgICAgICAgdGhpcy5kcmlmdFdhcm5pbmdzID49IHRoaXMuY29uZmlnLm1heERyaWZ0V2FybmluZ3MgLSAxKSB7CiAgICAgICAgICAgIHN0YXRlID0gIndhcm5pbmciOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0YXNrSWQ6IHRoaXMudGFza0lkLAogICAgICAgICAgICBpbnN0YW5jZUlkOiB0aGlzLmluc3RhbmNlSWQsCiAgICAgICAgICAgIGFsaXZlOiAhdGhpcy50ZXJtaW5hdGVkLAogICAgICAgICAgICBsYXN0UHVsc2VBdDogdGhpcy5sYXN0UHVsc2VBdCA/IG5ldyBEYXRlKHRoaXMubGFzdFB1bHNlQXQpLnRvSVNPU3RyaW5nKCkgOiBudWxsLAogICAgICAgICAgICBzaWxlbmNlTXMsCiAgICAgICAgICAgIGRyaWZ0V2FybmluZ3M6IHRoaXMuZHJpZnRXYXJuaW5ncywKICAgICAgICAgICAgdG90YWxQdWxzZXM6IHRoaXMudG90YWxQdWxzZXMsCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgIH07CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBJbnRlcm5hbAogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgY2hlY2soKSB7CiAgICAgICAgaWYgKHRoaXMudGVybWluYXRlZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHNpbGVuY2VNcyA9IERhdGUubm93KCkgLSB0aGlzLmxhc3RQdWxzZUF0OwogICAgICAgIGlmIChzaWxlbmNlTXMgPiB0aGlzLmNvbmZpZy5zaWxlbmNlVGVybWluYXRlTXMpIHsKICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVBZ2VudChgU2lsZW5jZSB0aW1lb3V0OiBubyBhY3Rpdml0eSBmb3IgJHtNYXRoLnJvdW5kKHNpbGVuY2VNcyAvIDEwMDApfXMgYCArCiAgICAgICAgICAgICAgICBgKGxpbWl0OiAke01hdGgucm91bmQodGhpcy5jb25maWcuc2lsZW5jZVRlcm1pbmF0ZU1zIC8gMTAwMCl9cylgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoc2lsZW5jZU1zID4gdGhpcy5jb25maWcuc2lsZW5jZVdhcm5pbmdNcykgewogICAgICAgICAgICB0aGlzLnJlY29yZFB1bHNlKCJzaWxlbmNlLXdhcm5pbmciLCBgTm8gYWN0aXZpdHkgZm9yICR7TWF0aC5yb3VuZChzaWxlbmNlTXMgLyAxMDAwKX1zYCk7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBTaWxlbmNlIHdhcm5pbmc6ICR7dGhpcy50YXNrSWR9YCwKICAgICAgICAgICAgICAgIGRldGFpbDogYE5vIGFjdGl2aXR5IGZvciAke01hdGgucm91bmQoc2lsZW5jZU1zIC8gMTAwMCl9c2AsCiAgICAgICAgICAgICAgICB0cmFjZUlkOiB0aGlzLnRyYWNlSWQsCiAgICAgICAgICAgICAgICBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLAogICAgICAgICAgICAgICAgcmVhc29uOiAiaGVhcnRiZWF0LXNpbGVuY2UiLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICB0ZXJtaW5hdGVBZ2VudChyZWFzb24pIHsKICAgICAgICBpZiAodGhpcy50ZXJtaW5hdGVkKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy50ZXJtaW5hdGVkID0gdHJ1ZTsKICAgICAgICBsb2cud2FybigiVGVybWluYXRpbmcgYWdlbnQgdmlhIGhlYXJ0YmVhdCIsIHsKICAgICAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tJZCwKICAgICAgICAgICAgaW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZUlkLAogICAgICAgICAgICByZWFzb24sCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5yZWNvcmRQdWxzZSgidGVybWluYXRlIiwgcmVhc29uKTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogYEhlYXJ0YmVhdCB0ZXJtaW5hdGlvbjogJHt0aGlzLnRhc2tJZH1gLAogICAgICAgICAgICBkZXRhaWw6IHJlYXNvbiwKICAgICAgICAgICAgdHJhY2VJZDogdGhpcy50cmFjZUlkLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLAogICAgICAgICAgICByZWFzb246ICJoZWFydGJlYXQtdGVybWluYXRlIiwKICAgICAgICB9KTsKICAgICAgICB0aGlzLnN0b3AoInRlcm1pbmF0ZSIpOwogICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldCB0ZXJtaW5hdGlvbiBjYWxsYmFjawogICAgICAgIHRoaXMub25UZXJtaW5hdGUodGhpcy5pbnN0YW5jZUlkLCByZWFzb24pLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gdGVybWluYXRlIGFnZW50IiwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZUlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRyYWNrZXIgcmVnaXN0cnkg4oCUIG1hbmFnZSBhbGwgYWN0aXZlIGhlYXJ0YmVhdCB0cmFja2VycwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY29uc3QgYWN0aXZlVHJhY2tlcnMgPSBuZXcgTWFwKCk7Ci8qKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgaGVhcnRiZWF0IHRyYWNrZXIgZm9yIGFuIGFnZW50IGluc3RhbmNlLiAqLwpleHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhcnRiZWF0VHJhY2tlcih0YXNrSWQsIGluc3RhbmNlSWQsIGNvbmZpZywgb25UZXJtaW5hdGUpIHsKICAgIC8vIENsZWFuIHVwIGFueSBleGlzdGluZyB0cmFja2VyIGZvciB0aGlzIGluc3RhbmNlCiAgICBjb25zdCBleGlzdGluZyA9IGFjdGl2ZVRyYWNrZXJzLmdldChpbnN0YW5jZUlkKTsKICAgIGlmIChleGlzdGluZykgewogICAgICAgIGV4aXN0aW5nLnN0b3AoInRlcm1pbmF0ZSIpOwogICAgfQogICAgY29uc3QgdHJhY2tlciA9IG5ldyBIZWFydGJlYXRUcmFja2VyKHRhc2tJZCwgaW5zdGFuY2VJZCwgY29uZmlnLCBvblRlcm1pbmF0ZSk7CiAgICBhY3RpdmVUcmFja2Vycy5zZXQoaW5zdGFuY2VJZCwgdHJhY2tlcik7CiAgICByZXR1cm4gdHJhY2tlcjsKfQovKiogR2V0IGEgdHJhY2tlciBieSBpbnN0YW5jZSBJRC4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldEhlYXJ0YmVhdFRyYWNrZXIoaW5zdGFuY2VJZCkgewogICAgcmV0dXJuIGFjdGl2ZVRyYWNrZXJzLmdldChpbnN0YW5jZUlkKTsKfQovKiogUmVtb3ZlIGEgdHJhY2tlciAoY2FsbCBvbiBhZ2VudCBjb21wbGV0aW9uKS4gKi8KZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUhlYXJ0YmVhdFRyYWNrZXIoaW5zdGFuY2VJZCkgewogICAgY29uc3QgdHJhY2tlciA9IGFjdGl2ZVRyYWNrZXJzLmdldChpbnN0YW5jZUlkKTsKICAgIGlmICh0cmFja2VyKSB7CiAgICAgICAgdHJhY2tlci5zdG9wKCk7CiAgICAgICAgYWN0aXZlVHJhY2tlcnMuZGVsZXRlKGluc3RhbmNlSWQpOwogICAgfQp9Ci8qKiBHZXQgc3RhdHVzIG9mIGFsbCB0cmFja2VkIGFnZW50cy4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEhlYXJ0YmVhdFN0YXR1c2VzKCkgewogICAgcmV0dXJuIEFycmF5LmZyb20oYWN0aXZlVHJhY2tlcnMudmFsdWVzKCkpLm1hcCgodCkgPT4gdC5nZXRTdGF0dXMoKSk7Cn0KLyoqIFN0b3AgYWxsIHRyYWNrZXJzIChjYWxsIG9uIHNodXRkb3duKS4gKi8KZXhwb3J0IGZ1bmN0aW9uIHNodXRkb3duSGVhcnRiZWF0cygpIHsKICAgIGZvciAoY29uc3QgW2lkLCB0cmFja2VyXSBvZiBhY3RpdmVUcmFja2VycykgewogICAgICAgIHRyYWNrZXIuc3RvcCgidGVybWluYXRlIik7CiAgICAgICAgYWN0aXZlVHJhY2tlcnMuZGVsZXRlKGlkKTsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1oZWFydGJlYXQuanMubWFw","agents/orchestration.js":"LyoqCiAqIEFnZW50IE9yY2hlc3RyYXRpb24gRW5naW5lIOKAlCBNdWx0aS1hZ2VudCBjb29yZGluYXRpb24sIGRlbGVnYXRpb24sIGFuZCByZXN1bHQgbWVyZ2luZy4KICoKICogU2l0cyBvbiB0b3Agb2YgdGhlIEFnZW50UG9vbCB0byBwcm92aWRlOgogKiAxLiAqKldvcmtmbG93cyoqIOKAlCBOYW1lZCBncm91cHMgb2YgY29vcmRpbmF0ZWQgYWdlbnQgdGFza3MKICogMi4gKipUYXNrIGRlbGVnYXRpb24qKiDigJQgU3Bhd24gbXVsdGlwbGUgYWdlbnRzIGZvciBhIHdvcmtmbG93IGFuZCB0cmFjayB0aGVtCiAqIDMuICoqUmVzdWx0IGFnZ3JlZ2F0aW9uKiog4oCUIENvbGxlY3QsIG1lcmdlLCBhbmQgc3ludGhlc2l6ZSBvdXRwdXRzIGZyb20gYWxsIGFnZW50cwogKiA0LiAqKkNvbmZsaWN0IHJlc29sdXRpb24qKiDigJQgUHJldmVudGl2ZSBmaWxlIGxvY2tpbmcgKyBwb3N0LWhvYyBkZXRlY3Rpb24vcmVzb2x1dGlvbgogKiA1LiAqKlF1ZXVlIG1hbmFnZW1lbnQqKiDigJQgUHJpb3JpdHktYXdhcmUgd29ya2Zsb3cgc2NoZWR1bGluZwogKiA2LiAqKlN0YXR1cyB0cmFja2luZyoqIOKAlCBSZWFsLXRpbWUgd29ya2Zsb3cgc3RhdHVzIGFuZCByZXBvcnRpbmcKICogNy4gKipDb250ZXh0IHBhc3NpbmcqKiDigJQgRGVwZW5kZW5jeSBtb2RlIHBpcGVzIGNvbXBsZXRlZCB0YXNrIG91dHB1dHMgaW50byBkZXBlbmRlbnRzCiAqIDguICoqQ2FzY2FkaW5nIGZhaWx1cmUgbGltaXRzKiog4oCUIEF1dG8tY2FuY2VsIHdvcmtmbG93cyB3aGVuIGZhaWx1cmUgdGhyZXNob2xkIGhpdAogKiA5LiAqKldvcmtmbG93IHRpbWVvdXRzKiog4oCUIFdhbGwtY2xvY2sgdGltZW91dCBmb3IgZW50aXJlIHdvcmtmbG93cwogKiAxMC4gKipCdXMgaW50ZWdyYXRpb24qKiDigJQgRW1pdHMgd29ya2Zsb3cgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgbW9uaXRvcmluZwogKgogKiBVc2FnZToKICogICBjb25zdCBvcmNoID0gbmV3IE9yY2hlc3RyYXRvcihwb29sKTsKICogICBjb25zdCB3ZiA9IG9yY2guY3JlYXRlV29ya2Zsb3coeyBuYW1lOiAiRmVhdHVyZSBYIiwgdGFza3M6IFsuLi5dIH0pOwogKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9yY2guZXhlY3V0ZSh3Zi5pZCk7CiAqICAgY29uc3QgYWdncmVnYXRlZCA9IG9yY2guYWdncmVnYXRlUmVzdWx0cyh3Zi5pZCk7CiAqLwppbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gIm5vZGU6Y3J5cHRvIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJvcmNoZXN0cmF0b3IiKTsKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE9yY2hlc3RyYXRvcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXhwb3J0IGNsYXNzIE9yY2hlc3RyYXRvciB7CiAgICBwb29sOwogICAgd29ya2Zsb3dzID0gbmV3IE1hcCgpOwogICAgY29uZmxpY3RzID0gbmV3IE1hcCgpOwogICAgd29ya2Zsb3dRdWV1ZSA9IFtdOwogICAgYWN0aXZlV29ya2Zsb3dDb3VudCA9IDA7CiAgICBtYXhBY3RpdmVXb3JrZmxvd3M7CiAgICBldmVudEhhbmRsZXJzID0gbmV3IE1hcCgpOwogICAgLyoqIFJlc29sdmVycyBmb3IgcXVldWVkIHdvcmtmbG93cyB3YWl0aW5nIGZvciBjYXBhY2l0eS4gKi8KICAgIHF1ZXVlUmVzb2x2ZXJzID0gbmV3IE1hcCgpOwogICAgY29uc3RydWN0b3IocG9vbCwgb3B0aW9ucykgewogICAgICAgIHRoaXMucG9vbCA9IHBvb2w7CiAgICAgICAgdGhpcy5tYXhBY3RpdmVXb3JrZmxvd3MgPSBvcHRpb25zPy5tYXhBY3RpdmVXb3JrZmxvd3MgPz8gMzsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFdvcmtmbG93IGxpZmVjeWNsZQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIENyZWF0ZSBhIHdvcmtmbG93IChkb2VzIG5vdCBzdGFydCBleGVjdXRpb24pLiAqLwogICAgY3JlYXRlV29ya2Zsb3coaW5wdXQpIHsKICAgICAgICBjb25zdCBpZCA9IGdlbmVyYXRlV29ya2Zsb3dJZCgpOwogICAgICAgIGNvbnN0IHRhc2tzID0gbmV3IE1hcCgpOwogICAgICAgIGZvciAoY29uc3QgZGVmIG9mIGlucHV0LnRhc2tzKSB7CiAgICAgICAgICAgIGlmICh0YXNrcy5oYXMoZGVmLmtleSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRhc2sga2V5IGluIHdvcmtmbG93OiAke2RlZi5rZXl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFza3Muc2V0KGRlZi5rZXksIHsKICAgICAgICAgICAgICAgIGtleTogZGVmLmtleSwKICAgICAgICAgICAgICAgIGxhYmVsOiBkZWYubGFiZWwsCiAgICAgICAgICAgICAgICBwcm9tcHQ6IGRlZi5wcm9tcHQsCiAgICAgICAgICAgICAgICBjd2Q6IGRlZi5jd2QsCiAgICAgICAgICAgICAgICBkZXBlbmRzT246IGRlZi5kZXBlbmRzT24gPz8gW10sCiAgICAgICAgICAgICAgICBwcmlvcml0eTogZGVmLnByaW9yaXR5ID8/IDUwLAogICAgICAgICAgICAgICAgY29uZmlnOiBkZWYuY29uZmlnLAogICAgICAgICAgICAgICAgdGFnczogZGVmLnRhZ3MgPz8gW10sCiAgICAgICAgICAgICAgICBzdGF0dXM6ICJwZW5kaW5nIiwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIFZhbGlkYXRlIGRlcGVuZGVuY3kgcmVmZXJlbmNlcwogICAgICAgIGlmIChpbnB1dC5tb2RlID09PSAiZGVwZW5kZW5jeSIpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBbLCB0YXNrXSBvZiB0YXNrcykgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgdGFzay5kZXBlbmRzT24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRhc2tzLmhhcyhkZXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFzayAiJHt0YXNrLmtleX0iIGRlcGVuZHMgb24gdW5rbm93biB0YXNrICIke2RlcH0iYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIGZvciBjeWNsZXMKICAgICAgICAgICAgdGhpcy5kZXRlY3RDeWNsZXModGFza3MpOwogICAgICAgIH0KICAgICAgICBjb25zdCB3b3JrZmxvdyA9IHsKICAgICAgICAgICAgaWQsCiAgICAgICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBpbnB1dC5kZXNjcmlwdGlvbiwKICAgICAgICAgICAgc3RhdHVzOiAicGVuZGluZyIsCiAgICAgICAgICAgIG1vZGU6IGlucHV0Lm1vZGUgPz8gInBhcmFsbGVsIiwKICAgICAgICAgICAgY29uZmxpY3RTdHJhdGVneTogaW5wdXQuY29uZmxpY3RTdHJhdGVneSA/PyAibGFzdC13cml0ZS13aW5zIiwKICAgICAgICAgICAgbWF4Q29uY3VycmVudDogaW5wdXQubWF4Q29uY3VycmVudCA/PyAwLAogICAgICAgICAgICBvcmlnaW46IGlucHV0Lm9yaWdpbiA/PyAiYWkiLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgfTsKICAgICAgICB0aGlzLndvcmtmbG93cy5zZXQoaWQsIHdvcmtmbG93KTsKICAgICAgICB0aGlzLmNvbmZsaWN0cy5zZXQoaWQsIFtdKTsKICAgICAgICBsb2cuaW5mbygiV29ya2Zsb3cgY3JlYXRlZCIsIHsKICAgICAgICAgICAgd29ya2Zsb3dJZDogaWQsCiAgICAgICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsCiAgICAgICAgICAgIHRhc2tDb3VudDogdGFza3Muc2l6ZSwKICAgICAgICAgICAgbW9kZTogd29ya2Zsb3cubW9kZSwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gd29ya2Zsb3c7CiAgICB9CiAgICAvKioKICAgICAqIEV4ZWN1dGUgYSB3b3JrZmxvdy4gU3Bhd25zIGFnZW50cyBhY2NvcmRpbmcgdG8gdGhlIGV4ZWN1dGlvbiBtb2RlLgogICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMuCiAgICAgKi8KICAgIGFzeW5jIGV4ZWN1dGUod29ya2Zsb3dJZCkgewogICAgICAgIGNvbnN0IHdvcmtmbG93ID0gdGhpcy5yZXF1aXJlV29ya2Zsb3cod29ya2Zsb3dJZCk7CiAgICAgICAgaWYgKHdvcmtmbG93LnN0YXR1cyAhPT0gInBlbmRpbmciKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV29ya2Zsb3cgIiR7d29ya2Zsb3cubmFtZX0iIGlzIGFscmVhZHkgJHt3b3JrZmxvdy5zdGF0dXN9YCk7CiAgICAgICAgfQogICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBzdGFydCBpbW1lZGlhdGVseSBvciBuZWVkIHRvIHF1ZXVlCiAgICAgICAgaWYgKHRoaXMuYWN0aXZlV29ya2Zsb3dDb3VudCA+PSB0aGlzLm1heEFjdGl2ZVdvcmtmbG93cykgewogICAgICAgICAgICB0aGlzLndvcmtmbG93UXVldWUucHVzaCh3b3JrZmxvd0lkKTsKICAgICAgICAgICAgbG9nLmluZm8oIldvcmtmbG93IHF1ZXVlZCIsIHsgd29ya2Zsb3dJZCwgcXVldWVQb3NpdGlvbjogdGhpcy53b3JrZmxvd1F1ZXVlLmxlbmd0aCB9KTsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBkcmFpblF1ZXVlIHJlc29sdmVzIHVzCiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlUmVzb2x2ZXJzLnNldCh3b3JrZmxvd0lkLCByZXNvbHZlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYWN0aXZlV29ya2Zsb3dDb3VudCsrOwogICAgICAgIHdvcmtmbG93LnN0YXR1cyA9ICJydW5uaW5nIjsKICAgICAgICB3b3JrZmxvdy5zdGFydGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgbG9nLmluZm8oIldvcmtmbG93IGV4ZWN1dGluZyIsIHsKICAgICAgICAgICAgd29ya2Zsb3dJZCwKICAgICAgICAgICAgbmFtZTogd29ya2Zsb3cubmFtZSwKICAgICAgICAgICAgbW9kZTogd29ya2Zsb3cubW9kZSwKICAgICAgICB9KTsKICAgICAgICB0cnkgewogICAgICAgICAgICBzd2l0Y2ggKHdvcmtmbG93Lm1vZGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgInBhcmFsbGVsIjoKICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVQYXJhbGxlbCh3b3JrZmxvdyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJzZXF1ZW50aWFsIjoKICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVTZXF1ZW50aWFsKHdvcmtmbG93KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImRlcGVuZGVuY3kiOgogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZURlcGVuZGVuY3kod29ya2Zsb3cpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgbG9nLmVycm9yKCJXb3JrZmxvdyBleGVjdXRpb24gZXJyb3IiLCB7CiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIERldGVjdCBjb25mbGljdHMKICAgICAgICBjb25zdCBmaWxlQ29uZmxpY3RzID0gdGhpcy5kZXRlY3RGaWxlQ29uZmxpY3RzKHdvcmtmbG93KTsKICAgICAgICB0aGlzLmNvbmZsaWN0cy5zZXQod29ya2Zsb3dJZCwgZmlsZUNvbmZsaWN0cyk7CiAgICAgICAgLy8gUmVzb2x2ZSBjb25mbGljdHMKICAgICAgICBpZiAoZmlsZUNvbmZsaWN0cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRoaXMucmVzb2x2ZUNvbmZsaWN0cyh3b3JrZmxvdywgZmlsZUNvbmZsaWN0cyk7CiAgICAgICAgfQogICAgICAgIC8vIERldGVybWluZSBmaW5hbCBzdGF0dXMKICAgICAgICB3b3JrZmxvdy5zdGF0dXMgPSB0aGlzLmNvbXB1dGVXb3JrZmxvd1N0YXR1cyh3b3JrZmxvdyk7CiAgICAgICAgd29ya2Zsb3cuZmluaXNoZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICB0aGlzLmFjdGl2ZVdvcmtmbG93Q291bnQtLTsKICAgICAgICB0aGlzLmRyYWluUXVldWUoKTsKICAgICAgICBsb2cuaW5mbygiV29ya2Zsb3cgZmluaXNoZWQiLCB7CiAgICAgICAgICAgIHdvcmtmbG93SWQsCiAgICAgICAgICAgIG5hbWU6IHdvcmtmbG93Lm5hbWUsCiAgICAgICAgICAgIHN0YXR1czogd29ya2Zsb3cuc3RhdHVzLAogICAgICAgICAgICBjb25mbGljdHM6IGZpbGVDb25mbGljdHMubGVuZ3RoLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmVzdWx0KHdvcmtmbG93KTsKICAgIH0KICAgIC8qKiBDYW5jZWwgYSBydW5uaW5nIG9yIHBlbmRpbmcgd29ya2Zsb3cuICovCiAgICBhc3luYyBjYW5jZWwod29ya2Zsb3dJZCkgewogICAgICAgIGNvbnN0IHdvcmtmbG93ID0gdGhpcy5yZXF1aXJlV29ya2Zsb3cod29ya2Zsb3dJZCk7CiAgICAgICAgLy8gUmVtb3ZlIGZyb20gcXVldWUgaWYgcGVuZGluZwogICAgICAgIGNvbnN0IHF1ZXVlSWR4ID0gdGhpcy53b3JrZmxvd1F1ZXVlLmluZGV4T2Yod29ya2Zsb3dJZCk7CiAgICAgICAgaWYgKHF1ZXVlSWR4ICE9PSAtMSkgewogICAgICAgICAgICB0aGlzLndvcmtmbG93UXVldWUuc3BsaWNlKHF1ZXVlSWR4LCAxKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2FuY2VsIHJ1bm5pbmcgdGFza3MKICAgICAgICBmb3IgKGNvbnN0IFssIHRhc2tdIG9mIHdvcmtmbG93LnRhc2tzKSB7CiAgICAgICAgICAgIGlmICh0YXNrLnN0YXR1cyA9PT0gInJ1bm5pbmciICYmIHRhc2suaW5zdGFuY2VJZCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvb2wudGVybWluYXRlKHRhc2suaW5zdGFuY2VJZCwgIldvcmtmbG93IGNhbmNlbGxlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIC8vIEJlc3QgZWZmb3J0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cyA9ICJjYW5jZWxsZWQiOwogICAgICAgICAgICAgICAgdGFzay5maW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRhc2suc3RhdHVzID09PSAicGVuZGluZyIgfHwgdGFzay5zdGF0dXMgPT09ICJxdWV1ZWQiKSB7CiAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cyA9ICJjYW5jZWxsZWQiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHdhc1J1bm5pbmcgPSB3b3JrZmxvdy5zdGF0dXMgPT09ICJydW5uaW5nIjsKICAgICAgICB3b3JrZmxvdy5zdGF0dXMgPSAiY2FuY2VsbGVkIjsKICAgICAgICB3b3JrZmxvdy5maW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgIGlmICh3YXNSdW5uaW5nKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlV29ya2Zsb3dDb3VudC0tOwogICAgICAgICAgICB0aGlzLmRyYWluUXVldWUoKTsKICAgICAgICB9CiAgICAgICAgbG9nLmluZm8oIldvcmtmbG93IGNhbmNlbGxlZCIsIHsgd29ya2Zsb3dJZCwgbmFtZTogd29ya2Zsb3cubmFtZSB9KTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEV4ZWN1dGlvbiBtb2RlcwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEV4ZWN1dGUgYWxsIHRhc2tzIGluIHBhcmFsbGVsIChyZXNwZWN0aW5nIG1heENvbmN1cnJlbnQpLiAqLwogICAgYXN5bmMgZXhlY3V0ZVBhcmFsbGVsKHdvcmtmbG93KSB7CiAgICAgICAgY29uc3QgYWxsVGFza3MgPSBbLi4ud29ya2Zsb3cudGFza3MudmFsdWVzKCldOwogICAgICAgIGNvbnN0IG1heENvbmN1cnJlbnQgPSB3b3JrZmxvdy5tYXhDb25jdXJyZW50IHx8IGFsbFRhc2tzLmxlbmd0aDsKICAgICAgICAvLyBTcGF3biBpbiBiYXRjaGVzIHJlc3BlY3RpbmcgY29uY3VycmVuY3kgbGltaXQKICAgICAgICBjb25zdCBwZW5kaW5nID0gWy4uLmFsbFRhc2tzXTsKICAgICAgICBjb25zdCBydW5uaW5nID0gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IHNwYXduTmV4dCA9IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCAmJiBydW5uaW5nLnNpemUgPCBtYXhDb25jdXJyZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gcGVuZGluZy5zaGlmdCgpOwogICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuc3Bhd25UYXNrKHdvcmtmbG93LCB0YXNrKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBydW5uaW5nLmRlbGV0ZSh0YXNrLmtleSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJ1bm5pbmcuc2V0KHRhc2sua2V5LCBwcm9taXNlKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYXdhaXQgc3Bhd25OZXh0KCk7CiAgICAgICAgLy8gV2FpdCBmb3IgdGFza3MgdG8gY29tcGxldGUgYW5kIHNwYXduIG1vcmUgYXMgc2xvdHMgZnJlZSB1cAogICAgICAgIHdoaWxlIChydW5uaW5nLnNpemUgPiAwKSB7CiAgICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbLi4ucnVubmluZy52YWx1ZXMoKV0pOwogICAgICAgICAgICBhd2FpdCBzcGF3bk5leHQoKTsKICAgICAgICB9CiAgICB9CiAgICAvKiogRXhlY3V0ZSB0YXNrcyBvbmUgYXQgYSB0aW1lIGluIGRlZmluaXRpb24gb3JkZXIuICovCiAgICBhc3luYyBleGVjdXRlU2VxdWVudGlhbCh3b3JrZmxvdykgewogICAgICAgIGZvciAoY29uc3QgWywgdGFza10gb2Ygd29ya2Zsb3cudGFza3MpIHsKICAgICAgICAgICAgaWYgKHdvcmtmbG93LnN0YXR1cyA9PT0gImNhbmNlbGxlZCIpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgYXdhaXQgdGhpcy5zcGF3blRhc2sod29ya2Zsb3csIHRhc2spOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBFeGVjdXRlIHRhc2tzIHJlc3BlY3RpbmcgZGVwZW5kZW5jeSBlZGdlcyAodG9wb2xvZ2ljYWwgb3JkZXIpLiAqLwogICAgYXN5bmMgZXhlY3V0ZURlcGVuZGVuY3kod29ya2Zsb3cpIHsKICAgICAgICBjb25zdCBtYXhDb25jdXJyZW50ID0gd29ya2Zsb3cubWF4Q29uY3VycmVudCB8fCB3b3JrZmxvdy50YXNrcy5zaXplOwogICAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IG5ldyBTZXQoKTsKICAgICAgICBjb25zdCBmYWlsZWQgPSBuZXcgU2V0KCk7CiAgICAgICAgY29uc3QgcnVubmluZyA9IG5ldyBNYXAoKTsKICAgICAgICBjb25zdCBpc1JlYWR5ID0gKHRhc2spID0+IHsKICAgICAgICAgICAgaWYgKHRhc2suc3RhdHVzICE9PSAicGVuZGluZyIpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiB0YXNrLmRlcGVuZHNPbi5ldmVyeSgoZGVwKSA9PiBjb21wbGV0ZWQuaGFzKGRlcCkpOwogICAgICAgIH07CiAgICAgICAgY29uc3QgaGFzRmFpbGVkRGVwID0gKHRhc2spID0+IHsKICAgICAgICAgICAgcmV0dXJuIHRhc2suZGVwZW5kc09uLnNvbWUoKGRlcCkgPT4gZmFpbGVkLmhhcyhkZXApKTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IHNjaGVkdWxlUmVhZHkgPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGZvciAoY29uc3QgWywgdGFza10gb2Ygd29ya2Zsb3cudGFza3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5uaW5nLnNpemUgPj0gbWF4Q29uY3VycmVudCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvdy5zdGF0dXMgPT09ICJjYW5jZWxsZWQiKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLy8gU2tpcCB0YXNrcyB3aG9zZSBkZXBzIGhhdmUgZmFpbGVkCiAgICAgICAgICAgICAgICBpZiAoaGFzRmFpbGVkRGVwKHRhc2spKSB7CiAgICAgICAgICAgICAgICAgICAgdGFzay5zdGF0dXMgPSAic2tpcHBlZCI7CiAgICAgICAgICAgICAgICAgICAgdGFzay5lcnJvciA9ICJEZXBlbmRlbmN5IGZhaWxlZCI7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXNSZWFkeSh0YXNrKSkgewogICAgICAgICAgICAgICAgICAgIHRhc2suc3RhdHVzID0gInF1ZXVlZCI7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuc3Bhd25UYXNrKHdvcmtmbG93LCB0YXNrKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZy5kZWxldGUodGFzay5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQuYWRkKHRhc2sua2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQodGFzay5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcnVubmluZy5zZXQodGFzay5rZXksIHByb21pc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhd2FpdCBzY2hlZHVsZVJlYWR5KCk7CiAgICAgICAgd2hpbGUgKHJ1bm5pbmcuc2l6ZSA+IDApIHsKICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFsuLi5ydW5uaW5nLnZhbHVlcygpXSk7CiAgICAgICAgICAgIGF3YWl0IHNjaGVkdWxlUmVhZHkoKTsKICAgICAgICB9CiAgICAgICAgLy8gTWFyayBhbnkgcmVtYWluaW5nIHBlbmRpbmcgdGFza3MgYXMgc2tpcHBlZAogICAgICAgIGZvciAoY29uc3QgWywgdGFza10gb2Ygd29ya2Zsb3cudGFza3MpIHsKICAgICAgICAgICAgaWYgKHRhc2suc3RhdHVzID09PSAicGVuZGluZyIpIHsKICAgICAgICAgICAgICAgIHRhc2suc3RhdHVzID0gInNraXBwZWQiOwogICAgICAgICAgICAgICAgdGFzay5lcnJvciA9ICJEZXBlbmRlbmN5IG5vdCBzYXRpc2ZpZWQiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVGFzayBzcGF3bmluZwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIFNwYXduIGEgc2luZ2xlIGFnZW50IGZvciBhIHdvcmtmbG93IHRhc2sgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uICovCiAgICBhc3luYyBzcGF3blRhc2sod29ya2Zsb3csIHRhc2spIHsKICAgICAgICB0YXNrLnN0YXR1cyA9ICJydW5uaW5nIjsKICAgICAgICB0YXNrLnN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gewogICAgICAgICAgICAgICAgdGFza0lkOiBgb3JjaF8ke3dvcmtmbG93LmlkfV8ke3Rhc2sua2V5fWAsCiAgICAgICAgICAgICAgICBsYWJlbDogYFske3dvcmtmbG93Lm5hbWV9XSAke3Rhc2subGFiZWx9YCwKICAgICAgICAgICAgICAgIHByb21wdDogdGFzay5wcm9tcHQsCiAgICAgICAgICAgICAgICBjd2Q6IHRhc2suY3dkLAogICAgICAgICAgICAgICAgb3JpZ2luOiB3b3JrZmxvdy5vcmlnaW4sCiAgICAgICAgICAgICAgICB0YWdzOiBbCiAgICAgICAgICAgICAgICAgICAgYHdvcmtmbG93OiR7d29ya2Zsb3cuaWR9YCwKICAgICAgICAgICAgICAgICAgICBgdGFzazoke3Rhc2sua2V5fWAsCiAgICAgICAgICAgICAgICAgICAgLi4udGFzay50YWdzLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIGNvbmZpZzogewogICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiB0YXNrLnByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgIC4uLnRhc2suY29uZmlnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCB0aGlzLnBvb2wuc3Bhd24ocmVxdWVzdCk7CiAgICAgICAgICAgIHRhc2suaW5zdGFuY2VJZCA9IGluc3RhbmNlLmlkOwogICAgICAgICAgICB0YXNrLnRhc2tJZCA9IGluc3RhbmNlLnRhc2tJZDsKICAgICAgICAgICAgLy8gV2FpdCBmb3IgY29tcGxldGlvbiB2aWEgYnVzIGV2ZW50cwogICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JDb21wbGV0aW9uKGluc3RhbmNlLmlkLCB0YXNrKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0YXNrLnN0YXR1cyA9ICJmYWlsZWQiOwogICAgICAgICAgICB0YXNrLmVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICB0YXNrLmZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgICAgIGxvZy53YXJuKCJUYXNrIHNwYXduIGZhaWxlZCIsIHsKICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93LmlkLAogICAgICAgICAgICAgICAgdGFza0tleTogdGFzay5rZXksCiAgICAgICAgICAgICAgICBlcnJvcjogdGFzay5lcnJvciwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgLyoqIFdhaXQgZm9yIGFuIGFnZW50IGluc3RhbmNlIHRvIHJlYWNoIGEgdGVybWluYWwgc3RhdGUuICovCiAgICB3YWl0Rm9yQ29tcGxldGlvbihpbnN0YW5jZUlkLCB0YXNrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgICAgIGxldCBpbnRlcnZhbDsKICAgICAgICAgICAgbGV0IG9uTGlmZWN5Y2xlOwogICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGludGVydmFsKQogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgaWYgKG9uTGlmZWN5Y2xlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb29sLnJ1bnRpbWVNYW5hZ2VyLmJ1cy5vZmYoImFnZW50OmxpZmVjeWNsZSIsIG9uTGlmZWN5Y2xlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVycy5kZWxldGUoYCR7aW5zdGFuY2VJZH06Y2xlYW51cGApOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBjaGVja0FuZFJlc29sdmUgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMucG9vbC5nZXRJbnN0YW5jZShpbnN0YW5jZUlkKTsKICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cyA9ICJmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIHRhc2suZXJyb3IgPSAiSW5zdGFuY2UgZGlzYXBwZWFyZWQiOwogICAgICAgICAgICAgICAgICAgIHRhc2suZmluaXNoZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWxTdGF0ZXMgPSBuZXcgU2V0KFsiY29tcGxldGVkIiwgImZhaWxlZCIsICJ0ZXJtaW5hdGVkIl0pOwogICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsU3RhdGVzLmhhcyhpbnN0YW5jZS5zdGF0ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cyA9IGluc3RhbmNlLnN0YXRlID09PSAiY29tcGxldGVkIiA/ICJjb21wbGV0ZWQiIDogImZhaWxlZCI7CiAgICAgICAgICAgICAgICAgICAgdGFzay5maW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmVycm9yID0gaW5zdGFuY2UuZXJyb3IubWVzc2FnZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gQXV0by1yZWNvcmQgY2hlY2twb2ludCBkYXRhIGFzIG91dHB1dCBpZiBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UuY2hlY2twb2ludERhdGEgJiYgIXRhc2sub3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sub3V0cHV0ID0gaW5zdGFuY2UuY2hlY2twb2ludERhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZmlsZXNUb3VjaGVkID0gcGFyc2VGaWxlc0Zyb21PdXRwdXQoaW5zdGFuY2UuY2hlY2twb2ludERhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBDaGVjayBpbW1lZGlhdGVseQogICAgICAgICAgICBpZiAoY2hlY2tBbmRSZXNvbHZlKCkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgbGlmZWN5Y2xlIGV2ZW50cwogICAgICAgICAgICBvbkxpZmVjeWNsZSA9IChldmVudCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFnZW50SWQgPT09IGluc3RhbmNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFJlc29sdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5wb29sLnJ1bnRpbWVNYW5hZ2VyLmJ1cy5vbigiYWdlbnQ6bGlmZWN5Y2xlIiwgb25MaWZlY3ljbGUpOwogICAgICAgICAgICAvLyBTYWZldHkgcG9sbCBpbiBjYXNlIGV2ZW50cyBhcmUgbWlzc2VkCiAgICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICAgICAgY2hlY2tBbmRSZXNvbHZlKCk7CiAgICAgICAgICAgIH0sIDIwMDApOwogICAgICAgICAgICAvLyBTdG9yZSBjbGVhbnVwIGZvciBjYW5jZWxsYXRpb24KICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzLnNldChgJHtpbnN0YW5jZUlkfTpjbGVhbnVwYCwgKCkgPT4gewogICAgICAgICAgICAgICAgY2xlYW51cCgpOwogICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIENvbmZsaWN0IGRldGVjdGlvbiBhbmQgcmVzb2x1dGlvbgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIERldGVjdCBmaWxlIGNvbmZsaWN0cyDigJQgbXVsdGlwbGUgdGFza3MgY2xhaW1pbmcgdG8gdG91Y2ggdGhlIHNhbWUgZmlsZXMuICovCiAgICBkZXRlY3RGaWxlQ29uZmxpY3RzKHdvcmtmbG93KSB7CiAgICAgICAgY29uc3QgZmlsZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICBmb3IgKGNvbnN0IFssIHRhc2tdIG9mIHdvcmtmbG93LnRhc2tzKSB7CiAgICAgICAgICAgIGlmICh0YXNrLnN0YXR1cyAhPT0gImNvbXBsZXRlZCIgfHwgIXRhc2suZmlsZXNUb3VjaGVkKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0YXNrLmZpbGVzVG91Y2hlZCkgewogICAgICAgICAgICAgICAgaWYgKCFmaWxlTWFwLmhhcyhmaWxlKSkgewogICAgICAgICAgICAgICAgICAgIGZpbGVNYXAuc2V0KGZpbGUsIFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpbGVNYXAuZ2V0KGZpbGUpLnB1c2godGFzay5rZXkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbmZsaWN0cyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCB0YXNrS2V5c10gb2YgZmlsZU1hcCkgewogICAgICAgICAgICBpZiAodGFza0tleXMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgY29uZmxpY3RzLnB1c2goeyBmaWxlUGF0aCwgdGFza0tleXMgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbmZsaWN0czsKICAgIH0KICAgIC8qKiBBcHBseSBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5LiAqLwogICAgcmVzb2x2ZUNvbmZsaWN0cyh3b3JrZmxvdywgY29uZmxpY3RzKSB7CiAgICAgICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBjb25mbGljdHMpIHsKICAgICAgICAgICAgc3dpdGNoICh3b3JrZmxvdy5jb25mbGljdFN0cmF0ZWd5KSB7CiAgICAgICAgICAgICAgICBjYXNlICJsYXN0LXdyaXRlLXdpbnMiOgogICAgICAgICAgICAgICAgICAgIC8vIEFjY2VwdCB0aGUgbGFzdCB0YXNrJ3MgY2hhbmdlcyAoYnkgZmluaXNoIHRpbWUpCiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9ICJhY2NlcHRlZCI7CiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QucmVzb2x2ZWRCeSA9IHRoaXMuZ2V0TGFzdEZpbmlzaGVkKHdvcmtmbG93LCBjb25mbGljdC50YXNrS2V5cyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJmaXJzdC13cml0ZS13aW5zIjoKICAgICAgICAgICAgICAgICAgICAvLyBBY2NlcHQgdGhlIGZpcnN0IHRhc2sncyBjaGFuZ2VzCiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9ICJhY2NlcHRlZCI7CiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QucmVzb2x2ZWRCeSA9IHRoaXMuZ2V0Rmlyc3RGaW5pc2hlZCh3b3JrZmxvdywgY29uZmxpY3QudGFza0tleXMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiZmFpbCI6CiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcyBmYWlsZWQg4oCUIHJlcXVpcmVzIGh1bWFuIGludGVydmVudGlvbgogICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0LnJlc29sdXRpb24gPSAicmVqZWN0ZWQiOwogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDb25mbGljdCByZXNvbHV0aW9uOiBmYWlsIHN0cmF0ZWd5IiwgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBjb25mbGljdC5maWxlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgdGFza3M6IGNvbmZsaWN0LnRhc2tLZXlzLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAibWFudWFsIjoKICAgICAgICAgICAgICAgICAgICBjb25mbGljdC5yZXNvbHV0aW9uID0gImRlZmVycmVkIjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGdldExhc3RGaW5pc2hlZCh3b3JrZmxvdywgdGFza0tleXMpIHsKICAgICAgICBsZXQgbGF0ZXN0ID0gdGFza0tleXNbMF07CiAgICAgICAgbGV0IGxhdGVzdFRpbWUgPSAiIjsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0YXNrS2V5cykgewogICAgICAgICAgICBjb25zdCB0YXNrID0gd29ya2Zsb3cudGFza3MuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICh0YXNrPy5maW5pc2hlZEF0ICYmIHRhc2suZmluaXNoZWRBdCA+IGxhdGVzdFRpbWUpIHsKICAgICAgICAgICAgICAgIGxhdGVzdFRpbWUgPSB0YXNrLmZpbmlzaGVkQXQ7CiAgICAgICAgICAgICAgICBsYXRlc3QgPSBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxhdGVzdDsKICAgIH0KICAgIGdldEZpcnN0RmluaXNoZWQod29ya2Zsb3csIHRhc2tLZXlzKSB7CiAgICAgICAgbGV0IGVhcmxpZXN0ID0gdGFza0tleXNbMF07CiAgICAgICAgbGV0IGVhcmxpZXN0VGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0YXNrS2V5cykgewogICAgICAgICAgICBjb25zdCB0YXNrID0gd29ya2Zsb3cudGFza3MuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICh0YXNrPy5maW5pc2hlZEF0ICYmIHRhc2suZmluaXNoZWRBdCA8IGVhcmxpZXN0VGltZSkgewogICAgICAgICAgICAgICAgZWFybGllc3RUaW1lID0gdGFzay5maW5pc2hlZEF0OwogICAgICAgICAgICAgICAgZWFybGllc3QgPSBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVhcmxpZXN0OwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUXVldWUgbWFuYWdlbWVudAogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIERyYWluIHF1ZXVlZCB3b3JrZmxvd3Mgd2hlbiBjYXBhY2l0eSBmcmVlcyB1cC4gKi8KICAgIGRyYWluUXVldWUoKSB7CiAgICAgICAgd2hpbGUgKHRoaXMud29ya2Zsb3dRdWV1ZS5sZW5ndGggPiAwICYmCiAgICAgICAgICAgIHRoaXMuYWN0aXZlV29ya2Zsb3dDb3VudCA8IHRoaXMubWF4QWN0aXZlV29ya2Zsb3dzKSB7CiAgICAgICAgICAgIGNvbnN0IG5leHRJZCA9IHRoaXMud29ya2Zsb3dRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICBjb25zdCByZXNvbHZlID0gdGhpcy5xdWV1ZVJlc29sdmVycy5nZXQobmV4dElkKTsKICAgICAgICAgICAgaWYgKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgIHRoaXMucXVldWVSZXNvbHZlcnMuZGVsZXRlKG5leHRJZCk7CiAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBTdGF0dXMgdHJhY2tpbmcgYW5kIHJlcG9ydGluZwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEdldCBhIHNpbmdsZSB3b3JrZmxvdyBieSBJRC4gKi8KICAgIGdldFdvcmtmbG93KHdvcmtmbG93SWQpIHsKICAgICAgICByZXR1cm4gdGhpcy53b3JrZmxvd3MuZ2V0KHdvcmtmbG93SWQpOwogICAgfQogICAgLyoqIEdldCB0aGUgYWdncmVnYXRlZCByZXN1bHQgZm9yIGEgY29tcGxldGVkIHdvcmtmbG93LiAqLwogICAgZ2V0UmVzdWx0KHdvcmtmbG93SWQpIHsKICAgICAgICBjb25zdCB3b3JrZmxvdyA9IHRoaXMucmVxdWlyZVdvcmtmbG93KHdvcmtmbG93SWQpOwogICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmVzdWx0KHdvcmtmbG93KTsKICAgIH0KICAgIC8qKiBHZXQgYSBtb25pdG9yaW5nIHJlcG9ydCBhY3Jvc3MgYWxsIHdvcmtmbG93cy4gKi8KICAgIGdldFJlcG9ydCgpIHsKICAgICAgICBjb25zdCB3b3JrZmxvd3MgPSBbXTsKICAgICAgICBsZXQgYWN0aXZlQ291bnQgPSAwOwogICAgICAgIGxldCBwZW5kaW5nQ291bnQgPSAwOwogICAgICAgIGxldCBjb21wbGV0ZWRDb3VudCA9IDA7CiAgICAgICAgZm9yIChjb25zdCBbLCB3Zl0gb2YgdGhpcy53b3JrZmxvd3MpIHsKICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLmdldFRhc2tQcm9ncmVzcyh3Zik7CiAgICAgICAgICAgIHdvcmtmbG93cy5wdXNoKHsKICAgICAgICAgICAgICAgIGlkOiB3Zi5pZCwKICAgICAgICAgICAgICAgIG5hbWU6IHdmLm5hbWUsCiAgICAgICAgICAgICAgICBzdGF0dXM6IHdmLnN0YXR1cywKICAgICAgICAgICAgICAgIHByb2dyZXNzLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHdmLnN0YXR1cyA9PT0gInJ1bm5pbmciKQogICAgICAgICAgICAgICAgYWN0aXZlQ291bnQrKzsKICAgICAgICAgICAgZWxzZSBpZiAod2Yuc3RhdHVzID09PSAicGVuZGluZyIpCiAgICAgICAgICAgICAgICBwZW5kaW5nQ291bnQrKzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY29tcGxldGVkQ291bnQrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIGFjdGl2ZVdvcmtmbG93czogYWN0aXZlQ291bnQsCiAgICAgICAgICAgIHBlbmRpbmdXb3JrZmxvd3M6IHBlbmRpbmdDb3VudCwKICAgICAgICAgICAgY29tcGxldGVkV29ya2Zsb3dzOiBjb21wbGV0ZWRDb3VudCwKICAgICAgICAgICAgd29ya2Zsb3dzLAogICAgICAgICAgICBxdWV1ZURlcHRoOiB0aGlzLndvcmtmbG93UXVldWUubGVuZ3RoLAogICAgICAgIH07CiAgICB9CiAgICAvKiogR2V0IGZpbGUgY29uZmxpY3RzIGZvciBhIHdvcmtmbG93LiAqLwogICAgZ2V0Q29uZmxpY3RzKHdvcmtmbG93SWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb25mbGljdHMuZ2V0KHdvcmtmbG93SWQpID8/IFtdOwogICAgfQogICAgLyoqIFJlY29yZCB3aGljaCBmaWxlcyBhIHRhc2sgdG91Y2hlZCAoY2FsbGVkIGV4dGVybmFsbHkgYWZ0ZXIgcGFyc2luZyBvdXRwdXQpLiAqLwogICAgcmVjb3JkRmlsZXNUb3VjaGVkKHdvcmtmbG93SWQsIHRhc2tLZXksIGZpbGVzKSB7CiAgICAgICAgY29uc3Qgd29ya2Zsb3cgPSB0aGlzLndvcmtmbG93cy5nZXQod29ya2Zsb3dJZCk7CiAgICAgICAgaWYgKCF3b3JrZmxvdykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHRhc2sgPSB3b3JrZmxvdy50YXNrcy5nZXQodGFza0tleSk7CiAgICAgICAgaWYgKHRhc2spIHsKICAgICAgICAgICAgdGFzay5maWxlc1RvdWNoZWQgPSBmaWxlczsKICAgICAgICB9CiAgICB9CiAgICAvKiogUmVjb3JkIG91dHB1dCBmb3IgYSB0YXNrLiAqLwogICAgcmVjb3JkVGFza091dHB1dCh3b3JrZmxvd0lkLCB0YXNrS2V5LCBvdXRwdXQpIHsKICAgICAgICBjb25zdCB3b3JrZmxvdyA9IHRoaXMud29ya2Zsb3dzLmdldCh3b3JrZmxvd0lkKTsKICAgICAgICBpZiAoIXdvcmtmbG93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgdGFzayA9IHdvcmtmbG93LnRhc2tzLmdldCh0YXNrS2V5KTsKICAgICAgICBpZiAodGFzaykgewogICAgICAgICAgICB0YXNrLm91dHB1dCA9IG91dHB1dDsKICAgICAgICB9CiAgICB9CiAgICAvKiogUmVtb3ZlIGEgY29tcGxldGVkIHdvcmtmbG93IGZyb20gdHJhY2tpbmcuICovCiAgICByZW1vdmVXb3JrZmxvdyh3b3JrZmxvd0lkKSB7CiAgICAgICAgY29uc3Qgd29ya2Zsb3cgPSB0aGlzLndvcmtmbG93cy5nZXQod29ya2Zsb3dJZCk7CiAgICAgICAgaWYgKCF3b3JrZmxvdykKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICh3b3JrZmxvdy5zdGF0dXMgPT09ICJydW5uaW5nIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZW1vdmUgYSBydW5uaW5nIHdvcmtmbG93IOKAlCBjYW5jZWwgaXQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgdGhpcy53b3JrZmxvd3MuZGVsZXRlKHdvcmtmbG93SWQpOwogICAgICAgIHRoaXMuY29uZmxpY3RzLmRlbGV0ZSh3b3JrZmxvd0lkKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIENsZWFudXAKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKiBDYW5jZWwgYWxsIHdvcmtmbG93cyBhbmQgY2xlYXIgc3RhdGUuICovCiAgICBhc3luYyBzaHV0ZG93bigpIHsKICAgICAgICAvLyBDYW5jZWwgcnVubmluZyB3b3JrZmxvd3MKICAgICAgICBmb3IgKGNvbnN0IFtpZCwgd2ZdIG9mIHRoaXMud29ya2Zsb3dzKSB7CiAgICAgICAgICAgIGlmICh3Zi5zdGF0dXMgPT09ICJydW5uaW5nIiB8fCB3Zi5zdGF0dXMgPT09ICJwZW5kaW5nIikgewogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWwoaWQpLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQ2xlYW4gdXAgZXZlbnQgaGFuZGxlcnMKICAgICAgICBmb3IgKGNvbnN0IFssIGNsZWFudXBdIG9mIHRoaXMuZXZlbnRIYW5kbGVycykgewogICAgICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZXZlbnRIYW5kbGVycy5jbGVhcigpOwogICAgICAgIC8vIFJlc29sdmUgYW55IHF1ZXVlZCB3b3JrZmxvd3Mgc28gdGhlaXIgZXhlY3V0ZSgpIGNhbGxzIGRvbid0IGhhbmcKICAgICAgICBmb3IgKGNvbnN0IFssIHJlc29sdmVdIG9mIHRoaXMucXVldWVSZXNvbHZlcnMpIHsKICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLnF1ZXVlUmVzb2x2ZXJzLmNsZWFyKCk7CiAgICAgICAgdGhpcy53b3JrZmxvd1F1ZXVlLmxlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5hY3RpdmVXb3JrZmxvd0NvdW50ID0gMDsKICAgICAgICBsb2cuaW5mbygiT3JjaGVzdHJhdG9yIHNodXQgZG93biIpOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUHJpdmF0ZSBoZWxwZXJzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICByZXF1aXJlV29ya2Zsb3coaWQpIHsKICAgICAgICBjb25zdCB3b3JrZmxvdyA9IHRoaXMud29ya2Zsb3dzLmdldChpZCk7CiAgICAgICAgaWYgKCF3b3JrZmxvdykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdvcmtmbG93IG5vdCBmb3VuZDogJHtpZH1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdvcmtmbG93OwogICAgfQogICAgY29tcHV0ZVdvcmtmbG93U3RhdHVzKHdvcmtmbG93KSB7CiAgICAgICAgY29uc3QgdGFza3MgPSBbLi4ud29ya2Zsb3cudGFza3MudmFsdWVzKCldOwogICAgICAgIGNvbnN0IGFsbENvbXBsZXRlZCA9IHRhc2tzLmV2ZXJ5KCh0KSA9PiB0LnN0YXR1cyA9PT0gImNvbXBsZXRlZCIpOwogICAgICAgIGNvbnN0IGFsbEZhaWxlZCA9IHRhc2tzLmV2ZXJ5KCh0KSA9PiB0LnN0YXR1cyA9PT0gImZhaWxlZCIpOwogICAgICAgIGNvbnN0IGFsbENhbmNlbGxlZCA9IHRhc2tzLmV2ZXJ5KCh0KSA9PiB0LnN0YXR1cyA9PT0gImNhbmNlbGxlZCIpOwogICAgICAgIGNvbnN0IGFueUZhaWxlZCA9IHRhc2tzLnNvbWUoKHQpID0+IHQuc3RhdHVzID09PSAiZmFpbGVkIik7CiAgICAgICAgY29uc3QgYW55Q29tcGxldGVkID0gdGFza3Muc29tZSgodCkgPT4gdC5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKTsKICAgICAgICBpZiAoYWxsQ29tcGxldGVkKQogICAgICAgICAgICByZXR1cm4gImNvbXBsZXRlZCI7CiAgICAgICAgaWYgKGFsbEZhaWxlZCkKICAgICAgICAgICAgcmV0dXJuICJmYWlsZWQiOwogICAgICAgIGlmIChhbGxDYW5jZWxsZWQpCiAgICAgICAgICAgIHJldHVybiAiY2FuY2VsbGVkIjsKICAgICAgICBpZiAoYW55RmFpbGVkICYmIGFueUNvbXBsZXRlZCkKICAgICAgICAgICAgcmV0dXJuICJwYXJ0aWFsIjsKICAgICAgICBpZiAoYW55RmFpbGVkKQogICAgICAgICAgICByZXR1cm4gImZhaWxlZCI7CiAgICAgICAgcmV0dXJuICJjb21wbGV0ZWQiOwogICAgfQogICAgZ2V0VGFza1Byb2dyZXNzKHdvcmtmbG93KSB7CiAgICAgICAgbGV0IGNvbXBsZXRlZCA9IDA7CiAgICAgICAgbGV0IHJ1bm5pbmcgPSAwOwogICAgICAgIGxldCBmYWlsZWQgPSAwOwogICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgZm9yIChjb25zdCBbLCB0YXNrXSBvZiB3b3JrZmxvdy50YXNrcykgewogICAgICAgICAgICB0b3RhbCsrOwogICAgICAgICAgICBpZiAodGFzay5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKQogICAgICAgICAgICAgICAgY29tcGxldGVkKys7CiAgICAgICAgICAgIGVsc2UgaWYgKHRhc2suc3RhdHVzID09PSAicnVubmluZyIpCiAgICAgICAgICAgICAgICBydW5uaW5nKys7CiAgICAgICAgICAgIGVsc2UgaWYgKHRhc2suc3RhdHVzID09PSAiZmFpbGVkIikKICAgICAgICAgICAgICAgIGZhaWxlZCsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBjb21wbGV0ZWQsIHRvdGFsLCBydW5uaW5nLCBmYWlsZWQgfTsKICAgIH0KICAgIGJ1aWxkUmVzdWx0KHdvcmtmbG93KSB7CiAgICAgICAgY29uc3QgdGFza3MgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IFssIHRhc2tdIG9mIHdvcmtmbG93LnRhc2tzKSB7CiAgICAgICAgICAgIGxldCBkdXJhdGlvbk1zOwogICAgICAgICAgICBpZiAodGFzay5zdGFydGVkQXQgJiYgdGFzay5maW5pc2hlZEF0KSB7CiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zID0gbmV3IERhdGUodGFzay5maW5pc2hlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSh0YXNrLnN0YXJ0ZWRBdCkuZ2V0VGltZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRhc2tzLnB1c2goewogICAgICAgICAgICAgICAga2V5OiB0YXNrLmtleSwKICAgICAgICAgICAgICAgIGxhYmVsOiB0YXNrLmxhYmVsLAogICAgICAgICAgICAgICAgc3RhdHVzOiB0YXNrLnN0YXR1cywKICAgICAgICAgICAgICAgIG91dHB1dDogdGFzay5vdXRwdXQsCiAgICAgICAgICAgICAgICBlcnJvcjogdGFzay5lcnJvciwKICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdW1tYXJ5ID0gewogICAgICAgICAgICB0b3RhbDogdGFza3MubGVuZ3RoLAogICAgICAgICAgICBjb21wbGV0ZWQ6IHRhc2tzLmZpbHRlcigodCkgPT4gdC5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKS5sZW5ndGgsCiAgICAgICAgICAgIGZhaWxlZDogdGFza3MuZmlsdGVyKCh0KSA9PiB0LnN0YXR1cyA9PT0gImZhaWxlZCIpLmxlbmd0aCwKICAgICAgICAgICAgc2tpcHBlZDogdGFza3MuZmlsdGVyKCh0KSA9PiB0LnN0YXR1cyA9PT0gInNraXBwZWQiKS5sZW5ndGgsCiAgICAgICAgICAgIGNhbmNlbGxlZDogdGFza3MuZmlsdGVyKCh0KSA9PiB0LnN0YXR1cyA9PT0gImNhbmNlbGxlZCIpLmxlbmd0aCwKICAgICAgICAgICAgZHVyYXRpb25Nczogd29ya2Zsb3cuc3RhcnRlZEF0ICYmIHdvcmtmbG93LmZpbmlzaGVkQXQKICAgICAgICAgICAgICAgID8gbmV3IERhdGUod29ya2Zsb3cuZmluaXNoZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUod29ya2Zsb3cuc3RhcnRlZEF0KS5nZXRUaW1lKCkKICAgICAgICAgICAgICAgIDogMCwKICAgICAgICB9OwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93LmlkLAogICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93Lm5hbWUsCiAgICAgICAgICAgIHN0YXR1czogd29ya2Zsb3cuc3RhdHVzLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgY29uZmxpY3RzOiB0aGlzLmNvbmZsaWN0cy5nZXQod29ya2Zsb3cuaWQpID8/IFtdLAogICAgICAgICAgICBzdW1tYXJ5LAogICAgICAgIH07CiAgICB9CiAgICAvKiogRGV0ZWN0IGN5Y2xlcyBpbiBkZXBlbmRlbmN5IGdyYXBoIHZpYSBERlMuICovCiAgICBkZXRlY3RDeWNsZXModGFza3MpIHsKICAgICAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldCgpOwogICAgICAgIGNvbnN0IGluU3RhY2sgPSBuZXcgU2V0KCk7CiAgICAgICAgY29uc3QgdmlzaXQgPSAoa2V5LCBwYXRoKSA9PiB7CiAgICAgICAgICAgIGlmIChpblN0YWNrLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjeWNsZSA9IFsuLi5wYXRoLnNsaWNlKHBhdGguaW5kZXhPZihrZXkpKSwga2V5XTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVwZW5kZW5jeSBjeWNsZSBkZXRlY3RlZDogJHtjeWNsZS5qb2luKCIg4oaSICIpfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2aXNpdGVkLmhhcyhrZXkpKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB2aXNpdGVkLmFkZChrZXkpOwogICAgICAgICAgICBpblN0YWNrLmFkZChrZXkpOwogICAgICAgICAgICBjb25zdCB0YXNrID0gdGFza3MuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICh0YXNrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0YXNrLmRlcGVuZHNPbikgewogICAgICAgICAgICAgICAgICAgIHZpc2l0KGRlcCwgWy4uLnBhdGgsIGtleV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGluU3RhY2suZGVsZXRlKGtleSk7CiAgICAgICAgfTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0YXNrcy5rZXlzKCkpIHsKICAgICAgICAgICAgdmlzaXQoa2V5LCBbXSk7CiAgICAgICAgfQogICAgfQp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIZWxwZXJzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93SWQoKSB7CiAgICByZXR1cm4gYHdmXyR7RGF0ZS5ub3coKX1fJHtyYW5kb21CeXRlcyg0KS50b1N0cmluZygiaGV4Iil9YDsKfQovKioKICogUGFyc2UgZmlsZSBwYXRocyBmcm9tIGFnZW50IG91dHB1dC4KICogTG9va3MgZm9yIGNvbW1vbiBwYXR0ZXJuczogIkNyZWF0ZWQgWCIsICJNb2RpZmllZCBYIiwgIldyb3RlIFgiLCBmaWxlIHBhdGhzIGluIGJhY2t0aWNrcy4KICovCmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbGVzRnJvbU91dHB1dChvdXRwdXQpIHsKICAgIGNvbnN0IGZpbGVzID0gbmV3IFNldCgpOwogICAgY29uc3QgcGF0dGVybnMgPSBbCiAgICAgICAgLyg/OkNyZWF0ZWR8TW9kaWZpZWR8V3JvdGV8VXBkYXRlZHxFZGl0ZWR8RGVsZXRlZClccytbYCJdPyhbXlxzYCJdK1wuXHcrKVtgIl0/L2dpLAogICAgICAgIC9eXHMqWy0rXVxzKyhcUytcLlx3KykvZ20sCiAgICBdOwogICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7CiAgICAgICAgbGV0IG1hdGNoOwogICAgICAgIHdoaWxlICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWMob3V0cHV0KSkgIT09IG51bGwpIHsKICAgICAgICAgICAgY29uc3QgZmlsZSA9IG1hdGNoWzFdLnRyaW0oKTsKICAgICAgICAgICAgaWYgKGZpbGUubGVuZ3RoID4gMiAmJiBmaWxlLmxlbmd0aCA8IDI1NikgewogICAgICAgICAgICAgICAgZmlsZXMuYWRkKGZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFsuLi5maWxlc107Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3JjaGVzdHJhdGlvbi5qcy5tYXA=","agents/workflow.js":"LyoqCiAqIFdvcmtmbG93IEVuZ2luZSDigJQgRmlsZS1iYXNlZCBtdWx0aS1zdGVwIGFnZW50IHdvcmtmbG93IGRlZmluaXRpb25zLgogKgogKiBCcmlkZ2VzIHRoZSBnYXAgYmV0d2VlbiBkZWNsYXJhdGl2ZSBKU09OIHdvcmtmbG93IGZpbGVzIGluCiAqIGBicmFpbi9hZ2VudHMvd29ya2Zsb3dzL2AgYW5kIHRoZSBpbi1tZW1vcnkgT3JjaGVzdHJhdG9yLgogKgogKiBBZGRzIG9uIHRvcCBvZiB0aGUgT3JjaGVzdHJhdG9yOgogKiAxLiBMb2FkaW5nL3ZhbGlkYXRpbmcgd29ya2Zsb3cgZGVmaW5pdGlvbnMgZnJvbSBKU09OIGZpbGVzCiAqIDIuIFRlbXBsYXRlIGludGVycG9sYXRpb24gKHt7aW5wdXQueH19LCB7e3N0ZXBzLnkub3V0cHV0fX0pCiAqIDMuIENvbmRpdGlvbmFsIHN0ZXAgZ2F0aW5nIChzdGVwU3RhdHVzLCBpbnB1dEVxdWFscywgYWxsT2YvYW55T2Yvbm90KQogKiA0LiBFcnJvciByZWNvdmVyeSBwb2xpY2llcyAoc3RvcCwgY29udGludWUsIGZhbGxiYWNrKQogKiA1LiBSZXRyeSBsb2dpYyB3aXRoIHBlci1zdGVwIHJldHJ5IGNvdW50cwogKiA2LiBXb3JrZmxvdy1sZXZlbCBpbnB1dCBwYXJhbWV0ZXJzIGFuZCBvdXRwdXQgbWFwcGluZwogKi8KaW1wb3J0IHsgcmVhZGRpciB9IGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgeyBqb2luIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgcmVhZEJyYWluRmlsZSB9IGZyb20gIi4uL2xpYi9icmFpbi1pby5qcyI7CmltcG9ydCB7IE9yY2hlc3RyYXRvciB9IGZyb20gIi4vb3JjaGVzdHJhdGlvbi5qcyI7CmltcG9ydCB7IEJSQUlOX0RJUiB9IGZyb20gIi4uL2xpYi9wYXRocy5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigid29ya2Zsb3ciKTsKY29uc3QgV09SS0ZMT1dTX0RJUiA9IGpvaW4oQlJBSU5fRElSLCAiYWdlbnRzIiwgIndvcmtmbG93cyIpOwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gV29ya2Zsb3dFbmdpbmUKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmV4cG9ydCBjbGFzcyBXb3JrZmxvd0VuZ2luZSB7CiAgICBvcmNoZXN0cmF0b3I7CiAgICBkZWZpbml0aW9uQ2FjaGUgPSBuZXcgTWFwKCk7CiAgICBydW5zID0gbmV3IE1hcCgpOwogICAgcnVuQ291bnRlciA9IDA7CiAgICBjb25zdHJ1Y3Rvcihwb29sKSB7CiAgICAgICAgdGhpcy5vcmNoZXN0cmF0b3IgPSBuZXcgT3JjaGVzdHJhdG9yKHBvb2wsIHsgbWF4QWN0aXZlV29ya2Zsb3dzOiA1IH0pOwogICAgfQogICAgLyoqIEFjY2VzcyB0aGUgdW5kZXJseWluZyBvcmNoZXN0cmF0b3IgZm9yIGFkdmFuY2VkIHVzZS4gKi8KICAgIGdldE9yY2hlc3RyYXRvcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcmNoZXN0cmF0b3I7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBMb2FkaW5nIGRlZmluaXRpb25zCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogTG9hZCBhIHdvcmtmbG93IGRlZmluaXRpb24gZnJvbSBhIEpTT04gZmlsZSBwYXRoLiAqLwogICAgYXN5bmMgbG9hZERlZmluaXRpb24oZmlsZVBhdGgpIHsKICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkQnJhaW5GaWxlKGZpbGVQYXRoKTsKICAgICAgICBjb25zdCBkZWYgPSBKU09OLnBhcnNlKHJhdyk7CiAgICAgICAgdGhpcy52YWxpZGF0ZURlZmluaXRpb24oZGVmKTsKICAgICAgICB0aGlzLmRlZmluaXRpb25DYWNoZS5zZXQoZGVmLm5hbWUsIGRlZik7CiAgICAgICAgbG9nLmluZm8oIldvcmtmbG93IGRlZmluaXRpb24gbG9hZGVkIiwgeyBuYW1lOiBkZWYubmFtZSwgdmVyc2lvbjogZGVmLnZlcnNpb24sIHN0ZXBzOiBkZWYuc3RlcHMubGVuZ3RoIH0pOwogICAgICAgIHJldHVybiBkZWY7CiAgICB9CiAgICAvKiogTG9hZCBhbGwgd29ya2Zsb3cgZGVmaW5pdGlvbnMgZnJvbSB0aGUgd29ya2Zsb3dzIGRpcmVjdG9yeS4gKi8KICAgIGFzeW5jIGxvYWRBbGxEZWZpbml0aW9ucygpIHsKICAgICAgICBjb25zdCBsb2FkZWQgPSBbXTsKICAgICAgICBsZXQgZW50cmllczsKICAgICAgICB0cnkgewogICAgICAgICAgICBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihXT1JLRkxPV1NfRElSKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICBsb2cud2FybigiV29ya2Zsb3dzIGRpcmVjdG9yeSBub3QgZm91bmQiLCB7IGRpcjogV09SS0ZMT1dTX0RJUiB9KTsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHsKICAgICAgICAgICAgaWYgKCFlbnRyeS5lbmRzV2l0aCgiLmpzb24iKSB8fCBlbnRyeSA9PT0gInNjaGVtYS5qc29uIikKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgZGVmID0gYXdhaXQgdGhpcy5sb2FkRGVmaW5pdGlvbihqb2luKFdPUktGTE9XU19ESVIsIGVudHJ5KSk7CiAgICAgICAgICAgICAgICBsb2FkZWQucHVzaChkZWYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gbG9hZCB3b3JrZmxvdyBkZWZpbml0aW9uIiwgewogICAgICAgICAgICAgICAgICAgIGZpbGU6IGVudHJ5LAogICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbG9hZGVkOwogICAgfQogICAgLyoqIEdldCBhIGNhY2hlZCBkZWZpbml0aW9uIGJ5IG5hbWUuICovCiAgICBnZXREZWZpbml0aW9uKG5hbWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uQ2FjaGUuZ2V0KG5hbWUpOwogICAgfQogICAgLyoqIExpc3QgYWxsIGNhY2hlZCBkZWZpbml0aW9uIG5hbWVzLiAqLwogICAgbGlzdERlZmluaXRpb25zKCkgewogICAgICAgIHJldHVybiBbLi4udGhpcy5kZWZpbml0aW9uQ2FjaGUua2V5cygpXTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEV4ZWN1dGlvbgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqCiAgICAgKiBFeGVjdXRlIGEgd29ya2Zsb3cgYnkgbmFtZS4KICAgICAqCiAgICAgKiBSZXNvbHZlcyBpbnB1dHMsIGV2YWx1YXRlcyBjb25kaXRpb25zLCBpbnRlcnBvbGF0ZXMgdGVtcGxhdGVzLAogICAgICogdGhlbiBkZWxlZ2F0ZXMgdG8gdGhlIE9yY2hlc3RyYXRvciBmb3IgYWdlbnQgY29vcmRpbmF0aW9uLgogICAgICovCiAgICBhc3luYyBleGVjdXRlKG5hbWUsIGlucHV0cyA9IHt9KSB7CiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5kZWZpbml0aW9uQ2FjaGUuZ2V0KG5hbWUpOwogICAgICAgIGlmICghZGVmKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV29ya2Zsb3cgZGVmaW5pdGlvbiBub3QgZm91bmQ6ICIke25hbWV9Ii4gTG9hZCBpdCBmaXJzdC5gKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVzb2x2ZSBpbnB1dHMgd2l0aCBkZWZhdWx0cwogICAgICAgIGNvbnN0IHJlc29sdmVkSW5wdXRzID0gdGhpcy5yZXNvbHZlSW5wdXRzKGRlZiwgaW5wdXRzKTsKICAgICAgICAvLyBDcmVhdGUgcnVuIHRyYWNraW5nCiAgICAgICAgY29uc3QgcnVuID0gdGhpcy5jcmVhdGVSdW4oZGVmLCByZXNvbHZlZElucHV0cyk7CiAgICAgICAgdGhpcy5ydW5zLnNldChydW4uaWQsIHJ1bik7CiAgICAgICAgcnVuLnN0YXR1cyA9ICJydW5uaW5nIjsKICAgICAgICBydW4uc3RhcnRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgIGxvZy5pbmZvKCJXb3JrZmxvdyBleGVjdXRpb24gc3RhcnRlZCIsIHsKICAgICAgICAgICAgcnVuSWQ6IHJ1bi5pZCwKICAgICAgICAgICAgd29ya2Zsb3c6IGRlZi5uYW1lLAogICAgICAgICAgICBzdGVwQ291bnQ6IGRlZi5zdGVwcy5sZW5ndGgsCiAgICAgICAgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGRlZi5tb2RlID09PSAic2VxdWVudGlhbCIpIHsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVNlcXVlbnRpYWwoZGVmLCBydW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gRm9yIHBhcmFsbGVsIGFuZCBkZXBlbmRlbmN5IG1vZGVzLCBkZWxlZ2F0ZSB0byBvcmNoZXN0cmF0b3IKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVZpYU9yY2hlc3RyYXRvcihkZWYsIHJ1bik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBsb2cuZXJyb3IoIldvcmtmbG93IGV4ZWN1dGlvbiBlcnJvciIsIHsKICAgICAgICAgICAgICAgIHJ1bklkOiBydW4uaWQsCiAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gQ29tcHV0ZSBmaW5hbCBzdGF0dXMKICAgICAgICBydW4uc3RhdHVzID0gdGhpcy5jb21wdXRlUnVuU3RhdHVzKHJ1bik7CiAgICAgICAgcnVuLmZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgLy8gTWFwIG91dHB1dHMKICAgICAgICBydW4ub3V0cHV0cyA9IHRoaXMubWFwT3V0cHV0cyhkZWYsIHJ1bik7CiAgICAgICAgbG9nLmluZm8oIldvcmtmbG93IGV4ZWN1dGlvbiBmaW5pc2hlZCIsIHsKICAgICAgICAgICAgcnVuSWQ6IHJ1bi5pZCwKICAgICAgICAgICAgd29ya2Zsb3c6IGRlZi5uYW1lLAogICAgICAgICAgICBzdGF0dXM6IHJ1bi5zdGF0dXMsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJ1bjsKICAgIH0KICAgIC8qKiBHZXQgYSBydW4gYnkgSUQuICovCiAgICBnZXRSdW4ocnVuSWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5ydW5zLmdldChydW5JZCk7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBTZXF1ZW50aWFsIGV4ZWN1dGlvbiAoaGFuZGxlcyBjb25kaXRpb25zICsgcmV0cmllcyBpbmxpbmUpCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBhc3luYyBleGVjdXRlU2VxdWVudGlhbChkZWYsIHJ1bikgewogICAgICAgIGZvciAoY29uc3Qgc3RlcERlZiBvZiBkZWYuc3RlcHMpIHsKICAgICAgICAgICAgaWYgKHJ1bi5zdGF0dXMgPT09ICJjYW5jZWxsZWQiKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bi5zdGVwUmVzdWx0cy5nZXQoc3RlcERlZi5rZXkpOwogICAgICAgICAgICAvLyBFdmFsdWF0ZSBjb25kaXRpb24KICAgICAgICAgICAgaWYgKHN0ZXBEZWYuY29uZGl0aW9uICYmICF0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKHN0ZXBEZWYuY29uZGl0aW9uLCBydW4pKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gInNraXBwZWQiOwogICAgICAgICAgICAgICAgbG9nLmluZm8oIlN0ZXAgc2tpcHBlZCAoY29uZGl0aW9uIGZhbHNlKSIsIHsgcnVuSWQ6IHJ1bi5pZCwgc3RlcDogc3RlcERlZi5rZXkgfSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFeGVjdXRlIHdpdGggcmV0cmllcwogICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVTdGVwV2l0aFJldHJpZXMoZGVmLCBydW4sIHN0ZXBEZWYsIHJlc3VsdCk7CiAgICAgICAgICAgIC8vIEhhbmRsZSBmYWlsdXJlCiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAiZmFpbGVkIikgewogICAgICAgICAgICAgICAgY29uc3QgcG9saWN5ID0gc3RlcERlZi5vbkZhaWx1cmUgPz8gZGVmLm9uRmFpbHVyZSA/PyB7IGFjdGlvbjogInN0b3AiIH07CiAgICAgICAgICAgICAgICBpZiAocG9saWN5LmFjdGlvbiA9PT0gInN0b3AiKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIldvcmtmbG93IHN0b3BwaW5nIGR1ZSB0byBzdGVwIGZhaWx1cmUiLCB7IHJ1bklkOiBydW4uaWQsIHN0ZXA6IHN0ZXBEZWYua2V5IH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBvbGljeS5hY3Rpb24gPT09ICJmYWxsYmFjayIgJiYgcG9saWN5LmZhbGxiYWNrU3RlcCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZiRGVmID0gZGVmLnN0ZXBzLmZpbmQoKHMpID0+IHMua2V5ID09PSBwb2xpY3kuZmFsbGJhY2tTdGVwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZmJEZWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmJSZXN1bHQgPSB7IGtleTogZmJEZWYua2V5LCBzdGF0dXM6ICJwZW5kaW5nIiwgcmV0cmllc1VzZWQ6IDAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuLnN0ZXBSZXN1bHRzLnNldChmYkRlZi5rZXksIGZiUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlU3RlcFdpdGhSZXRyaWVzKGRlZiwgcnVuLCBmYkRlZiwgZmJSZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vICJjb250aW51ZSIganVzdCBwcm9jZWVkcyB0byBuZXh0IHN0ZXAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIE9yY2hlc3RyYXRvci1kZWxlZ2F0ZWQgZXhlY3V0aW9uIChwYXJhbGxlbC9kZXBlbmRlbmN5KQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgYXN5bmMgZXhlY3V0ZVZpYU9yY2hlc3RyYXRvcihkZWYsIHJ1bikgewogICAgICAgIC8vIEJ1aWxkIHRhc2sgbGlzdCwgZmlsdGVyaW5nIGJ5IGNvbmRpdGlvbnMKICAgICAgICBjb25zdCB0YXNrcyA9IFtdOwogICAgICAgIGZvciAoY29uc3Qgc3RlcERlZiBvZiBkZWYuc3RlcHMpIHsKICAgICAgICAgICAgLy8gRm9yIGRlcGVuZGVuY3kvcGFyYWxsZWwgbW9kZSwgZXZhbHVhdGUgY29uZGl0aW9ucyB0aGF0IGNhbiBiZSBjaGVja2VkIHVwZnJvbnQKICAgICAgICAgICAgLy8gKGlucHV0LWJhc2VkIGNvbmRpdGlvbnMpLiBTdGVwLXN0YXR1cyBjb25kaXRpb25zIGNhbid0IGJlIHByZS1ldmFsdWF0ZWQuCiAgICAgICAgICAgIGlmIChzdGVwRGVmLmNvbmRpdGlvbiAmJiB0aGlzLmlzU3RhdGljQ29uZGl0aW9uKHN0ZXBEZWYuY29uZGl0aW9uKSkgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKHN0ZXBEZWYuY29uZGl0aW9uLCBydW4pKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVuLnN0ZXBSZXN1bHRzLmdldChzdGVwRGVmLmtleSk7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9ICJza2lwcGVkIjsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRQcm9tcHQgPSB0aGlzLmludGVycG9sYXRlVGVtcGxhdGUoc3RlcERlZi5wcm9tcHQsIHJ1bik7CiAgICAgICAgICAgIHRhc2tzLnB1c2goewogICAgICAgICAgICAgICAga2V5OiBzdGVwRGVmLmtleSwKICAgICAgICAgICAgICAgIGxhYmVsOiBzdGVwRGVmLmxhYmVsLAogICAgICAgICAgICAgICAgcHJvbXB0OiBpbnRlcnBvbGF0ZWRQcm9tcHQsCiAgICAgICAgICAgICAgICBjd2Q6IHN0ZXBEZWYuY3dkLAogICAgICAgICAgICAgICAgZGVwZW5kc09uOiBzdGVwRGVmLmRlcGVuZHNPbiwKICAgICAgICAgICAgICAgIHByaW9yaXR5OiBzdGVwRGVmLnByaW9yaXR5LAogICAgICAgICAgICAgICAgdGFnczogc3RlcERlZi50YWdzLAogICAgICAgICAgICAgICAgY29uZmlnOiBzdGVwRGVmLnRpbWVvdXRNcyA/IHsgdGltZW91dE1zOiBzdGVwRGVmLnRpbWVvdXRNcyB9IDogdW5kZWZpbmVkLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBsb2cuaW5mbygiTm8gc3RlcHMgdG8gZXhlY3V0ZSBhZnRlciBjb25kaXRpb24gZmlsdGVyaW5nIiwgeyBydW5JZDogcnVuLmlkIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHdvcmtmbG93SW5wdXQgPSB7CiAgICAgICAgICAgIG5hbWU6IGAke2RlZi5uYW1lfSAocnVuICR7cnVuLmlkfSlgLAogICAgICAgICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgbW9kZTogZGVmLm1vZGUgPz8gImRlcGVuZGVuY3kiLAogICAgICAgICAgICBtYXhDb25jdXJyZW50OiBkZWYubWF4Q29uY3VycmVudCwKICAgICAgICAgICAgb3JpZ2luOiAic3lzdGVtIiwKICAgICAgICB9OwogICAgICAgIGNvbnN0IG9yY1dvcmtmbG93ID0gdGhpcy5vcmNoZXN0cmF0b3IuY3JlYXRlV29ya2Zsb3cod29ya2Zsb3dJbnB1dCk7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcmNoZXN0cmF0b3IuZXhlY3V0ZShvcmNXb3JrZmxvdy5pZCk7CiAgICAgICAgcnVuLm9yY2hlc3RyYXRvclJlc3VsdCA9IHJlc3VsdDsKICAgICAgICAvLyBTeW5jIHJlc3VsdHMgYmFjayB0byBvdXIgc3RlcCB0cmFja2luZwogICAgICAgIGZvciAoY29uc3QgdGFza1Jlc3VsdCBvZiByZXN1bHQudGFza3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RlcFJlc3VsdCA9IHJ1bi5zdGVwUmVzdWx0cy5nZXQodGFza1Jlc3VsdC5rZXkpOwogICAgICAgICAgICBpZiAoc3RlcFJlc3VsdCkgewogICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5zdGF0dXMgPSB0YXNrUmVzdWx0LnN0YXR1cyA9PT0gImNvbXBsZXRlZCIgPyAiY29tcGxldGVkIiA6ICJmYWlsZWQiOwogICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5vdXRwdXQgPSB0YXNrUmVzdWx0Lm91dHB1dDsKICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuZXJyb3IgPSB0YXNrUmVzdWx0LmVycm9yOwogICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5kdXJhdGlvbk1zID0gdGFza1Jlc3VsdC5kdXJhdGlvbk1zOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gU3RlcCBleGVjdXRpb24gd2l0aCByZXRyaWVzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBhc3luYyBleGVjdXRlU3RlcFdpdGhSZXRyaWVzKGRlZiwgcnVuLCBzdGVwRGVmLCByZXN1bHQpIHsKICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gc3RlcERlZi5yZXRyaWVzID8/IDA7CiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7CiAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSAicnVubmluZyI7CiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRQcm9tcHQgPSB0aGlzLmludGVycG9sYXRlVGVtcGxhdGUoc3RlcERlZi5wcm9tcHQsIHJ1bik7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBzaW5nbGUtdGFzayB3b3JrZmxvdyB2aWEgdGhlIG9yY2hlc3RyYXRvcgogICAgICAgICAgICAgICAgY29uc3QgdGFza0RlZiA9IHsKICAgICAgICAgICAgICAgICAgICBrZXk6IHN0ZXBEZWYua2V5LAogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBzdGVwRGVmLmxhYmVsLAogICAgICAgICAgICAgICAgICAgIHByb21wdDogaW50ZXJwb2xhdGVkUHJvbXB0LAogICAgICAgICAgICAgICAgICAgIGN3ZDogc3RlcERlZi5jd2QsCiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IHN0ZXBEZWYucHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgdGFnczogc3RlcERlZi50YWdzLAogICAgICAgICAgICAgICAgICAgIGNvbmZpZzogc3RlcERlZi50aW1lb3V0TXMgPyB7IHRpbWVvdXRNczogc3RlcERlZi50aW1lb3V0TXMgfSA6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB3ZklucHV0ID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke2RlZi5uYW1lfS8ke3N0ZXBEZWYua2V5fSR7YXR0ZW1wdCA+IDAgPyBgIChyZXRyeSAke2F0dGVtcHR9KWAgOiAiIn1gLAogICAgICAgICAgICAgICAgICAgIHRhc2tzOiBbdGFza0RlZl0sCiAgICAgICAgICAgICAgICAgICAgbW9kZTogInNlcXVlbnRpYWwiLAogICAgICAgICAgICAgICAgICAgIG9yaWdpbjogInN5c3RlbSIsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3Qgb3JjV29ya2Zsb3cgPSB0aGlzLm9yY2hlc3RyYXRvci5jcmVhdGVXb3JrZmxvdyh3ZklucHV0KTsKICAgICAgICAgICAgICAgIGNvbnN0IG9yY2hSZXN1bHQgPSBhd2FpdCB0aGlzLm9yY2hlc3RyYXRvci5leGVjdXRlKG9yY1dvcmtmbG93LmlkKTsKICAgICAgICAgICAgICAgIGNvbnN0IHRhc2tSZXN1bHQgPSBvcmNoUmVzdWx0LnRhc2tzWzBdOwogICAgICAgICAgICAgICAgcmVzdWx0LmR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lOwogICAgICAgICAgICAgICAgaWYgKHRhc2tSZXN1bHQgJiYgdGFza1Jlc3VsdC5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9ICJjb21wbGV0ZWQiOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5vdXRwdXQgPSB0YXNrUmVzdWx0Lm91dHB1dDsKICAgICAgICAgICAgICAgICAgICByZXN1bHQucmV0cmllc1VzZWQgPSBhdHRlbXB0OwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFRhc2sgZmFpbGVkCiAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3IgPSB0YXNrUmVzdWx0Py5lcnJvciA/PyAiVW5rbm93biBlcnJvciI7CiAgICAgICAgICAgICAgICByZXN1bHQucmV0cmllc1VzZWQgPSBhdHRlbXB0OwogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIlN0ZXAgZmFpbGVkLCByZXRyeWluZyIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQ6IHJ1bi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogc3RlcERlZi5rZXksCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXRyaWVzLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5kdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTsKICAgICAgICAgICAgICAgIHJlc3VsdC5lcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgICAgIHJlc3VsdC5yZXRyaWVzVXNlZCA9IGF0dGVtcHQ7CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heFJldHJpZXMpIHsKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiU3RlcCB0aHJldywgcmV0cnlpbmciLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkOiBydW4uaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHN0ZXBEZWYua2V5LAogICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBhdHRlbXB0ICsgMSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXN1bHQuc3RhdHVzID0gImZhaWxlZCI7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBUZW1wbGF0ZSBpbnRlcnBvbGF0aW9uCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKioKICAgICAqIFJlcGxhY2Uge3tpbnB1dC5wYXJhbU5hbWV9fSBhbmQge3tzdGVwcy5zdGVwS2V5Lm91dHB1dH19IHBsYWNlaG9sZGVycy4KICAgICAqLwogICAgaW50ZXJwb2xhdGVUZW1wbGF0ZSh0ZW1wbGF0ZSwgcnVuKSB7CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1x7XHsoXHcrKD86XC5cdyspKilcfVx9L2csIChfbWF0Y2gsIGV4cHIpID0+IHsKICAgICAgICAgICAgY29uc3QgcGFydHMgPSBleHByLnNwbGl0KCIuIik7CiAgICAgICAgICAgIC8vIHt7aW5wdXQucGFyYW1OYW1lfX0KICAgICAgICAgICAgaWYgKHBhcnRzWzBdID09PSAiaW5wdXQiICYmIHBhcnRzLmxlbmd0aCA9PT0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdmFsID0gcnVuLmlucHV0c1twYXJ0c1sxXV07CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPyBTdHJpbmcodmFsKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHt7c3RlcHMuc3RlcEtleS5vdXRwdXR9fSBvciB7e3N0ZXBzLnN0ZXBLZXkuc3RhdHVzfX0KICAgICAgICAgICAgaWYgKHBhcnRzWzBdID09PSAic3RlcHMiICYmIHBhcnRzLmxlbmd0aCA9PT0gMykgewogICAgICAgICAgICAgICAgY29uc3Qgc3RlcFJlc3VsdCA9IHJ1bi5zdGVwUmVzdWx0cy5nZXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgaWYgKCFzdGVwUmVzdWx0KQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgICAgIGlmIChwYXJ0c1syXSA9PT0gIm91dHB1dCIpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBSZXN1bHQub3V0cHV0ID8/ICIiOwogICAgICAgICAgICAgICAgaWYgKHBhcnRzWzJdID09PSAic3RhdHVzIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcFJlc3VsdC5zdGF0dXM7CiAgICAgICAgICAgICAgICBpZiAocGFydHNbMl0gPT09ICJlcnJvciIpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBSZXN1bHQuZXJyb3IgPz8gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0pOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gQ29uZGl0aW9uIGV2YWx1YXRpb24KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGV2YWx1YXRlQ29uZGl0aW9uKGNvbmRpdGlvbiwgcnVuKSB7CiAgICAgICAgaWYgKGNvbmRpdGlvbi5zdGVwU3RhdHVzKSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bi5zdGVwUmVzdWx0cy5nZXQoY29uZGl0aW9uLnN0ZXBTdGF0dXMuc3RlcCk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ/LnN0YXR1cyA9PT0gY29uZGl0aW9uLnN0ZXBTdGF0dXMuZXF1YWxzOwogICAgICAgIH0KICAgICAgICBpZiAoY29uZGl0aW9uLmlucHV0RXF1YWxzKSB7CiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHJ1bi5pbnB1dHNbY29uZGl0aW9uLmlucHV0RXF1YWxzLmlucHV0XTsKICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gY29uZGl0aW9uLmlucHV0RXF1YWxzLnZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoY29uZGl0aW9uLmFsbE9mKSB7CiAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24uYWxsT2YuZXZlcnkoKGMpID0+IHRoaXMuZXZhbHVhdGVDb25kaXRpb24oYywgcnVuKSk7CiAgICAgICAgfQogICAgICAgIGlmIChjb25kaXRpb24uYW55T2YpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5hbnlPZi5zb21lKChjKSA9PiB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKGMsIHJ1bikpOwogICAgICAgIH0KICAgICAgICBpZiAoY29uZGl0aW9uLm5vdCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuZXZhbHVhdGVDb25kaXRpb24oY29uZGl0aW9uLm5vdCwgcnVuKTsKICAgICAgICB9CiAgICAgICAgLy8gTm8gb3BlcmF0b3Igc2V0IOKAlCB0cmVhdCBhcyB0cnVlICh1bmNvbmRpdGlvbmFsKQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqIENoZWNrIGlmIGEgY29uZGl0aW9uIG9ubHkgcmVmZXJlbmNlcyBpbnB1dHMgKGNhbiBiZSBldmFsdWF0ZWQgYmVmb3JlIHN0ZXBzIHJ1bikuICovCiAgICBpc1N0YXRpY0NvbmRpdGlvbihjb25kaXRpb24pIHsKICAgICAgICBpZiAoY29uZGl0aW9uLnN0ZXBTdGF0dXMpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoY29uZGl0aW9uLmlucHV0RXF1YWxzKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoY29uZGl0aW9uLmFsbE9mKQogICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLmFsbE9mLmV2ZXJ5KChjKSA9PiB0aGlzLmlzU3RhdGljQ29uZGl0aW9uKGMpKTsKICAgICAgICBpZiAoY29uZGl0aW9uLmFueU9mKQogICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLmFueU9mLmV2ZXJ5KChjKSA9PiB0aGlzLmlzU3RhdGljQ29uZGl0aW9uKGMpKTsKICAgICAgICBpZiAoY29uZGl0aW9uLm5vdCkKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTdGF0aWNDb25kaXRpb24oY29uZGl0aW9uLm5vdCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBWYWxpZGF0aW9uCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YWxpZGF0ZURlZmluaXRpb24oZGVmKSB7CiAgICAgICAgaWYgKCFkZWYubmFtZSB8fCB0eXBlb2YgZGVmLm5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2Zsb3cgZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSAnbmFtZScgc3RyaW5nLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZi52ZXJzaW9uIHx8ICEvXlxkK1wuXGQrXC5cZCskLy50ZXN0KGRlZi52ZXJzaW9uKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtmbG93IGRlZmluaXRpb24gbXVzdCBoYXZlIGEgdmFsaWQgc2VtdmVyICd2ZXJzaW9uJy4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlZi5zdGVwcykgfHwgZGVmLnN0ZXBzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtmbG93IGRlZmluaXRpb24gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdGVwLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldCgpOwogICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBkZWYuc3RlcHMpIHsKICAgICAgICAgICAgaWYgKCFzdGVwLmtleSB8fCAhc3RlcC5sYWJlbCB8fCAhc3RlcC5wcm9tcHQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RlcCAiJHtzdGVwLmtleSA/PyAiKHVubmFtZWQpIn0iIG11c3QgaGF2ZSBrZXksIGxhYmVsLCBhbmQgcHJvbXB0LmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrZXlzLmhhcyhzdGVwLmtleSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHN0ZXAga2V5OiAiJHtzdGVwLmtleX0iLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGtleXMuYWRkKHN0ZXAua2V5KTsKICAgICAgICB9CiAgICAgICAgLy8gVmFsaWRhdGUgZGVwZW5kZW5jeSByZWZlcmVuY2VzCiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIGRlZi5zdGVwcykgewogICAgICAgICAgICBpZiAoc3RlcC5kZXBlbmRzT24pIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwIG9mIHN0ZXAuZGVwZW5kc09uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlzLmhhcyhkZXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RlcCAiJHtzdGVwLmtleX0iIGRlcGVuZHMgb24gdW5rbm93biBzdGVwICIke2RlcH0iLmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBWYWxpZGF0ZSBmYWxsYmFjayByZWZlcmVuY2VzCiAgICAgICAgY29uc3QgZGVmYXVsdFBvbGljeSA9IGRlZi5vbkZhaWx1cmU7CiAgICAgICAgaWYgKGRlZmF1bHRQb2xpY3k/LmFjdGlvbiA9PT0gImZhbGxiYWNrIiAmJiBkZWZhdWx0UG9saWN5LmZhbGxiYWNrU3RlcCkgewogICAgICAgICAgICBpZiAoIWtleXMuaGFzKGRlZmF1bHRQb2xpY3kuZmFsbGJhY2tTdGVwKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWZhdWx0IGZhbGxiYWNrIHN0ZXAgIiR7ZGVmYXVsdFBvbGljeS5mYWxsYmFja1N0ZXB9IiBub3QgZm91bmQuYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIGRlZi5zdGVwcykgewogICAgICAgICAgICBpZiAoc3RlcC5vbkZhaWx1cmU/LmFjdGlvbiA9PT0gImZhbGxiYWNrIiAmJiBzdGVwLm9uRmFpbHVyZS5mYWxsYmFja1N0ZXApIHsKICAgICAgICAgICAgICAgIGlmICgha2V5cy5oYXMoc3RlcC5vbkZhaWx1cmUuZmFsbGJhY2tTdGVwKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RlcCAiJHtzdGVwLmtleX0iIGZhbGxiYWNrIHN0ZXAgIiR7c3RlcC5vbkZhaWx1cmUuZmFsbGJhY2tTdGVwfSIgbm90IGZvdW5kLmApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEN5Y2xlIGRldGVjdGlvbiBmb3IgZGVwZW5kZW5jeSBtb2RlCiAgICAgICAgaWYgKGRlZi5tb2RlID09PSAiZGVwZW5kZW5jeSIgfHwgIWRlZi5tb2RlKSB7CiAgICAgICAgICAgIHRoaXMuZGV0ZWN0Q3ljbGVzKGRlZi5zdGVwcyk7CiAgICAgICAgfQogICAgfQogICAgZGV0ZWN0Q3ljbGVzKHN0ZXBzKSB7CiAgICAgICAgY29uc3QgYWRqID0gbmV3IE1hcCgpOwogICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykgewogICAgICAgICAgICBhZGouc2V0KHN0ZXAua2V5LCBzdGVwLmRlcGVuZHNPbiA/PyBbXSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7CiAgICAgICAgY29uc3QgaW5TdGFjayA9IG5ldyBTZXQoKTsKICAgICAgICBjb25zdCB2aXNpdCA9IChrZXksIHBhdGgpID0+IHsKICAgICAgICAgICAgaWYgKGluU3RhY2suaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGN5Y2xlID0gWy4uLnBhdGguc2xpY2UocGF0aC5pbmRleE9mKGtleSkpLCBrZXldOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5IGN5Y2xlIGRldGVjdGVkOiAke2N5Y2xlLmpvaW4oIiDihpIgIil9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZpc2l0ZWQuaGFzKGtleSkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHZpc2l0ZWQuYWRkKGtleSk7CiAgICAgICAgICAgIGluU3RhY2suYWRkKGtleSk7CiAgICAgICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGFkai5nZXQoa2V5KSA/PyBbXSkgewogICAgICAgICAgICAgICAgdmlzaXQoZGVwLCBbLi4ucGF0aCwga2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5TdGFjay5kZWxldGUoa2V5KTsKICAgICAgICB9OwogICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFkai5rZXlzKCkpIHsKICAgICAgICAgICAgdmlzaXQoa2V5LCBbXSk7CiAgICAgICAgfQogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gSW5wdXQgcmVzb2x1dGlvbgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgcmVzb2x2ZUlucHV0cyhkZWYsIHByb3ZpZGVkKSB7CiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7fTsKICAgICAgICBpZiAoIWRlZi5pbnB1dHMpCiAgICAgICAgICAgIHJldHVybiBwcm92aWRlZDsKICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBwYXJhbURlZl0gb2YgT2JqZWN0LmVudHJpZXMoZGVmLmlucHV0cykpIHsKICAgICAgICAgICAgaWYgKG5hbWUgaW4gcHJvdmlkZWQpIHsKICAgICAgICAgICAgICAgIHJlc29sdmVkW25hbWVdID0gcHJvdmlkZWRbbmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1EZWYuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXNvbHZlZFtuYW1lXSA9IHBhcmFtRGVmLmRlZmF1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1EZWYucmVxdWlyZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgd29ya2Zsb3cgaW5wdXQgIiR7bmFtZX0iIG5vdCBwcm92aWRlZC5gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBQYXNzIHRocm91Z2ggYW55IGV4dHJhIGlucHV0cyBub3QgaW4gdGhlIHNjaGVtYQogICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm92aWRlZCkpIHsKICAgICAgICAgICAgaWYgKCEobmFtZSBpbiByZXNvbHZlZCkpIHsKICAgICAgICAgICAgICAgIHJlc29sdmVkW25hbWVdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc29sdmVkOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gT3V0cHV0IG1hcHBpbmcKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG1hcE91dHB1dHMoZGVmLCBydW4pIHsKICAgICAgICBjb25zdCBvdXRwdXRzID0ge307CiAgICAgICAgaWYgKCFkZWYub3V0cHV0cykKICAgICAgICAgICAgcmV0dXJuIG91dHB1dHM7CiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWFwcGluZ10gb2YgT2JqZWN0LmVudHJpZXMoZGVmLm91dHB1dHMpKSB7CiAgICAgICAgICAgIGNvbnN0IHN0ZXBSZXN1bHQgPSBydW4uc3RlcFJlc3VsdHMuZ2V0KG1hcHBpbmcuZnJvbVN0ZXApOwogICAgICAgICAgICBpZiAoIXN0ZXBSZXN1bHQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgc3dpdGNoIChtYXBwaW5nLnZhbHVlKSB7CiAgICAgICAgICAgICAgICBjYXNlICJvdXRwdXQiOgogICAgICAgICAgICAgICAgICAgIG91dHB1dHNbbmFtZV0gPSBzdGVwUmVzdWx0Lm91dHB1dDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInN0YXR1cyI6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0c1tuYW1lXSA9IHN0ZXBSZXN1bHQuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiZXJyb3IiOgogICAgICAgICAgICAgICAgICAgIG91dHB1dHNbbmFtZV0gPSBzdGVwUmVzdWx0LmVycm9yOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW25hbWVdID0gc3RlcFJlc3VsdC5vdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHB1dHM7CiAgICB9CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBIZWxwZXJzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBjcmVhdGVSdW4oZGVmLCBpbnB1dHMpIHsKICAgICAgICB0aGlzLnJ1bkNvdW50ZXIrKzsKICAgICAgICBjb25zdCBpZCA9IGB3cl8ke0RhdGUubm93KCl9XyR7dGhpcy5ydW5Db3VudGVyfWA7CiAgICAgICAgY29uc3Qgc3RlcFJlc3VsdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIGRlZi5zdGVwcykgewogICAgICAgICAgICBzdGVwUmVzdWx0cy5zZXQoc3RlcC5rZXksIHsKICAgICAgICAgICAgICAgIGtleTogc3RlcC5rZXksCiAgICAgICAgICAgICAgICBzdGF0dXM6ICJwZW5kaW5nIiwKICAgICAgICAgICAgICAgIHJldHJpZXNVc2VkOiAwLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaWQsCiAgICAgICAgICAgIGRlZmluaXRpb25OYW1lOiBkZWYubmFtZSwKICAgICAgICAgICAgZGVmaW5pdGlvblZlcnNpb246IGRlZi52ZXJzaW9uLAogICAgICAgICAgICBzdGF0dXM6ICJwZW5kaW5nIiwKICAgICAgICAgICAgaW5wdXRzLAogICAgICAgICAgICBzdGVwUmVzdWx0cywKICAgICAgICAgICAgb3V0cHV0czoge30sCiAgICAgICAgfTsKICAgIH0KICAgIGNvbXB1dGVSdW5TdGF0dXMocnVuKSB7CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFsuLi5ydW4uc3RlcFJlc3VsdHMudmFsdWVzKCldOwogICAgICAgIGNvbnN0IGFsbENvbXBsZXRlZCA9IHJlc3VsdHMuZXZlcnkoKHIpID0+IHIuc3RhdHVzID09PSAiY29tcGxldGVkIiB8fCByLnN0YXR1cyA9PT0gInNraXBwZWQiKTsKICAgICAgICBjb25zdCBhbnlGYWlsZWQgPSByZXN1bHRzLnNvbWUoKHIpID0+IHIuc3RhdHVzID09PSAiZmFpbGVkIik7CiAgICAgICAgY29uc3QgYW55Q29tcGxldGVkID0gcmVzdWx0cy5zb21lKChyKSA9PiByLnN0YXR1cyA9PT0gImNvbXBsZXRlZCIpOwogICAgICAgIGlmIChhbGxDb21wbGV0ZWQpCiAgICAgICAgICAgIHJldHVybiAiY29tcGxldGVkIjsKICAgICAgICBpZiAoYW55RmFpbGVkICYmIGFueUNvbXBsZXRlZCkKICAgICAgICAgICAgcmV0dXJuICJwYXJ0aWFsIjsKICAgICAgICBpZiAoYW55RmFpbGVkKQogICAgICAgICAgICByZXR1cm4gImZhaWxlZCI7CiAgICAgICAgcmV0dXJuICJjb21wbGV0ZWQiOwogICAgfQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gQ2xlYW51cAogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgYXN5bmMgc2h1dGRvd24oKSB7CiAgICAgICAgYXdhaXQgdGhpcy5vcmNoZXN0cmF0b3Iuc2h1dGRvd24oKTsKICAgICAgICBsb2cuaW5mbygiV29ya2Zsb3cgZW5naW5lIHNodXQgZG93biIpOwogICAgfQp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb252ZW5pZW5jZTogbG9hZCBhbmQgcGFyc2UgYSBzaW5nbGUgd29ya2Zsb3cgZmlsZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlV29ya2Zsb3dGaWxlKGZpbGVQYXRoKSB7CiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkQnJhaW5GaWxlKGZpbGVQYXRoKTsKICAgIHJldHVybiBKU09OLnBhcnNlKHJhdyk7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9d29ya2Zsb3cuanMubWFw","agents/autonomous.js":"LyoqCiAqIEF1dG9ub21vdXMgd29yayBsb29wIOKAlCB0aGUgbWlzc2luZyAiZmlyc3QgbnVkZ2UiIHRoYXQgbWFrZXMgdGhlIGFnZW50IHByb2FjdGl2ZS4KICoKICogVHdvIGVudHJ5IHBvaW50czoKICogICAxLiBUaW1lcjogZmlyZXMgNjBzIGFmdGVyIGJvb3QsIHRoZW4gZXZlcnkgMTUgbWluLiBDaGVja3MgYm9hcmQsIHNwYXducyBhZ2VudHMuCiAqICAgMi4gY29udGludWVBZnRlckJhdGNoKCk6IGNhbGxlZCB3aGVuIGEgYmF0Y2ggY29tcGxldGVzLCBkZWNpZGVzIHdoYXQncyBuZXh0LgogKgogKiBCb3RoIHVzZSBwbGFuQW5kU3Bhd24oKSB3aGljaDoKICogICAtIFJlYWRzIGJvYXJkIHN0YXRlIGRpcmVjdGx5IChubyBIVFRQLCBubyBTU0UsIG5vIHNlc3Npb24gdmFsaWRhdGlvbikKICogICAtIEFza3MgdGhlIExMTSB0byBwaWNrIHRhc2tzIGFuZCB3cml0ZSBhZ2VudCBwcm9tcHRzCiAqICAgLSBQYXJzZXMgW0FHRU5UX1JFUVVFU1RdIGJsb2NrcyBmcm9tIHRoZSByZXNwb25zZQogKiAgIC0gU3Bhd25zIGFnZW50cyB2aWEgc3VibWl0VGFzaygpCiAqLwppbXBvcnQgeyBnZXRCb2FyZFByb3ZpZGVyIH0gZnJvbSAiLi4vYm9hcmQvcHJvdmlkZXIuanMiOwppbXBvcnQgeyBzdWJtaXRUYXNrIH0gZnJvbSAiLi9pbmRleC5qcyI7CmltcG9ydCB7IGFjdGl2ZUFnZW50Q291bnQsIGdlbmVyYXRlQnJpZGdlUmVwb3J0IH0gZnJvbSAiLi9zcGF3bi5qcyI7CmltcG9ydCB7IGNvbW1pdEFnZW50QmF0Y2ggfSBmcm9tICIuL2NvbW1pdC5qcyI7CmltcG9ydCB7IGxpc3RUYXNrcyBhcyBsaXN0QWdlbnRUYXNrcyB9IGZyb20gIi4vc3RvcmUuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNoZWNrUmVzZW5kSW5ib3ggfSBmcm9tICIuLi9yZXNlbmQvaW5ib3guanMiOwppbXBvcnQgeyBwdXNoTm90aWZpY2F0aW9uIH0gZnJvbSAiLi4vZ29hbHMvbm90aWZpY2F0aW9ucy5qcyI7CmltcG9ydCB7IGNvbXBsZXRlQ2hhdCB9IGZyb20gIi4uL2xsbS9jb21wbGV0ZS5qcyI7CmltcG9ydCB7IExMTUVycm9yIH0gZnJvbSAiLi4vbGxtL2Vycm9ycy5qcyI7CmltcG9ydCB7IHJlc29sdmVQcm92aWRlciB9IGZyb20gIi4uL3NldHRpbmdzLmpzIjsKaW1wb3J0IHsgcmVzb2x2ZUVudiwgZ2V0SW5zdGFuY2VOYW1lLCBnZXRJbnN0YW5jZU5hbWVMb3dlciB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgcmVmbGVjdE9uU2Vzc2lvbiB9IGZyb20gIi4vcmVmbGVjdGlvbi5qcyI7CmltcG9ydCB7IFRhc2tDb29sZG93bk1hbmFnZXIgfSBmcm9tICIuL2Nvb2xkb3duLmpzIjsKaW1wb3J0IHsgY2hlY2tEZWR1cCB9IGZyb20gIi4vZGVkdXAtZ3VhcmQuanMiOwppbXBvcnQgeyByZWNvcmRBdXRvbm9tb3VzQWN0aW9uLCByZWNvcmREZWR1cEJsb2NrIH0gZnJvbSAiLi4vbWV0cmljcy9maXJld2FsbC1tZXRyaWNzLmpzIjsKaW1wb3J0IHsgZ2V0Q2FwYWJpbGl0eVJlZ2lzdHJ5IH0gZnJvbSAiLi4vY2FwYWJpbGl0aWVzL2luZGV4LmpzIjsKaW1wb3J0IHsgZ2V0UHJlc3N1cmVJbnRlZ3JhdG9yIH0gZnJvbSAiLi4vcHVsc2UvcHJlc3N1cmUuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImF1dG9ub21vdXMiKTsKLy8g4pSA4pSA4pSAIENvbmZpZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29uc3QgQVVUT05PTU9VU19JTlRFUlZBTF9NUyA9IDYwICogNjAgKiAxMDAwOyAvLyA2MCBtaW4gKGNvbWEgZmFpbHNhZmUg4oCUIHByaW1hcnkgdHJpZ2dlciBpcyBub3cgdGVuc2lvbi1iYXNlZCkKY29uc3QgRklSU1RfQ0hFQ0tfREVMQVlfTVMgPSA2MCAqIDEwMDA7IC8vIDYwcyBhZnRlciBib290CmNvbnN0IE1BWF9DT05USU5VQVRJT05fUk9VTkRTID0gNTsKY29uc3QgTUFYX0FHRU5UU19QRVJfUk9VTkQgPSA1OwovKiogTW9kZWwgZm9yIHRoZSBwbGFubmVyIExMTSDigJQgbmVlZHMgdG8gYmUgY2FwYWJsZSBlbm91Z2ggZm9yIHN0cnVjdHVyZWQgb3V0cHV0LiAqLwpjb25zdCBQTEFOTkVSX01PREVMID0gImFudGhyb3BpYy9jbGF1ZGUtc29ubmV0LTQiOwovLyDilIDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmxldCB0aW1lciA9IG51bGw7CmxldCBmaXJzdENoZWNrVGltZXIgPSBudWxsOwpjb25zdCBjb250aW51YXRpb25Sb3VuZHMgPSBuZXcgTWFwKCk7CmxldCBhdXRvbm9tb3VzU2Vzc2lvbkNvdW50ZXIgPSAwOwovKiogR3VhcmQgYWdhaW5zdCBjb25jdXJyZW50IHBsYW5BbmRTcGF3biBjYWxscyAodGltZXIgdnMgY29udGludWF0aW9uIHJhY2UpLiAqLwpsZXQgcGxhbm5pbmdJblByb2dyZXNzID0gZmFsc2U7Ci8qKgogKiBQZXItc2Vzc2lvbiBjdW11bGF0aXZlIGZhaWx1cmUgY291bnRlci4KICogSWYgYSBzZXNzaW9uIGFjY3VtdWxhdGVzIHRvbyBtYW55IHRvdGFsIGZhaWx1cmVzIGFjcm9zcyBhbGwgY29udGludWF0aW9uIHJvdW5kcywKICogc3RvcCB0aGUgc2Vzc2lvbiBlbnRpcmVseS4gVGhpcyBwcmV2ZW50cyB0aGUgc2NlbmFyaW8gd2hlcmUgbWl4ZWQgc3VjY2Vzcy9mYWlsdXJlCiAqIGJhdGNoZXMga2VlcCB0aGUgc2Vzc2lvbiBhbGl2ZSB3aGlsZSByZXBlYXRlZGx5IHJldHJ5aW5nIHRoZSBzYW1lIGZhaWxpbmcgdGFza3MuCiAqLwpjb25zdCBzZXNzaW9uQ3VtdWxhdGl2ZUZhaWx1cmVzID0gbmV3IE1hcCgpOwpjb25zdCBNQVhfU0VTU0lPTl9DVU1VTEFUSVZFX0ZBSUxVUkVTID0gODsKLyoqIFBlcnNpc3RlbnQgY29vbGRvd24gdHJhY2tlciDigJQgc3Vydml2ZXMgcmVzdGFydHMsIHNoYXJlZCBhY3Jvc3MgbW9kdWxlcy4gKi8KY29uc3QgY29vbGRvd25NYW5hZ2VyID0gVGFza0Nvb2xkb3duTWFuYWdlci5nZXRJbnN0YW5jZSgpOwovKioKICogUGxhbm5lciBza2lwIGNhY2hlIOKAlCB0cmFja3MgaXRlbXMgdGhlIExMTSBwbGFubmVyIHJldmlld2VkIGFuZCBkZWNpZGVkCiAqIHdlcmVuJ3QgcmVhZHkuIEF2b2lkcyByZS1jYWxsaW5nIHRoZSBMTE0gKH4yIG1pbiByb3VuZC10cmlwKSBmb3IgdGhlIHNhbWUKICogdW5jaGFuZ2VkIGl0ZW1zLiBJdGVtcyBhcmUgcmUtZXZhbHVhdGVkIGlmIHRoZWlyIGB1cGRhdGVkQXRgIGNoYW5nZXMgb3IKICogYWZ0ZXIgdGhlIGNvb2xkb3duIGV4cGlyZXMuCiAqLwpjb25zdCBwbGFubmVyU2tpcENhY2hlID0gbmV3IE1hcCgpOwpjb25zdCBQTEFOTkVSX1NLSVBfQ09PTERPV05fTVMgPSAyICogNjAgKiA2MCAqIDEwMDA7IC8vIDIgaG91cnMKLyoqCiAqIE1heCBhZ2VudHMgdGhlIHBsYW5uZXIgd2lsbCBhbGxvdyBiZWZvcmUgc2tpcHBpbmcgYSB3b3JrIGNoZWNrLgogKiBUaGUgcGxhbm5lciBjYW4gc3RpbGwgc3Bhd24gMS0zIGFnZW50cyBwZXIgcm91bmQsIHNvIGFjdHVhbCBwZWFrIG1heQogKiBicmllZmx5IGV4Y2VlZCB0aGlzIHdoaWxlIGEgYmF0Y2ggaXMgc3RhcnRpbmcgdXAuCiAqLwpjb25zdCBNQVhfQ09OQ1VSUkVOVF9BR0VOVFMgPSBwYXJzZUludChyZXNvbHZlRW52KCJNQVhfQ09OQ1VSUkVOVF9BR0VOVFMiKSA/PyAiIiwgMTApIHx8IDM7Ci8qKgogKiBNYXAgYWdlbnQgbGFiZWwg4oaSIGJvYXJkIHRhc2tJZCwgc28gd2UgY2FuIG1hcmsgdGhlIGJvYXJkIHRhc2sgYXMgZmFpbGVkCiAqIHdoZW4gdGhlIGFnZW50IGZhaWxzIGFuZCBhdm9pZCBpbW1lZGlhdGVseSByZS1hc3NpZ25pbmcgaXQuCiAqLwpjb25zdCBsYWJlbFRvQm9hcmRUYXNrSWQgPSBuZXcgTWFwKCk7Ci8qKgogKiBDaXJjdWl0IGJyZWFrZXIgZm9yIExMTSBjcmVkaXQgZXhoYXVzdGlvbi4KICogV2hlbiBhIGNyZWRpdCBlcnJvciBpcyBkZXRlY3RlZCwgYXV0b25vbW91cyB3b3JrIHBhdXNlcyB1bnRpbCB0aGUgY29vbGRvd24gZXhwaXJlcy4KICogVGhpcyBwcmV2ZW50cyBidXJuaW5nIHRocm91Z2ggdGhlIDE1LW1pbiBjeWNsZSByZXBlYXRlZGx5IGhpdHRpbmcgYSBkZWFkIEFQSS4KICovCmxldCBjcmVkaXRDaXJjdWl0QnJlYWtlclVudGlsID0gMDsKY29uc3QgQ1JFRElUX0NJUkNVSVRfQlJFQUtFUl9NUyA9IDMwICogNjBfMDAwOyAvLyAzMCBtaW51dGVzCi8vIOKUgOKUgOKUgCBCYWNrbG9nIFByb21vdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIEF1dG8tcHJvbW90ZSAiYmFja2xvZyIgaXRlbXMgdG8gInRvZG8iIHNvIHRoZSBwbGFubmVyIGNhbiBwaWNrIHRoZW0gdXAuCiAqCiAqIFByb21vdGlvbiBjcml0ZXJpYToKICogLSBIYXMgYSBkZXNjcmlwdGlvbiAoc3BlYyBleGlzdHMsIG5vdCBqdXN0IGEgdGl0bGUpCiAqIC0gTm90IG9uIGNvb2xkb3duIChkb24ndCBwcm9tb3RlIGl0ZW1zIHRoYXQga2VlcCBmYWlsaW5nKQogKgogKiBUaGlzIGNsb3NlcyB0aGUgZ2FwIHdoZXJlIGl0ZW1zIHNlZWRlZCBpbnRvICJiYWNrbG9nIiBzdGF0ZSB3b3VsZCBzaXQKICogZm9yZXZlciBiZWNhdXNlIHRoZSBwbGFubmVyIG9ubHkgcGlja3MgdXAgInRvZG8iIGl0ZW1zLgogKi8KYXN5bmMgZnVuY3Rpb24gcHJvbW90ZUJhY2tsb2dJdGVtcyhzdG9yZSwgdGFza3MpIHsKICAgIGNvbnN0IGJhY2tsb2cgPSB0YXNrcy5maWx0ZXIoKHQpID0+IHQuc3RhdGUgPT09ICJiYWNrbG9nIiAmJgogICAgICAgIHQuZGVzY3JpcHRpb24gJiYgdC5kZXNjcmlwdGlvbi5sZW5ndGggPiAwICYmCiAgICAgICAgIWNvb2xkb3duTWFuYWdlci5zaG91bGRTa2lwKHQuaWQpKTsKICAgIGZvciAoY29uc3QgdGFzayBvZiBiYWNrbG9nKSB7CiAgICAgICAgYXdhaXQgc3RvcmUudXBkYXRlKHRhc2suaWQsIHsgc3RhdGU6ICJ0b2RvIiB9KTsKICAgICAgICB0YXNrLnN0YXRlID0gInRvZG8iOyAvLyBVcGRhdGUgaW4tcGxhY2Ugc28gdGhlIGZpbHRlciBiZWxvdyBzZWVzIGl0CiAgICAgICAgbG9nLmluZm8oYFByb21vdGVkICR7dGFzay5pZGVudGlmaWVyfSBmcm9tIGJhY2tsb2cg4oaSIHRvZG9gLCB7CiAgICAgICAgICAgIGlkZW50aWZpZXI6IHRhc2suaWRlbnRpZmllciwKICAgICAgICAgICAgdGl0bGU6IHRhc2sudGl0bGUsCiAgICAgICAgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhdXRvbm9tb3VzIiwKICAgICAgICAgICAgc3VtbWFyeTogYFByb21vdGVkICR7dGFzay5pZGVudGlmaWVyfSBmcm9tIGJhY2tsb2cg4oaSIHRvZG86ICIke3Rhc2sudGl0bGV9ImAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgIHJlYXNvbjogImJhY2tsb2cgYXV0by1wcm9tb3Rpb24iLAogICAgICAgIH0pOwogICAgfQp9Ci8vIOKUgOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogU3RhcnQgdGhlIGF1dG9ub21vdXMgd29yayB0aW1lci4gSWRlbXBvdGVudC4KICogRmlyc3QgY2hlY2sgZmlyZXMgNjBzIGFmdGVyIGJvb3QgKG5vdCBpbW1lZGlhdGVseSDigJQgZ2l2ZXMgc3lzdGVtIHRpbWUgdG8gaW5pdCkuCiAqIFRoZW4gcmVwZWF0cyBldmVyeSAxNSBtaW4uCiAqLwpleHBvcnQgZnVuY3Rpb24gc3RhcnRBdXRvbm9tb3VzVGltZXIoaW50ZXJ2YWxNcykgewogICAgaWYgKHRpbWVyKQogICAgICAgIHJldHVybjsKICAgIGNvbnN0IGludGVydmFsID0gaW50ZXJ2YWxNcyA/PyBBVVRPTk9NT1VTX0lOVEVSVkFMX01TOwogICAgLy8gSW5pdGlhbGl6ZSBjb29sZG93biBtYW5hZ2VyIChsb2FkcyBwZXJzaXN0ZWQgc3RhdGUgZnJvbSBkaXNrKQogICAgY29vbGRvd25NYW5hZ2VyLmluaXQoKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgbG9nLndhcm4oYENvb2xkb3duIG1hbmFnZXIgaW5pdCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApOwogICAgfSk7CiAgICAvLyBGaXJlIGZpcnN0IGNoZWNrIHNob3J0bHkgYWZ0ZXIgYm9vdAogICAgZmlyc3RDaGVja1RpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgZmlyc3RDaGVja1RpbWVyID0gbnVsbDsKICAgICAgICBsb2cuaW5mbyhgIEZpcnN0IHdvcmsgY2hlY2sgc3RhcnRpbmcuLi5gKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBjaGVja0ZvcldvcmsoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGxvZy5lcnJvcihgIEZpcnN0IGNoZWNrIGVycm9yOiAke21zZ31gKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhdXRvbm9tb3VzIiwgc3VtbWFyeTogYEZpcnN0IGNoZWNrIGVycm9yOiAke21zZ31gLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICIxNS1taW4gYXV0b25vbW91cyBwbGFubmVyIGN5Y2xlIiB9KTsKICAgICAgICB9CiAgICB9LCBGSVJTVF9DSEVDS19ERUxBWV9NUyk7CiAgICAvLyBUaGVuIHJlcGVhdCBvbiBpbnRlcnZhbAogICAgdGltZXIgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYXdhaXQgY2hlY2tGb3JXb3JrKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2cuZXJyb3IoYCBXb3JrIGNoZWNrIGVycm9yOiAke21zZ31gKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhdXRvbm9tb3VzIiwgc3VtbWFyeTogYFdvcmsgY2hlY2sgZXJyb3I6ICR7bXNnfWAsIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogIjE1LW1pbiBhdXRvbm9tb3VzIHBsYW5uZXIgY3ljbGUiIH0pOwogICAgICAgIH0KICAgIH0sIGludGVydmFsKTsKICAgIGNvbnN0IG1pbnMgPSBNYXRoLnJvdW5kKGludGVydmFsIC8gNjBfMDAwKTsKICAgIGxvZy5pbmZvKGBBdXRvbm9tb3VzIHdvcms6IGZpcnN0IGNoZWNrIGluICR7RklSU1RfQ0hFQ0tfREVMQVlfTVMgLyAxMDAwfXMsIHRoZW4gZXZlcnkgJHttaW5zfSBtaW5gKTsKfQovKiogU3RvcCB0aGUgYXV0b25vbW91cyB0aW1lci4gKi8KZXhwb3J0IGZ1bmN0aW9uIHN0b3BBdXRvbm9tb3VzVGltZXIoKSB7CiAgICBpZiAoZmlyc3RDaGVja1RpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KGZpcnN0Q2hlY2tUaW1lcik7CiAgICAgICAgZmlyc3RDaGVja1RpbWVyID0gbnVsbDsKICAgIH0KICAgIGlmICh0aW1lcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIHRpbWVyID0gbnVsbDsKICAgIH0KICAgIC8vIEZsdXNoIGNvb2xkb3duIHN0YXRlIHRvIGRpc2sKICAgIGNvb2xkb3duTWFuYWdlci5zaHV0ZG93bigpOwp9Ci8qKiBJcyB0aGUgYXV0b25vbW91cyB0aW1lciBydW5uaW5nPyAqLwpleHBvcnQgZnVuY3Rpb24gaXNBdXRvbm9tb3VzVGltZXJSdW5uaW5nKCkgewogICAgcmV0dXJuIHRpbWVyICE9PSBudWxsOwp9Ci8qKgogKiBDYWxsZWQgYnkgUHJlc3N1cmVJbnRlZ3JhdG9yIHdoZW4gdGVuc2lvbiBleGNlZWRzIHRocmVzaG9sZC4KICogV3JhcHMgY2hlY2tGb3JXb3JrKCkgd2l0aCB0aGUgZXhpc3RpbmcgcGxhbm5pbmdJblByb2dyZXNzIGd1YXJkLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyaWdnZXJQdWxzZSgpIHsKICAgIGlmIChwbGFubmluZ0luUHJvZ3Jlc3MpIHsKICAgICAgICBsb2cuaW5mbyhgUHVsc2UgdHJpZ2dlciBza2lwcGVkOiBwbGFubmluZyBhbHJlYWR5IGluIHByb2dyZXNzYCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGFjdGl2ZUFnZW50Q291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9BR0VOVFMpIHsKICAgICAgICBsb2cuaW5mbyhgUHVsc2UgdHJpZ2dlciBza2lwcGVkOiBhdCBjYXBhY2l0eSAoJHthY3RpdmVBZ2VudENvdW50KCl9LyR7TUFYX0NPTkNVUlJFTlRfQUdFTlRTfSlgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBsb2cuaW5mbyhgUHVsc2UgdHJpZ2dlcjogY2hlY2tpbmcgZm9yIHdvcmsuLi5gKTsKICAgIGF3YWl0IGNoZWNrRm9yV29yaygpOwp9Ci8qKiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgYXV0b25vbW91cyB3b3JrIGxvb3AncyBjdXJyZW50IHN0YXRlLiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0QXV0b25vbW91c1N0YXR1cygpIHsKICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25zID0gWy4uLmNvbnRpbnVhdGlvblJvdW5kcy5rZXlzKCldOwogICAgY29uc3QgYWN0aXZlQ29vbGRvd25zID0gY29vbGRvd25NYW5hZ2VyLmxpc3RBY3RpdmVDb29sZG93bnMoKS5tYXAoKGMpID0+ICh7CiAgICAgICAgdGFza0lkOiBjLnRhc2tJZCwKICAgICAgICBsYWJlbDogYy5sYWJlbCwKICAgICAgICBmYWlsdXJlQ291bnQ6IGMuZmFpbHVyZUNvdW50LAogICAgICAgIHJlbWFpbmluZ01pbjogTWF0aC5yb3VuZChjLnJlbWFpbmluZ01zIC8gNjBfMDAwKSwKICAgIH0pKTsKICAgIGNvbnN0IGNiUmVtYWluID0gTWF0aC5tYXgoMCwgY3JlZGl0Q2lyY3VpdEJyZWFrZXJVbnRpbCAtIERhdGUubm93KCkpOwogICAgcmV0dXJuIHsKICAgICAgICB0aW1lclJ1bm5pbmc6IHRpbWVyICE9PSBudWxsLAogICAgICAgIGludGVydmFsTXM6IEFVVE9OT01PVVNfSU5URVJWQUxfTVMsCiAgICAgICAgZmlyc3RDaGVja0RlbGF5TXM6IEZJUlNUX0NIRUNLX0RFTEFZX01TLAogICAgICAgIGNyZWRpdENpcmN1aXRCcmVha2VyQWN0aXZlOiBEYXRlLm5vdygpIDwgY3JlZGl0Q2lyY3VpdEJyZWFrZXJVbnRpbCwKICAgICAgICBjcmVkaXRDaXJjdWl0QnJlYWtlclJlbWFpbmluZ01pbjogTWF0aC5jZWlsKGNiUmVtYWluIC8gNjBfMDAwKSwKICAgICAgICBwbGFubmluZ0luUHJvZ3Jlc3MsCiAgICAgICAgYWN0aXZlQWdlbnRzOiBhY3RpdmVBZ2VudENvdW50KCksCiAgICAgICAgbWF4Q29uY3VycmVudEFnZW50czogTUFYX0NPTkNVUlJFTlRfQUdFTlRTLAogICAgICAgIGFjdGl2ZVNlc3Npb25zLAogICAgICAgIGNvb2xkb3duczogYWN0aXZlQ29vbGRvd25zLAogICAgICAgIHBsYW5uZXJTa2lwcGVkSXRlbXM6IHBsYW5uZXJTa2lwQ2FjaGUuc2l6ZSwKICAgICAgICBwdWxzZTogZ2V0UHJlc3N1cmVJbnRlZ3JhdG9yKCk/LmdldFN0YXR1cygpID8/IG51bGwsCiAgICB9Owp9Ci8qKgogKiBDYWxsZWQgYnkgb25CYXRjaENvbXBsZXRlIHdoZW4gYWxsIGFnZW50cyBpbiBhIHNlc3Npb24gZmluaXNoLgogKiBDb21taXRzIHdvcmssIHRoZW4gY2hlY2tzIGlmIHRoZXJlJ3MgbW9yZSB0byBkby4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250aW51ZUFmdGVyQmF0Y2goc2Vzc2lvbklkLCByZXN1bHRzKSB7CiAgICAvLyBDb21taXQgYWdlbnQgd29yayBhcyBhIGxvZ2ljYWwgYmF0Y2gKICAgIGNvbnN0IHJvdW5kID0gKGNvbnRpbnVhdGlvblJvdW5kcy5nZXQoc2Vzc2lvbklkKSA/PyAwKSArIDE7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGNvbW1pdFJlc3VsdCA9IGF3YWl0IGNvbW1pdEFnZW50QmF0Y2gocmVzdWx0cywgcm91bmQpOwogICAgICAgIGlmIChjb21taXRSZXN1bHQub2sgJiYgY29tbWl0UmVzdWx0Lm1lc3NhZ2UgIT09ICJObyBjaGFuZ2VzIHRvIGNvbW1pdCIgJiYgY29tbWl0UmVzdWx0Lm1lc3NhZ2UgIT09ICJObyBzdGFnZWQgY2hhbmdlcyB0byBjb21taXQiKSB7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAic3lzdGVtIiwgc3VtbWFyeTogY29tbWl0UmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYXV0b25vbW91cyIsIHN1bW1hcnk6IGBDb21taXQgZXJyb3I6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogImJhdGNoIGNvbnRpbnVhdGlvbiBjb21taXQiIH0pOwogICAgfQogICAgLy8gUmVjb3JkIGZhaWxlZCBhZ2VudCBsYWJlbHMg4oaSIGJvYXJkIHRhc2sgY29vbGRvd24gKGVzY2FsYXRpbmcsIHBlcnNpc3RlZCkKICAgIGNvbnN0IGJhdGNoRmFpbGVkQ291bnQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICJmYWlsZWQiKS5sZW5ndGg7CiAgICBmb3IgKGNvbnN0IHIgb2YgcmVzdWx0cykgewogICAgICAgIGlmIChyLnN0YXR1cyA9PT0gImZhaWxlZCIpIHsKICAgICAgICAgICAgY29uc3QgYm9hcmRUYXNrSWQgPSBsYWJlbFRvQm9hcmRUYXNrSWQuZ2V0KHIubGFiZWwpOwogICAgICAgICAgICBpZiAoYm9hcmRUYXNrSWQpIHsKICAgICAgICAgICAgICAgIGNvb2xkb3duTWFuYWdlci5yZWNvcmRGYWlsdXJlKGJvYXJkVGFza0lkLCByLmxhYmVsKTsKICAgICAgICAgICAgICAgIGNvbnN0IGZhaWx1cmVDb3VudCA9IGNvb2xkb3duTWFuYWdlci5nZXRGYWlsdXJlQ291bnQoYm9hcmRUYXNrSWQpOwogICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVDb3VudCA+PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCcmlkZ2VSZXBvcnQoYm9hcmRUYXNrSWQsIHIubGFiZWwsIGZhaWx1cmVDb3VudCkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhYmVsVG9Cb2FyZFRhc2tJZC5kZWxldGUoci5sYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyBUcmFjayBjdW11bGF0aXZlIGZhaWx1cmVzIGFjcm9zcyBhbGwgcm91bmRzIGZvciB0aGlzIHNlc3Npb24KICAgIGlmIChiYXRjaEZhaWxlZENvdW50ID4gMCkgewogICAgICAgIGNvbnN0IHByZXZDdW11bGF0aXZlID0gc2Vzc2lvbkN1bXVsYXRpdmVGYWlsdXJlcy5nZXQoc2Vzc2lvbklkKSA/PyAwOwogICAgICAgIGNvbnN0IG5ld0N1bXVsYXRpdmUgPSBwcmV2Q3VtdWxhdGl2ZSArIGJhdGNoRmFpbGVkQ291bnQ7CiAgICAgICAgc2Vzc2lvbkN1bXVsYXRpdmVGYWlsdXJlcy5zZXQoc2Vzc2lvbklkLCBuZXdDdW11bGF0aXZlKTsKICAgICAgICBpZiAobmV3Q3VtdWxhdGl2ZSA+PSBNQVhfU0VTU0lPTl9DVU1VTEFUSVZFX0ZBSUxVUkVTKSB7CiAgICAgICAgICAgIGxvZy5pbmZvKGAgU2Vzc2lvbiAke3Nlc3Npb25JZH0gaGl0ICR7bmV3Q3VtdWxhdGl2ZX0gY3VtdWxhdGl2ZSBmYWlsdXJlcyAobGltaXQgJHtNQVhfU0VTU0lPTl9DVU1VTEFUSVZFX0ZBSUxVUkVTfSkg4oCUIHN0b3BwaW5nYCk7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogImF1dG9ub21vdXMiLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYFNlc3Npb24gaGl0ICR7bmV3Q3VtdWxhdGl2ZX0gY3VtdWxhdGl2ZSBmYWlsdXJlcyDigJQgc3RvcHBpbmdgLAogICAgICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJBVVRPTk9NT1VTIiwKICAgICAgICAgICAgICAgIHJlYXNvbjogImN1bXVsYXRpdmUgZmFpbHVyZSBsaW1pdCByZWFjaGVkIiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVhdGlvblJvdW5kcy5kZWxldGUoc2Vzc2lvbklkKTsKICAgICAgICAgICAgc2Vzc2lvbkN1bXVsYXRpdmVGYWlsdXJlcy5kZWxldGUoc2Vzc2lvbklkKTsKICAgICAgICAgICAgYXdhaXQgcmVmbGVjdE9uU2Vzc2lvbih7IHNlc3Npb25JZCwgcm91bmQsIHJlc3VsdHMsIGlzRmluYWw6IHRydWUgfSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIC8vIElmIGFsbCBhZ2VudHMgaW4gdGhlIGJhdGNoIGZhaWxlZCwgc3RvcCBjb250aW51YXRpb24g4oCUIGRvbid0IGtlZXAgdHJ5aW5nCiAgICBjb25zdCBhbGxGYWlsZWQgPSByZXN1bHRzLmV2ZXJ5KChyKSA9PiByLnN0YXR1cyA9PT0gImZhaWxlZCIpOwogICAgaWYgKGFsbEZhaWxlZCkgewogICAgICAgIGxvZy5pbmZvKGAgQWxsICR7cmVzdWx0cy5sZW5ndGh9IGFnZW50KHMpIGluIGJhdGNoIGZhaWxlZCDigJQgc3RvcHBpbmcgY29udGludWF0aW9uIGZvciBzZXNzaW9uICR7c2Vzc2lvbklkfWApOwogICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYXV0b25vbW91cyIsIHN1bW1hcnk6IGBBbGwgYWdlbnRzIGluIGJhdGNoIGZhaWxlZCDigJQgc3RvcHBpbmcgY29udGludWF0aW9uYCwgYWN0aW9uTGFiZWw6ICJBVVRPTk9NT1VTIiwgcmVhc29uOiAiYWxsLWZhaWx1cmUgYmF0Y2ggaGFsdCIgfSk7CiAgICAgICAgY29udGludWF0aW9uUm91bmRzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgIHNlc3Npb25DdW11bGF0aXZlRmFpbHVyZXMuZGVsZXRlKHNlc3Npb25JZCk7CiAgICAgICAgYXdhaXQgcmVmbGVjdE9uU2Vzc2lvbih7IHNlc3Npb25JZCwgcm91bmQsIHJlc3VsdHMsIGlzRmluYWw6IHRydWUgfSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAvLyBDaGVjayByb3VuZCBsaW1pdAogICAgaWYgKHJvdW5kID4gTUFYX0NPTlRJTlVBVElPTl9ST1VORFMpIHsKICAgICAgICBsb2cuaW5mbyhgIEhpdCAke01BWF9DT05USU5VQVRJT05fUk9VTkRTfS1yb3VuZCBsaW1pdCBmb3Igc2Vzc2lvbiAke3Nlc3Npb25JZH0sIHBhdXNpbmdgKTsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImF1dG9ub21vdXMiLCBzdW1tYXJ5OiBgSGl0ICR7TUFYX0NPTlRJTlVBVElPTl9ST1VORFN9LXJvdW5kIGxpbWl0LCBwYXVzaW5nYCwgYWN0aW9uTGFiZWw6ICJBVVRPTk9NT1VTIiwgcmVhc29uOiAicm91bmQgbGltaXQgcmVhY2hlZCIgfSk7CiAgICAgICAgY29udGludWF0aW9uUm91bmRzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgIHNlc3Npb25DdW11bGF0aXZlRmFpbHVyZXMuZGVsZXRlKHNlc3Npb25JZCk7CiAgICAgICAgYXdhaXQgcmVmbGVjdE9uU2Vzc2lvbih7IHNlc3Npb25JZCwgcm91bmQsIHJlc3VsdHMsIGlzRmluYWw6IHRydWUgfSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb250aW51YXRpb25Sb3VuZHMuc2V0KHNlc3Npb25JZCwgcm91bmQpOwogICAgY29uc3QgYmF0Y2hTdW1tYXJ5ID0gcmVzdWx0cy5tYXAoKHIpID0+IGAke3IubGFiZWx9OiAke3Iuc3RhdHVzfWApLmpvaW4oIiwgIik7CiAgICAvLyBGaXhlZCAycyBwYXVzZSBiZXR3ZWVuIHJvdW5kcyDigJQgZW5vdWdoIHRvIHByZXZlbnQgcmFwaWQgY3ljbGluZywKICAgIC8vIHNob3J0IGVub3VnaCB0byBrZWVwIHRoZSBjbHVzdGVyIHJlc3BvbnNpdmUuIEd1YXJkcyAoZGVkdXAsIGNvb2xkb3duLAogICAgLy8gY3VtdWxhdGl2ZSBmYWlsdXJlIGxpbWl0KSBoYW5kbGUgcnVuYXdheSBzY2VuYXJpb3MsIG5vdCB0aGUgZGVsYXkuCiAgICBjb25zdCBjb250aW51YXRpb25EZWxheU1zID0gMjAwMDsKICAgIGNvbnN0IG1zZyA9IGBCYXRjaCBkb25lICgke2JhdGNoU3VtbWFyeX0pLiBDaGVja2luZyBmb3IgbW9yZSB3b3JrIGluICR7TWF0aC5yb3VuZChjb250aW51YXRpb25EZWxheU1zIC8gMTAwMCl9cyAocm91bmQgJHtyb3VuZH0vJHtNQVhfQ09OVElOVUFUSU9OX1JPVU5EU30pLi4uYDsKICAgIGxvZy5pbmZvKGAgJHttc2d9YCk7CiAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImF1dG9ub21vdXMiLCBzdW1tYXJ5OiBtc2csIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogYGJhdGNoIGNvbnRpbnVhdGlvbiByb3VuZCAke3JvdW5kfWAgfSk7CiAgICBwdXNoTm90aWZpY2F0aW9uKHsgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIHNvdXJjZTogImF1dG9ub21vdXMiLCBtZXNzYWdlOiBtc2cgfSk7CiAgICAvLyBCdWlsZCBjb250ZXh0IGZyb20gYmF0Y2ggcmVzdWx0cwogICAgY29uc3QgcmVzdWx0U3VtbWFyeSA9IHJlc3VsdHMKICAgICAgICAubWFwKChyKSA9PiBgLSAke3IubGFiZWx9OiAke3Iuc3RhdHVzfWApCiAgICAgICAgLmpvaW4oIlxuIik7CiAgICAvLyBTa2lwIExMTS1iYXNlZCByZWZsZWN0aW9uIG9uIGludGVybWVkaWF0ZSByb3VuZHMg4oCUIHNhdmVzIDMwLTYwcyBwZXIgcm91bmQuCiAgICAvLyBGaW5hbCByZWZsZWN0aW9ucyBzdGlsbCBydW4gYXQgdGhlIGVhcmx5LWV4aXQgcG9pbnRzIGFib3ZlIChhbGwtZmFpbGVkLCBjdW11bGF0aXZlIGxpbWl0LCByb3VuZCBsaW1pdCkuCiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBjb250aW51YXRpb25EZWxheU1zKSk7CiAgICBjb25zdCBlbmhhbmNlZENvbnRleHQgPSBgSnVzdCBjb21wbGV0ZWQgcm91bmQgJHtyb3VuZH06XG4ke3Jlc3VsdFN1bW1hcnl9YDsKICAgIGF3YWl0IHBsYW5BbmRTcGF3bihzZXNzaW9uSWQsIGVuaGFuY2VkQ29udGV4dCk7Cn0KLyoqIFJlc2V0IGNvbnRpbnVhdGlvbiB0cmFja2luZyBmb3IgYSBzZXNzaW9uLiAqLwpleHBvcnQgZnVuY3Rpb24gcmVzZXRDb250aW51YXRpb24oc2Vzc2lvbklkKSB7CiAgICBjb250aW51YXRpb25Sb3VuZHMuZGVsZXRlKHNlc3Npb25JZCk7CiAgICBzZXNzaW9uQ3VtdWxhdGl2ZUZhaWx1cmVzLmRlbGV0ZShzZXNzaW9uSWQpOwp9Ci8vIOKUgOKUgOKUgCBDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogUGVyaW9kaWMgY2hlY2s6IGlmIGFnZW50cyBhcmUgaWRsZSBhbmQgdGhlcmUncyBhY3Rpb25hYmxlIHdvcmssIHNwYXduIGFnZW50cy4KICogRXhwb3J0ZWQgc28gUHJlc3N1cmVJbnRlZ3JhdG9yIGNhbiBjYWxsIGl0IGRpcmVjdGx5IG9uIHB1bHNlLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrRm9yV29yaygpIHsKICAgIC8vIFBpZ2d5YmFjazogY2hlY2sgUmVzZW5kIGluYm94IHdoaWxlIHdlJ3JlIGFscmVhZHkgYXdha2UuCiAgICAvLyBEZWJvdW5jZWQgaW50ZXJuYWxseSDigJQgY2hlYXAgbm8tb3AgaWYgY2hlY2tlZCByZWNlbnRseSBvciBub3QgY29uZmlndXJlZC4KICAgIGNoZWNrUmVzZW5kSW5ib3goKS5jYXRjaCgoKSA9PiB7IH0pOwogICAgLy8gQ2lyY3VpdCBicmVha2VyOiBza2lwIGlmIGNyZWRpdHMgYXJlIGV4aGF1c3RlZCAoYXZvaWQgaGFtbWVyaW5nIGEgZGVhZCBBUEkpCiAgICBpZiAoRGF0ZS5ub3coKSA8IGNyZWRpdENpcmN1aXRCcmVha2VyVW50aWwpIHsKICAgICAgICBjb25zdCByZW1haW5NaW4gPSBNYXRoLmNlaWwoKGNyZWRpdENpcmN1aXRCcmVha2VyVW50aWwgLSBEYXRlLm5vdygpKSAvIDYwXzAwMCk7CiAgICAgICAgbG9nLmluZm8oYCBDcmVkaXQgY2lyY3VpdCBicmVha2VyIGFjdGl2ZSDigJQgc2tpcHBpbmcgd29yayBjaGVjayAoJHtyZW1haW5NaW59bWluIHJlbWFpbmluZylgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjdXJyZW50QWdlbnRzID0gYWN0aXZlQWdlbnRDb3VudCgpOwogICAgaWYgKGN1cnJlbnRBZ2VudHMgPj0gTUFYX0NPTkNVUlJFTlRfQUdFTlRTKSB7CiAgICAgICAgbG9nLmluZm8oYCBBdCBjYXBhY2l0eSAoJHtjdXJyZW50QWdlbnRzfS8ke01BWF9DT05DVVJSRU5UX0FHRU5UU30gYWdlbnRzKSwgc2tpcHBpbmcgd29yayBjaGVja2ApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChwbGFubmluZ0luUHJvZ3Jlc3MpIHsKICAgICAgICBsb2cuaW5mbyhgIFBsYW5uaW5nIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHNraXBwaW5nIHdvcmsgY2hlY2tgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBib2FyZCA9IGdldEJvYXJkUHJvdmlkZXIoKTsKICAgIGlmICghYm9hcmQ/LmlzQXZhaWxhYmxlKCkpIHsKICAgICAgICBsb2cuaW5mbyhgIE5vIGJvYXJkIHByb3ZpZGVyIGF2YWlsYWJsZWApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHN0b3JlID0gYm9hcmQuZ2V0U3RvcmU/LigpOwogICAgaWYgKCFzdG9yZSkgewogICAgICAgIGxvZy5pbmZvKGAgTm8gcXVldWUgc3RvcmUgYXZhaWxhYmxlYCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYWxsVGFza3MgPSBhd2FpdCBzdG9yZS5saXN0KCk7CiAgICBjb25zdCBhdENhcGFjaXR5ID0gY3VycmVudEFnZW50cyA+PSBNQVhfQ09OQ1VSUkVOVF9BR0VOVFM7CiAgICAvLyBBdXRvLXByb21vdGUgYmFja2xvZyBpdGVtcyB0byB0b2RvIHNvIHRoZXkgYmVjb21lIGFjdGlvbmFibGUKICAgIGF3YWl0IHByb21vdGVCYWNrbG9nSXRlbXMoc3RvcmUsIGFsbFRhc2tzKTsKICAgIC8vIEZpbHRlciB0byB0YXNrcyB0aGUgcGxhbm5lciBjYW4gYXNzaWduLgogICAgLy8gInRvZG8iIHRhc2tzIGFzc2lnbmVkIHRvIHRoZSBhZ2VudCBhcmUgcmVjbGFpbWVkIGlmIG5vIGFnZW50IGlzIGFjdGl2ZWx5IHJ1bm5pbmcg4oCUCiAgICAvLyB0aGV5J3JlIGxlZnRvdmVycyBmcm9tIGEgcHJldmlvdXMgc2Vzc2lvbiB0aGF0IGZhaWxlZCBvciB3YXMgaW50ZXJydXB0ZWQuCiAgICBjb25zdCBhZ2VudEFzc2lnbmVlID0gYCR7Z2V0SW5zdGFuY2VOYW1lTG93ZXIoKX0tYWdlbnRgOwogICAgY29uc3QgYWN0aW9uYWJsZSA9IGFsbFRhc2tzLmZpbHRlcigodCkgPT4gewogICAgICAgIGlmICh0LnN0YXRlICE9PSAidG9kbyIpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAodC5hc3NpZ25lZSAmJiAhKHQuYXNzaWduZWUgPT09IGFnZW50QXNzaWduZWUgJiYgdC5zdGF0ZSA9PT0gInRvZG8iICYmICFhdENhcGFjaXR5KSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChjb29sZG93bk1hbmFnZXIuc2hvdWxkU2tpcCh0LmlkKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgICBpZiAoYWN0aW9uYWJsZS5sZW5ndGggPT09IDApIHsKICAgICAgICBsb2cuaW5mbyhgIE5vIGFjdGlvbmFibGUgaXRlbXMgb24gdGhlIGJvYXJkYCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gRmlsdGVyIG91dCBpdGVtcyB0aGUgcGxhbm5lciBhbHJlYWR5IHJldmlld2VkIGFuZCBza2lwcGVkICh1bmxlc3MgdXBkYXRlZCBzaW5jZSkKICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICBjb25zdCBuZWVkc1JldmlldyA9IGFjdGlvbmFibGUuZmlsdGVyKCh0KSA9PiB7CiAgICAgICAgY29uc3QgY2FjaGVkID0gcGxhbm5lclNraXBDYWNoZS5nZXQodC5pZCk7CiAgICAgICAgaWYgKCFjYWNoZWQpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIC8vIFJlLWV2YWx1YXRlIGlmIGl0ZW0gd2FzIHVwZGF0ZWQgYWZ0ZXIgdGhlIHBsYW5uZXIgc2tpcHBlZCBpdAogICAgICAgIGlmICh0LnVwZGF0ZWRBdCAmJiB0LnVwZGF0ZWRBdCAhPT0gY2FjaGVkLml0ZW1VcGRhdGVkQXQpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIC8vIFJlLWV2YWx1YXRlIGlmIHRoZSBza2lwIGNvb2xkb3duIGV4cGlyZWQKICAgICAgICBpZiAobm93IC0gY2FjaGVkLnNraXBwZWRBdCA+PSBQTEFOTkVSX1NLSVBfQ09PTERPV05fTVMpIHsKICAgICAgICAgICAgcGxhbm5lclNraXBDYWNoZS5kZWxldGUodC5pZCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICAgIGlmIChuZWVkc1Jldmlldy5sZW5ndGggPT09IDApIHsKICAgICAgICBsb2cuaW5mbyhgICR7YWN0aW9uYWJsZS5sZW5ndGh9IGFjdGlvbmFibGUgaXRlbShzKSBhbGwgcmVjZW50bHkgcmV2aWV3ZWQgYnkgcGxhbm5lciDigJQgc2tpcHBpbmcgTExNIGNhbGxgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBsb2cuaW5mbyhgIEZvdW5kICR7bmVlZHNSZXZpZXcubGVuZ3RofSBhY3Rpb25hYmxlIGl0ZW0ocykgKCR7YWN0aW9uYWJsZS5sZW5ndGggLSBuZWVkc1Jldmlldy5sZW5ndGh9IGNhY2hlZCBza2lwKSwgY2FsbGluZyBMTE0gcGxhbm5lci4uLmApOwogICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIHNlc3Npb24gZm9yIGJhdGNoIHRyYWNraW5nCiAgICBhdXRvbm9tb3VzU2Vzc2lvbkNvdW50ZXIrKzsKICAgIGNvbnN0IHNlc3Npb25JZCA9IGBhdXRvLSR7RGF0ZS5ub3coKX0tJHthdXRvbm9tb3VzU2Vzc2lvbkNvdW50ZXJ9YDsKICAgIGF3YWl0IHBsYW5BbmRTcGF3bihzZXNzaW9uSWQsIG51bGwsIG5lZWRzUmV2aWV3KTsKfQovKioKICogQXNrIHRoZSBMTE0gd2hhdCB0byB3b3JrIG9uLCBwYXJzZSBBR0VOVF9SRVFVRVNUIGJsb2Nrcywgc3Bhd24gYWdlbnRzLgogKi8KYXN5bmMgZnVuY3Rpb24gcGxhbkFuZFNwYXduKHNlc3Npb25JZCwgcHJpb3JDb250ZXh0LCBleHBsaWNpdEl0ZW1zKSB7CiAgICBpZiAocGxhbm5pbmdJblByb2dyZXNzKSB7CiAgICAgICAgbG9nLmluZm8oYCBwbGFuQW5kU3Bhd24gYWxyZWFkeSBydW5uaW5nLCBza2lwcGluZyBkdXBsaWNhdGUgY2FsbGApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHBsYW5uaW5nSW5Qcm9ncmVzcyA9IHRydWU7CiAgICB0cnkgewogICAgICAgIGF3YWl0IHBsYW5BbmRTcGF3bklubmVyKHNlc3Npb25JZCwgcHJpb3JDb250ZXh0LCBleHBsaWNpdEl0ZW1zKTsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIHBsYW5uaW5nSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgfQp9CmFzeW5jIGZ1bmN0aW9uIHBsYW5BbmRTcGF3bklubmVyKHNlc3Npb25JZCwgcHJpb3JDb250ZXh0LCBleHBsaWNpdEl0ZW1zKSB7CiAgICAvLyBHZXQgYWN0aW9uYWJsZSBib2FyZCBpdGVtcyAodW5sZXNzIGV4cGxpY2l0bHkgcHJvdmlkZWQpCiAgICBsZXQgYWN0aW9uYWJsZSA9IGV4cGxpY2l0SXRlbXM7CiAgICBpZiAoIWFjdGlvbmFibGUpIHsKICAgICAgICBjb25zdCBib2FyZCA9IGdldEJvYXJkUHJvdmlkZXIoKTsKICAgICAgICBpZiAoIWJvYXJkPy5pc0F2YWlsYWJsZSgpKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3Qgc3RvcmUgPSBib2FyZC5nZXRTdG9yZT8uKCk7CiAgICAgICAgaWYgKCFzdG9yZSkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IGFsbFRhc2tzID0gYXdhaXQgc3RvcmUubGlzdCgpOwogICAgICAgIGNvbnN0IGF0Q2FwID0gYWN0aXZlQWdlbnRDb3VudCgpID49IE1BWF9DT05DVVJSRU5UX0FHRU5UUzsKICAgICAgICAvLyBBdXRvLXByb21vdGUgYmFja2xvZyBpdGVtcyB0byB0b2RvIHNvIHRoZXkgYmVjb21lIGFjdGlvbmFibGUKICAgICAgICBhd2FpdCBwcm9tb3RlQmFja2xvZ0l0ZW1zKHN0b3JlLCBhbGxUYXNrcyk7CiAgICAgICAgY29uc3QgYWdlbnRBc3NpZ25lZUlubmVyID0gYCR7Z2V0SW5zdGFuY2VOYW1lTG93ZXIoKX0tYWdlbnRgOwogICAgICAgIGFjdGlvbmFibGUgPSBhbGxUYXNrcy5maWx0ZXIoKHQpID0+IHsKICAgICAgICAgICAgaWYgKHQuc3RhdGUgIT09ICJ0b2RvIikKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHQuYXNzaWduZWUgJiYgISh0LmFzc2lnbmVlID09PSBhZ2VudEFzc2lnbmVlSW5uZXIgJiYgdC5zdGF0ZSA9PT0gInRvZG8iICYmICFhdENhcCkpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGlmIChjb29sZG93bk1hbmFnZXIuc2hvdWxkU2tpcCh0LmlkKSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGFjdGlvbmFibGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGxvZy5pbmZvKGAgTm8gbW9yZSBhY3Rpb25hYmxlIGl0ZW1zIOKAlCBwYXVzaW5nYCk7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYXV0b25vbW91cyIsIHN1bW1hcnk6ICJObyBtb3JlIGFjdGlvbmFibGUgaXRlbXMg4oCUIHBhdXNpbmciLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICJwbGFubmVyIGZvdW5kIG5vIHdvcmsiIH0pOwogICAgICAgICAgICBjb250aW51YXRpb25Sb3VuZHMuZGVsZXRlKHNlc3Npb25JZCk7CiAgICAgICAgICAgIHNlc3Npb25DdW11bGF0aXZlRmFpbHVyZXMuZGVsZXRlKHNlc3Npb25JZCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAvLyBCdWlsZCBib2FyZCBjb250ZXh0IHdpdGggZGVzY3JpcHRpb25zIGFuZCBwcm9qZWN0IG5hbWVzCiAgICBjb25zdCBib2FyZENvbnRleHQgPSBhY3Rpb25hYmxlCiAgICAgICAgLm1hcCgodCkgPT4gewogICAgICAgIGNvbnN0IGRlc2MgPSB0LmRlc2NyaXB0aW9uID8gYFxuICAke3QuZGVzY3JpcHRpb24uc2xpY2UoMCwgMTUwMCl9YCA6ICIiOwogICAgICAgIGNvbnN0IHByb2ogPSB0LnByb2plY3QgPyBgIHske3QucHJvamVjdH19YCA6ICIiOwogICAgICAgIHJldHVybiBgLSAqKiR7dC5pZGVudGlmaWVyfSoqOiAke3QudGl0bGV9IFske3Quc3RhdGV9LCBQJHt0LnByaW9yaXR5ID8/IDR9XSR7cHJvan0gKGlkOiAke3QuaWR9KSR7ZGVzY31gOwogICAgfSkKICAgICAgICAuam9pbigiXG4iKTsKICAgIC8vIEJ1aWxkIHRoZSBwbGFubmluZyBwcm9tcHQKICAgIGNvbnN0IHByb21wdCA9IGF3YWl0IGJ1aWxkUGxhbm5lclByb21wdChib2FyZENvbnRleHQsIHByaW9yQ29udGV4dCk7CiAgICBjb25zdCBtZXNzYWdlcyA9IFsKICAgICAgICB7IHJvbGU6ICJzeXN0ZW0iLCBjb250ZW50OiBnZXRQbGFubmVyU3lzdGVtUHJvbXB0KCkgfSwKICAgICAgICB7IHJvbGU6ICJ1c2VyIiwgY29udGVudDogcHJvbXB0IH0sCiAgICBdOwogICAgdHJ5IHsKICAgICAgICBsb2cuaW5mbyhgIENhbGxpbmcgTExNIHBsYW5uZXIgKG1vZGVsOiAke1BMQU5ORVJfTU9ERUx9LCBwcm92aWRlcjogJHtyZXNvbHZlUHJvdmlkZXIoKX0pLi4uYCk7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb21wbGV0ZUNoYXQoewogICAgICAgICAgICBtZXNzYWdlcywKICAgICAgICAgICAgbW9kZWw6IFBMQU5ORVJfTU9ERUwsCiAgICAgICAgICAgIHByb3ZpZGVyOiByZXNvbHZlUHJvdmlkZXIoKSwKICAgICAgICB9KTsKICAgICAgICBsb2cuaW5mbyhgIExMTSByZXNwb25zZSAoJHtyZXNwb25zZS5sZW5ndGh9IGNoYXJzKTogJHtyZXNwb25zZS5zbGljZSgwLCAyMDApfS4uLmApOwogICAgICAgIC8vIFByb2Nlc3MgYWN0aW9uIGJsb2NrcyArIG1ldGEgYmxvY2tzIChUQVNLX0RPTkUsIGV0Yy4pIHZpYSBjYXBhYmlsaXR5IHJlZ2lzdHJ5CiAgICAgICAgbGV0IGFjdGlvbnNFeGVjdXRlZCA9IDA7CiAgICAgICAgewogICAgICAgICAgICBjb25zdCBjYXBSZWcgPSBnZXRDYXBhYmlsaXR5UmVnaXN0cnkoKTsKICAgICAgICAgICAgaWYgKGNhcFJlZykgewogICAgICAgICAgICAgICAgY29uc3QgeyByZXN1bHRzLCBtZXRhUmVzdWx0cyB9ID0gYXdhaXQgY2FwUmVnLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSwgeyBvcmlnaW46ICJhdXRvbm9tb3VzIiB9KTsKICAgICAgICAgICAgICAgIGFjdGlvbnNFeGVjdXRlZCArPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5vaykubGVuZ3RoOwogICAgICAgICAgICAgICAgYWN0aW9uc0V4ZWN1dGVkICs9IG1ldGFSZXN1bHRzLnJlZHVjZSgobiwgbSkgPT4gbiArIG0ucmVzdWx0cy5maWx0ZXIoKHIpID0+IHIub2spLmxlbmd0aCwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gUGFyc2UgQUdFTlRfUkVRVUVTVCBibG9ja3MgZnJvbSBMTE0gcmVzcG9uc2UKICAgICAgICBjb25zdCBibG9ja3MgPSBbLi4ucmVzcG9uc2UubWF0Y2hBbGwoL1xbQUdFTlRfUkVRVUVTVFxdXHMqKFtcc1xTXSo/KVxzKlxbXC9BR0VOVF9SRVFVRVNUXF0vZyldOwogICAgICAgIGlmIChibG9ja3MubGVuZ3RoID09PSAwICYmIGFjdGlvbnNFeGVjdXRlZCA9PT0gMCkgewogICAgICAgICAgICAvLyBFeHRyYWN0IGEgYnJpZWYgcmVhc29uIGZyb20gdGhlIExMTSByZXNwb25zZSAoc3RyaXAgbWFya2Rvd24gbm9pc2UpCiAgICAgICAgICAgIGNvbnN0IGJyaWVmUmVhc29uID0gcmVzcG9uc2UucmVwbGFjZSgvWyMqYFxbXF1dL2csICIiKS50cmltKCkuc2xpY2UoMCwgMTUwKTsKICAgICAgICAgICAgbG9nLmluZm8oYCBMTE0gZGVjaWRlZCBubyBhZ2VudHMgbmVlZGVkLiBSZXNwb25zZTogJHtyZXNwb25zZS5zbGljZSgwLCAzMDApfWApOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhdXRvbm9tb3VzIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBSZXZpZXdlZCAke2FjdGlvbmFibGUubGVuZ3RofSBiYWNrbG9nIGl0ZW0ocyksIG5vbmUgcmVhZHk6ICR7YnJpZWZSZWFzb259YCwKICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgICAgICByZWFzb246ICJwbGFubmVyIGRlY2lkZWQgbm8gYWN0aW9uIG5lZWRlZCIsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBDYWNoZSB0aGVzZSBpdGVtcyBzbyB0aGUgbmV4dCBjeWNsZSBza2lwcyB0aGUgTExNIGNhbGwgZm9yIHVuY2hhbmdlZCBpdGVtcwogICAgICAgICAgICBjb25zdCBza2lwVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBhY3Rpb25hYmxlKSB7CiAgICAgICAgICAgICAgICBwbGFubmVyU2tpcENhY2hlLnNldCh0LmlkLCB7IHNraXBwZWRBdDogc2tpcFRpbWUsIGl0ZW1VcGRhdGVkQXQ6IHQudXBkYXRlZEF0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZy5pbmZvKGAgQ2FjaGVkICR7YWN0aW9uYWJsZS5sZW5ndGh9IGl0ZW0ocykgYXMgcGxhbm5lci1za2lwcGVkIGZvciAke1BMQU5ORVJfU0tJUF9DT09MRE9XTl9NUyAvIDYwXzAwMH1taW5gKTsKICAgICAgICAgICAgY29udGludWF0aW9uUm91bmRzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgICAgICBzZXNzaW9uQ3VtdWxhdGl2ZUZhaWx1cmVzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChibG9ja3MubGVuZ3RoID09PSAwICYmIGFjdGlvbnNFeGVjdXRlZCA+IDApIHsKICAgICAgICAgICAgbG9nLmluZm8oYCBFeGVjdXRlZCAke2FjdGlvbnNFeGVjdXRlZH0gYWN0aW9uKHMpLCBubyBhZ2VudHMgc3Bhd25lZGApOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhdXRvbm9tb3VzIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBFeGVjdXRlZCAke2FjdGlvbnNFeGVjdXRlZH0gYWN0aW9uKHMpIGZyb20gJHthY3Rpb25hYmxlLmxlbmd0aH0gYmFja2xvZyBpdGVtKHMpYCwKICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgICAgICByZWFzb246ICJwbGFubmVyIGV4ZWN1dGVkIGFjdGlvbnMgZGlyZWN0bHkiLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGludWF0aW9uUm91bmRzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgICAgICBzZXNzaW9uQ3VtdWxhdGl2ZUZhaWx1cmVzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIExvZyB0aGUgcGxhbm5pbmcgZW50cnkgbm93IHRoYXQgdGhlIExMTSBoYXMgYWN0dWFsbHkgZGVjaWRlZCB0byBzcGF3bgogICAgICAgIGNvbnN0IHBsYW5FbnRyeSA9IGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYXV0b25vbW91cyIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBQbGFubmluZyAke2Jsb2Nrcy5sZW5ndGh9IGFnZW50KHMpIGZyb20gJHthY3Rpb25hYmxlLmxlbmd0aH0gYmFja2xvZyBpdGVtKHMpYCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJBVVRPTk9NT1VTIiwKICAgICAgICAgICAgcmVhc29uOiAiMTUtbWluIGF1dG9ub21vdXMgcGxhbm5lciBjeWNsZSIsCiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgcGxhblRyYWNlSWQgPSBwbGFuRW50cnkudHJhY2VJZDsKICAgICAgICBsb2cuaW5mbyhgIEZvdW5kICR7YmxvY2tzLmxlbmd0aH0gQUdFTlRfUkVRVUVTVCBibG9jayhzKWApOwogICAgICAgIGxldCBzcGF3bkNvdW50ID0gMDsKICAgICAgICBjb25zdCBzcGF3bmVkTGFiZWxzID0gW107CiAgICAgICAgZm9yIChjb25zdCBibG9jayBvZiBibG9ja3MpIHsKICAgICAgICAgICAgaWYgKHNwYXduQ291bnQgPj0gTUFYX0FHRU5UU19QRVJfUk9VTkQpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY29uc3QgcmF3Q29udGVudCA9IGJsb2NrWzFdLnRyaW0oKTsKICAgICAgICAgICAgbGV0IGpzb25TdHIgPSByYXdDb250ZW50CiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXmB7Myx9KD86anNvbik/XHMqL2ksICIiKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xzKmB7Myx9JC9pLCAiIikKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eYCt8YCskL2csICIiKTsKICAgICAgICAgICAgY29uc3QganNvbk1hdGNoID0ganNvblN0ci5tYXRjaCgvXHtbXHNcU10qXH0vKTsKICAgICAgICAgICAgaWYgKCFqc29uTWF0Y2gpIHsKICAgICAgICAgICAgICAgIGxvZy53YXJuKGAgTm8gSlNPTiBpbiBBR0VOVF9SRVFVRVNUIGJsb2NrOiAke3Jhd0NvbnRlbnQuc2xpY2UoMCwgMjAwKX1gKTsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYXV0b25vbW91cyIsIHN1bW1hcnk6IGBObyBKU09OIGluIEFHRU5UX1JFUVVFU1QgYmxvY2tgLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICJwbGFubmVyIG91dHB1dCBwYXJzZSBpc3N1ZSIgfSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgcmVxID0gSlNPTi5wYXJzZShqc29uTWF0Y2hbMF0pOwogICAgICAgICAgICAgICAgaWYgKCFyZXEucHJvbXB0KSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oYCBBR0VOVF9SRVFVRVNUIG1pc3NpbmcgInByb21wdCIgZmllbGRgKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gcmVxLmxhYmVsIHx8IHJlcS5wcm9tcHQuc2xpY2UoMCwgNjApOwogICAgICAgICAgICAgICAgbGV0IGZpbmFsUHJvbXB0ID0gcmVxLnByb21wdDsKICAgICAgICAgICAgICAgIC8vIEd1YXJkOiBkZWR1cCDigJQgc2tpcCBpZiBzYW1lIHdvcmsgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyBvciByZWNlbnRseSBkb25lCiAgICAgICAgICAgICAgICBjb25zdCBkZWR1cCA9IGF3YWl0IGNoZWNrRGVkdXAobGFiZWwsIGZpbmFsUHJvbXB0KTsKICAgICAgICAgICAgICAgIGlmIChkZWR1cC5ibG9ja2VkKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oYCBEZWR1cCBndWFyZCBibG9ja2VkOiAiJHtsYWJlbH0iIOKAlCAke2RlZHVwLnJlYXNvbn1gKTsKICAgICAgICAgICAgICAgICAgICByZWNvcmREZWR1cEJsb2NrKGRlZHVwLnJlYXNvbiA/PyAidW5rbm93biIpOwogICAgICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYXV0b25vbW91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBTa2lwcGVkICIke2xhYmVsfSI6ICR7ZGVkdXAucmVhc29ufWAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogImRlZHVwIGd1YXJkIiwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEd1YXJkOiBkZXRlY3QgdmFndWUgcHJvbXB0cwogICAgICAgICAgICAgICAgY29uc3QgaGFzRmlsZVBhdGggPSAvKD86c3JjXC98YnJhaW5cL3xwdWJsaWNcL3xcLnRzfFwuanN8XC5tZHxcLmpzb258XC55YW1sfFwueW1sKS8udGVzdChmaW5hbFByb21wdCk7CiAgICAgICAgICAgICAgICBjb25zdCBpc1ZhZ3VlID0gL1xiKD86Y29tcHJlaGVuc2l2ZXxyb2J1c3R8cHJvZHVjdGlvbi1yZWFkeXxlbnRlcnByaXNlfHNjYWxhYmxlfHdvcmxkLWNsYXNzKVxiL2kudGVzdChmaW5hbFByb21wdCkKICAgICAgICAgICAgICAgICAgICAmJiAhaGFzRmlsZVBhdGg7CiAgICAgICAgICAgICAgICBpZiAoaXNWYWd1ZSkgewogICAgICAgICAgICAgICAgICAgIGZpbmFsUHJvbXB0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICBgSU1QT1JUQU5UOiBUaGUgb3JpZ2luYWwgcmVxdWVzdCBpcyB2YWd1ZS4gRG8gTk9UIHRyeSB0byBidWlsZCBldmVyeXRoaW5nIGxpc3RlZC5gLAogICAgICAgICAgICAgICAgICAgICAgICBgSW5zdGVhZDogMSkgUmVhZCB0aGUgZXhpc3RpbmcgY29kZWJhc2UgKHN0YXJ0IHdpdGggc3JjLyBhbmQgcGFja2FnZS5qc29uKS5gLAogICAgICAgICAgICAgICAgICAgICAgICBgMikgUGljayBPTkUgc21hbGwsIGNvbmNyZXRlIHBpZWNlIHlvdSBjYW4gaW1wbGVtZW50IHRoYXQgY29ubmVjdHMgdG8gZXhpc3RpbmcgY29kZS5gLAogICAgICAgICAgICAgICAgICAgICAgICBgMykgQnVpbGQgdGhhdCBvbmUgdGhpbmcgd2VsbC5gLAogICAgICAgICAgICAgICAgICAgICAgICBgNCkgSWYgbm90aGluZyBjb25jcmV0ZSBjYW4gYmUgYnVpbHQgd2l0aG91dCBtb3JlIHJlcXVpcmVtZW50cywgY3JlYXRlIGEgYnJpZWYgc3BlYyBhdCBicmFpbi9rbm93bGVkZ2Uvbm90ZXMvLmAsCiAgICAgICAgICAgICAgICAgICAgICAgIGBgLAogICAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgcmVxdWVzdDpgLAogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFByb21wdCwKICAgICAgICAgICAgICAgICAgICBdLmpvaW4oIlxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUcmFjayBsYWJlbOKGkmJvYXJkVGFza0lkIHNvIHdlIGNhbiBjb29sZG93biBvbiBmYWlsdXJlCiAgICAgICAgICAgICAgICBpZiAocmVxLnRhc2tJZCkgewogICAgICAgICAgICAgICAgICAgIGxhYmVsVG9Cb2FyZFRhc2tJZC5zZXQobGFiZWwsIHJlcS50YXNrSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3Bhd25Db3VudCsrOwogICAgICAgICAgICAgICAgc3Bhd25lZExhYmVscy5wdXNoKGxhYmVsKTsKICAgICAgICAgICAgICAgIHJlY29yZEF1dG9ub21vdXNBY3Rpb24oKTsKICAgICAgICAgICAgICAgIGxvZy5pbmZvKGAgU3Bhd25pbmcgYWdlbnQ6ICR7bGFiZWx9YCk7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImF1dG9ub21vdXMiLCBzdW1tYXJ5OiBgU3Bhd25pbmc6ICR7bGFiZWx9YCwgYmFja3JlZjogcGxhblRyYWNlSWQsIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogInBsYW5uZXIgc2VsZWN0ZWQgZnJvbSBiYWNrbG9nIiB9KTsKICAgICAgICAgICAgICAgIGF3YWl0IHN1Ym1pdFRhc2soewogICAgICAgICAgICAgICAgICAgIGxhYmVsLAogICAgICAgICAgICAgICAgICAgIHByb21wdDogZmluYWxQcm9tcHQsCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiAiYWkiLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICBib2FyZFRhc2tJZDogcmVxLnRhc2tJZCwKICAgICAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSwgLy8gQXV0b25vbW91cyBhZ2VudHMgaW52ZXN0aWdhdGUgYW5kIHJlcG9ydCBvbmx5IOKAlCBubyBmaWxlIGVkaXRzCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoYCBBR0VOVF9SRVFVRVNUIHBhcnNlIGVycm9yOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJhdXRvbm9tb3VzIiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQUdFTlRfUkVRVUVTVCBwYXJzZSBlcnJvcjogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLAogICAgICAgICAgICAgICAgICAgIHJlYXNvbjogInBsYW5uZXIgb3V0cHV0IHBhcnNlIGVycm9yIiwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzcGF3bkNvdW50ID4gMCkgewogICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gYFdvcmtpbmcgb24gJHtzcGF3bkNvdW50fSB0YXNrKHMpOiAke3NwYXduZWRMYWJlbHMuam9pbigiLCAiKX1gOwogICAgICAgICAgICBsb2cuaW5mbyhgICR7c3VtbWFyeX1gKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhdXRvbm9tb3VzIiwgc3VtbWFyeSwgYmFja3JlZjogcGxhblRyYWNlSWQsIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogInBsYW5uZXIgc2VsZWN0ZWQgZnJvbSBiYWNrbG9nIiB9KTsKICAgICAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgIHNvdXJjZTogImF1dG9ub21vdXMiLAogICAgICAgICAgICAgICAgbWVzc2FnZTogc3VtbWFyeSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsb2cud2FybihgIEZvdW5kICR7YmxvY2tzLmxlbmd0aH0gYmxvY2socykgYnV0IHNwYXduZWQgMCBhZ2VudHNgKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhdXRvbm9tb3VzIiwgc3VtbWFyeTogIlBhcnNlZCBibG9ja3MgYnV0IHNwYXduZWQgMCBhZ2VudHMiLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICJwbGFubmVyIGJsb2NrcyBoYWQgbm8gdmFsaWQgYWdlbnRzIiB9KTsKICAgICAgICAgICAgY29udGludWF0aW9uUm91bmRzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgICAgICBzZXNzaW9uQ3VtdWxhdGl2ZUZhaWx1cmVzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgbG9nLmVycm9yKGAgTExNIGNhbGwgZmFpbGVkOiAke21zZ31gKTsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImF1dG9ub21vdXMiLCBzdW1tYXJ5OiBgTExNIGNhbGwgZmFpbGVkOiAke21zZ31gLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICIxNS1taW4gYXV0b25vbW91cyBwbGFubmVyIGN5Y2xlIiB9KTsKICAgICAgICAvLyBUcmlwIGNpcmN1aXQgYnJlYWtlciBvbiBjcmVkaXQvYmlsbGluZyBlcnJvcnMgdG8gc3RvcCBoYW1tZXJpbmcgYSBkZWFkIEFQSQogICAgICAgIGNvbnN0IGlzQ3JlZGl0c0lzc3VlID0gKGVyciBpbnN0YW5jZW9mIExMTUVycm9yICYmIGVyci5pc0NyZWRpdHNFcnJvcikKICAgICAgICAgICAgfHwgLzQwMnxjcmVkaXRzfGFmZm9yZHxwYXltZW50LnJlcXVpcmVkfGJpbGxpbmcvaS50ZXN0KG1zZyk7CiAgICAgICAgaWYgKGlzQ3JlZGl0c0lzc3VlKSB7CiAgICAgICAgICAgIGNyZWRpdENpcmN1aXRCcmVha2VyVW50aWwgPSBEYXRlLm5vdygpICsgQ1JFRElUX0NJUkNVSVRfQlJFQUtFUl9NUzsKICAgICAgICAgICAgY29uc3QgYnJlYWtlcl9tc2cgPSBgQVBJIGNyZWRpdHMgZXhoYXVzdGVkIOKAlCBhdXRvbm9tb3VzIHdvcmsgcGF1c2VkIGZvciAke0NSRURJVF9DSVJDVUlUX0JSRUFLRVJfTVMgLyA2MF8wMDB9bWluLiBUb3AgdXAgYXQgb3BlbnJvdXRlci5haS9zZXR0aW5ncy9jcmVkaXRzLmA7CiAgICAgICAgICAgIGxvZy53YXJuKGJyZWFrZXJfbXNnKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhdXRvbm9tb3VzIiwgc3VtbWFyeTogYnJlYWtlcl9tc2csIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogImNyZWRpdCBjaXJjdWl0IGJyZWFrZXIgdHJpcHBlZCIgfSk7CiAgICAgICAgICAgIHB1c2hOb3RpZmljYXRpb24oewogICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhdXRvbm9tb3VzIiwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGJyZWFrZXJfbXNnLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29udGludWF0aW9uUm91bmRzLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgICAgIHNlc3Npb25DdW11bGF0aXZlRmFpbHVyZXMuZGVsZXRlKHNlc3Npb25JZCk7CiAgICB9Cn0KLy8g4pSA4pSA4pSAIFByb21wdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGdldFBsYW5uZXJTeXN0ZW1Qcm9tcHQoKSB7CiAgICBjb25zdCBjYXBJbnN0cnVjdGlvbnMgPSBnZXRDYXBhYmlsaXR5UmVnaXN0cnkoKT8uZ2V0UHJvbXB0SW5zdHJ1Y3Rpb25zKHsgb3JpZ2luOiAiYXV0b25vbW91cyIgfSkgPz8gIiI7CiAgICByZXR1cm4gYFlvdSBhcmUgJHtnZXRJbnN0YW5jZU5hbWUoKX0ncyBhdXRvbm9tb3VzIHdvcmsgcGxhbm5lci4gWW91ciBqb2IgaXMgdG8gbG9vayBhdCB0aGUgYmFja2xvZyBhbmQgZGVjaWRlIHdoYXQgYWdlbnRzIHNob3VsZCB3b3JrIG9uIG5leHQuDQoNClJ1bGVzOg0KLSBQaWNrIDEtMyBpdGVtcyBmcm9tIHRoZSBiYWNrbG9nIHRoYXQgYXJlIHJlYWR5IHRvIGltcGxlbWVudCBOT1cuDQotIFNraXAgaXRlbXMgdGhhdCBhcmUgdmFndWUgc3BlY3Mgb3IgbmVlZCBodW1hbiBkZWNpc2lvbnMg4oCUIHRob3NlIG5lZWQgZ3Jvb21pbmcgZmlyc3QuDQotIFByZWZlciBpdGVtcyB3aXRoIGNsZWFyIHRpdGxlcyBhbmQgZGVzY3JpcHRpb25zIG92ZXIgYW1iaWd1b3VzIG9uZXMuDQotIEVhY2ggYWdlbnQgZ2V0cyBPTkUgZm9jdXNlZCB0YXNrLiBEb24ndCBidW5kbGUgbXVsdGlwbGUgaXRlbXMgaW50byBvbmUgYWdlbnQuDQotIFdyaXRlIGNsZWFyLCBzcGVjaWZpYyBhZ2VudCBwcm9tcHRzIHdpdGggZmlsZSBwYXRocyB3aGVuIHBvc3NpYmxlLg0KLSBJZiBub3RoaW5nIGlzIHJlYWR5IHRvIGltcGxlbWVudCwgb3V0cHV0IE5PIFtBR0VOVF9SRVFVRVNUXSBibG9ja3MgYW5kIGV4cGxhaW4gd2h5Lg0KLSBETyBOT1QgcmV0cnkgdGFza3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhdHRlbXB0ZWQgYW5kIGZhaWxlZC4gSWYgdGhlICJSZWNlbnQgYWdlbnQgaGlzdG9yeSIgc2VjdGlvbiBzaG93cyBhIHRhc2sgd2FzIHRyaWVkIGJlZm9yZSwgc2tpcCBpdCB1bmxlc3MgeW91IGhhdmUgYSBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBhcHByb2FjaCAobm90IGp1c3QgInRyeSBhZ2FpbiIpLg0KLSBJZiB0aGUgc2FtZSBib2FyZCBpdGVtIGhhcyBmYWlsZWQgbXVsdGlwbGUgdGltZXMsIGl0IHByb2JhYmx5IG5lZWRzIGh1bWFuIGlucHV0IG9yIGEgc3BlYyBjaGFuZ2Ug4oCUIHNraXAgaXQuDQoNCiMjIFR3byB0eXBlcyBvZiBhY3Rpb25zDQoNCiMjIyAxLiBDb2RlIGFnZW50cyAoZm9yIGNvZGUvZmlsZSB0YXNrcykNCkZvciB0YXNrcyB0aGF0IHJlcXVpcmUgcmVhZGluZy93cml0aW5nIGNvZGUgb3IgZmlsZXMsIG91dHB1dDoNCg0KW0FHRU5UX1JFUVVFU1RdDQp7DQogICJsYWJlbCI6ICJTaG9ydCBkZXNjcmlwdGl2ZSBuYW1lIiwNCiAgInByb21wdCI6ICJEZXRhaWxlZCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBhZ2VudC4gUmVmZXJlbmNlIHNwZWNpZmljIGZpbGVzLiBCZSBjb25jcmV0ZS4iLA0KICAidGFza0lkIjogInRoZS10YXNrLWlkLWZyb20tdGhlLWJvYXJkIg0KfQ0KWy9BR0VOVF9SRVFVRVNUXQ0KDQpUaGUgYWdlbnQgcnVucyBcYGNsYXVkZSAtLXByaW50IC0tZGFuZ2Vyb3VzbHktc2tpcC1wZXJtaXNzaW9uc1xgIGluIHRoZSBwcm9qZWN0IHJvb3QuDQpJdCBjYW4gcmVhZC93cml0ZSBmaWxlcywgcnVuIG5wbSBjb21tYW5kcywgZXRjLiBHaXZlIGl0IGV2ZXJ5dGhpbmcgaXQgbmVlZHMgdG8gc3VjY2VlZCBpbmRlcGVuZGVudGx5Lg0KQWZ0ZXIgbWFraW5nIGNoYW5nZXMsIHRoZSBhZ2VudCBzaG91bGQgcnVuIFxgbnBtIHJ1biBidWlsZFxgIHRvIHZlcmlmeSBjb21waWxhdGlvbi4NCg0KIyMjIDIuIEdvb2dsZSBXb3Jrc3BhY2UgYWN0aW9ucyAoZm9yIGNhbGVuZGFyLCBlbWFpbCwgZG9jcyB0YXNrcykNCkZvciB0YXNrcyBsaWtlIHNjaGVkdWxpbmcgbWVldGluZ3MsIHNlbmRpbmcgZW1haWxzLCBvciBjcmVhdGluZyBkb2N1bWVudHMsIG91dHB1dCBhY3Rpb24gYmxvY2tzIGRpcmVjdGx5IOKAlCBOTyBhZ2VudCBuZWVkZWQuDQoNCiR7Y2FwSW5zdHJ1Y3Rpb25zfQ0KDQpJTVBPUlRBTlQ6IFdoZW4gYSB0YXNrIHNheXMgInNjaGVkdWxlIiwgIm1lZXRpbmciLCAiY2FsZW5kYXIiLCAiYXBwb2ludG1lbnQiIOKAlCB1c2UgW0NBTEVOREFSX0FDVElPTl0sIG5vdCBhbiBhZ2VudC4NCldoZW4gYSB0YXNrIHNheXMgImVtYWlsIiwgInNlbmQiLCAibm90aWZ5IiDigJQgdXNlIFtFTUFJTF9BQ1RJT05dLCBub3QgYW4gYWdlbnQuDQpBZnRlciBvdXRwdXR0aW5nIHRoZSBhY3Rpb24gYmxvY2ssIGFsc28gaW5jbHVkZSB0aGUgdGFza0lkIHNvIHRoZSB0YXNrIGNhbiBiZSBtYXJrZWQgZG9uZToNCltUQVNLX0RPTkVdeyJ0YXNrSWQiOiAidGhlLXRhc2staWQifVsvVEFTS19ET05FXWA7Cn0KYXN5bmMgZnVuY3Rpb24gYnVpbGRQbGFubmVyUHJvbXB0KGJvYXJkQ29udGV4dCwgcHJpb3JDb250ZXh0KSB7CiAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgcGFydHMucHVzaChgQ3VycmVudCB0aW1lOiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTsKICAgIHBhcnRzLnB1c2goYGApOwogICAgaWYgKHByaW9yQ29udGV4dCkgewogICAgICAgIHBhcnRzLnB1c2goYCMjIFByZXZpb3VzIGJhdGNoIHJlc3VsdHNgKTsKICAgICAgICBwYXJ0cy5wdXNoKHByaW9yQ29udGV4dCk7CiAgICAgICAgcGFydHMucHVzaChgYCk7CiAgICB9CiAgICAvLyBJbmNsdWRlIHJlY2VudCBhZ2VudCBoaXN0b3J5IHNvIHRoZSBwbGFubmVyIGtub3dzIHdoYXQncyBiZWVuIHRyaWVkCiAgICBjb25zdCBoaXN0b3J5Q29udGV4dCA9IGF3YWl0IGJ1aWxkQWdlbnRIaXN0b3J5Q29udGV4dCgpOwogICAgaWYgKGhpc3RvcnlDb250ZXh0KSB7CiAgICAgICAgcGFydHMucHVzaChgIyMgUmVjZW50IGFnZW50IGhpc3RvcnkgKGxhc3QgMjRoKWApOwogICAgICAgIHBhcnRzLnB1c2goaGlzdG9yeUNvbnRleHQpOwogICAgICAgIHBhcnRzLnB1c2goYGApOwogICAgfQogICAgLy8gSW5jbHVkZSBjdXJyZW50bHkgY29vbGluZy1kb3duIHRhc2tzCiAgICBjb25zdCBjb29sZG93bkNvbnRleHQgPSBjb29sZG93bk1hbmFnZXIuZ2V0Q29vbGRvd25Db250ZXh0KCk7CiAgICBpZiAoY29vbGRvd25Db250ZXh0KSB7CiAgICAgICAgcGFydHMucHVzaChgIyMgVGFza3Mgb24gY29vbGRvd24gKERPIE5PVCBhc3NpZ24gdGhlc2UpYCk7CiAgICAgICAgcGFydHMucHVzaChjb29sZG93bkNvbnRleHQpOwogICAgICAgIHBhcnRzLnB1c2goYGApOwogICAgfQogICAgcGFydHMucHVzaChgIyMgQWN0aW9uYWJsZSBiYWNrbG9nIGl0ZW1zICh1bmFzc2lnbmVkLCByZWFkeSB0byB3b3JrKWApOwogICAgcGFydHMucHVzaChib2FyZENvbnRleHQpOwogICAgcGFydHMucHVzaChgYCk7CiAgICBwYXJ0cy5wdXNoKGBSZXZpZXcgdGhlc2UgaXRlbXMgYW5kIGRlY2lkZSB3aGljaCBvbmVzIHRvIGFzc2lnbiB0byBhZ2VudHMuIE91dHB1dCBbQUdFTlRfUkVRVUVTVF0gYmxvY2tzIGZvciBlYWNoLmApOwogICAgcGFydHMucHVzaChgSWYgYW4gaXRlbSBpcyB0b28gdmFndWUgb3IgbmVlZHMgaHVtYW4gaW5wdXQsIHNraXAgaXQgYW5kIGV4cGxhaW4gd2h5LmApOwogICAgcmV0dXJuIHBhcnRzLmpvaW4oIlxuIik7Cn0KLyoqCiAqIEJ1aWxkIGEgc3VtbWFyeSBvZiByZWNlbnQgYWdlbnQgdGFzayByZXN1bHRzIHNvIHRoZSBwbGFubmVyIGNhbiBhdm9pZAogKiByZS1hdHRlbXB0aW5nIHRhc2tzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gdHJpZWQgYW5kIGZhaWxlZC4KICoKICogT3B0aW1pemF0aW9uOiB1c2VzIGBzaW5jZWAgZmlsdGVyIHRvIHNraXAgcmVhZGluZyBvbGQgdGFzayBmaWxlcyBmcm9tIGRpc2sKICogZW50aXJlbHkgKGZpbGVuYW1lLWVtYmVkZGVkIHRpbWVzdGFtcHMgYXJlIGNoZWNrZWQgYmVmb3JlIGZpbGUgcmVhZCkuCiAqLwphc3luYyBmdW5jdGlvbiBidWlsZEFnZW50SGlzdG9yeUNvbnRleHQoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGN1dG9mZiA9IERhdGUubm93KCkgLSAyNCAqIDYwICogNjAgKiAxMDAwOyAvLyBsYXN0IDI0aAogICAgICAgIGNvbnN0IHRhc2tzID0gYXdhaXQgbGlzdEFnZW50VGFza3MoeyBzaW5jZTogY3V0b2ZmIH0pOwogICAgICAgIGNvbnN0IHJlY2VudCA9IHRhc2tzLmZpbHRlcigodCkgPT4gewogICAgICAgICAgICBjb25zdCB0cyA9IHQuZmluaXNoZWRBdCB8fCB0LmNyZWF0ZWRBdDsKICAgICAgICAgICAgcmV0dXJuIHRzICYmIG5ldyBEYXRlKHRzKS5nZXRUaW1lKCkgPiBjdXRvZmY7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHJlY2VudC5sZW5ndGggPT09IDApCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIC8vIEdyb3VwIGJ5IG5vcm1hbGl6ZWQgbGFiZWwgdG8gc2hvdyBwYXR0ZXJucwogICAgICAgIGNvbnN0IGJ5TGFiZWwgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCB0IG9mIHJlY2VudCkgewogICAgICAgICAgICBjb25zdCBrZXkgPSB0LmxhYmVsLnJlcGxhY2UoL1xkKy9nLCAiTiIpLnNsaWNlKDAsIDYwKTsKICAgICAgICAgICAgaWYgKCFieUxhYmVsLmhhcyhrZXkpKQogICAgICAgICAgICAgICAgYnlMYWJlbC5zZXQoa2V5LCB7IGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwLCBsYWJlbHM6IFtdIH0pOwogICAgICAgICAgICBjb25zdCBlbnRyeSA9IGJ5TGFiZWwuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICh0LnN0YXR1cyA9PT0gImNvbXBsZXRlZCIpCiAgICAgICAgICAgICAgICBlbnRyeS5jb21wbGV0ZWQrKzsKICAgICAgICAgICAgZWxzZSBpZiAodC5zdGF0dXMgPT09ICJmYWlsZWQiKQogICAgICAgICAgICAgICAgZW50cnkuZmFpbGVkKys7CiAgICAgICAgICAgIGlmICghZW50cnkubGFiZWxzLmluY2x1ZGVzKHQubGFiZWwpKQogICAgICAgICAgICAgICAgZW50cnkubGFiZWxzLnB1c2godC5sYWJlbCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxpbmVzID0gW107CiAgICAgICAgZm9yIChjb25zdCBba2V5LCBpbmZvXSBvZiBieUxhYmVsKSB7CiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IFtdOwogICAgICAgICAgICBpZiAoaW5mby5jb21wbGV0ZWQgPiAwKQogICAgICAgICAgICAgICAgc3RhdHVzLnB1c2goYCR7aW5mby5jb21wbGV0ZWR9IGNvbXBsZXRlZGApOwogICAgICAgICAgICBpZiAoaW5mby5mYWlsZWQgPiAwKQogICAgICAgICAgICAgICAgc3RhdHVzLnB1c2goYCR7aW5mby5mYWlsZWR9IEZBSUxFRGApOwogICAgICAgICAgICBsaW5lcy5wdXNoKGAtICIke2luZm8ubGFiZWxzWzBdfSI6ICR7c3RhdHVzLmpvaW4oIiwgIil9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lcy5qb2luKCJcbiIpOwogICAgfQogICAgY2F0Y2ggewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dG9ub21vdXMuanMubWFw","agents/reflection.js":"LyoqCiAqIFNlc3Npb24tbGV2ZWwgcmVmbGVjdGlvbiBlbmdpbmUuCiAqIENvbnNvbGlkYXRlcyBwZXItYWdlbnQgcmVmbGVjdGlvbnMgaW50byBhIHNlc3Npb24gc3VtbWFyeSwKICogd3JpdGVzIHRvIGRlY2lzaW9ucy5qc29ubCwgYW5kIHRyaWdnZXJzIGxvb3AgbGlmZWN5Y2xlIHdoZW4gYXBwcm9wcmlhdGUuCiAqLwppbXBvcnQgeyBqb2luIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICJub2RlOmNyeXB0byI7CmltcG9ydCB7IGNvbXBsZXRlQ2hhdCB9IGZyb20gIi4uL2xsbS9jb21wbGV0ZS5qcyI7CmltcG9ydCB7IHJlc29sdmVBZ2VudFByb3ZpZGVyLCByZXNvbHZlQWdlbnRNb2RlbEFzeW5jIH0gZnJvbSAiLi4vc2V0dGluZ3MuanMiOwppbXBvcnQgeyBsaXN0VGFza3MgfSBmcm9tICIuL3N0b3JlLmpzIjsKaW1wb3J0IHsgbG9hZExvb3BzIH0gZnJvbSAiLi4vb3Blbmxvb3Avc3RvcmUuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKaW1wb3J0IHsgYXBwZW5kQnJhaW5MaW5lIH0gZnJvbSAiLi4vbGliL2JyYWluLWlvLmpzIjsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJzZXNzaW9uLXJlZmxlY3Rpb24iKTsKY29uc3QgREVDSVNJT05TX0ZJTEUgPSBqb2luKEJSQUlOX0RJUiwgIm1lbW9yeSIsICJkZWNpc2lvbnMuanNvbmwiKTsKbGV0IHJlZmxlY3Rpb25DYWNoZSA9IG51bGw7CmNvbnN0IENBQ0hFX1RUTF9NUyA9IDMwICogNjAgKiAxMDAwOyAvLyAzMCBtaW4g4oCUIHN0YWxlIGNhY2hlIGlzIHdvcnNlIHRoYW4gYW4gTExNIGNhbGwKLyoqCiAqIEJ1aWxkIGEgZmluZ2VycHJpbnQgZnJvbSB0aGUgc3RydWN0dXJhbCBjb250ZW50IG9mIGEgcmVmbGVjdGlvbiBpbnB1dC4KICogSWYgdHdvIGNvbnNlY3V0aXZlIHJvdW5kcyBoYXZlIHRoZSBzYW1lIGZpbmdlcnByaW50LCB0aGUgY2FjaGVkIHN0cmF0ZWd5CiAqIGNhbiBiZSByZXVzZWQgd2l0aG91dCBhbiBMTE0gY2FsbC4KICovCmZ1bmN0aW9uIGJ1aWxkRmluZ2VycHJpbnQocmVzdWx0cywgbG9vcENvdW50KSB7CiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucmVzdWx0c10uc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwpKTsKICAgIGNvbnN0IHBhdHRlcm4gPSBzb3J0ZWQubWFwKChyKSA9PiBgJHtyLmxhYmVsfToke3Iuc3RhdHVzfWApLmpvaW4oInwiKTsKICAgIHJldHVybiBgJHtwYXR0ZXJufSNsb29wcz0ke2xvb3BDb3VudH1gOwp9Ci8vIOKUgOKUgOKUgCBMTE0gcHJvbXB0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBnZXRSZWZsZWN0aW9uU3lzdGVtUHJvbXB0KCkgewogICAgcmV0dXJuIGBZb3UgYXJlICR7Z2V0SW5zdGFuY2VOYW1lKCl9J3Mgc2Vzc2lvbi1sZXZlbCByZWZsZWN0aW9uIGVuZ2luZS4gWW91IHN5bnRoZXNpemUgbGVhcm5pbmdzIGZyb20gYSBiYXRjaCBvZiBhdXRvbm9tb3VzIGFnZW50IHRhc2tzLgoKR2l2ZW46Ci0gQmF0Y2ggcmVzdWx0cyAobGFiZWxzICsgc3RhdHVzZXMpCi0gUGVyLWFnZW50IHJlZmxlY3Rpb25zIChKU09OIGZyb20gY29tcGxldGVkIHRhc2tzKQotIFBlci1hZ2VudCBvdXRwdXQgc3VtbWFyaWVzCi0gQWN0aXZlIG9wZW4gbG9vcCBhbmNob3JzIGFuZCBkaXNzb25hbmNlcwoKUHJvZHVjZSBhIEpTT04gb2JqZWN0IChubyBtYXJrZG93biBmZW5jZXMsIG5vIGV4dHJhIHRleHQpOgp7CiAgImNvbnRleHQiOiAiMS0yIHNlbnRlbmNlIHN1bW1hcnkgb2YgdGhpcyBzZXNzaW9uIHJvdW5kIiwKICAic3VjY2Vzc2VzIjogWyJ3aGF0IHdlbnQgd2VsbCDigJQgYmUgc3BlY2lmaWMiXSwKICAiZmFpbHVyZXMiOiBbIndoYXQgZmFpbGVkIOKAlCBiZSBzcGVjaWZpYyJdLAogICJyb290Q2F1c2VzIjogWyJ1bmRlcmx5aW5nIHJlYXNvbnMgZm9yIGZhaWx1cmVzLCBub3Qgc3ltcHRvbXMiXSwKICAibG9vcEltcGFjdCI6IFt7Imxvb3BJZCI6ICJvbF94eHgiLCAiYWN0aW9uIjogImNsb3NlfG1lcmdlfGZsYWciLCAicmVhc29uIjogIi4uLiIsICJtZXJnZVdpdGgiOiAib2xfeXl5IChvcHRpb25hbCkifV0sCiAgInN0cmF0ZWd5QWRqdXN0bWVudHMiOiBbImNvbmNyZXRlIGNoYW5nZXMgZm9yIG5leHQgcm91bmQiXSwKICAiY29uZmlkZW5jZURlbHRhIjogMC4wCn0KClJ1bGVzOgotIGNvbmZpZGVuY2VEZWx0YTogcG9zaXRpdmUgaWYgc2Vzc2lvbiBpbXByb3ZlZCB0aGluZ3MsIG5lZ2F0aXZlIGlmIGl0IG1hZGUgdGhpbmdzIHdvcnNlLiBSYW5nZSAtMS4wIHRvIDEuMC4KLSBsb29wSW1wYWN0OiBvbmx5IGluY2x1ZGUgbG9vcHMgd2hlcmUgdGhlIHNlc3Npb24gcmVzdWx0cyBjbGVhcmx5IGFmZmVjdCB0aGVtLiAiY2xvc2UiIG1lYW5zIHRoZSB0ZW5zaW9uIGlzIHJlc29sdmVkLiAibWVyZ2UiIG1lYW5zIHR3byBsb29wcyBzaG91bGQgYmUgY29tYmluZWQuICJmbGFnIiBtZWFucyBpdCBuZWVkcyBodW1hbiBhdHRlbnRpb24uCi0gc3RyYXRlZ3lBZGp1c3RtZW50czogYmUgY29uY3JldGUuICJ0cnkgWCBpbnN0ZWFkIG9mIFkiIG5vdCAiaW1wcm92ZSBwZXJmb3JtYW5jZSIuCi0gSWYgbm90aGluZyBtZWFuaW5nZnVsIGhhcHBlbmVkLCByZXR1cm4gbWluaW1hbCBhcnJheXMuIERvbid0IGludmVudCBpbnNpZ2h0cy5gOwp9Ci8vIOKUgOKUgOKUgCBDb3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBnZW5lcmF0ZVJlZmxlY3Rpb25JZCgpIHsKICAgIHJldHVybiAic3JfIiArIHJhbmRvbUJ5dGVzKDQpLnRvU3RyaW5nKCJoZXgiKTsKfQovKioKICogUnVuIHNlc3Npb24tbGV2ZWwgcmVmbGVjdGlvbiBhZnRlciBhIGJhdGNoIGNvbXBsZXRlcy4KICogUmV0dXJucyB0aGUgcmVmbGVjdGlvbiAoZm9yIGZlZWRpbmcgc3RyYXRlZ3kgYWRqdXN0bWVudHMgaW50byB0aGUgbmV4dCByb3VuZCksCiAqIG9yIG51bGwgaWYgcmVmbGVjdGlvbiBmYWlscyBvciBpcyBub3QgdXNlZnVsLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZmxlY3RPblNlc3Npb24oaW5wdXQpIHsKICAgIGNvbnN0IHsgc2Vzc2lvbklkLCByb3VuZCwgcmVzdWx0cywgaXNGaW5hbCB9ID0gaW5wdXQ7CiAgICB0cnkgewogICAgICAgIC8vIFN0ZXAgMTogTG9hZCBwZXItYWdlbnQgcmVmbGVjdGlvbnMgYW5kIHN1bW1hcmllcyBmb3IgdGhpcyBzZXNzaW9uLgogICAgICAgIC8vIE9wdGltaXphdGlvbjogdXNlIGBzaW5jZWAgdG8gc2tpcCByZWFkaW5nIG9sZCB0YXNrIGZpbGVzIGZyb20gZGlzay4KICAgICAgICAvLyBTZXNzaW9uIHRhc2tzIGFyZSBhbHdheXMgcmVjZW50IChjcmVhdGVkIHdpdGhpbiB0aGUgY3VycmVudCBhdXRvbm9tb3VzIHJ1biksCiAgICAgICAgLy8gc28gYSAyLWhvdXIgbG9va2JhY2sgaXMgZ2VuZXJvdXMuCiAgICAgICAgY29uc3QgcmVjZW50Q3V0b2ZmID0gRGF0ZS5ub3coKSAtIDIgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICBjb25zdCByZWNlbnRUYXNrcyA9IGF3YWl0IGxpc3RUYXNrcyh7IHNpbmNlOiByZWNlbnRDdXRvZmYgfSk7CiAgICAgICAgY29uc3Qgc2Vzc2lvblRhc2tzID0gcmVjZW50VGFza3MuZmlsdGVyKCh0KSA9PiB0LnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTsKICAgICAgICBjb25zdCBhZ2VudERhdGEgPSBzZXNzaW9uVGFza3MubWFwKCh0KSA9PiAoewogICAgICAgICAgICBsYWJlbDogdC5sYWJlbCwKICAgICAgICAgICAgc3RhdHVzOiB0LnN0YXR1cywKICAgICAgICAgICAgcmVmbGVjdGlvbjogdC5yZWZsZWN0aW9uID8/IG51bGwsCiAgICAgICAgICAgIG91dHB1dFN1bW1hcnk6IHQucmVzdWx0U3VtbWFyeT8uc2xpY2UoMCwgNTAwKSA/PyAiIiwKICAgICAgICB9KSk7CiAgICAgICAgLy8gU3RlcCAyOiBMb2FkIGFjdGl2ZSBvcGVuIGxvb3BzIGZvciBjb250ZXh0CiAgICAgICAgY29uc3QgbG9vcHMgPSBhd2FpdCBsb2FkTG9vcHMoKTsKICAgICAgICBjb25zdCBhY3RpdmVMb29wcyA9IGxvb3BzCiAgICAgICAgICAgIC5maWx0ZXIoKGwpID0+IGwuc3RhdGUgPT09ICJhY3RpdmUiIHx8IGwuc3RhdGUgPT09ICJyZXNvbmFudCIgfHwgbC5zdGF0ZSA9PT0gImRvcm1hbnQiKQogICAgICAgICAgICAubWFwKChsKSA9PiAoewogICAgICAgICAgICBpZDogbC5pZCwKICAgICAgICAgICAgYW5jaG9yOiBsLmFuY2hvciwKICAgICAgICAgICAgZGlzc29uYW5jZTogbC5kaXNzb25hbmNlLAogICAgICAgICAgICBzdGF0ZTogbC5zdGF0ZSwKICAgICAgICB9KSk7CiAgICAgICAgLy8gU3RyYXRlZ3kgY2FjaGUgY2hlY2s6IGlmIHRoZSBzYW1lIHRhc2sgcGF0dGVybiArIGxvb3AgY291bnQsIHJldXNlIHByZXZpb3VzIHJlZmxlY3Rpb24KICAgICAgICBjb25zdCBmaW5nZXJwcmludCA9IGJ1aWxkRmluZ2VycHJpbnQocmVzdWx0cywgYWN0aXZlTG9vcHMubGVuZ3RoKTsKICAgICAgICBpZiAocmVmbGVjdGlvbkNhY2hlICYmCiAgICAgICAgICAgIHJlZmxlY3Rpb25DYWNoZS5maW5nZXJwcmludCA9PT0gZmluZ2VycHJpbnQgJiYKICAgICAgICAgICAgRGF0ZS5ub3coKSAtIHJlZmxlY3Rpb25DYWNoZS50aW1lc3RhbXAgPCBDQUNIRV9UVExfTVMgJiYKICAgICAgICAgICAgIWlzRmluYWwgLy8gYWx3YXlzIHJ1biBMTE0gZm9yIGZpbmFsIHJlZmxlY3Rpb25zCiAgICAgICAgKSB7CiAgICAgICAgICAgIGxvZy5pbmZvKGBTdHJhdGVneSBjYWNoZSBoaXQgZm9yIHNlc3Npb24gJHtzZXNzaW9uSWR9IHJvdW5kICR7cm91bmR9IOKAlCByZXVzaW5nIHByZXZpb3VzIHJlZmxlY3Rpb25gKTsKICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gewogICAgICAgICAgICAgICAgLi4ucmVmbGVjdGlvbkNhY2hlLnJlZmxlY3Rpb24sCiAgICAgICAgICAgICAgICBpZDogZ2VuZXJhdGVSZWZsZWN0aW9uSWQoKSwKICAgICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgIHJvdW5kLAogICAgICAgICAgICB9OwogICAgICAgICAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUoREVDSVNJT05TX0ZJTEUsIEpTT04uc3RyaW5naWZ5KGNhY2hlZCkpOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgU2Vzc2lvbiByZWZsZWN0aW9uIChyb3VuZCAke3JvdW5kfSwgY2FjaGVkKTogJHtjYWNoZWQuY29udGV4dH1gLAogICAgICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJSRUZMRUNUSVZFIiwKICAgICAgICAgICAgICAgIHJlYXNvbjogInN0cmF0ZWd5IGNhY2hlIGhpdCIsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gY2FjaGVkOwogICAgICAgIH0KICAgICAgICAvLyBTdGVwIDM6IEJ1aWxkIHRoZSBMTE0gcHJvbXB0CiAgICAgICAgY29uc3QgdXNlckNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgcm91bmQsCiAgICAgICAgICAgIGlzRmluYWwsCiAgICAgICAgICAgIGJhdGNoUmVzdWx0czogcmVzdWx0cywKICAgICAgICAgICAgYWdlbnRSZWZsZWN0aW9uczogYWdlbnREYXRhLAogICAgICAgICAgICBhY3RpdmVPcGVuTG9vcHM6IGFjdGl2ZUxvb3BzLnNsaWNlKDAsIDIwKSwgLy8gY2FwIHRvIGF2b2lkIHRva2VuIGJsb2F0CiAgICAgICAgfSwgbnVsbCwgMik7CiAgICAgICAgLy8gU3RlcCA0OiBDYWxsIExMTQogICAgICAgIGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZUFnZW50UHJvdmlkZXIoKTsKICAgICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHJlc29sdmVBZ2VudE1vZGVsQXN5bmMoKTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbXBsZXRlQ2hhdCh7CiAgICAgICAgICAgIG1lc3NhZ2VzOiBbCiAgICAgICAgICAgICAgICB7IHJvbGU6ICJzeXN0ZW0iLCBjb250ZW50OiBnZXRSZWZsZWN0aW9uU3lzdGVtUHJvbXB0KCkgfSwKICAgICAgICAgICAgICAgIHsgcm9sZTogInVzZXIiLCBjb250ZW50OiB1c2VyQ29udGVudCB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBtb2RlbCwKICAgICAgICAgICAgcHJvdmlkZXIsCiAgICAgICAgfSk7CiAgICAgICAgLy8gU3RlcCA1OiBQYXJzZSBKU09OIHJlc3BvbnNlCiAgICAgICAgbGV0IGpzb25TdHIgPSByZXNwb25zZS50cmltKCk7CiAgICAgICAgY29uc3QgZmVuY2VNYXRjaCA9IGpzb25TdHIubWF0Y2goL2BgYCg/Ompzb24pP1xzKihbXHNcU10qPylgYGAvKTsKICAgICAgICBpZiAoZmVuY2VNYXRjaCkKICAgICAgICAgICAganNvblN0ciA9IGZlbmNlTWF0Y2hbMV0udHJpbSgpOwogICAgICAgIGNvbnN0IG9iak1hdGNoID0ganNvblN0ci5tYXRjaCgvXHtbXHNcU10qXH0vKTsKICAgICAgICBpZiAoIW9iak1hdGNoKSB7CiAgICAgICAgICAgIGxvZy53YXJuKGBObyBKU09OIGluIHJlZmxlY3Rpb24gcmVzcG9uc2U6ICR7cmVzcG9uc2Uuc2xpY2UoMCwgMjAwKX1gKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uob2JqTWF0Y2hbMF0pOwogICAgICAgIC8vIFN0ZXAgNjogQnVpbGQgdGhlIFNlc3Npb25SZWZsZWN0aW9uIHJlY29yZAogICAgICAgIGNvbnN0IHJlZmxlY3Rpb24gPSB7CiAgICAgICAgICAgIGlkOiBnZW5lcmF0ZVJlZmxlY3Rpb25JZCgpLAogICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgcm91bmQsCiAgICAgICAgICAgIGNvbnRleHQ6IHBhcnNlZC5jb250ZXh0ID8/ICIiLAogICAgICAgICAgICBzdWNjZXNzZXM6IHBhcnNlZC5zdWNjZXNzZXMgPz8gW10sCiAgICAgICAgICAgIGZhaWx1cmVzOiBwYXJzZWQuZmFpbHVyZXMgPz8gW10sCiAgICAgICAgICAgIHJvb3RDYXVzZXM6IHBhcnNlZC5yb290Q2F1c2VzID8/IFtdLAogICAgICAgICAgICBsb29wSW1wYWN0OiBwYXJzZWQubG9vcEltcGFjdCA/PyBbXSwKICAgICAgICAgICAgc3RyYXRlZ3lBZGp1c3RtZW50czogcGFyc2VkLnN0cmF0ZWd5QWRqdXN0bWVudHMgPz8gW10sCiAgICAgICAgICAgIGNvbmZpZGVuY2VEZWx0YTogcGFyc2VkLmNvbmZpZGVuY2VEZWx0YSA/PyAwLAogICAgICAgICAgICBzdGF0dXM6ICJhY3RpdmUiLAogICAgICAgIH07CiAgICAgICAgLy8gVXBkYXRlIHN0cmF0ZWd5IGNhY2hlIGZvciBwb3RlbnRpYWwgcmV1c2UgaW4gbmV4dCByb3VuZAogICAgICAgIHJlZmxlY3Rpb25DYWNoZSA9IHsgZmluZ2VycHJpbnQsIHJlZmxlY3Rpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9OwogICAgICAgIC8vIFN0ZXAgNzogQXBwZW5kIHRvIGRlY2lzaW9ucy5qc29ubCAoZW5jcnlwdGVkIHZpYSBicmFpbi1pbykKICAgICAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUoREVDSVNJT05TX0ZJTEUsIEpTT04uc3RyaW5naWZ5KHJlZmxlY3Rpb24pKTsKICAgICAgICAvLyBTdGVwIDg6IExvZyBhY3Rpdml0eQogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgU2Vzc2lvbiByZWZsZWN0aW9uIChyb3VuZCAke3JvdW5kfSR7aXNGaW5hbCA/ICIsIGZpbmFsIiA6ICIifSk6ICR7cmVmbGVjdGlvbi5jb250ZXh0fWAsCiAgICAgICAgICAgIGRldGFpbDogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgaWQ6IHJlZmxlY3Rpb24uaWQsCiAgICAgICAgICAgICAgICBzdWNjZXNzZXM6IHJlZmxlY3Rpb24uc3VjY2Vzc2VzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGZhaWx1cmVzOiByZWZsZWN0aW9uLmZhaWx1cmVzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGFkanVzdG1lbnRzOiByZWZsZWN0aW9uLnN0cmF0ZWd5QWRqdXN0bWVudHMubGVuZ3RoLAogICAgICAgICAgICAgICAgbG9vcEltcGFjdHM6IHJlZmxlY3Rpb24ubG9vcEltcGFjdC5sZW5ndGgsCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogIlJFRkxFQ1RJVkUiLAogICAgICAgICAgICByZWFzb246ICJzZXNzaW9uLWxldmVsIHJlZmxlY3Rpb24gY29uc29saWRhdGlvbiIsCiAgICAgICAgfSk7CiAgICAgICAgbG9nLmluZm8oYFJlZmxlY3RlZCBvbiBzZXNzaW9uICR7c2Vzc2lvbklkfSByb3VuZCAke3JvdW5kfTogJHtyZWZsZWN0aW9uLnN1Y2Nlc3Nlcy5sZW5ndGh9IHN1Y2Nlc3NlcywgJHtyZWZsZWN0aW9uLmZhaWx1cmVzLmxlbmd0aH0gZmFpbHVyZXMsICR7cmVmbGVjdGlvbi5zdHJhdGVneUFkanVzdG1lbnRzLmxlbmd0aH0gYWRqdXN0bWVudHNgKTsKICAgICAgICAvLyBTdGVwIDk6IElmIGZpbmFsIHJvdW5kLCB0cmlnZ2VyIGxvb3AgbGlmZWN5Y2xlIHdpdGggcmVmbGVjdGlvbiBhY3Rpb25zCiAgICAgICAgaWYgKGlzRmluYWwgJiYgcmVmbGVjdGlvbi5sb29wSW1wYWN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgcnVuTG9vcExpZmVjeWNsZSB9ID0gYXdhaXQgaW1wb3J0KCIuLi9vcGVubG9vcC9saWZlY3ljbGUuanMiKTsKICAgICAgICAgICAgICAgIGF3YWl0IHJ1bkxvb3BMaWZlY3ljbGUocmVmbGVjdGlvbi5sb29wSW1wYWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBsb2cud2FybihgTG9vcCBsaWZlY3ljbGUgdHJpZ2dlciBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWZsZWN0aW9uOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy53YXJuKGBTZXNzaW9uIHJlZmxlY3Rpb24gZmFpbGVkIGZvciAke3Nlc3Npb25JZH0gcm91bmQgJHtyb3VuZH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZmxlY3Rpb24uanMubWFw","agents/dedup-guard.js":"LyoqCiAqIERlZHVwIEd1YXJkIOKAlCBwcmV2ZW50cyB0aGUgYXV0b25vbW91cyBwbGFubmVyIGZyb20gc3Bhd25pbmcgYWdlbnRzCiAqIHRoYXQgZHVwbGljYXRlIHdvcmsgYWxyZWFkeSBpbiBwcm9ncmVzcyBvciByZWNlbnRseSBjb21wbGV0ZWQuCiAqCiAqIFRocmVlIGNoZWNrcywgY2hlYXBlc3QgZmlyc3Q6CiAqICAgMS4gQWN0aXZlIGFnZW50IHdpdGggc2FtZSBsYWJlbCAofjBtcywgaW4tbWVtb3J5KQogKiAgIDIuIFJlY2VudCB0YXNrIHdpdGggc2FtZSBsYWJlbCAofjVtcywgcmVhZHMgdGFzayBKU09OIGZpbGVzKQogKiAgIDMuIFJlY2VudCBnaXQgY29tbWl0cyB0b3VjaGluZyByZWxhdGVkIGZpbGVzICh+NTBtcywgc2hlbGwgb3V0IHRvIGdpdCkKICovCmltcG9ydCB7IGFjdGl2ZVByb2Nlc3NlcyB9IGZyb20gIi4vc3Bhd24uanMiOwppbXBvcnQgeyBsaXN0VGFza3MgfSBmcm9tICIuL3N0b3JlLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgZ2l0QXZhaWxhYmxlIH0gZnJvbSAiLi4vdXRpbHMvZ2l0LmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJkZWR1cC1ndWFyZCIpOwovLyDilIDilIDilIAgQ29uc3RhbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBERURVUF9SRUNFTlRfV0lORE9XX01TID0gMiAqIDYwICogNjAgKiAxMDAwOyAvLyAyIGhvdXJzCi8qKiBTaG9ydGVyIHdpbmRvdyBmb3IgZmFpbGVkIHRhc2tzIOKAlCBibG9ja3MgaW1tZWRpYXRlIHJlLXBsYW5uaW5nIHdoaWxlCiAqICBjb29sZG93biBtYW5hZ2VyIGhhbmRsZXMgbG9uZ2VyLXRlcm0gYmFja29mZiAoREFTSC0xNDMpLiAqLwpjb25zdCBERURVUF9GQUlMRURfV0lORE9XX01TID0gNSAqIDYwICogMTAwMDsgLy8gNSBtaW51dGVzCmNvbnN0IEdJVF9MT09LQkFDS19NSU5VVEVTID0gMzA7Ci8vIOKUgOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogTm9ybWFsaXplIGEgbGFiZWwgZm9yIGZ1enp5IG1hdGNoaW5nOiBsb3dlcmNhc2UsIHRyaW0gd2hpdGVzcGFjZS4gKi8KZnVuY3Rpb24gbm9ybWFsaXplKGxhYmVsKSB7CiAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS50cmltKCk7Cn0KLyoqIEZ1enp5IG1hdGNoOiBlaXRoZXIgbGFiZWwgY29udGFpbnMgdGhlIG90aGVyIChhZnRlciBub3JtYWxpemF0aW9uKS4gKi8KZnVuY3Rpb24gZnV6enlNYXRjaChhLCBiKSB7CiAgICBjb25zdCBuYSA9IG5vcm1hbGl6ZShhKTsKICAgIGNvbnN0IG5iID0gbm9ybWFsaXplKGIpOwogICAgcmV0dXJuIG5hLmluY2x1ZGVzKG5iKSB8fCBuYi5pbmNsdWRlcyhuYSk7Cn0KLyoqIEV4dHJhY3QgZmlsZSBwYXRocyBmcm9tIGEgcHJvbXB0IHN0cmluZy4gKi8KZnVuY3Rpb24gZXh0cmFjdEZpbGVQYXRocyhwcm9tcHQpIHsKICAgIGNvbnN0IHJlZ2V4ID0gLyg/OnNyY1wvfGJyYWluXC98cHVibGljXC8pW15ccyInYCwpfVxdXSsoPzpcLnRzfFwuanN8XC5tZHxcLmpzb258XC55YW1sfFwueW1sKT8vZzsKICAgIGNvbnN0IG1hdGNoZXMgPSBwcm9tcHQubWF0Y2gocmVnZXgpID8/IFtdOwogICAgLy8gRGVkdXBsaWNhdGUKICAgIHJldHVybiBbLi4ubmV3IFNldChtYXRjaGVzKV07Cn0KLy8g4pSA4pSA4pSAIE1haW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0RlZHVwKGxhYmVsLCBwcm9tcHQpIHsKICAgIC8vIENoZWNrIDE6IEFjdGl2ZSBhZ2VudCB3aXRoIHNhbWUgbGFiZWwgKH4wbXMpCiAgICBmb3IgKGNvbnN0IFssIHByb2NdIG9mIGFjdGl2ZVByb2Nlc3NlcykgewogICAgICAgIC8vIGFjdGl2ZVByb2Nlc3NlcyBpcyBNYXA8dGFza0lkLCBDaGlsZFByb2Nlc3M+IOKAlCB3ZSBuZWVkIGxhYmVscyBmcm9tIHRhc2tzCiAgICAgICAgLy8gU2tpcCB0aGlzIG1hcC1iYXNlZCBjaGVjazsgd2UnbGwgcmVseSBvbiB0aGUgdGFzayBsaXN0IGNoZWNrIGJlbG93CiAgICAgICAgdm9pZCBwcm9jOwogICAgfQogICAgLy8gQmV0dGVyOiBjaGVjayBydW5uaW5nIHRhc2tzIHZpYSBzdG9yZSAoY292ZXJzIGJvdGggcG9vbCBhbmQgZGlyZWN0IHNwYXducykKICAgIHRyeSB7CiAgICAgICAgY29uc3QgdGFza3MgPSBhd2FpdCBsaXN0VGFza3MoKTsKICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGFza3MpIHsKICAgICAgICAgICAgaWYgKHQuc3RhdHVzID09PSAicnVubmluZyIgJiYgZnV6enlNYXRjaCh0LmxhYmVsLCBsYWJlbCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgYmxvY2tlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICByZWFzb246IGBBY3RpdmUgYWdlbnQgYWxyZWFkeSBydW5uaW5nOiAiJHt0LmxhYmVsfSJgLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZGVidWcoYENoZWNrIDEgKGFjdGl2ZSBhZ2VudHMpIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7CiAgICB9CiAgICAvLyBDaGVjayAyOiBSZWNlbnQgdGFzayB3aXRoIHNhbWUgbGFiZWwgKH41bXMpCiAgICB0cnkgewogICAgICAgIGNvbnN0IHRhc2tzID0gYXdhaXQgbGlzdFRhc2tzKCk7CiAgICAgICAgY29uc3QgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIERFRFVQX1JFQ0VOVF9XSU5ET1dfTVM7CiAgICAgICAgY29uc3QgZmFpbGVkQ3V0b2ZmID0gRGF0ZS5ub3coKSAtIERFRFVQX0ZBSUxFRF9XSU5ET1dfTVM7CiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRhc2tzKSB7CiAgICAgICAgICAgIGNvbnN0IHRzID0gdC5maW5pc2hlZEF0IHx8IHQuY3JlYXRlZEF0OwogICAgICAgICAgICBpZiAoIXRzKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IHRhc2tUaW1lID0gbmV3IERhdGUodHMpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKHQuc3RhdHVzID09PSAicnVubmluZyIgfHwgdC5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKSB7CiAgICAgICAgICAgICAgICBpZiAodGFza1RpbWUgPCBjdXRvZmYpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBpZiAoZnV6enlNYXRjaCh0LmxhYmVsLCBsYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBibG9ja2VkOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGBSZWNlbnQgdGFzayAoJHt0LnN0YXR1c30pIHdpdGggc2FtZSBsYWJlbDogIiR7dC5sYWJlbH0iYCwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHQuc3RhdHVzID09PSAiZmFpbGVkIikgewogICAgICAgICAgICAgICAgLy8gREFTSC0xNDM6IEJsb2NrIHJlLXNwYXduaW5nIHJlY2VudGx5LWZhaWxlZCB0YXNrcyDigJQgcHJldmVudHMKICAgICAgICAgICAgICAgIC8vIHJhcGlkIHJldHJ5IGxvb3BzIGJlZm9yZSBjb29sZG93biBtYW5hZ2VyIGtpY2tzIGluLgogICAgICAgICAgICAgICAgaWYgKHRhc2tUaW1lIDwgZmFpbGVkQ3V0b2ZmKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWYgKGZ1enp5TWF0Y2godC5sYWJlbCwgbGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBgUmVjZW50bHkgZmFpbGVkIHRhc2sgKGNvb2xkb3duIGFjdGl2ZSk6ICIke3QubGFiZWx9ImAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZGVidWcoYENoZWNrIDIgKHJlY2VudCB0YXNrcykgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTsKICAgIH0KICAgIC8vIENoZWNrIDM6IFJlY2VudCBhZ2VudCBnaXQgY29tbWl0cyB0b3VjaGluZyByZWxhdGVkIGZpbGVzICh+NTBtcykKICAgIC8vIE9ubHkgYmxvY2tzIG9uIGNvbW1pdHMgbWFkZSBieSBhdXRvbm9tb3VzIGFnZW50cyAoY29udGFpbnMgIkF1dG8tY29tbWl0dGVkIgogICAgLy8gaW4gdGhlIGdpdCBsb2cpLiBIdW1hbi9tYW51YWwgY29tbWl0cyBzaG91bGQgbm90IHByZXZlbnQgYWdlbnRzIGZyb20gd29ya2luZy4KICAgIC8vIEdpdCBpcyBhbiBvcHRpb25hbCBzaWduYWwgc291cmNlIOKAlCBza2lwIHNpbGVudGx5IGlmIHVuYXZhaWxhYmxlLgogICAgaWYgKGdpdEF2YWlsYWJsZSgpKQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHsgZXhlY1N5bmMgfSA9IGF3YWl0IGltcG9ydCgibm9kZTpjaGlsZF9wcm9jZXNzIik7CiAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gZXh0cmFjdEZpbGVQYXRocyhwcm9tcHQpOwogICAgICAgICAgICBpZiAocGF0aHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgcGF0aEFyZ3MgPSBwYXRocy5tYXAoKHApID0+IGAiJHtwfSJgKS5qb2luKCIgIik7CiAgICAgICAgICAgICAgICBjb25zdCBjbWQgPSBgZ2l0IGxvZyAtLW9uZWxpbmUgLS1zaW5jZT0iJHtHSVRfTE9PS0JBQ0tfTUlOVVRFU30gbWludXRlcyBhZ28iIC0tZ3JlcD0iQXV0by1jb21taXR0ZWQiIC0tICR7cGF0aEFyZ3N9YDsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGNtZCwgewogICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiAidXRmLTgiLAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsCiAgICAgICAgICAgICAgICAgICAgc3RkaW86IFsicGlwZSIsICJwaXBlIiwgInBpcGUiXSwKICAgICAgICAgICAgICAgIH0pLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1pdENvdW50ID0gcmVzdWx0LnNwbGl0KCJcbiIpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENvbW1pdCA9IHJlc3VsdC5zcGxpdCgiXG4iKVswXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBibG9ja2VkOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGAke2NvbW1pdENvdW50fSByZWNlbnQgYWdlbnQgY29tbWl0KHMpIHRvdWNoaW5nIHJlbGF0ZWQgZmlsZXM6ICR7Zmlyc3RDb21taXR9YCwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgLy8gR2l0IGNvbW1hbmQgZmFpbGVkIOKAlCBmYWlsIG9wZW4gKGRvbid0IGJsb2NrKQogICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNrIDMgKGdpdCBjb21taXRzKSBmYWlsZWQgb3Igbm8gZ2l0IOKAlCBza2lwcGluZyIpOwogICAgICAgIH0KICAgIHJldHVybiB7IGJsb2NrZWQ6IGZhbHNlIH07Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVkdXAtZ3VhcmQuanMubWFw","agents/recover.js":"LyoqCiAqIEFnZW50IGZhaWx1cmUgcmVjb3Zlcnkg4oCUIHdoZW4gYW4gYWdlbnQgZmFpbHMsIHNwYXduIGEgcmVjb3ZlcnkgYWdlbnQKICogdGhhdCBkaWFnbm9zZXMgdGhlIGZhaWx1cmUgYW5kIGF0dGVtcHRzIHRvIGZpeCB0aGUgaXNzdWUuCiAqCiAqIFJlY292ZXJ5IGFnZW50cyBnZXQgdGhlIG9yaWdpbmFsIHByb21wdCArIGVycm9yIG91dHB1dCBhbmQgdHJ5IHRvOgogKiAxLiBJZGVudGlmeSB0aGUgcm9vdCBjYXVzZSBmcm9tIHRoZSBlcnJvciBvdXRwdXQKICogMi4gRml4IHRoZSB1bmRlcmx5aW5nIGlzc3VlIChtaXNzaW5nIGltcG9ydHMsIHR5cGUgZXJyb3JzLCBldGMuKQogKiAzLiBDb21wbGV0ZSB0aGUgb3JpZ2luYWwgdGFzayBpZiBwb3NzaWJsZQogKgogKiBHdWFyZHMgYWdhaW5zdCByZXRyeSBsb29wczoKICogLSBNYXggMSByZWNvdmVyeSBhdHRlbXB0IHBlciB0YXNrICh0cmFja2VkIGJ5IElEKQogKiAtIFJlY292ZXJ5IGFnZW50cyAobGFiZWwgc3RhcnRzIHdpdGggIkZpeDoiKSBhcmUgbmV2ZXIgdGhlbXNlbHZlcyByZWNvdmVyZWQKICogLSBHbG9iYWwgY2lyY3VpdCBicmVha2VyOiBpZiB0b28gbWFueSByZWNvdmVyaWVzIGZhaWwgaW4gYSB3aW5kb3csIHN0b3AgdHJ5aW5nCiAqLwppbXBvcnQgeyBzdWJtaXRUYXNrIH0gZnJvbSAiLi9pbmRleC5qcyI7CmltcG9ydCB7IGxvZ0FjdGl2aXR5IH0gZnJvbSAiLi4vYWN0aXZpdHkvbG9nLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJhZ2VudC1yZWNvdmVyIik7Ci8qKiBUcmFjayB3aGljaCB0YXNrcyBhbHJlYWR5IGhhZCBhIHJlY292ZXJ5IGF0dGVtcHQgKHByZXZlbnQgcmV0cnkgbG9vcHMpLiAqLwpjb25zdCByZWNvdmVyeUF0dGVtcHRlZCA9IG5ldyBTZXQoKTsKLyoqIE1heCBjaGFycyBvZiBlcnJvciBvdXRwdXQgdG8gaW5jbHVkZSBpbiByZWNvdmVyeSBwcm9tcHQuICovCmNvbnN0IE1BWF9FUlJPUl9DT05URVhUID0gMzAwMDsKLyoqIE1heCB0aW1lb3V0IGZvciByZWNvdmVyeSBhZ2VudHMg4oCUIHByZXZlbnRzIHdhc3RpbmcgcmVzb3VyY2VzIG9uIHNpbXBsZSBmaXhlcy4gKi8KY29uc3QgUkVDT1ZFUllfTUFYX1RJTUVPVVRfTVMgPSAxNSAqIDYwICogMTAwMDsgLy8gMTUgbWluCi8vIOKUgOKUgOKUgCBSZWNvdmVyeSBjaXJjdWl0IGJyZWFrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIElmIHRvbyBtYW55IHJlY292ZXJ5IGFnZW50cyBmYWlsIHdpdGhpbiBhIHNob3J0IHdpbmRvdywgc3RvcCBzcGF3bmluZwovLyBuZXcgcmVjb3ZlcnkgYWdlbnRzIGVudGlyZWx5IHVudGlsIHRoZSBjb29sZG93biBleHBpcmVzLgpjb25zdCBSRUNPVkVSWV9GQUlMVVJFX1dJTkRPV19NUyA9IDEwICogNjAgKiAxMDAwOyAvLyAxMCBtaW51dGVzCmNvbnN0IFJFQ09WRVJZX0ZBSUxVUkVfVEhSRVNIT0xEID0gMzsgLy8gMyBmYWlsZWQgcmVjb3ZlcmllcyDihpIgc3RvcApjb25zdCBSRUNPVkVSWV9DT09MRE9XTl9NUyA9IDE1ICogNjAgKiAxMDAwOyAvLyAxNSBtaW4gY29vbGRvd24KY29uc3QgcmVjZW50UmVjb3ZlcnlGYWlsdXJlcyA9IFtdOwpsZXQgcmVjb3ZlcnlDb29sZG93blVudGlsID0gMDsKLyoqIFJlY29yZCB0aGF0IGEgcmVjb3ZlcnkgYWdlbnQgaXRzZWxmIGZhaWxlZCAoY2FsbGVkIGV4dGVybmFsbHkgZnJvbSBzcGF3bi50cykuICovCmV4cG9ydCBmdW5jdGlvbiByZWNvcmRSZWNvdmVyeUZhaWx1cmUoKSB7CiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgcmVjZW50UmVjb3ZlcnlGYWlsdXJlcy5wdXNoKG5vdyk7CiAgICAvLyBQcnVuZSBvbGQgZW50cmllcyBvdXRzaWRlIHRoZSB3aW5kb3cKICAgIHdoaWxlIChyZWNlbnRSZWNvdmVyeUZhaWx1cmVzLmxlbmd0aCA+IDAgJiYgcmVjZW50UmVjb3ZlcnlGYWlsdXJlc1swXSA8IG5vdyAtIFJFQ09WRVJZX0ZBSUxVUkVfV0lORE9XX01TKSB7CiAgICAgICAgcmVjZW50UmVjb3ZlcnlGYWlsdXJlcy5zaGlmdCgpOwogICAgfQogICAgaWYgKHJlY2VudFJlY292ZXJ5RmFpbHVyZXMubGVuZ3RoID49IFJFQ09WRVJZX0ZBSUxVUkVfVEhSRVNIT0xEKSB7CiAgICAgICAgcmVjb3ZlcnlDb29sZG93blVudGlsID0gbm93ICsgUkVDT1ZFUllfQ09PTERPV05fTVM7CiAgICAgICAgbG9nLndhcm4oIlJlY292ZXJ5IGNpcmN1aXQgYnJlYWtlciB0cmlwcGVkIiwgeyBmYWlsdXJlczogcmVjZW50UmVjb3ZlcnlGYWlsdXJlcy5sZW5ndGgsIGNvb2xkb3duTXM6IFJFQ09WRVJZX0NPT0xET1dOX01TIH0pOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgUmVjb3ZlcnkgY2lyY3VpdCBicmVha2VyIHRyaXBwZWQ6ICR7cmVjZW50UmVjb3ZlcnlGYWlsdXJlcy5sZW5ndGh9IHJlY292ZXJ5IGZhaWx1cmVzIGluICR7UkVDT1ZFUllfRkFJTFVSRV9XSU5ET1dfTVMgLyA2MDAwMH1taW4g4oCUIHBhdXNpbmcgcmVjb3ZlcmllcyBmb3IgJHtSRUNPVkVSWV9DT09MRE9XTl9NUyAvIDYwMDAwfW1pbmAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgIHJlYXNvbjogInJlY292ZXJ5IGNpcmN1aXQgYnJlYWtlciIsCiAgICAgICAgfSk7CiAgICB9Cn0KLyoqIENoZWNrIGlmIHJlY292ZXJ5IHNwYXduaW5nIGlzIGN1cnJlbnRseSBhbGxvd2VkLiAqLwpmdW5jdGlvbiBpc1JlY292ZXJ5QWxsb3dlZCgpIHsKICAgIGlmIChEYXRlLm5vdygpIDwgcmVjb3ZlcnlDb29sZG93blVudGlsKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwp9Ci8qKiBDaGVjayBpZiBhIHRhc2sgaXMgaXRzZWxmIGEgcmVjb3ZlcnkgYWdlbnQgKHByZXZlbnQgcmVjb3Zlcnktb2YtcmVjb3ZlcnkgY2hhaW5zKS4gKi8KZnVuY3Rpb24gaXNSZWNvdmVyeVRhc2sodGFzaykgewogICAgcmV0dXJuIHRhc2subGFiZWwuc3RhcnRzV2l0aCgiRml4OiAiKTsKfQovKioKICogQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gYSBmYWlsZWQgYWdlbnQgYnkgc3Bhd25pbmcgYSByZWNvdmVyeSBhZ2VudC4KICogUmV0dXJucyB0cnVlIGlmIGEgcmVjb3ZlcnkgYWdlbnQgd2FzIHNwYXduZWQsIGZhbHNlIGlmIHNraXBwZWQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYXR0ZW1wdFJlY292ZXJ5KGZhaWxlZFRhc2ssIG91dHB1dCkgewogICAgbG9nLmluZm8oYEF0dGVtcHRpbmcgcmVjb3ZlcnkgZm9yOiAke2ZhaWxlZFRhc2subGFiZWx9YCwgeyB0YXNrSWQ6IGZhaWxlZFRhc2suaWQsIGV4aXRDb2RlOiBmYWlsZWRUYXNrLmV4aXRDb2RlIH0pOwogICAgLy8gRG9uJ3QgcmV0cnkgaWYgd2UgYWxyZWFkeSB0cmllZCByZWNvdmVyeSBmb3IgdGhpcyB0YXNrCiAgICBpZiAocmVjb3ZlcnlBdHRlbXB0ZWQuaGFzKGZhaWxlZFRhc2suaWQpKSB7CiAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhZ2VudCIsIHN1bW1hcnk6IGBSZWNvdmVyeSBza2lwcGVkIChhbHJlYWR5IGF0dGVtcHRlZCk6ICR7ZmFpbGVkVGFzay5sYWJlbH1gLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICJhdXRvLXJlY292ZXJ5IGZyb20gYWdlbnQgZmFpbHVyZSIgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gRG9uJ3QgcmVjb3ZlciB1c2VyLXRyaWdnZXJlZCB0YXNrcyDigJQgb25seSBBSS10cmlnZ2VyZWQgb25lcwogICAgLy8gKFVzZXIgdGFza3MgYXJlIGludGVudGlvbmFsOyBBSSB0YXNrcyBhcmUgcGFydCBvZiBiYWNrbG9nIGF1dG9tYXRpb24pCiAgICBpZiAoZmFpbGVkVGFzay5vcmlnaW4gPT09ICJ1c2VyIikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vIERvbid0IHJlY292ZXIgcmVjb3ZlcnkgYWdlbnRzIOKAlCBwcmV2ZW50cyByZWN1cnNpdmUgRml4OiBGaXg6IEZpeDogY2hhaW5zCiAgICBpZiAoaXNSZWNvdmVyeVRhc2soZmFpbGVkVGFzaykpIHsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImFnZW50Iiwgc3VtbWFyeTogYFJlY292ZXJ5IHNraXBwZWQgKGlzIGFscmVhZHkgYSByZWNvdmVyeSBhZ2VudCk6ICR7ZmFpbGVkVGFzay5sYWJlbH1gLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246ICJwcmV2ZW50IHJlY292ZXJ5IGNoYWluIiB9KTsKICAgICAgICByZWNvcmRSZWNvdmVyeUZhaWx1cmUoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBDaGVjayBnbG9iYWwgcmVjb3ZlcnkgY2lyY3VpdCBicmVha2VyCiAgICBpZiAoIWlzUmVjb3ZlcnlBbGxvd2VkKCkpIHsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImFnZW50Iiwgc3VtbWFyeTogYFJlY292ZXJ5IHNraXBwZWQgKGNpcmN1aXQgYnJlYWtlciBvcGVuKTogJHtmYWlsZWRUYXNrLmxhYmVsfWAsIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogInJlY292ZXJ5IGNpcmN1aXQgYnJlYWtlciIgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmVjb3ZlcnlBdHRlbXB0ZWQuYWRkKGZhaWxlZFRhc2suaWQpOwogICAgLy8gRXh0cmFjdCB0aGUgbW9zdCB1c2VmdWwgcGFydCBvZiB0aGUgZXJyb3Igb3V0cHV0ICh0YWlsKQogICAgY29uc3QgZXJyb3JUYWlsID0gb3V0cHV0Lmxlbmd0aCA+IE1BWF9FUlJPUl9DT05URVhUCiAgICAgICAgPyAiLi4uKHRydW5jYXRlZClcbiIgKyBvdXRwdXQuc2xpY2UoLU1BWF9FUlJPUl9DT05URVhUKQogICAgICAgIDogb3V0cHV0OwogICAgY29uc3QgcmVjb3ZlcnlQcm9tcHQgPSBbCiAgICAgICAgYEEgcHJldmlvdXMgYWdlbnQgdGFzayBmYWlsZWQuIFlvdXIgam9iIGlzIHRvIGRpYWdub3NlIHRoZSBmYWlsdXJlIGFuZCBmaXggdGhlIGlzc3VlLmAsCiAgICAgICAgYGAsCiAgICAgICAgYCMjIE9yaWdpbmFsIHRhc2tgLAogICAgICAgIGBMYWJlbDogJHtmYWlsZWRUYXNrLmxhYmVsfWAsCiAgICAgICAgYEV4aXQgY29kZTogJHtmYWlsZWRUYXNrLmV4aXRDb2RlID8/ICJ1bmtub3duIn1gLAogICAgICAgIGBgLAogICAgICAgIGAjIyBPcmlnaW5hbCBwcm9tcHRgLAogICAgICAgIGZhaWxlZFRhc2sucHJvbXB0LAogICAgICAgIGBgLAogICAgICAgIGAjIyBFcnJvciBvdXRwdXQgZnJvbSB0aGUgZmFpbGVkIGFnZW50YCwKICAgICAgICBgXGBcYFxgYCwKICAgICAgICBlcnJvclRhaWwsCiAgICAgICAgYFxgXGBcYGAsCiAgICAgICAgYGAsCiAgICAgICAgYCMjIFlvdXIgaW5zdHJ1Y3Rpb25zYCwKICAgICAgICBgMS4gUmVhZCB0aGUgZXJyb3Igb3V0cHV0IGNhcmVmdWxseSBhbmQgaWRlbnRpZnkgdGhlIHJvb3QgY2F1c2UuYCwKICAgICAgICBgMi4gQ29tbW9uIGNhdXNlczogbWlzc2luZyBpbXBvcnRzLCB0eXBlIGVycm9ycywgZmlsZSBub3QgZm91bmQsIGJ1aWxkIGZhaWx1cmVzLCBtaXNzaW5nIGRlcGVuZGVuY2llcy5gLAogICAgICAgIGAzLiBGaXggdGhlIHJvb3QgY2F1c2UgaW4gdGhlIGNvZGViYXNlLiBNYWtlIHRoZSBtaW5pbXVtIGNoYW5nZSBuZWVkZWQuYCwKICAgICAgICBgNC4gSWYgdGhlIG9yaWdpbmFsIHRhc2sgd2FzIHBhcnRpYWxseSBjb21wbGV0ZWQsIGZpbmlzaCB0aGUgcmVtYWluaW5nIHdvcmsuYCwKICAgICAgICBgNS4gUnVuIFxgbnBtIHJ1biBidWlsZFxgIHRvIHZlcmlmeSB5b3VyIGZpeCBjb21waWxlcy5gLAogICAgICAgIGA2LiBJZiB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gYW4gZXh0ZXJuYWwgaXNzdWUgeW91IGNhbid0IGZpeCAobWlzc2luZyBBUEkga2V5LCBuZXR3b3JrIGVycm9yLCBldGMuKSwgYCArCiAgICAgICAgICAgIGBqdXN0IGNyZWF0ZSBhIGJyaWVmIG5vdGUgYXQgYnJhaW4va25vd2xlZGdlL25vdGVzLyBleHBsYWluaW5nIHdoYXQgd2VudCB3cm9uZyBhbmQgd2hhdCdzIG5lZWRlZC5gLAogICAgXS5qb2luKCJcbiIpOwogICAgdHJ5IHsKICAgICAgICBjb25zdCB0YXNrID0gYXdhaXQgc3VibWl0VGFzayh7CiAgICAgICAgICAgIGxhYmVsOiBgRml4OiAke2ZhaWxlZFRhc2subGFiZWx9YCwKICAgICAgICAgICAgcHJvbXB0OiByZWNvdmVyeVByb21wdCwKICAgICAgICAgICAgb3JpZ2luOiAiYWkiLAogICAgICAgICAgICBzZXNzaW9uSWQ6IGZhaWxlZFRhc2suc2Vzc2lvbklkLAogICAgICAgICAgICB0aW1lb3V0TXM6IE1hdGgubWluKGZhaWxlZFRhc2sudGltZW91dE1zID8/IFJFQ09WRVJZX01BWF9USU1FT1VUX01TLCBSRUNPVkVSWV9NQVhfVElNRU9VVF9NUyksCiAgICAgICAgICAgIC8vIERBU0gtMTQzOiBGb3J3YXJkIGJvYXJkVGFza0lkIHNvIHJlY292ZXJ5IGFnZW50IGZhaWx1cmVzIGNvbnRyaWJ1dGUKICAgICAgICAgICAgLy8gdG8gdGhlIG9yaWdpbmFsIGJvYXJkIHRhc2sncyBjb29sZG93biBlc2NhbGF0aW9uLgogICAgICAgICAgICBib2FyZFRhc2tJZDogZmFpbGVkVGFzay5ib2FyZFRhc2tJZCwKICAgICAgICB9KTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgc3VtbWFyeTogYFJlY292ZXJ5IGFnZW50IHNwYXduZWQgZm9yOiAke2ZhaWxlZFRhc2subGFiZWx9YCwKICAgICAgICAgICAgZGV0YWlsOiBgUmVjb3ZlcnkgdGFzayAke3Rhc2suaWR9YCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJBVVRPTk9NT1VTIiwKICAgICAgICAgICAgcmVhc29uOiAiYXV0by1yZWNvdmVyeSBmcm9tIGFnZW50IGZhaWx1cmUiLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImFnZW50Iiwgc3VtbWFyeTogYFJlY292ZXJ5IHNwYXduIGZhaWxlZDogJHttc2d9YCwgYWN0aW9uTGFiZWw6ICJBVVRPTk9NT1VTIiwgcmVhc29uOiAiYXV0by1yZWNvdmVyeSBzcGF3biBmYWlsZWQiIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKiogQ2xlYXIgcmVjb3ZlcnkgdHJhY2tpbmcgKGUuZy4sIG9uIHNlc3Npb24gcmVzZXQpLiAqLwpleHBvcnQgZnVuY3Rpb24gY2xlYXJSZWNvdmVyeVRyYWNraW5nKCkgewogICAgcmVjb3ZlcnlBdHRlbXB0ZWQuY2xlYXIoKTsKICAgIHJlY2VudFJlY292ZXJ5RmFpbHVyZXMubGVuZ3RoID0gMDsKICAgIHJlY292ZXJ5Q29vbGRvd25VbnRpbCA9IDA7Cn0KLyoqCiAqIFBydW5lIHRoZSByZWNvdmVyeUF0dGVtcHRlZCBzZXQgdG8gcHJldmVudCB1bmJvdW5kZWQgbWVtb3J5IGdyb3d0aC4KICogQ2FsbGVkIHBlcmlvZGljYWxseSAoZS5nLiwgZnJvbSBtb25pdG9yKS4gS2VlcHMgb25seSB0aGUgbW9zdCByZWNlbnQgZW50cmllcy4KICovCmV4cG9ydCBmdW5jdGlvbiBwcnVuZVJlY292ZXJ5VHJhY2tpbmcobWF4U2l6ZSA9IDIwMCkgewogICAgaWYgKHJlY292ZXJ5QXR0ZW1wdGVkLnNpemUgPD0gbWF4U2l6ZSkKICAgICAgICByZXR1cm47CiAgICAvLyBTZXRzIGl0ZXJhdGUgaW4gaW5zZXJ0aW9uIG9yZGVyIOKAlCBkZWxldGUgb2xkZXN0IGVudHJpZXMKICAgIGNvbnN0IGV4Y2VzcyA9IHJlY292ZXJ5QXR0ZW1wdGVkLnNpemUgLSBtYXhTaXplOwogICAgbGV0IGkgPSAwOwogICAgZm9yIChjb25zdCBpZCBvZiByZWNvdmVyeUF0dGVtcHRlZCkgewogICAgICAgIGlmIChpKysgPj0gZXhjZXNzKQogICAgICAgICAgICBicmVhazsKICAgICAgICByZWNvdmVyeUF0dGVtcHRlZC5kZWxldGUoaWQpOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlY292ZXIuanMubWFw","agents/issue-reporter.js":"LyoqCiAqIElzc3VlIHJlcG9ydGVyIOKAlCBzZW5kcyBhbm9ueW1pemVkIHNlbGYtcmVwb3J0ZWQgaXNzdWVzIHRvIHJ1bmNvcmUuc2guCiAqCiAqIE9wdC1pbjogb25seSByZXBvcnRzIGlmIHNldHRpbmdzLnRlbGVtZXRyeS5pc3N1ZVJlcG9ydGluZyBpcyB0cnVlLgogKiBCYXRjaGVkOiBjb2xsZWN0cyBpc3N1ZXMgYW5kIHNlbmRzIGluIGJhdGNoZXMgKG1heCBldmVyeSA1IG1pbnV0ZXMpLgogKiBJZGVtcG90ZW50OiB0cmFja3Mgd2hpY2ggaXNzdWVzIGhhdmUgYmVlbiByZXBvcnRlZCB0byBhdm9pZCBkdXBsaWNhdGVzLgogKi8KaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSwgbWtkaXIgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IEJSQUlOX0RJUiB9IGZyb20gIi4uL2xpYi9wYXRocy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICIuLi9zZXR0aW5ncy5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiYWdlbnRzLmlzc3VlLXJlcG9ydGVyIik7CmNvbnN0IFJVTkNPUkVfSVNTVUVTX1VSTCA9ICJodHRwczovL3J1bmNvcmUuc2gvYXBpL2lzc3Vlcy9yZXBvcnQiOwpjb25zdCBSRVBPUlRFRF9GSUxFID0gam9pbihCUkFJTl9ESVIsICJvcGVyYXRpb25zIiwgInJlcG9ydGVkLWlzc3Vlcy5qc29uIik7CmNvbnN0IE1JTl9CQVRDSF9JTlRFUlZBTF9NUyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcwpsZXQgbGFzdFJlcG9ydFRpbWUgPSAwOwpsZXQgcmVwb3J0ZWRJZHMgPSBuZXcgU2V0KCk7CmxldCBsb2FkZWQgPSBmYWxzZTsKLyoqIExvYWQgdGhlIHNldCBvZiBhbHJlYWR5LXJlcG9ydGVkIGlzc3VlIElEcyBmcm9tIGRpc2suICovCmFzeW5jIGZ1bmN0aW9uIGxvYWRSZXBvcnRlZElkcygpIHsKICAgIGlmIChsb2FkZWQpCiAgICAgICAgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUoUkVQT1JURURfRklMRSwgInV0Zi04Iik7CiAgICAgICAgY29uc3QgaWRzID0gSlNPTi5wYXJzZShkYXRhKTsKICAgICAgICByZXBvcnRlZElkcyA9IG5ldyBTZXQoaWRzKTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXBvcnRlZElkcyA9IG5ldyBTZXQoKTsKICAgIH0KICAgIGxvYWRlZCA9IHRydWU7Cn0KLyoqIFBlcnNpc3QgdGhlIHJlcG9ydGVkIElEcyB0byBkaXNrLiAqLwphc3luYyBmdW5jdGlvbiBzYXZlUmVwb3J0ZWRJZHMoKSB7CiAgICB0cnkgewogICAgICAgIGF3YWl0IG1rZGlyKGpvaW4oQlJBSU5fRElSLCAib3BlcmF0aW9ucyIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgICAvLyBLZWVwIGxhc3QgNTAwIElEcyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGgKICAgICAgICBjb25zdCBpZHMgPSBbLi4ucmVwb3J0ZWRJZHNdLnNsaWNlKC01MDApOwogICAgICAgIGF3YWl0IHdyaXRlRmlsZShSRVBPUlRFRF9GSUxFLCBKU09OLnN0cmluZ2lmeShpZHMpLCAidXRmLTgiKTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cud2FybigiRmFpbGVkIHRvIHNhdmUgcmVwb3J0ZWQgSURzIiwgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pOwogICAgfQp9Ci8qKgogKiBDaGVjayBpZiBpc3N1ZSByZXBvcnRpbmcgaXMgZW5hYmxlZC4KICogVXNlcyBDb3JlU2V0dGluZ3Mg4oCUIG9wdC1pbiBvbmx5LgogKi8KZnVuY3Rpb24gaXNSZXBvcnRpbmdFbmFibGVkKCkgewogICAgcmV0dXJuIGdldFNldHRpbmdzKCkuaXNzdWVSZXBvcnRpbmcgPT09IHRydWU7Cn0KLyoqCiAqIFJlcG9ydCBpc3N1ZXMgdG8gcnVuY29yZS5zaC4KICogQ2FsbCB0aGlzIGFmdGVyIHByb2Nlc3NBZ2VudElzc3VlcygpIHN0b3JlcyBuZXcgaXNzdWVzLgogKiBCYXRjaGVzIGFuZCBkZWR1cGxpY2F0ZXMgYXV0b21hdGljYWxseS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBvcnRJc3N1ZXNVcHN0cmVhbShpc3N1ZXMpIHsKICAgIGlmIChpc3N1ZXMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybjsKICAgIC8vIENoZWNrIG9wdC1pbgogICAgaWYgKCFpc1JlcG9ydGluZ0VuYWJsZWQoKSkgewogICAgICAgIGxvZy5kZWJ1ZygiSXNzdWUgcmVwb3J0aW5nIGRpc2FibGVkIChvcHQtaW4gdmlhIHNldHRpbmdzLnlhbWw6IGlzc3VlUmVwb3J0aW5nOiB0cnVlKSIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFJhdGUgbGltaXQgYmF0Y2hlcwogICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgIGlmIChub3cgLSBsYXN0UmVwb3J0VGltZSA8IE1JTl9CQVRDSF9JTlRFUlZBTF9NUykgewogICAgICAgIGxvZy5kZWJ1ZygiU2tpcHBpbmcgcmVwb3J0IOKAlCB0b28gc29vbiBzaW5jZSBsYXN0IGJhdGNoIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgYXdhaXQgbG9hZFJlcG9ydGVkSWRzKCk7CiAgICAvLyBGaWx0ZXIgb3V0IGFscmVhZHktcmVwb3J0ZWQgaXNzdWVzCiAgICBjb25zdCBuZXdJc3N1ZXMgPSBpc3N1ZXMuZmlsdGVyKGkgPT4gIXJlcG9ydGVkSWRzLmhhcyhpLmlkKSk7CiAgICBpZiAobmV3SXNzdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGxvZy5kZWJ1ZygiQWxsIGlzc3VlcyBhbHJlYWR5IHJlcG9ydGVkIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gQnVpbGQgcGF5bG9hZCDigJQgc3RyaXAgYWdlbnRUYXNrSWQgKGludGVybmFsKSBhbmQgcmVwb3J0ZWRBdCAodXNlIHNlcnZlciB0aW1lKQogICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICBpbnN0YW5jZUlkOiBnZXRJbnN0YW5jZU5hbWUoKSwKICAgICAgICBpc3N1ZXM6IG5ld0lzc3Vlcy5tYXAoaSA9PiAoewogICAgICAgICAgICB0aXRsZTogaS50aXRsZSwKICAgICAgICAgICAgZGVzY3JpcHRpb246IGkuZGVzY3JpcHRpb24sCiAgICAgICAgICAgIHNldmVyaXR5OiBpLnNldmVyaXR5LAogICAgICAgICAgICBjYXRlZ29yeTogaS5jYXRlZ29yeSwKICAgICAgICAgICAgZmlsZXM6IGkuZmlsZXMsCiAgICAgICAgICAgIHN1Z2dlc3Rpb246IGkuc3VnZ2VzdGlvbiwKICAgICAgICAgICAgY29yZVZlcnNpb246IGkuY29yZVZlcnNpb24sCiAgICAgICAgfSkpLAogICAgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChSVU5DT1JFX0lTU1VFU19VUkwsIHsKICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiB9LAogICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEwMDAwKSwKICAgICAgICB9KTsKICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICBsb2cuaW5mbyhgUmVwb3J0ZWQgJHtyZXN1bHQuYWNjZXB0ZWR9IGlzc3VlKHMpIHVwc3RyZWFtICgke3Jlc3VsdC5kdXBsaWNhdGVzfSBkdXBsaWNhdGVzKWApOwogICAgICAgICAgICAvLyBNYXJrIGFzIHJlcG9ydGVkCiAgICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgbmV3SXNzdWVzKSB7CiAgICAgICAgICAgICAgICByZXBvcnRlZElkcy5hZGQoaXNzdWUuaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF3YWl0IHNhdmVSZXBvcnRlZElkcygpOwogICAgICAgICAgICBsYXN0UmVwb3J0VGltZSA9IG5vdzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHsKICAgICAgICAgICAgbG9nLndhcm4oIlJhdGUgbGltaXRlZCBieSBydW5jb3JlLnNoIOKAlCB3aWxsIHJldHJ5IGxhdGVyIik7CiAgICAgICAgICAgIGxhc3RSZXBvcnRUaW1lID0gbm93OyAvLyBCYWNrIG9mZgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbG9nLndhcm4oYFJlcG9ydCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApOwogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAvLyBOZXR3b3JrIGVycm9ycyBhcmUgZXhwZWN0ZWQgKG9mZmxpbmUsIEROUywgZXRjLikg4oCUIGRvbid0IHNwYW0gbG9ncwogICAgICAgIGxvZy5kZWJ1ZygiUmVwb3J0IGZhaWxlZCAobmV0d29yaykiLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNzdWUtcmVwb3J0ZXIuanMubWFw","agents/issues.js":"LyoqCiAqIFNlbGYtcmVwb3J0ZWQgaXNzdWUgY29sbGVjdG9yLgogKgogKiBSZWFkLW9ubHkgYXV0b25vbW91cyBhZ2VudHMgcHJvZHVjZSBbSVNTVUVfUkVQT1JUXSBibG9ja3MuCiAqIFRoaXMgbW9kdWxlIHBhcnNlcyB0aGVtIGZyb20gYWdlbnQgb3V0cHV0LCBzdG9yZXMgdGhlbSBpbgogKiBicmFpbi9vcGVyYXRpb25zL3NlbGYtcmVwb3J0cy5qc29ubCwgYW5kIHByb3ZpZGVzIGEgbGlzdCBmb3IKICogY2VudHJhbGl6ZWQgYmFja2xvZyBhZ2dyZWdhdGlvbi4KICoKICogQWxsIHJlcG9ydHMgYXJlIGFub255bWl6ZWQgYmVmb3JlIHN0b3JhZ2U6CiAqIC0gQWJzb2x1dGUgcGF0aHMgc3RyaXBwZWQgdG8gcmVsYXRpdmUKICogLSBJbnN0YW5jZSBuYW1lLCBicmFpbiBkaXIsIGFuZCB1c2VyIG5hbWUgcmVtb3ZlZAogKiAtIE9ubHkgc3RydWN0dXJhbC9jb2RlLWxldmVsIGluZm8gcHJlc2VydmVkCiAqLwppbXBvcnQgeyBhcHBlbmRGaWxlLCByZWFkRmlsZSwgbWtkaXIgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IEJSQUlOX0RJUiB9IGZyb20gIi4uL2xpYi9wYXRocy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IHJlcG9ydElzc3Vlc1Vwc3RyZWFtIH0gZnJvbSAiLi9pc3N1ZS1yZXBvcnRlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiYWdlbnRzLmlzc3VlcyIpOwpjb25zdCBSRVBPUlRTX0RJUiA9IGpvaW4oQlJBSU5fRElSLCAib3BlcmF0aW9ucyIpOwpjb25zdCBSRVBPUlRTX0ZJTEUgPSBqb2luKFJFUE9SVFNfRElSLCAic2VsZi1yZXBvcnRzLmpzb25sIik7Ci8qKiBHZXQgQ29yZSB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uIChjYWNoZWQpLiAqLwpsZXQgX3ZlcnNpb24gPSBudWxsOwpmdW5jdGlvbiBnZXRDb3JlVmVyc2lvbigpIHsKICAgIGlmIChfdmVyc2lvbikKICAgICAgICByZXR1cm4gX3ZlcnNpb247CiAgICB0cnkgewogICAgICAgIGNvbnN0IHBrZyA9IHJlcXVpcmUoIi4uLy4uL3BhY2thZ2UuanNvbiIpOwogICAgICAgIF92ZXJzaW9uID0gcGtnLnZlcnNpb24gPz8gInVua25vd24iOwogICAgfQogICAgY2F0Y2ggewogICAgICAgIF92ZXJzaW9uID0gInVua25vd24iOwogICAgfQogICAgcmV0dXJuIF92ZXJzaW9uOwp9Ci8qKiBTdHJpcCBhYnNvbHV0ZSBwYXRocyB0byByZWxhdGl2ZSwgcmVtb3ZlIGluc3RhbmNlLXNwZWNpZmljIGluZm8uICovCmZ1bmN0aW9uIGFub255bWl6ZShyYXcpIHsKICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCkucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgIGNvbnN0IGJyYWluRGlyID0gQlJBSU5fRElSLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICBmdW5jdGlvbiBzdHJpcFBhdGhzKHMpIHsKICAgICAgICAvLyBSZXBsYWNlIGFic29sdXRlIHBhdGhzIHdpdGggcmVsYXRpdmUKICAgICAgICByZXR1cm4gcwogICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKGN3ZC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgIlxcJCYiKSwgImdpIiksICIuIikKICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChicmFpbkRpci5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgIlxcJCYiKSwgImdpIiksICI8YnJhaW4+IikKICAgICAgICAgICAgLy8gU3RyaXAgV2luZG93cyBkcml2ZSBsZXR0ZXJzOiBFOi8uLi4g4oaSIC4vLi4uCiAgICAgICAgICAgIC5yZXBsYWNlKC9bQS1aXTpbL1xcXS9naSwgIi4vIikKICAgICAgICAgICAgLy8gU3RyaXAgdXNlciBob21lIHBhdGhzCiAgICAgICAgICAgIC5yZXBsYWNlKC9DOlsvXFxdVXNlcnNbL1xcXVteL1xcXStbL1xcXS9naSwgIn4vIik7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIC4uLnJhdywKICAgICAgICB0aXRsZTogcmF3LnRpdGxlID8gc3RyaXBQYXRocyhyYXcudGl0bGUpIDogcmF3LnRpdGxlLAogICAgICAgIGRlc2NyaXB0aW9uOiByYXcuZGVzY3JpcHRpb24gPyBzdHJpcFBhdGhzKHJhdy5kZXNjcmlwdGlvbikgOiByYXcuZGVzY3JpcHRpb24sCiAgICAgICAgc3VnZ2VzdGlvbjogcmF3LnN1Z2dlc3Rpb24gPyBzdHJpcFBhdGhzKHJhdy5zdWdnZXN0aW9uKSA6IHJhdy5zdWdnZXN0aW9uLAogICAgICAgIGZpbGVzOiByYXcuZmlsZXM/Lm1hcCgoZikgPT4gc3RyaXBQYXRocyhmLnJlcGxhY2UoL1xcL2csICIvIikpKSwKICAgIH07Cn0KLyoqCiAqIFBhcnNlIFtJU1NVRV9SRVBPUlRdIGJsb2NrcyBmcm9tIGFnZW50IG91dHB1dC4KICogUmV0dXJucyBwYXJzZWQgYW5kIGFub255bWl6ZWQgaXNzdWVzLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSXNzdWVSZXBvcnRzKG91dHB1dCwgYWdlbnRUYXNrSWQpIHsKICAgIGNvbnN0IGJsb2NrcyA9IFsuLi5vdXRwdXQubWF0Y2hBbGwoL1xbSVNTVUVfUkVQT1JUXF1ccyooW1xzXFNdKj8pXHMqXFtcL0lTU1VFX1JFUE9SVFxdL2cpXTsKICAgIGlmIChibG9ja3MubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiBbXTsKICAgIGNvbnN0IGlzc3VlcyA9IFtdOwogICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgY29uc3QgdmVyc2lvbiA9IGdldENvcmVWZXJzaW9uKCk7CiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2NrcykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UoYmxvY2tbMV0udHJpbSgpKTsKICAgICAgICAgICAgY29uc3QgYW5vbiA9IGFub255bWl6ZShyYXcpOwogICAgICAgICAgICBjb25zdCBpc3N1ZSA9IHsKICAgICAgICAgICAgICAgIGlkOiBgc3ItJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA2KX1gLAogICAgICAgICAgICAgICAgdGl0bGU6IGFub24udGl0bGUgfHwgIlVudGl0bGVkIGlzc3VlIiwKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhbm9uLmRlc2NyaXB0aW9uIHx8ICIiLAogICAgICAgICAgICAgICAgc2V2ZXJpdHk6IFsibG93IiwgIm1lZGl1bSIsICJoaWdoIl0uaW5jbHVkZXMoYW5vbi5zZXZlcml0eSkgPyBhbm9uLnNldmVyaXR5IDogImxvdyIsCiAgICAgICAgICAgICAgICBjYXRlZ29yeTogWyJjcmFzaCIsICJlcnJvciIsICJwZXJmb3JtYW5jZSIsICJkZXNpZ24iLCAibWlzc2luZy1mZWF0dXJlIl0uaW5jbHVkZXMoYW5vbi5jYXRlZ29yeSkKICAgICAgICAgICAgICAgICAgICA/IGFub24uY2F0ZWdvcnkgOiAiZXJyb3IiLAogICAgICAgICAgICAgICAgZmlsZXM6IGFub24uZmlsZXMgfHwgW10sCiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uOiBhbm9uLnN1Z2dlc3Rpb24sCiAgICAgICAgICAgICAgICBhZ2VudFRhc2tJZCwKICAgICAgICAgICAgICAgIHJlcG9ydGVkQXQ6IG5vdywKICAgICAgICAgICAgICAgIGNvcmVWZXJzaW9uOiB2ZXJzaW9uLAogICAgICAgICAgICB9OwogICAgICAgICAgICBpc3N1ZXMucHVzaChpc3N1ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgbG9nLndhcm4oIkZhaWxlZCB0byBwYXJzZSBJU1NVRV9SRVBPUlQgYmxvY2siLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzc3VlczsKfQovKioKICogQXBwZW5kIGlzc3VlcyB0byB0aGUgc2VsZi1yZXBvcnRzIEpTT05MIGZpbGUuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcmVJc3N1ZXMoaXNzdWVzKSB7CiAgICBpZiAoaXNzdWVzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICB0cnkgewogICAgICAgIGF3YWl0IG1rZGlyKFJFUE9SVFNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgICBjb25zdCBsaW5lcyA9IGlzc3Vlcy5tYXAoKGkpID0+IEpTT04uc3RyaW5naWZ5KGkpKS5qb2luKCJcbiIpICsgIlxuIjsKICAgICAgICBhd2FpdCBhcHBlbmRGaWxlKFJFUE9SVFNfRklMRSwgbGluZXMsICJ1dGYtOCIpOwogICAgICAgIGxvZy5pbmZvKGBTdG9yZWQgJHtpc3N1ZXMubGVuZ3RofSBzZWxmLXJlcG9ydGVkIGlzc3VlKHMpYCk7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gc3RvcmUgaXNzdWVzIiwgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pOwogICAgfQp9Ci8qKgogKiBSZWFkIGFsbCBzdG9yZWQgc2VsZi1yZXBvcnRlZCBpc3N1ZXMuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdElzc3VlcygpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKFJFUE9SVFNfRklMRSwgInV0Zi04Iik7CiAgICAgICAgcmV0dXJuIGNvbnRlbnQKICAgICAgICAgICAgLnNwbGl0KCJcbiIpCiAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpKQogICAgICAgICAgICAubWFwKChsaW5lKSA9PiBKU09OLnBhcnNlKGxpbmUpKTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gW107CiAgICB9Cn0KLyoqCiAqIFByb2Nlc3MgYWdlbnQgb3V0cHV0OiBleHRyYWN0IGlzc3VlIHJlcG9ydHMsIHN0b3JlIHRoZW0uCiAqIENhbGwgdGhpcyB3aGVuIGEgcmVhZC1vbmx5IGFnZW50IGNvbXBsZXRlcy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzQWdlbnRJc3N1ZXMob3V0cHV0LCBhZ2VudFRhc2tJZCkgewogICAgY29uc3QgaXNzdWVzID0gcGFyc2VJc3N1ZVJlcG9ydHMob3V0cHV0LCBhZ2VudFRhc2tJZCk7CiAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCBzdG9yZUlzc3Vlcyhpc3N1ZXMpOwogICAgICAgIGxvZy5pbmZvKGBBZ2VudCAke2FnZW50VGFza0lkfSByZXBvcnRlZCAke2lzc3Vlcy5sZW5ndGh9IGlzc3VlKHMpYCwgewogICAgICAgICAgICB0aXRsZXM6IGlzc3Vlcy5tYXAoKGkpID0+IGkudGl0bGUpLAogICAgICAgIH0pOwogICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldDogYXR0ZW1wdCB1cHN0cmVhbSByZXBvcnQgKG9wdC1pbiwgbm9uLWJsb2NraW5nKQogICAgICAgIHJlcG9ydElzc3Vlc1Vwc3RyZWFtKGlzc3VlcykuY2F0Y2goKCkgPT4geyB9KTsKICAgIH0KICAgIHJldHVybiBpc3N1ZXM7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNzdWVzLmpzLm1hcA==","agents/feed.js":"LyoqCiAqIEFnZW50IFJ1bnRpbWUgRmVlZCDigJQgcGVyLWFnZW50IGxpdmUgYWN0aXZpdHkgc3RyZWFtLgogKgogKiBCcmlkZ2VzIGxpZmVjeWNsZSBldmVudHMsIGFjdGl2aXR5IGxvZyBlbnRyaWVzLCBhbmQgYWdlbnQgcnVudGltZSBvdXRwdXQKICogaW50byBhIHBlci1hZ2VudCBTU0Ugc3RyZWFtLiBFYWNoIGZlZWQgZW50cnkgbWF0Y2hlcyB0aGUgc3BlYyB0eXBlczoKICogbGxtLCB0b29sLCBtZW1vcnksIGRlY2lzaW9uLCBlcnJvciwgc3RhdGUuCiAqCiAqIE9ic2VydmF0aW9uIHdpdGhvdXQgZGlzdHVyYmFuY2Ug4oCUIHN1YnNjcmliaW5nIHRvIGEgZmVlZCBoYXMgemVybyBlZmZlY3QKICogb24gdGhlIHJ1bm5pbmcgYWdlbnQuCiAqCiAqIFBvcnRhYmlsaXR5OiBTdHJlYW1FbWl0dGVyIGlzIGluamVjdGFibGUuIFRoZSBzZXJ2ZXIgaW5qZWN0cyB0aGUgY29uY3JldGUKICogaW1wbGVtZW50YXRpb24gYXQgcnVudGltZSBpZiBsaXZlIHN0cmVhbSBicmlkZ2luZyBpcyBkZXNpcmVkLgogKi8KaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAibm9kZTpldmVudHMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImFnZW50LWZlZWQiKTsKLyoqIE1hcCBmZWVkIGVudHJ5IHR5cGVzIHRvIHN0cmVhbSBhY3Rpb24gdHlwZXMuICovCmNvbnN0IEZFRURfVE9fU1RSRUFNX1RZUEUgPSB7CiAgICBsbG06ICJ3b3JrIiwKICAgIHRvb2w6ICJ3b3JrIiwKICAgIG1lbW9yeTogIm1lbW9yeSIsCiAgICBkZWNpc2lvbjogImRlY2lzaW9uIiwKICAgIGVycm9yOiAiZXJyb3IiLAogICAgc3RhdGU6ICJzdGF0ZSIsCn07CmNvbnN0IE1BWF9SRUNFTlQgPSAyMDA7CmNsYXNzIEFnZW50RmVlZE1hbmFnZXIgewogICAgZmVlZHMgPSBuZXcgTWFwKCk7CiAgICBlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgc3RyZWFtQnJpZGdlID0gbnVsbDsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoNTAwKTsKICAgIH0KICAgIC8qKiBSZWdpc3RlciBhIHN0cmVhbSBicmlkZ2UgZm9yIFNTRSBmb3J3YXJkaW5nLiAqLwogICAgc2V0U3RyZWFtQnJpZGdlKGJyaWRnZSkgewogICAgICAgIHRoaXMuc3RyZWFtQnJpZGdlID0gYnJpZGdlOwogICAgfQogICAgLyoqCiAgICAgKiBQdXNoIGEgZmVlZCBlbnRyeSBmb3IgYSBzcGVjaWZpYyBhZ2VudC4KICAgICAqIENhbGxlZCBieSBpbnN0cnVtZW50YXRpb24gaG9va3MgdGhyb3VnaG91dCB0aGUgYWdlbnQgbGlmZWN5Y2xlLgogICAgICovCiAgICBwdXNoKGVudHJ5LCBza2lwU3RyZWFtQnJpZGdlID0gZmFsc2UpIHsKICAgICAgICBjb25zdCBmZWVkID0gdGhpcy5nZXRPckNyZWF0ZUZlZWQoZW50cnkuYWdlbnRJZCk7CiAgICAgICAgLy8gU3RvcmUgaW4gcmluZyBidWZmZXIKICAgICAgICBmZWVkLnJlY2VudC5wdXNoKGVudHJ5KTsKICAgICAgICBpZiAoZmVlZC5yZWNlbnQubGVuZ3RoID4gTUFYX1JFQ0VOVCkgewogICAgICAgICAgICBmZWVkLnJlY2VudC5zaGlmdCgpOwogICAgICAgIH0KICAgICAgICAvLyBCcm9hZGNhc3QgdG8gcGVyLWFnZW50IGxpc3RlbmVycwogICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgZmVlZC5saXN0ZW5lcnMpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxpc3RlbmVyKGVudHJ5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBmZWVkLmxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEJyb2FkY2FzdCB0byBnbG9iYWwgbGlzdGVuZXJzCiAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoIioiLCBlbnRyeSk7CiAgICAgICAgLy8gQnJpZGdlIHRvIGxpdmUgc3RyZWFtIHNvIGZlZWQgZXZlbnRzIGFwcGVhciBpbiB0aGUgU1NFIHN0cmVhbSBwYW5lLgogICAgICAgIC8vIFNraXAgd2hlbiBjYWxsZXIgYWxyZWFkeSBlbWl0dGVkIHZpYSBsb2dBY3Rpdml0eSAoYXZvaWRzIGR1cGxpY2F0ZXMpLgogICAgICAgIGlmICghc2tpcFN0cmVhbUJyaWRnZSAmJiB0aGlzLnN0cmVhbUJyaWRnZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1CcmlkZ2UuZW1pdCh7CiAgICAgICAgICAgICAgICAgICAgYWdlbnRJZDogZW50cnkuYWdlbnRJZCwKICAgICAgICAgICAgICAgICAgICB0eXBlOiBGRUVEX1RPX1NUUkVBTV9UWVBFW2VudHJ5LnR5cGVdID8/ICJ3b3JrIiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBlbnRyeS5zdW1tYXJ5LAogICAgICAgICAgICAgICAgICAgIGRldGFpbDogZW50cnkuZGV0YWlsLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgLy8gU3RyZWFtIGJyaWRnZSBub3QgcmVhZHkg4oCUIHNraXAgc2lsZW50bHkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU3Vic2NyaWJlIHRvIGEgc3BlY2lmaWMgYWdlbnQncyBmZWVkLiBSZXR1cm5zIHVuc3Vic2NyaWJlIGZ1bmN0aW9uLgogICAgICogT24gc3Vic2NyaWJlLCByZXBsYXlzIHJlY2VudCBlbnRyaWVzIGZvciAianVzdCBtaXNzZWQgaXQiIGNvbnRleHQuCiAgICAgKi8KICAgIHN1YnNjcmliZShhZ2VudElkLCBsaXN0ZW5lcikgewogICAgICAgIGNvbnN0IGZlZWQgPSB0aGlzLmdldE9yQ3JlYXRlRmVlZChhZ2VudElkKTsKICAgICAgICBmZWVkLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwogICAgICAgIC8vIFJlcGxheSByZWNlbnQgZW50cmllcwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmVlZC5yZWNlbnQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxpc3RlbmVyKGVudHJ5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBmZWVkLmxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpOwogICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHsgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICBmZWVkLmxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpOwogICAgICAgICAgICAvLyBDbGVhbiB1cCBlbXB0eSBmZWVkcwogICAgICAgICAgICBpZiAoZmVlZC5saXN0ZW5lcnMuc2l6ZSA9PT0gMCAmJiBmZWVkLnJlY2VudC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuZmVlZHMuZGVsZXRlKGFnZW50SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogU3Vic2NyaWJlIHRvIEFMTCBhZ2VudHMnIGZlZWRzIChnbG9iYWwgb2JzZXJ2ZXIpLgogICAgICogVXNlZnVsIGZvciB0aGUgb3BlcmF0aW9ucyB2aWV3ICJhbGwgYWN0aXZpdHkiIHN0cmVhbS4KICAgICAqLwogICAgc3Vic2NyaWJlQWxsKGxpc3RlbmVyKSB7CiAgICAgICAgY29uc3QgaGFuZGxlciA9IChlbnRyeSkgPT4gbGlzdGVuZXIoZW50cnkpOwogICAgICAgIHRoaXMuZW1pdHRlci5vbigiKiIsIGhhbmRsZXIpOwogICAgICAgIC8vIFJlcGxheSByZWNlbnQgZnJvbSBhbGwgYWN0aXZlIGZlZWRzCiAgICAgICAgZm9yIChjb25zdCBbLCBmZWVkXSBvZiB0aGlzLmZlZWRzKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmVlZC5yZWNlbnQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoZW50cnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5vZmYoIioiLCBoYW5kbGVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4geyB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuZW1pdHRlci5vZmYoIioiLCBoYW5kbGVyKTsKICAgICAgICB9OwogICAgfQogICAgLyoqIEdldCBhY3RpdmUgbGlzdGVuZXIgY291bnQgZm9yIGFuIGFnZW50LiAqLwogICAgZ2V0TGlzdGVuZXJDb3VudChhZ2VudElkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmVlZHMuZ2V0KGFnZW50SWQpPy5saXN0ZW5lcnMuc2l6ZSA/PyAwOwogICAgfQogICAgLyoqIEdldCByZWNlbnQgZW50cmllcyBmb3IgYW4gYWdlbnQgKHNuYXBzaG90KS4gKi8KICAgIGdldFJlY2VudChhZ2VudElkKSB7CiAgICAgICAgcmV0dXJuIFsuLi4odGhpcy5mZWVkcy5nZXQoYWdlbnRJZCk/LnJlY2VudCA/PyBbXSldOwogICAgfQogICAgLyoqIEdldCBhbGwgYWdlbnQgSURzIHdpdGggYWN0aXZlIGZlZWRzLiAqLwogICAgZ2V0QWN0aXZlRmVlZElkcygpIHsKICAgICAgICByZXR1cm4gWy4uLnRoaXMuZmVlZHMua2V5cygpXTsKICAgIH0KICAgIC8qKiBDbGVhbiB1cCBhIGZpbmlzaGVkIGFnZW50J3MgZmVlZCAoYWZ0ZXIgYWxsIGxpc3RlbmVycyBkaXNjb25uZWN0KS4gKi8KICAgIGNsZWFudXAoYWdlbnRJZCkgewogICAgICAgIGNvbnN0IGZlZWQgPSB0aGlzLmZlZWRzLmdldChhZ2VudElkKTsKICAgICAgICBpZiAoZmVlZCAmJiBmZWVkLmxpc3RlbmVycy5zaXplID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuZmVlZHMuZGVsZXRlKGFnZW50SWQpOwogICAgICAgIH0KICAgIH0KICAgIGdldE9yQ3JlYXRlRmVlZChhZ2VudElkKSB7CiAgICAgICAgbGV0IGZlZWQgPSB0aGlzLmZlZWRzLmdldChhZ2VudElkKTsKICAgICAgICBpZiAoIWZlZWQpIHsKICAgICAgICAgICAgZmVlZCA9IHsgbGlzdGVuZXJzOiBuZXcgU2V0KCksIHJlY2VudDogW10gfTsKICAgICAgICAgICAgdGhpcy5mZWVkcy5zZXQoYWdlbnRJZCwgZmVlZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmZWVkOwogICAgfQp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTaW5nbGV0b24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmxldCBpbnN0YW5jZSA9IG51bGw7CmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2VudEZlZWRNYW5hZ2VyKCkgewogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICAgIGluc3RhbmNlID0gbmV3IEFnZW50RmVlZE1hbmFnZXIoKTsKICAgIH0KICAgIHJldHVybiBpbnN0YW5jZTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29udmVuaWVuY2U6IGVtaXQgYSBmZWVkIGVudHJ5Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHBvcnQgZnVuY3Rpb24gZW1pdEZlZWRFbnRyeShhZ2VudElkLCB0eXBlLCBzdW1tYXJ5LCBkZXRhaWwsIAovKiogU2V0IHRydWUgd2hlbiBjYWxsZXIgYWxyZWFkeSBlbWl0dGVkIHZpYSBsb2dBY3Rpdml0eSAoYXZvaWRzIGR1cGxpY2F0ZSBzdHJlYW0gYWN0aW9ucykuICovCnNraXBTdHJlYW1CcmlkZ2UgPSBmYWxzZSkgewogICAgZ2V0QWdlbnRGZWVkTWFuYWdlcigpLnB1c2goewogICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIGFnZW50SWQsCiAgICAgICAgdHlwZSwKICAgICAgICBzdW1tYXJ5LAogICAgICAgIGRldGFpbCwKICAgIH0sIHNraXBTdHJlYW1CcmlkZ2UpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWZlZWQuanMubWFw","agents/commit.js":"LyoqCiAqIEF1dG8tY29tbWl0IGFnZW50IHdvcmsgaW4gbG9naWNhbCBiYXRjaGVzLgogKiBBZnRlciBhIGJhdGNoIG9mIGFnZW50cyBjb21wbGV0ZXMsIGNvbW1pdCBhbGwgdW5jb21taXR0ZWQgY2hhbmdlcwogKiB3aXRoIGEgbWVhbmluZ2Z1bCBtZXNzYWdlIHN1bW1hcml6aW5nIHdoYXQgdGhlIGFnZW50cyBkaWQuCiAqCiAqIE5ldmVyIHRocm93cyDigJQgcmV0dXJucyB7IG9rLCBtZXNzYWdlIH0uCiAqLwppbXBvcnQgeyB3cml0ZUZpbGVTeW5jLCB1bmxpbmtTeW5jIH0gZnJvbSAibm9kZTpmcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdpdCwgZ2l0QXZhaWxhYmxlIH0gZnJvbSAiLi4vdXRpbHMvZ2l0LmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJhZ2VudC1jb21taXQiKTsKY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTsKLyoqIENoZWNrIGlmIHRoZXJlIGFyZSB1bmNvbW1pdHRlZCBjaGFuZ2VzIChzdGFnZWQgb3IgdW5zdGFnZWQsIGluY2x1ZGluZyB1bnRyYWNrZWQpLiAqLwpleHBvcnQgZnVuY3Rpb24gaGFzVW5jb21taXR0ZWRDaGFuZ2VzKCkgewogICAgaWYgKCFnaXRBdmFpbGFibGUoKSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBzdGF0dXMgPSBnaXQoInN0YXR1cyAtLXBvcmNlbGFpbiIpOwogICAgcmV0dXJuICEhc3RhdHVzICYmIHN0YXR1cy5sZW5ndGggPiAwOwp9Ci8qKiBHZXQgYSBzaG9ydCBzdW1tYXJ5IG9mIHdoYXQgY2hhbmdlZCAoZm9yIGNvbW1pdCBtZXNzYWdlKS4gKi8KZnVuY3Rpb24gZ2V0Q2hhbmdlU3VtbWFyeSgpIHsKICAgIGNvbnN0IHN0YXR1cyA9IGdpdCgic3RhdHVzIC0tcG9yY2VsYWluIikgPz8gIiI7CiAgICBjb25zdCBsaW5lcyA9IHN0YXR1cy5zcGxpdCgiXG4iKS5maWx0ZXIoKGwpID0+IGwudHJpbSgpLmxlbmd0aCA+IDApOwogICAgY29uc3QgZmlsZXMgPSBsaW5lcy5tYXAoKGwpID0+IGwuc2xpY2UoMykudHJpbSgpKTsKICAgIC8vIEdyb3VwIGJ5IGRpcmVjdG9yeQogICAgY29uc3QgZGlycyA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3QgZiBvZiBmaWxlcykgewogICAgICAgIGNvbnN0IGRpciA9IGYuaW5jbHVkZXMoIi8iKSA/IGYuc3BsaXQoIi8iKS5zbGljZSgwLCAyKS5qb2luKCIvIikgOiBmOwogICAgICAgIGRpcnMuc2V0KGRpciwgKGRpcnMuZ2V0KGRpcikgPz8gMCkgKyAxKTsKICAgIH0KICAgIGNvbnN0IHBhcnRzID0gW107CiAgICBmb3IgKGNvbnN0IFtkaXIsIGNvdW50XSBvZiBbLi4uZGlycy5lbnRyaWVzKCldLnNvcnQoKGEsIGIpID0+IGJbMV0gLSBhWzFdKS5zbGljZSgwLCA1KSkgewogICAgICAgIHBhcnRzLnB1c2goYCR7ZGlyfSAoJHtjb3VudH0pYCk7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIGZpbGVzLAogICAgICAgIHN1bW1hcnk6IHBhcnRzLmpvaW4oIiwgIiksCiAgICB9Owp9Ci8qKgogKiBDb21taXQgYWxsIGFnZW50IHdvcmsgYXMgYSBsb2dpY2FsIGJhdGNoLgogKiBAcGFyYW0gYWdlbnRSZXN1bHRzIC0gV2hhdCB0aGUgYWdlbnRzIGRpZCAoZm9yIGNvbW1pdCBtZXNzYWdlKQogKiBAcGFyYW0gcm91bmQgLSBXaGljaCBjb250aW51YXRpb24gcm91bmQgdGhpcyBpcwogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbW1pdEFnZW50QmF0Y2goYWdlbnRSZXN1bHRzLCByb3VuZCkgewogICAgbG9nLmluZm8oYENvbW1pdHRpbmcgYWdlbnQgYmF0Y2hgLCB7IHJvdW5kLCBhZ2VudENvdW50OiBhZ2VudFJlc3VsdHMubGVuZ3RoIH0pOwogICAgaWYgKCFoYXNVbmNvbW1pdHRlZENoYW5nZXMoKSkgewogICAgICAgIGxvZy5kZWJ1ZygiTm8gdW5jb21taXR0ZWQgY2hhbmdlcyB0byBjb21taXQiKTsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogIk5vIGNoYW5nZXMgdG8gY29tbWl0IiB9OwogICAgfQogICAgY29uc3QgeyBmaWxlcywgc3VtbWFyeSB9ID0gZ2V0Q2hhbmdlU3VtbWFyeSgpOwogICAgLy8gQnVpbGQgY29tbWl0IG1lc3NhZ2UgZnJvbSBhZ2VudCByZXN1bHRzCiAgICBjb25zdCBjb21wbGV0ZWQgPSBhZ2VudFJlc3VsdHMuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gImNvbXBsZXRlZCIpOwogICAgY29uc3QgZmFpbGVkID0gYWdlbnRSZXN1bHRzLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICJmYWlsZWQiKTsKICAgIGNvbnN0IHRpdGxlID0gY29tcGxldGVkLmxlbmd0aCA9PT0gMQogICAgICAgID8gY29tcGxldGVkWzBdLmxhYmVsCiAgICAgICAgOiBgQWdlbnQgYmF0Y2g6ICR7Y29tcGxldGVkLm1hcCgocikgPT4gci5sYWJlbCkuam9pbigiLCAiKX1gOwogICAgLy8gVHJ1bmNhdGUgdGl0bGUgdG8gNzIgY2hhcnMgZm9yIGdpdCBjb252ZW50aW9uCiAgICBjb25zdCBzaG9ydFRpdGxlID0gdGl0bGUubGVuZ3RoID4gNzIgPyB0aXRsZS5zbGljZSgwLCA2OSkgKyAiLi4uIiA6IHRpdGxlOwogICAgY29uc3QgYm9keSA9IFtdOwogICAgaWYgKGNvbXBsZXRlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgYm9keS5wdXNoKGBDb21wbGV0ZWQgKCR7Y29tcGxldGVkLmxlbmd0aH0pOmApOwogICAgICAgIGZvciAoY29uc3QgciBvZiBjb21wbGV0ZWQpIHsKICAgICAgICAgICAgYm9keS5wdXNoKGAgIC0gJHtyLmxhYmVsfWApOwogICAgICAgIH0KICAgIH0KICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkgewogICAgICAgIGJvZHkucHVzaChgRmFpbGVkICgke2ZhaWxlZC5sZW5ndGh9KTpgKTsKICAgICAgICBmb3IgKGNvbnN0IHIgb2YgZmFpbGVkKSB7CiAgICAgICAgICAgIGJvZHkucHVzaChgICAtICR7ci5sYWJlbH1gKTsKICAgICAgICB9CiAgICB9CiAgICBib2R5LnB1c2goIiIpOwogICAgYm9keS5wdXNoKGBGaWxlczogJHtmaWxlcy5sZW5ndGh9IGNoYW5nZWQgKCR7c3VtbWFyeX0pYCk7CiAgICBib2R5LnB1c2goYFJvdW5kOiAke3JvdW5kfWApOwogICAgY29uc3QgY29tbWl0TXNnID0gYCR7c2hvcnRUaXRsZX1cblxuJHtib2R5LmpvaW4oIlxuIil9YDsKICAgIHRyeSB7CiAgICAgICAgLy8gU3RhZ2UgYWxsIGNoYW5nZXMgKGluY2x1ZGluZyB1bnRyYWNrZWQgZmlsZXMgaW4gc3JjLywgYnJhaW4vLCBwdWJsaWMvLCBkb2NzLykKICAgICAgICBnaXQoImFkZCBzcmMvIGJyYWluLyBwdWJsaWMvIGRvY3MvIHRlc3QvIHZpdGVzdC5jb25maWcudHMgcGFja2FnZS5qc29uIHBhY2thZ2UtbG9jay5qc29uIHRzY29uZmlnLmpzb24iKTsKICAgICAgICAvLyBBbHNvIGFkZCBhbnkgb3RoZXIgbW9kaWZpZWQgdHJhY2tlZCBmaWxlcwogICAgICAgIGdpdCgiYWRkIC11Iik7CiAgICAgICAgLy8gQ2hlY2sgaWYgYW55dGhpbmcgaXMgYWN0dWFsbHkgc3RhZ2VkCiAgICAgICAgY29uc3Qgc3RhZ2VkID0gZ2l0KCJkaWZmIC0tY2FjaGVkIC0tbmFtZS1vbmx5Iik7CiAgICAgICAgaWYgKCFzdGFnZWQgfHwgc3RhZ2VkLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogIk5vIHN0YWdlZCBjaGFuZ2VzIHRvIGNvbW1pdCIgfTsKICAgICAgICB9CiAgICAgICAgLy8gQ29tbWl0IHVzaW5nIGEgdGVtcCBmaWxlIGZvciB0aGUgbWVzc2FnZSAoYXZvaWRzIHNoZWxsIGVzY2FwaW5nIGlzc3VlcykKICAgICAgICBjb25zdCBtc2dQYXRoID0gam9pbihDV0QsICIuZ2l0IiwgIkFHRU5UX0NPTU1JVF9NU0ciKTsKICAgICAgICB3cml0ZUZpbGVTeW5jKG1zZ1BhdGgsIGNvbW1pdE1zZywgInV0Zi04Iik7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2l0KGBjb21taXQgLUYgIiR7bXNnUGF0aH0iYCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdW5saW5rU3luYyhtc2dQYXRoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggeyAvKiBjbGVhbnVwIGJlc3QtZWZmb3J0ICovIH0KICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogIkdpdCBjb21taXQgZmFpbGVkIiB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBzdGFnZWRGaWxlcyA9IHN0YWdlZC5zcGxpdCgiXG4iKS5maWx0ZXIoKGwpID0+IGwudHJpbSgpLmxlbmd0aCA+IDApOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYEF1dG8tY29tbWl0dGVkOiAke3Nob3J0VGl0bGV9ICgke3N0YWdlZEZpbGVzLmxlbmd0aH0gZmlsZXMpYCwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogYENvbW1pdHRlZCAke3N0YWdlZEZpbGVzLmxlbmd0aH0gZmlsZXM6ICR7c2hvcnRUaXRsZX1gIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAic3lzdGVtIiwgc3VtbWFyeTogYEF1dG8tY29tbWl0IGZhaWxlZDogJHttc2d9YCB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBDb21taXQgZmFpbGVkOiAke21zZ31gIH07CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbWl0LmpzLm1hcA==","agents/continue.js":"LyoqCiAqIEFnZW50IGJhdGNoIGNvbnRpbnVhdGlvbiDigJQgd2hlbiBhIGJhdGNoIG9mIGFnZW50cyBmaW5pc2hlcywgcmV2aWV3IHJlc3VsdHMKICogYW5kIHNwYXduIHRoZSBuZXh0IHJvdW5kIG9mIHdvcmsgYXV0b21hdGljYWxseS4KICoKICogVXNlcyBjb21wbGV0ZUNoYXQgKG5vbi1zdHJlYW1pbmcpIHRvIGFzayB0aGUgTExNIHdoYXQgdG8gZG8gbmV4dCwKICogcGFyc2VzIEFHRU5UX1JFUVVFU1QgYmxvY2tzIGZyb20gdGhlIHJlc3BvbnNlLCBhbmQgc3Bhd25zIG1vcmUgYWdlbnRzLgogKiBDYXBzIGF0IE1BWF9ST1VORFMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy4KICovCmltcG9ydCB7IGNvbXBsZXRlQ2hhdCB9IGZyb20gIi4uL2xsbS9jb21wbGV0ZS5qcyI7CmltcG9ydCB7IHN1Ym1pdFRhc2sgfSBmcm9tICIuL2luZGV4LmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyByZXNvbHZlUHJvdmlkZXIsIHJlc29sdmVDaGF0TW9kZWwgfSBmcm9tICIuLi9zZXR0aW5ncy5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSwgZ2V0SW5zdGFuY2VOYW1lTG93ZXIgfSBmcm9tICIuLi9pbnN0YW5jZS5qcyI7CmltcG9ydCB7IGdldEJvYXJkUHJvdmlkZXIgfSBmcm9tICIuLi9ib2FyZC9wcm92aWRlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiYWdlbnQtY29udGludWUiKTsKY29uc3QgTUFYX1JPVU5EUyA9IDU7IC8vIE1heCBhdXRvLWNvbnRpbnVlIHJvdW5kcyBwZXIgc2Vzc2lvbiB0cmlnZ2VyCmNvbnN0IHJvdW5kQ291bnRzID0gbmV3IE1hcCgpOyAvLyBzZXNzaW9uSWQg4oaSIHJvdW5kcyB1c2VkCi8qKiBSZXNldCByb3VuZCBjb3VudGVyIGZvciBhIHNlc3Npb24gKGNhbGwgd2hlbiB1c2VyIHNlbmRzIGEgbmV3IG1lc3NhZ2UpLiAqLwpleHBvcnQgZnVuY3Rpb24gcmVzZXRDb250aW51YXRpb25Sb3VuZHMoc2Vzc2lvbklkKSB7CiAgICByb3VuZENvdW50cy5kZWxldGUoc2Vzc2lvbklkKTsKfQovKioKICogQWZ0ZXIgYSBiYXRjaCBvZiBhZ2VudHMgY29tcGxldGVzLCBhc2sgdGhlIExMTSB3aGF0J3MgbmV4dCBhbmQgc3Bhd24gbW9yZS4KICogUmV0dXJucyBudW1iZXIgb2YgYWdlbnRzIHNwYXduZWQgKDAgPSBub3RoaW5nIG1vcmUgdG8gZG8pLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRpbnVlQWZ0ZXJCYXRjaChzZXNzaW9uSWQsIGJvYXJkQ29udGV4dCwgYWdlbnRSZXN1bHRzLCBodW1hbk5hbWUpIHsKICAgIC8vIENoZWNrIHJvdW5kIGxpbWl0CiAgICBjb25zdCByb3VuZHMgPSByb3VuZENvdW50cy5nZXQoc2Vzc2lvbklkKSA/PyAwOwogICAgbG9nLmluZm8oYEF1dG8tY29udGludWUgcm91bmQgJHtyb3VuZHMgKyAxfS8ke01BWF9ST1VORFN9YCwgeyBzZXNzaW9uSWQsIGFnZW50Q291bnQ6IGFnZW50UmVzdWx0cy5sZW5ndGggfSk7CiAgICBpZiAocm91bmRzID49IE1BWF9ST1VORFMpIHsKICAgICAgICBsb2cud2FybigiQXV0by1jb250aW51ZSByb3VuZCBsaW1pdCByZWFjaGVkIiwgeyBzZXNzaW9uSWQsIG1heFJvdW5kczogTUFYX1JPVU5EUyB9KTsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImFnZW50Iiwgc3VtbWFyeTogYEF1dG8tY29udGludWU6IGhpdCAke01BWF9ST1VORFN9LXJvdW5kIGxpbWl0LCBwYXVzaW5nYCB9KTsKICAgICAgICByb3VuZENvdW50cy5kZWxldGUoc2Vzc2lvbklkKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGNvbnN0IHJlc3VsdFN1bW1hcnkgPSBhZ2VudFJlc3VsdHMKICAgICAgICAubWFwKChyKSA9PiBgLSAke3IubGFiZWx9OiAke3Iuc3RhdHVzfWApCiAgICAgICAgLmpvaW4oIlxuIik7CiAgICBjb25zdCBtZXNzYWdlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIHJvbGU6ICJzeXN0ZW0iLAogICAgICAgICAgICBjb250ZW50OiBbCiAgICAgICAgICAgICAgICBgWW91IGFyZSAke2dldEluc3RhbmNlTmFtZSgpfSwgYW4gQUkgYWdlbnQgd29ya2luZyB0aHJvdWdoIGEgYmFja2xvZyBmb3IgJHtodW1hbk5hbWV9LmAsCiAgICAgICAgICAgICAgICBgQSBiYXRjaCBvZiAke2FnZW50UmVzdWx0cy5sZW5ndGh9IGFnZW50KHMpIGp1c3QgZmluaXNoZWQuIFJldmlldyB0aGUgcmVzdWx0cyBhbmQgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuYCwKICAgICAgICAgICAgICAgIGBZb3VyIGpvYiBpcyB0byBLRUVQIFdPUktJTkcgdGhyb3VnaCB0aGUgYmFja2xvZyB1bnRpbCBhbGwgYWN0aW9uYWJsZSBpdGVtcyBhcmUgZG9uZS5gLAogICAgICAgICAgICAgICAgYGAsCiAgICAgICAgICAgICAgICBgUnVsZXM6YCwKICAgICAgICAgICAgICAgIGAtIElmIHRoZXJlIGFyZSBpdGVtcyBpbiAiQmFja2xvZyIgb3IgIlRvZG8iIHN0YXRlIHdpdGggY2xlYXIgZGVsaXZlcmFibGVzLCBzcGF3biBhZ2VudHMgZm9yIHRoZW0uYCwKICAgICAgICAgICAgICAgIGAtIEl0ZW1zIHdpdGggZGVzY3JpcHRpb25zIG1lbnRpb25pbmcgc3BlY2lmaWMgZmlsZXMsIG1vZHVsZXMsIG9yIGFjY2VwdGFuY2UgY3JpdGVyaWEgQVJFIGFjdGlvbmFibGUg4oCUIHNwYXduIGFnZW50cy5gLAogICAgICAgICAgICAgICAgYC0gSXRlbXMgdGl0bGVkICJTcGVjOiAuLi4iIGFyZSBzcGVjLXdyaXRpbmcgdGFza3Mg4oCUIHNwYXduIGFuIGFnZW50IHRvIHdyaXRlIHRoZSBzcGVjIGRvYy5gLAogICAgICAgICAgICAgICAgYC0gSXRlbXMgdGhhdCBhcmUgdHJ1bHkgdmFndWUgKG5vIGRlc2NyaXB0aW9uLCBubyBmaWxlcywgbm8gY3JpdGVyaWEpIHNob3VsZCBiZSBza2lwcGVkLmAsCiAgICAgICAgICAgICAgICBgLSBLRUVQIEdPSU5HIHVudGlsIG5vIGFjdGlvbmFibGUgaXRlbXMgcmVtYWluLiBEbyBOT1Qgc3RvcCBlYXJseS5gLAogICAgICAgICAgICAgICAgYGAsCiAgICAgICAgICAgICAgICBgVG8gc3Bhd24gYWdlbnRzLCBvdXRwdXQgW0FHRU5UX1JFUVVFU1RdIGJsb2NrcyB3aXRoIHZhbGlkIEpTT046YCwKICAgICAgICAgICAgICAgIGBbQUdFTlRfUkVRVUVTVF1gLAogICAgICAgICAgICAgICAgYHsibGFiZWwiOiAidGFzayBuYW1lIiwgInRhc2tJZCI6ICJpbnRlcm5hbC1pZCIsICJwcm9tcHQiOiAiU3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHdpdGggZmlsZSBwYXRocy4uLiJ9YCwKICAgICAgICAgICAgICAgIGBbL0FHRU5UX1JFUVVFU1RdYCwKICAgICAgICAgICAgICAgIGBgLAogICAgICAgICAgICAgICAgYEluY2x1ZGUgInRhc2tJZCIgZnJvbSB0aGUgYm9hcmQgc3RhdGUgdG8gbG9jayB0aGUgdGFzay4gQWdlbnQgcHJvbXB0cyBNVVNUIHJlZmVyZW5jZSByZWFsIGZpbGVzIChzcmMvLCBicmFpbi8sIHB1YmxpYy8pIGFuZCBkZXNjcmliZSBjb25jcmV0ZSBjaGFuZ2VzLmAsCiAgICAgICAgICAgICAgICBgWW91IGNhbiBzcGF3biB1cCB0byA1IGFnZW50cyBhdCBvbmNlLmAsCiAgICAgICAgICAgIF0uam9pbigiXG4iKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgcm9sZTogInVzZXIiLAogICAgICAgICAgICBjb250ZW50OiBbCiAgICAgICAgICAgICAgICBgLS0tIEFnZW50IGJhdGNoIHJlc3VsdHMgKCR7YWdlbnRSZXN1bHRzLmxlbmd0aH0gYWdlbnRzKSAtLS1gLAogICAgICAgICAgICAgICAgcmVzdWx0U3VtbWFyeSwKICAgICAgICAgICAgICAgIGBgLAogICAgICAgICAgICAgICAgYC0tLSBDdXJyZW50IGJvYXJkIHN0YXRlICh1bmFzc2lnbmVkLCBub3QgZG9uZS9jYW5jZWxsZWQpIC0tLWAsCiAgICAgICAgICAgICAgICBib2FyZENvbnRleHQgfHwgIihubyByZW1haW5pbmcgaXRlbXMpIiwKICAgICAgICAgICAgICAgIGBgLAogICAgICAgICAgICAgICAgYFNwYXduIGFnZW50cyBmb3IgdGhlIG5leHQgYmF0Y2ggb2YgYWN0aW9uYWJsZSBpdGVtcy4gSWYgbm90aGluZyBhY3Rpb25hYmxlIHJlbWFpbnMsIHNheSAiQWxsIGRvbmUuImAsCiAgICAgICAgICAgIF0uam9pbigiXG4iKSwKICAgICAgICB9LAogICAgXTsKICAgIHRyeSB7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBBdXRvLWNvbnRpbnVlOiByb3VuZCAke3JvdW5kcyArIDF9LyR7TUFYX1JPVU5EU30sIGFza2luZyBMTE0gZm9yIG5leHQgYmF0Y2hgLAogICAgICAgICAgICBkZXRhaWw6IGBCb2FyZCBjb250ZXh0ICgke2JvYXJkQ29udGV4dC5sZW5ndGh9IGNoYXJzKTogJHtib2FyZENvbnRleHQuc2xpY2UoMCwgNTAwKX1gLAogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29tcGxldGVDaGF0KHsKICAgICAgICAgICAgbWVzc2FnZXMsCiAgICAgICAgICAgIG1vZGVsOiByZXNvbHZlQ2hhdE1vZGVsKCkgPz8gdW5kZWZpbmVkLAogICAgICAgICAgICBwcm92aWRlcjogcmVzb2x2ZVByb3ZpZGVyKCksCiAgICAgICAgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBBdXRvLWNvbnRpbnVlOiBMTE0gcmVzcG9uZGVkICgke3Jlc3BvbnNlLmxlbmd0aH0gY2hhcnMpYCwKICAgICAgICAgICAgZGV0YWlsOiByZXNwb25zZS5zbGljZSgwLCA1MDApLAogICAgICAgIH0pOwogICAgICAgIC8vIFBhcnNlIEFHRU5UX1JFUVVFU1QgYmxvY2tzIGZyb20gcmVzcG9uc2UKICAgICAgICBjb25zdCBibG9ja3MgPSBbLi4ucmVzcG9uc2UubWF0Y2hBbGwoL1xbQUdFTlRfUkVRVUVTVFxdXHMqKFtcc1xTXSo/KVxzKlxbXC9BR0VOVF9SRVFVRVNUXF0vZyldOwogICAgICAgIGlmIChibG9ja3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYWdlbnQiLCBzdW1tYXJ5OiBgQXV0by1jb250aW51ZTogTExNIGZvdW5kIG5vdGhpbmcgbW9yZSB0byBkbyAobm8gQUdFTlRfUkVRVUVTVCBibG9ja3MgaW4gcmVzcG9uc2UpYCB9KTsKICAgICAgICAgICAgcm91bmRDb3VudHMuZGVsZXRlKHNlc3Npb25JZCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBxdWV1ZSBzdG9yZSBmb3IgYXNzaWduZWUgbG9ja2luZwogICAgICAgIGNvbnN0IGJvYXJkID0gZ2V0Qm9hcmRQcm92aWRlcigpOwogICAgICAgIGNvbnN0IHF1ZXVlU3RvcmUgPSBib2FyZD8uZ2V0U3RvcmU/LigpOwogICAgICAgIGxldCBzcGF3bmVkID0gMDsKICAgICAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2NrcykgewogICAgICAgICAgICBjb25zdCByYXcgPSBibG9ja1sxXS50cmltKCk7CiAgICAgICAgICAgIGNvbnN0IGpzb25NYXRjaCA9IHJhdy5tYXRjaCgvXHtbXHNcU10qXH0vKTsKICAgICAgICAgICAgaWYgKCFqc29uTWF0Y2gpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcSA9IEpTT04ucGFyc2UoanNvbk1hdGNoWzBdKTsKICAgICAgICAgICAgICAgIGlmICghcmVxLnByb21wdCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIC8vIFNhbWUgdmFndWUtcHJvbXB0IGNoZWNrIGFzIHNlcnZlci50cwogICAgICAgICAgICAgICAgY29uc3QgaGFzRmlsZVBhdGggPSAvKD86c3JjXC98YnJhaW5cL3xwdWJsaWNcL3xcLnRzfFwuanN8XC5tZHxcLmpzb258XC55YW1sfFwueW1sKS8udGVzdChyZXEucHJvbXB0KTsKICAgICAgICAgICAgICAgIGNvbnN0IGlzVmFndWUgPSAvXGIoPzpjb21wcmVoZW5zaXZlfHJvYnVzdHxwcm9kdWN0aW9uLXJlYWR5fGVudGVycHJpc2V8c2NhbGFibGUpXGIvaS50ZXN0KHJlcS5wcm9tcHQpICYmICFoYXNGaWxlUGF0aDsKICAgICAgICAgICAgICAgIGNvbnN0IGlzV2lzaExpc3QgPSAocmVxLnByb21wdC5tYXRjaCgvXlxkK1wuXHMvZ20pIHx8IFtdKS5sZW5ndGggPj0gNSAmJiAhaGFzRmlsZVBhdGg7CiAgICAgICAgICAgICAgICBsZXQgZmluYWxQcm9tcHQgPSByZXEucHJvbXB0OwogICAgICAgICAgICAgICAgaWYgKGlzVmFndWUgfHwgaXNXaXNoTGlzdCkgewogICAgICAgICAgICAgICAgICAgIGZpbmFsUHJvbXB0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICBgSU1QT1JUQU5UOiBUaGUgb3JpZ2luYWwgcmVxdWVzdCBiZWxvdyBpcyB2YWd1ZS4gRG8gTk9UIHRyeSB0byBidWlsZCBldmVyeXRoaW5nIGxpc3RlZC5gLAogICAgICAgICAgICAgICAgICAgICAgICBgSW5zdGVhZDogMSkgUmVhZCB0aGUgZXhpc3RpbmcgY29kZWJhc2UgKHN0YXJ0IHdpdGggc3JjLyBhbmQgcGFja2FnZS5qc29uKS5gLAogICAgICAgICAgICAgICAgICAgICAgICBgMikgUGljayBPTkUgc21hbGwsIGNvbmNyZXRlIHBpZWNlIHRoYXQgY29ubmVjdHMgdG8gZXhpc3RpbmcgY29kZS5gLAogICAgICAgICAgICAgICAgICAgICAgICBgMykgQnVpbGQgdGhhdCBvbmUgdGhpbmcgd2VsbC5gLAogICAgICAgICAgICAgICAgICAgICAgICBgNCkgSWYgbm90aGluZyBjb25jcmV0ZSBjYW4gYmUgYnVpbHQsIGNyZWF0ZSBhIHNwZWMgYXQgYnJhaW4va25vd2xlZGdlL25vdGVzLyBhbmQgZXhpdC5gLAogICAgICAgICAgICAgICAgICAgICAgICBgYCwKICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIHJlcXVlc3Q6YCwKICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQcm9tcHQsCiAgICAgICAgICAgICAgICAgICAgXS5qb2luKCJcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSByZXEubGFiZWwgfHwgcmVxLnByb21wdC5zbGljZSgwLCA2MCk7CiAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSB0YXNrIGFzIGFzc2lnbmVkIGJlZm9yZSBzcGF3bmluZyAocHJldmVudHMgZHVwbGljYXRlIHBpY2t1cCkKICAgICAgICAgICAgICAgIGlmIChxdWV1ZVN0b3JlICYmIHJlcS50YXNrSWQpIHsKICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZVN0b3JlLnVwZGF0ZShyZXEudGFza0lkLCB7IGFzc2lnbmVlOiBgJHtnZXRJbnN0YW5jZU5hbWVMb3dlcigpfS1hZ2VudGAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhd2FpdCBzdWJtaXRUYXNrKHsgbGFiZWwsIHByb21wdDogZmluYWxQcm9tcHQsIG9yaWdpbjogImFpIiwgc2Vzc2lvbklkIH0pOwogICAgICAgICAgICAgICAgc3Bhd25lZCsrOwogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhZ2VudCIsIHN1bW1hcnk6IGBBdXRvLWNvbnRpbnVlIHNwYXduZWQ6ICR7bGFiZWx9YCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAvLyBTa2lwIHVucGFyc2VhYmxlIGJsb2NrcwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzcGF3bmVkID4gMCkgewogICAgICAgICAgICByb3VuZENvdW50cy5zZXQoc2Vzc2lvbklkLCByb3VuZHMgKyAxKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJhZ2VudCIsIHN1bW1hcnk6IGBBdXRvLWNvbnRpbnVlOiByb3VuZCAke3JvdW5kcyArIDF9LyR7TUFYX1JPVU5EU30sIHNwYXduZWQgJHtzcGF3bmVkfSBhZ2VudChzKWAgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByb3VuZENvdW50cy5kZWxldGUoc2Vzc2lvbklkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwYXduZWQ7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYWdlbnQiLCBzdW1tYXJ5OiBgQXV0by1jb250aW51ZSBlcnJvcjogJHttc2d9YCB9KTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1jb250aW51ZS5qcy5tYXA=","agents/cooldown.js":"LyoqCiAqIFRhc2sgQ29vbGRvd24gTWFuYWdlciDigJQgcHJldmVudHMgcmVwZWF0ZWRseS1mYWlsaW5nIHRhc2tzIGZyb20gYmVpbmcKICogcmV0cmllZCB0b28gYWdncmVzc2l2ZWx5LCByZWR1Y2luZyBHQyBwcmVzc3VyZSBmcm9tIGV4Y2Vzc2l2ZSBhZ2VudCBzcGF3bnMuCiAqCiAqIFRyYWNrcyBmYWlsdXJlIGNvdW50cyBwZXIgYm9hcmQgdGFzayBJRCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYgY29vbGRvd25zLgogKiBQZXJzaXN0cyBzdGF0ZSB0byBkaXNrIHNvIGNvb2xkb3ducyBzdXJ2aXZlIHByb2Nlc3MgcmVzdGFydHMuCiAqCiAqIFVzYWdlOgogKiAgIGNvbnN0IGNvb2xkb3duID0gVGFza0Nvb2xkb3duTWFuYWdlci5nZXRJbnN0YW5jZSgpOwogKiAgIGF3YWl0IGNvb2xkb3duLmluaXQoKTsKICogICBjb29sZG93bi5yZWNvcmRGYWlsdXJlKCJ0YXNrLTEyMyIsICJCdWlsZCBmZWF0dXJlIFgiLCAiVHlwZUVycm9yOiAuLi4iKTsKICogICBpZiAoY29vbGRvd24uaXNPbkNvb2xkb3duKCJ0YXNrLTEyMyIpKSB7IHNraXAgdGFzayB9CiAqLwppbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlLCBta2RpciB9IGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyByZWNvcmRDb29sZG93bkFjdGl2YXRpb24sIHJlY29yZENvb2xkb3duU2tpcCB9IGZyb20gIi4uL21ldHJpY3MvZmlyZXdhbGwtbWV0cmljcy5qcyI7CmltcG9ydCB7IEJSQUlOX0RJUiB9IGZyb20gIi4uL2xpYi9wYXRocy5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiY29vbGRvd24iKTsKY29uc3QgREVGQVVMVF9DT05GSUcgPSB7CiAgICBiYXNlQ29vbGRvd25NczogMzAgKiA2MCAqIDEwMDAsIC8vIDMwIG1pbgogICAgbWF4Q29vbGRvd25NczogNCAqIDYwICogNjAgKiAxMDAwLCAvLyA0IGhvdXJzCiAgICBiYWNrb2ZmTXVsdGlwbGllcjogMiwKICAgIHBlcnNpc3RQYXRoOiBqb2luKEJSQUlOX0RJUiwgImFnZW50cyIsICJjb29sZG93bnMuanNvbiIpLAogICAgbWF4RW50cmllczogMjAwLAogICAgbWF4VG90YWxGYWlsdXJlczogNiwKfTsKLy8g4pSA4pSA4pSAIFNpbmdsZXRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IGluc3RhbmNlID0gbnVsbDsKLy8g4pSA4pSA4pSAIE1hbmFnZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBjbGFzcyBUYXNrQ29vbGRvd25NYW5hZ2VyIHsKICAgIGNvbmZpZzsKICAgIGVudHJpZXMgPSBuZXcgTWFwKCk7CiAgICBkaXJ0eSA9IGZhbHNlOwogICAgcGVyc2lzdFRpbWVyID0gbnVsbDsKICAgIGNvbnN0cnVjdG9yKGNvbmZpZykgewogICAgICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4uY29uZmlnIH07CiAgICB9CiAgICAvKiogR2V0IG9yIGNyZWF0ZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlLiAqLwogICAgc3RhdGljIGdldEluc3RhbmNlKGNvbmZpZykgewogICAgICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgVGFza0Nvb2xkb3duTWFuYWdlcihjb25maWcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9CiAgICAvKiogUmVzZXQgc2luZ2xldG9uIChmb3IgdGVzdGluZykuICovCiAgICBzdGF0aWMgcmVzZXRJbnN0YW5jZSgpIHsKICAgICAgICBpZiAoaW5zdGFuY2UpIHsKICAgICAgICAgICAgaW5zdGFuY2Uuc2h1dGRvd24oKTsKICAgICAgICAgICAgaW5zdGFuY2UgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvKiogTG9hZCBwZXJzaXN0ZWQgY29vbGRvd24gc3RhdGUgZnJvbSBkaXNrLiAqLwogICAgYXN5bmMgaW5pdCgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmNvbmZpZy5wZXJzaXN0UGF0aCwgInV0Zi04Iik7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhdyk7CiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGF0YSkgewogICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChlbnRyeS50YXNrSWQsIGVudHJ5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcnVuZSBleHBpcmVkIGVudHJpZXMgb24gbG9hZAogICAgICAgICAgICB0aGlzLnBydW5lRXhwaXJlZCgpOwogICAgICAgICAgICBsb2cuaW5mbyhgTG9hZGVkICR7dGhpcy5lbnRyaWVzLnNpemV9IGNvb2xkb3duIGVudHJpZXMgZnJvbSBkaXNrYCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc3QgY29kZSA9IGVyci5jb2RlOwogICAgICAgICAgICBpZiAoY29kZSA9PT0gIkVOT0VOVCIpIHsKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJObyBjb29sZG93biBzdGF0ZSBvbiBkaXNrLCBzdGFydGluZyBmcmVzaCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBsb2FkIGNvb2xkb3duIHN0YXRlOiAke2Vyci5tZXNzYWdlfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqIEZsdXNoIHBlbmRpbmcgY2hhbmdlcyBhbmQgc3RvcCB0aGUgcGVyc2lzdCB0aW1lci4gKi8KICAgIHNodXRkb3duKCkgewogICAgICAgIGlmICh0aGlzLnBlcnNpc3RUaW1lcikgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZXJzaXN0VGltZXIpOwogICAgICAgICAgICB0aGlzLnBlcnNpc3RUaW1lciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmRpcnR5KSB7CiAgICAgICAgICAgIHRoaXMucGVyc2lzdFN5bmMoKTsKICAgICAgICB9CiAgICB9CiAgICAvLyDilIDilIAgQ29yZSBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvKioKICAgICAqIFJlY29yZCBhIHRhc2sgZmFpbHVyZS4gSW5jcmVtZW50cyB0aGUgZmFpbHVyZSBjb3VudCBhbmQgcmVzZXRzIHRoZQogICAgICogY29vbGRvd24gdGltZXIuIFNjaGVkdWxlcyBhIGRlYm91bmNlZCBwZXJzaXN0IHRvIGRpc2suCiAgICAgKi8KICAgIHJlY29yZEZhaWx1cmUodGFza0lkLCBsYWJlbCwgZXJyb3IpIHsKICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZW50cmllcy5nZXQodGFza0lkKTsKICAgICAgICAvLyBEQVNILTE0MzogRGVkdXAgYnVyc3Qg4oCUIGlmIHRoZSBzYW1lIHRhc2sgd2FzIHJlY29yZGVkIHdpdGhpbiAzMHMsCiAgICAgICAgLy8gc2tpcCB0byBwcmV2ZW50IGRvdWJsZS1jb3VudGluZyBmcm9tIG11bHRpcGxlIHJlY29yZGluZyBwYXRocwogICAgICAgIC8vIChpbW1lZGlhdGUgZmFpbHVyZSBoYW5kbGVyICsgYmF0Y2ggY29tcGxldGlvbiBoYW5kbGVyKS4KICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgICAgY29uc3Qgc2luY2VMYXN0ID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGV4aXN0aW5nLmxhc3RGYWlsZWRBdCkuZ2V0VGltZSgpOwogICAgICAgICAgICBpZiAoc2luY2VMYXN0IDwgMzBfMDAwKSB7CiAgICAgICAgICAgICAgICBsb2cuZGVidWcoYFNraXBwaW5nIGR1cGxpY2F0ZSBmYWlsdXJlIHJlY29yZCBmb3IgJHt0YXNrSWR9ICgke3NpbmNlTGFzdH1tcyBzaW5jZSBsYXN0KWApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZhaWx1cmVDb3VudCA9IChleGlzdGluZz8uZmFpbHVyZUNvdW50ID8/IDApICsgMTsKICAgICAgICBjb25zdCBlbnRyeSA9IHsKICAgICAgICAgICAgdGFza0lkLAogICAgICAgICAgICBsYXN0RmFpbGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgZmFpbHVyZUNvdW50LAogICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yPy5zbGljZSgwLCAzMDApLAogICAgICAgICAgICBsYWJlbDogbGFiZWwgPz8gZXhpc3Rpbmc/LmxhYmVsLAogICAgICAgIH07CiAgICAgICAgdGhpcy5lbnRyaWVzLnNldCh0YXNrSWQsIGVudHJ5KTsKICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICAgICAgICB0aGlzLnNjaGVkdWxlUGVyc2lzdCgpOwogICAgICAgIHJlY29yZENvb2xkb3duQWN0aXZhdGlvbigpOwogICAgICAgIC8vIENoZWNrIGlmIHRhc2sgaXMgbm93IHBlcm1hbmVudGx5IGJsb2NrZWQKICAgICAgICBpZiAoZmFpbHVyZUNvdW50ID49IHRoaXMuY29uZmlnLm1heFRvdGFsRmFpbHVyZXMpIHsKICAgICAgICAgICAgbG9nLndhcm4oYFRhc2sgJHt0YXNrSWR9IEJMT0NLRUQgYWZ0ZXIgJHtmYWlsdXJlQ291bnR9IGZhaWx1cmVzIOKAlCBuZWVkcyBtYW51YWwgY2xlYXJDb29sZG93bigpYCwgewogICAgICAgICAgICAgICAgdGFza0lkLAogICAgICAgICAgICAgICAgZmFpbHVyZUNvdW50LAogICAgICAgICAgICAgICAgbGFiZWwsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQkxPQ0tFRDogJHtsYWJlbCA/PyB0YXNrSWR9IHBlcm1hbmVudGx5IGJsb2NrZWQgYWZ0ZXIgJHtmYWlsdXJlQ291bnR9IGZhaWx1cmVzIOKAlCBuZWVkcyBodW1hbiBpbnRlcnZlbnRpb25gLAogICAgICAgICAgICAgICAgZGV0YWlsOiBlcnJvcj8uc2xpY2UoMCwgMjAwKSwKICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgICAgICByZWFzb246ICJ0YXNrIHBlcm1hbmVudGx5IGJsb2NrZWQgKERBU0gtMTQzIGhhcmQgY2FwKSIsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IHRoaXMuY2FsY3VsYXRlQ29vbGRvd24oZmFpbHVyZUNvdW50KTsKICAgICAgICAgICAgY29uc3QgY29vbGRvd25NaW4gPSBNYXRoLnJvdW5kKGNvb2xkb3duTXMgLyA2MF8wMDApOwogICAgICAgICAgICBsb2cuaW5mbyhgVGFzayAke3Rhc2tJZH0gZmFpbGVkICR7ZmFpbHVyZUNvdW50fSB0aW1lKHMpLCBjb29sZG93biAke2Nvb2xkb3duTWlufW1pbmAsIHsKICAgICAgICAgICAgICAgIHRhc2tJZCwKICAgICAgICAgICAgICAgIGZhaWx1cmVDb3VudCwKICAgICAgICAgICAgICAgIGNvb2xkb3duTWluLAogICAgICAgICAgICAgICAgbGFiZWwsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJhZ2VudCIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ29vbGRvd246ICR7bGFiZWwgPz8gdGFza0lkfSBmYWlsZWQgJHtmYWlsdXJlQ291bnR9eCwgYmFja2luZyBvZmYgJHtjb29sZG93bk1pbn1taW5gLAogICAgICAgICAgICAgICAgZGV0YWlsOiBlcnJvcj8uc2xpY2UoMCwgMjAwKSwKICAgICAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsCiAgICAgICAgICAgICAgICByZWFzb246ICJ0YXNrIGNvb2xkb3duIGVzY2FsYXRpb24iLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGEgdGFzayBpcyBjdXJyZW50bHkgb24gY29vbGRvd24gKG9yIHBlcm1hbmVudGx5IGJsb2NrZWQpLgogICAgICoKICAgICAqIERBU0gtMTQzIGZpeDogY29vbGRvd24gZXhwaXJhdGlvbiBubyBsb25nZXIgZGVsZXRlcyB0aGUgZW50cnkuIEZhaWx1cmUKICAgICAqIGhpc3RvcnkgaXMgcHJlc2VydmVkIHNvIHRoZSBoYXJkIGNhcCAobWF4VG90YWxGYWlsdXJlcykgd29ya3MgYWNyb3NzCiAgICAgKiBjb29sZG93biBjeWNsZXMuIE9ubHkgY2xlYXJDb29sZG93bigpIHJlc2V0cyBmYWlsdXJlIGhpc3RvcnkuCiAgICAgKi8KICAgIGlzT25Db29sZG93bih0YXNrSWQpIHsKICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQodGFza0lkKTsKICAgICAgICBpZiAoIWVudHJ5KQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgLy8gSGFyZCBjYXA6IHBlcm1hbmVudGx5IGJsb2NrZWQgdW50aWwgbWFudWFsIGNsZWFyQ29vbGRvd24oKQogICAgICAgIGlmIChlbnRyeS5mYWlsdXJlQ291bnQgPj0gdGhpcy5jb25maWcubWF4VG90YWxGYWlsdXJlcykKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgY29uc3QgY29vbGRvd25NcyA9IHRoaXMuY2FsY3VsYXRlQ29vbGRvd24oZW50cnkuZmFpbHVyZUNvdW50KTsKICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGVudHJ5Lmxhc3RGYWlsZWRBdCkuZ2V0VGltZSgpOwogICAgICAgIC8vIENvb2xkb3duIGV4cGlyZWQg4oCUIHRhc2sgaXMgcmV0cnlhYmxlLCBidXQga2VlcCB0aGUgZW50cnkgc28KICAgICAgICAvLyBmYWlsdXJlQ291bnQgYWNjdW11bGF0ZXMgYWNyb3NzIGN5Y2xlcyAoREFTSC0xNDMpCiAgICAgICAgaWYgKGVsYXBzZWQgPj0gY29vbGRvd25NcykKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhIHRhc2sgaGFzIGJlZW4gcGVybWFuZW50bHkgYmxvY2tlZCAoZXhjZWVkZWQgbWF4VG90YWxGYWlsdXJlcykuCiAgICAgKiBUaGVzZSB0YXNrcyB3aWxsIG5ldmVyIGJlIHJldHJpZWQgdW50aWwgbWFudWFsbHkgY2xlYXJlZC4KICAgICAqLwogICAgaXNCbG9ja2VkKHRhc2tJZCkgewogICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldCh0YXNrSWQpOwogICAgICAgIHJldHVybiBlbnRyeSAhPSBudWxsICYmIGVudHJ5LmZhaWx1cmVDb3VudCA+PSB0aGlzLmNvbmZpZy5tYXhUb3RhbEZhaWx1cmVzOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayBjb29sZG93biBhbmQgbG9nIGEgc2tpcCBtZXNzYWdlIGlmIHRoZSB0YXNrIGlzIG9uIGNvb2xkb3duLgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHNob3VsZCBiZSBza2lwcGVkLgogICAgICovCiAgICBzaG91bGRTa2lwKHRhc2tJZCkgewogICAgICAgIGlmICghdGhpcy5pc09uQ29vbGRvd24odGFza0lkKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJlY29yZENvb2xkb3duU2tpcCgpOwogICAgICAgIGlmICh0aGlzLmlzQmxvY2tlZCh0YXNrSWQpKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldCh0YXNrSWQpOwogICAgICAgICAgICBsb2cuaW5mbyhgU2tpcHBpbmcgdGFzayAke3Rhc2tJZH0g4oCUIHBlcm1hbmVudGx5IGJsb2NrZWQgYWZ0ZXIgJHtlbnRyeT8uZmFpbHVyZUNvdW50fSBmYWlsdXJlcyAobmVlZHMgbWFudWFsIGNsZWFyKWAsIHsKICAgICAgICAgICAgICAgIHRhc2tJZCwKICAgICAgICAgICAgICAgIGZhaWx1cmVDb3VudDogZW50cnk/LmZhaWx1cmVDb3VudCwKICAgICAgICAgICAgICAgIGxhYmVsOiBlbnRyeT8ubGFiZWwsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXModGFza0lkKTsKICAgICAgICAgICAgaWYgKHN0YXR1cykgewogICAgICAgICAgICAgICAgY29uc3QgcmVtYWluTWluID0gTWF0aC5yb3VuZChzdGF0dXMucmVtYWluaW5nTXMgLyA2MF8wMDApOwogICAgICAgICAgICAgICAgbG9nLmluZm8oYFNraXBwaW5nIHRhc2sgJHt0YXNrSWR9IOKAlCBvbiBjb29sZG93biBmb3IgJHtyZW1haW5NaW59IG1vcmUgbWluICgke3N0YXR1cy5mYWlsdXJlQ291bnR9IGZhaWx1cmVzKWAsIHsKICAgICAgICAgICAgICAgICAgICB0YXNrSWQsCiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTWluOiByZW1haW5NaW4sCiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZUNvdW50OiBzdGF0dXMuZmFpbHVyZUNvdW50LAogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBzdGF0dXMubGFiZWwsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKiBHZXQgZGV0YWlsZWQgc3RhdHVzIGZvciBhIHNpbmdsZSB0YXNrJ3MgY29vbGRvd24uICovCiAgICBnZXRTdGF0dXModGFza0lkKSB7CiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHRhc2tJZCk7CiAgICAgICAgaWYgKCFlbnRyeSkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgLy8gQmxvY2tlZCB0YXNrczogcmVwb3J0IGFzIHBlcm1hbmVudGx5IG9uIGNvb2xkb3duCiAgICAgICAgaWYgKGVudHJ5LmZhaWx1cmVDb3VudCA+PSB0aGlzLmNvbmZpZy5tYXhUb3RhbEZhaWx1cmVzKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0YXNrSWQsCiAgICAgICAgICAgICAgICBsYWJlbDogZW50cnkubGFiZWwsCiAgICAgICAgICAgICAgICBmYWlsdXJlQ291bnQ6IGVudHJ5LmZhaWx1cmVDb3VudCwKICAgICAgICAgICAgICAgIGNvb2xkb3duTXM6IEluZmluaXR5LAogICAgICAgICAgICAgICAgcmVtYWluaW5nTXM6IEluZmluaXR5LAogICAgICAgICAgICAgICAgZXhwaXJlc0F0OiAiYmxvY2tlZCIsCiAgICAgICAgICAgICAgICBsYXN0RmFpbGVkQXQ6IGVudHJ5Lmxhc3RGYWlsZWRBdCwKICAgICAgICAgICAgICAgIGxhc3RFcnJvcjogZW50cnkubGFzdEVycm9yLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBjb29sZG93bk1zID0gdGhpcy5jYWxjdWxhdGVDb29sZG93bihlbnRyeS5mYWlsdXJlQ291bnQpOwogICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUoZW50cnkubGFzdEZhaWxlZEF0KS5nZXRUaW1lKCk7CiAgICAgICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCBjb29sZG93bk1zIC0gZWxhcHNlZCk7CiAgICAgICAgaWYgKHJlbWFpbmluZ01zID09PSAwKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0YXNrSWQsCiAgICAgICAgICAgIGxhYmVsOiBlbnRyeS5sYWJlbCwKICAgICAgICAgICAgZmFpbHVyZUNvdW50OiBlbnRyeS5mYWlsdXJlQ291bnQsCiAgICAgICAgICAgIGNvb2xkb3duTXMsCiAgICAgICAgICAgIHJlbWFpbmluZ01zLAogICAgICAgICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKG5ldyBEYXRlKGVudHJ5Lmxhc3RGYWlsZWRBdCkuZ2V0VGltZSgpICsgY29vbGRvd25NcykudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgbGFzdEZhaWxlZEF0OiBlbnRyeS5sYXN0RmFpbGVkQXQsCiAgICAgICAgICAgIGxhc3RFcnJvcjogZW50cnkubGFzdEVycm9yLAogICAgICAgIH07CiAgICB9CiAgICAvKiogQ2xlYXIgY29vbGRvd24gZm9yIGEgc3BlY2lmaWMgdGFzayAoZS5nLiwgYWZ0ZXIgbWFudWFsIGludGVydmVudGlvbikuICovCiAgICBjbGVhckNvb2xkb3duKHRhc2tJZCkgewogICAgICAgIGlmICh0aGlzLmVudHJpZXMuZGVsZXRlKHRhc2tJZCkpIHsKICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVQZXJzaXN0KCk7CiAgICAgICAgICAgIGxvZy5pbmZvKGBDb29sZG93biBjbGVhcmVkIGZvciB0YXNrICR7dGFza0lkfWApOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBDbGVhciBhbGwgY29vbGRvd25zLiAqLwogICAgY2xlYXJBbGwoKSB7CiAgICAgICAgaWYgKHRoaXMuZW50cmllcy5zaXplID4gMCkgewogICAgICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVQZXJzaXN0KCk7CiAgICAgICAgICAgIGxvZy5pbmZvKCJBbGwgY29vbGRvd25zIGNsZWFyZWQiKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBleHBpcmVkIGNvb2xkb3duIGVudHJpZXMgdGhhdCBhcmUgc2FmZSB0byBwcnVuZS4KICAgICAqIEVudHJpZXMgYXQgb3IgYWJvdmUgdGhlIGhhcmQgZmFpbHVyZSBjYXAgYXJlIE5FVkVSIHBydW5lZCDigJQgdGhleQogICAgICogcmVwcmVzZW50IHBlcm1hbmVudGx5IGJsb2NrZWQgdGFza3MgdGhhdCBuZWVkIG1hbnVhbCBjbGVhckNvb2xkb3duKCkuCiAgICAgKiBFbnRyaWVzIHdpdGggZmFpbHVyZSBoaXN0b3J5IGJ1dCBleHBpcmVkIGNvb2xkb3ducyBhcmUgcHJ1bmVkIGFmdGVyCiAgICAgKiAyNCBob3VycyBvZiBpbmFjdGl2aXR5IChlbm91Z2ggdGltZSB0aGF0IGlmIHRoZSB0YXNrIHN1Y2NlZWRzIG9uCiAgICAgKiB0aGUgbmV4dCByZXRyeSwgdGhlIGVudHJ5IGlzIG5vIGxvbmdlciBuZWVkZWQpLgogICAgICovCiAgICBwcnVuZUV4cGlyZWQoKSB7CiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBTVEFMRV9USFJFU0hPTERfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwOyAvLyAyNCBob3VycwogICAgICAgIGxldCBwcnVuZWQgPSAwOwogICAgICAgIGZvciAoY29uc3QgW3Rhc2tJZCwgZW50cnldIG9mIHRoaXMuZW50cmllcykgewogICAgICAgICAgICAvLyBOZXZlciBwcnVuZSBwZXJtYW5lbnRseSBibG9ja2VkIGVudHJpZXMKICAgICAgICAgICAgaWYgKGVudHJ5LmZhaWx1cmVDb3VudCA+PSB0aGlzLmNvbmZpZy5tYXhUb3RhbEZhaWx1cmVzKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duTXMgPSB0aGlzLmNhbGN1bGF0ZUNvb2xkb3duKGVudHJ5LmZhaWx1cmVDb3VudCk7CiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBub3cgLSBuZXcgRGF0ZShlbnRyeS5sYXN0RmFpbGVkQXQpLmdldFRpbWUoKTsKICAgICAgICAgICAgLy8gT25seSBwcnVuZSBpZiBjb29sZG93biBleHBpcmVkIEFORCBlbnRyeSBpcyBzdGFsZSAoMjRoIGluYWN0aXZlKQogICAgICAgICAgICBpZiAoZWxhcHNlZCA+PSBjb29sZG93bk1zICsgU1RBTEVfVEhSRVNIT0xEX01TKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHRhc2tJZCk7CiAgICAgICAgICAgICAgICBwcnVuZWQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocHJ1bmVkID4gMCkgewogICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVBlcnNpc3QoKTsKICAgICAgICAgICAgbG9nLmluZm8oYFBydW5lZCAke3BydW5lZH0gc3RhbGUgY29vbGRvd24gZW50cmllc2ApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJ1bmVkOwogICAgfQogICAgLyoqIExpc3QgYWxsIGFjdGl2ZSBjb29sZG93bnMgYW5kIGJsb2NrZWQgdGFza3Mgd2l0aCBzdGF0dXMgZGV0YWlscy4gKi8KICAgIGxpc3RBY3RpdmVDb29sZG93bnMoKSB7CiAgICAgICAgdGhpcy5wcnVuZUV4cGlyZWQoKTsKICAgICAgICBjb25zdCByZXN1bHRzID0gW107CiAgICAgICAgZm9yIChjb25zdCBbdGFza0lkXSBvZiB0aGlzLmVudHJpZXMpIHsKICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXModGFza0lkKTsKICAgICAgICAgICAgaWYgKHN0YXR1cykKICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdGF0dXMpOwogICAgICAgIH0KICAgICAgICAvLyBCbG9ja2VkIHRhc2tzIChJbmZpbml0eSkgc29ydCBsYXN0LCB0aGVuIGJ5IHJlbWFpbmluZyB0aW1lCiAgICAgICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICAgIGlmIChhLnJlbWFpbmluZ01zID09PSBJbmZpbml0eSAmJiBiLnJlbWFpbmluZ01zID09PSBJbmZpbml0eSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBpZiAoYS5yZW1haW5pbmdNcyA9PT0gSW5maW5pdHkpCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgaWYgKGIucmVtYWluaW5nTXMgPT09IEluZmluaXR5KQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICByZXR1cm4gYS5yZW1haW5pbmdNcyAtIGIucmVtYWluaW5nTXM7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgICAvKiogR2V0IHN1bW1hcnkgZm9yIHBsYW5uZXIgY29udGV4dCAod2hhdCB0YXNrcyBhcmUgb24gY29vbGRvd24gb3IgYmxvY2tlZCkuICovCiAgICBnZXRDb29sZG93bkNvbnRleHQoKSB7CiAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5saXN0QWN0aXZlQ29vbGRvd25zKCk7CiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggPT09IDApCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGNvbnN0IGxpbmVzID0gYWN0aXZlLm1hcCgocykgPT4gewogICAgICAgICAgICBpZiAocy5leHBpcmVzQXQgPT09ICJibG9ja2VkIikgewogICAgICAgICAgICAgICAgcmV0dXJuIGAtICR7cy5sYWJlbCA/PyBzLnRhc2tJZH06IEJMT0NLRUQgKCR7cy5mYWlsdXJlQ291bnR9IGZhaWx1cmVzLCBuZWVkcyBodW1hbiBpbnRlcnZlbnRpb24pYDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZW1haW5NaW4gPSBNYXRoLnJvdW5kKHMucmVtYWluaW5nTXMgLyA2MF8wMDApOwogICAgICAgICAgICByZXR1cm4gYC0gJHtzLmxhYmVsID8/IHMudGFza0lkfTogZmFpbGVkICR7cy5mYWlsdXJlQ291bnR9eCwgJHtyZW1haW5NaW59bWluIHJlbWFpbmluZ2A7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oIlxuIik7CiAgICB9CiAgICAvKiogR2V0IHRoZSBmYWlsdXJlIGNvdW50IGZvciBhIHRhc2sgKDAgaWYgbm90IHRyYWNrZWQpLiAqLwogICAgZ2V0RmFpbHVyZUNvdW50KHRhc2tJZCkgewogICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KHRhc2tJZCk/LmZhaWx1cmVDb3VudCA/PyAwOwogICAgfQogICAgLyoqIEdldCB0b3RhbCBudW1iZXIgb2YgdHJhY2tlZCBlbnRyaWVzIChhY3RpdmUgKyBleHBpcmVkIHBlbmRpbmcgcHJ1bmUpLiAqLwogICAgZ2V0IHNpemUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5zaXplOwogICAgfQogICAgLy8g4pSA4pSAIEludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKgogICAgICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgY29vbGRvd24uCiAgICAgKiBGb3JtdWxhOiBiYXNlIMOXIG11bHRpcGxpZXJeKGZhaWx1cmVDb3VudCAtIDEpLCBjYXBwZWQgYXQgbWF4LgogICAgICoKICAgICAqICAgRmFpbHVyZXMg4oaSIENvb2xkb3duICh3aXRoIGRlZmF1bHRzKToKICAgICAqICAgICAxIOKGkiAzMG1pbgogICAgICogICAgIDIg4oaSIDYwbWluCiAgICAgKiAgICAgMyDihpIgMTIwbWluCiAgICAgKiAgICAgNCDihpIgMjQwbWluIChjYXBwZWQgYXQgNGhyKQogICAgICogICAgIDUrIOKGkiAyNDBtaW4gKGNhcHBlZCBhdCA0aHIpCiAgICAgKi8KICAgIGNhbGN1bGF0ZUNvb2xkb3duKGZhaWx1cmVDb3VudCkgewogICAgICAgIGNvbnN0IHsgYmFzZUNvb2xkb3duTXMsIG1heENvb2xkb3duTXMsIGJhY2tvZmZNdWx0aXBsaWVyIH0gPSB0aGlzLmNvbmZpZzsKICAgICAgICByZXR1cm4gTWF0aC5taW4oYmFzZUNvb2xkb3duTXMgKiBNYXRoLnBvdyhiYWNrb2ZmTXVsdGlwbGllciwgTWF0aC5tYXgoMCwgZmFpbHVyZUNvdW50IC0gMSkpLCBtYXhDb29sZG93bk1zKTsKICAgIH0KICAgIC8qKiBEZWJvdW5jZWQgcGVyc2lzdCDigJQgd2FpdHMgNXMgYWZ0ZXIgbGFzdCBjaGFuZ2UgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay4gKi8KICAgIHNjaGVkdWxlUGVyc2lzdCgpIHsKICAgICAgICBpZiAodGhpcy5wZXJzaXN0VGltZXIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLnBlcnNpc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0aGlzLnBlcnNpc3RUaW1lciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucGVyc2lzdEFzeW5jKCkuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBwZXJzaXN0IGNvb2xkb3duczogJHtlcnIubWVzc2FnZX1gKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgNV8wMDApOwogICAgfQogICAgYXN5bmMgcGVyc2lzdEFzeW5jKCkgewogICAgICAgIGlmICghdGhpcy5kaXJ0eSkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIC8vIFBydW5lIGJlZm9yZSBwZXJzaXN0aW5nCiAgICAgICAgdGhpcy5wcnVuZUV4cGlyZWQoKTsKICAgICAgICAvLyBFbmZvcmNlIG1heCBlbnRyaWVzOiBrZWVwIHRoZSBtb3N0IHJlY2VudAogICAgICAgIGlmICh0aGlzLmVudHJpZXMuc2l6ZSA+IHRoaXMuY29uZmlnLm1heEVudHJpZXMpIHsKICAgICAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnRoaXMuZW50cmllcy5lbnRyaWVzKCldCiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gbmV3IERhdGUoYlsxXS5sYXN0RmFpbGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGFbMV0ubGFzdEZhaWxlZEF0KS5nZXRUaW1lKCkpOwogICAgICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKHNvcnRlZC5zbGljZSgwLCB0aGlzLmNvbmZpZy5tYXhFbnRyaWVzKSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRhdGEgPSBbLi4udGhpcy5lbnRyaWVzLnZhbHVlcygpXTsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBta2RpcihkaXJuYW1lKHRoaXMuY29uZmlnLnBlcnNpc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0aGlzLmNvbmZpZy5wZXJzaXN0UGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMiksICJ1dGYtOCIpOwogICAgICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7CiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgUGVyc2lzdGVkICR7ZGF0YS5sZW5ndGh9IGNvb2xkb3duIGVudHJpZXMgdG8gZGlza2ApOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gd3JpdGUgY29vbGRvd24gZmlsZTogJHtlcnIubWVzc2FnZX1gKTsKICAgICAgICB9CiAgICB9CiAgICAvKiogU3luY2hyb25vdXMgcGVyc2lzdCBmb3Igc2h1dGRvd24gcGF0aCAoYmVzdC1lZmZvcnQpLiAqLwogICAgcGVyc2lzdFN5bmMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgeyB3cml0ZUZpbGVTeW5jLCBta2RpclN5bmMgfSA9IHJlcXVpcmUoIm5vZGU6ZnMiKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IFsuLi50aGlzLmVudHJpZXMudmFsdWVzKCldOwogICAgICAgICAgICBta2RpclN5bmMoZGlybmFtZSh0aGlzLmNvbmZpZy5wZXJzaXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRoaXMuY29uZmlnLnBlcnNpc3RQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSwgInV0Zi04Iik7CiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAvLyBCZXN0IGVmZm9ydCBvbiBzaHV0ZG93bgogICAgICAgIH0KICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1jb29sZG93bi5qcy5tYXA=","agents/locks.js":"LyoqCiAqIEZpbGUtbGV2ZWwgbG9ja2luZyBzeXN0ZW0gZm9yIGFnZW50IGNvbmN1cnJlbmN5IGNvbnRyb2wuCiAqCiAqIFByZXZlbnRzIGNvbmN1cnJlbnQgYWdlbnRzIGZyb20gZWRpdGluZyB0aGUgc2FtZSBmaWxlcyBieSBtYWludGFpbmluZwogKiBhIGxvY2sgcmVnaXN0cnkgcGVyc2lzdGVkIHRvIGJyYWluL2FnZW50cy9sb2Nrcy5qc29uLgogKgogKiBGZWF0dXJlczoKICogLSBBdG9taWMgbG9jayBhY3F1aXNpdGlvbiAoYWxsLW9yLW5vdGhpbmcgZm9yIGEgc2V0IG9mIGZpbGVzKQogKiAtIENvbnNpc3RlbnQgbG9jayBvcmRlcmluZyAoc29ydGVkIGJ5IHBhdGgpIHRvIHByZXZlbnQgZGVhZGxvY2tzCiAqIC0gTG9jayB0aW1lb3V0IChkZWZhdWx0IDMwIG1pbikgZm9yIGNyYXNoZWQgYWdlbnQgY2xlYW51cAogKiAtIEF1dG8tY2xlYW51cCBvbiBhZ2VudCBjb21wbGV0aW9uL2ZhaWx1cmUKICovCmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUsIG1rZGlyIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImZpbGUtbG9ja3MiKTsKLy8g4pSA4pSAIENvbnN0YW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKY29uc3QgTE9DS1NfRklMRSA9IGpvaW4oQlJBSU5fRElSLCAiYWdlbnRzIiwgImxvY2tzLmpzb24iKTsKY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMzAgKiA2MCAqIDEwMDA7IC8vIDMwIG1pbnV0ZXMKLy8g4pSA4pSAIEluLW1lbW9yeSBtdXRleCBmb3Igc2VyaWFsaXppbmcgbG9jayBmaWxlIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IHdyaXRlTG9jayA9IFByb21pc2UucmVzb2x2ZSgpOwovKioKICogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgbG9jayBmaWxlIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zCiAqIGJldHdlZW4gY29uY3VycmVudCBsb2NrL3VubG9jayBvcGVyYXRpb25zIHdpdGhpbiB0aGlzIHByb2Nlc3MuCiAqLwpmdW5jdGlvbiB3aXRoTG9ja0ZpbGUoZm4pIHsKICAgIGNvbnN0IHByZXYgPSB3cml0ZUxvY2s7CiAgICBsZXQgcmVzb2x2ZTsKICAgIHdyaXRlTG9jayA9IG5ldyBQcm9taXNlKChyKSA9PiB7IHJlc29sdmUgPSByOyB9KTsKICAgIHJldHVybiBwcmV2LnRoZW4oZm4pLmZpbmFsbHkoKCkgPT4gcmVzb2x2ZSgpKTsKfQovLyDilIDilIAgUGVyc2lzdGVuY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmFzeW5jIGZ1bmN0aW9uIHJlYWRMb2NrU3RhdGUoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKExPQ0tTX0ZJTEUsICJ1dGYtOCIpOwogICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdyk7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuIHsgbG9ja3M6IFtdLCBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVMb2NrU3RhdGUoc3RhdGUpIHsKICAgIHN0YXRlLmxhc3RVcGRhdGVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgYXdhaXQgbWtkaXIoZGlybmFtZShMT0NLU19GSUxFKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICBhd2FpdCB3cml0ZUZpbGUoTE9DS1NfRklMRSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUsIG51bGwsIDIpLCAidXRmLTgiKTsKfQovLyDilIDilIAgU3RhbGVuZXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBpc0xvY2tTdGFsZShsb2NrKSB7CiAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGxvY2suYWNxdWlyZWRBdCkuZ2V0VGltZSgpOwogICAgcmV0dXJuIGVsYXBzZWQgPiBsb2NrLnRpbWVvdXRNczsKfQovKiogUmVtb3ZlIGV4cGlyZWQgbG9ja3MgZnJvbSBzdGF0ZS4gUmV0dXJucyB0aGUgY2xlYW5lZCBzdGF0ZS4gKi8KZnVuY3Rpb24gcHJ1bmVTdGFsZShzdGF0ZSkgewogICAgY29uc3QgcHJ1bmVkID0gW107CiAgICBjb25zdCBrZXB0ID0gW107CiAgICBmb3IgKGNvbnN0IGxvY2sgb2Ygc3RhdGUubG9ja3MpIHsKICAgICAgICBpZiAoaXNMb2NrU3RhbGUobG9jaykpIHsKICAgICAgICAgICAgcHJ1bmVkLnB1c2gobG9jayk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBrZXB0LnB1c2gobG9jayk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgc3RhdGU6IHsgLi4uc3RhdGUsIGxvY2tzOiBrZXB0IH0sIHBydW5lZCB9Owp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQWNxdWlyZSBsb2NrcyBvbiBhIHNldCBvZiBmaWxlcyBmb3IgYW4gYWdlbnQuCiAqCiAqIFVzZXMgY29uc2lzdGVudCBvcmRlcmluZyAoc29ydGVkIHBhdGhzKSB0byBwcmV2ZW50IGRlYWRsb2Nrcy4KICogQWNxdWlzaXRpb24gaXMgYWxsLW9yLW5vdGhpbmc6IGVpdGhlciBhbGwgZmlsZXMgYXJlIGxvY2tlZCBvciBub25lLgogKiBTdGFsZSBsb2NrcyBhcmUgYXV0b21hdGljYWxseSBjbGVhbmVkIGJlZm9yZSBjaGVja2luZy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3F1aXJlTG9ja3MoYWdlbnRJZCwgYWdlbnRMYWJlbCwgZmlsZVBhdGhzLCB0aW1lb3V0TXMgPSBERUZBVUxUX1RJTUVPVVRfTVMpIHsKICAgIGlmIChmaWxlUGF0aHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsgYWNxdWlyZWQ6IHRydWUsIGNvbmZsaWN0czogW10gfTsKICAgIH0KICAgIHJldHVybiB3aXRoTG9ja0ZpbGUoYXN5bmMgKCkgPT4gewogICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHJlYWRMb2NrU3RhdGUoKTsKICAgICAgICAvLyBQcnVuZSBzdGFsZSBsb2NrcyBmaXJzdAogICAgICAgIGNvbnN0IHsgc3RhdGU6IGNsZWFuZWQsIHBydW5lZCB9ID0gcHJ1bmVTdGFsZShzdGF0ZSk7CiAgICAgICAgc3RhdGUgPSBjbGVhbmVkOwogICAgICAgIGlmIChwcnVuZWQubGVuZ3RoID4gMCkgewogICAgICAgICAgICBsb2cuaW5mbyhgUHJ1bmVkICR7cHJ1bmVkLmxlbmd0aH0gc3RhbGUgbG9jayhzKTogJHtwcnVuZWQubWFwKChsKSA9PiBsLmZpbGVQYXRoKS5qb2luKCIsICIpfWApOwogICAgICAgIH0KICAgICAgICAvLyBTb3J0IHBhdGhzIGZvciBjb25zaXN0ZW50IG9yZGVyaW5nIChkZWFkbG9jayBwcmV2ZW50aW9uKQogICAgICAgIGNvbnN0IHNvcnRlZFBhdGhzID0gWy4uLm5ldyBTZXQoZmlsZVBhdGhzKV0uc29ydCgpOwogICAgICAgIC8vIENoZWNrIGZvciBjb25mbGljdHMgKGZpbGVzIGxvY2tlZCBieSBhIGRpZmZlcmVudCBhZ2VudCkKICAgICAgICBjb25zdCBjb25mbGljdHMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGZwIG9mIHNvcnRlZFBhdGhzKSB7CiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gc3RhdGUubG9ja3MuZmluZCgobCkgPT4gbC5maWxlUGF0aCA9PT0gZnAgJiYgbC5hZ2VudElkICE9PSBhZ2VudElkKTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICBjb25mbGljdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGZwLAogICAgICAgICAgICAgICAgICAgIGhlbGRCeTogewogICAgICAgICAgICAgICAgICAgICAgICBhZ2VudElkOiBleGlzdGluZy5hZ2VudElkLAogICAgICAgICAgICAgICAgICAgICAgICBhZ2VudExhYmVsOiBleGlzdGluZy5hZ2VudExhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZEF0OiBleGlzdGluZy5hY3F1aXJlZEF0LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29uZmxpY3RzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbG9nLndhcm4oYExvY2sgY29uZmxpY3QgZm9yIGFnZW50ICIke2FnZW50TGFiZWx9IiAoJHthZ2VudElkfSk6ICR7Y29uZmxpY3RzLm1hcCgoYykgPT4gYCR7Yy5maWxlUGF0aH0gaGVsZCBieSAke2MuaGVsZEJ5LmFnZW50SWR9YCkuam9pbigiLCAiKX1gKTsKICAgICAgICAgICAgYXdhaXQgd3JpdGVMb2NrU3RhdGUoc3RhdGUpOyAvLyBwZXJzaXN0IHN0YWxlIHBydW5pbmcgZXZlbiBvbiBjb25mbGljdAogICAgICAgICAgICByZXR1cm4geyBhY3F1aXJlZDogZmFsc2UsIGNvbmZsaWN0cyB9OwogICAgICAgIH0KICAgICAgICAvLyBBbGwgY2xlYXIg4oCUIGFjcXVpcmUgYWxsIGxvY2tzIGF0b21pY2FsbHkKICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgZm9yIChjb25zdCBmcCBvZiBzb3J0ZWRQYXRocykgewogICAgICAgICAgICAvLyBSZW1vdmUgYW55IGV4aXN0aW5nIGxvY2sgYnkgdGhpcyBzYW1lIGFnZW50IG9uIHRoaXMgZmlsZSAocmUtYWNxdWlyZSkKICAgICAgICAgICAgc3RhdGUubG9ja3MgPSBzdGF0ZS5sb2Nrcy5maWx0ZXIoKGwpID0+ICEobC5maWxlUGF0aCA9PT0gZnAgJiYgbC5hZ2VudElkID09PSBhZ2VudElkKSk7CiAgICAgICAgICAgIHN0YXRlLmxvY2tzLnB1c2goewogICAgICAgICAgICAgICAgZmlsZVBhdGg6IGZwLAogICAgICAgICAgICAgICAgYWdlbnRJZCwKICAgICAgICAgICAgICAgIGFnZW50TGFiZWwsCiAgICAgICAgICAgICAgICBhY3F1aXJlZEF0OiBub3csCiAgICAgICAgICAgICAgICB0aW1lb3V0TXMsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBhd2FpdCB3cml0ZUxvY2tTdGF0ZShzdGF0ZSk7CiAgICAgICAgbG9nLmluZm8oYEFjcXVpcmVkICR7c29ydGVkUGF0aHMubGVuZ3RofSBsb2NrKHMpIGZvciBhZ2VudCAiJHthZ2VudExhYmVsfSIgKCR7YWdlbnRJZH0pOiAke3NvcnRlZFBhdGhzLmpvaW4oIiwgIil9YCk7CiAgICAgICAgcmV0dXJuIHsgYWNxdWlyZWQ6IHRydWUsIGNvbmZsaWN0czogW10gfTsKICAgIH0pOwp9Ci8qKgogKiBSZWxlYXNlIGFsbCBsb2NrcyBoZWxkIGJ5IGFuIGFnZW50LgogKiBDYWxsZWQgb24gYWdlbnQgY29tcGxldGlvbiwgZmFpbHVyZSwgb3IgY2FuY2VsbGF0aW9uLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VMb2NrcyhhZ2VudElkKSB7CiAgICByZXR1cm4gd2l0aExvY2tGaWxlKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHJlYWRMb2NrU3RhdGUoKTsKICAgICAgICBjb25zdCBiZWZvcmUgPSBzdGF0ZS5sb2Nrcy5sZW5ndGg7CiAgICAgICAgc3RhdGUubG9ja3MgPSBzdGF0ZS5sb2Nrcy5maWx0ZXIoKGwpID0+IGwuYWdlbnRJZCAhPT0gYWdlbnRJZCk7CiAgICAgICAgY29uc3QgcmVsZWFzZWQgPSBiZWZvcmUgLSBzdGF0ZS5sb2Nrcy5sZW5ndGg7CiAgICAgICAgaWYgKHJlbGVhc2VkID4gMCkgewogICAgICAgICAgICBhd2FpdCB3cml0ZUxvY2tTdGF0ZShzdGF0ZSk7CiAgICAgICAgICAgIGxvZy5pbmZvKGBSZWxlYXNlZCAke3JlbGVhc2VkfSBsb2NrKHMpIGZvciBhZ2VudCAke2FnZW50SWR9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWxlYXNlZDsKICAgIH0pOwp9Ci8qKgogKiBSZWxlYXNlIGEgbG9jayBvbiBhIHNwZWNpZmljIGZpbGUgaGVsZCBieSBhIHNwZWNpZmljIGFnZW50LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VGaWxlTG9jayhhZ2VudElkLCBmaWxlUGF0aCkgewogICAgcmV0dXJuIHdpdGhMb2NrRmlsZShhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3Qgc3RhdGUgPSBhd2FpdCByZWFkTG9ja1N0YXRlKCk7CiAgICAgICAgY29uc3QgaWR4ID0gc3RhdGUubG9ja3MuZmluZEluZGV4KChsKSA9PiBsLmFnZW50SWQgPT09IGFnZW50SWQgJiYgbC5maWxlUGF0aCA9PT0gZmlsZVBhdGgpOwogICAgICAgIGlmIChpZHggPT09IC0xKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgc3RhdGUubG9ja3Muc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgYXdhaXQgd3JpdGVMb2NrU3RhdGUoc3RhdGUpOwogICAgICAgIGxvZy5pbmZvKGBSZWxlYXNlZCBsb2NrIG9uICIke2ZpbGVQYXRofSIgZm9yIGFnZW50ICR7YWdlbnRJZH1gKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwp9Ci8qKgogKiBGb3JjZS1yZWxlYXNlIGEgbG9jayBvbiBhIGZpbGUgcmVnYXJkbGVzcyBvZiB3aGljaCBhZ2VudCBob2xkcyBpdC4KICogVXNlIGZvciBtYW51YWwgaW50ZXJ2ZW50aW9uIC8gYWRtaW4gY2xlYW51cC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmb3JjZVJlbGVhc2VMb2NrKGZpbGVQYXRoKSB7CiAgICByZXR1cm4gd2l0aExvY2tGaWxlKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHJlYWRMb2NrU3RhdGUoKTsKICAgICAgICBjb25zdCBpZHggPSBzdGF0ZS5sb2Nrcy5maW5kSW5kZXgoKGwpID0+IGwuZmlsZVBhdGggPT09IGZpbGVQYXRoKTsKICAgICAgICBpZiAoaWR4ID09PSAtMSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGNvbnN0IGxvY2sgPSBzdGF0ZS5sb2Nrc1tpZHhdOwogICAgICAgIHN0YXRlLmxvY2tzLnNwbGljZShpZHgsIDEpOwogICAgICAgIGF3YWl0IHdyaXRlTG9ja1N0YXRlKHN0YXRlKTsKICAgICAgICBsb2cuaW5mbyhgRm9yY2UtcmVsZWFzZWQgbG9jayBvbiAiJHtmaWxlUGF0aH0iICh3YXMgaGVsZCBieSAke2xvY2suYWdlbnRJZH0pYCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKfQovKioKICogTGlzdCBhbGwgYWN0aXZlIChub24tc3RhbGUpIGxvY2tzLiBQcnVuZXMgc3RhbGUgbG9ja3MgYXMgYSBzaWRlIGVmZmVjdC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0TG9ja3MoKSB7CiAgICByZXR1cm4gd2l0aExvY2tGaWxlKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHJlYWRMb2NrU3RhdGUoKTsKICAgICAgICBjb25zdCB7IHN0YXRlOiBjbGVhbmVkLCBwcnVuZWQgfSA9IHBydW5lU3RhbGUoc3RhdGUpOwogICAgICAgIGlmIChwcnVuZWQubGVuZ3RoID4gMCkgewogICAgICAgICAgICBhd2FpdCB3cml0ZUxvY2tTdGF0ZShjbGVhbmVkKTsKICAgICAgICAgICAgbG9nLmluZm8oYFBydW5lZCAke3BydW5lZC5sZW5ndGh9IHN0YWxlIGxvY2socykgZHVyaW5nIGxpc3RgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsZWFuZWQubG9ja3M7CiAgICB9KTsKfQovKioKICogR2V0IGFsbCBsb2NrcyBoZWxkIGJ5IGEgc3BlY2lmaWMgYWdlbnQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TG9ja3NGb3JBZ2VudChhZ2VudElkKSB7CiAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHJlYWRMb2NrU3RhdGUoKTsKICAgIHJldHVybiBzdGF0ZS5sb2Nrcy5maWx0ZXIoKGwpID0+IGwuYWdlbnRJZCA9PT0gYWdlbnRJZCAmJiAhaXNMb2NrU3RhbGUobCkpOwp9Ci8qKgogKiBDaGVjayBpZiBzcGVjaWZpYyBmaWxlcyBhcmUgbG9ja2VkIChieSBhbnkgYWdlbnQpLgogKiBSZXR1cm5zIGNvbmZsaWN0cyBmb3IgbG9ja2VkIGZpbGVzLCBlbXB0eSBhcnJheSBpZiBhbGwgY2xlYXIuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tMb2NrcyhmaWxlUGF0aHMpIHsKICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgcmVhZExvY2tTdGF0ZSgpOwogICAgY29uc3QgY29uZmxpY3RzID0gW107CiAgICBmb3IgKGNvbnN0IGZwIG9mIGZpbGVQYXRocykgewogICAgICAgIGNvbnN0IGxvY2sgPSBzdGF0ZS5sb2Nrcy5maW5kKChsKSA9PiBsLmZpbGVQYXRoID09PSBmcCAmJiAhaXNMb2NrU3RhbGUobCkpOwogICAgICAgIGlmIChsb2NrKSB7CiAgICAgICAgICAgIGNvbmZsaWN0cy5wdXNoKHsKICAgICAgICAgICAgICAgIGZpbGVQYXRoOiBmcCwKICAgICAgICAgICAgICAgIGhlbGRCeTogewogICAgICAgICAgICAgICAgICAgIGFnZW50SWQ6IGxvY2suYWdlbnRJZCwKICAgICAgICAgICAgICAgICAgICBhZ2VudExhYmVsOiBsb2NrLmFnZW50TGFiZWwsCiAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWRBdDogbG9jay5hY3F1aXJlZEF0LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbmZsaWN0czsKfQovKioKICogUHJ1bmUgYWxsIHN0YWxlIGxvY2tzIGFuZCBwZXJzaXN0LiBDYWxsZWQgcGVyaW9kaWNhbGx5IGJ5IHRoZSBhZ2VudCBtb25pdG9yLgogKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbG9ja3MgcHJ1bmVkLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBydW5lQWxsU3RhbGVMb2NrcygpIHsKICAgIHJldHVybiB3aXRoTG9ja0ZpbGUoYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgcmVhZExvY2tTdGF0ZSgpOwogICAgICAgIGNvbnN0IHsgc3RhdGU6IGNsZWFuZWQsIHBydW5lZCB9ID0gcHJ1bmVTdGFsZShzdGF0ZSk7CiAgICAgICAgaWYgKHBydW5lZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGF3YWl0IHdyaXRlTG9ja1N0YXRlKGNsZWFuZWQpOwogICAgICAgICAgICBsb2cuaW5mbyhgUHJ1bmVkICR7cHJ1bmVkLmxlbmd0aH0gc3RhbGUgbG9jayhzKTogJHtwcnVuZWQubWFwKChsKSA9PiBgJHtsLmZpbGVQYXRofSAoYWdlbnQgJHtsLmFnZW50SWR9KWApLmpvaW4oIiwgIil9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcnVuZWQubGVuZ3RoOwogICAgfSk7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9ja3MuanMubWFw","agents/triage.js":"LyoqCiAqIEFnZW50IG91dHB1dCB0cmlhZ2Ug4oCUIHBhcnNlIFtORUVEU19IVU1BTl0gYmxvY2tzIGZyb20gYWdlbnQgb3V0cHV0LAogKiByZWNvcmQgcXVlc3Rpb25zIG9uIHRoZSBiYWNrbG9nIGl0ZW0sIGFuZCBzdXJmYWNlIGFzIG5vdGlmaWNhdGlvbnMuCiAqCiAqIENhbGxlZCBhZnRlciBldmVyeSBhZ2VudCBleGl0IChzdWNjZXNzIG9yIGZhaWx1cmUpLgogKi8KaW1wb3J0IHsgZ2V0Qm9hcmRQcm92aWRlciB9IGZyb20gIi4uL2JvYXJkL3Byb3ZpZGVyLmpzIjsKaW1wb3J0IHsgcHVzaE5vdGlmaWNhdGlvbiB9IGZyb20gIi4uL2dvYWxzL25vdGlmaWNhdGlvbnMuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiYWdlbnQtdHJpYWdlIik7CmNvbnN0IE5FRURTX0hVTUFOX1JFID0gL1xbTkVFRFNfSFVNQU5cXVxzKihbXHNcU10qPylccypcW1wvTkVFRFNfSFVNQU5cXS9nOwovKioKICogUGFyc2UgW05FRURTX0hVTUFOXSBibG9ja3MgZnJvbSBhZ2VudCBvdXRwdXQuCiAqIFJldHVybnMgZXh0cmFjdGVkIHF1ZXN0aW9ucyBvciBudWxsIGlmIG5vbmUgZm91bmQuCiAqLwpleHBvcnQgZnVuY3Rpb24gcGFyc2VOZWVkc0h1bWFuKG91dHB1dCkgewogICAgY29uc3QgYmxvY2tzID0gWy4uLm91dHB1dC5tYXRjaEFsbChORUVEU19IVU1BTl9SRSldOwogICAgaWYgKGJsb2Nrcy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBxdWVzdGlvbnMgPSBbXTsKICAgIGZvciAoY29uc3QgYmxvY2sgb2YgYmxvY2tzKSB7CiAgICAgICAgY29uc3QgbGluZXMgPSBibG9ja1sxXQogICAgICAgICAgICAuc3BsaXQoIlxuIikKICAgICAgICAgICAgLm1hcCgobCkgPT4gbC5yZXBsYWNlKC9eWy0q4oCiXVxzKi8sICIiKS50cmltKCkpCiAgICAgICAgICAgIC5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7CiAgICAgICAgcXVlc3Rpb25zLnB1c2goLi4ubGluZXMpOwogICAgfQogICAgcmV0dXJuIHF1ZXN0aW9ucy5sZW5ndGggPiAwID8gcXVlc3Rpb25zIDogbnVsbDsKfQovKioKICogUHJvY2VzcyBhZ2VudCBvdXRwdXQgZm9yIGh1bWFuIHF1ZXN0aW9ucy4KICogSWYgZm91bmQ6IHJlY29yZCBvbiBib2FyZCBpdGVtIGFzIGV4Y2hhbmdlLCBwdXNoIG5vdGlmaWNhdGlvbiwgbG9nIGFjdGl2aXR5LgogKiBSZXR1cm5zIHRydWUgaWYgcXVlc3Rpb25zIHdlcmUgZm91bmQgYW5kIHJlY29yZGVkLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyaWFnZUFnZW50T3V0cHV0KHRhc2ssIG91dHB1dCkgewogICAgY29uc3QgcXVlc3Rpb25zID0gcGFyc2VOZWVkc0h1bWFuKG91dHB1dCk7CiAgICBpZiAoIXF1ZXN0aW9ucykgewogICAgICAgIGxvZy5kZWJ1ZyhgTm8gaHVtYW4gcXVlc3Rpb25zIGZvdW5kIGluIG91dHB1dGAsIHsgdGFza0lkOiB0YXNrLmlkLCBsYWJlbDogdGFzay5sYWJlbCB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBsb2cuaW5mbyhgQWdlbnQgbmVlZHMgaHVtYW4gaW5wdXQ6ICR7dGFzay5sYWJlbH1gLCB7IHRhc2tJZDogdGFzay5pZCwgcXVlc3Rpb25Db3VudDogcXVlc3Rpb25zLmxlbmd0aCB9KTsKICAgIGNvbnN0IHF1ZXN0aW9uVGV4dCA9IHF1ZXN0aW9ucy5tYXAoKHEpID0+IGAtICR7cX1gKS5qb2luKCJcbiIpOwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICBzdW1tYXJ5OiBgQWdlbnQgIiR7dGFzay5sYWJlbH0iIG5lZWRzIGh1bWFuIGlucHV0ICgke3F1ZXN0aW9ucy5sZW5ndGh9IHF1ZXN0aW9uKHMpKWAsCiAgICAgICAgZGV0YWlsOiBxdWVzdGlvblRleHQsCiAgICB9KTsKICAgIC8vIFRyeSB0byByZWNvcmQgcXVlc3Rpb25zIG9uIHRoZSBib2FyZCBpdGVtIGFzIGFuIGV4Y2hhbmdlCiAgICBjb25zdCBib2FyZCA9IGdldEJvYXJkUHJvdmlkZXIoKTsKICAgIGlmIChib2FyZD8uaXNBdmFpbGFibGUoKSkgewogICAgICAgIGNvbnN0IHN0b3JlID0gYm9hcmQuZ2V0U3RvcmU/LigpOwogICAgICAgIGlmIChzdG9yZSkgewogICAgICAgICAgICAvLyBUcnkgdG8gZmluZCB0aGUgYm9hcmQgaXRlbSB0aGlzIGFnZW50IHdhcyB3b3JraW5nIG9uCiAgICAgICAgICAgIC8vIExvb2sgdGhyb3VnaCBhbGwgYWN0aXZlIHRhc2tzIGZvciBhIG1hdGNoaW5nIGxhYmVsIG9yIHRpdGxlCiAgICAgICAgICAgIGNvbnN0IGFsbFRhc2tzID0gYXdhaXQgc3RvcmUubGlzdCgpOwogICAgICAgICAgICBjb25zdCBtYXRjaGluZ1Rhc2sgPSBhbGxUYXNrcy5maW5kKCh0KSA9PiB0YXNrLmxhYmVsLmluY2x1ZGVzKHQuaWRlbnRpZmllcikgfHwKICAgICAgICAgICAgICAgIHRhc2subGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0LnRpdGxlPy50b0xvd2VyQ2FzZSgpPy5zbGljZSgwLCAzMCkpIHx8CiAgICAgICAgICAgICAgICB0YXNrLnByb21wdC5pbmNsdWRlcyh0LmlkKSk7CiAgICAgICAgICAgIGlmIChtYXRjaGluZ1Rhc2spIHsKICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmFkZEV4Y2hhbmdlKG1hdGNoaW5nVGFzay5pZCwgewogICAgICAgICAgICAgICAgICAgIGF1dGhvcjogIkFnZW50IiwKICAgICAgICAgICAgICAgICAgICBib2R5OiBgQmxvY2tlZCDigJQgbmVlZHMgaHVtYW4gaW5wdXQ6XG4ke3F1ZXN0aW9uVGV4dH1gLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImNoYXQiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBSZWNvcmRlZCBxdWVzdGlvbnMgb24gJHttYXRjaGluZ1Rhc2suaWRlbnRpZmllcn06ICR7bWF0Y2hpbmdUYXNrLnRpdGxlfWAsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIFN1cmZhY2UgdG8gaHVtYW4gdmlhIG5vdGlmaWNhdGlvbgogICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgc291cmNlOiAiYWdlbnQiLAogICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAiJHt0YXNrLmxhYmVsfSIgbmVlZHMgeW91ciBpbnB1dDpcbiR7cXVlc3Rpb25UZXh0fWAsCiAgICB9KTsKICAgIHJldHVybiB0cnVlOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyaWFnZS5qcy5tYXA=","agents/memory.js":"LyoqCiAqIFdyaXRlcyBhZ2VudCB0YXNrIG91dGNvbWVzIHRvIGVwaXNvZGljIExUTSAoZXhwZXJpZW5jZXMuanNvbmwpLgogKiBNZW1vcnkgZW50cmllcyBhcmUgdGhlIGR1cmFibGUgY29udHJvbCBzdXJmYWNlIOKAlCBub3RpZmljYXRpb25zIGFyZSBlcGhlbWVyYWwsCiAqIGJ1dCB0aGVzZSBwZXJzaXN0IGFuZCBhcmUgcmV0cmlldmFibGUgYnkgZnV0dXJlIHR1cm5zIHZpYSBCcmFpbi5yZXRyaWV2ZSgpLgogKi8KaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IEZpbGVTeXN0ZW1Mb25nVGVybU1lbW9yeSB9IGZyb20gIi4uL21lbW9yeS9maWxlLWJhY2tlZC5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldEVuY3J5cHRpb25LZXkgfSBmcm9tICIuLi9saWIva2V5LXN0b3JlLmpzIjsKaW1wb3J0IHsgYXBwZW5kQnJhaW5MaW5lLCBlbnN1cmVCcmFpbkpzb25sIH0gZnJvbSAiLi4vbGliL2JyYWluLWlvLmpzIjsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJhZ2VudC1tZW1vcnkiKTsKY29uc3QgTUVNT1JZX0RJUiA9IGpvaW4oQlJBSU5fRElSLCAibWVtb3J5Iik7CmNvbnN0IFNDQVJTX0ZJTEUgPSBqb2luKE1FTU9SWV9ESVIsICJzY2Fycy5qc29ubCIpOwpjb25zdCBTQ0FSU19TQ0hFTUEgPSBKU09OLnN0cmluZ2lmeSh7CiAgICBfc2NoZW1hOiAic2NhciIsCiAgICBfdmVyc2lvbjogIjEuMCIsCiAgICBfZGVzY3JpcHRpb246ICJTZWxmLXJlcGFpcnMgcHJvdmVuIGJ5IGNvZGUgKyB0ZXN0cyArIHZhbGlkYXRpb24uIEFwcGVuZC1vbmx5LiIsCn0pOwpmdW5jdGlvbiBnZW5lcmF0ZVNjYXJJZCgpIHsKICAgIHJldHVybiBgc2Nhcl8ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpfWA7Cn0KLyoqIEFwcGVuZCBhIHNjYXIgcmVjb3JkIHRvIGJyYWluL21lbW9yeS9zY2Fycy5qc29ubC4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY29yZFNjYXIocmVjb3JkKSB7CiAgICBjb25zdCBmdWxsID0geyBpZDogZ2VuZXJhdGVTY2FySWQoKSwgLi4ucmVjb3JkIH07CiAgICBhd2FpdCBlbnN1cmVCcmFpbkpzb25sKFNDQVJTX0ZJTEUsIFNDQVJTX1NDSEVNQSk7CiAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUoU0NBUlNfRklMRSwgSlNPTi5zdHJpbmdpZnkoZnVsbCkpOwogICAgbG9nLmluZm8oIlNjYXIgcmVjb3JkZWQiLCB7IGlkOiBmdWxsLmlkLCBhbmNob3I6IGZ1bGwuYW5jaG9yLCBhZ2VudElkOiBmdWxsLmFnZW50SWQgfSk7CiAgICByZXR1cm4gZnVsbDsKfQovKiogTGF6eSBMVE0gZmFjdG9yeSDigJQgcGlja3MgdXAgZW5jcnlwdGlvbiBrZXkgYXQgY2FsbCB0aW1lLCBub3QgaW1wb3J0IHRpbWUuICovCmZ1bmN0aW9uIGdldEx0bSgpIHsKICAgIHJldHVybiBuZXcgRmlsZVN5c3RlbUxvbmdUZXJtTWVtb3J5KE1FTU9SWV9ESVIsIGdldEVuY3J5cHRpb25LZXkoKSA/PyB1bmRlZmluZWQpOwp9Ci8qKiBXcml0ZSBhbiBlcGlzb2RpYyBtZW1vcnkgZW50cnkgZm9yIGFuIGFnZW50IHRhc2sgb3V0Y29tZS4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbWVtYmVyVGFza091dGNvbWUodGFzaywgb3V0cHV0KSB7CiAgICBjb25zdCBvdXRwdXRTbmlwcGV0ID0gb3V0cHV0Py50cmltKCkuc2xpY2UoMCwgNTAwKSB8fCAiIjsKICAgIGNvbnN0IGxpbmVzID0gWwogICAgICAgIGBBZ2VudCB0YXNrICIke3Rhc2subGFiZWx9IiAke3Rhc2suc3RhdHVzfS5gLAogICAgICAgIHRhc2sub3JpZ2luID09PSAiYWkiID8gIlRyaWdnZXJlZCBieSBBSS4iIDogIlRyaWdnZXJlZCBieSB1c2VyLiIsCiAgICAgICAgdGFzay5leGl0Q29kZSAhPSBudWxsID8gYEV4aXQgY29kZTogJHt0YXNrLmV4aXRDb2RlfS5gIDogIiIsCiAgICAgICAgdGFzay5lcnJvciA/IGBFcnJvcjogJHt0YXNrLmVycm9yfWAgOiAiIiwKICAgICAgICBvdXRwdXRTbmlwcGV0ID8gYFJlc3VsdDogJHtvdXRwdXRTbmlwcGV0fWAgOiAiIiwKICAgIF0uZmlsdGVyKEJvb2xlYW4pOwogICAgYXdhaXQgZ2V0THRtKCkuYWRkKHsKICAgICAgICB0eXBlOiAiZXBpc29kaWMiLAogICAgICAgIGNvbnRlbnQ6IGxpbmVzLmpvaW4oIiAiKSwKICAgICAgICBtZXRhOiB7CiAgICAgICAgICAgIHNvdXJjZTogImFnZW50IiwKICAgICAgICAgICAgdGFza0lkOiB0YXNrLmlkLAogICAgICAgICAgICBzdGF0dXM6IHRhc2suc3RhdHVzLAogICAgICAgICAgICBsYWJlbDogdGFzay5sYWJlbCwKICAgICAgICAgICAgb3JpZ2luOiB0YXNrLm9yaWdpbiwKICAgICAgICAgICAgLi4uKHRhc2suZXhpdENvZGUgIT0gbnVsbCA/IHsgZXhpdENvZGU6IHRhc2suZXhpdENvZGUgfSA6IHt9KSwKICAgICAgICAgICAgLi4uKHRhc2suYm9hcmRUYXNrSWQgPyB7IGJvYXJkVGFza0lkOiB0YXNrLmJvYXJkVGFza0lkIH0gOiB7fSksCiAgICAgICAgfSwKICAgIH0pOwogICAgbG9nLmluZm8oIlRhc2sgb3V0Y29tZSByZWNvcmRlZCIsIHsgdGFza0lkOiB0YXNrLmlkLCBsYWJlbDogdGFzay5sYWJlbCwgc3RhdHVzOiB0YXNrLnN0YXR1cyB9KTsKfQovKiogV3JpdGUgYW4gZXBpc29kaWMgbWVtb3J5IGVudHJ5IHdoZW4gYSBib2FyZC9xdWV1ZSB0YXNrIHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbWVtYmVyVGFza0NvbXBsZXRpb24odGFzaywgZnJvbVN0YXRlKSB7CiAgICBjb25zdCB2ZXJiID0gdGFzay5zdGF0ZSA9PT0gImRvbmUiID8gImNvbXBsZXRlZCIgOiAiY2FuY2VsbGVkIjsKICAgIGNvbnN0IGRlc2MgPSB0YXNrLmRlc2NyaXB0aW9uPy5zbGljZSgwLCAzMDApIHx8ICIiOwogICAgLy8gQnVpbGQgcmVzb2x1dGlvbiB0cmFpbCBmcm9tIGV4Y2hhbmdlcyAoYWdlbnQgY29tbWVudHMsIGNoYXQgbm90ZXMsIGV0Yy4pCiAgICBjb25zdCByZXNvbHV0aW9uTm90ZXMgPSB0YXNrLmV4Y2hhbmdlcwogICAgICAgIC5tYXAoKGV4KSA9PiBgWyR7ZXguYXV0aG9yfV0gJHtleC5ib2R5fWApCiAgICAgICAgLmpvaW4oIiDihpIgIik7CiAgICBjb25zdCB0cmFpbCA9IHJlc29sdXRpb25Ob3RlcyA/IHJlc29sdXRpb25Ob3Rlcy5zbGljZSgwLCA2MDApIDogIiI7CiAgICBjb25zdCBsaW5lcyA9IFsKICAgICAgICBgVGFzayAke3Rhc2suaWRlbnRpZmllcn0gJHt2ZXJifTogIiR7dGFzay50aXRsZX0iLmAsCiAgICAgICAgdGFzay5wcm9qZWN0ID8gYFByb2plY3Q6ICR7dGFzay5wcm9qZWN0fS5gIDogIiIsCiAgICAgICAgYFRyYW5zaXRpb25lZCBmcm9tICR7ZnJvbVN0YXRlfS5gLAogICAgICAgIGRlc2MgPyBgRGV0YWlsczogJHtkZXNjfWAgOiAiIiwKICAgICAgICB0cmFpbCA/IGBSZXNvbHV0aW9uIHRyYWlsOiAke3RyYWlsfWAgOiAiIiwKICAgIF0uZmlsdGVyKEJvb2xlYW4pOwogICAgYXdhaXQgZ2V0THRtKCkuYWRkKHsKICAgICAgICB0eXBlOiAiZXBpc29kaWMiLAogICAgICAgIGNvbnRlbnQ6IGxpbmVzLmpvaW4oIiAiKSwKICAgICAgICBtZXRhOiB7CiAgICAgICAgICAgIHNvdXJjZTogInRhc2stYnJpZGdlIiwKICAgICAgICAgICAgdGFza0lkOiB0YXNrLmlkLAogICAgICAgICAgICBpZGVudGlmaWVyOiB0YXNrLmlkZW50aWZpZXIsCiAgICAgICAgICAgIHByb2plY3Q6IHRhc2sucHJvamVjdCB8fCAiIiwKICAgICAgICAgICAgc3RhdGU6IHRhc2suc3RhdGUsCiAgICAgICAgICAgIGZyb21TdGF0ZSwKICAgICAgICAgICAgZXhjaGFuZ2VDb3VudDogdGFzay5leGNoYW5nZXMubGVuZ3RoLAogICAgICAgICAgICAuLi4odGFzay5hZ2VudFRhc2tJZCA/IHsgYWdlbnRUYXNrSWQ6IHRhc2suYWdlbnRUYXNrSWQgfSA6IHt9KSwKICAgICAgICAgICAgLi4uKHRhc2sub3JpZ2luID8geyBvcmlnaW46IHRhc2sub3JpZ2luIH0gOiB7fSksCiAgICAgICAgfSwKICAgIH0pOwogICAgbG9nLmluZm8oIlRhc2sgY29tcGxldGlvbiByZWNvcmRlZCIsIHsgdGFza0lkOiB0YXNrLmlkLCBpZGVudGlmaWVyOiB0YXNrLmlkZW50aWZpZXIsIHN0YXRlOiB0YXNrLnN0YXRlIH0pOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9yeS5qcy5tYXA="}}