@cartanova/qgrid-cli 2.10.2 → 2.10.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 (118) hide show
  1. package/bundle/dist/application/monit/log-buffer.js +7 -11
  2. package/bundle/dist/application/monit/monit.frame.js +6 -11
  3. package/bundle/dist/application/qgrid/oauth.js +2 -2
  4. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +64 -141
  5. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -36
  6. package/bundle/dist/application/qgrid/qgrid.frame.js +3 -6
  7. package/bundle/dist/application/qgrid/qgrid.types.js +2 -1
  8. package/bundle/dist/application/qgrid/token-subscriber.js +4 -7
  9. package/bundle/dist/application/qgrid/token-window-keepalive.js +3 -2
  10. package/bundle/dist/application/qgrid/tool-emulation-schema.js +4 -4
  11. package/bundle/dist/application/qgrid/tool-emulation.js +14 -2
  12. package/bundle/dist/application/request-log/request-log.model.js +7 -5
  13. package/bundle/dist/application/setting/setting.model.js +2 -64
  14. package/bundle/dist/application/setting/setting.store.js +3 -4
  15. package/bundle/dist/application/setting/setting.types.js +2 -12
  16. package/bundle/dist/i18n/en.js +1 -3
  17. package/bundle/dist/i18n/ko.js +1 -3
  18. package/bundle/dist/sonamu.config.js +6 -6
  19. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  20. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +53 -84
  21. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +55 -0
  22. package/bundle/dist/utils/providers/anthropic/claude-session.js +11 -13
  23. package/bundle/dist/utils/providers/common/effort.js +1 -1
  24. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +3 -3
  25. package/bundle/dist/utils/providers/common/thinking.js +12 -0
  26. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +3 -2
  27. package/bundle/dist/utils/providers/openai/openai-direct-client.js +6 -16
  28. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +89 -78
  29. package/bundle/src/application/monit/log-buffer.test.ts +3 -4
  30. package/bundle/src/application/monit/log-buffer.ts +13 -27
  31. package/bundle/src/application/monit/monit.frame.test.ts +7 -8
  32. package/bundle/src/application/monit/monit.frame.ts +9 -14
  33. package/bundle/src/application/qgrid/oauth.ts +1 -1
  34. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +7 -111
  35. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +83 -179
  36. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +62 -1
  37. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +25 -71
  38. package/bundle/src/application/qgrid/qgrid.frame.test.ts +0 -38
  39. package/bundle/src/application/qgrid/qgrid.frame.ts +4 -12
  40. package/bundle/src/application/qgrid/qgrid.types.ts +2 -0
  41. package/bundle/src/application/qgrid/token-subscriber.test.ts +8 -18
  42. package/bundle/src/application/qgrid/token-subscriber.ts +10 -20
  43. package/bundle/src/application/qgrid/token-window-keepalive.test.ts +2 -2
  44. package/bundle/src/application/qgrid/token-window-keepalive.ts +2 -1
  45. package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +6 -3
  46. package/bundle/src/application/qgrid/tool-emulation-schema.ts +3 -3
  47. package/bundle/src/application/qgrid/tool-emulation.test.ts +8 -1
  48. package/bundle/src/application/qgrid/tool-emulation.ts +29 -0
  49. package/bundle/src/application/request-log/request-log.model.ts +5 -5
  50. package/bundle/src/application/setting/setting.model.test.ts +1 -101
  51. package/bundle/src/application/setting/setting.model.ts +1 -74
  52. package/bundle/src/application/setting/setting.store.ts +2 -3
  53. package/bundle/src/application/setting/setting.types.ts +0 -12
  54. package/bundle/src/application/sonamu.generated.http +2 -7
  55. package/bundle/src/i18n/en.ts +0 -3
  56. package/bundle/src/i18n/ko.ts +0 -3
  57. package/bundle/src/sonamu.config.ts +5 -5
  58. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +3 -6
  59. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +26 -0
  60. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +70 -148
  61. package/bundle/src/utils/providers/anthropic/anthropic-thinking.test.ts +36 -0
  62. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +84 -0
  63. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +74 -13
  64. package/bundle/src/utils/providers/anthropic/claude-session.ts +11 -20
  65. package/bundle/src/utils/providers/common/effort.ts +1 -1
  66. package/bundle/src/utils/providers/common/provider-dispatcher.ts +4 -0
  67. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -4
  68. package/bundle/src/utils/providers/common/thinking.ts +10 -0
  69. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +7 -3
  70. package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +3 -3
  71. package/bundle/src/utils/providers/openai/openai-direct-client.ts +20 -33
  72. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +97 -6
  73. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +113 -77
  74. package/bundle/web-dist/client/assets/index-CvG4UB9v.css +1 -0
  75. package/bundle/web-dist/client/assets/{index-DtRTSTes.js → index-reW8VvJF.js} +4 -4
  76. package/bundle/web-dist/client/assets/{logs-BhVYDEzC.js → logs-DDIt97D1.js} +1 -1
  77. package/bundle/web-dist/client/assets/{monit-BxN4JWqK.js → monit-DkABv7PG.js} +1 -1
  78. package/bundle/web-dist/client/assets/{routes-CBCqRp2o.js → routes-BRmQ4M3-.js} +1 -1
  79. package/bundle/web-dist/client/assets/services.generated-jnPHYMER.js +51 -0
  80. package/bundle/web-dist/client/assets/settings-BHvtycEZ.js +1 -0
  81. package/bundle/web-dist/client/assets/{show-BzYft5N4.js → show-qeTIzgDZ.js} +1 -1
  82. package/bundle/web-dist/client/assets/{tokens-PMybtI8X.js → tokens-5Bep_G-w.js} +1 -1
  83. package/bundle/web-dist/client/assets/{use-oauth-login-flow-C51_d6-6.js → use-oauth-login-flow-Cx-QO25M.js} +1 -1
  84. package/bundle/web-dist/client/assets/{use-update-token-mutation-D-Y8OySK.js → use-update-token-mutation-DQCwCYfR.js} +1 -1
  85. package/bundle/web-dist/client/index.html +3 -3
  86. package/bundle/web-dist/server/assets/{lazyRouteComponent-Bj1cPq6x.js → lazyRouteComponent-CUR-kWzI.js} +2 -2
  87. package/bundle/web-dist/server/assets/{logs-BSk9lOHe.js → logs-CagNGTBj.js} +3 -3
  88. package/bundle/web-dist/server/assets/{monit-D9W4ioUi.js → monit-DSxs4Jnl.js} +3 -3
  89. package/bundle/web-dist/server/assets/{plus-CmvbWuDf.js → plus-Bvdj8Pwx.js} +1 -1
  90. package/bundle/web-dist/server/assets/{react-dom-BjR1Iaz8.js → react-dom-CyuShs9K.js} +1 -1
  91. package/bundle/web-dist/server/assets/{refresh-cw-B8U9BL9-.js → refresh-cw-3QAiSWBd.js} +1 -1
  92. package/bundle/web-dist/server/assets/{routes-C7lB2Q85.js → routes-i-sTqXMX.js} +4 -4
  93. package/bundle/web-dist/server/assets/{services.generated-BM4X3Ecj.js → services.generated-FPwsG9p3.js} +116 -131
  94. package/bundle/web-dist/server/assets/{settings-BFVuldch.js → settings-DeHNwoMv.js} +40 -251
  95. package/bundle/web-dist/server/assets/{show-Cswh_tqs.js → show-C4jk1Hrp.js} +2 -2
  96. package/bundle/web-dist/server/assets/{tokens-DiTUwUwr.js → tokens-odgS2-9q.js} +4 -4
  97. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DYKnG4A2.js → use-oauth-login-flow-DTQKdYBO.js} +1 -1
  98. package/bundle/web-dist/server/assets/{use-update-token-mutation-DqGMopII.js → use-update-token-mutation-xvXbPrCI.js} +1 -1
  99. package/bundle/web-dist/server/entry-server.generated.js +10 -10
  100. package/package.json +1 -1
  101. package/skills/qgrid/SKILL.md +1 -0
  102. package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -1
  103. package/skills/qgrid/references/anthropic-claude-code-runtime.md +7 -4
  104. package/skills/qgrid/references/cli-env-and-server-boot.md +12 -9
  105. package/skills/qgrid/references/decision-rationale.md +9 -0
  106. package/skills/qgrid/references/openai-codex-runtime.md +6 -0
  107. package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
  108. package/skills/qgrid/references/tool-calling-and-multiturn.md +18 -1
  109. package/skills/qgrid/references/verification-and-debugging.md +1 -1
  110. package/bundle/dist/utils/process-supervisor.js +0 -22
  111. package/bundle/dist/utils/server-restart.js +0 -61
  112. package/bundle/src/utils/process-supervisor.test.ts +0 -24
  113. package/bundle/src/utils/process-supervisor.ts +0 -17
  114. package/bundle/src/utils/server-restart.test.ts +0 -76
  115. package/bundle/src/utils/server-restart.ts +0 -68
  116. package/bundle/web-dist/client/assets/index-D_sagzsR.css +0 -1
  117. package/bundle/web-dist/client/assets/services.generated-Cbvg2sGQ.js +0 -51
  118. package/bundle/web-dist/client/assets/settings-hBTEC7Ki.js +0 -1
@@ -6,34 +6,23 @@ import { invalidateAnthropicQuotaUsage } from "../../../application/qgrid/oauth.
6
6
  import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
7
7
  import { assertSupportedOneMillionSuffix, canonicalAnthropicModel } from "./anthropic-constants.js";
8
8
  import { readAnthropicQuotaUsage } from "./anthropic-quota.js";
9
+ import { assertAnthropicThinkingRuntime, resolveAnthropicThinking } from "./anthropic-thinking.js";
9
10
  import { makeAnthropicWorkerId, runClaudeSession } from "./claude-session.js";
10
11
  import { getLogger } from "@logtape/logtape";
11
12
  //#region src/utils/providers/anthropic/anthropic-dispatcher.ts
12
13
  /**
13
- * AnthropicDispatcher
14
- *
15
- * OpenAIDispatcher와 달리, worker pool을 두는 대신 요청별 fresh spawn
16
- * 토큰은 인메모리(MAP)으로 관리하고 smooth weighted round-robin 으로 고른다
17
- *
18
- * - 모든 요청은 fresh `--session-id` 로 실행
19
- * - 멀티턴 문맥은 클라이언트가 매 호출 보내는 full history 를 평탄화해 전달한다.
20
- * - 발급한 session-id 를 GenerateResult.threadCoord(threadId=session-id, workerId=tokenId,
21
- * epoch=0)로 올려, 상위(issueConvContext)가 클라에 회송할 좌표를 만든다. 다음 turn 이 좌표를
22
- * 회송해도 Anthropic 라우팅에는 쓰지 않는다.
14
+ * 요청마다 새 Claude 프로세스에 전체 대화 이력을 전달한다.
15
+ * 반환한 threadCoord는 다음 요청의 세션 재사용이나 토큰 선택에 쓰지 않는다.
23
16
  */
24
17
  const logger = getLogger(["qgrid", "anthropic-dispatcher"]);
25
18
  const DEFAULT_TIMEOUT_MS = 24e4;
26
19
  const REFRESH_SAFETY_MS = 6e4;
27
- function quotaThresholdExceededMessage(provider, tokens) {
28
- const details = tokens.map((token) => `${token.tokenName} (threshold ${token.threshold}%)`).join(", ");
29
- return details.length > 0 ? `All ${provider} tokens exceeded quota threshold: ${details}` : `All ${provider} tokens exceeded quota threshold`;
30
- }
31
20
  var AnthropicDispatcher = class {
32
21
  tokenPool = /* @__PURE__ */ new Map();
33
22
  weightedSelector = new SmoothWeightedRoundRobin();
23
+ inFlight = 0;
34
24
  async start() {
35
- const tokens = await TokenModel.findActiveByProvider("A", "anthropic");
36
- for (const t of tokens) {
25
+ (await TokenModel.findActiveByProvider("A", "anthropic")).forEach((t) => {
37
26
  this.tokenPool.set(t.id, {
38
27
  id: t.id,
39
28
  name: t.name,
@@ -43,30 +32,22 @@ var AnthropicDispatcher = class {
43
32
  });
44
33
  this.weightedSelector.setToken(t.id, t.weight);
45
34
  logger.info(`worker spawned: ${t.name}`);
46
- }
35
+ });
47
36
  }
48
37
  async stop() {
49
- const tokenIds = [...this.tokenPool.keys()];
50
- for (const id of tokenIds) this.weightedSelector.removeToken(id);
38
+ [...this.tokenPool.keys()].forEach((id) => this.weightedSelector.removeToken(id));
51
39
  this.tokenPool.clear();
52
40
  this.weightedSelector.resetScores();
53
41
  }
54
- get tokenCount() {
55
- return this.tokenPool.size;
56
- }
57
- inFlightCount = 0;
58
- get inFlight() {
59
- return this.inFlightCount;
60
- }
61
- get tokenNames() {
62
- return [...this.tokenPool.values()].map((token) => token.name).toSorted();
63
- }
64
42
  replaceTokens(rows) {
65
43
  const next = new Set(rows.map((r) => r.id));
66
- const currentIds = Array.from(this.tokenPool.keys());
67
- for (const id of currentIds) if (!next.has(id)) this.onTokenRemoved(id);
68
- for (const r of rows) if (this.tokenPool.has(r.id)) this.onTokenUpdated(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
69
- else this.onTokenAdded(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
44
+ Array.from(this.tokenPool.keys()).forEach((id) => {
45
+ if (!next.has(id)) this.onTokenRemoved(id);
46
+ });
47
+ rows.forEach((r) => {
48
+ if (this.tokenPool.has(r.id)) this.onTokenUpdated(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
49
+ else this.onTokenAdded(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
50
+ });
70
51
  }
71
52
  onTokenAdded(id, name, credentials, quotaThreshold, weight = 1) {
72
53
  this.tokenPool.set(id, {
@@ -106,7 +87,8 @@ var AnthropicDispatcher = class {
106
87
  overThresholdTokens,
107
88
  reason: "all_exceeded"
108
89
  });
109
- throw new QuotaThresholdExceededError(quotaThresholdExceededMessage("anthropic", overThresholdTokens));
90
+ const details = overThresholdTokens.map((token) => `${token.tokenName} (threshold ${token.threshold}%)`).join(", ");
91
+ throw new QuotaThresholdExceededError(details ? `All anthropic tokens exceeded quota threshold: ${details}` : "All anthropic tokens exceeded quota threshold");
110
92
  }
111
93
  if (preferred) return preferred;
112
94
  const selectedId = this.weightedSelector.select(new Set(eligible.map((token) => token.id)));
@@ -125,22 +107,34 @@ var AnthropicDispatcher = class {
125
107
  token,
126
108
  result: await readAnthropicQuotaUsage(token.credentials.accessToken, model)
127
109
  })))).forEach((check, index) => {
128
- if (check.status === "rejected") {
129
- const token = thresholded[index];
130
- if (!token) return;
131
- this.logQuotaLookupFailOpen(token, String(check.reason));
132
- eligibleIds.add(token.id);
133
- return;
134
- }
135
- const token = check.value.token;
136
- const result = check.value.result;
110
+ const token = check.status === "rejected" ? thresholded[index] : check.value.token;
111
+ if (!token) return;
112
+ const result = check.status === "fulfilled" ? check.value.result : {
113
+ kind: "lookup_failed",
114
+ reason: String(check.reason)
115
+ };
137
116
  if (result.kind === "lookup_failed") {
138
- this.logQuotaLookupFailOpen(token, result.reason);
117
+ logger.warn("quota_threshold gate: lookup_fail_open", {
118
+ tokenId: token.id,
119
+ tokenName: token.name,
120
+ provider: "anthropic",
121
+ threshold: token.quotaThreshold,
122
+ reason: "lookup_fail_open",
123
+ lookupReason: result.reason
124
+ });
139
125
  eligibleIds.add(token.id);
140
126
  return;
141
127
  }
142
128
  if (result.utilizationPct >= token.quotaThreshold) {
143
- this.logQuotaOverThreshold(token, result);
129
+ logger.info("quota_threshold gate: over_threshold", {
130
+ tokenId: token.id,
131
+ tokenName: token.name,
132
+ provider: "anthropic",
133
+ threshold: token.quotaThreshold,
134
+ cachedUtilization: result.utilizationPct,
135
+ cacheAge: result.cacheAgeMs,
136
+ reason: "over_threshold"
137
+ });
144
138
  overThresholdTokens.push({
145
139
  tokenName: token.name,
146
140
  threshold: token.quotaThreshold
@@ -157,27 +151,6 @@ var AnthropicDispatcher = class {
157
151
  hasQuotaThreshold(token) {
158
152
  return token.quotaThreshold !== void 0 && token.quotaThreshold !== null;
159
153
  }
160
- logQuotaOverThreshold(token, result) {
161
- logger.info("quota_threshold gate: over_threshold", {
162
- tokenId: token.id,
163
- tokenName: token.name,
164
- provider: "anthropic",
165
- threshold: token.quotaThreshold,
166
- cachedUtilization: result.utilizationPct,
167
- cacheAge: result.cacheAgeMs,
168
- reason: "over_threshold"
169
- });
170
- }
171
- logQuotaLookupFailOpen(token, reason) {
172
- logger.warn("quota_threshold gate: lookup_fail_open", {
173
- tokenId: token.id,
174
- tokenName: token.name,
175
- provider: "anthropic",
176
- threshold: token.quotaThreshold,
177
- reason: "lookup_fail_open",
178
- lookupReason: reason
179
- });
180
- }
181
154
  async generate(req) {
182
155
  return this.run(req, () => {});
183
156
  }
@@ -190,22 +163,16 @@ var AnthropicDispatcher = class {
190
163
  cb.onError(e);
191
164
  }
192
165
  }
193
- async run(...args) {
194
- this.inFlightCount++;
166
+ async run(req, onDelta, opts) {
167
+ this.inFlight++;
195
168
  try {
196
- return await this.runInner(...args);
197
- } finally {
198
- this.inFlightCount--;
199
- }
200
- }
201
- async runInner(req, onDelta, opts) {
202
- if (req.imageGeneration) throw new Error("image generation is not supported on the Anthropic route");
203
- assertSupportedOneMillionSuffix(req.model);
204
- const model = canonicalAnthropicModel(req.model);
205
- const jsonSchema = serializeAndValidateDispatchSchema(req.outputSchema, "anthropic");
206
- const token = await this.selectToken(model, req.preferredTokenId);
207
- if (!token) throw new Error("No anthropic tokens available");
208
- const exec = async () => {
169
+ if (req.imageGeneration) throw new Error("image generation is not supported on the Anthropic route");
170
+ assertSupportedOneMillionSuffix(req.model);
171
+ const model = canonicalAnthropicModel(req.model);
172
+ assertAnthropicThinkingRuntime(resolveAnthropicThinking(model, req.thinking, req.effort).extraBody);
173
+ const jsonSchema = serializeAndValidateDispatchSchema(req.outputSchema, "anthropic");
174
+ const token = await this.selectToken(model, req.preferredTokenId);
175
+ if (!token) throw new Error("No anthropic tokens available");
209
176
  let accessToken = token.credentials.accessToken;
210
177
  const expiresAt = getExpiresAt(token.credentials);
211
178
  if (expiresAt && expiresAt - Date.now() < REFRESH_SAFETY_MS && getRefreshToken(token.credentials)) try {
@@ -227,6 +194,7 @@ var AnthropicDispatcher = class {
227
194
  system: req.systemPrompt,
228
195
  jsonSchema,
229
196
  effort: req.effort,
197
+ thinking: req.thinking,
230
198
  timeoutMs: req.timeoutMs ?? DEFAULT_TIMEOUT_MS,
231
199
  coldHistory: req.coldHistory,
232
200
  input: req.coldInput,
@@ -260,11 +228,12 @@ var AnthropicDispatcher = class {
260
228
  epoch: 0
261
229
  }
262
230
  };
263
- };
264
- return exec();
231
+ } finally {
232
+ this.inFlight--;
233
+ }
265
234
  }
266
235
  };
267
236
  //#endregion
268
237
  export { AnthropicDispatcher };
269
238
 
270
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnLzroZwg6rOg66W464ukXG4gKlxuICogLSDrqqjrk6Ag7JqU7LKt7J2AIGZyZXNoIGAtLXNlc3Npb24taWRgIOuhnCDsi6TtlolcbiAqIC0g66mA7Yuw7YS0IOusuOunpeydgCDtgbTrnbzsnbTslrjtirjqsIAg66ekIO2YuOy2nCDrs7TrgrTripQgZnVsbCBoaXN0b3J5IOulvCDtj4ntg4TtmZTtlbQg7KCE64us7ZWc64ukLlxuICogLSDrsJzquIntlZwgc2Vzc2lvbi1pZCDrpbwgR2VuZXJhdGVSZXN1bHQudGhyZWFkQ29vcmQodGhyZWFkSWQ9c2Vzc2lvbi1pZCwgd29ya2VySWQ9dG9rZW5JZCxcbiAqICAgZXBvY2g9MCnroZwg7Jis66CkLCDsg4HsnIQoaXNzdWVDb252Q29udGV4dCnqsIAg7YG065287JeQIO2ajOyGoe2VoCDsooztkZzrpbwg66eM65Og64ukLiDri6TsnYwgdHVybiDsnbQg7KKM7ZGc66W8XG4gKiAgIO2ajOyGoe2VtOuPhCBBbnRocm9waWMg65287Jqw7YyF7JeQ64qUIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hIH0gZnJvbSBcIi4uL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UsXG4gIHJlYWRBbnRocm9waWNRdW90YVVzYWdlLFxuICB0eXBlIEFudGhyb3BpY1F1b3RhVXNhZ2VSZXN1bHQsXG59IGZyb20gXCIuL2FudGhyb3BpYy1xdW90YVwiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOygleyDgSDsg53shLHsnYAg7Iuk7Lih7IOBIDEwMHMr6rmM7KeAIOqwhOuLpC4gMjQwc+uKlCDsmYTstqkg7J6l7LmY7J28IOu/kCxcbi8vIOqxsOu2gCvqsbDrjIAgc3lzdGVtIOyerOyDneyEsSDsp4Dsl7DsnYQg7JmE7KCE7Z6IIO2VtOqysO2VmOuKlCDqsJLsnYAg7JWE64uI64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbi8vIGFjY2VzcyB0b2tlbiDrp4zro4wg7J6E67CVIOyehOqzhCDigJQg6riw7KG0IHN0YW5kYWxvbmUg6rK966GcKHFncmlkLmRpc3BhdGNoZXIudHMp7JmAIOuPmeydvCg2MHMpLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmludGVyZmFjZSBQb29sZWRUb2tlbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcbiAgcHJvdmlkZXI6IHN0cmluZyxcbiAgdG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9Pixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRldGFpbHMgPSB0b2tlbnNcbiAgICAubWFwKCh0b2tlbikgPT4gYCR7dG9rZW4udG9rZW5OYW1lfSAodGhyZXNob2xkICR7dG9rZW4udGhyZXNob2xkfSUpYClcbiAgICAuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlscy5sZW5ndGggPiAwXG4gICAgPyBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsc31gXG4gICAgOiBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGRgO1xufVxuXG5leHBvcnQgY2xhc3MgQW50aHJvcGljRGlzcGF0Y2hlciBpbXBsZW1lbnRzIFByb3ZpZGVyRGlzcGF0Y2hlciB7XG4gIC8vIHRva2VuSWQg4oaSIO2SgCDtla3rqqkuIHN0YXJ0KCkvdG9rZW4g7J2067Kk7Yq466GcIOyxhOybgFxuICBwcml2YXRlIHRva2VuUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBQb29sZWRUb2tlbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE9wZW5BSURpc3BhdGNoZXIuc3RhcnQoKSDsmYAg64+Z7J287ZWY6rKMIERCIOyXkOyEnCDquLDsobQgYW50aHJvcGljIO2GoO2BsOydhCBzZWxmLWJvb3RzdHJhcCDtlZzri6QuXG4gICAgLy8gKOyEnOuyhCDsnqzsi5zsnpEg7IucIE5PVElGWSDqsIAg7JWIIOyYpOuvgOuhnCDrtoDtirjsiqTtirjrnqnsnbQg7JeG7Jy866m0IO2SgOydtCDruYgg7LGE66GcIOuCqOuKlOuLpC4pXG4gICAgLy8g7J207ZuEIOuzgOqyveu2hOydgCB0b2tlbi1zdWJzY3JpYmVyIOqwgCBvblRva2VuQWRkZWQvVXBkYXRlZC9SZW1vdmVkIOuhnCDsoITri6ztlZzri6QuXG4gICAgLy8gZmluZEFjdGl2ZUJ5UHJvdmlkZXIg6rCAIGFjdGl2ZT10cnVlICsgcHJvdmlkZXIg7ZWE7YSw66W8IERCIOyXkOyEnCDsspjrpqwg4oaSIGluYWN0aXZlIOuKlCDslaDstIjsl5Ag7JWIIOyYqOuLpC5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyKFwiQVwiLCBcImFudGhyb3BpY1wiKTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdG9rZW5zKSB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHQud2VpZ2h0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4odC5pZCwgdC53ZWlnaHQpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3QubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuSWRzID0gWy4uLnRoaXMudG9rZW5Qb29sLmtleXMoKV07XG4gICAgZm9yIChjb25zdCBpZCBvZiB0b2tlbklkcykgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLnRva2VuUG9vbC5jbGVhcigpO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2SgOydmCDthqDtgbAg7IiYKHN0YXJ0dXAg66Gc6re4L2hlYWx0aCDsmqkpLlxuICBnZXQgdG9rZW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5zaXplO1xuICB9XG5cbiAgLy8g7KeA6riIIOyLpO2WiSDspJHsnbggQ2xhdWRlIENvZGUg7ZSE66Gc7IS47IqkIOyImCDigJQgZnJlc2gtc3Bhd24g7J206528IOydtOqyjCDqs6cg64+Z7IucIOyalOyyrSDsiJjri6QuXG4gIHByaXZhdGUgaW5GbGlnaHRDb3VudCA9IDA7XG4gIGdldCBpbkZsaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0Q291bnQ7XG4gIH1cblxuICAvLyBNb25pdCDtkZzsi5zsmqkg4oCUIO2SgOyXkCDsnojripQg7Yag7YGwIOydtOumhCDsiqTrg4Xsg7cgKOydtOumhOyInCDsoJXroKwpXG4gIGdldCB0b2tlbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5Qb29sLnZhbHVlcygpXS5tYXAoKHRva2VuKSA9PiB0b2tlbi5uYW1lKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgLy8gREIgYWN0aXZlIGFudGhyb3BpYyDthqDtgbAg66qp66Gd7Jy866GcIO2SgOydhCDsnqzrj5nquLDtmZTtlZzri6QocGVyaW9kaWMgcmVjb25jaWxlL+yerOyXsOqysOyaqSkuXG4gIC8vIExJU1RFTi9OT1RJRlkg6rCAIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CcIOy2lOqwgC/sgq3soJwv67mE7Zmc7ISx7ZmU66W8IERCIOq4sOykgOycvOuhnCDri6Tsi5wg66ee7LaY64ukLlxuICAvLyDsnbTrsqTtirgg7ZW465Ok65+s66W8IOyerOyCrOyaqe2VtCDtkoAg6rCx7Iug7J20IOydvOq0gOuQmOqyjCDsoIHsmqnrkJjrj4TroZ0g7ZWc64ukOlxuICAvLyAgLSBEQiDsl5Ag7JeG64qU642wIO2SgOyXkCDsnojripQg7Yag7YGwIOKGkiBvblRva2VuUmVtb3ZlZFxuICAvLyAgLSBEQiDsl5Ag7J6I64qUIO2GoO2BsCDihpIg7Iug6rec66m0IG9uVG9rZW5BZGRlZCwg6riw7KG07J2066m0IG9uVG9rZW5VcGRhdGVkXG4gIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChyb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIC8vIG9uVG9rZW5SZW1vdmVkIOqwgCB0b2tlblBvb2wg7J2EIGRlbGV0ZSDtlZjrr4DroZwg7Iic7ZqMIOykkSDsiJjsoJXsnYQg7ZS87ZWY66CkIO2CpOulvCDrqLzsoIAg7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjdXJyZW50SWRzKSB7XG4gICAgICBpZiAoIW5leHQuaGFzKGlkKSkgdGhpcy5vblRva2VuUmVtb3ZlZChpZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy50b2tlblBvb2wuaGFzKHIuaWQpKSB7XG4gICAgICAgIHRoaXMub25Ub2tlblVwZGF0ZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uVG9rZW5BZGRlZChyLmlkLCByLm5hbWUsIHIuY3JlZGVudGlhbHMsIHIucXVvdGFUaHJlc2hvbGQsIHIud2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB0b2tlbiBldmVudHMgKHRva2VuLXN1YnNjcmliZXIg6rCAIO2YuOy2nClcbiAgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLnNldChpZCwgeyBpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgfVxuXG4gIC8vIOyngOyglSDsmpTssq3snYAg7ZW064u5IO2GoO2BsOunjCBxdW90YSDtjJDsoJXtlZjqs6Agd2VpZ2h0ZWQg7IOB7YOc66W8IOqxtOuTnOumrOyngCDslYrripTri6QuXG4gIC8vIOuvuOyngOyglSDsmpTssq3rp4wgcXVvdGEg7Ya16rO8IO2bhOuztOuhnCBzbW9vdGggd2VpZ2h0ZWQgcm91bmQtcm9iaW4g7J2EIOynhO2Wie2VnOuLpC5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUb2tlbihtb2RlbDogc3RyaW5nLCBwcmVmZXJyZWRUb2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxQb29sZWRUb2tlbiB8IG51bGw+IHtcbiAgICBjb25zdCBwcmVmZXJyZWQgPVxuICAgICAgcHJlZmVycmVkVG9rZW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy50b2tlblBvb2wuZ2V0KHByZWZlcnJlZFRva2VuSWQpO1xuICAgIGlmIChwcmVmZXJyZWRUb2tlbklkICE9PSB1bmRlZmluZWQgJiYgIXByZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcmVmZXJyZWQgYW50aHJvcGljIHRva2VuICR7cHJlZmVycmVkVG9rZW5JZH0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSBwcmVmZXJyZWQgPyBbcHJlZmVycmVkXSA6IFsuLi50aGlzLnRva2VuUG9vbC52YWx1ZXMoKV07XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IGVsaWdpYmxlLCBvdmVyVGhyZXNob2xkVG9rZW5zIH0gPSBhd2FpdCB0aGlzLmZpbHRlckVsaWdpYmxlVG9rZW5zKHJvd3MsIG1vZGVsKTtcbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgdG9rZW5Db3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudDogcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQocikpLmxlbmd0aCxcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2VucyxcbiAgICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKFxuICAgICAgICBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcImFudGhyb3BpY1wiLCBvdmVyVGhyZXNob2xkVG9rZW5zKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByZWZlcnJlZCkgcmV0dXJuIHByZWZlcnJlZDtcblxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQoZWxpZ2libGUubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpKSk7XG4gICAgaWYgKHNlbGVjdGVkSWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5nZXQoc2VsZWN0ZWRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsdGVyRWxpZ2libGVUb2tlbnMoXG4gICAgcm93czogUG9vbGVkVG9rZW5bXSxcbiAgICBtb2RlbDogc3RyaW5nLFxuICApOiBQcm9taXNlPHtcbiAgICBlbGlnaWJsZTogUG9vbGVkVG9rZW5bXTtcbiAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PjtcbiAgfT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZGVkID0gcm93cy5maWx0ZXIoKHRva2VuKSA9PiB0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSk7XG4gICAgaWYgKHRocmVzaG9sZGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgZWxpZ2libGU6IHJvd3MsIG92ZXJUaHJlc2hvbGRUb2tlbnM6IFtdIH07XG5cbiAgICBjb25zdCBlbGlnaWJsZUlkcyA9IG5ldyBTZXQoXG4gICAgICByb3dzLmZpbHRlcigodG9rZW4pID0+ICF0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSkubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aHJlc2hvbGRlZC5tYXAoYXN5bmMgKHRva2VuKSA9PiAoe1xuICAgICAgICB0b2tlbixcbiAgICAgICAgcmVzdWx0OiBhd2FpdCByZWFkQW50aHJvcGljUXVvdGFVc2FnZSh0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbiwgbW9kZWwpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aHJlc2hvbGRlZFtpbmRleF07XG4gICAgICAgIGlmICghdG9rZW4pIHJldHVybjtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCBTdHJpbmcoY2hlY2sucmVhc29uKSk7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBjaGVjay52YWx1ZS50b2tlbjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrLnZhbHVlLnJlc3VsdDtcbiAgICAgIGlmIChyZXN1bHQua2luZCA9PT0gXCJsb29rdXBfZmFpbGVkXCIpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRva2VuLnF1b3RhVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFPdmVyVGhyZXNob2xkKHRva2VuLCByZXN1bHQpO1xuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IHRva2VuLm5hbWUsIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLmZpbHRlcigodG9rZW4pID0+IGVsaWdpYmxlSWRzLmhhcyh0b2tlbi5pZCkpLCBvdmVyVGhyZXNob2xkVG9rZW5zIH07XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuOiBQb29sZWRUb2tlbik6IHRva2VuIGlzIFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRva2VuLnF1b3RhVGhyZXNob2xkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YU92ZXJUaHJlc2hvbGQoXG4gICAgdG9rZW46IFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0sXG4gICAgcmVzdWx0OiBFeHRyYWN0PEFudGhyb3BpY1F1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBvdmVyX3RocmVzaG9sZFwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIGNhY2hlZFV0aWxpemF0aW9uOiByZXN1bHQudXRpbGl6YXRpb25QY3QsXG4gICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3BlbihcbiAgICB0b2tlbjogUG9vbGVkVG9rZW4gJiB7IHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfSxcbiAgICByZWFzb246IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIHJlYXNvbjogXCJsb29rdXBfZmFpbF9vcGVuXCIsXG4gICAgICBsb29rdXBSZWFzb246IHJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEsICgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4ocmVxLCBjYi5vbkRlbHRhLCB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHRydWUgfSk7XG4gICAgICBjYi5vblRocmVhZElkPy4ocmVzdWx0LnRocmVhZENvb3JkLnRocmVhZElkKTtcbiAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYi5vbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdlbmVyYXRlL2dlbmVyYXRlU3RyZWFtIOqzte2GtSDsi6TtlokuIG9uRGVsdGEg64qUIOyKpO2KuOumvOydtOuptCDsoJDsp4Qg67Cp7LacLCDruYTsiqTtirjrprzsnbTrqbQgbm8tb3AuXG4gIHByaXZhdGUgYXN5bmMgcnVuKC4uLmFyZ3M6IFBhcmFtZXRlcnM8QW50aHJvcGljRGlzcGF0Y2hlcltcInJ1bklubmVyXCJdPik6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmluRmxpZ2h0Q291bnQrKztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuSW5uZXIoLi4uYXJncyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5GbGlnaHRDb3VudC0tO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuSW5uZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgb25EZWx0YTogKHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBvcHRzPzogeyBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyDneyEseydgCBPcGVuQUkg6rK966GcIOyghOyaqS4gQW50aHJvcGljIOudvOyasO2MheyXkCDsnbTrr7jsp4Ag7ZSM656Y6re46rCAXG4gICAgLy8g64+E64us7ZWY66m0IOyhsOyaqe2eiCDthY3siqTtirjroZwg7Y+067Cx7ZWY7KeAIOyViuqzoCDrqoXsi5zsoIHsnLzroZwg6rGw67aA7ZWc64ukLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIEFudGhyb3BpYyByb3V0ZVwiKTtcbiAgICB9XG4gICAgLy8gbW9kZWwg7KCV6rec7ZmU66W8IGRpc3BhdGNoZXIg7KeE7J6F7KCQ7JeQ7IScIO2VnCDrsogg7ZWc64ukOiByZXN1bHQubW9kZWwgLyBydW5DbGF1ZGVTZXNzaW9uIOyghOu2gFxuICAgIC8vIGNhbm9uaWNhbChwcmVmaXgg7JeG64qUIGNvc3Qg7YKkKSDsnYQg7JOw6rKMIO2GteydvC4g66+47KeA7KCV7J2066m0IEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOKAlCBxZ3JpZC5kaXNwYXRjaGVyXG4gICAgLy8g7J2YIFwic29ubmV0XCIg67OE7LmtIOyasO2ajCDssKjri6guIOygleq3nO2ZlCDqt5zsuZnsnYAgZmFsbGJhY2sg6rK966Gc7JmAIOqzteycoChjYW5vbmljYWxBbnRocm9waWNNb2RlbCkuXG4gICAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwocmVxLm1vZGVsKTtcbiAgICBjb25zdCBqc29uU2NoZW1hID0gc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYShyZXEub3V0cHV0U2NoZW1hLCBcImFudGhyb3BpY1wiKTtcblxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5zZWxlY3RUb2tlbihtb2RlbCwgcmVxLnByZWZlcnJlZFRva2VuSWQpO1xuICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcihcIk5vIGFudGhyb3BpYyB0b2tlbnMgYXZhaWxhYmxlXCIpO1xuXG4gICAgY29uc3QgZXhlYyA9IGFzeW5jICgpOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiA9PiB7XG4gICAgICAvLyDrp4zro4wg7J6E67CVIO2GoO2BsCBwcmVlbXB0aXZlIHJlZnJlc2go6riw7KG0IHN0YW5kYWxvbmUg6rK966Gc7JmAIOuPmeydvCkuIOyLpO2MqO2VtOuPhCDsp4TtlokuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IGdldEV4cGlyZXNBdCh0b2tlbi5jcmVkZW50aWFscyk7XG4gICAgICBpZiAoXG4gICAgICAgIGV4cGlyZXNBdCAmJlxuICAgICAgICBleHBpcmVzQXQgLSBEYXRlLm5vdygpIDwgUkVGUkVTSF9TQUZFVFlfTVMgJiZcbiAgICAgICAgZ2V0UmVmcmVzaFRva2VuKHRva2VuLmNyZWRlbnRpYWxzKVxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBRZ3JpZEZyYW1lIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgICAvLyBwcm92aWRlciDrpbwg67CY65Oc7IucIOyxhOybjOyVvCByZWZyZXNoVG9rZW4g64K067aAIFRva2VuTW9kZWwuc2F2ZSDqsIAg7ISx6rO17ZWc64ukLlxuICAgICAgICAgIC8vIHJlZnJlc2hUb2tlbihUb2tlblN1YnNldEEpIOuKlCBpZC9wcm92aWRlci9jcmVkZW50aWFscy9uYW1lIOunjCDsgqzsmqntlZjrr4DroZwg6re4IDTqsJzrp4wg64SY6ri064ukLlxuICAgICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4oe1xuICAgICAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHRva2VuLmNyZWRlbnRpYWxzLFxuICAgICAgICAgIH0gYXMgUGFyYW1ldGVyczx0eXBlb2YgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4+WzBdKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dG9rZW4ubmFtZX0gKG1vZGVsOiAke21vZGVsfSlgKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBydW5DbGF1ZGVTZXNzaW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICAgICAgdG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHN5c3RlbTogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICBqc29uU2NoZW1hLFxuICAgICAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCxcbiAgICAgICAgICB0aW1lb3V0TXM6IHJlcS50aW1lb3V0TXMgPz8gREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiByZXEuY29sZEhpc3RvcnksXG4gICAgICAgICAgaW5wdXQ6IHJlcS5jb2xkSW5wdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWw6IHJlcS5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiBvcHRzPy5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzLFxuICAgICAgICB9LFxuICAgICAgICBvbkRlbHRhLFxuICAgICAgKTtcblxuICAgICAgaWYgKHNlc3Npb24ucXVvdGFFeGhhdXN0ZWQpIHtcbiAgICAgICAgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UodG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAoYWNjZXNzVG9rZW4gIT09IHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcXVvdGEgZXhoYXVzdGVkICgke3Rva2VuLm5hbWV9KWApO1xuICAgICAgfVxuICAgICAgaWYgKHNlc3Npb24uaXNFcnJvcikge1xuICAgICAgICAvLyDsp4Tri6goU09OLTQ5NSk6IGlzRXJyb3Ig7YyQ7KCVIOyCrOycoChzdWJ0eXBlL3Rlcm1pbmFsX3JlYXNvbinrpbwg66mU7Iuc7KeAIOyVnuyXkCDrk5zrn6zrgrjri6QuXG4gICAgICAgIC8vIOq3uOuPmeyViCBkZXRhaWwg7J20IHNlc3Npb24udGV4dCjsmYTsoITtlZwgSlNPTiDrs7jrrLgp67+Q7J206528IFwic2NoZW1hIOychOuwmOyduOyngCAvIG1heCByZXRyaWVzIOyduOyngCAvXG4gICAgICAgIC8vIG1heCB0dXJucyDsnbjsp4BcIuulvCDqtazrtoTtlaAg7IiYIOyXhuyXiOuLpC4gdGV4dCDripQg7KeE64uo7JeQIO2VhOyalO2VnCDrp4ztgbzrp4wg7J6Y6528IOuNp+u2meyduOuLpC5cbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICBzZXNzaW9uLnN1YnR5cGUgPz8gc2Vzc2lvbi50ZXJtaW5hbFJlYXNvbiA/PyAoc2Vzc2lvbi5pc0Vycm9yID8gXCJpc19lcnJvclwiIDogXCJ1bmtub3duXCIpO1xuICAgICAgICBjb25zdCBib2R5ID0gc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgPyBzZXNzaW9uLnRleHQubGVuZ3RoID4gNTAwXG4gICAgICAgICAgICA/IGAke3Nlc3Npb24udGV4dC5zbGljZSgwLCA1MDApfeKApigke3Nlc3Npb24udGV4dC5sZW5ndGh9IGNoYXJzKWBcbiAgICAgICAgICAgIDogc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgOiBgZW1wdHkgdGV4dCwgb3V0cHV0VG9rZW5zPSR7c2Vzc2lvbi51c2FnZS5vdXRwdXRUb2tlbnN9YDtcbiAgICAgICAgY29uc3QgcmVmdXNhbCA9IHNlc3Npb24ucmVmdXNhbCA/IGAgcmVmdXNhbD0ke0pTT04uc3RyaW5naWZ5KHNlc3Npb24ucmVmdXNhbCl9YCA6IFwiXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY2xhdWRlIGVycm9yICgke3Rva2VuLm5hbWV9KSBbJHtyZWFzb259XTogJHtib2R5fSR7cmVmdXNhbH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogc2Vzc2lvbi50ZXh0LFxuICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgIHVzYWdlOiBzZXNzaW9uLnVzYWdlLFxuICAgICAgICBkdXJhdGlvbk1zOiBzZXNzaW9uLmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRNczogc2Vzc2lvbi50dGZ0TXMsXG4gICAgICAgIGNvc3RVc2Q6IHNlc3Npb24uY29zdFVzZCxcbiAgICAgICAgLy8gQ2xhdWRlIENvZGUg64qUIEZhYmxlIHJlZnVzYWwg7J2EIE9wdXMg66GcIOyekOuPmSBmYWxsYmFjayDtlaAg7IiYIOyeiOuLpC4g7JqU7LKtIOuqqOuNuOydhFxuICAgICAgICAvLyDqt7jrjIDroZwgc2VydmluZyBtb2RlbCDroZwg6riw66Gd7ZWY66m0IOu5hOyaqS/qsJDsgqwg66Gc6re46rCAIOuqqOuRkCDti4DslrTsp4Drr4DroZwg65GY7J2EIOq1rOu2hO2VnOuLpC5cbiAgICAgICAgbW9kZWw6IHNlc3Npb24uc2VydmVkTW9kZWwgPz8gbW9kZWwsXG4gICAgICAgIHJlcXVlc3RlZE1vZGVsOiBtb2RlbCxcbiAgICAgICAgbW9kZWxGYWxsYmFja3M6IHNlc3Npb24ubW9kZWxGYWxsYmFja3MsXG4gICAgICAgIC8vIHN5c3RlbUhhc2gg64qUIOyDgeychCBpc3N1ZUNvbnZDb250ZXh0IOqwgCDssYTsmrTri6Qo7Jes6riw7ISgIOu5hOyatOuLpCkuXG4gICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgd29ya2VySWQ6IG1ha2VBbnRocm9waWNXb3JrZXJJZCh0b2tlbi5pZCksXG4gICAgICAgICAgdGhyZWFkSWQ6IHNlc3Npb24uc2Vzc2lvbklkLFxuICAgICAgICAgIGVwb2NoOiAwLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV4ZWMoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsc0JBQXNCLENBQUM7QUFJMUQsTUFBTSxxQkFBcUI7QUFFM0IsTUFBTSxvQkFBb0I7QUFVMUIsU0FBUyw4QkFDUCxVQUNBLFFBQ1E7Q0FDUixNQUFN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
239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDsmpTssq3rp4jri6Qg7IOIIENsYXVkZSDtlITroZzshLjsiqTsl5Ag7KCE7LK0IOuMgO2ZlCDsnbTroKXsnYQg7KCE64us7ZWc64ukLlxuICog67CY7ZmY7ZWcIHRocmVhZENvb3Jk64qUIOuLpOydjCDsmpTssq3snZgg7IS47IWYIOyerOyCrOyaqeydtOuCmCDthqDtgbAg7ISg7YOd7JeQIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hIH0gZnJvbSBcIi4uL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgaW52YWxpZGF0ZUFudGhyb3BpY1F1b3RhVXNhZ2UsIHJlYWRBbnRocm9waWNRdW90YVVzYWdlIH0gZnJvbSBcIi4vYW50aHJvcGljLXF1b3RhXCI7XG5pbXBvcnQgeyBhc3NlcnRBbnRocm9waWNUaGlua2luZ1J1bnRpbWUsIHJlc29sdmVBbnRocm9waWNUaGlua2luZyB9IGZyb20gXCIuL2FudGhyb3BpYy10aGlua2luZ1wiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOyDneyEseydgCAxMDDstIgg7J207IOBIOqxuOumtCDsiJgg7J6I64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbmNvbnN0IFJFRlJFU0hfU0FGRVRZX01TID0gNjBfMDAwO1xuXG5pbnRlcmZhY2UgUG9vbGVkVG9rZW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFudGhyb3BpY0Rpc3BhdGNoZXIgaW1wbGVtZW50cyBQcm92aWRlckRpc3BhdGNoZXIge1xuICB0b2tlblBvb2wgPSBuZXcgTWFwPG51bWJlciwgUG9vbGVkVG9rZW4+KCk7XG4gIHJlYWRvbmx5IHdlaWdodGVkU2VsZWN0b3IgPSBuZXcgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluKCk7XG4gIGluRmxpZ2h0ID0gMDtcblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBOT1RJRlnripQg6riw7KG0IO2GoO2BsOydhCDsnqzsoITshqHtlZjsp4Ag7JWK7Jy866+A66GcIOyLnOyekSDsi5wgRELsl5DshJwg7J2964qU64ukLlxuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpO1xuICAgIHRva2Vucy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHQud2VpZ2h0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4odC5pZCwgdC53ZWlnaHQpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3QubmFtZX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW5JZHMgPSBbLi4udGhpcy50b2tlblBvb2wua2V5cygpXTtcbiAgICB0b2tlbklkcy5mb3JFYWNoKChpZCkgPT4gdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKSk7XG4gICAgdGhpcy50b2tlblBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIC8vIExJU1RFTi9OT1RJRlkg7Jew6rKw7J20IOuBiuq4tCDrj5nslYgg64aT7LmcIOuzgOqyveydhCBEQiDquLDspIDsnLzroZwg66ee7LaY64ukLlxuICByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICAvLyDsgq3soJztlaAg7YKk64qUIOyInO2ajCDsoITsl5Ag7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgY3VycmVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCFuZXh0LmhhcyhpZCkpIHRoaXMub25Ub2tlblJlbW92ZWQoaWQpO1xuICAgIH0pO1xuICAgIHJvd3MuZm9yRWFjaCgocikgPT4ge1xuICAgICAgaWYgKHRoaXMudG9rZW5Qb29sLmhhcyhyLmlkKSkge1xuICAgICAgICB0aGlzLm9uVG9rZW5VcGRhdGVkKHIuaWQsIHIubmFtZSwgci5jcmVkZW50aWFscywgci5xdW90YVRocmVzaG9sZCwgci53ZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vblRva2VuQWRkZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuUG9vbC5zZXQoaWQsIHsgaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0IH0pO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgfVxuXG4gIG9uVG9rZW5VcGRhdGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICB9XG5cbiAgLy8g7KeA7KCVIOyalOyyreydgCDtlbTri7kg7Yag7YGw66eMIHF1b3RhIO2MkOygle2VmOqzoCB3ZWlnaHRlZCDsg4Htg5zrpbwg6rG065Oc66as7KeAIOyViuuKlOuLpC5cbiAgLy8g66+47KeA7KCVIOyalOyyreunjCBxdW90YSDthrXqs7wg7ZuE67O066GcIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnYQg7KeE7ZaJ7ZWc64ukLlxuICBhc3luYyBzZWxlY3RUb2tlbihtb2RlbDogc3RyaW5nLCBwcmVmZXJyZWRUb2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxQb29sZWRUb2tlbiB8IG51bGw+IHtcbiAgICBjb25zdCBwcmVmZXJyZWQgPVxuICAgICAgcHJlZmVycmVkVG9rZW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy50b2tlblBvb2wuZ2V0KHByZWZlcnJlZFRva2VuSWQpO1xuICAgIGlmIChwcmVmZXJyZWRUb2tlbklkICE9PSB1bmRlZmluZWQgJiYgIXByZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcmVmZXJyZWQgYW50aHJvcGljIHRva2VuICR7cHJlZmVycmVkVG9rZW5JZH0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSBwcmVmZXJyZWQgPyBbcHJlZmVycmVkXSA6IFsuLi50aGlzLnRva2VuUG9vbC52YWx1ZXMoKV07XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IGVsaWdpYmxlLCBvdmVyVGhyZXNob2xkVG9rZW5zIH0gPSBhd2FpdCB0aGlzLmZpbHRlckVsaWdpYmxlVG9rZW5zKHJvd3MsIG1vZGVsKTtcbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgdG9rZW5Db3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudDogcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQocikpLmxlbmd0aCxcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2VucyxcbiAgICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXRhaWxzID0gb3ZlclRocmVzaG9sZFRva2Vuc1xuICAgICAgICAubWFwKCh0b2tlbikgPT4gYCR7dG9rZW4udG9rZW5OYW1lfSAodGhyZXNob2xkICR7dG9rZW4udGhyZXNob2xkfSUpYClcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IoXG4gICAgICAgIGRldGFpbHNcbiAgICAgICAgICA/IGBBbGwgYW50aHJvcGljIHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsc31gXG4gICAgICAgICAgOiBcIkFsbCBhbnRocm9waWMgdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJlZmVycmVkKSByZXR1cm4gcHJlZmVycmVkO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZWxlY3QobmV3IFNldChlbGlnaWJsZS5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpKTtcbiAgICBpZiAoc2VsZWN0ZWRJZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Qb29sLmdldChzZWxlY3RlZElkKSA/PyBudWxsO1xuICB9XG5cbiAgYXN5bmMgZmlsdGVyRWxpZ2libGVUb2tlbnMoXG4gICAgcm93czogUG9vbGVkVG9rZW5bXSxcbiAgICBtb2RlbDogc3RyaW5nLFxuICApOiBQcm9taXNlPHtcbiAgICBlbGlnaWJsZTogUG9vbGVkVG9rZW5bXTtcbiAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PjtcbiAgfT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZGVkID0gcm93cy5maWx0ZXIoKHRva2VuKSA9PiB0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSk7XG4gICAgaWYgKHRocmVzaG9sZGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgZWxpZ2libGU6IHJvd3MsIG92ZXJUaHJlc2hvbGRUb2tlbnM6IFtdIH07XG5cbiAgICBjb25zdCBlbGlnaWJsZUlkcyA9IG5ldyBTZXQoXG4gICAgICByb3dzLmZpbHRlcigodG9rZW4pID0+ICF0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSkubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aHJlc2hvbGRlZC5tYXAoYXN5bmMgKHRva2VuKSA9PiAoe1xuICAgICAgICB0b2tlbixcbiAgICAgICAgcmVzdWx0OiBhd2FpdCByZWFkQW50aHJvcGljUXVvdGFVc2FnZSh0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbiwgbW9kZWwpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGNoZWNrLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiID8gdGhyZXNob2xkZWRbaW5kZXhdIDogY2hlY2sudmFsdWUudG9rZW47XG4gICAgICBpZiAoIXRva2VuKSByZXR1cm47XG4gICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjaGVjay5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCJcbiAgICAgICAgICA/IGNoZWNrLnZhbHVlLnJlc3VsdFxuICAgICAgICAgIDogeyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiBhcyBjb25zdCwgcmVhc29uOiBTdHJpbmcoY2hlY2sucmVhc29uKSB9O1xuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikge1xuICAgICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBsb29rdXBfZmFpbF9vcGVuXCIsIHtcbiAgICAgICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgICAgIGxvb2t1cFJlYXNvbjogcmVzdWx0LnJlYXNvbixcbiAgICAgICAgfSk7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0b2tlbi5xdW90YVRocmVzaG9sZCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBvdmVyX3RocmVzaG9sZFwiLCB7XG4gICAgICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgY2FjaGVkVXRpbGl6YXRpb246IHJlc3VsdC51dGlsaXphdGlvblBjdCxcbiAgICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgICAgcmVhc29uOiBcIm92ZXJfdGhyZXNob2xkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IHRva2VuLm5hbWUsIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLmZpbHRlcigodG9rZW4pID0+IGVsaWdpYmxlSWRzLmhhcyh0b2tlbi5pZCkpLCBvdmVyVGhyZXNob2xkVG9rZW5zIH07XG4gIH1cblxuICBoYXNRdW90YVRocmVzaG9sZCh0b2tlbjogUG9vbGVkVG9rZW4pOiB0b2tlbiBpcyBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4gdG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEsICgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4ocmVxLCBjYi5vbkRlbHRhLCB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHRydWUgfSk7XG4gICAgICBjYi5vblRocmVhZElkPy4ocmVzdWx0LnRocmVhZENvb3JkLnRocmVhZElkKTtcbiAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYi5vbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bihcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBvbkRlbHRhOiAodDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIG9wdHM/OiB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmluRmxpZ2h0Kys7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImltYWdlIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgQW50aHJvcGljIHJvdXRlXCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICAgICAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxBbnRocm9waWNNb2RlbChyZXEubW9kZWwpO1xuICAgICAgY29uc3QgdGhpbmtpbmcgPSByZXNvbHZlQW50aHJvcGljVGhpbmtpbmcobW9kZWwsIHJlcS50aGlua2luZywgcmVxLmVmZm9ydCk7XG4gICAgICBhc3NlcnRBbnRocm9waWNUaGlua2luZ1J1bnRpbWUodGhpbmtpbmcuZXh0cmFCb2R5KTtcbiAgICAgIGNvbnN0IGpzb25TY2hlbWEgPSBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKHJlcS5vdXRwdXRTY2hlbWEsIFwiYW50aHJvcGljXCIpO1xuXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuc2VsZWN0VG9rZW4obW9kZWwsIHJlcS5wcmVmZXJyZWRUb2tlbklkKTtcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcihcIk5vIGFudGhyb3BpYyB0b2tlbnMgYXZhaWxhYmxlXCIpO1xuXG4gICAgICAvLyDrp4zro4wg7KeB7KCE7JeQIOqwseyLoO2VmOuQmCDsi6TtjKjtlZjrqbQg6riw7KG0IO2GoO2BsOycvOuhnCDsp4TtlontlZzri6QuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IGdldEV4cGlyZXNBdCh0b2tlbi5jcmVkZW50aWFscyk7XG4gICAgICBpZiAoXG4gICAgICAgIGV4cGlyZXNBdCAmJlxuICAgICAgICBleHBpcmVzQXQgLSBEYXRlLm5vdygpIDwgUkVGUkVTSF9TQUZFVFlfTVMgJiZcbiAgICAgICAgZ2V0UmVmcmVzaFRva2VuKHRva2VuLmNyZWRlbnRpYWxzKVxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBRZ3JpZEZyYW1lIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgICAvLyBwcm92aWRlciDrpbwg67CY65Oc7IucIOyxhOybjOyVvCByZWZyZXNoVG9rZW4g64K067aAIFRva2VuTW9kZWwuc2F2ZSDqsIAg7ISx6rO17ZWc64ukLlxuICAgICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4oe1xuICAgICAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHRva2VuLmNyZWRlbnRpYWxzLFxuICAgICAgICAgIH0gYXMgUGFyYW1ldGVyczx0eXBlb2YgUWdyaWRGcmFtZS5yZWZyZXNoVG9rZW4+WzBdKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhg4oaSICR7dG9rZW4ubmFtZX0gKG1vZGVsOiAke21vZGVsfSlgKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBydW5DbGF1ZGVTZXNzaW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICAgICAgdG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHN5c3RlbTogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICBqc29uU2NoZW1hLFxuICAgICAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCxcbiAgICAgICAgICB0aGlua2luZzogcmVxLnRoaW5raW5nLFxuICAgICAgICAgIHRpbWVvdXRNczogcmVxLnRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBpbnB1dDogcmVxLmNvbGRJbnB1dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbDogcmVxLmFib3J0U2lnbmFsLFxuICAgICAgICAgIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IG9wdHM/LmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9uRGVsdGEsXG4gICAgICApO1xuXG4gICAgICBpZiAoc2Vzc2lvbi5xdW90YUV4aGF1c3RlZCkge1xuICAgICAgICBpbnZhbGlkYXRlQW50aHJvcGljUXVvdGFVc2FnZSh0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChhY2Nlc3NUb2tlbiAhPT0gdG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICBpbnZhbGlkYXRlQW50aHJvcGljUXVvdGFVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBxdW90YSBleGhhdXN0ZWQgKCR7dG9rZW4ubmFtZX0pYCk7XG4gICAgICB9XG4gICAgICBpZiAoc2Vzc2lvbi5pc0Vycm9yKSB7XG4gICAgICAgIC8vIOyiheujjCDsgqzsnKDrpbwg66i87KCAIO2RnOyLnO2VmOqzoCDsnZHri7Ug67O466y47J2AIOynhOuLqOyXkCDtlYTsmpTtlZwg66eM7YG866eMIOuCqOq4tOuLpC5cbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICBzZXNzaW9uLnN1YnR5cGUgPz8gc2Vzc2lvbi50ZXJtaW5hbFJlYXNvbiA/PyAoc2Vzc2lvbi5pc0Vycm9yID8gXCJpc19lcnJvclwiIDogXCJ1bmtub3duXCIpO1xuICAgICAgICBjb25zdCBib2R5ID0gc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgPyBzZXNzaW9uLnRleHQubGVuZ3RoID4gNTAwXG4gICAgICAgICAgICA/IGAke3Nlc3Npb24udGV4dC5zbGljZSgwLCA1MDApfeKApigke3Nlc3Npb24udGV4dC5sZW5ndGh9IGNoYXJzKWBcbiAgICAgICAgICAgIDogc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgOiBgZW1wdHkgdGV4dCwgb3V0cHV0VG9rZW5zPSR7c2Vzc2lvbi51c2FnZS5vdXRwdXRUb2tlbnN9YDtcbiAgICAgICAgY29uc3QgcmVmdXNhbCA9IHNlc3Npb24ucmVmdXNhbCA/IGAgcmVmdXNhbD0ke0pTT04uc3RyaW5naWZ5KHNlc3Npb24ucmVmdXNhbCl9YCA6IFwiXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY2xhdWRlIGVycm9yICgke3Rva2VuLm5hbWV9KSBbJHtyZWFzb259XTogJHtib2R5fSR7cmVmdXNhbH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogc2Vzc2lvbi50ZXh0LFxuICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgIHVzYWdlOiBzZXNzaW9uLnVzYWdlLFxuICAgICAgICBkdXJhdGlvbk1zOiBzZXNzaW9uLmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRNczogc2Vzc2lvbi50dGZ0TXMsXG4gICAgICAgIGNvc3RVc2Q6IHNlc3Npb24uY29zdFVzZCxcbiAgICAgICAgLy8gQ2xhdWRlIENvZGXsnZgg66qo6424IGZhbGxiYWNr7J2EIOu5hOyaqcK36rCQ7IKsIOuhnOq3uOyXkCDrsJjsmIHtlZzri6QuXG4gICAgICAgIG1vZGVsOiBzZXNzaW9uLnNlcnZlZE1vZGVsID8/IG1vZGVsLFxuICAgICAgICByZXF1ZXN0ZWRNb2RlbDogbW9kZWwsXG4gICAgICAgIG1vZGVsRmFsbGJhY2tzOiBzZXNzaW9uLm1vZGVsRmFsbGJhY2tzLFxuICAgICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICAgIHdvcmtlcklkOiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW4uaWQpLFxuICAgICAgICAgIHRocmVhZElkOiBzZXNzaW9uLnNlc3Npb25JZCxcbiAgICAgICAgICBlcG9jaDogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5GbGlnaHQtLTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsc0JBQXNCLENBQUM7QUFHMUQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxvQkFBb0I7QUFVMUIsSUFBYSxzQkFBYixNQUErRDtDQUM3RCw0QkFBWSxJQUFJLElBQXlCO0NBQ3pDLG1CQUE0QixJQUFJLHlCQUF5QjtDQUN6RCxXQUFXO0NBRVgsTUFBTSxRQUF1QjtFQUczQixPQURxQixXQUFXLHFCQUFxQixLQUFLLFdBQVcsRUFDckUsQ0FBTyxTQUFTLE1BQU07R0FDcEIsS0FBSyxVQUFVLElBQUksRUFBRSxJQUFJO0lBQ3ZCLElBQUksRUFBRTtJQUNOLE1BQU0sRUFBRTtJQUNSLGFBQWEsRUFBRTtJQUNmLGdCQUFnQixFQUFFO0lBQ2xCLFFBQVEsRUFBRTtHQUNaLENBQUM7R0FDRCxLQUFLLGlCQUFpQixTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU07R0FDN0MsT0FBTyxLQUFLLG1CQUFtQixFQUFFLE1BQU07RUFDekMsQ0FBQztDQUNIO0NBRUEsTUFBTSxPQUFzQjtFQUUxQixDQURrQixHQUFHLEtBQUssVUFBVSxLQUFLLENBQ3pDLENBQUEsQ0FBUyxTQUFTLE9BQU8sS0FBSyxpQkFB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
@@ -0,0 +1,55 @@
1
+ import { canonicalAnthropicModel, usesAdaptiveThinking } from "./anthropic-constants.js";
2
+ import { resolveAnthropicEffort } from "../common/effort.js";
3
+ import { ThinkingValidationError } from "../common/thinking.js";
4
+ import { execFileSync } from "node:child_process";
5
+ //#region src/utils/providers/anthropic/anthropic-thinking.ts
6
+ const THINKING_OFF_MODELS = /* @__PURE__ */ new Set([
7
+ "claude-haiku-4-5",
8
+ "claude-sonnet-4-5",
9
+ "claude-sonnet-4-6",
10
+ "claude-sonnet-5",
11
+ "claude-opus-4-5",
12
+ "claude-opus-4-6",
13
+ "claude-opus-4-7",
14
+ "claude-opus-4-8",
15
+ "claude-opus-5",
16
+ "claude-haiku-5-5",
17
+ "claude-sonnet-5-5"
18
+ ]);
19
+ let extraBodyRuntimeSupported;
20
+ /** These modes were verified through native extra-body delivery on Claude Code 2.1.295. */
21
+ function assertAnthropicThinkingRuntime(extraBody) {
22
+ if (!extraBody) return;
23
+ if (extraBodyRuntimeSupported === void 0) try {
24
+ const [major, minor, patch] = execFileSync("claude", ["--version"], {
25
+ encoding: "utf8",
26
+ timeout: 5e3,
27
+ stdio: [
28
+ "ignore",
29
+ "pipe",
30
+ "pipe"
31
+ ],
32
+ env: {
33
+ PATH: process.env.PATH,
34
+ TMPDIR: process.env.TMPDIR
35
+ }
36
+ }).match(/^(\d+)\.(\d+)\.(\d+)/)?.slice(1).map(Number) ?? [];
37
+ extraBodyRuntimeSupported = major !== void 0 && minor !== void 0 && patch !== void 0 && (major > 2 || major === 2 && (minor > 1 || minor === 1 && patch >= 295));
38
+ } catch {
39
+ extraBodyRuntimeSupported = false;
40
+ }
41
+ if (!extraBodyRuntimeSupported) throw new ThinkingValidationError("thinking:false for Haiku 5.5 and Sonnet 5.5 requires Claude Code 2.1.295 or later; runtime version could not be verified");
42
+ }
43
+ function resolveAnthropicThinking(model, thinking, effort) {
44
+ const canonical = canonicalAnthropicModel(model);
45
+ if (thinking === false && !THINKING_OFF_MODELS.has(canonical)) throw new ThinkingValidationError(`thinking:false is not supported for anthropic/${canonical}: ${usesAdaptiveThinking(canonical) ? "this model requires thinking" : "thinking-off support has not been verified for this model"}`);
46
+ return {
47
+ extraBody: thinking === false && (canonical === "claude-haiku-5-5" || canonical === "claude-sonnet-5-5") ? JSON.stringify({ thinking: { type: canonical === "claude-sonnet-5-5" ? "between_tools" : "disabled" } }) : void 0,
48
+ mode: thinking === true ? "adaptive" : thinking === false || !usesAdaptiveThinking(canonical) ? "disabled" : void 0,
49
+ effort: thinking === false ? "low" : resolveAnthropicEffort(effort) ?? "low"
50
+ };
51
+ }
52
+ //#endregion
53
+ export { assertAnthropicThinkingRuntime, resolveAnthropicThinking };
54
+
55
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLXRoaW5raW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy10aGlua2luZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbmltcG9ydCB7IHJlc29sdmVBbnRocm9waWNFZmZvcnQgfSBmcm9tIFwiLi4vY29tbW9uL2VmZm9ydFwiO1xuaW1wb3J0IHsgVGhpbmtpbmdWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uL3RoaW5raW5nXCI7XG5pbXBvcnQge1xuICBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlQsXG4gIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsLFxuICB1c2VzQWRhcHRpdmVUaGlua2luZyxcbn0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuXG5jb25zdCBUSElOS0lOR19PRkZfTU9ERUxTID0gbmV3IFNldChbXG4gIFwiY2xhdWRlLWhhaWt1LTQtNVwiLFxuICBcImNsYXVkZS1zb25uZXQtNC01XCIsXG4gIFwiY2xhdWRlLXNvbm5ldC00LTZcIixcbiAgXCJjbGF1ZGUtc29ubmV0LTVcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTVcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTZcIixcbiAgXCJjbGF1ZGUtb3B1cy00LTdcIixcbiAgXCJjbGF1ZGUtb3B1cy00LThcIixcbiAgXCJjbGF1ZGUtb3B1cy01XCIsXG4gIFwiY2xhdWRlLWhhaWt1LTUtNVwiLFxuICBcImNsYXVkZS1zb25uZXQtNS01XCIsXG5dKTtcblxubGV0IGV4dHJhQm9keVJ1bnRpbWVTdXBwb3J0ZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbi8qKiBUaGVzZSBtb2RlcyB3ZXJlIHZlcmlmaWVkIHRocm91Z2ggbmF0aXZlIGV4dHJhLWJvZHkgZGVsaXZlcnkgb24gQ2xhdWRlIENvZGUgMi4xLjI5NS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBbnRocm9waWNUaGlua2luZ1J1bnRpbWUoZXh0cmFCb2R5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFleHRyYUJvZHkpIHJldHVybjtcbiAgaWYgKGV4dHJhQm9keVJ1bnRpbWVTdXBwb3J0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gZXhlY0ZpbGVTeW5jKFwiY2xhdWRlXCIsIFtcIi0tdmVyc2lvblwiXSwge1xuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgZW52OiB7IFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSIH0sXG4gICAgICB9KS5tYXRjaCgvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKS8pO1xuICAgICAgY29uc3QgW21ham9yLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvbj8uc2xpY2UoMSkubWFwKE51bWJlcikgPz8gW107XG4gICAgICBleHRyYUJvZHlSdW50aW1lU3VwcG9ydGVkID1cbiAgICAgICAgbWFqb3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBtaW5vciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhdGNoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKG1ham9yID4gMiB8fCAobWFqb3IgPT09IDIgJiYgKG1pbm9yID4gMSB8fCAobWlub3IgPT09IDEgJiYgcGF0Y2ggPj0gMjk1KSkpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGV4dHJhQm9keVJ1bnRpbWVTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFleHRyYUJvZHlSdW50aW1lU3VwcG9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IFRoaW5raW5nVmFsaWRhdGlvbkVycm9yKFxuICAgICAgXCJ0aGlua2luZzpmYWxzZSBmb3IgSGFpa3UgNS41IGFuZCBTb25uZXQgNS41IHJlcXVpcmVzIENsYXVkZSBDb2RlIDIuMS4yOTUgb3IgbGF0ZXI7IHJ1bnRpbWUgdmVyc2lvbiBjb3VsZCBub3QgYmUgdmVyaWZpZWRcIixcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQW50aHJvcGljVGhpbmtpbmcobW9kZWw6IHN0cmluZywgdGhpbmtpbmc/OiBib29sZWFuLCBlZmZvcnQ/OiBzdHJpbmcpIHtcbiAgY29uc3QgY2Fub25pY2FsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpO1xuICBpZiAodGhpbmtpbmcgPT09IGZhbHNlICYmICFUSElOS0lOR19PRkZfTU9ERUxTLmhhcyhjYW5vbmljYWwpKSB7XG4gICAgY29uc3QgcmVhc29uID0gdXNlc0FkYXB0aXZlVGhpbmtpbmcoY2Fub25pY2FsKVxuICAgICAgPyBcInRoaXMgbW9kZWwgcmVxdWlyZXMgdGhpbmtpbmdcIlxuICAgICAgOiBcInRoaW5raW5nLW9mZiBzdXBwb3J0IGhhcyBub3QgYmVlbiB2ZXJpZmllZCBmb3IgdGhpcyBtb2RlbFwiO1xuICAgIHRocm93IG5ldyBUaGlua2luZ1ZhbGlkYXRpb25FcnJvcihcbiAgICAgIGB0aGlua2luZzpmYWxzZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbnRocm9waWMvJHtjYW5vbmljYWx9OiAke3JlYXNvbn1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAvLyBOZXZlciBhY2NlcHQgY2FsbGVyLXByb3ZpZGVkIGV4dHJhIGJvZHkgZGF0YSBvciBpbmhlcml0IGl0IGZyb20gdGhlIGhvc3QgZW52aXJvbm1lbnQuXG4gICAgZXh0cmFCb2R5OlxuICAgICAgdGhpbmtpbmcgPT09IGZhbHNlICYmIChjYW5vbmljYWwgPT09IFwiY2xhdWRlLWhhaWt1LTUtNVwiIHx8IGNhbm9uaWNhbCA9PT0gXCJjbGF1ZGUtc29ubmV0LTUtNVwiKVxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHRoaW5raW5nOiB7IHR5cGU6IGNhbm9uaWNhbCA9PT0gXCJjbGF1ZGUtc29ubmV0LTUtNVwiID8gXCJiZXR3ZWVuX3Rvb2xzXCIgOiBcImRpc2FibGVkXCIgfSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBtb2RlOlxuICAgICAgdGhpbmtpbmcgPT09IHRydWVcbiAgICAgICAgPyAoXCJhZGFwdGl2ZVwiIGFzIGNvbnN0KVxuICAgICAgICA6IHRoaW5raW5nID09PSBmYWxzZSB8fCAhdXNlc0FkYXB0aXZlVGhpbmtpbmcoY2Fub25pY2FsKVxuICAgICAgICAgID8gKFwiZGlzYWJsZWRcIiBhcyBjb25zdClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBlZmZvcnQ6XG4gICAgICB0aGlua2luZyA9PT0gZmFsc2VcbiAgICAgICAgPyBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlRcbiAgICAgICAgOiAocmVzb2x2ZUFudGhyb3BpY0VmZm9ydChlZmZvcnQpID8/IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCksXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBVUEsTUFBTSxzQ0FBc0IsSUFBSSxJQUFJO0NBQ2xDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBRUQsSUFBSTs7QUFHSixTQUFnQiwrQkFBK0IsV0FBcUM7Q0FDbEYsSUFBSSxDQUFDLFdBQVc7Q0FDaEIsSUFBSSw4QkFBOEIsUUFDaEMsSUFBSTtFQU9GLE1BQU0sQ0FBQyxPQUFPLE9BQU8sU0FOTCxhQUFhLFVBQVUsQ0FBQyxXQUFXLEdBQUc7R0FDcEQsVUFBVTtHQUNWLFNBQVM7R0FDVCxPQUFPO0lBQUM7SUFBVTtJQUFRO0dBQU07R0FDaEMsS0FBSztJQUFFLE1BQU0sUUFBUSxJQUFJO0lBQU0sUUFBUSxRQUFRLElBQUk7R0FBTztFQUM1RCxDQUFDLENBQUMsQ0FBQyxNQUFNLHNCQUNxQixDQUFBLEVBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDO0VBQ2hFLDRCQUNFLFVBQVUsVUFDVixVQUFVLFVBQ1YsVUFBVSxXQUNULFFBQVEsS0FBTSxVQUFVLE1BQU0sUUFBUSxLQUFNLFVBQVUsS0FBSyxTQUFTO0NBQ3pFLFFBQVE7RUFDTiw0QkFBNEI7Q0FDOUI7Q0FFRixJQUFJLENBQUMsMkJBQ0gsTUFBTSxJQUFJLHdCQUNSLDBIQUNGO0FBRUo7QUFFQSxTQUFnQix5QkFBeUIsT0FBZSxVQUFvQixRQUFpQjtDQUMzRixNQUFNLFlBQVksd0JBQXdCLEtBQUs7Q0FDL0MsSUFBSSxhQUFhLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxTQUFTLEdBSTFELE1BQU0sSUFBSSx3QkFDUixpREFBaUQsVUFBVSxJQUo5QyxxQkFBcUIsU0FBUyxJQUN6QyxpQ0FDQSw2REFHSjtDQUVGLE9BQU87RUFFTCxXQUNFLGFBQWEsVUFBVSxjQUFjLHNCQUFzQixjQUFjLHVCQUNyRSxLQUFLLFVBQVUsRUFDYixVQUFVLEVBQUUsTUFBTSxjQUFjLHNCQUFzQixrQkFBa0IsV0FBVyxFQUNyRixDQUFDLElBQ0Q7RUFDTixNQUNFLGFBQWEsT0FDUixhQUNELGFBQWEsU0FBUyxDQUFDLHFCQUFxQixTQUFTLElBQ2xELGFBQ0Q7RUFDUixRQUNFLGFBQWEsUUFBQSxRQUVSLHVCQUF1QixNQUFNLEtBQUE7Q0FDdEM7QUFDRiJ9