@cartanova/qgrid-cli 2.6.1 → 2.6.4

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 (81) hide show
  1. package/README.ko.md +2 -0
  2. package/README.md +2 -0
  3. package/bundle/dist/application/qgrid/oauth.js +21 -3
  4. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +40 -6
  5. package/bundle/dist/application/qgrid/qgrid.frame.js +47 -19
  6. package/bundle/dist/application/qgrid/qgrid.types.js +13 -3
  7. package/bundle/dist/application/qgrid/token-death.js +77 -0
  8. package/bundle/dist/application/queries.generated.js +3 -2
  9. package/bundle/dist/application/request-log/request-log.model.js +105 -31
  10. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  11. package/bundle/dist/application/sonamu.generated.js +60 -5
  12. package/bundle/dist/application/sonamu.generated.sso.js +18 -2
  13. package/bundle/dist/application/token/token.model.js +53 -2
  14. package/bundle/dist/i18n/en.js +3 -1
  15. package/bundle/dist/i18n/ko.js +3 -1
  16. package/bundle/dist/i18n/sd.generated.js +18 -1
  17. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +49 -0
  18. package/bundle/dist/migrations/20260807145144_alter_request_logs_alter1.js +13 -0
  19. package/bundle/dist/migrations/20260807164057_alter_request_logs_alter1.js +13 -0
  20. package/bundle/dist/server-error-handler.js +5 -3
  21. package/bundle/dist/sonamu.config.js +5 -1
  22. package/bundle/dist/utils/providers/openai/openai-refresh.js +12 -1
  23. package/bundle/dist/utils/slack-notify.js +65 -0
  24. package/bundle/src/application/qgrid/oauth.ts +20 -1
  25. package/bundle/src/application/qgrid/qgrid-oauth-redirect.test.ts +15 -3
  26. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +30 -2
  27. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +44 -6
  28. package/bundle/src/application/qgrid/qgrid.frame.ts +67 -47
  29. package/bundle/src/application/qgrid/qgrid.types.ts +10 -0
  30. package/bundle/src/application/qgrid/token-death.test.ts +150 -0
  31. package/bundle/src/application/qgrid/token-death.ts +96 -0
  32. package/bundle/src/application/queries.generated.ts +5 -2
  33. package/bundle/src/application/request-log/request-log.entity.json +46 -7
  34. package/bundle/src/application/request-log/request-log.model.test.ts +153 -42
  35. package/bundle/src/application/request-log/request-log.model.ts +136 -50
  36. package/bundle/src/application/sonamu.generated.http +19 -1
  37. package/bundle/src/application/sonamu.generated.sso.ts +16 -0
  38. package/bundle/src/application/sonamu.generated.ts +58 -3
  39. package/bundle/src/application/token/token.model.test.ts +49 -0
  40. package/bundle/src/application/token/token.model.ts +75 -0
  41. package/bundle/src/i18n/en.ts +3 -0
  42. package/bundle/src/i18n/ko.ts +3 -0
  43. package/bundle/src/i18n/sd.generated.ts +17 -0
  44. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +110 -0
  45. package/bundle/src/migrations/20260807145144_alter_request_logs_alter1.ts +13 -0
  46. package/bundle/src/migrations/20260807164057_alter_request_logs_alter1.ts +13 -0
  47. package/bundle/src/server-error-handler.test.ts +58 -0
  48. package/bundle/src/server-error-handler.ts +16 -5
  49. package/bundle/src/sonamu.config.ts +6 -0
  50. package/bundle/src/utils/providers/openai/openai-refresh.ts +17 -0
  51. package/bundle/src/utils/slack-notify.test.ts +97 -0
  52. package/bundle/src/utils/slack-notify.ts +74 -0
  53. package/bundle/web-dist/client/assets/index-BGQSGMcK.css +1 -0
  54. package/bundle/web-dist/client/assets/index-CnNT0mdq.js +78 -0
  55. package/bundle/web-dist/client/assets/logs-DCY81UWb.js +1 -0
  56. package/bundle/web-dist/client/assets/{monit-CyqMmy1G.js → monit-D5OoAday.js} +1 -1
  57. package/bundle/web-dist/client/assets/routes-B4D9C86u.js +5 -0
  58. package/bundle/web-dist/client/assets/{sd.generated-CjW3rfJ8.js → sd.generated-DYdwSB2I.js} +1 -1
  59. package/bundle/web-dist/client/assets/{services.generated-BuT6Gp8V.js → services.generated-BsAvotjG.js} +1 -1
  60. package/bundle/web-dist/client/assets/{show-C5WxfoAt.js → show-BSX8ii7Z.js} +3 -3
  61. package/bundle/web-dist/client/assets/tokens-Gapk41cz.js +1 -0
  62. package/bundle/web-dist/client/assets/{use-update-token-mutation-DBkxL29Y.js → use-update-token-mutation-DqEpK7It.js} +1 -1
  63. package/bundle/web-dist/client/index.html +3 -3
  64. package/bundle/web-dist/server/assets/{lazyRouteComponent-PRxXWW3t.js → lazyRouteComponent-BaZaveNc.js} +1 -1
  65. package/bundle/web-dist/server/assets/{logs-D0z1Ghj1.js → logs-DMOw3SjD.js} +91 -42
  66. package/bundle/web-dist/server/assets/{monit-dBXxnAyI.js → monit-UmcqHroX.js} +2 -2
  67. package/bundle/web-dist/server/assets/{routes-B3p7fuwk.js → routes-Sv_4FjtH.js} +52 -46
  68. package/bundle/web-dist/server/assets/{sd.generated-ek-tz-7H.js → sd.generated-B0xqnHEo.js} +21 -0
  69. package/bundle/web-dist/server/assets/{services.generated-BNuxWs7K.js → services.generated-DqAKskAS.js} +23 -8
  70. package/bundle/web-dist/server/assets/{show-0iNioJ2I.js → show-C-oSdzHX.js} +31 -25
  71. package/bundle/web-dist/server/assets/{tokens-CvytQ9Xy.js → tokens-h-2A3wfD.js} +292 -191
  72. package/bundle/web-dist/server/assets/{use-update-token-mutation-BBCC2GKM.js → use-update-token-mutation-DHCaa7Ku.js} +1 -1
  73. package/bundle/web-dist/server/entry-server.generated.js +70 -29
  74. package/package.json +1 -1
  75. package/skills/qgrid/references/cli-env-and-server-boot.md +8 -0
  76. package/skills/qgrid/references/token-auth-quota-lifecycle.md +11 -0
  77. package/bundle/web-dist/client/assets/index-BGGBFmzE.js +0 -78
  78. package/bundle/web-dist/client/assets/index-GA9b-zy4.css +0 -1
  79. package/bundle/web-dist/client/assets/logs-Dh19u6Tk.js +0 -1
  80. package/bundle/web-dist/client/assets/routes-Cy0gCq8c.js +0 -5
  81. package/bundle/web-dist/client/assets/tokens-Ciolqw4l.js +0 -1
package/README.ko.md CHANGED
@@ -90,6 +90,8 @@ CLI는 실행 시 npm의 최신 버전을 확인하고 patch를 포함해 설치
90
90
  | `QGRID_DB_USER` | `postgres` |
91
91
  | `QGRID_DB_PASSWORD` | `postgres` |
92
92
  | `QGRID_DB_NAME` | `qgrid` |
93
+ | `SLACK_BOT_TOKEN` | — (미설정 시 토큰 만료 알림 비활성) |
94
+ | `SLACK_CHANNEL_ID` | — |
93
95
 
94
96
  서버 동작 관련 환경변수:
95
97
 
package/README.md CHANGED
@@ -91,6 +91,8 @@ Without the `--db` flag, DB connection info is read from:
91
91
  | `QGRID_DB_USER` | `postgres` |
92
92
  | `QGRID_DB_PASSWORD` | `postgres` |
93
93
  | `QGRID_DB_NAME` | `qgrid` |
94
+ | `SLACK_BOT_TOKEN` | — (unset disables token-expiry notifications) |
95
+ | `SLACK_CHANNEL_ID` | — |
94
96
 
95
97
  Server behavior variables:
96
98
 
@@ -74,6 +74,24 @@ async function exchangeCodeForTokens(code, codeVerifier, state, redirectUri) {
74
74
  emailAddress: data.account?.email_address
75
75
  };
76
76
  }
77
+ /**
78
+ * refresh 실패를 status 와 함께 전달한다. 호출부가 문자열 메시지를 파싱하지 않고
79
+ * 영구 실패(400/401)를 판별할 수 있어야 하기 때문이다.
80
+ */
81
+ var RefreshFailedError = class extends Error {
82
+ status;
83
+ body;
84
+ name = "RefreshFailedError";
85
+ constructor(status, body) {
86
+ super(`Token refresh failed (${status}): ${body}`);
87
+ this.status = status;
88
+ this.body = body;
89
+ }
90
+ /** 재로그인 외 복구 불가한 인증 실패인지. 일시 오류(5xx·네트워크)는 제외된다. */
91
+ get isAuthDead() {
92
+ return this.status === 400 || this.status === 401;
93
+ }
94
+ };
77
95
  async function refreshAccessToken(refreshToken) {
78
96
  const res = await fetch(TOKEN_URL, {
79
97
  method: "POST",
@@ -87,7 +105,7 @@ async function refreshAccessToken(refreshToken) {
87
105
  });
88
106
  if (!res.ok) {
89
107
  const text = await res.text();
90
- throw new Error(`Token refresh failed (${res.status}): ${text}`);
108
+ throw new RefreshFailedError(res.status, text);
91
109
  }
92
110
  const data = await res.json();
93
111
  return {
@@ -137,6 +155,6 @@ async function fetchUsageWithMeta(accessToken) {
137
155
  return entry;
138
156
  }
139
157
  //#endregion
140
- export { CONSOLE_CALLBACK_URL, buildAuthUrl, exchangeCodeForTokens, fetchUsage, fetchUsageWithMeta, generatePKCE, refreshAccessToken };
158
+ export { CONSOLE_CALLBACK_URL, RefreshFailedError, buildAuthUrl, exchangeCodeForTokens, fetchUsage, fetchUsageWithMeta, generatePKCE, refreshAccessToken };
141
159
 
142
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL29hdXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT0F1dGgg7Jyg7Yu4IOKAlCBDbGF1ZGUgQ29kZSDshozsiqTsnZggT0F1dGgg7ZSM66Gc7JqwIOq3uOuMgOuhnCDsnqztmIRcbiAqL1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuZXhwb3J0IHR5cGUgQW50aHJvcGljVXNhZ2VSYXcgPSB7XG4gIGVycm9yPzogc3RyaW5nO1xuICBmaXZlX2hvdXI/OiB7IHV0aWxpemF0aW9uOiBudW1iZXIgfCBudWxsOyByZXNldHNfYXQ6IHN0cmluZyB8IG51bGwgfSB8IG51bGw7XG4gIHNldmVuX2RheT86IHsgdXRpbGl6YXRpb246IG51bWJlciB8IG51bGw7IHJlc2V0c19hdDogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbDtcbn07XG5leHBvcnQgdHlwZSBBbnRocm9waWNVc2FnZVdpdGhNZXRhID0ge1xuICBkYXRhOiBBbnRocm9waWNVc2FnZVJhdztcbiAgY2FjaGVkQXQ6IG51bWJlcjtcbn07XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY29uc3QgQ0xJRU5UX0lEID0gXCI5ZDFjMjUwYS1lNjFiLTQ0ZDktODhlZC01OTQ0ZDE5NjJmNWVcIjtcbmNvbnN0IEFVVEhPUklaRV9VUkwgPSBcImh0dHBzOi8vY2xhdWRlLmNvbS9jYWkvb2F1dGgvYXV0aG9yaXplXCI7XG5jb25zdCBUT0tFTl9VUkwgPSBcImh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS92MS9vYXV0aC90b2tlblwiO1xuLy8gY2xpZW50IO2XiOyaqSDrqqnroZ3sl5Ag7J6I64qUIOy9mOyGlCDsvZzrsLEuIOyduOymnSDtm4Qg7L2Y7IaUIO2OmOydtOyngOqwgCBgY29kZSNzdGF0ZWDrpbwg7ZGc7Iuc7ZWY6rOgXG4vLyDsgqzsmqnsnpDqsIAg67aZ7Jes64Sj64qUIOy9lOuTnCDtlIzroZzsmrAoQ2xhdWRlIENvZGUgQ0xJ7JmAIOuPmeydvCnsl5Ag7IKs7Jqp7ZWc64ukLlxuZXhwb3J0IGNvbnN0IENPTlNPTEVfQ0FMTEJBQ0tfVVJMID0gXCJodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9vYXV0aC9jb2RlL2NhbGxiYWNrXCI7XG5cbi8vIGxvZ2luIOyLnCDsgqzsmqkgKGF1dGhvcml6ZSBVUkwpXG5jb25zdCBBTExfU0NPUEVTID0gW1xuICBcIm9yZzpjcmVhdGVfYXBpX2tleVwiLFxuICBcInVzZXI6cHJvZmlsZVwiLFxuICBcInVzZXI6aW5mZXJlbmNlXCIsXG4gIFwidXNlcjpzZXNzaW9uczpjbGF1ZGVfY29kZVwiLFxuICBcInVzZXI6bWNwX3NlcnZlcnNcIixcbiAgXCJ1c2VyOmZpbGVfdXBsb2FkXCIsXG5dO1xuXG4vLyByZWZyZXNoIOyLnCDsgqzsmqkgKG9yZzpjcmVhdGVfYXBpX2tleSDsoJzsmbgpXG5jb25zdCBSRUZSRVNIX1NDT1BFUyA9IFtcbiAgXCJ1c2VyOnByb2ZpbGVcIixcbiAgXCJ1c2VyOmluZmVyZW5jZVwiLFxuICBcInVzZXI6c2Vzc2lvbnM6Y2xhdWRlX2NvZGVcIixcbiAgXCJ1c2VyOm1jcF9zZXJ2ZXJzXCIsXG4gIFwidXNlcjpmaWxlX3VwbG9hZFwiLFxuXTtcblxuZnVuY3Rpb24gYmFzZTY0VVJMRW5jb2RlKGJ1ZmZlcjogQnVmZmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKS5yZXBsYWNlKC9cXCsvZywgXCItXCIpLnJlcGxhY2UoL1xcLy9nLCBcIl9cIikucmVwbGFjZSgvPS9nLCBcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUEtDRSgpOiB7IGNvZGVWZXJpZmllcjogc3RyaW5nOyBjb2RlQ2hhbGxlbmdlOiBzdHJpbmc7IHN0YXRlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvZGVWZXJpZmllciA9IGJhc2U2NFVSTEVuY29kZShyYW5kb21CeXRlcygzMikpO1xuICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gYmFzZTY0VVJMRW5jb2RlKGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGNvZGVWZXJpZmllcikuZGlnZXN0KCkpO1xuICBjb25zdCBzdGF0ZSA9IGJhc2U2NFVSTEVuY29kZShyYW5kb21CeXRlcygzMikpO1xuICByZXR1cm4geyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF1dGhVcmwoY29kZUNoYWxsZW5nZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCByZWRpcmVjdFVyaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChBVVRIT1JJWkVfVVJMKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjb2RlXCIsIFwidHJ1ZVwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjbGllbnRfaWRcIiwgQ0xJRU5UX0lEKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJyZXNwb25zZV90eXBlXCIsIFwiY29kZVwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJyZWRpcmVjdF91cmlcIiwgcmVkaXJlY3RVcmkpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInNjb3BlXCIsIEFMTF9TQ09QRVMuam9pbihcIiBcIikpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImNvZGVfY2hhbGxlbmdlXCIsIGNvZGVDaGFsbGVuZ2UpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImNvZGVfY2hhbGxlbmdlX21ldGhvZFwiLCBcIlMyNTZcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwic3RhdGVcIiwgc3RhdGUpO1xuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCB0eXBlIE9BdXRoVG9rZW5zID0ge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIGFjY291bnRVdWlkPzogc3RyaW5nO1xuICBlbWFpbEFkZHJlc3M/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICBjb2RlOiBzdHJpbmcsXG4gIGNvZGVWZXJpZmllcjogc3RyaW5nLFxuICBzdGF0ZTogc3RyaW5nLFxuICByZWRpcmVjdFVyaTogc3RyaW5nLFxuKTogUHJvbWlzZTxPQXV0aFRva2Vucz4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChUT0tFTl9VUkwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBncmFudF90eXBlOiBcImF1dGhvcml6YXRpb25fY29kZVwiLFxuICAgICAgY29kZSxcbiAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXG4gICAgICBjbGllbnRfaWQ6IENMSUVOVF9JRCxcbiAgICAgIGNvZGVfdmVyaWZpZXI6IGNvZGVWZXJpZmllcixcbiAgICAgIHN0YXRlLFxuICAgIH0pLFxuICB9KTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRva2VuIGV4Y2hhbmdlIGZhaWxlZCAoJHtyZXMuc3RhdHVzfSk6ICR7dGV4dH1gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMge1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hfdG9rZW46IHN0cmluZztcbiAgICBleHBpcmVzX2luOiBudW1iZXI7XG4gICAgc2NvcGU6IHN0cmluZztcbiAgICBhY2NvdW50PzogeyB1dWlkOiBzdHJpbmc7IGVtYWlsX2FkZHJlc3M6IHN0cmluZyB9O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IGRhdGEuYWNjZXNzX3Rva2VuLFxuICAgIHJlZnJlc2hUb2tlbjogZGF0YS5yZWZyZXNoX3Rva2VuLFxuICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIGRhdGEuZXhwaXJlc19pbiAqIDEwMDAsXG4gICAgc2NvcGU6IGRhdGEuc2NvcGUsXG4gICAgYWNjb3VudFV1aWQ6IGRhdGEuYWNjb3VudD8udXVpZCxcbiAgICBlbWFpbEFkZHJlc3M6IGRhdGEuYWNjb3VudD8uZW1haWxfYWRkcmVzcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hBY2Nlc3NUb2tlbihyZWZyZXNoVG9rZW46IHN0cmluZyk6IFByb21pc2U8T0F1dGhUb2tlbnM+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goVE9LRU5fVVJMLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZ3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG4gICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICBjbGllbnRfaWQ6IENMSUVOVF9JRCxcbiAgICAgIHNjb3BlOiBSRUZSRVNIX1NDT1BFUy5qb2luKFwiIFwiKSxcbiAgICB9KSxcbiAgfSk7XG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUb2tlbiByZWZyZXNoIGZhaWxlZCAoJHtyZXMuc3RhdHVzfSk6ICR7dGV4dH1gKTtcbiAgfVxuICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHtcbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gICAgZXhwaXJlc19pbjogbnVtYmVyO1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sXG4gICAgcmVmcmVzaFRva2VuOiBkYXRhLnJlZnJlc2hfdG9rZW4gPz8gcmVmcmVzaFRva2VuLFxuICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIGRhdGEuZXhwaXJlc19pbiAqIDEwMDAsXG4gICAgc2NvcGU6IGRhdGEuc2NvcGUsXG4gIH07XG59XG5cbmNvbnN0IHVzYWdlQ2FjaGU6IFJlY29yZDxzdHJpbmcsIEFudGhyb3BpY1VzYWdlV2l0aE1ldGE+ID0ge307XG5jb25zdCBVU0FHRV9BUElfQ0FDSEVfVFRMID0gNjBfMDAwOyAvLyAx67aEXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBQcm9taXNlPEFudGhyb3BpY1VzYWdlUmF3PiB7XG4gIHJldHVybiAoYXdhaXQgZmV0Y2hVc2FnZVdpdGhNZXRhKGFjY2Vzc1Rva2VuKSkuZGF0YTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoVXNhZ2VXaXRoTWV0YShhY2Nlc3NUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxBbnRocm9waWNVc2FnZVdpdGhNZXRhPiB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gYWNjZXNzVG9rZW4uc2xpY2UoLTEwKTtcbiAgY29uc3QgY2FjaGVkID0gdXNhZ2VDYWNoZVtjYWNoZUtleV07XG4gIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC5jYWNoZWRBdCA8IFVTQUdFX0FQSV9DQUNIRV9UVEwpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5hbnRocm9waWMuY29tL2FwaS9vYXV0aC91c2FnZVwiLCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAsXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIFwiYW50aHJvcGljLWJldGFcIjogXCJvYXV0aC0yMDI1LTA0LTIwXCIsXG4gICAgfSxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoNTAwMCksXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuXG4gICAgLy8g7YyM7IuxIOyLnOuPhO2VtOyEnCDsl5Drn6wg66mU7Iuc7KeAIOy2lOy2nFxuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBgRXJyb3IgJHtyZXMuc3RhdHVzfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBwYXJzZWQuZXJyb3I/Lm1lc3NhZ2UgPz8gZXJyb3JNZXNzYWdlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g7YyM7IuxIOyViCDrkJjrqbQg6riw67O4IOuplOyLnOyngFxuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGAke3Jlcy5zdGF0dXN9OiAke2Vycm9yTWVzc2FnZX1gKTtcblxuICAgIC8vIOydtOyghCDshLHqs7Ug7LqQ7IucIOyeiOycvOuptCDsnKDsp4BcbiAgICBpZiAoY2FjaGVkPy5kYXRhICYmICFjYWNoZWQuZGF0YS5lcnJvcikgcmV0dXJuIGNhY2hlZDtcblxuICAgIC8vIOyLpO2MqOuPhCDsupDsi5wgKOuwmOuztSDtmLjstpwg67Cp7KeAKVxuICAgIGNvbnN0IGVycm9yUmVzdWx0ID0geyBlcnJvcjogZXJyb3JNZXNzYWdlIH07XG4gICAgY29uc3QgZW50cnkgPSB7IGRhdGE6IGVycm9yUmVzdWx0LCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9O1xuICAgIHVzYWdlQ2FjaGVbY2FjaGVLZXldID0gZW50cnk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyBBbnRocm9waWNVc2FnZVJhdztcbiAgLy8gY2FjaGUgaW52YWxpZGF0ZVxuICBjb25zdCBlbnRyeSA9IHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCkgfTtcbiAgdXNhZ2VDYWNoZVtjYWNoZUtleV0gPSBlbnRyeTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpQkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLE9BQU8sQ0FBQztBQUUzQyxNQUFNLFlBQVk7QUFDbEIsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxZQUFZO0FBR2xCLE1BQWEsdUJBQXVCO0FBR3BDLE1BQU0sYUFBYTtDQUNqQjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRjtBQUdBLE1BQU0saUJBQWlCO0NBQ3JCO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRjtBQUVBLFNBQVMsZ0JBQWdCLFFBQXdCO0NBQy9DLE9BQU8sT0FBTyxTQUFTLFFBQVEsQ0FBQyxDQUFDLFFBQVEsT0FBTyxHQUFHLENBQUMsQ0FBQyxRQUFRLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxNQUFNLEVBQUU7QUFDM0Y7QUFFQSxTQUFnQixlQUErRTtDQUM3RixNQUFNLGVBQWUsZ0JBQWdCLFlBQVksRUFBRSxDQUFDO0NBR3BELE9BQU87RUFBRTtFQUFjLGVBRkQsZ0JBQWdCLFdBQVcsUUFBUSxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBRWhFO0VBQWUsT0FEeEIsZ0JBQWdCLFlBQVksRUFBRSxDQUNOO0NBQU07QUFDOUM7QUFFQSxTQUFnQixhQUFhLGVBQXVCLE9BQWUsYUFBNkI7Q0FDOUYsTUFBTSxNQUFNLElB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
160
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL29hdXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT0F1dGgg7Jyg7Yu4IOKAlCBDbGF1ZGUgQ29kZSDshozsiqTsnZggT0F1dGgg7ZSM66Gc7JqwIOq3uOuMgOuhnCDsnqztmIRcbiAqL1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuZXhwb3J0IHR5cGUgQW50aHJvcGljVXNhZ2VSYXcgPSB7XG4gIGVycm9yPzogc3RyaW5nO1xuICBmaXZlX2hvdXI/OiB7IHV0aWxpemF0aW9uOiBudW1iZXIgfCBudWxsOyByZXNldHNfYXQ6IHN0cmluZyB8IG51bGwgfSB8IG51bGw7XG4gIHNldmVuX2RheT86IHsgdXRpbGl6YXRpb246IG51bWJlciB8IG51bGw7IHJlc2V0c19hdDogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbDtcbn07XG5leHBvcnQgdHlwZSBBbnRocm9waWNVc2FnZVdpdGhNZXRhID0ge1xuICBkYXRhOiBBbnRocm9waWNVc2FnZVJhdztcbiAgY2FjaGVkQXQ6IG51bWJlcjtcbn07XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY29uc3QgQ0xJRU5UX0lEID0gXCI5ZDFjMjUwYS1lNjFiLTQ0ZDktODhlZC01OTQ0ZDE5NjJmNWVcIjtcbmNvbnN0IEFVVEhPUklaRV9VUkwgPSBcImh0dHBzOi8vY2xhdWRlLmNvbS9jYWkvb2F1dGgvYXV0aG9yaXplXCI7XG5jb25zdCBUT0tFTl9VUkwgPSBcImh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS92MS9vYXV0aC90b2tlblwiO1xuLy8gY2xpZW50IO2XiOyaqSDrqqnroZ3sl5Ag7J6I64qUIOy9mOyGlCDsvZzrsLEuIOyduOymnSDtm4Qg7L2Y7IaUIO2OmOydtOyngOqwgCBgY29kZSNzdGF0ZWDrpbwg7ZGc7Iuc7ZWY6rOgXG4vLyDsgqzsmqnsnpDqsIAg67aZ7Jes64Sj64qUIOy9lOuTnCDtlIzroZzsmrAoQ2xhdWRlIENvZGUgQ0xJ7JmAIOuPmeydvCnsl5Ag7IKs7Jqp7ZWc64ukLlxuZXhwb3J0IGNvbnN0IENPTlNPTEVfQ0FMTEJBQ0tfVVJMID0gXCJodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9vYXV0aC9jb2RlL2NhbGxiYWNrXCI7XG5cbi8vIGxvZ2luIOyLnCDsgqzsmqkgKGF1dGhvcml6ZSBVUkwpXG5jb25zdCBBTExfU0NPUEVTID0gW1xuICBcIm9yZzpjcmVhdGVfYXBpX2tleVwiLFxuICBcInVzZXI6cHJvZmlsZVwiLFxuICBcInVzZXI6aW5mZXJlbmNlXCIsXG4gIFwidXNlcjpzZXNzaW9uczpjbGF1ZGVfY29kZVwiLFxuICBcInVzZXI6bWNwX3NlcnZlcnNcIixcbiAgXCJ1c2VyOmZpbGVfdXBsb2FkXCIsXG5dO1xuXG4vLyByZWZyZXNoIOyLnCDsgqzsmqkgKG9yZzpjcmVhdGVfYXBpX2tleSDsoJzsmbgpXG5jb25zdCBSRUZSRVNIX1NDT1BFUyA9IFtcbiAgXCJ1c2VyOnByb2ZpbGVcIixcbiAgXCJ1c2VyOmluZmVyZW5jZVwiLFxuICBcInVzZXI6c2Vzc2lvbnM6Y2xhdWRlX2NvZGVcIixcbiAgXCJ1c2VyOm1jcF9zZXJ2ZXJzXCIsXG4gIFwidXNlcjpmaWxlX3VwbG9hZFwiLFxuXTtcblxuZnVuY3Rpb24gYmFzZTY0VVJMRW5jb2RlKGJ1ZmZlcjogQnVmZmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKS5yZXBsYWNlKC9cXCsvZywgXCItXCIpLnJlcGxhY2UoL1xcLy9nLCBcIl9cIikucmVwbGFjZSgvPS9nLCBcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUEtDRSgpOiB7IGNvZGVWZXJpZmllcjogc3RyaW5nOyBjb2RlQ2hhbGxlbmdlOiBzdHJpbmc7IHN0YXRlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvZGVWZXJpZmllciA9IGJhc2U2NFVSTEVuY29kZShyYW5kb21CeXRlcygzMikpO1xuICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gYmFzZTY0VVJMRW5jb2RlKGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGNvZGVWZXJpZmllcikuZGlnZXN0KCkpO1xuICBjb25zdCBzdGF0ZSA9IGJhc2U2NFVSTEVuY29kZShyYW5kb21CeXRlcygzMikpO1xuICByZXR1cm4geyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF1dGhVcmwoY29kZUNoYWxsZW5nZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCByZWRpcmVjdFVyaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChBVVRIT1JJWkVfVVJMKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjb2RlXCIsIFwidHJ1ZVwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjbGllbnRfaWRcIiwgQ0xJRU5UX0lEKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJyZXNwb25zZV90eXBlXCIsIFwiY29kZVwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJyZWRpcmVjdF91cmlcIiwgcmVkaXJlY3RVcmkpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInNjb3BlXCIsIEFMTF9TQ09QRVMuam9pbihcIiBcIikpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImNvZGVfY2hhbGxlbmdlXCIsIGNvZGVDaGFsbGVuZ2UpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImNvZGVfY2hhbGxlbmdlX21ldGhvZFwiLCBcIlMyNTZcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwic3RhdGVcIiwgc3RhdGUpO1xuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCB0eXBlIE9BdXRoVG9rZW5zID0ge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIGFjY291bnRVdWlkPzogc3RyaW5nO1xuICBlbWFpbEFkZHJlc3M/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICBjb2RlOiBzdHJpbmcsXG4gIGNvZGVWZXJpZmllcjogc3RyaW5nLFxuICBzdGF0ZTogc3RyaW5nLFxuICByZWRpcmVjdFVyaTogc3RyaW5nLFxuKTogUHJvbWlzZTxPQXV0aFRva2Vucz4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChUT0tFTl9VUkwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBncmFudF90eXBlOiBcImF1dGhvcml6YXRpb25fY29kZVwiLFxuICAgICAgY29kZSxcbiAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXG4gICAgICBjbGllbnRfaWQ6IENMSUVOVF9JRCxcbiAgICAgIGNvZGVfdmVyaWZpZXI6IGNvZGVWZXJpZmllcixcbiAgICAgIHN0YXRlLFxuICAgIH0pLFxuICB9KTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRva2VuIGV4Y2hhbmdlIGZhaWxlZCAoJHtyZXMuc3RhdHVzfSk6ICR7dGV4dH1gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMge1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hfdG9rZW46IHN0cmluZztcbiAgICBleHBpcmVzX2luOiBudW1iZXI7XG4gICAgc2NvcGU6IHN0cmluZztcbiAgICBhY2NvdW50PzogeyB1dWlkOiBzdHJpbmc7IGVtYWlsX2FkZHJlc3M6IHN0cmluZyB9O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IGRhdGEuYWNjZXNzX3Rva2VuLFxuICAgIHJlZnJlc2hUb2tlbjogZGF0YS5yZWZyZXNoX3Rva2VuLFxuICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIGRhdGEuZXhwaXJlc19pbiAqIDEwMDAsXG4gICAgc2NvcGU6IGRhdGEuc2NvcGUsXG4gICAgYWNjb3VudFV1aWQ6IGRhdGEuYWNjb3VudD8udXVpZCxcbiAgICBlbWFpbEFkZHJlc3M6IGRhdGEuYWNjb3VudD8uZW1haWxfYWRkcmVzcyxcbiAgfTtcbn1cblxuLyoqXG4gKiByZWZyZXNoIOyLpO2MqOulvCBzdGF0dXMg7JmAIO2VqOq7mCDsoITri6ztlZzri6QuIO2YuOy2nOu2gOqwgCDrrLjsnpDsl7Qg66mU7Iuc7KeA66W8IO2MjOyLse2VmOyngCDslYrqs6BcbiAqIOyYgeq1rCDsi6TtjKgoNDAwLzQwMSnrpbwg7YyQ67OE7ZWgIOyImCDsnojslrTslbwg7ZWY6riwIOuVjOusuOydtOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZnJlc2hGYWlsZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZSA9IFwiUmVmcmVzaEZhaWxlZEVycm9yXCI7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGJvZHk6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoYFRva2VuIHJlZnJlc2ggZmFpbGVkICgke3N0YXR1c30pOiAke2JvZHl9YCk7XG4gIH1cblxuICAvKiog7J6s66Gc6re47J24IOyZuCDrs7Xqtawg67aI6rCA7ZWcIOyduOymnSDsi6TtjKjsnbjsp4AuIOydvOyLnCDsmKTrpZgoNXh4wrfrhKTtirjsm4ztgawp64qUIOygnOyZuOuQnOuLpC4gKi9cbiAgZ2V0IGlzQXV0aERlYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSA0MDAgfHwgdGhpcy5zdGF0dXMgPT09IDQwMTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEFjY2Vzc1Rva2VuKHJlZnJlc2hUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFRva2Vucz4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChUT0tFTl9VUkwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBncmFudF90eXBlOiBcInJlZnJlc2hfdG9rZW5cIixcbiAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICAgIGNsaWVudF9pZDogQ0xJRU5UX0lELFxuICAgICAgc2NvcGU6IFJFRlJFU0hfU0NPUEVTLmpvaW4oXCIgXCIpLFxuICAgIH0pLFxuICB9KTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICB0aHJvdyBuZXcgUmVmcmVzaEZhaWxlZEVycm9yKHJlcy5zdGF0dXMsIHRleHQpO1xuICB9XG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMge1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hfdG9rZW46IHN0cmluZztcbiAgICBleHBpcmVzX2luOiBudW1iZXI7XG4gICAgc2NvcGU6IHN0cmluZztcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IGRhdGEucmVmcmVzaF90b2tlbiA/PyByZWZyZXNoVG9rZW4sXG4gICAgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgZGF0YS5leHBpcmVzX2luICogMTAwMCxcbiAgICBzY29wZTogZGF0YS5zY29wZSxcbiAgfTtcbn1cblxuY29uc3QgdXNhZ2VDYWNoZTogUmVjb3JkPHN0cmluZywgQW50aHJvcGljVXNhZ2VXaXRoTWV0YT4gPSB7fTtcbmNvbnN0IFVTQUdFX0FQSV9DQUNIRV9UVEwgPSA2MF8wMDA7IC8vIDHrtoRcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoVXNhZ2UoYWNjZXNzVG9rZW46IHN0cmluZyk6IFByb21pc2U8QW50aHJvcGljVXNhZ2VSYXc+IHtcbiAgcmV0dXJuIChhd2FpdCBmZXRjaFVzYWdlV2l0aE1ldGEoYWNjZXNzVG9rZW4pKS5kYXRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hVc2FnZVdpdGhNZXRhKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBQcm9taXNlPEFudGhyb3BpY1VzYWdlV2l0aE1ldGE+IHtcbiAgY29uc3QgY2FjaGVLZXkgPSBhY2Nlc3NUb2tlbi5zbGljZSgtMTApO1xuICBjb25zdCBjYWNoZWQgPSB1c2FnZUNhY2hlW2NhY2hlS2V5XTtcbiAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLmNhY2hlZEF0IDwgVVNBR0VfQVBJX0NBQ0hFX1RUTCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vYXBpL29hdXRoL3VzYWdlXCIsIHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgXCJhbnRocm9waWMtYmV0YVwiOiBcIm9hdXRoLTIwMjUtMDQtMjBcIixcbiAgICB9LFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCg1MDAwKSxcbiAgfSk7XG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG5cbiAgICAvLyDtjIzsi7Eg7Iuc64+E7ZW07IScIOyXkOufrCDrqZTsi5zsp4Ag7LaU7LacXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IGBFcnJvciAke3Jlcy5zdGF0dXN9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIGVycm9yTWVzc2FnZSA9IHBhcnNlZC5lcnJvcj8ubWVzc2FnZSA/PyBlcnJvck1lc3NhZ2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDtjIzsi7Eg7JWIIOuQmOuptCDquLDrs7gg66mU7Iuc7KeAXG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYCR7cmVzLnN0YXR1c306ICR7ZXJyb3JNZXNzYWdlfWApO1xuXG4gICAgLy8g7J207KCEIOyEseqztSDsupDsi5wg7J6I7Jy866m0IOycoOyngFxuICAgIGlmIChjYWNoZWQ/LmRhdGEgJiYgIWNhY2hlZC5kYXRhLmVycm9yKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgLy8g7Iuk7Yyo64+EIOy6kOyLnCAo67CY67O1IO2YuOy2nCDrsKnsp4ApXG4gICAgY29uc3QgZXJyb3JSZXN1bHQgPSB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfTtcbiAgICBjb25zdCBlbnRyeSA9IHsgZGF0YTogZXJyb3JSZXN1bHQsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH07XG4gICAgdXNhZ2VDYWNoZVtjYWNoZUtleV0gPSBlbnRyeTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIEFudGhyb3BpY1VzYWdlUmF3O1xuICAvLyBjYWNoZSBpbnZhbGlkYXRlXG4gIGNvbnN0IGVudHJ5ID0geyBkYXRhLCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9O1xuICB1c2FnZUNhY2hl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
@@ -1,18 +1,52 @@
1
+ import { SD } from "../../i18n/sd.generated.js";
1
2
  import { getAccessToken } from "../../utils/providers/common/credentials.js";
2
3
  import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
3
4
  import { parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema } from "../../utils/providers/common/schema-validation.js";
4
5
  import { strictify } from "../../utils/providers/common/strictifier.js";
5
6
  import { decideConvRouting, issueConvContext } from "./conv-routing.js";
6
- import { ProcessError, QuotaError, maskToken } from "./qgrid.types.js";
7
+ import { ProcessError, maskToken } from "./qgrid.types.js";
7
8
  import { applyToolCallEmulation } from "./tool-emulation.js";
8
9
  import { buildToolCallSchema } from "./tool-emulation-schema.js";
10
+ import { InternalServerErrorException, ServiceUnavailableException } from "sonamu";
9
11
  //#region src/application/qgrid/qgrid.dispatcher.ts
12
+ /**
13
+ * QgridDispatcher — provider dispatcher 라우팅 + 토큰 캐시/통계 싱글턴.
14
+ *
15
+ * - 메모리 캐시 (Map<id, TokenSubsetA>) 는 TokenSubscriber 가 pg LISTEN/NOTIFY 로 갱신
16
+ * - OpenAI/Anthropic 요청은 각 provider dispatcher 로만 실행
17
+ * - QuotaError 는 그대로 상위 전파
18
+ * - dispatcher 미준비는 기동 중(503)/초기화 실패(500)로 구분해 던진다
19
+ */
10
20
  var QgridDispatcherClass = class {
11
21
  tokens = /* @__PURE__ */ new Map();
12
22
  requestCounts = /* @__PURE__ */ new Map();
13
23
  subscriber = null;
14
24
  openaiDispatcher = null;
15
25
  anthropicDispatcher = null;
26
+ /**
27
+ * provider 별 기동 상태. dispatcher 가 없는 이유를 구분하기 위해 필요하다 —
28
+ * HTTP 리스닝은 dispatcher 준비보다 먼저 열리므로(sonamu.config onStart),
29
+ * 그 사이 들어온 요청은 "잠시 후 되는" 상태와 "재시도해도 안 되는" 상태가 다르다.
30
+ *
31
+ * - `starting`: 워커 spawn 중. dev0 기준 25 워커 × 500ms 간격이라 1~2분 걸린다 → 재시도 가능
32
+ * - `ready`: 정상
33
+ * - `failed`: start() 가 예외로 끝남 → 재시도해도 같은 결과
34
+ */
35
+ startupState = {
36
+ openai: "starting",
37
+ anthropic: "starting"
38
+ };
39
+ /**
40
+ * dispatcher 가 준비되지 않았을 때 던질 예외를 만든다.
41
+ *
42
+ * 기동 중이면 503(+Retry-After) 으로 재시도 가능함을 알리고, 초기화가 실패로 끝났으면
43
+ * 500 으로 재시도가 무의미함을 알린다. 이전에는 둘 다 QuotaError 였는데, 쿼터 소진이
44
+ * 아닌 상태를 그렇게 표현하면 호출자가 토큰 문제로 오해하고 재시도 판단도 못 한다.
45
+ */
46
+ notReadyError(provider) {
47
+ const label = provider === "openai" ? "OpenAI" : "Anthropic";
48
+ return this.startupState[provider] === "failed" ? new InternalServerErrorException(SD("qgrid.dispatcherFailed")(label)) : new ServiceUnavailableException(SD("qgrid.dispatcherStarting")(label));
49
+ }
16
50
  countOf(name) {
17
51
  return this.requestCounts.get(name) ?? 0;
18
52
  }
@@ -38,7 +72,7 @@ var QgridDispatcherClass = class {
38
72
  const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
39
73
  const answerKind = input.jsonSchema ? "json" : "text";
40
74
  if (route.provider === "openai") {
41
- if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
75
+ if (!this.openaiDispatcher) throw this.notReadyError("openai");
42
76
  const decision = decideConvRouting(input);
43
77
  const result = await this.openaiDispatcher.generate({
44
78
  model: route.model,
@@ -63,7 +97,7 @@ var QgridDispatcherClass = class {
63
97
  answerKind
64
98
  });
65
99
  } else if (route.provider === "anthropic") {
66
- if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
100
+ if (!this.anthropicDispatcher) throw this.notReadyError("anthropic");
67
101
  const decision = decideConvRouting(input);
68
102
  const result = await this.anthropicDispatcher.generate({
69
103
  model: input.model,
@@ -89,7 +123,7 @@ var QgridDispatcherClass = class {
89
123
  const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
90
124
  const answerKind = input.jsonSchema ? "json" : "text";
91
125
  if (route.provider === "openai") {
92
- if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
126
+ if (!this.openaiDispatcher) throw this.notReadyError("openai");
93
127
  const decision = decideConvRouting(input);
94
128
  await this.openaiDispatcher.generateStream({
95
129
  model: route.model,
@@ -120,7 +154,7 @@ var QgridDispatcherClass = class {
120
154
  });
121
155
  return;
122
156
  } else if (route.provider === "anthropic") {
123
- if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
157
+ if (!this.anthropicDispatcher) throw this.notReadyError("anthropic");
124
158
  const decision = decideConvRouting(input);
125
159
  await this.anthropicDispatcher.generateStream({
126
160
  model: input.model,
@@ -208,4 +242,4 @@ const QgridDispatcher = new QgridDispatcherClass();
208
242
  //#endregion
209
243
  export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema };
210
244
 
211
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzLFxuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFF1ZXJ5T3V0cHV0LCB0eXBlIFRva2VuU3RhdHMgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgbWFza1Rva2VuLCBQcm9jZXNzRXJyb3IsIFF1b3RhRXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyBUb2tlblN0YXRzIHNoYXBlIOuztOyhtOyaqS4g7Iuk7KCcIHByb3ZpZGVyIOyalOyyrSDsubTsmrTtjIXsnYAg6rCBIGRpc3BhdGNoZXIg66GcIOydtOuPme2WiOuLpC5cbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBjb3VudE9mKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmNvdW50T2Yoci5uYW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIC8vIGFuc3dlciDsnbjsvZTrlKkg7YyQ7KCVOiBqc29uU2NoZW1hIOyeiOycvOuptCDsgqzsmqnsnpAg7Iqk7YKk66eIIEpTT04sIOyXhuycvOuptCDtj4nrrLggc3RyaW5nLiA06rCcIOuwqey2nCDsp4DsoJDsnbQg6rO17JygLlxuICAgIGNvbnN0IGFuc3dlcktpbmQgPSBpbnB1dC5qc29uU2NoZW1hID8gKFwianNvblwiIGFzIGNvbnN0KSA6IChcInRleHRcIiBhcyBjb25zdCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogY29vcmQsXG4gICAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFudGhyb3BpYyBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyBhbnN3ZXIg7J247L2U65SpIO2MkOyglToganNvblNjaGVtYSDsnojsnLzrqbQg7IKs7Jqp7J6QIOyKpO2CpOuniCBKU09OLCDsl4bsnLzrqbQg7Y+J66y4IHN0cmluZy4gNOqwnCDrsKnstpwg7KeA7KCQ7J20IOqzteycoC5cbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgLy8g7J2066+47KeAIO2UjOuemOq3uOulvCDsoITri6ztlbTslbwgZ2VuZXJhdGVTdHJlYW0g7J2YIG5vbi1zdHJlYW0g7KCE7JqpIOqxsOu2gChSMinqsIAg67Cc64+Z7ZWc64ukLlxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25UdXJuSWQ6IGNiLm9uVHVybklkLFxuICAgICAgICAgIG9uQ29tcGxldGU6ICh0dXJuUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZWRDb29yZCxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3ZpZGVyUm91dGUobW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcHJvdmlkZXI/OiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgaWYgKCFwcm92aWRlciB8fCAhcm91dGVkTW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICByZXR1cm4geyBwcm92aWRlciwgbW9kZWw6IHJvdXRlZE1vZGVsIH07XG59XG5cbi8vIHFncmlkIHByb3ZpZGVyIGRpc3BhdGNoZXIg7JeQ7IScIOyymOumrO2VmOyngCDslYrripQg66qo64247J2AIO2Wpe2bhCDsp4HsoJEgTExNIEFQSSDtmLjstpwg7KeA7KCQ7Jy866GcIOuztOuCuOuLpC5cbmZ1bmN0aW9uIGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBQcm9jZXNzRXJyb3Ige1xuICByZXR1cm4gbmV3IFByb2Nlc3NFcnJvcihcbiAgICBgRGlyZWN0IExMTSBBUEkgZmFsbGJhY2sgbm90IGltcGxlbWVudGVkIGZvciBtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBcIjxkZWZhdWx0PlwifWAsXG4gICk7XG59XG5cbi8vIOuqqOuToCBwcm92aWRlcihPcGVuQUkvQW50aHJvcGljKeqwgCDrj5nsnbztlZjqsowgc3RyaWN0IG91dHB1dCBzY2hlbWEg66W8IOyTtOuLpC5cbi8vXG4vLyBTT04tNDk1IOq1kO2biDog7ZWc65WMIEFudGhyb3BpYyByb3V0ZSDrp4wgcmVxdWlyZWQg66W8IOygnOqxsChvcHRpb25hbGl6ZSntlbQgcGFydGlhbC9yZWplY3RlZCBhdHRlbXB0IOqwgFxuLy8g7ISe7Jes64+EIO2GteqzvO2VmOqyjCDtlojsnLzrgpgsIOyLpOy4oSDqsrDqs7wg6re46rKMIOyYpO2eiOugpCBcIuuqqOuNuOydtCDruYTripQg7ZWE65Oc66W8IO2CpOynuCDsg53rnrVcIu2VmOuPhOuhnSDsnKDrj4Ttlojri6Rcbi8vIChyZXF1aXJlZCDsgrTrprAgc2NoZW1hIOuKlCDriITrnb0gMCwgbG9vc2Ug64qUIOuIhOudvSDri6TrsJwpLiBzdHJpY3Qg66GcIOuRkOuptCDrqqjrjbjsnbQg67mg7KeQ7JeG7J20IOyxhOyasOqzoCxcbi8vIOuTnOusvOqyjCDslrTqsqggcHJvdmlkZXIgcmV0cnkg7JiI7IKw7J2EIOyGjOynhO2VnCDruYTsoJXsg4Eg7KKF66OM64+EIOygleynge2VnCDsl5Drn6zroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhd091dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FsbGVyT3V0cHV0U2NoZW1hID0gcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuXG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzLCBjYWxsZXJPdXRwdXRTY2hlbWEpXG4gICAgOiBjYWxsZXJPdXRwdXRTY2hlbWE7XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgcHJvdmlkZXIg6rCAIOykgCDqsJLsnYQg7Jqw7ISgIOyCrOyaqe2VmOqzoCwg7JeG7Jy866m0IOqzte2GtSBjb3N0IO2VqOyImOulvCDsk7Tri6QuXG5mdW5jdGlvbiB0b0VtdWxhdGlvblJlc3VsdChcbiAgcmVzdWx0OiBHZW5lcmF0ZVJlc3VsdCxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIGNvbnN0IGhhc1Byb3ZpZGVyQ29zdCA9IHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwO1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHJlcXVlc3RlZE1vZGVsOiByZXN1bHQucmVxdWVzdGVkTW9kZWwsXG4gICAgbW9kZWxGYWxsYmFja3M6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcyxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gXCJwcm92aWRlclwiIDogXCJwcmljaW5nX3RhYmxlXCIsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBOEJBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELFFBQVEsTUFBc0I7RUFDNUIsT0FBTyxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUs7Q0FDekM7Q0FHQSxZQUFZLElBQVksS0FBeUI7RUFDL0MsS0FBSyxPQUFPLElBQUksSUFBSSxHQUFHO0NBQ3pCO0NBRUEsWUFBWSxJQUFrQjtFQUM1QixLQUFLLE9BQU8sT0FBTyxFQUFFO0NBQ3ZCO0NBRUEsYUFBYSxNQUE0QjtFQUN2QyxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ2xEO0NBRUEsV0FBeUI7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
245
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKiAtIGRpc3BhdGNoZXIg66+47KSA67mE64qUIOq4sOuPmSDspJEoNTAzKS/stIjquLDtmZQg7Iuk7YyoKDUwMCnroZwg6rWs67aE7ZW0IOuNmOynhOuLpFxuICovXG5cbmltcG9ydCB7IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7XG4gIG1hc2tUb2tlbixcbiAgUHJvY2Vzc0Vycm9yLFxuICB0eXBlIFByb3ZpZGVyU3RhcnR1cFN0YXRlLFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHByb3ZpZGVyIOuzhCDquLDrj5kg7IOB7YOcLiBkaXNwYXRjaGVyIOqwgCDsl4bripQg7J207Jyg66W8IOq1rOu2hO2VmOq4sCDsnITtlbQg7ZWE7JqU7ZWY64ukIOKAlFxuICAgKiBIVFRQIOumrOyKpOuLneydgCBkaXNwYXRjaGVyIOykgOu5hOuztOuLpCDrqLzsoIAg7Je066as66+A66GcKHNvbmFtdS5jb25maWcgb25TdGFydCksXG4gICAqIOq3uCDsgqzsnbQg65Ok7Ja07JioIOyalOyyreydgCBcIuyeoOyLnCDtm4Qg65CY64qUXCIg7IOB7YOc7JmAIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripRcIiDsg4Htg5zqsIAg64uk66W064ukLlxuICAgKlxuICAgKiAtIGBzdGFydGluZ2A6IOybjOy7pCBzcGF3biDspJEuIGRldjAg6riw7KSAIDI1IOybjOy7pCDDlyA1MDBtcyDqsITqsqnsnbTrnbwgMX4y67aEIOqxuOumsOuLpCDihpIg7J6s7Iuc64+EIOqwgOuKpVxuICAgKiAtIGByZWFkeWA6IOygleyDgVxuICAgKiAtIGBmYWlsZWRgOiBzdGFydCgpIOqwgCDsmIjsmbjroZwg64Gd64KoIOKGkiDsnqzsi5zrj4TtlbTrj4Qg6rCZ7J2AIOqysOqzvFxuICAgKi9cbiAgc3RhcnR1cFN0YXRlOiBSZWNvcmQ8XCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPiA9IHtcbiAgICBvcGVuYWk6IFwic3RhcnRpbmdcIixcbiAgICBhbnRocm9waWM6IFwic3RhcnRpbmdcIixcbiAgfTtcblxuICAvKipcbiAgICogZGlzcGF0Y2hlciDqsIAg7KSA67mE65CY7KeAIOyViuyVmOydhCDrlYwg642Y7KeIIOyYiOyZuOulvCDrp4zrk6Dri6QuXG4gICAqXG4gICAqIOq4sOuPmSDspJHsnbTrqbQgNTAzKCtSZXRyeS1BZnRlcikg7Jy866GcIOyerOyLnOuPhCDqsIDriqXtlajsnYQg7JWM66as6rOgLCDstIjquLDtmZTqsIAg7Iuk7Yyo66GcIOuBneuCrOycvOuptFxuICAgKiA1MDAg7Jy866GcIOyerOyLnOuPhOqwgCDrrLTsnZjrr7jtlajsnYQg7JWM66aw64ukLiDsnbTsoITsl5DripQg65GYIOuLpCBRdW90YUVycm9yIOyYgOuKlOuNsCwg7L+87YSwIOyGjOynhOydtFxuICAgKiDslYTri4wg7IOB7YOc66W8IOq3uOugh+qyjCDtkZztmITtlZjrqbQg7Zi47Lac7J6Q6rCAIO2GoO2BsCDrrLjsoJzroZwg7Jik7ZW07ZWY6rOgIOyerOyLnOuPhCDtjJDri6jrj4Qg66q7IO2VnOuLpC5cbiAgICovXG4gIHByaXZhdGUgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyBhbnN3ZXIg7J247L2U65SpIO2MkOyglToganNvblNjaGVtYSDsnojsnLzrqbQg7IKs7Jqp7J6QIOyKpO2CpOuniCBKU09OLCDsl4bsnLzrqbQg7Y+J66y4IHN0cmluZy4gNOqwnCDrsKnstpwg7KeA7KCQ7J20IOqzteycoC5cbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgLy8gcHJvdmlkZXIgcHJlZml4IHJvdXRpbmc6ICdvcGVuYWkvZ3B0LTUuNCcg4oaSIE9wZW5BSURpc3BhdGNoZXJcbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJvcGVuYWlcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgLy8g7J2066+47KeAIOyalOyyreydgCBjb2xkLW9ubHkoUjgp6528IOyerOyCrOyaqSDsooztkZzrpbwg67Cc6riJ7ZWY7KeAIOyViuuKlOuLpC4g7KKM7ZGc66W8IOyLpOycvOuptFxuICAgICAgLy8gc2Vzc2lvbktleSDshozruYTsnpDsnZggd2FybSDsooztkZzrpbwg7KO97J2AIOyijO2RnOuhnCDrja7slrTsjagg64uk7J2MIO2FjeyKpO2KuCB0dXJuIOydtCBjb2xkIOuhnCDrlqjslrTsp4Tri6QuXG4gICAgICBjb25zdCBjb29yZCA9IGlucHV0LmltYWdlR2VuZXJhdGlvblxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgIHRocmVhZENvb3JkOiBjb29yZCxcbiAgICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyBhbnN3ZXIg7J247L2U65SpIO2MkOyglToganNvblNjaGVtYSDsnojsnLzrqbQg7IKs7Jqp7J6QIOyKpO2CpOuniCBKU09OLCDsl4bsnLzrqbQg7Y+J66y4IHN0cmluZy4gNOqwnCDrsKnstpwg7KeA7KCQ7J20IOqzteycoC5cbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwib3BlbmFpXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIC8vIOydtOuvuOyngCDtlIzrnpjqt7jrpbwg7KCE64us7ZW07JW8IGdlbmVyYXRlU3RyZWFtIOydmCBub24tc3RyZWFtIOyghOyaqSDqsbDrtoAoUjIp6rCAIOuwnOuPme2VnOuLpC5cbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICAgICAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgICAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlZENvb3JkLFxuICAgICAgICAgICAgICAgIGFuc3dlcktpbmQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBwcm92aWRlcj86IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9IHtcbiAgaWYgKCFtb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsID8/IFwiXCIgfTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgcm91dGVkTW9kZWxdID0gbW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlbDogcm91dGVkTW9kZWwgfTtcbn1cblxuLy8gcWdyaWQgcHJvdmlkZXIgZGlzcGF0Y2hlciDsl5DshJwg7LKY66as7ZWY7KeAIOyViuuKlCDrqqjrjbjsnYAg7Zal7ZuEIOyngeygkSBMTE0gQVBJIO2YuOy2nCDsp4DsoJDsnLzroZwg67O064K464ukLlxuZnVuY3Rpb24gZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dDogUXVlcnlJbnB1dCk6IFByb2Nlc3NFcnJvciB7XG4gIHJldHVybiBuZXcgUHJvY2Vzc0Vycm9yKFxuICAgIGBEaXJlY3QgTExNIEFQSSBmYWxsYmFjayBub3QgaW1wbGVtZW50ZWQgZm9yIG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IFwiPGRlZmF1bHQ+XCJ9YCxcbiAgKTtcbn1cblxuLy8g66qo65OgIHByb3ZpZGVyKE9wZW5BSS9BbnRocm9waWMp6rCAIOuPmeydvO2VmOqyjCBzdHJpY3Qgb3V0cHV0IHNjaGVtYSDrpbwg7JO064ukLlxuLy9cbi8vIFNPTi00OTUg6rWQ7ZuIOiDtlZzrlYwgQW50aHJvcGljIHJvdXRlIOunjCByZXF1aXJlZCDrpbwg7KCc6rGwKG9wdGlvbmFsaXplKe2VtCBwYXJ0aWFsL3JlamVjdGVkIGF0dGVtcHQg6rCAXG4vLyDshJ7sl6zrj4Qg7Ya16rO87ZWY6rKMIO2WiOycvOuCmCwg7Iuk7LihIOqysOqzvCDqt7jqsowg7Jik7Z6I66CkIFwi66qo64247J20IOu5hOuKlCDtlYTrk5zrpbwg7YKk7Ke4IOyDneuetVwi7ZWY64+E66GdIOycoOuPhO2WiOuLpFxuLy8gKHJlcXVpcmVkIOyCtOumsCBzY2hlbWEg64qUIOuIhOudvSAwLCBsb29zZSDripQg64iE6529IOuLpOuwnCkuIHN0cmljdCDroZwg65GQ66m0IOuqqOuNuOydtCDruaDsp5Dsl4bsnbQg7LGE7Jqw6rOgLFxuLy8g65Oc66y86rKMIOyWtOqyqCBwcm92aWRlciByZXRyeSDsmIjsgrDsnYQg7IaM7KeE7ZWcIOu5hOygleyDgSDsooXro4zrj4Qg7KCV7KeB7ZWcIOyXkOufrOuhnCDrsJvslYTspIDri6QuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbiAgcHJvdmlkZXI/OiBzdHJpbmcsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFJhd091dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSwgeyBwcm92aWRlciB9KSBhcyBKc29uVmFsdWUpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcIm1vZGVsXCIgfCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKS5wcm92aWRlcixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCBwcm92aWRlcik7XG4gIHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEob3V0cHV0U2NoZW1hLCBwcm92aWRlcik7XG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWxsZXJPdXRwdXRTY2hlbWEgPSBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG5cbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMsIGNhbGxlck91dHB1dFNjaGVtYSlcbiAgICA6IGNhbGxlck91dHB1dFNjaGVtYTtcbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBwcm92aWRlciDqsIAg7KSAIOqwkuydhCDsmrDshKAg7IKs7Jqp7ZWY6rOgLCDsl4bsnLzrqbQg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID0gcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDA7XG4gIHJldHVybiB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdE1zOiByZXN1bHQudHRmdE1zID8/IDAsXG4gICAgY29zdFVzZDogaGFzUHJvdmlkZXJDb3N0XG4gICAgICA/IHJlc3VsdC5jb3N0VXNkIVxuICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSxcbiAgICBjb3N0U291cmNlOiBoYXNQcm92aWRlckNvc3QgPyBcInByb3ZpZGVyXCIgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0NBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEOzs7Ozs7Ozs7O0NBV2xELGVBQXFFO0VBQ25FLFFBQVE7RUFDUixXQUFXO0NBQ2I7Ozs7Ozs7O0NBU0EsY0FBc0IsVUFBeUM7RUFDN0QsTUFBTSxRQUFRLGFBQWEsV0FBVyxXQUFXO0VBQ2pELE9BQU8sS0FBSyxhQUFhLGNBQWMsV0FDbkMsSUFBSSw2QkFBNkIsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUNwRSxJQUFJLDRCQUE0QixHQUFHLDBCQUEwQixDQUFDLENBQUMsS0FBSyxDQUFDO0NBQzNFO0NBRUEsUUFBUSxNQUFzQjtFQUM1QixPQUFPLEtBQUssY0FBYyxJQUFJLElBQUksS0FBSztDQUN6QztDQUdBLFlBQVksSUFBWSxLQUF5QjtFQUMvQyxLQUFLLE9BQU8sSUFBSSxJQUFJLEdBQUc7Q0FDekI7Q0FFQSxZQUFZLElBQWtCO0VBQzVCLEtBQUssT0FBTyxPQUFPLEVBQUU7Q0FD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