@dbx-tools/appkit-mastra 0.9.140 → 0.9.143

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.
package/lib/src/chat.d.ts CHANGED
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import type { MastraPluginConfig } from "./config.ts";
6
7
  /** Client request cancellation is detached only for evented background agents. */
7
8
  export declare function agentAbortSignal(agent: unknown, signal: AbortSignal): AbortSignal | undefined;
8
9
  /** Register detached chat, durable observation, and explicit abort routes. */
9
- export declare function agentChatRoutes(): import("@mastra/core/server").ApiRoute[];
10
+ export declare function agentChatRoutes(config?: MastraPluginConfig): import("@mastra/core/server").ApiRoute[];
package/lib/src/chat.js CHANGED
@@ -3,21 +3,46 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { errorUtils, log } from "@dbx-tools/shared-core";
6
+ import { errorUtils, log, object } from "@dbx-tools/shared-core";
7
7
  import { routes } from "@dbx-tools/shared-mastra";
8
8
  import { isStaleMastraResumeError, STALE_MASTRA_RESUME_STREAM_TEXT, } from "@dbx-tools/shared-mastra/resume";
9
9
  import { handleChatStream, toAISdkStream } from "@mastra/ai-sdk";
10
10
  import { isEventedAgent } from "@mastra/core/agent/durable";
11
11
  import { registerApiRoute } from "@mastra/core/server";
12
12
  import { createUIMessageStreamResponse } from "ai";
13
+ import { buildFollowUpSuggestionsTransform, FOLLOW_UP_NATIVE_QUESTIONS_KEY, FOLLOW_UP_RUN_ID_KEY, FOLLOW_UP_USER_TEXT_KEY, resolveFollowUpSuggestionsConfig, } from "./follow-up-suggestions.js";
13
14
  import { withRequestMemoryScope } from "./memory.js";
14
15
  const logger = log.logger("mastra/chat");
15
16
  /** Client request cancellation is detached only for evented background agents. */
16
17
  export function agentAbortSignal(agent, signal) {
17
18
  return isEventedAgent(agent) ? undefined : signal;
18
19
  }
20
+ function latestUserText(value) {
21
+ if (!Array.isArray(value))
22
+ return undefined;
23
+ for (let index = value.length - 1; index >= 0; index -= 1) {
24
+ const message = value[index];
25
+ if (!object.isRecord(message) || message.role !== "user")
26
+ continue;
27
+ if (typeof message.content === "string" && message.content.trim()) {
28
+ return message.content.trim();
29
+ }
30
+ if (!Array.isArray(message.parts))
31
+ continue;
32
+ const text = message.parts
33
+ .flatMap((part) => object.isRecord(part) && part.type === "text" && typeof part.text === "string"
34
+ ? [part.text]
35
+ : [])
36
+ .join("\n")
37
+ .trim();
38
+ if (text)
39
+ return text;
40
+ }
41
+ return undefined;
42
+ }
19
43
  /** Register detached chat, durable observation, and explicit abort routes. */
20
- export function agentChatRoutes() {
44
+ export function agentChatRoutes(config = {}) {
45
+ const followUps = resolveFollowUpSuggestionsConfig(config.followUpSuggestions);
21
46
  const chatPath = `${routes.MASTRA_ROUTES.chat}/:agentId`;
22
47
  const runPath = `${routes.MASTRA_ROUTES.chat}/:agentId${routes.MASTRA_ROUTES.runs}/:runId`;
23
48
  const abortPath = `${runPath}${routes.MASTRA_ROUTES.abort}`;
@@ -47,6 +72,12 @@ export function agentChatRoutes() {
47
72
  }
48
73
  const status = rawStatus;
49
74
  const abortSignal = agentAbortSignal(mastra.getAgentById(agentId), context.req.raw.signal);
75
+ const runId = typeof params.runId === "string" && params.runId ? params.runId : crypto.randomUUID();
76
+ const userText = latestUserText(params.messages);
77
+ if (userText)
78
+ requestContext.setRaw(FOLLOW_UP_USER_TEXT_KEY, userText);
79
+ requestContext.setRaw(FOLLOW_UP_NATIVE_QUESTIONS_KEY, []);
80
+ requestContext.setRaw(FOLLOW_UP_RUN_ID_KEY, runId);
50
81
  const stream = await handleChatStream({
51
82
  mastra,
52
83
  agentId,
@@ -57,9 +88,13 @@ export function agentChatRoutes() {
57
88
  : {}),
58
89
  params: withRequestMemoryScope({
59
90
  ...params,
91
+ runId,
60
92
  requestContext,
61
93
  ...(abortSignal ? { abortSignal } : {}),
62
94
  }, requestContext),
95
+ ...(followUps && followUps.mode !== "genie"
96
+ ? { experimentalTransform: buildFollowUpSuggestionsTransform(runId) }
97
+ : {}),
63
98
  version: "v7",
64
99
  sendReasoning: true,
65
100
  sendSources: true,
@@ -83,6 +118,9 @@ export function agentChatRoutes() {
83
118
  const observed = await agent.observe(runId);
84
119
  const stream = toAISdkStream(observed.output, {
85
120
  from: "agent",
121
+ ...(followUps && followUps.mode !== "genie"
122
+ ? { experimentalTransform: buildFollowUpSuggestionsTransform(runId) }
123
+ : {}),
86
124
  version: "v7",
87
125
  sendReasoning: true,
88
126
  sendSources: true,
@@ -122,4 +160,4 @@ function serializeChatStreamError(error) {
122
160
  }
123
161
  return errorUtils.errorMessage(error);
124
162
  }
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLCtCQUErQixHQUNoQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXpDLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYyxFQUFFLE1BQW1CO0lBQ2xFLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNwRCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sUUFBUSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQWtDLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQ1gsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksU0FBK0MsQ0FBQztJQUNuSCxNQUFNLFNBQVMs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bnRlbnQiOlsiLyoqXG4gKiBPZmZpY2lhbCBNYXN0cmEgQUkgU0RLIGNoYXQgcm91dGVzIGZvciBicm93c2VyLWNvbXBhdGlibGUgVUkgc3RyZWFtcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHJvdXRlcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7XG4gIGlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcixcbiAgU1RBTEVfTUFTVFJBX1JFU1VNRV9TVFJFQU1fVEVYVCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYS9yZXN1bWVcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRTdHJlYW0sIHRvQUlTZGtTdHJlYW0gfSBmcm9tIFwiQG1hc3RyYS9haS1zZGtcIjtcbmltcG9ydCB7IGlzRXZlbnRlZEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudC9kdXJhYmxlXCI7XG5pbXBvcnQgeyByZWdpc3RlckFwaVJvdXRlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9zZXJ2ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlIH0gZnJvbSBcImFpXCI7XG5cbmltcG9ydCB7IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGF0XCIpO1xuXG4vKiogQ2xpZW50IHJlcXVlc3QgY2FuY2VsbGF0aW9uIGlzIGRldGFjaGVkIG9ubHkgZm9yIGV2ZW50ZWQgYmFja2dyb3VuZCBhZ2VudHMuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRBYm9ydFNpZ25hbChhZ2VudDogdW5rbm93biwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzRXZlbnRlZEFnZW50KGFnZW50KSA/IHVuZGVmaW5lZCA6IHNpZ25hbDtcbn1cblxuLyoqIFJlZ2lzdGVyIGRldGFjaGVkIGNoYXQsIGR1cmFibGUgb2JzZXJ2YXRpb24sIGFuZCBleHBsaWNpdCBhYm9ydCByb3V0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRDaGF0Um91dGVzKCkge1xuICBjb25zdCBjaGF0UGF0aCA9IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmNoYXR9LzphZ2VudElkYCBhcyBgJHtzdHJpbmd9OmFnZW50SWRgO1xuICBjb25zdCBydW5QYXRoID1cbiAgICBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5jaGF0fS86YWdlbnRJZCR7cm91dGVzLk1BU1RSQV9ST1VURVMucnVuc30vOnJ1bklkYCBhcyBgJHtzdHJpbmd9OmFnZW50SWQke3N0cmluZ306cnVuSWRgO1xuICBjb25zdCBhYm9ydFBhdGggPVxuICAgIGAke3J1blBhdGh9JHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5hYm9ydH1gIGFzIGAke3N0cmluZ306YWdlbnRJZCR7c3RyaW5nfTpydW5JZCR7c3RyaW5nfWA7XG4gIHJldHVybiBbXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShjaGF0UGF0aCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGNvbnRleHQucmVxLmpzb24oKTtcbiAgICAgICAgY29uc3QgbWFzdHJhID0gY29udGV4dC5nZXQoXCJtYXN0cmFcIik7XG4gICAgICAgIGNvbnN0IGFnZW50SWQgPSBjb250ZXh0LnJlcS5wYXJhbShcImFnZW50SWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCkgdGhyb3cgbmV3IEVycm9yKFwiQWdlbnQgSUQgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIGNvbnN0IG1pZGRsZXdhcmVSZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQuZ2V0KFwicmVxdWVzdENvbnRleHRcIik7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gbWlkZGxld2FyZVJlcXVlc3RDb250ZXh0IHx8IHBhcmFtcy5yZXF1ZXN0Q29udGV4dDtcbiAgICAgICAgaWYgKG1pZGRsZXdhcmVSZXF1ZXN0Q29udGV4dCAmJiBwYXJhbXMucmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgICBtYXN0cmFcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy53YXJuKCdNdWx0aXBsZSBcInJlcXVlc3RDb250ZXh0XCIgc291cmNlcyBwcm92aWRlZC4gVXNpbmcgbWlkZGxld2FyZSBjb250ZXh0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcnNpb25JZCA9IGNvbnRleHQucmVxLnF1ZXJ5KFwidmVyc2lvbklkXCIpO1xuICAgICAgICBjb25zdCByYXdTdGF0dXMgPSBjb250ZXh0LnJlcS5xdWVyeShcInN0YXR1c1wiKTtcbiAgICAgICAgaWYgKHZlcnNpb25JZCAmJiByYXdTdGF0dXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtZXRlcnMgXCJ2ZXJzaW9uSWRcIiBhbmQgXCJzdGF0dXNcIiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhd1N0YXR1cyAmJiByYXdTdGF0dXMgIT09IFwiZHJhZnRcIiAmJiByYXdTdGF0dXMgIT09IFwicHVibGlzaGVkXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtZXRlciBcInN0YXR1c1wiIG11c3QgYmUgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSByYXdTdGF0dXMgYXMgXCJkcmFmdFwiIHwgXCJwdWJsaXNoZWRcIiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYWJvcnRTaWduYWwgPSBhZ2VudEFib3J0U2lnbmFsKG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCksIGNvbnRleHQucmVxLnJhdy5zaWduYWwpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBoYW5kbGVDaGF0U3RyZWFtKHtcbiAgICAgICAgICBtYXN0cmEsXG4gICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAuLi4odmVyc2lvbklkXG4gICAgICAgICAgICA/IHsgYWdlbnRWZXJzaW9uOiB7IHZlcnNpb25JZCB9IH1cbiAgICAgICAgICAgIDogc3RhdHVzXG4gICAgICAgICAgICAgID8geyBhZ2VudFZlcnNpb246IHsgc3RhdHVzIH0gfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICBwYXJhbXM6IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICApLFxuICAgICAgICAgIHZlcnNpb246IFwidjdcIixcbiAgICAgICAgICBzZW5kUmVhc29uaW5nOiB0cnVlLFxuICAgICAgICAgIHNlbmRTb3VyY2VzOiB0cnVlLFxuICAgICAgICAgIG9uRXJyb3I6IHNlcmlhbGl6ZUNoYXRTdHJlYW1FcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVVSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSh7IHN0cmVhbSB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShydW5QYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBtYXN0cmEgPSBjb250ZXh0LmdldChcIm1hc3RyYVwiKTtcbiAgICAgICAgY29uc3QgYWdlbnRJZCA9IGNvbnRleHQucmVxLnBhcmFtKFwiYWdlbnRJZFwiKTtcbiAgICAgICAgY29uc3QgcnVuSWQgPSBjb250ZXh0LnJlcS5wYXJhbShcInJ1bklkXCIpO1xuICAgICAgICBpZiAoIWFnZW50SWQgfHwgIXJ1bklkKSB0aHJvdyBuZXcgRXJyb3IoXCJBZ2VudCBJRCBhbmQgcnVuIElEIGFyZSByZXF1aXJlZFwiKTtcbiAgICAgICAgY29uc3QgYWdlbnQgPSBtYXN0cmEuZ2V0QWdlbnRCeUlkKGFnZW50SWQpO1xuICAgICAgICBpZiAoIWlzRXZlbnRlZEFnZW50KGFnZW50KSkge1xuICAgICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgICAgICAgICAgeyBlcnJvcjogYEFnZW50ICR7YWdlbnRJZH0gZG9lcyBub3Qgc3VwcG9ydCBiYWNrZ3JvdW5kIHR1cm5zYCB9LFxuICAgICAgICAgICAgeyBzdGF0dXM6IDQwOSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzZXJ2ZWQgPSBhd2FpdCBhZ2VudC5vYnNlcnZlKHJ1bklkKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdG9BSVNka1N0cmVhbShvYnNlcnZlZC5vdXRwdXQsIHtcbiAgICAgICAgICBmcm9tOiBcImFnZW50XCIsXG4gICAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAgIHNlbmRSZWFzb25pbmc6IHRydWUsXG4gICAgICAgICAgc2VuZFNvdXJjZXM6IHRydWUsXG4gICAgICAgICAgb25FcnJvcjogc2VyaWFsaXplQ2hhdFN0cmVhbUVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlKHsgc3RyZWFtIH0pO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICByZWdpc3RlckFwaVJvdXRlKGFib3J0UGF0aCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hc3RyYSA9IGNvbnRleHQuZ2V0KFwibWFzdHJhXCIpO1xuICAgICAgICBjb25zdCBhZ2VudElkID0gY29udGV4dC5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgICAgICBjb25zdCBydW5JZCA9IGNvbnRleHQucmVxLnBhcmFtKFwicnVuSWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCB8fCAhcnVuSWQpIHRocm93IG5ldyBFcnJvcihcIkFnZW50IElEIGFuZCBydW4gSUQgYXJlIHJlcXVpcmVkXCIpO1xuICAgICAgICBjb25zdCBhZ2VudCA9IG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCk7XG4gICAgICAgIGlmICghaXNFdmVudGVkQWdlbnQoYWdlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiBgQWdlbnQgJHthZ2VudElkfSBkb2VzIG5vdCBzdXBwb3J0IGJhY2tncm91bmQgdHVybnNgIH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDA5IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IGFib3J0ZWQ6IGFnZW50LmFib3J0UnVuU3RyZWFtKHJ1bklkKSB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gIF07XG59XG5cbi8qKlxuICogS2VlcCBhIGxhdGUgb3IgZHVwbGljYXRlIHJlc3VtZSBmcm9tIGZhaWxpbmcgdGhlIFVJIHN0cmVhbS4gTWFzdHJhJ3NcbiAqIHJlc3VtZSBwYXRoIGNhbiBzdXJmYWNlIGEgd29ya2Zsb3cgZXJyb3IgYWZ0ZXIgYW5vdGhlciBjbGllbnQgYWxyZWFkeVxuICogcmVzb2x2ZWQgdGhlIHNhbWUgYXBwcm92YWwuXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZUNoYXRTdHJlYW1FcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChpc1N0YWxlTWFzdHJhUmVzdW1lRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJpZ25vcmVkIHN0YWxlIG1hc3RyYSByZXN1bWVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgfSk7XG4gICAgcmV0dXJuIFNUQUxFX01BU1RSQV9SRVNVTUVfU1RSRUFNX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKTtcbn1cbiJdfQ==
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwrQkFBK0IsR0FDaEMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLElBQUksQ0FBQztBQUduRCxPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLDhCQUE4QixFQUM5QixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLGdDQUFnQyxHQUNqQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXpDLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYyxFQUFFLE1BQW1CO0lBQ2xFLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNwRCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1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QUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSztvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQzVFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUNsQixFQUFFLEtBQUssRUFBRSxTQUFTLE9BQU8sb0NBQW9DLEVBQUUsRUFDL0QsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQ2hCLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztTQUNGLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEtBQWM7SUFDOUMsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDekMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUNILE9BQU8sK0JBQStCLENBQUM7SUFDekMsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPZmZpY2lhbCBNYXN0cmEgQUkgU0RLIGNoYXQgcm91dGVzIGZvciBicm93c2VyLWNvbXBhdGlibGUgVUkgc3RyZWFtcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcm91dGVzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHtcbiAgaXNTdGFsZU1hc3RyYVJlc3VtZUVycm9yLFxuICBTVEFMRV9NQVNUUkFfUkVTVU1FX1NUUkVBTV9URVhULFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhL3Jlc3VtZVwiO1xuaW1wb3J0IHsgaGFuZGxlQ2hhdFN0cmVhbSwgdG9BSVNka1N0cmVhbSB9IGZyb20gXCJAbWFzdHJhL2FpLXNka1wiO1xuaW1wb3J0IHsgaXNFdmVudGVkQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50L2R1cmFibGVcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQXBpUm91dGUgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NlcnZlclwiO1xuaW1wb3J0IHsgY3JlYXRlVUlNZXNzYWdlU3RyZWFtUmVzcG9uc2UgfSBmcm9tIFwiYWlcIjtcblxuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGJ1aWxkRm9sbG93VXBTdWdnZXN0aW9uc1RyYW5zZm9ybSxcbiAgRk9MTE9XX1VQX05BVElWRV9RVUVTVElPTlNfS0VZLFxuICBGT0xMT1dfVVBfUlVOX0lEX0tFWSxcbiAgRk9MTE9XX1VQX1VTRVJfVEVYVF9LRVksXG4gIHJlc29sdmVGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnLFxufSBmcm9tIFwiLi9mb2xsb3ctdXAtc3VnZ2VzdGlvbnMudHNcIjtcbmltcG9ydCB7IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGF0XCIpO1xuXG4vKiogQ2xpZW50IHJlcXVlc3QgY2FuY2VsbGF0aW9uIGlzIGRldGFjaGVkIG9ubHkgZm9yIGV2ZW50ZWQgYmFja2dyb3VuZCBhZ2VudHMuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRBYm9ydFNpZ25hbChhZ2VudDogdW5rbm93biwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzRXZlbnRlZEFnZW50KGFnZW50KSA/IHVuZGVmaW5lZCA6IHNpZ25hbDtcbn1cblxuZnVuY3Rpb24gbGF0ZXN0VXNlclRleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IHZhbHVlLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4IC09IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdmFsdWVbaW5kZXhdO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKG1lc3NhZ2UpIHx8IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpIGNvbnRpbnVlO1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiICYmIG1lc3NhZ2UuY29udGVudC50cmltKCkpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQudHJpbSgpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobWVzc2FnZS5wYXJ0cykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRleHQgPSBtZXNzYWdlLnBhcnRzXG4gICAgICAuZmxhdE1hcCgocGFydCkgPT5cbiAgICAgICAgb2JqZWN0LmlzUmVjb3JkKHBhcnQpICYmIHBhcnQudHlwZSA9PT0gXCJ0ZXh0XCIgJiYgdHlwZW9mIHBhcnQudGV4dCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gW3BhcnQudGV4dF1cbiAgICAgICAgICA6IFtdLFxuICAgICAgKVxuICAgICAgLmpvaW4oXCJcXG5cIilcbiAgICAgIC50cmltKCk7XG4gICAgaWYgKHRleHQpIHJldHVybiB0ZXh0O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBSZWdpc3RlciBkZXRhY2hlZCBjaGF0LCBkdXJhYmxlIG9ic2VydmF0aW9uLCBhbmQgZXhwbGljaXQgYWJvcnQgcm91dGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZW50Q2hhdFJvdXRlcyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyA9IHt9KSB7XG4gIGNvbnN0IGZvbGxvd1VwcyA9IHJlc29sdmVGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnKGNvbmZpZy5mb2xsb3dVcFN1Z2dlc3Rpb25zKTtcbiAgY29uc3QgY2hhdFBhdGggPSBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5jaGF0fS86YWdlbnRJZGAgYXMgYCR7c3RyaW5nfTphZ2VudElkYDtcbiAgY29uc3QgcnVuUGF0aCA9XG4gICAgYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuY2hhdH0vOmFnZW50SWQke3JvdXRlcy5NQVNUUkFfUk9VVEVTLnJ1bnN9LzpydW5JZGAgYXMgYCR7c3RyaW5nfTphZ2VudElkJHtzdHJpbmd9OnJ1bklkYDtcbiAgY29uc3QgYWJvcnRQYXRoID1cbiAgICBgJHtydW5QYXRofSR7cm91dGVzLk1BU1RSQV9ST1VURVMuYWJvcnR9YCBhcyBgJHtzdHJpbmd9OmFnZW50SWQke3N0cmluZ306cnVuSWQke3N0cmluZ31gO1xuICByZXR1cm4gW1xuICAgIHJlZ2lzdGVyQXBpUm91dGUoY2hhdFBhdGgsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBhd2FpdCBjb250ZXh0LnJlcS5qc29uKCk7XG4gICAgICAgIGNvbnN0IG1hc3RyYSA9IGNvbnRleHQuZ2V0KFwibWFzdHJhXCIpO1xuICAgICAgICBjb25zdCBhZ2VudElkID0gY29udGV4dC5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgICAgICBpZiAoIWFnZW50SWQpIHRocm93IG5ldyBFcnJvcihcIkFnZW50IElEIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICBjb25zdCBtaWRkbGV3YXJlUmVxdWVzdENvbnRleHQgPSBjb250ZXh0LmdldChcInJlcXVlc3RDb250ZXh0XCIpO1xuICAgICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG1pZGRsZXdhcmVSZXF1ZXN0Q29udGV4dCB8fCBwYXJhbXMucmVxdWVzdENvbnRleHQ7XG4gICAgICAgIGlmIChtaWRkbGV3YXJlUmVxdWVzdENvbnRleHQgJiYgcGFyYW1zLnJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgICAgbWFzdHJhXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgID8ud2FybignTXVsdGlwbGUgXCJyZXF1ZXN0Q29udGV4dFwiIHNvdXJjZXMgcHJvdmlkZWQuIFVzaW5nIG1pZGRsZXdhcmUgY29udGV4dC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ZXJzaW9uSWQgPSBjb250ZXh0LnJlcS5xdWVyeShcInZlcnNpb25JZFwiKTtcbiAgICAgICAgY29uc3QgcmF3U3RhdHVzID0gY29udGV4dC5yZXEucXVlcnkoXCJzdGF0dXNcIik7XG4gICAgICAgIGlmICh2ZXJzaW9uSWQgJiYgcmF3U3RhdHVzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdRdWVyeSBwYXJhbWV0ZXJzIFwidmVyc2lvbklkXCIgYW5kIFwic3RhdHVzXCIgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYXdTdGF0dXMgJiYgcmF3U3RhdHVzICE9PSBcImRyYWZ0XCIgJiYgcmF3U3RhdHVzICE9PSBcInB1Ymxpc2hlZFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdRdWVyeSBwYXJhbWV0ZXIgXCJzdGF0dXNcIiBtdXN0IGJlIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmF3U3RhdHVzIGFzIFwiZHJhZnRcIiB8IFwicHVibGlzaGVkXCIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFib3J0U2lnbmFsID0gYWdlbnRBYm9ydFNpZ25hbChtYXN0cmEuZ2V0QWdlbnRCeUlkKGFnZW50SWQpLCBjb250ZXh0LnJlcS5yYXcuc2lnbmFsKTtcbiAgICAgICAgY29uc3QgcnVuSWQgPVxuICAgICAgICAgIHR5cGVvZiBwYXJhbXMucnVuSWQgPT09IFwic3RyaW5nXCIgJiYgcGFyYW1zLnJ1bklkID8gcGFyYW1zLnJ1bklkIDogY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICAgICAgY29uc3QgdXNlclRleHQgPSBsYXRlc3RVc2VyVGV4dChwYXJhbXMubWVzc2FnZXMpO1xuICAgICAgICBpZiAodXNlclRleHQpIHJlcXVlc3RDb250ZXh0LnNldFJhdyhGT0xMT1dfVVBfVVNFUl9URVhUX0tFWSwgdXNlclRleHQpO1xuICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRSYXcoRk9MTE9XX1VQX05BVElWRV9RVUVTVElPTlNfS0VZLCBbXSk7XG4gICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFJhdyhGT0xMT1dfVVBfUlVOX0lEX0tFWSwgcnVuSWQpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBoYW5kbGVDaGF0U3RyZWFtKHtcbiAgICAgICAgICBtYXN0cmEsXG4gICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAuLi4odmVyc2lvbklkXG4gICAgICAgICAgICA/IHsgYWdlbnRWZXJzaW9uOiB7IHZlcnNpb25JZCB9IH1cbiAgICAgICAgICAgIDogc3RhdHVzXG4gICAgICAgICAgICAgID8geyBhZ2VudFZlcnNpb246IHsgc3RhdHVzIH0gfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICBwYXJhbXM6IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgICAgICAuLi4oYWJvcnRTaWduYWwgPyB7IGFib3J0U2lnbmFsIH0gOiB7fSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi4oZm9sbG93VXBzICYmIGZvbGxvd1Vwcy5tb2RlICE9PSBcImdlbmllXCJcbiAgICAgICAgICAgID8geyBleHBlcmltZW50YWxUcmFuc2Zvcm06IGJ1aWxkRm9sbG93VXBTdWdnZXN0aW9uc1RyYW5zZm9ybShydW5JZCkgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAgIHNlbmRSZWFzb25pbmc6IHRydWUsXG4gICAgICAgICAgc2VuZFNvdXJjZXM6IHRydWUsXG4gICAgICAgICAgb25FcnJvcjogc2VyaWFsaXplQ2hhdFN0cmVhbUVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlKHsgc3RyZWFtIH0pO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICByZWdpc3RlckFwaVJvdXRlKHJ1blBhdGgsIHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hc3RyYSA9IGNvbnRleHQuZ2V0KFwibWFzdHJhXCIpO1xuICAgICAgICBjb25zdCBhZ2VudElkID0gY29udGV4dC5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgICAgICBjb25zdCBydW5JZCA9IGNvbnRleHQucmVxLnBhcmFtKFwicnVuSWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCB8fCAhcnVuSWQpIHRocm93IG5ldyBFcnJvcihcIkFnZW50IElEIGFuZCBydW4gSUQgYXJlIHJlcXVpcmVkXCIpO1xuICAgICAgICBjb25zdCBhZ2VudCA9IG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCk7XG4gICAgICAgIGlmICghaXNFdmVudGVkQWdlbnQoYWdlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiBgQWdlbnQgJHthZ2VudElkfSBkb2VzIG5vdCBzdXBwb3J0IGJhY2tncm91bmQgdHVybnNgIH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDA5IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYnNlcnZlZCA9IGF3YWl0IGFnZW50Lm9ic2VydmUocnVuSWQpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0b0FJU2RrU3RyZWFtKG9ic2VydmVkLm91dHB1dCwge1xuICAgICAgICAgIGZyb206IFwiYWdlbnRcIixcbiAgICAgICAgICAuLi4oZm9sbG93VXBzICYmIGZvbGxvd1Vwcy5tb2RlICE9PSBcImdlbmllXCJcbiAgICAgICAgICAgID8geyBleHBlcmltZW50YWxUcmFuc2Zvcm06IGJ1aWxkRm9sbG93VXBTdWdnZXN0aW9uc1RyYW5zZm9ybShydW5JZCkgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAgIHNlbmRSZWFzb25pbmc6IHRydWUsXG4gICAgICAgICAgc2VuZFNvdXJjZXM6IHRydWUsXG4gICAgICAgICAgb25FcnJvcjogc2VyaWFsaXplQ2hhdFN0cmVhbUVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlKHsgc3RyZWFtIH0pO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICByZWdpc3RlckFwaVJvdXRlKGFib3J0UGF0aCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hc3RyYSA9IGNvbnRleHQuZ2V0KFwibWFzdHJhXCIpO1xuICAgICAgICBjb25zdCBhZ2VudElkID0gY29udGV4dC5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgICAgICBjb25zdCBydW5JZCA9IGNvbnRleHQucmVxLnBhcmFtKFwicnVuSWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCB8fCAhcnVuSWQpIHRocm93IG5ldyBFcnJvcihcIkFnZW50IElEIGFuZCBydW4gSUQgYXJlIHJlcXVpcmVkXCIpO1xuICAgICAgICBjb25zdCBhZ2VudCA9IG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCk7XG4gICAgICAgIGlmICghaXNFdmVudGVkQWdlbnQoYWdlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiBgQWdlbnQgJHthZ2VudElkfSBkb2VzIG5vdCBzdXBwb3J0IGJhY2tncm91bmQgdHVybnNgIH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDA5IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IGFib3J0ZWQ6IGFnZW50LmFib3J0UnVuU3RyZWFtKHJ1bklkKSB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gIF07XG59XG5cbi8qKlxuICogS2VlcCBhIGxhdGUgb3IgZHVwbGljYXRlIHJlc3VtZSBmcm9tIGZhaWxpbmcgdGhlIFVJIHN0cmVhbS4gTWFzdHJhJ3NcbiAqIHJlc3VtZSBwYXRoIGNhbiBzdXJmYWNlIGEgd29ya2Zsb3cgZXJyb3IgYWZ0ZXIgYW5vdGhlciBjbGllbnQgYWxyZWFkeVxuICogcmVzb2x2ZWQgdGhlIHNhbWUgYXBwcm92YWwuXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZUNoYXRTdHJlYW1FcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChpc1N0YWxlTWFzdHJhUmVzdW1lRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJpZ25vcmVkIHN0YWxlIG1hc3RyYSByZXN1bWVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgfSk7XG4gICAgcmV0dXJuIFNUQUxFX01BU1RSQV9SRVNVTUVfU1RSRUFNX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKTtcbn1cbiJdfQ==
@@ -126,8 +126,12 @@ export interface MastraWorkspaceSkillsConfig {
126
126
  /** Loaded-skill thread-state TTL in milliseconds. Defaults to one hour. */
127
127
  ttlMs?: number;
128
128
  }
129
+ /** Native Mastra Code Mode execution transport. */
130
+ export type MastraCodeModeTransport = "auto" | "isolated-vm" | "quickjs";
129
131
  /** Native Mastra Code Mode settings for sandboxed multi-tool orchestration. */
130
132
  export interface MastraCodeModeConfig {
133
+ /** Code Mode execution transport. */
134
+ transport: MastraCodeModeTransport;
131
135
  /** Generated orchestration tool id. Defaults to `execute_typescript`. */
132
136
  id?: string;
133
137
  /** Maximum orchestration program runtime in milliseconds. Defaults to 30 seconds. */
@@ -171,6 +175,17 @@ export interface MastraMcpConfig {
171
175
  */
172
176
  extraTools?: MastraTools;
173
177
  }
178
+ /** Optional post-turn follow-up suggestion policy. */
179
+ export interface FollowUpSuggestionsConfig {
180
+ /** Native Genie only, ChatFast generated only, or automatic selection when true. */
181
+ mode: true | "generated" | "genie";
182
+ /** Maximum questions emitted for one turn. Defaults to 3, maximum 10. */
183
+ limit?: number;
184
+ /** Tail-generation timeout in milliseconds. */
185
+ timeoutMs?: number;
186
+ /** Also expose the generator as an explicitly callable agent tool. */
187
+ exposeTool?: boolean;
188
+ }
174
189
  /** Configuration accepted by the Mastra AppKit plugin. */
175
190
  export interface MastraPluginConfig extends BasePluginConfig {
176
191
  /**
@@ -195,14 +210,14 @@ export interface MastraPluginConfig extends BasePluginConfig {
195
210
  memory?: boolean | MastraMemoryConfig;
196
211
  /**
197
212
  * Expose executable tools available to the current request through native
198
- * Mastra Code Mode. Defaults on whenever the request has executable tools.
199
- * The plugin selects Mastra's isolated-vm transport once during startup and
200
- * falls back to Mastra QuickJS when the native transport is unavailable.
201
- * These transports do not execute through the workspace command sandbox;
202
- * SSH is used only when an exposed SSH-backed tool is called. Set `false` to
203
- * opt out.
213
+ * Mastra Code Mode. Defaults to `false`. `auto` selects an installed,
214
+ * runtime-supported optional transport during startup and leaves Code Mode
215
+ * disabled when none is available. Explicit transport values fail startup
216
+ * when their optional dependency or runtime support is unavailable. These
217
+ * transports do not execute through the workspace command sandbox; SSH is
218
+ * used only when an exposed SSH-backed tool is called.
204
219
  */
205
- codeMode?: boolean | MastraCodeModeConfig;
220
+ codeMode?: false | MastraCodeModeTransport | MastraCodeModeConfig;
206
221
  /**
207
222
  * Sandbox for auto-created agent workspaces. Defaults to Monty. `false`
208
223
  * disables command execution; `true` or `"monty"` selects Monty; an explicit
@@ -458,6 +473,12 @@ export interface MastraPluginConfig extends BasePluginConfig {
458
473
  * to drill deep into a dataset within a single turn.
459
474
  */
460
475
  agentMaxSteps?: number;
476
+ /**
477
+ * Optional post-turn follow-up questions. `true` selects sources
478
+ * automatically; `"generated"` or `"genie"` pins one source; `false` or
479
+ * omission disables follow-ups.
480
+ */
481
+ followUpSuggestions?: false | true | "generated" | "genie" | FollowUpSuggestionsConfig;
461
482
  /**
462
483
  * Wire Mastra spans into AppKit's global OTel pipeline via
463
484
  * `@mastra/otel-bridge`.
package/lib/src/config.js CHANGED
@@ -150,8 +150,9 @@ export const MASTRA_CONFIG_SCHEMA = {
150
150
  description: "PgVector store for Mastra semantic recall. `true` captures the `lakebase` plugin's existing service-principal pool; an object opens a separately configured store. Auto-enabled when the `lakebase` plugin is registered.",
151
151
  },
152
152
  codeMode: {
153
- type: ["boolean", "object"],
154
- description: "Expose all executable tools available to the current request through native Mastra Code Mode for TypeScript batching, aggregation, and arithmetic. The plugin uses Mastra isolated-vm with the existing QuickJS fallback; neither transport runs through the workspace command sandbox, so SSH is used only when an SSH-backed tool is called. False disables it.",
153
+ type: ["boolean", "string", "object"],
154
+ default: false,
155
+ description: 'Expose executable request tools through native Mastra Code Mode for TypeScript batching, aggregation, and arithmetic. Defaults to false. Use "auto" to select an installed supported optional transport or stay disabled, "isolated-vm" to require the native transport, "quickjs" to require the portable transport, or an object with transport plus id and timeout. Neither transport runs through the workspace command sandbox.',
155
156
  },
156
157
  sandbox: {
157
158
  type: ["boolean", "string", "object"],
@@ -215,6 +216,10 @@ export const MASTRA_CONFIG_SCHEMA = {
215
216
  type: "number",
216
217
  description: "Maximum LLM steps each agent gets per turn (a tool call and the final reply each consume one). Defaults to 25.",
217
218
  },
219
+ followUpSuggestions: {
220
+ type: ["boolean", "string", "object"],
221
+ description: 'Optional post-turn follow-ups. True selects sources automatically; "generated" or "genie" pins one source; an object adds a limit, timeout, and optional tool exposure. Defaults off.',
222
+ },
218
223
  stripStaleCharts: {
219
224
  type: "boolean",
220
225
  description: "Strip chartIds from recalled assistant tool results so the model cannot reuse a turn-scoped chart marker. Defaults to true.",
@@ -254,4 +259,4 @@ export const MASTRA_CONFIG_SCHEMA = {
254
259
  },
255
260
  },
256
261
  };
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQU1uRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQVc1RixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUd4RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQztBQUN6RCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLENBQUM7QUFFdkQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQztBQUV6RDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBc0I7SUFDM0Qsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixnQkFBNkMsRUFDN0MsZUFBd0I7SUFFeEIsSUFBSSxlQUFlLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pGLE9BQU8sZUFBZSxJQUFJLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLGNBQStCO0lBQzVELE1BQU0sSUFBSSxHQUFHLGNBQWMsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFxQixDQUFDO0lBQ3RFLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxzQkFBc0IsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQWtnQkQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBaUI7SUFDaEQsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUU7UUFDVixlQUFlLEVBQUU7WUFDZixJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFDVCxxSkFBcUo7U0FDeEo7UUFDRCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSwwREFBMEQ7U0FDeEU7UUFDRCxZQUFZLEVBQUU7WUFDWixJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztZQUNuQyxXQUFXLEVBQ1QsMlVBQTJVO1NBQzlVO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUMzQixXQUFXLEVBQ1QsNk5BQTZOO1NBQ2hPO1FBQ0QsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUMzQixXQUFXLEVBQ1QsMk5BQTJOO1NBQzlOO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUMzQixXQUFXLEVBQ1QsbVdBQW1XO1NBQ3RXO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7WUFDckMsV0FBVyxFQUNULG9NQUFvTTtTQUN2TTtRQUNELHNCQUFzQixFQUFFO1lBQ3RCLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULG1JQUFtSTtTQUN0STtRQUNELGVBQWUsRUFBRTtZQUNmLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7WUFDM0IsV0FBVyxFQUNULGtHQUFrRztTQUNyRztRQUNELGNBQWMsRUFBRTtZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULHNIQUFzSDtTQUN6SDtRQUNELFlBQVksRUFBRTtZQUNaLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULGdIQUFnSDtTQUNuSDtRQUNELFlBQVksRUFBRTtZQUNaLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUNULG1MQUFtTDtTQUN0TDtRQUNELHFCQUFxQixFQUFFO1lBQ3JCLElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUN6QixXQUFXLEVBQ1QsNkdBQTZHO1NBQ2hIO1FBQ0QsZUFBZSxFQUFFO1lBQ2YsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQ1Qsa0ZBQWtGO1NBQ3JGO1FBQ0QsbUJBQW1CLEVBQUU7WUFDbkIsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsNEZBQTRGO1NBQy9GO1FBQ0QsZUFBZSxFQUFFO1lBQ2YsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsNEZBQTRGO1NBQy9GO1FBQ0QsYUFBYSxFQUFFO1lBQ2IsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQ1QsOEhBQThIO1NBQ2pJO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLFFBQVE7WUFDZCxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNwRCxXQUFXLEVBQ1Qsb1BBQW9QO1NBQ3ZQO1FBQ0QsY0FBYyxFQUFFO1lBQ2QsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQ1Qsd1BBQXdQO1NBQzNQO1FBQ0Qsb0JBQW9CLEVBQUU7WUFDcEIsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsc0VBQXNFO1NBQ3BGO1FBQ0QsYUFBYSxFQUFFO1lBQ2IsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsZ0hBQWdIO1NBQ25IO1FBQ0QsZ0JBQWdCLEVBQUU7WUFDaEIsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQ1QsNkhBQTZIO1NBQ2hJO1FBQ0QsaUJBQWlCLEVBQUU7WUFDakIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztZQUMzQixXQUFXLEVBQ1QscUhBQXFIO1NBQ3hIO1FBQ0QsYUFBYSxFQUFFO1lBQ2IsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQ1QscUpBQXFKO1NBQ3hKO1FBQ0QsWUFBWSxFQUFFO1lBQ1osSUFBSSxFQUFFLFFBQVE7WUFDZCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7WUFDekMsV0FBVyxFQUNULDBKQUEwSjtTQUM3SjtRQUNELEdBQUcsRUFBRTtZQUNILElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7WUFDM0IsV0FBVyxFQUNULDRKQUE0SjtTQUMvSjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsMkVBQTJFO1lBQzNFLDBFQUEwRTtZQUMxRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUN6QixXQUFXLEVBQ1QsZ2lCQUFnaUI7U0FDbmlCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLFFBQVE7WUFDZCxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO1lBQ3hCLFdBQVcsRUFDVCxxT0FBcU87U0FDeE87UUFDRCxLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFDVCwwSUFBMEk7U0FDN0k7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBsdWdpbiBjb25maWd1cmF0aW9uIHR5cGVzIGFuZCBzaGFyZWQgYFJlcXVlc3RDb250ZXh0YCBrZXlzLlxuICpcbiAqIE93bnMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWd9ICh0aGUgcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0XG4gKiBjb25maWcpIGFuZCB7QGxpbmsgTUFTVFJBX0NPTkZJR19TQ0hFTUF9LCB0aGUgSlNPTiBTY2hlbWEgdGhlIG1hbmlmZXN0XG4gKiBwdWJsaXNoZXMgZm9yIGl0IHNvIHNjYWZmb2xkaW5nIHRvb2xzIGFuZCBhZ2VudHMgY2FuIHJlYWQgdGhlIG9wdGlvbiBzZXQuXG4gKlxuICogUHJlY2VkZW5jZSBwZXIgZmllbGQgaXMgZXhwbGljaXQgcGx1Z2luIGNvbmZpZywgdGhlbiB0aGUgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlIG5hbWVkIG9uIHRoZSBmaWVsZCwgdGhlbiBhIGJ1aWx0LWluIGRlZmF1bHQuXG4gKlxuICogS2VwdCBpbiBhIGxlYWYgbW9kdWxlIHNvIGBwbHVnaW4udHNgLCBgc2VydmVyLnRzYCwgYG1vZGVsLnRzYCwgYW5kXG4gKiBgbWVtb3J5LnRzYCBjYW4gaW1wb3J0IHRoZW0gd2l0aG91dCBjcmVhdGluZyBhIGN5Y2xlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIEJhc2VQbHVnaW5Db25maWcsIHR5cGUgQ29uZmlnU2NoZW1hIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEZlZWRiYWNrTW9kZU9wdGlvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvZmVlZGJhY2tcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIE1BU1RSQV9USFJFQURfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQW55V29ya2Zsb3cgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtmbG93c1wiO1xuaW1wb3J0IHR5cGUge1xuICBXb3Jrc3BhY2VTYW5kYm94LFxuICBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXIsXG4gIFdvcmtzcGFjZVRvb2xzQ29uZmlnLFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB0eXBlIHsgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyBJREVOVElUWV9NT0RFUywgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHR5cGUgeyBMb2NhbFNraWxsTW91bnQsIFJlbW90ZVNraWxsc09wdGlvbiB9IGZyb20gXCIuL3JlbW90ZS1za2lsbHMudHNcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSB1bmRlciB3aGljaCB7QGxpbmsgTWFzdHJhU2VydmVyfSBzdG9yZXMgdGhlXG4gKiByZXNvbHZlZCBBcHBLaXQgdXNlci4gYG1vZGVsLnRzYCByZWFkcyBpdCB0byBtaW50IHVzZXItc2NvcGVkXG4gKiBEYXRhYnJpY2tzIHRva2Vucy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9VU0VSX0tFWSA9IFwibWFzdHJhX191c2VyXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXlzIGZvciBBcHBLaXQgdXNlciBtZXRhZGF0YSBzdGFtcGVkIGJ5XG4gKiB7QGxpbmsgTWFzdHJhU2VydmVyfS4gU3VyZmFjZWQgYXMgdHJhY2UgbWV0YWRhdGEgdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIHRyYWNlcyBhcmUgZmlsdGVyYWJsZSBieSB3aG9cbiAqIGlzc3VlZCB0aGUgcmVxdWVzdCB3aXRob3V0IGxlYWtpbmcgdGhlIGZ1bGwgdXNlciBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9OQU1FX0tFWSA9IFwibWFzdHJhX191c2VyTmFtZVwiO1xuLyoqIFJlcXVlc3QtY29udGV4dCBrZXkgY29udGFpbmluZyB0aGUgYXV0aGVudGljYXRlZCB1c2VyJ3MgZW1haWwgYWRkcmVzcy4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9FTUFJTF9LRVkgPSBcIm1hc3RyYV9fdXNlckVtYWlsXCI7XG4vKiogUmVxdWVzdC1jb250ZXh0IGtleSBpZGVudGlmeWluZyB0aGUgRGF0YWJyaWNrcyBjcmVkZW50aWFsIHVzZWQgYnkgdGhlIHR1cm4uICovXG5leHBvcnQgY29uc3QgTUFTVFJBX0FVVEhfTU9ERV9LRVkgPSBcIm1hc3RyYV9fYXV0aE1vZGVcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgdGhlIHBlci1IVFRQLXJlcXVlc3QgaWQgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFJlYWRzIGBYLVJlcXVlc3QtSWRgIGZyb20gdGhlIGluY29taW5nXG4gKiBoZWFkZXJzIHdoZW4gcHJlc2VudCAoc28gYW4gdXBzdHJlYW0gbG9hZCBiYWxhbmNlciAvIEFQSSBnYXRld2F5XG4gKiBjYW4ga2VlcCBpdHMgdHJhY2UgY29ycmVsYXRpb24pLCBmYWxscyBiYWNrIHRvIGEgZnJlc2hseSBtaW50ZWRcbiAqIFVVSUQuIEVjaG9lZCBiYWNrIG9uIHRoZSByZXNwb25zZSBhbmQgc3VyZmFjZWQgb24gZXZlcnkgc3BhbiB2aWFcbiAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gc28gbG9ncyBhbmQgdHJhY2VzIHNoYXJlIGFcbiAqIGpvaW4ga2V5LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1JFUVVFU1RfSURfS0VZID0gXCJtYXN0cmFfX3JlcXVlc3RJZFwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5IGZvciBPQXV0aCBzY29wZXMgcGFyc2VkIGZyb20gdGhlIGZvcndhcmRlZFxuICogYWNjZXNzIHRva2VuIGJ5IHtAbGluayBNYXN0cmFTZXJ2ZXIuY29uZmlndXJlUmVxdWVzdENvbnRleHRTY29wZXN9LlxuICogV29ya3NwYWNlIG1vdW50cyB0aGF0IHRvdWNoIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGVzIHJlcXVpcmVcbiAqIGB3b3Jrc3BhY2VgIG9yIGBhbGwtYXBpc2AgaW4gdGhpcyBsaXN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1NDT1BFU19LRVkgPSBcIm1hc3RyYV9fc2NvcGVzXCI7XG5cbi8qKlxuICogQ2Fub25pY2FsIGxpc3Qgb2YgYFJlcXVlc3RDb250ZXh0YCBrZXlzIHdlIHdhbnQgTWFzdHJhIHRvIGV4dHJhY3RcbiAqIGFzIG1ldGFkYXRhIG9uIGV2ZXJ5IG9ic2VydmFiaWxpdHkgc3BhbiAoYWdlbnQgcnVucywgbW9kZWwgY2FsbHMsXG4gKiB0b29sIGludm9jYXRpb25zLCB3b3JrZmxvdyBzdGVwcykuXG4gKlxuICogTWlycm9ycyB7QGxpbmsgaHR0cHM6Ly9tYXN0cmEuYWkvZG9jcy9vYnNlcnZhYmlsaXR5L3RyYWNpbmcvb3ZlcnZpZXcjYXV0b21hdGljLW1ldGFkYXRhLWZyb20tcmVxdWVzdGNvbnRleHR9OlxuICogcGFzc2VkIHZlcmJhdGltIGludG8gYE9ic2VydmFiaWxpdHkuY29uZmlnc1sqXS5yZXF1ZXN0Q29udGV4dEtleXNgLFxuICogc28gYW55IGtleSBsaXN0ZWQgaGVyZSBpcyByZWFkIGZyb20gYFJlcXVlc3RDb250ZXh0YCBhdCB0cmFjZVxuICogc3RhcnQgYW5kIGF0dGFjaGVkIGFzIHNjYWxhciBzcGFuIG1ldGFkYXRhLiBLZWVwIHRoZSBzZXQgdG8gcGxhaW5cbiAqIHNjYWxhcnMgLSBuZXZlciBpbmNsdWRlIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9IChpdCBjYXJyaWVzIHRoZVxuICogZnVsbCBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgd2l0aCBhIGBXb3Jrc3BhY2VDbGllbnRgIHJlZmVyZW5jZSkuXG4gKlxuICogT3JkZXIgaXMgcHVyZWx5IGNvc21ldGljOyBNYXN0cmEgZGUtZHVwZXMgaW50ZXJuYWxseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX0FVVEhfTU9ERV9LRVksXG4gIC8vIE1vZGVsIG92ZXJyaWRlIGtleSBpcyBvd25lZCBieSBgc2VydmluZy50c2A7IHNwZWxsZWQgaW5saW5lIGhlcmVcbiAgLy8gc28gdGhpcyBtb2R1bGUgc3RheXMgbGVhZi1sZXZlbCAobm8gY3ljbGVzIHdpdGggYHNlcnZpbmcudHNgKS5cbiAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG5dO1xuXG4vKiogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHBsdXMgdGhlIGNhbm9uaWNhbCB1c2VyIGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBpZGVudGl0eSBmb3IgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0OiB0aGUgT0JPIHVzZXIgaWQgb24gYVxuICogdXNlci1zY29wZWQgY2FsbCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgd2hpY2ggaXMgbm90IGFsd2F5cyB3aG9zZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWxcbiAqIHJ1bnMgaXQuIEFuIE9CTyBjb250ZXh0J3Mgb3duIHVzZXIgaWQgaXMgYXV0aG9yaXRhdGl2ZS4gVW5kZXIgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCwgZXZlcnkgY2FsbGVyIHNoYXJlcyBvbmUgY3JlZGVudGlhbCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlkIGlzXG4gKiB3aGF0IGtlZXBzIG1lbW9yeSB0aHJlYWRzIGFuZCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2VzIGRpc3RpbmN0OyB0aGUgc2VydmljZVxuICogcHJpbmNpcGFsIGlkIGlzIHRoZSBmbG9vciB3aGVuIG5vIHVzZXIgd2FzIGZvcndhcmRlZC5cbiAqXG4gKiBUaGlzIHJ1bGUgaGFzIHRvIGJlIGlkZW50aWNhbCBldmVyeXdoZXJlIGEgY2FjaGUga2V5IGlzIGJ1aWx0LCBzbyBib3RoIHRoZVxuICogd3JpdGUgc2lkZSAodGhlIGBSZXF1ZXN0Q29udGV4dGAgdXNlciBzdGFtcGVkIGJ5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmApXG4gKiBhbmQgdGhlIHJlYWQgc2lkZSAodGhlIHBsdWdpbidzIG93biBBcHBLaXQgcm91dGVzLCB3aGljaCBoYXZlIGEgcmVxdWVzdCBidXRcbiAqIG5vIGBSZXF1ZXN0Q29udGV4dGApIGRlcml2ZSB0aGVpciBrZXkgZnJvbSB0aGlzIG9uZSBmdW5jdGlvbi4gV2hlbiB0aGUgdHdvXG4gKiBkaXNhZ3JlZWQsIGEgY2hhcnQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgd2FzIHJlYWQgYmFjayB1bmRlclxuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIGFuZCB0aGUgZW1iZWQgcm91dGUgYW5zd2VyZWQgNDA0LCB3aGljaCB0aGUgY2hhdCBVSVxuICogcmVuZGVycyBhcyBhbiBleHBpcmVkIGNoYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlZFVzZXJJZChcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlLFxuICBmb3J3YXJkZWRVc2VySWQ/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCkgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG4gIHJldHVybiBmb3J3YXJkZWRVc2VySWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChleGVjdXRpb25Db250ZXh0KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBldmVyeSBwZXItdXNlciBjYWNoZSBlbnRyeSBpcyBuYW1lc3BhY2VkIHVuZGVyLCBzbyBhbiBPQk8gcmVzdWx0XG4gKiBjYW5ub3QgYmUgcmVhZCBiYWNrIGJ5IGFub3RoZXIgY2FsbGVyLlxuICpcbiAqIFByZWZlcnMgdGhlIHtAbGluayBVc2VyfSB0aGF0IHtAbGluayBNYXN0cmFTZXJ2ZXJ9IHN0YW1wcyBvbiB0aGUgcmVxdWVzdFxuICogY29udGV4dCwgd2hvc2UgaWQgYWxyZWFkeSBmb2xsb3dzIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfS4gVGhlIE1DUCB0cmFuc3BvcnRcbiAqIHJvdXRlcyBkbyBub3QgdGhyZWFkIHRoYXQgY29udGV4dCBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyB0aG9zZSBmYWxsIGJhY2sgdG9cbiAqIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0ICh0aGUgYWN0aXZlIE9CTyBzY29wZSwgb3IgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCkuIEEgY2FsbGVyIGhvbGRpbmcgYW4gZXhwcmVzcyByZXF1ZXN0IHNob3VsZCBidWlsZCBpdHMga2V5IGZyb21cbiAqIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSBpbnN0ZWFkLCBzbyB0aGUgZm9yd2FyZGVkIHVzZXIgaXMgbm90IGxvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdXNlcj8uaWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCkpO1xufVxuXG4vKiogUGdWZWN0b3IgY29uZmlnIHdpdGggYW4gb3B0aW9uYWwgTWFzdHJhIHN0b3JlIGlkLiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnID0gUGdWZWN0b3JDb25maWcgJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqIE1hc3RyYSBuYXRpdmUgd29ya3NwYWNlIHNraWxsLXNlYXJjaCBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFXb3Jrc3BhY2VTa2lsbHNDb25maWcge1xuICAvKiogTWF4aW11bSBza2lsbCBtYXRjaGVzIHJldHVybmVkIGJ5IG9uZSBzZWFyY2guIERlZmF1bHRzIHRvIDUuICovXG4gIHRvcEs/OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIEJNMjUgcmVsZXZhbmNlIHNjb3JlLiBEZWZhdWx0cyB0byAwLjEuICovXG4gIG1pblNjb3JlPzogbnVtYmVyO1xuICAvKiogTG9hZGVkLXNraWxsIHRocmVhZC1zdGF0ZSBUVEwgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBvbmUgaG91ci4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBOYXRpdmUgTWFzdHJhIENvZGUgTW9kZSBzZXR0aW5ncyBmb3Igc2FuZGJveGVkIG11bHRpLXRvb2wgb3JjaGVzdHJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhQ29kZU1vZGVDb25maWcge1xuICAvKiogR2VuZXJhdGVkIG9yY2hlc3RyYXRpb24gdG9vbCBpZC4gRGVmYXVsdHMgdG8gYGV4ZWN1dGVfdHlwZXNjcmlwdGAuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogTWF4aW11bSBvcmNoZXN0cmF0aW9uIHByb2dyYW0gcnVudGltZSBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDMwIHNlY29uZHMuICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIHRoZSBvcHRpb25hbCBNQ1Agc2VydmVyIGV4cG9zdXJlXG4gKiAoe0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5tY3B9KS4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw7IHRoZSBvYmplY3RcbiAqIGZvcm0gb25seSBuZWVkcyB0byBzZXQgd2hhdCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYU1jcENvbmZpZyB7XG4gIC8qKlxuICAgKiBTZXJ2ZXIgaWQgdXNlZCBpbiB0aGUgcm91dGUgcGF0aCAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSBhbmQgYXMgdGhlXG4gICAqIE1DUCByZWdpc3RyeSBpZC4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIHJlZ2lzdGVyZWQgbmFtZS5cbiAgICovXG4gIHNlcnZlcklkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjxkaXNwbGF5TmFtZT4gTUNQXCJgLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogU2VtYW50aWMgdmVyc2lvbiBhZHZlcnRpc2VkIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBgXCIxLjAuMFwiYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogRXhwb3NlIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgYXMgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAgLSB0aGlzIGlzIHRoZSBcImxldmVyYWdlIHRoZSBNYXN0cmEgYWdlbnRzIG92ZXJcbiAgICogTUNQXCIgYmVoYXZpb3IgbW9zdCBjYWxsZXJzIHdhbnQuXG4gICAqL1xuICBhZ2VudHM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWxzbyBleHBvc2UgdGhlIHBsdWdpbidzIGFtYmllbnQgdG9vbHMgKHRoZSBidWlsdC1pbiBgcmVuZGVyX2RhdGFgXG4gICAqIHBsdXMgYW55dGhpbmcgaW4gYGNvbmZpZy50b29sc2ApIGFzIE1DUCB0b29scy4gRGVmYXVsdHMgdG8gYGZhbHNlYDpcbiAgICogdGhlIGFtYmllbnQgdG9vbHMgYXNzdW1lIGFuIGluLXByb2Nlc3MgY2hhdCB0dXJuICh0aGV5IHB1Ymxpc2hcbiAgICogd3JpdGVyIGV2ZW50cyB0aGUgY2hhdCBVSSBjb25zdW1lcyksIHNvIHRoZXkgYXJlbid0IHVzZWZ1bCB0byBhXG4gICAqIHN0YW5kYWxvbmUgTUNQIGNsaWVudC4gVHVybiB0aGlzIG9uIG9ubHkgd2hlbiB0aG9zZSB0b29scyBhcmUgc2FmZVxuICAgKiB0byBjYWxsIG91dC1vZi1iYW5kLlxuICAgKi9cbiAgdG9vbHM/OiBib29sZWFuO1xuICAvKipcbiAgICogRXh0cmEgdG9vbHMgdG8gZXhwb3NlIG92ZXIgTUNQIGJleW9uZCB0aGUgYWdlbnQgLyBhbWJpZW50IHNldHMuXG4gICAqIFVzZSB0aGlzIGZvciB0b29scyB3cml0dGVuIHNwZWNpZmljYWxseSBmb3IgTUNQIGNvbnN1bWVycy5cbiAgICovXG4gIGV4dHJhVG9vbHM/OiBNYXN0cmFUb29scztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gYWNjZXB0ZWQgYnkgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqXG4gICAqIFJ1biB0dXJucyB0aHJvdWdoIE1hc3RyYSdzIGV2ZW50ZWQgZHVyYWJsZSBhZ2VudCBzbyBleGVjdXRpb24gY29udGludWVzXG4gICAqIGFmdGVyIGEgYnJvd3NlciBkaXNjb25uZWN0IGFuZCBjYW4gYmUgb2JzZXJ2ZWQgYWdhaW4gYnkgcnVuIGlkLiBEZWZhdWx0c1xuICAgKiB0byBgdHJ1ZWAuXG4gICAqL1xuICBiYWNrZ3JvdW5kVHVybnM/OiBib29sZWFuO1xuICAvKiogQUkgU0RLIHByb3ZpZGVyLW9wdGlvbnMgbmFtZXNwYWNlLiBEZWZhdWx0cyB0byBgXCJvcGVuYWlcImA7IG5vIGVudiBmYWxsYmFjay4gKi9cbiAgcHJvdmlkZXJJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBvc3RncmVzU3RvcmUgZm9yIE1hc3RyYSB0aHJlYWRzL21lc3NhZ2VzLiBgdHJ1ZWAgY2FwdHVyZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgZXhpc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGFcbiAgICogc2VwYXJhdGVseSBjb25maWd1cmVkIHN0b3JlLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBQb3N0Z3Jlc1N0b3JlQ29uZmlnO1xuICAvKipcbiAgICogUGdWZWN0b3Igc3RvcmUgZm9yIE1hc3RyYSBtZW1vcnkgcmVjYWxsLiBgdHJ1ZWAgY2FwdHVyZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgZXhpc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGFcbiAgICogc2VwYXJhdGVseSBjb25maWd1cmVkIHN0b3JlLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZztcbiAgLyoqXG4gICAqIEV4cG9zZSBleGVjdXRhYmxlIHRvb2xzIGF2YWlsYWJsZSB0byB0aGUgY3VycmVudCByZXF1ZXN0IHRocm91Z2ggbmF0aXZlXG4gICAqIE1hc3RyYSBDb2RlIE1vZGUuIERlZmF1bHRzIG9uIHdoZW5ldmVyIHRoZSByZXF1ZXN0IGhhcyBleGVjdXRhYmxlIHRvb2xzLlxuICAgKiBUaGUgcGx1Z2luIHNlbGVjdHMgTWFzdHJhJ3MgaXNvbGF0ZWQtdm0gdHJhbnNwb3J0IG9uY2UgZHVyaW5nIHN0YXJ0dXAgYW5kXG4gICAqIGZhbGxzIGJhY2sgdG8gTWFzdHJhIFF1aWNrSlMgd2hlbiB0aGUgbmF0aXZlIHRyYW5zcG9ydCBpcyB1bmF2YWlsYWJsZS5cbiAgICogVGhlc2UgdHJhbnNwb3J0cyBkbyBub3QgZXhlY3V0ZSB0aHJvdWdoIHRoZSB3b3Jrc3BhY2UgY29tbWFuZCBzYW5kYm94O1xuICAgKiBTU0ggaXMgdXNlZCBvbmx5IHdoZW4gYW4gZXhwb3NlZCBTU0gtYmFja2VkIHRvb2wgaXMgY2FsbGVkLiBTZXQgYGZhbHNlYCB0b1xuICAgKiBvcHQgb3V0LlxuICAgKi9cbiAgY29kZU1vZGU/OiBib29sZWFuIHwgTWFzdHJhQ29kZU1vZGVDb25maWc7XG4gIC8qKlxuICAgKiBTYW5kYm94IGZvciBhdXRvLWNyZWF0ZWQgYWdlbnQgd29ya3NwYWNlcy4gRGVmYXVsdHMgdG8gTW9udHkuIGBmYWxzZWBcbiAgICogZGlzYWJsZXMgY29tbWFuZCBleGVjdXRpb247IGB0cnVlYCBvciBgXCJtb250eVwiYCBzZWxlY3RzIE1vbnR5OyBhbiBleHBsaWNpdFxuICAgKiBNYXN0cmEgc2FuZGJveCBvciByZXNvbHZlciBzdXBwbGllcyBhIHJlbW90ZSB0cmFuc3BvcnQuIEFuIGFnZW50IHdpdGggYW5cbiAgICogZXhwbGljaXQgY3VzdG9tIGB3b3Jrc3BhY2VgIGtlZXBzIHRoYXQgd29ya3NwYWNlIGFuZCBpdHMgc2FuZGJveC5cbiAgICovXG4gIHNhbmRib3g/OiBib29sZWFuIHwgXCJtb250eVwiIHwgV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcjtcbiAgLyoqIEFkZCB1c2VyLXNjb3BlZCBgL3RtcGAgb25seSB3aGVuIG5vIGNvbmZpZ3VyZWQgd29ya3NwYWNlIHBhdGggbW91bnRzIHdyaXRhYmxlLiAqL1xuICB3b3Jrc3BhY2VGYWxsYmFja1RvVG1wPzogYm9vbGVhbjtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgd29ya3NwYWNlIHRvb2wgYXZhaWxhYmlsaXR5LCBhcHByb3ZhbCwgYW5kIGhvb2sgY29uZmlndXJhdGlvbi4gKi9cbiAgd29ya3NwYWNlVG9vbHM/OiBXb3Jrc3BhY2VUb29sc0NvbmZpZztcbiAgLyoqXG4gICAqIFVzZSBNYXN0cmEncyBuYXRpdmUgd29ya3NwYWNlIHNraWxsIG1hbmFnZXIuIERlZmF1bHRzIHRvIHRydWUuIFBhc3MgYW5cbiAgICogb2JqZWN0IHRvIHR1bmUgb24tZGVtYW5kIGRpc2NvdmVyeSBhbmQgbG9hZGVkLXNraWxsIHN0YXRlLlxuICAgKi9cbiAgd29ya3NwYWNlU2tpbGxzPzogYm9vbGVhbiB8IE1hc3RyYVdvcmtzcGFjZVNraWxsc0NvbmZpZztcbiAgLyoqXG4gICAqIENvZGUtZGVmaW5lZCBhZ2VudHMuIEFjY2VwdHMgdGhyZWUgc2hhcGVzIGZvciBjb252ZW5pZW5jZTpcbiAgICpcbiAgICogLSAqKlJlY29yZCoqOiBgeyBhbmFseXN0OiBkZWYsIGhlbHBlcjogZGVmIH1gIC0ga2V5cyBiZWNvbWUgdGhlXG4gICAqICAgcmVnaXN0ZXJlZCBpZHMgYW5kIHRoZSBmaXJzdCBrZXkgaXMgdGhlIGRlZmF1bHQuXG4gICAqIC0gKipTaW5nbGUgZGVmaW5pdGlvbioqOiBgZGVmYCAtIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgXCJkZWZhdWx0XCJgIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpIGFuZFxuICAgKiAgIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHRoZSBkZWZhdWx0IGFnZW50LlxuICAgKiAtICoqQXJyYXkqKjogYFtkZWYxLCBkZWYyXWAgLSBlYWNoIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgYWdlbnRfJHtpfWAgd2hlbiBgbmFtZWAgaXMgb21pdHRlZCk7XG4gICAqICAgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IGJlY29tZXMgYSBNYXN0cmEgYEFnZW50YCByZWFjaGFibGUgYXRcbiAgICogYC9hcGkvPHBsdWdpbj4vcm91dGUvY2hhdC88aWQ+YCAodGhlIGNoYXQgcm91dGUgYWxzbyBtYXRjaGVzXG4gICAqIGA6YWdlbnRJZGApLiBXaGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHksIHRoZSBwbHVnaW5cbiAgICogcmVnaXN0ZXJzIGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlXG4gICAqIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBleGFtcGxlIFNpbmdsZS1hZ2VudCBzaG9ydGhhbmRcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIEFycmF5XG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBbXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiYW5hbHlzdFwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiaGVscGVyXCIsIGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICBdLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFJlY29yZCAoZXhwbGljaXQgaWRzKVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czoge1xuICAgKiAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgIH0sXG4gICAqICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWdlbnRzPzpcbiAgICB8IFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj5cbiAgICB8IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvblxuICAgIHwgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW107XG4gIC8qKlxuICAgKiBBbWJpZW50IHRvb2xzIHNwcmVhZCBpbnRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQncyB0b29scyByZWNvcmQ7XG4gICAqIHBlci1hZ2VudCB0b29scyB3aW4gb24ga2V5IGNvbGxpc2lvbi4gVXNlIGZvciBhIHNtYWxsIHNoYXJlZFxuICAgKiBsaWJyYXJ5OyBmb3IgcGVyLWFnZW50IHRvb2xzIHNldCBgYWdlbnRzW2lkXS50b29sc2AgaW5zdGVhZC5cbiAgICovXG4gIHRvb2xzPzogTWFzdHJhVG9vbHM7XG4gIC8qKlxuICAgKiBDb2RlLWRlZmluZWQgTWFzdHJhIHdvcmtmbG93cyByZWdpc3RlcmVkIG9uIHRoZSBob3N0ZWQgaW5zdGFuY2UuXG4gICAqIERlZmVycmVkIHNpYmxpbmcgcGx1Z2lucyBtYXkgYWxzbyByZWdpc3RlciB0aHJvdWdoIHRoZSBwbHVnaW4gZXhwb3J0XG4gICAqIGJlZm9yZSB0aGUgaW5zdGFuY2UgaXMgYnVpbHQuXG4gICAqL1xuICB3b3JrZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCBBbnlXb3JrZmxvdz47XG4gIC8qKlxuICAgKiBBZ2VudCBpZCB1c2VkIHdoZW4gdGhlIGNsaWVudCBkb2Vzbid0IHNwZWNpZnkgb25lICh0aGUgYmFyZSxcbiAgICogdW4tc3VmZml4ZWQgaGlzdG9yeSAvIHN1Z2dlc3Rpb25zIHJvdXRlcyByZXNvbHZlIHRvIGl0KS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIGZpcnN0IGtleSBpbiBgYWdlbnRzYCAob3IgYFwiZGVmYXVsdFwiYCB3aGVuXG4gICAqIGBhZ2VudHNgIGlzIG9taXR0ZWQpLiBNdXN0IG1hdGNoIGFuIGlkIGluIGBhZ2VudHNgIHdoZW4gYm90aCBhcmVcbiAgICogc2V0OyBhIG1pc21hdGNoIHRocm93cyBhdCBzZXR1cCB3aXRoIHRoZSBhdmFpbGFibGUgY2FuZGlkYXRlcy5cbiAgICovXG4gIGRlZmF1bHRBZ2VudD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsdWdpbi1sZXZlbCBkZWZhdWx0IG1vZGVsIGFwcGxpZWQgdG8gZXZlcnkgYWdlbnQgdGhhdCBvbWl0cyBpdHNcbiAgICogb3duIGBtb2RlbGAuIE1pcnJvcnMgQXBwS2l0J3MgYGFnZW50cyh7IGRlZmF1bHRNb2RlbCB9KWAuXG4gICAqXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIE9CTyBhdXRvLXJlc29sdmVyIGJ1dCBzd2FwIHRoZVxuICAgKiAgIGBtb2RlbElkYFwiIChlLmcuIGBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICB0aHJvdWdoIHZlcmJhdGltLiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGF1dGhcbiAgICogICBvciBgcHJvdmlkZXJJZGAuXG4gICAqXG4gICAqIFJlc29sdXRpb24gb3JkZXIgcGVyIGFnZW50OiBgZGVmLm1vZGVsYCDihpIgYGRlZmF1bHRNb2RlbGAg4oaSXG4gICAqIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAg4oaSIGJ1aWx0LWluIGAvc2VydmluZy1lbmRwb2ludHNgXG4gICAqIHJlc29sdmVyLlxuICAgKi9cbiAgZGVmYXVsdE1vZGVsPzogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB8IHN0cmluZztcbiAgLyoqXG4gICAqIEZ1enp5LW1hdGNoIGxvb3NlIG1vZGVsIG5hbWVzIChgXCJjbGF1ZGUgc29ubmV0XCJgKSBhZ2FpbnN0IHRoZSB3b3Jrc3BhY2Unc1xuICAgKiBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50cy4gRGVmYXVsdHMgdG8gYHRydWVgOyBubyBlbnYgZmFsbGJhY2suXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHRvIHJlcXVpcmUgZXhhY3QgZW5kcG9pbnQgbmFtZXMgZXZlcnl3aGVyZS5cbiAgICovXG4gIG1vZGVsRnV6enlNYXRjaD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGdXNlLmpzIHNjb3JlIHRocmVzaG9sZCBmb3IgdGhlIGZ1enp5IG1hdGNoZXIsIDAgKGV4YWN0KSB0byAxIChhbnl0aGluZykuXG4gICAqIERlZmF1bHRzIHRvIGAwLjRgOyBubyBlbnYgZmFsbGJhY2suXG4gICAqXG4gICAqIExvd2VyIHZhbHVlcyByZWplY3QgbG9vc2UgbWF0Y2hlczsgcmFpc2UgaXQgaWYgeW91IGhhdmUgYSBzcHJhd2xpbmdcbiAgICogZW5kcG9pbnQgY2F0YWxvZ3VlIHdpdGggc2ltaWxhci1sb29raW5nIG5hbWVzLlxuICAgKi9cbiAgbW9kZWxGdXp6eVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRUTCBmb3IgdGhlIGluLW1lbW9yeSBzZXJ2aW5nLWVuZHBvaW50cyBsaXN0IGNhY2hlLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIERlZmF1bHRzIHRvIDUgbWludXRlczsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBUaGUgY2FjaGUgaXMgcGVyIHdvcmtzcGFjZSBob3N0IGFuZCBzaGFyZWQgYWNyb3NzIHVzZXJzOyBjb25jdXJyZW50XG4gICAqIGNhbGxlcnMgY29hbGVzY2Ugb24gYSBzaW5nbGUgaW4tZmxpZ2h0IGZldGNoLlxuICAgKi9cbiAgbW9kZWxDYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogTGV0IGNsaWVudHMgcGljayB0aGUgYmFja2luZyBlbmRwb2ludCBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gYHRydWVgO1xuICAgKiBubyBlbnYgZmFsbGJhY2suXG4gICAqXG4gICAqIFJlYWRzIHRoZSBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgdGhlIGA/bW9kZWw9YCBxdWVyeSBzdHJpbmcsIG9yIGFcbiAgICogYG1vZGVsYCBib2R5IGZpZWxkLCBpbiB0aGF0IG9yZGVyLiBEaXNhYmxlIHdoZW4gcnVubmluZyBtdWx0aS10ZW5hbnRcbiAgICogd2hlcmUgdW50cnVzdGVkIGNsaWVudHMgc2hvdWxkbid0IGNob29zZSB0aGUgZW5kcG9pbnQuXG4gICAqL1xuICBtb2RlbE92ZXJyaWRlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFByaW9yaXR5LW9yZGVyZWQgbGlzdCBvZiBlbmRwb2ludCBuYW1lcyB0cmllZCAqZmlyc3QqIHdoZW4gbm9cbiAgICogYWdlbnQgLyBwbHVnaW4gLyBlbnYgLyByZXF1ZXN0LW92ZXJyaWRlIG1vZGVsIGlkIGlzIHNldCwgYWhlYWQgb2ZcbiAgICogdGhlIGR5bmFtaWMgc2NvcmUtY2xhc3NpZmllZCBjYXRhbG9ndWUuIFRoZSByZXNvbHZlciBwaWNrcyB0aGVcbiAgICogZmlyc3QgaWQgdGhhdCBpcyBhY3R1YWxseSBwcmVzZW50IGluIHRoZSB3b3Jrc3BhY2Unc1xuICAgKiBgL3NlcnZpbmctZW5kcG9pbnRzYCBsaXN0aW5nLlxuICAgKlxuICAgKiBXaGVuIHVuc2V0LCByZXNvbHV0aW9uIGlzIGRyaXZlbiBieSB0aGUgbGl2ZSBGb3VuZGF0aW9uIE1vZGVsIEFQSVxuICAgKiBgcXVhbGl0eWAgLyBgc3BlZWRgIC8gYGNvc3RgIHNjb3JlczogZW5kcG9pbnRzIGFyZSBjbGFzc2lmaWVkIGludG9cbiAgICogY2hhdCBjbGFzc2VzIChgY2xhc3NpZnlFbmRwb2ludHNgKSBhbmQgd2Fsa2VkIGJlc3QtZmlyc3RcbiAgICogKENoYXRUaGlua2luZyAtPiBDaGF0QmFsYW5jZWQgLT4gQ2hhdEZhc3QpLiBUaGUgYXV0b21hdGljIGRlZmF1bHQgaXNcbiAgICogbGl2ZS1vbmx5IGFuZCBmYWlscyB3aGVuIG5vIG1hdGNoaW5nIGVuZHBvaW50IGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqIFNldCB0aGlzIHRvIHBpbiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgdG8gYW4gYXBwcm92ZWQgc3Vic2V0LCBvciB0byBwdXRcbiAgICogY3VzdG9tIGVuZHBvaW50cyBpbiBmcm9udCBvZiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbEZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKGRlZmF1bHQpLCBldmVyeSBhZ2VudCBnZXRzIGEgYnVpbHQtaW4gaW5wdXRcbiAgICogcHJvY2Vzc29yIHRoYXQgc3RyaXBzIGBjaGFydElkYCBmaWVsZHMgZnJvbSBwcmlvciBhc3Npc3RhbnRcbiAgICogdG9vbC1pbnZvY2F0aW9uIHJlc3VsdHMgYmVmb3JlIHRoZXkgcmVhY2ggdGhlIG1vZGVsLiBUaGlzXG4gICAqIHByZXZlbnRzIHRoZSBtb2RlbCBmcm9tIHJldXNpbmcgdHVybi1zY29wZWQgY2hhcnRJZHMgaXQgc2Vlc1xuICAgKiBpbiBtZW1vcnkgcmVjYWxsICh3aGljaCB3b3VsZCBsZWF2ZSBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzXG4gICAqIHBvaW50aW5nIGF0IHdyaXRlciBldmVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QpLlxuICAgKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvcHQgb3V0IC0gdXNlZnVsIGlmIGEgbm9uLWRlZmF1bHQgYWdlbnRcbiAgICogbmVlZHMgZnVsbCB2aXNpYmlsaXR5IGludG8gcHJpb3IgY2hhcnRJZHMgKGUuZy4gYW4gYXVkaXRcbiAgICogYWdlbnQgcmVhc29uaW5nIGFib3V0IGNoYXJ0IGxpbmVhZ2UpLlxuICAgKi9cbiAgc3RyaXBTdGFsZUNoYXJ0cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICAgKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCB0aHJvd2F3YXlcbiAgICogY2xvc2VycywgZXhjZXNzaXZlIGhlZGdpbmcpLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogdXNlIHRoZSBidWlsdC1pblxuICAgKiAgIGBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OU2AgZnJvbSBgYWdlbnRzLnRzYC5cbiAgICogLSBgc3RyaW5nYDogcmVwbGFjZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSBzdXBwbGllZCBibG9jay5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIGVudGlyZWx5IChhZ2VudHMgc2VlIG9ubHkgdGhlaXIgYmVzcG9rZVxuICAgKiAgIGBpbnN0cnVjdGlvbnNgKS5cbiAgICpcbiAgICogQXBwZW5kZWQgKG5vdCBwcmVwZW5kZWQpIHNvIHRoZSBhZ2VudCdzIHJvbGUgYW5kIHJ1bGVzIGNvbWUgZmlyc3RcbiAgICogYW5kIHRoZSBzdHlsZSBibG9jayBsZWFucyBvbiB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMuXG4gICAqL1xuICBzdHlsZUluc3RydWN0aW9ucz86IHN0cmluZyB8IGZhbHNlO1xuICAvKipcbiAgICogR2VuaWUgc3BhY2VzIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIGNhbiBkZWxlZ2F0ZSB0by4gT25lIE1hc3RyYVxuICAgKiB0b29sIGlzIHJlZ2lzdGVyZWQgcGVyIGFsaWFzIChgZ2VuaWVgIGZvciB0aGUgd2VsbC1rbm93blxuICAgKiBgZGVmYXVsdGAgYWxpYXMsIGBnZW5pZV88YWxpYXM+YCBvdGhlcndpc2UpLiBFYWNoIHRvb2wgc3BpbnNcbiAgICogdXAgYSBwZXItcXVlc3Rpb24gR2VuaWUgc3ViLWFnZW50IHRoYXQgcnVucyBEYXRhYnJpY2tzXG4gICAqIFwiYWdlbnQgbW9kZVwiIGFnYWluc3QgdGhlIHNwYWNlLCBicm9hZGNhc3RzIHdpcmUgZXZlbnRzIHRvIHRoZVxuICAgKiBVSSwgZmV0Y2hlcyBzdGF0ZW1lbnQgcm93cyBmb3Igbm9uLWVtcHR5IHJlc3VsdHMsIGFuZCByZXR1cm5zXG4gICAqIGEgYChzdHJpbmcgfCBkYXRhIHwgY2hhcnQpW11gIHN1bW1hcnkgdGhlIGhvc3QgVUkgcmVuZGVyc1xuICAgKiBpbmxpbmUuXG4gICAqXG4gICAqIEVudHJpZXMgYWNjZXB0IGVpdGhlciBhIGZ1bGwge0BsaW5rIEdlbmllU3BhY2VDb25maWd9IG9iamVjdFxuICAgKiBvciBhIGJhcmUgYHNwYWNlX2lkYCBzdHJpbmcgd2hlbiBubyBleHRyYXMgYXJlIG5lZWRlZDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBnZW5pZVNwYWNlczoge1xuICAgKiAgICAgZGVmYXVsdDogXCIwMWVmMGQzYzBlMWIxZjRhOGQyYzNlNGY1YTZiN2M4ZFwiLFxuICAgKiAgICAgZm9yZWNhc3RzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIndlZWtseSBkZW1hbmQgZm9yZWNhc3RzXCIgfSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlYWNoIHRoZSBzcGFjZXMgZnJvbSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgdmlhXG4gICAqIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgOyB0aGUgcmVzdWx0aW5nIHRvb2xzIGFjY2VwdFxuICAgKiBgeyBjb250ZW50LCBjb252ZXJzYXRpb25JZD8gfWAgYW5kIHJldHVybiBhIGh5ZHJhdGVkIHN1bW1hcnkuXG4gICAqXG4gICAqICoqRmFsbGJhY2sgZGlzY292ZXJ5KiogKGhpZ2hlc3QgcHJlY2VkZW5jZSBmaXJzdCk6IGlmIHRoaXNcbiAgICogZmllbGQgaXMgb21pdHRlZCwgdGhlIEdlbmllIGFnZW50IGFsc28gcGlja3MgdXAgc3BhY2VzIGZyb21cbiAgICogKDEpIHRoZSBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2VcbiAgICogd2hlbiByZWdpc3RlcmVkLCBhbmQgKDIpIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGBcbiAgICogZW52IHZhciAocmVnaXN0ZXJlZCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzKS4gVGhpcyBrZWVwc1xuICAgKiBleGlzdGluZyBBcHBLaXQgZGVwbG95bWVudHMgd29ya2luZyB3aXRob3V0IHJlc3RhdGluZyB0aGVcbiAgICogc3BhY2VzIGNvbmZpZyBpbiB0d28gcGxhY2VzLlxuICAgKi9cbiAgZ2VuaWVTcGFjZXM/OiBHZW5pZVNwYWNlc0NvbmZpZztcbiAgLyoqXG4gICAqIFVzZSB0aGUgc3RyZWFtaW5nIEdlbmllIEFnZW50IE1vZGUgQVBJIGZvciBgYXNrX2dlbmllYC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBTZXQgYGZhbHNlYCB0byBmb3JjZSB0aGUgbGVnYWN5IENvbnZlcnNhdGlvbiBBUEkgcG9sbGluZyBkcml2ZXIuIEFcbiAgICogcHJlLXN0cmVhbSBmZWF0dXJlLWRpc2FibGVkIG9yIHByZXZpZXctdG9nZ2xlIHJlc3BvbnNlIGZhbGxzIGJhY2tcbiAgICogYXV0b21hdGljYWxseS4gRGlyZWN0IEdlbmllIGNoYXQgYWx3YXlzIHJlcXVpcmVzIEFnZW50IE1vZGUgYW5kIGlnbm9yZXNcbiAgICogdGhpcyBvcHRpb24uXG4gICAqL1xuICBnZW5pZUFnZW50TW9kZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgR2VuaWUgc3BhY2UgbWV0YWRhdGEgY2FjaGUsIGluXG4gICAqIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLiBUaGUgR2VuaWUgYWdlbnQgY2FsbHNcbiAgICogYGNsaWVudC5nZW5pZS5nZXRTcGFjZSguLi4pYCBvbiBldmVyeSBjb2xkLXN0YXJ0IHRvIGdldCB0aGVcbiAgICogdGl0bGUgLyBkZXNjcmlwdGlvbiAvIHdhcmVob3VzZSBpZDsgY2FjaGVkIHJlc3BvbnNlcyBza2lwIHRoZVxuICAgKiByb3VuZC10cmlwIGFuZCBjb25jdXJyZW50IGNhbGxlcnMgY29hbGVzY2Ugb24gYSBzaW5nbGVcbiAgICogaW4tZmxpZ2h0IGZldGNoLiBEcm9wIHRvIGEgc21hbGxlciB2YWx1ZSB3aGVuIGFuYWx5c3RzIGFyZVxuICAgKiBhY3RpdmVseSBlZGl0aW5nIHNwYWNlIG1ldGFkYXRhIGFuZCB5b3Ugd2FudCBjaGFuZ2VzIHZpc2libGVcbiAgICogd2l0aGluIHNlY29uZHM7IHJhaXNlIGl0IHRvIGFtb3J0aXNlIHRoZSByb3VuZC10cmlwIHdoZW5cbiAgICogc3BhY2UgbWV0YWRhdGEgaXMgZWZmZWN0aXZlbHkgZnJvemVuLlxuICAgKlxuICAgKiBCYWNrZWQgYnkgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAsIHNvIHRoZSBjYWNoZSBwYXJ0aWNpcGF0ZXNcbiAgICogaW4gdGVsZW1ldHJ5IHNwYW5zIChgY2FjaGUuZ2V0T3JFeGVjdXRlYCkgYW5kIGJlbmVmaXRzIGZyb21cbiAgICogTGFrZWJhc2UgcGVyc2lzdGVuY2Ugd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgd2lyZWQgdXAuXG4gICAqL1xuICBnZW5pZVNwYWNlQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gTExNIHN0ZXBzIGVhY2ggYWdlbnQgZ2V0cyBwZXIgdHVybi4gT25lIHN0ZXAgPSBvbmVcbiAgICogcm91bmQtdHJpcCB0byB0aGUgdW5kZXJseWluZyBtb2RlbCAoYSB0b29sIGNhbGwgY29uc3VtZXMgYVxuICAgKiBzdGVwLCB0aGUgZmluYWwtdGV4dCByZXBseSBjb25zdW1lcyBvbmUgdG9vKS4gQXBwbGllcyB0b1xuICAgKiBldmVyeSBhZ2VudCByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9XG4gICAqIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhcmVuJ3Qgc3VyZmFjZWQgeWV0IGJlY2F1c2UgdGhlIHNhbWVcbiAgICogY2VpbGluZyBoYXMgYmVlbiBzdWZmaWNpZW50IGFjcm9zcyBldmVyeSB3b3JrbG9hZCB3ZSd2ZSBydW4uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0FHRU5UX01BWF9TVEVQU30gKDI1KSwgc2l6ZWQgdG8gZml0XG4gICAqIGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgIGNhbGxzXG4gICAqICsgYHByZXBhcmVfY2hhcnRgIHBlciBkYXRhc2V0ICsgdGhlIGZpbmFsLXRleHQgcmVwbHkpIHdpdGhcbiAgICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICAgKiBhbnN3ZXJpbmcuIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2YgNSB3b3VsZFxuICAgKiBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBhZnRlciAyLTMgdG9vbCBjYWxscywgc29cbiAgICogZXhwbGljaXRseSByYWlzaW5nIHRoZSBjZWlsaW5nIGhlcmUgaXMgd2hhdCBsZXRzIHRoZVxuICAgKiBhZ2VudC1tb2RlIGxvb3AgcGxheSBvdXQuXG4gICAqXG4gICAqIExvd2VyIHdoZW4gYW4gdW51c3VhbGx5IHNsb3cgb3IgZXhwZW5zaXZlIG1vZGVsIG1ha2VzIGxvbmdcbiAgICogdHVybnMgdW5hZmZvcmRhYmxlOyByYWlzZSBmb3IgZXhwbG9yYXRvcnkgd29ya2xvYWRzIHRoYXQgbmVlZFxuICAgKiB0byBkcmlsbCBkZWVwIGludG8gYSBkYXRhc2V0IHdpdGhpbiBhIHNpbmdsZSB0dXJuLlxuICAgKi9cbiAgYWdlbnRNYXhTdGVwcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdpcmUgTWFzdHJhIHNwYW5zIGludG8gQXBwS2l0J3MgZ2xvYmFsIE9UZWwgcGlwZWxpbmUgdmlhXG4gICAqIGBAbWFzdHJhL290ZWwtYnJpZGdlYC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCwgYXV0byk6IG9uIG9ubHkgd2hlblxuICAgKiAgIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIG9yXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlRgIGlzIHNldC4gV2hlbiB1bnNldCwgdGhlXG4gICAqICAgYnJpZGdlIGlzIHNraXBwZWQgc28gTWFzdHJhIGRvZXMgbm90IGxvZ1xuICAgKiAgIGBbT3RlbEJyaWRnZV0gTm8gT1RFTCBzcGFuIGZvdW5kYCBvbiB0aGUgbm9vcCB0cmFjZXIuXG4gICAqIC0gYHRydWVgOiBmb3JjZSBvbiBldmVuIHdpdGhvdXQgYW4gT1RMUCBlbmRwb2ludC5cbiAgICogLSBgZmFsc2VgOiBmb3JjZSBvZmYuXG4gICAqL1xuICBvYnNlcnZhYmlsaXR5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZlZWRiYWNrIGRlc3RpbmF0aW9uLiBgYXV0b2AgcHJlZmVycyBHZW5pZSB3aGVuIEdlbmllIEFnZW50IE1vZGUgaXNcbiAgICogYXZhaWxhYmxlLCBvdGhlcndpc2UgTUxmbG93IHdoZW4gdHJhY2luZyBpcyBjb25maWd1cmVkLCBvdGhlcndpc2Ugbm9uZS5cbiAgICogRXhwbGljaXQgYGdlbmllYCBvciBgbWxmbG93YCBmYWlscyBzdGFydHVwIHdoZW4gdW5hdmFpbGFibGUuXG4gICAqL1xuICBmZWVkYmFja01vZGU/OiBGZWVkYmFja01vZGVPcHRpb247XG4gIC8qKlxuICAgKiBFeHBvc2UgdGhlIHBsdWdpbidzIGFnZW50cyAoYW5kIG9wdGlvbmFsbHkgdG9vbHMpIGFzIGEgTWFzdHJhIE1DUFxuICAgKiBzZXJ2ZXIgc28gZXh0ZXJuYWwgTUNQIGNsaWVudHMgLSBDbGF1ZGUgRGVza3RvcCwgQ3Vyc29yLCB0aGUgTWFzdHJhXG4gICAqIHBsYXlncm91bmQsIG9yIGFub3RoZXIgYWdlbnQgLSBjYW4gY2FsbCB0aGVtIG92ZXIgdGhlIHN0YW5kYXJkIE1DUFxuICAgKiB0cmFuc3BvcnRzLiBFbmFibGVkIGJ5IGRlZmF1bHQgKGFnZW50cyBvbmx5KTogd3JhcHBpbmcgdGhlXG4gICAqIGFscmVhZHktcmVnaXN0ZXJlZCBhZ2VudHMgY29zdHMgbm90aGluZyBleHRyYSwgc28gdGhlIGVuZHBvaW50IGlzIG9uXG4gICAqIG91dCBvZiB0aGUgYm94OyBvbmx5IHRoZSBhbWJpZW50IHRvb2xzICh3aGljaCBhc3N1bWUgYW4gaW4tcHJvY2Vzc1xuICAgKiBjaGF0IHR1cm4pIHN0YXkgb2ZmIHVubGVzcyBleHBsaWNpdGx5IG9wdGVkIGluLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KSAvIGB0cnVlYDogZXhwb3NlIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgYXNcbiAgICogICBhbiBgYXNrXzxhZ2VudElkPmAgTUNQIHRvb2wgdW5kZXIgYSBzZXJ2ZXIgd2hvc2UgaWQgaXMgdGhlIHBsdWdpblxuICAgKiAgIG5hbWUuXG4gICAqIC0gYGZhbHNlYDogbm8gTUNQIGVuZHBvaW50cy5cbiAgICogLSB7QGxpbmsgTWFzdHJhTWNwQ29uZmlnfTogZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgc2VydmVyIGlkLFxuICAgKiAgIGFkdmVydGlzZWQgbWV0YWRhdGEsIGFuZCB3aGljaCBhZ2VudHMgLyB0b29scyBhcmUgZXhwb3NlZC5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCB0aGUgc3RvY2sgTWFzdHJhIE1DUCByb3V0ZXMgbW91bnQgdW5kZXIgdGhlIHBsdWdpbidzXG4gICAqIGJhc2UgcGF0aCAobm8gYmVzcG9rZSByb3V0ZSBpcyBhZGRlZCAtIHRoZSBzZXJ2ZXIgaXMgaGFuZGVkIHRvIHRoZVxuICAgKiBgTWFzdHJhYCBpbnN0YW5jZSB2aWEgYG1jcFNlcnZlcnNgLCB3aGljaCBgQG1hc3RyYS9leHByZXNzYCBzZXJ2ZXMpOlxuICAgKlxuICAgKiAtIFN0cmVhbWFibGUgSFRUUDogYFBPU1QgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9tY3BgXG4gICAqIC0gU1NFIChsZWdhY3kpOiAgICBgR0VUICAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L3NzZWBcbiAgICogICAgICAgICAgICAgICAgICAgIGBQT1NUIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vbWVzc2FnZXNgXG4gICAqXG4gICAqIFJlcXVlc3RzIHJ1biB1bmRlciB0aGUgc2FtZSBBcHBLaXQgT0JPIHNjb3BlIGFzIHRoZSBjaGF0IHJvdXRlcywgc29cbiAgICogYW4gYWdlbnQgaW52b2tlZCBvdmVyIE1DUCByZXNvbHZlcyBpdHMgbW9kZWwgYW5kIHRvb2xzIGFzIHRoZVxuICAgKiBjYWxsaW5nIHVzZXIuXG4gICAqL1xuICBtY3A/OiBib29sZWFuIHwgTWFzdHJhTWNwQ29uZmlnO1xuICAvKipcbiAgICogSG93IG11Y2ggb2YgdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIG1hbmFnZW1lbnQgQVBJIGlzIHJlYWNoYWJsZVxuICAgKiB0aHJvdWdoIHRoZSBwbHVnaW4gbW91bnQuIGBAbWFzdHJhL2V4cHJlc3NgIHJlZ2lzdGVycyBpdHMgZnVsbCByb3V0ZVxuICAgKiB0YWJsZSAoYWdlbnQgaW5mZXJlbmNlIHBsdXMgYWRtaW4gLyBtdXRhdGluZyByb3V0ZXM6IGRpcmVjdCB0b29sXG4gICAqIGV4ZWN1dGlvbiwgd29ya2Zsb3cgY29udHJvbCwgcmF3IG1lbW9yeSByZWFkL3dyaXRlLCB0ZWxlbWV0cnksIGxvZ3MsXG4gICAqIHNjb3JlcykuIEFwcEtpdCBhbHJlYWR5IGF1dGhlbnRpY2F0ZXMgZXZlcnkgcmVxdWVzdCBhcyB0aGUgT0JPIHVzZXIsXG4gICAqIGJ1dCBub3RoaW5nIHRoZXJlIHJlc3RyaWN0cyAqd2hpY2gqIG9mIHRob3NlIG9wZXJhdGlvbnMgdGhlIGJyb3dzZXJcbiAgICogY2xpZW50IG1heSBpbnZva2UuXG4gICAqXG4gICAqIC0gYFwic2NvcGVkXCJgIChkZWZhdWx0KTogb25seSB0aGUgcm91dGVzIHRoZSBjaGF0IGNsaWVudCBsZWdpdGltYXRlbHlcbiAgICogICBuZWVkcyBhcmUgZGlzcGF0Y2hlZCB0byBNYXN0cmEgLSBhZ2VudCBpbmZlcmVuY2VcbiAgICogICAoYHN0cmVhbWAgLyBgZ2VuZXJhdGVgIC8gYG5ldHdvcmtgKSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGlzXG4gICAqICAgcGx1Z2luJ3Mgb3duIE9CTy0gYW5kIHJlc291cmNlLXNjb3BlZCBgL3JvdXRlLypgIHJvdXRlcyAoaGlzdG9yeSAvXG4gICAqICAgdGhyZWFkcyksIGFuZCwgd2hlbiB7QGxpbmsgbWNwfSBpcyBlbmFibGVkLCB0aGUgTUNQIHRyYW5zcG9ydC5cbiAgICogICBFdmVyeXRoaW5nIGVsc2UgKHRvb2wgZXhlY3V0aW9uLCB3b3JrZmxvdyBjb250cm9sLCByYXcgbWVtb3J5LFxuICAgKiAgIHRlbGVtZXRyeSwgbG9ncywgc2NvcmVzLCBhbmQgb3RoZXIgbXV0YXRpb25zKSBpcyByZWplY3RlZCB3aXRoXG4gICAqICAgYDQwM2AgYmVmb3JlIGl0IHJlYWNoZXMgTWFzdHJhLlxuICAgKiAtIGBcImZ1bGxcImA6IGRpc3BhdGNoIHRoZSBlbnRpcmUgc3RvY2sgTWFzdHJhIEFQSS4gVXNlIG9ubHkgZm9yIGFcbiAgICogICB0cnVzdGVkIGZpcnN0LXBhcnR5IGNvbnNvbGUgdGhhdCBnZW51aW5lbHkgbmVlZHMgdGhlIG1hbmFnZW1lbnRcbiAgICogICBzdXJmYWNlLlxuICAgKi9cbiAgYXBpQWNjZXNzPzogXCJzY29wZWRcIiB8IFwiZnVsbFwiO1xuICAvKipcbiAgICogV2hpY2ggRGF0YWJyaWNrcyBpZGVudGl0eSB0aGUgYWdlbnRzJyB3b3Jrc3BhY2UgY2FsbHMgcnVuIGFzOiB0aGVcbiAgICogc2VydmluZy1lbmRwb2ludCBjYXRhbG9ndWUgYmVoaW5kIHRoZSBtb2RlbCBwaWNrZXIsIEdlbmllIHN1Z2dlc3Rpb25zLFxuICAgKiBgYXNrX2dlbmllYCwgYW5kIHRoZSBTdGF0ZW1lbnQgRXhlY3V0aW9uIGZldGNoIGJlaGluZCBhIGBbZGF0YTo8aWQ+XWBcbiAgICogZW1iZWQuIEZhbGxzIGJhY2sgdG8gYE1BU1RSQV9HRU5JRV9JREVOVElUWWAsIHRoZW4gYFwidXNlclwiYC5cbiAgICpcbiAgICogT24tYmVoYWxmLW9mIChPQk8pIGF1dGggcmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBhIG1lbWJlciBvZiB0aGVcbiAgICogV09SS1NQQUNFLCBub3QganVzdCBvZiB0aGUgRGF0YWJyaWNrcyBhY2NvdW50LiBBbiBhcHAgc2hhcmVkIHdpdGggYW5cbiAgICogYWNjb3VudC1sZXZlbCBncm91cCBjYW4gYmUgb3BlbmVkIGJ5IHNvbWVvbmUgd2hvc2UgdG9rZW4gaXMgdmFsaWQgYnV0IHdob3NlXG4gICAqIGV2ZXJ5IHdvcmtzcGFjZSBjYWxsIGZhaWxzIHdpdGggYFVuYXV0aG9yaXplZCBhY2Nlc3MgdG8gT3JnOiA8aWQ+YCAtIGFuZFxuICAgKiBncmFudGluZyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLCBzaW5jZSBhIHdvcmtzcGFjZVxuICAgKiBjYXBzIG1lbWJlcnNoaXAgd2VsbCBiZWxvdyB0aGUgc2l6ZSBvZiBhIGxhcmdlIGFjY291bnQncyB1c2VyIGdyb3VwLiBUaGVcbiAgICogYXBwJ3Mgc2VydmljZSBwcmluY2lwYWwgYWxyZWFkeSBob2xkcyB0aGUgZ3JhbnRzIHRoZSBhcHAgd2FzIGRlcGxveWVkIHdpdGguXG4gICAqXG4gICAqIC0gYFwidXNlclwiYCAoZGVmYXVsdCk6IGFsd2F5cyBPQk8uIFBlci11c2VyIGF0dHJpYnV0aW9uLCBhbmQgR2VuaWUgLyBVbml0eVxuICAgKiAgIENhdGFsb2cgcm93IGZpbHRlcnMgYXBwbHkgcGVyIHVzZXIuIENvcnJlY3Qgd2hlbiBldmVyeSBjYWxsZXIgaXMgYVxuICAgKiAgIHdvcmtzcGFjZSBtZW1iZXIuXG4gICAqIC0gYFwic2VydmljZS1wcmluY2lwYWxcImA6IGFsd2F5cyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLiBOZWVkcyBubyBPQk9cbiAgICogICBzY29wZXMgYW5kIHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwLCBhdCB0aGUgY29zdCBvZlxuICAgKiAgIHBlci11c2VyIGF0dHJpYnV0aW9uIGluIEdlbmllIC8gVW5pdHkgQ2F0YWxvZy5cbiAgICogLSBgXCJhdXRvXCJgOiBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsXG4gICAqICAgd2hlbiBpdCBkb2VzIG5vdC4gRm9yIGFuIGFwcCBzZXJ2aW5nIEJPVEggdGhlIHBsYXRmb3JtIGZyb250IGRvb3IgYW5kIGFcbiAgICogICBkb29yIHRoYXQgaGFzIG5vIHRva2VuIHRvIGZvcndhcmQgLSBhIGBAZGJ4LXRvb2xzL3R1bm5lbGAgZ2F0ZSwgYVxuICAgKiAgIFRlYW1zIGNoYW5uZWwgLSB3aGVyZSBBcHBLaXQncyBgYXNVc2VyYCB3b3VsZCBvdGhlcndpc2UgdGhyb3dcbiAgICogICBgQXV0aGVudGljYXRpb25FcnJvcmAgb3V0c2lkZSBgTk9ERV9FTlY9ZGV2ZWxvcG1lbnRgLlxuICAgKlxuICAgKiBUaGUgc2VydmljZS1wcmluY2lwYWwgcGF0aCBjaGFuZ2VzIG9ubHkgdGhlIERhdGFicmlja3MgQ1JFREVOVElBTC4gTWVtb3J5XG4gICAqIHRocmVhZHMsIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0cmFjZSBtZXRhZGF0YSBzdGlsbCBrZXkgb2ZmIHRoZVxuICAgKiBmb3J3YXJkZWQgdXNlciwgc28gY2FsbGVycyBzaGFyaW5nIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCdzIGRhdGEgYWNjZXNzIGtlZXBcbiAgICogc2VwYXJhdGUgY29udmVyc2F0aW9ucyBhbmQgY2Fubm90IHJlYWQgZWFjaCBvdGhlcidzIHRocmVhZHMgb3IgY2hhcnRzLlxuICAgKiBEaXJlY3QgR2VuaWUgY2hhdCBkb2VzIG5vdCB1c2UgdGhpcyBvcHRpb246IGl0cyBjb252ZXJzYXRpb25zIGFuZCBtZXNzYWdlc1xuICAgKiBhbHdheXMgcnVuIHVuZGVyIEFwcEtpdCBPQk8gc28gR2VuaWUgcmVtYWlucyB0aGUgcGVyLXVzZXIgc3RhdGUgb3duZXIuXG4gICAqXG4gICAqIEBleGFtcGxlIEFuIGFwcCBhbnkgYWNjb3VudCB1c2VyIGNhbiBvcGVuXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7IGdlbmllSWRlbnRpdHk6IFwic2VydmljZS1wcmluY2lwYWxcIiwgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogc3BhY2VJZCB9IH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGUgT25lIGFwcCBiZWhpbmQgYm90aCB0aGUgZnJvbnQgZG9vciBhbmQgYSBwdWJsaWMgdHVubmVsXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7IGdlbmllSWRlbnRpdHk6IFwiYXV0b1wiLCBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBzcGFjZUlkIH0gfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2VuaWVJZGVudGl0eT86IE1hc3RyYUlkZW50aXR5TW9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJyYW5kIGNvbnRleHQgYXBwbGllZCB0byBjaGFydHMgcHJvZHVjZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAqIGByZW5kZXJfZGF0YWAgLyBgcHJlcGFyZV9jaGFydGAgdG9vbHMuIFdoZW4gc2V0LCB0aGUgY2hhcnQgcGxhbm5lcidzXG4gICAqIEVjaGFydHMgb3V0cHV0IGlzIHRoZW1lZCB3aXRoIHRoZSBicmFuZCdzIHBhbGV0dGUgKHNlcmllcyBjb2xvcnMgZGVyaXZlZFxuICAgKiBmcm9tIGBjb2xvcnMucHJpbWFyeWAgLyBgY29sb3JzLmFjY2VudGApIGFuZCBzYW5zIGZvbnRcbiAgICogKGB0eXBvZ3JhcGh5LnNhbnNgKSBpbnN0ZWFkIG9mIEVjaGFydHMnIGRlZmF1bHRzLiBPbWl0IGZvciB0aGUgZGVmYXVsdFxuICAgKiBFY2hhcnRzIGxvb2suXG4gICAqXG4gICAqIFBhc3MgdGhlIHBvcnRhYmxlIHtAbGluayBCcmFuZENvbnRleHR9IHNoYXJlZCBhY3Jvc3MgdGhlIFVJIGFuZFxuICAgKiBsaWJyYXJpZXMgKGUuZy4gYGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHRgIGZyb20gYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgLFxuICAgKiBvciBhIGN1c3RvbWVyIGJyYW5kKSAtIHRoZSBzYW1lIG9iamVjdCB0aGUgZW1haWwgYWRkLW9uIGFuZCB0aGUgVUlcbiAgICogYEJyYW5kUHJvdmlkZXJgIGNvbnN1bWUsIHNvIGEgaG9zdCB0aGVtZXMgY2hhcnRzLCBlbWFpbCwgYW5kIFVJIGZyb20gb25lXG4gICAqIHNvdXJjZS5cbiAgICovXG4gIGJyYW5kPzogQnJhbmRDb250ZXh0O1xuICAvKipcbiAgICogUmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgbWF0ZXJpYWxpemVkIG9uY2UgYXQgYXBwIHN0YXJ0dXAuIEEgc2luZ2xlXG4gICAqIHNvdXJjZSwgYSBsaXN0LCBvciBhIGB7IHNvdXJjZXMsIGZhaWxPbkVycm9yPywgLi4uIH1gIGJhZy5cbiAgICpcbiAgICogRWFjaCBzb3VyY2UgaXMgYSBHaXRIdWIgYG93bmVyL3JlcG9gLCBhIGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZGlyZWN0XG4gICAqIGBTS0lMTC5tZGAgLyBhcmNoaXZlIGRvd25sb2FkIFVSTC4gUmVzb2x1dGlvbiBwcmVmZXJzIHRoZSBPUFRJT05BTCBgc2tpbGxzYFxuICAgKiBucG0gQ0xJIChhIHBlZXIgZGVwKSB3aGljaCBpcyBjb3BpZWQgaW50byBhIHRlbXAgZGlyIGFuZCB0aGVuIHBlcnNpc3RlZDtcbiAgICogd2l0aG91dCBpdCwgYSBVUkwgc291cmNlIGlzIGZldGNoZWQgZGlyZWN0bHkuIEEgc291cmNlIHRoYXQgcmVzb2x2ZXNcbiAgICogdGhyb3VnaCBuZWl0aGVyIGZhaWxzIHN0YXJ0dXAgdW5sZXNzIGBmYWlsT25FcnJvcjogZmFsc2VgLlxuICAgKlxuICAgKiBBSSBUb29scyBpcyBjYWNoZWQgZGFpbHkgd2l0aCBgQGRieC10b29scy9jYWNoZWAgYW5kIHNlcnZlZCB0byBldmVyeVxuICAgKiBhdXRvLWNyZWF0ZWQgd29ya3NwYWNlIGZyb20gdGhlIHNoYXJlZCBgLy5kYXRhYnJpY2tzL3NraWxsc2AgbWVtb3J5IG1vdW50LlxuICAgKiBPdGhlciBzb3VyY2VzIGFyZSB3cml0dGVuIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIncyBBc3Npc3RhbnQgc2tpbGxzIGZvbGRlclxuICAgKiB3aGVuIHdyaXRhYmxlLCB3aXRoIGEgcmVhZC1vbmx5IGxvY2FsLW1lbW9yeSBmYWxsYmFjay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcInZlcmNlbC1sYWJzL2FnZW50LXNraWxsc1wiIH0pO1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIHJlbW90ZVNraWxsczoge1xuICAgKiAgICAgc291cmNlczogW1widmVyY2VsLWxhYnMvYWdlbnQtc2tpbGxzXCIsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9za2lsbC5tZFwiXSxcbiAgICogICAgIGZhaWxPbkVycm9yOiBmYWxzZSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICByZW1vdGVTa2lsbHM/OiBSZW1vdGVTa2lsbHNPcHRpb247XG4gIC8qKiBSZWFkLW9ubHkgbG9jYWwgc2tpbGwgdHJlZXMgbW91bnRlZCBmb3IgZmlsZXMsIHNlYXJjaGFibGUgYnkgcGF0aCwgYW5kIHBhc3NlZCBhcyBzdGFuZGFyZCBhZ2VudC1sZXZlbCBza2lsbHMuICovXG4gIGxvY2FsU2tpbGxNb3VudHM/OiBMb2NhbFNraWxsTW91bnRbXTtcbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSBwdWJsaXNoZWQgb24gdGhlIG1hbmlmZXN0J3MgYGNvbmZpZy5zY2hlbWFgLCBtaXJyb3JpbmcgdGhlXG4gKiBkb2N1bWVudGVkIGRlZmF1bHRzIGFuZCBlbnZpcm9ubWVudCBmYWxsYmFja3Mgb2Yge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZ30uXG4gKlxuICogQ292ZXJzIHRoZSBKU09OLWV4cHJlc3NpYmxlIG9wdGlvbnMgb25seS4gYGFnZW50c2AsIGB0b29sc2AsIGFuZCBhXG4gKiBgZGVmYXVsdE1vZGVsYCBwYXNzZWQgYXMgYSBNYXN0cmEgYER5bmFtaWNBcmd1bWVudGAgYXJlIGNvZGUtZGVmaW5lZFxuICogKGZ1bmN0aW9ucyAvIGNsYXNzIGluc3RhbmNlcyksIHNvIHRoZXkgY2Fycnkgbm8gc2NoZW1hIGVudHJ5OyB0aGVcbiAqIGBkZWZhdWx0TW9kZWxgIHByb3BlcnR5IGJlbG93IGRlc2NyaWJlcyBpdHMgc3RyaW5nIGZvcm0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfQ09ORklHX1NDSEVNQTogQ29uZmlnU2NoZW1hID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgYmFja2dyb3VuZFR1cm5zOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlJ1biB0dXJucyB0aHJvdWdoIE1hc3RyYSBldmVudGVkIGR1cmFibGUgZXhlY3V0aW9uIHNvIHRoZXkgY29udGludWUgYWZ0ZXIgYnJvd3NlciBkaXNjb25uZWN0cyBhbmQgcmVtYWluIHJlY29ubmVjdGFibGUgYnkgcnVuIGlkLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgcHJvdmlkZXJJZDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiAnQUkgU0RLIHByb3ZpZGVyLW9wdGlvbnMgbmFtZXNwYWNlLiBEZWZhdWx0cyB0byBcIm9wZW5haVwiLicsXG4gICAgfSxcbiAgICByZW1vdGVTa2lsbHM6IHtcbiAgICAgIHR5cGU6IFtcInN0cmluZ1wiLCBcImFycmF5XCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdSZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBwcm92aXNpb25lZCBhdCBzdGFydHVwIGFuZCBwYXNzZWQgdGhyb3VnaCBNYXN0cmEgc3RhbmRhcmQgYWdlbnQtbGV2ZWwgc2tpbGwgdG9vbHM6IFwiYWl0b29sc1wiIGZvciBEYXRhYnJpY2tzXFwnIG93biBza2lsbCBzZXQsIGEgR2l0SHViIG93bmVyL3JlcG8sIGEgZ2l0L0dpdExhYiBVUkwsIG9yIGEgZGlyZWN0IFNLSUxMLm1kL2FyY2hpdmUgVVJMLiBTb3VyY2VzIHJldGFpbiBhIHByb2Nlc3MtbWVtb3J5IGNvcHkgZXZlbiB3aGVuIHBlcnNpc3RlZCB0byB0aGUgRGF0YWJyaWNrcyB1c2VyIEFzc2lzdGFudCBza2lsbHMgZm9sZGVyLicsXG4gICAgfSxcbiAgICBzdG9yYWdlOiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9zdGdyZXNTdG9yZSBmb3IgTWFzdHJhIHRocmVhZHMgLyBtZXNzYWdlcy4gYHRydWVgIGNhcHR1cmVzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbidzIGV4aXN0aW5nIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2w7IGFuIG9iamVjdCBvcGVucyBhIHNlcGFyYXRlbHkgY29uZmlndXJlZCBzdG9yZS4gQXV0by1lbmFibGVkIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuXCIsXG4gICAgfSxcbiAgICBtZW1vcnk6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQZ1ZlY3RvciBzdG9yZSBmb3IgTWFzdHJhIHNlbWFudGljIHJlY2FsbC4gYHRydWVgIGNhcHR1cmVzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbidzIGV4aXN0aW5nIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2w7IGFuIG9iamVjdCBvcGVucyBhIHNlcGFyYXRlbHkgY29uZmlndXJlZCBzdG9yZS4gQXV0by1lbmFibGVkIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuXCIsXG4gICAgfSxcbiAgICBjb2RlTW9kZToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkV4cG9zZSBhbGwgZXhlY3V0YWJsZSB0b29scyBhdmFpbGFibGUgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdCB0aHJvdWdoIG5hdGl2ZSBNYXN0cmEgQ29kZSBNb2RlIGZvciBUeXBlU2NyaXB0IGJhdGNoaW5nLCBhZ2dyZWdhdGlvbiwgYW5kIGFyaXRobWV0aWMuIFRoZSBwbHVnaW4gdXNlcyBNYXN0cmEgaXNvbGF0ZWQtdm0gd2l0aCB0aGUgZXhpc3RpbmcgUXVpY2tKUyBmYWxsYmFjazsgbmVpdGhlciB0cmFuc3BvcnQgcnVucyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2UgY29tbWFuZCBzYW5kYm94LCBzbyBTU0ggaXMgdXNlZCBvbmx5IHdoZW4gYW4gU1NILWJhY2tlZCB0b29sIGlzIGNhbGxlZC4gRmFsc2UgZGlzYWJsZXMgaXQuXCIsXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwic3RyaW5nXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdDb21tYW5kIHNhbmRib3ggZm9yIGF1dG8tY3JlYXRlZCBhZ2VudCB3b3Jrc3BhY2VzLiBEZWZhdWx0cyB0byBNb250eS4gRmFsc2UgZGlzYWJsZXMgY29tbWFuZCBleGVjdXRpb247IHRydWUgb3IgXCJtb250eVwiIHNlbGVjdHMgTW9udHk7IGFuIGV4cGxpY2l0IHNhbmRib3ggb3IgcmVzb2x2ZXIgc3VwcGxpZXMgYW5vdGhlciB0cmFuc3BvcnQuJyxcbiAgICB9LFxuICAgIHdvcmtzcGFjZUZhbGxiYWNrVG9UbXA6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQWRkIHVzZXItc2NvcGVkIC90bXAgdG8gYXV0by1jcmVhdGVkIGFnZW50IHdvcmtzcGFjZXMgb25seSB3aGVuIG5vIGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBwYXRoIG1vdW50cyB3cml0YWJsZS4gRGVmYXVsdHMgdG8gZmFsc2UuXCIsXG4gICAgfSxcbiAgICB3b3Jrc3BhY2VTa2lsbHM6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJVc2UgTWFzdHJhJ3MgbmF0aXZlIG9uLWRlbWFuZCB3b3Jrc3BhY2Ugc2tpbGwgc2VhcmNoIGFuZCB3cml0YWJsZSBza2lsbCBzYXZlcy4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIHdvcmtzcGFjZVRvb2xzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2UgdG9vbCBjb25maWd1cmF0aW9uIGZvciBhdmFpbGFiaWxpdHksIGFwcHJvdmFscywgcmVhZC1iZWZvcmUtd3JpdGUsIG91dHB1dCBsaW1pdHMsIGFuZCBob29rcy5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRBZ2VudDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFnZW50IGlkIHVzZWQgd2hlbiB0aGUgY2xpZW50IG5hbWVzIG5vbmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCByZWdpc3RlcmVkIGFnZW50LCBlbHNlIHRoZSBidWlsdC1pbiBgZGVmYXVsdGAuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTZXJ2aW5nIGVuZHBvaW50IGFwcGxpZWQgdG8gZXZlcnkgYWdlbnQgdGhhdCBvbWl0cyBpdHMgb3duIG1vZGVsLiBGYWxscyBiYWNrIHRvIERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FLCB0aGVuIHRoZSBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIGNhdGFsb2d1ZSBlbmRwb2ludC5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRNb2RlbEZhbGxiYWNrczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJpb3JpdHktb3JkZXJlZCBlbmRwb2ludCBuYW1lcyB0cmllZCBiZWZvcmUgdGhlIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBlbHNlIHBpbnMgYSBtb2RlbC5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlNYXRjaDoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSB3b3Jrc3BhY2UgY2F0YWxvZ3VlLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eVRocmVzaG9sZDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGZvciB0aGUgZnV6enkgbWF0Y2hlciwgMCAoZXhhY3QpIHRvIDEgKGFueXRoaW5nKS4gRGVmYXVsdHMgdG8gMC40LlwiLFxuICAgIH0sXG4gICAgbW9kZWxDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVFRMIGluIG1zIGZvciB0aGUgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgcGVyIHdvcmtzcGFjZSBob3N0LiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXCIsXG4gICAgfSxcbiAgICBtb2RlbE92ZXJyaWRlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhvbm9yIGEgcGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGUgZnJvbSB0aGUgWC1NYXN0cmEtTW9kZWwgaGVhZGVyLCA/bW9kZWw9IHF1ZXJ5LCBvciBhIGBtb2RlbGAgYm9keSBmaWVsZC4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgdHlwZTogW1wic3RyaW5nXCIsIFwib2JqZWN0XCJdIH0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJHZW5pZSBzcGFjZXMgdGhlIGFnZW50cyBjYW4gZGVsZWdhdGUgdG8sIGtleWVkIGJ5IGFsaWFzICh0aGUgdG9vbC1uYW1lIHN1ZmZpeCkuIEVhY2ggdmFsdWUgaXMgYSBzcGFjZSBpZCBvciBgeyBzcGFjZUlkLCBoaW50IH1gLiBGYWxscyBiYWNrIHRvIHRoZSBgZ2VuaWVgIHBsdWdpbidzIG93biBgc3BhY2VzYCBjb25maWcsIHRoZW4gREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzLlwiLFxuICAgIH0sXG4gICAgZ2VuaWVBZ2VudE1vZGU6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVXNlIHRoZSBzdHJlYW1pbmcgR2VuaWUgQWdlbnQgTW9kZSBBUEkgZm9yIGFnZW50LWJhY2tlZCBhc2tfZ2VuaWUuIERlZmF1bHRzIHRvIHRydWU7IGZhbHNlIGZvcmNlcyBsZWdhY3kgcG9sbGluZy4gRmVhdHVyZS1kaXNhYmxlZCBvciBwcmV2aWV3LXRvZ2dsZSByZXNwb25zZXMgZmFsbCBiYWNrIGF1dG9tYXRpY2FsbHkgYmVmb3JlIHN0cmVhbWluZy4gRGlyZWN0IEdlbmllIGNoYXQgYWx3YXlzIHJlcXVpcmVzIEFnZW50IE1vZGUuXCIsXG4gICAgfSxcbiAgICBnZW5pZVNwYWNlQ2FjaGVUdGxNczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRUTCBpbiBtcyBmb3IgdGhlIEdlbmllIHNwYWNlIG1ldGFkYXRhIGNhY2hlLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXCIsXG4gICAgfSxcbiAgICBhZ2VudE1heFN0ZXBzOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuIChhIHRvb2wgY2FsbCBhbmQgdGhlIGZpbmFsIHJlcGx5IGVhY2ggY29uc3VtZSBvbmUpLiBEZWZhdWx0cyB0byAyNS5cIixcbiAgICB9LFxuICAgIHN0cmlwU3RhbGVDaGFydHM6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU3RyaXAgY2hhcnRJZHMgZnJvbSByZWNhbGxlZCBhc3Npc3RhbnQgdG9vbCByZXN1bHRzIHNvIHRoZSBtb2RlbCBjYW5ub3QgcmV1c2UgYSB0dXJuLXNjb3BlZCBjaGFydCBtYXJrZXIuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBzdHlsZUluc3RydWN0aW9uczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYm9vbGVhblwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlN0eWxlIGd1YXJkcmFpbHMgYXBwZW5kZWQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuIEEgc3RyaW5nIHJlcGxhY2VzIHRoZSBidWlsdC1pbiBibG9jaywgYGZhbHNlYCBkaXNhYmxlcyBpdC5cIixcbiAgICB9LFxuICAgIG9ic2VydmFiaWxpdHk6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQnJpZGdlIE1hc3RyYSBzcGFucyBpbnRvIEFwcEtpdCdzIE9UZWwgcGlwZWxpbmUuIERlZmF1bHRzIHRvIG9uIG9ubHkgd2hlbiBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQgb3IgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVCBpcyBzZXQuXCIsXG4gICAgfSxcbiAgICBmZWVkYmFja01vZGU6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJhdXRvXCIsIFwiZ2VuaWVcIiwgXCJtbGZsb3dcIiwgXCJub25lXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRmVlZGJhY2sgZGVzdGluYXRpb24uIEF1dG8gcHJlZmVycyBHZW5pZSBpbiBHZW5pZSBBZ2VudCBNb2RlLCBvdGhlcndpc2UgTUxmbG93IHdoZW4gY29uZmlndXJlZCwgb3RoZXJ3aXNlIG5vbmUuIEV4cGxpY2l0IHVuYXZhaWxhYmxlIG1vZGVzIGZhaWwgc3RhcnR1cC5cIixcbiAgICB9LFxuICAgIG1jcDoge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkV4cG9zZSB0aGUgcmVnaXN0ZXJlZCBhZ2VudHMgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGFnZW50cy1vbmx5OyBhbiBvYmplY3QgdHVuZXMgdGhlIHNlcnZlciBpZCwgYWR2ZXJ0aXNlZCBtZXRhZGF0YSwgYW5kIHdoZXRoZXIgYW1iaWVudCB0b29scyBhcmUgZXhwb3NlZC5cIixcbiAgICB9LFxuICAgIGdlbmllSWRlbnRpdHk6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAvLyBEZXJpdmVkIGZyb20gdGhlIHJlc29sdmVyJ3Mgb3duIGxpc3QsIHNvIGEgbW9kZSBjYW4gbmV2ZXIgYmUgYWNjZXB0ZWQgYXRcbiAgICAgIC8vIHJ1bnRpbWUgd2hpbGUgdGhlIHB1Ymxpc2hlZCBzY2hlbWEgKGFuZCB0aGUgVUkgYnVpbHQgZnJvbSBpdCkgb21pdHMgaXQuXG4gICAgICBlbnVtOiBbLi4uSURFTlRJVFlfTU9ERVNdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IGFnZW50LWJhY2tlZCB3b3Jrc3BhY2UgY2FsbHMgKHNlcnZpbmcgY2F0YWxvZ3VlLCBHZW5pZSwgc3RhdGVtZW50IGV4ZWN1dGlvbikgcnVuIGFzLiBEaXJlY3QgR2VuaWUgY2hhdCBhbHdheXMgdXNlcyBPQk8uIFwidXNlclwiIChkZWZhdWx0KSBpcyBhbHdheXMgT0JPLCBzbyBjYWxsZXJzIG11c3QgYmUgd29ya3NwYWNlIG1lbWJlcnM7IFwic2VydmljZS1wcmluY2lwYWxcIiBhbHdheXMgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLCBzbyBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwIHdvcmtzLCBhdCB0aGUgY29zdCBvZiBwZXItdXNlciBhdHRyaWJ1dGlvbjsgXCJhdXRvXCIgdXNlcyBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiBhbmQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIHdoZW4gaXQgZG9lcyBub3QsIGZvciBhbiBhcHAgdGhhdCBhbHNvIHNlcnZlcyBhIHR1bm5lbCBvciB3ZWJob29rIGRvb3IuIEZhbGxzIGJhY2sgdG8gTUFTVFJBX0dFTklFX0lERU5USVRZLicsXG4gICAgfSxcbiAgICBhcGlBY2Nlc3M6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJzY29wZWRcIiwgXCJmdWxsXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgbXVjaCBvZiB0aGUgc3RvY2sgQG1hc3RyYS9leHByZXNzIEFQSSBpcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW91bnQuIFwic2NvcGVkXCIgKGRlZmF1bHQpIGFsbG93cyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpcyBwbHVnaW5cXCdzIG93biByb3V0ZXMsIGFuZCBNQ1A7IFwiZnVsbFwiIGRpc3BhdGNoZXMgdGhlIGVudGlyZSBtYW5hZ2VtZW50IHN1cmZhY2UuJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9ydGFibGUgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGdlbmVyYXRlZCBjaGFydHMgKHNlcmllcyBwYWxldHRlIGZyb20gY29sb3JzLnByaW1hcnkgLyBjb2xvcnMuYWNjZW50LCBiYXNlIGZvbnQgZnJvbSB0eXBvZ3JhcGh5LnNhbnMpLlwiLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQU1uRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQVc1RixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUd4RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQztBQUN6RCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLENBQUM7QUFFdkQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQztBQUV6RDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBc0I7SUFDM0Qsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FB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QUEyRTtZQUMzRSwwRUFBMEU7WUFDMUUsSUFBSSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUM7WUFDekIsV0FBVyxFQUNULGdpQkFBZ2lCO1NBQ25pQjtRQUNELFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQ1QscU9BQXFPO1NBQ3hPO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsMElBQTBJO1NBQzdJO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgc2hhcmVkIGBSZXF1ZXN0Q29udGV4dGAga2V5cy5cbiAqXG4gKiBPd25zIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdFxuICogY29uZmlnKSBhbmQge0BsaW5rIE1BU1RSQV9DT05GSUdfU0NIRU1BfSwgdGhlIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdFxuICogcHVibGlzaGVzIGZvciBpdCBzbyBzY2FmZm9sZGluZyB0b29scyBhbmQgYWdlbnRzIGNhbiByZWFkIHRoZSBvcHRpb24gc2V0LlxuICpcbiAqIFByZWNlZGVuY2UgcGVyIGZpZWxkIGlzIGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZSBuYW1lZCBvbiB0aGUgZmllbGQsIHRoZW4gYSBidWlsdC1pbiBkZWZhdWx0LlxuICpcbiAqIEtlcHQgaW4gYSBsZWFmIG1vZHVsZSBzbyBgcGx1Z2luLnRzYCwgYHNlcnZlci50c2AsIGBtb2RlbC50c2AsIGFuZFxuICogYG1lbW9yeS50c2AgY2FuIGltcG9ydCB0aGVtIHdpdGhvdXQgY3JlYXRpbmcgYSBjeWNsZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIENvbmZpZ1NjaGVtYSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBGZWVkYmFja01vZGVPcHRpb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhL2ZlZWRiYWNrXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50Q29uZmlnIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEFueVdvcmtmbG93IH0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3JrZmxvd3NcIjtcbmltcG9ydCB0eXBlIHtcbiAgV29ya3NwYWNlU2FuZGJveCxcbiAgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyLFxuICBXb3Jrc3BhY2VUb29sc0NvbmZpZyxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUGdWZWN0b3JDb25maWcsIFBvc3RncmVzU3RvcmVDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhVG9vbHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB0eXBlIHsgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHsgSURFTlRJVFlfTU9ERVMsIHR5cGUgTWFzdHJhSWRlbnRpdHlNb2RlIH0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB0eXBlIHsgTG9jYWxTa2lsbE1vdW50LCBSZW1vdGVTa2lsbHNPcHRpb24gfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcmVzb2x2ZWQgQXBwS2l0IHVzZXIuIGBtb2RlbC50c2AgcmVhZHMgaXQgdG8gbWludCB1c2VyLXNjb3BlZFxuICogRGF0YWJyaWNrcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9LRVkgPSBcIm1hc3RyYV9fdXNlclwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyBmb3IgQXBwS2l0IHVzZXIgbWV0YWRhdGEgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFN1cmZhY2VkIGFzIHRyYWNlIG1ldGFkYXRhIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyB0cmFjZXMgYXJlIGZpbHRlcmFibGUgYnkgd2hvXG4gKiBpc3N1ZWQgdGhlIHJlcXVlc3Qgd2l0aG91dCBsZWFraW5nIHRoZSBmdWxsIHVzZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfTkFNRV9LRVkgPSBcIm1hc3RyYV9fdXNlck5hbWVcIjtcbi8qKiBSZXF1ZXN0LWNvbnRleHQga2V5IGNvbnRhaW5pbmcgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlcidzIGVtYWlsIGFkZHJlc3MuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfRU1BSUxfS0VZID0gXCJtYXN0cmFfX3VzZXJFbWFpbFwiO1xuLyoqIFJlcXVlc3QtY29udGV4dCBrZXkgaWRlbnRpZnlpbmcgdGhlIERhdGFicmlja3MgY3JlZGVudGlhbCB1c2VkIGJ5IHRoZSB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9BVVRIX01PREVfS0VZID0gXCJtYXN0cmFfX2F1dGhNb2RlXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIHRoZSBwZXItSFRUUC1yZXF1ZXN0IGlkIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBSZWFkcyBgWC1SZXF1ZXN0LUlkYCBmcm9tIHRoZSBpbmNvbWluZ1xuICogaGVhZGVycyB3aGVuIHByZXNlbnQgKHNvIGFuIHVwc3RyZWFtIGxvYWQgYmFsYW5jZXIgLyBBUEkgZ2F0ZXdheVxuICogY2FuIGtlZXAgaXRzIHRyYWNlIGNvcnJlbGF0aW9uKSwgZmFsbHMgYmFjayB0byBhIGZyZXNobHkgbWludGVkXG4gKiBVVUlELiBFY2hvZWQgYmFjayBvbiB0aGUgcmVzcG9uc2UgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IHNwYW4gdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIGxvZ3MgYW5kIHRyYWNlcyBzaGFyZSBhXG4gKiBqb2luIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9SRVFVRVNUX0lEX0tFWSA9IFwibWFzdHJhX19yZXF1ZXN0SWRcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgT0F1dGggc2NvcGVzIHBhcnNlZCBmcm9tIHRoZSBmb3J3YXJkZWRcbiAqIGFjY2VzcyB0b2tlbiBieSB7QGxpbmsgTWFzdHJhU2VydmVyLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzfS5cbiAqIFdvcmtzcGFjZSBtb3VudHMgdGhhdCB0b3VjaCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcyByZXF1aXJlXG4gKiBgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIGluIHRoaXMgbGlzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9TQ09QRVNfS0VZID0gXCJtYXN0cmFfX3Njb3Blc1wiO1xuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB3ZSB3YW50IE1hc3RyYSB0byBleHRyYWN0XG4gKiBhcyBtZXRhZGF0YSBvbiBldmVyeSBvYnNlcnZhYmlsaXR5IHNwYW4gKGFnZW50IHJ1bnMsIG1vZGVsIGNhbGxzLFxuICogdG9vbCBpbnZvY2F0aW9ucywgd29ya2Zsb3cgc3RlcHMpLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIGh0dHBzOi8vbWFzdHJhLmFpL2RvY3Mvb2JzZXJ2YWJpbGl0eS90cmFjaW5nL292ZXJ2aWV3I2F1dG9tYXRpYy1tZXRhZGF0YS1mcm9tLXJlcXVlc3Rjb250ZXh0fTpcbiAqIHBhc3NlZCB2ZXJiYXRpbSBpbnRvIGBPYnNlcnZhYmlsaXR5LmNvbmZpZ3NbKl0ucmVxdWVzdENvbnRleHRLZXlzYCxcbiAqIHNvIGFueSBrZXkgbGlzdGVkIGhlcmUgaXMgcmVhZCBmcm9tIGBSZXF1ZXN0Q29udGV4dGAgYXQgdHJhY2VcbiAqIHN0YXJ0IGFuZCBhdHRhY2hlZCBhcyBzY2FsYXIgc3BhbiBtZXRhZGF0YS4gS2VlcCB0aGUgc2V0IHRvIHBsYWluXG4gKiBzY2FsYXJzIC0gbmV2ZXIgaW5jbHVkZSB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSAoaXQgY2FycmllcyB0aGVcbiAqIGZ1bGwgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggYSBgV29ya3NwYWNlQ2xpZW50YCByZWZlcmVuY2UpLlxuICpcbiAqIE9yZGVyIGlzIHB1cmVseSBjb3NtZXRpYzsgTWFzdHJhIGRlLWR1cGVzIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9BVVRIX01PREVfS0VZLFxuICAvLyBNb2RlbCBvdmVycmlkZSBrZXkgaXMgb3duZWQgYnkgYHNlcnZpbmcudHNgOyBzcGVsbGVkIGlubGluZSBoZXJlXG4gIC8vIHNvIHRoaXMgbW9kdWxlIHN0YXlzIGxlYWYtbGV2ZWwgKG5vIGN5Y2xlcyB3aXRoIGBzZXJ2aW5nLnRzYCkuXG4gIFwibWFzdHJhX19tb2RlbF9vdmVycmlkZVwiLFxuXTtcblxuLyoqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCBwbHVzIHRoZSBjYW5vbmljYWwgdXNlciBpZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlciB7XG4gIGlkOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbkNvbnRleHQ6IGFwcGtpdC5FeGVjdXRpb25Db250ZXh0TGlrZTtcbn1cblxuLyoqXG4gKiBDYW5vbmljYWwgaWRlbnRpdHkgZm9yIGFuIEFwcEtpdCBleGVjdXRpb24gY29udGV4dDogdGhlIE9CTyB1c2VyIGlkIG9uIGFcbiAqIHVzZXItc2NvcGVkIGNhbGwsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBpZCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRpb25Db250ZXh0VXNlcklkKGNvbnRleHQ6IGFwcGtpdC5FeGVjdXRpb25Db250ZXh0TGlrZSk6IHN0cmluZyB7XG4gIHJldHVybiBcInVzZXJJZFwiIGluIGNvbnRleHQgPyBjb250ZXh0LnVzZXJJZCA6IGNvbnRleHQuc2VydmljZVVzZXJJZDtcbn1cblxuLyoqXG4gKiBXaG8gYSB0dXJuIGlzIEFUVFJJQlVURUQgdG8sIHdoaWNoIGlzIG5vdCBhbHdheXMgd2hvc2UgRGF0YWJyaWNrcyBjcmVkZW50aWFsXG4gKiBydW5zIGl0LiBBbiBPQk8gY29udGV4dCdzIG93biB1c2VyIGlkIGlzIGF1dGhvcml0YXRpdmUuIFVuZGVyIHRoZSBzZXJ2aWNlXG4gKiBwcmluY2lwYWwsIGV2ZXJ5IGNhbGxlciBzaGFyZXMgb25lIGNyZWRlbnRpYWwsIHNvIHRoZSBmb3J3YXJkZWQgdXNlciBpZCBpc1xuICogd2hhdCBrZWVwcyBtZW1vcnkgdGhyZWFkcyBhbmQgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlcyBkaXN0aW5jdDsgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCBpZCBpcyB0aGUgZmxvb3Igd2hlbiBubyB1c2VyIHdhcyBmb3J3YXJkZWQuXG4gKlxuICogVGhpcyBydWxlIGhhcyB0byBiZSBpZGVudGljYWwgZXZlcnl3aGVyZSBhIGNhY2hlIGtleSBpcyBidWlsdCwgc28gYm90aCB0aGVcbiAqIHdyaXRlIHNpZGUgKHRoZSBgUmVxdWVzdENvbnRleHRgIHVzZXIgc3RhbXBlZCBieSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgKVxuICogYW5kIHRoZSByZWFkIHNpZGUgKHRoZSBwbHVnaW4ncyBvd24gQXBwS2l0IHJvdXRlcywgd2hpY2ggaGF2ZSBhIHJlcXVlc3QgYnV0XG4gKiBubyBgUmVxdWVzdENvbnRleHRgKSBkZXJpdmUgdGhlaXIga2V5IGZyb20gdGhpcyBvbmUgZnVuY3Rpb24uIFdoZW4gdGhlIHR3b1xuICogZGlzYWdyZWVkLCBhIGNoYXJ0IHdyaXR0ZW4gdW5kZXIgdGhlIGZvcndhcmRlZCB1c2VyIGlkIHdhcyByZWFkIGJhY2sgdW5kZXJcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBpZCBhbmQgdGhlIGVtYmVkIHJvdXRlIGFuc3dlcmVkIDQwNCwgd2hpY2ggdGhlIGNoYXQgVUlcbiAqIHJlbmRlcnMgYXMgYW4gZXhwaXJlZCBjaGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dHJpYnV0ZWRVc2VySWQoXG4gIGV4ZWN1dGlvbkNvbnRleHQ6IGFwcGtpdC5FeGVjdXRpb25Db250ZXh0TGlrZSxcbiAgZm9yd2FyZGVkVXNlcklkPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgaWYgKFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQpIHJldHVybiBleGVjdXRpb25Db250ZXh0VXNlcklkKGV4ZWN1dGlvbkNvbnRleHQpO1xuICByZXR1cm4gZm9yd2FyZGVkVXNlcklkID8/IGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgZXZlcnkgcGVyLXVzZXIgY2FjaGUgZW50cnkgaXMgbmFtZXNwYWNlZCB1bmRlciwgc28gYW4gT0JPIHJlc3VsdFxuICogY2Fubm90IGJlIHJlYWQgYmFjayBieSBhbm90aGVyIGNhbGxlci5cbiAqXG4gKiBQcmVmZXJzIHRoZSB7QGxpbmsgVXNlcn0gdGhhdCB7QGxpbmsgTWFzdHJhU2VydmVyfSBzdGFtcHMgb24gdGhlIHJlcXVlc3RcbiAqIGNvbnRleHQsIHdob3NlIGlkIGFscmVhZHkgZm9sbG93cyB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0uIFRoZSBNQ1AgdHJhbnNwb3J0XG4gKiByb3V0ZXMgZG8gbm90IHRocmVhZCB0aGF0IGNvbnRleHQgaW50byB0b29sIGV4ZWN1dGlvbiwgc28gdGhvc2UgZmFsbCBiYWNrIHRvXG4gKiB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCAodGhlIGFjdGl2ZSBPQk8gc2NvcGUsIG9yIHRoZSBzZXJ2aWNlXG4gKiBwcmluY2lwYWwpLiBBIGNhbGxlciBob2xkaW5nIGFuIGV4cHJlc3MgcmVxdWVzdCBzaG91bGQgYnVpbGQgaXRzIGtleSBmcm9tXG4gKiB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0gaW5zdGVhZCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlzIG5vdCBsb3N0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHVzZXI/LmlkID8/IGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpKTtcbn1cblxuLyoqIFBnVmVjdG9yIGNvbmZpZyB3aXRoIGFuIG9wdGlvbmFsIE1hc3RyYSBzdG9yZSBpZC4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZyA9IFBnVmVjdG9yQ29uZmlnICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKiBNYXN0cmEgbmF0aXZlIHdvcmtzcGFjZSBza2lsbC1zZWFyY2ggY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhV29ya3NwYWNlU2tpbGxzQ29uZmlnIHtcbiAgLyoqIE1heGltdW0gc2tpbGwgbWF0Y2hlcyByZXR1cm5lZCBieSBvbmUgc2VhcmNoLiBEZWZhdWx0cyB0byA1LiAqL1xuICB0b3BLPzogbnVtYmVyO1xuICAvKiogTWluaW11bSBCTTI1IHJlbGV2YW5jZSBzY29yZS4gRGVmYXVsdHMgdG8gMC4xLiAqL1xuICBtaW5TY29yZT86IG51bWJlcjtcbiAgLyoqIExvYWRlZC1za2lsbCB0aHJlYWQtc3RhdGUgVFRMIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gb25lIGhvdXIuICovXG4gIHR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogTmF0aXZlIE1hc3RyYSBDb2RlIE1vZGUgZXhlY3V0aW9uIHRyYW5zcG9ydC4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYUNvZGVNb2RlVHJhbnNwb3J0ID0gXCJhdXRvXCIgfCBcImlzb2xhdGVkLXZtXCIgfCBcInF1aWNranNcIjtcblxuLyoqIE5hdGl2ZSBNYXN0cmEgQ29kZSBNb2RlIHNldHRpbmdzIGZvciBzYW5kYm94ZWQgbXVsdGktdG9vbCBvcmNoZXN0cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFDb2RlTW9kZUNvbmZpZyB7XG4gIC8qKiBDb2RlIE1vZGUgZXhlY3V0aW9uIHRyYW5zcG9ydC4gKi9cbiAgdHJhbnNwb3J0OiBNYXN0cmFDb2RlTW9kZVRyYW5zcG9ydDtcbiAgLyoqIEdlbmVyYXRlZCBvcmNoZXN0cmF0aW9uIHRvb2wgaWQuIERlZmF1bHRzIHRvIGBleGVjdXRlX3R5cGVzY3JpcHRgLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIE1heGltdW0gb3JjaGVzdHJhdGlvbiBwcm9ncmFtIHJ1bnRpbWUgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byAzMCBzZWNvbmRzLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZpbmUtZ3JhaW5lZCBjb250cm9sIGZvciB0aGUgb3B0aW9uYWwgTUNQIHNlcnZlciBleHBvc3VyZVxuICogKHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcubWNwfSkuIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsOyB0aGUgb2JqZWN0XG4gKiBmb3JtIG9ubHkgbmVlZHMgdG8gc2V0IHdoYXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFNY3BDb25maWcge1xuICAvKipcbiAgICogU2VydmVyIGlkIHVzZWQgaW4gdGhlIHJvdXRlIHBhdGggKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgYW5kIGFzIHRoZVxuICAgKiBNQ1AgcmVnaXN0cnkgaWQuIERlZmF1bHRzIHRvIHRoZSBwbHVnaW4ncyByZWdpc3RlcmVkIG5hbWUuXG4gICAqL1xuICBzZXJ2ZXJJZD86IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbmFtZSBhZHZlcnRpc2VkIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBgXCI8ZGlzcGxheU5hbWU+IE1DUFwiYC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIFNlbWFudGljIHZlcnNpb24gYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gRGVmYXVsdHMgdG8gYFwiMS4wLjBcImAuICovXG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBhZHZlcnRpc2VkIG92ZXIgTUNQLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEV4cG9zZSBldmVyeSByZWdpc3RlcmVkIGFnZW50IGFzIGFuIGBhc2tfPGFnZW50SWQ+YCBNQ1AgdG9vbC5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgIC0gdGhpcyBpcyB0aGUgXCJsZXZlcmFnZSB0aGUgTWFzdHJhIGFnZW50cyBvdmVyXG4gICAqIE1DUFwiIGJlaGF2aW9yIG1vc3QgY2FsbGVycyB3YW50LlxuICAgKi9cbiAgYWdlbnRzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFsc28gZXhwb3NlIHRoZSBwbHVnaW4ncyBhbWJpZW50IHRvb2xzICh0aGUgYnVpbHQtaW4gYHJlbmRlcl9kYXRhYFxuICAgKiBwbHVzIGFueXRoaW5nIGluIGBjb25maWcudG9vbHNgKSBhcyBNQ1AgdG9vbHMuIERlZmF1bHRzIHRvIGBmYWxzZWA6XG4gICAqIHRoZSBhbWJpZW50IHRvb2xzIGFzc3VtZSBhbiBpbi1wcm9jZXNzIGNoYXQgdHVybiAodGhleSBwdWJsaXNoXG4gICAqIHdyaXRlciBldmVudHMgdGhlIGNoYXQgVUkgY29uc3VtZXMpLCBzbyB0aGV5IGFyZW4ndCB1c2VmdWwgdG8gYVxuICAgKiBzdGFuZGFsb25lIE1DUCBjbGllbnQuIFR1cm4gdGhpcyBvbiBvbmx5IHdoZW4gdGhvc2UgdG9vbHMgYXJlIHNhZmVcbiAgICogdG8gY2FsbCBvdXQtb2YtYmFuZC5cbiAgICovXG4gIHRvb2xzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEV4dHJhIHRvb2xzIHRvIGV4cG9zZSBvdmVyIE1DUCBiZXlvbmQgdGhlIGFnZW50IC8gYW1iaWVudCBzZXRzLlxuICAgKiBVc2UgdGhpcyBmb3IgdG9vbHMgd3JpdHRlbiBzcGVjaWZpY2FsbHkgZm9yIE1DUCBjb25zdW1lcnMuXG4gICAqL1xuICBleHRyYVRvb2xzPzogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBPcHRpb25hbCBwb3N0LXR1cm4gZm9sbG93LXVwIHN1Z2dlc3Rpb24gcG9saWN5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnIHtcbiAgLyoqIE5hdGl2ZSBHZW5pZSBvbmx5LCBDaGF0RmFzdCBnZW5lcmF0ZWQgb25seSwgb3IgYXV0b21hdGljIHNlbGVjdGlvbiB3aGVuIHRydWUuICovXG4gIG1vZGU6IHRydWUgfCBcImdlbmVyYXRlZFwiIHwgXCJnZW5pZVwiO1xuICAvKiogTWF4aW11bSBxdWVzdGlvbnMgZW1pdHRlZCBmb3Igb25lIHR1cm4uIERlZmF1bHRzIHRvIDMsIG1heGltdW0gMTAuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogVGFpbC1nZW5lcmF0aW9uIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBBbHNvIGV4cG9zZSB0aGUgZ2VuZXJhdG9yIGFzIGFuIGV4cGxpY2l0bHkgY2FsbGFibGUgYWdlbnQgdG9vbC4gKi9cbiAgZXhwb3NlVG9vbD86IGJvb2xlYW47XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGFjY2VwdGVkIGJ5IHRoZSBNYXN0cmEgQXBwS2l0IHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBSdW4gdHVybnMgdGhyb3VnaCBNYXN0cmEncyBldmVudGVkIGR1cmFibGUgYWdlbnQgc28gZXhlY3V0aW9uIGNvbnRpbnVlc1xuICAgKiBhZnRlciBhIGJyb3dzZXIgZGlzY29ubmVjdCBhbmQgY2FuIGJlIG9ic2VydmVkIGFnYWluIGJ5IHJ1biBpZC4gRGVmYXVsdHNcbiAgICogdG8gYHRydWVgLlxuICAgKi9cbiAgYmFja2dyb3VuZFR1cm5zPzogYm9vbGVhbjtcbiAgLyoqIEFJIFNESyBwcm92aWRlci1vcHRpb25zIG5hbWVzcGFjZS4gRGVmYXVsdHMgdG8gYFwib3BlbmFpXCJgOyBubyBlbnYgZmFsbGJhY2suICovXG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcy9tZXNzYWdlcy4gYHRydWVgIGNhcHR1cmVzIHRoZVxuICAgKiBgbGFrZWJhc2VgIHBsdWdpbidzIGV4aXN0aW5nIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2w7IGFuIG9iamVjdCBvcGVucyBhXG4gICAqIHNlcGFyYXRlbHkgY29uZmlndXJlZCBzdG9yZS5cbiAgICovXG4gIHN0b3JhZ2U/OiBib29sZWFuIHwgUG9zdGdyZXNTdG9yZUNvbmZpZztcbiAgLyoqXG4gICAqIFBnVmVjdG9yIHN0b3JlIGZvciBNYXN0cmEgbWVtb3J5IHJlY2FsbC4gYHRydWVgIGNhcHR1cmVzIHRoZVxuICAgKiBgbGFrZWJhc2VgIHBsdWdpbidzIGV4aXN0aW5nIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2w7IGFuIG9iamVjdCBvcGVucyBhXG4gICAqIHNlcGFyYXRlbHkgY29uZmlndXJlZCBzdG9yZS5cbiAgICovXG4gIG1lbW9yeT86IGJvb2xlYW4gfCBNYXN0cmFNZW1vcnlDb25maWc7XG4gIC8qKlxuICAgKiBFeHBvc2UgZXhlY3V0YWJsZSB0b29scyBhdmFpbGFibGUgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdCB0aHJvdWdoIG5hdGl2ZVxuICAgKiBNYXN0cmEgQ29kZSBNb2RlLiBEZWZhdWx0cyB0byBgZmFsc2VgLiBgYXV0b2Agc2VsZWN0cyBhbiBpbnN0YWxsZWQsXG4gICAqIHJ1bnRpbWUtc3VwcG9ydGVkIG9wdGlvbmFsIHRyYW5zcG9ydCBkdXJpbmcgc3RhcnR1cCBhbmQgbGVhdmVzIENvZGUgTW9kZVxuICAgKiBkaXNhYmxlZCB3aGVuIG5vbmUgaXMgYXZhaWxhYmxlLiBFeHBsaWNpdCB0cmFuc3BvcnQgdmFsdWVzIGZhaWwgc3RhcnR1cFxuICAgKiB3aGVuIHRoZWlyIG9wdGlvbmFsIGRlcGVuZGVuY3kgb3IgcnVudGltZSBzdXBwb3J0IGlzIHVuYXZhaWxhYmxlLiBUaGVzZVxuICAgKiB0cmFuc3BvcnRzIGRvIG5vdCBleGVjdXRlIHRocm91Z2ggdGhlIHdvcmtzcGFjZSBjb21tYW5kIHNhbmRib3g7IFNTSCBpc1xuICAgKiB1c2VkIG9ubHkgd2hlbiBhbiBleHBvc2VkIFNTSC1iYWNrZWQgdG9vbCBpcyBjYWxsZWQuXG4gICAqL1xuICBjb2RlTW9kZT86IGZhbHNlIHwgTWFzdHJhQ29kZU1vZGVUcmFuc3BvcnQgfCBNYXN0cmFDb2RlTW9kZUNvbmZpZztcbiAgLyoqXG4gICAqIFNhbmRib3ggZm9yIGF1dG8tY3JlYXRlZCBhZ2VudCB3b3Jrc3BhY2VzLiBEZWZhdWx0cyB0byBNb250eS4gYGZhbHNlYFxuICAgKiBkaXNhYmxlcyBjb21tYW5kIGV4ZWN1dGlvbjsgYHRydWVgIG9yIGBcIm1vbnR5XCJgIHNlbGVjdHMgTW9udHk7IGFuIGV4cGxpY2l0XG4gICAqIE1hc3RyYSBzYW5kYm94IG9yIHJlc29sdmVyIHN1cHBsaWVzIGEgcmVtb3RlIHRyYW5zcG9ydC4gQW4gYWdlbnQgd2l0aCBhblxuICAgKiBleHBsaWNpdCBjdXN0b20gYHdvcmtzcGFjZWAga2VlcHMgdGhhdCB3b3Jrc3BhY2UgYW5kIGl0cyBzYW5kYm94LlxuICAgKi9cbiAgc2FuZGJveD86IGJvb2xlYW4gfCBcIm1vbnR5XCIgfCBXb3Jrc3BhY2VTYW5kYm94IHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyO1xuICAvKiogQWRkIHVzZXItc2NvcGVkIGAvdG1wYCBvbmx5IHdoZW4gbm8gY29uZmlndXJlZCB3b3Jrc3BhY2UgcGF0aCBtb3VudHMgd3JpdGFibGUuICovXG4gIHdvcmtzcGFjZUZhbGxiYWNrVG9UbXA/OiBib29sZWFuO1xuICAvKiogTmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2UgdG9vbCBhdmFpbGFiaWxpdHksIGFwcHJvdmFsLCBhbmQgaG9vayBjb25maWd1cmF0aW9uLiAqL1xuICB3b3Jrc3BhY2VUb29scz86IFdvcmtzcGFjZVRvb2xzQ29uZmlnO1xuICAvKipcbiAgICogVXNlIE1hc3RyYSdzIG5hdGl2ZSB3b3Jrc3BhY2Ugc2tpbGwgbWFuYWdlci4gRGVmYXVsdHMgdG8gdHJ1ZS4gUGFzcyBhblxuICAgKiBvYmplY3QgdG8gdHVuZSBvbi1kZW1hbmQgZGlzY292ZXJ5IGFuZCBsb2FkZWQtc2tpbGwgc3RhdGUuXG4gICAqL1xuICB3b3Jrc3BhY2VTa2lsbHM/OiBib29sZWFuIHwgTWFzdHJhV29ya3NwYWNlU2tpbGxzQ29uZmlnO1xuICAvKipcbiAgICogQ29kZS1kZWZpbmVkIGFnZW50cy4gQWNjZXB0cyB0aHJlZSBzaGFwZXMgZm9yIGNvbnZlbmllbmNlOlxuICAgKlxuICAgKiAtICoqUmVjb3JkKio6IGB7IGFuYWx5c3Q6IGRlZiwgaGVscGVyOiBkZWYgfWAgLSBrZXlzIGJlY29tZSB0aGVcbiAgICogICByZWdpc3RlcmVkIGlkcyBhbmQgdGhlIGZpcnN0IGtleSBpcyB0aGUgZGVmYXVsdC5cbiAgICogLSAqKlNpbmdsZSBkZWZpbml0aW9uKio6IGBkZWZgIC0gcmVnaXN0ZXJlZCB1bmRlclxuICAgKiAgIGBzbHVnaWZ5KGRlZi5uYW1lKWAgKG9yIGBcImRlZmF1bHRcImAgd2hlbiBgbmFtZWAgaXMgb21pdHRlZCkgYW5kXG4gICAqICAgYXV0b21hdGljYWxseSBtYXJrZWQgYXMgdGhlIGRlZmF1bHQgYWdlbnQuXG4gICAqIC0gKipBcnJheSoqOiBgW2RlZjEsIGRlZjJdYCAtIGVhY2ggcmVnaXN0ZXJlZCB1bmRlclxuICAgKiAgIGBzbHVnaWZ5KGRlZi5uYW1lKWAgKG9yIGBhZ2VudF8ke2l9YCB3aGVuIGBuYW1lYCBpcyBvbWl0dGVkKTtcbiAgICogICB0aGUgZmlyc3QgZW50cnkgaXMgdGhlIGRlZmF1bHQuXG4gICAqXG4gICAqIEVhY2ggZW50cnkgYmVjb21lcyBhIE1hc3RyYSBgQWdlbnRgIHJlYWNoYWJsZSBhdFxuICAgKiBgL2FwaS88cGx1Z2luPi9yb3V0ZS9jaGF0LzxpZD5gICh0aGUgY2hhdCByb3V0ZSBhbHNvIG1hdGNoZXNcbiAgICogYDphZ2VudElkYCkuIFdoZW4gYGFnZW50c2AgaXMgb21pdHRlZCBlbnRpcmVseSwgdGhlIHBsdWdpblxuICAgKiByZWdpc3RlcnMgYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmVcbiAgICogYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmcgY2hhdCBlbmRwb2ludC5cbiAgICpcbiAgICogQGV4YW1wbGUgU2luZ2xlLWFnZW50IHNob3J0aGFuZFxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGUgQXJyYXlcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IFtcbiAgICogICAgIGNyZWF0ZUFnZW50KHsgbmFtZTogXCJhbmFseXN0XCIsIGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICAgIGNyZWF0ZUFnZW50KHsgbmFtZTogXCJoZWxwZXJcIiwgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgIF0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGUgUmVjb3JkIChleHBsaWNpdCBpZHMpXG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiB7XG4gICAqICAgICBhbmFseXN0OiBjcmVhdGVBZ2VudCh7IGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICAgIGhlbHBlcjogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgfSxcbiAgICogICBkZWZhdWx0QWdlbnQ6IFwiYW5hbHlzdFwiLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhZ2VudHM/OlxuICAgIHwgUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPlxuICAgIHwgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uXG4gICAgfCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXTtcbiAgLyoqXG4gICAqIEFtYmllbnQgdG9vbHMgc3ByZWFkIGludG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCdzIHRvb2xzIHJlY29yZDtcbiAgICogcGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXkgY29sbGlzaW9uLiBVc2UgZm9yIGEgc21hbGwgc2hhcmVkXG4gICAqIGxpYnJhcnk7IGZvciBwZXItYWdlbnQgdG9vbHMgc2V0IGBhZ2VudHNbaWRdLnRvb2xzYCBpbnN0ZWFkLlxuICAgKi9cbiAgdG9vbHM/OiBNYXN0cmFUb29scztcbiAgLyoqXG4gICAqIENvZGUtZGVmaW5lZCBNYXN0cmEgd29ya2Zsb3dzIHJlZ2lzdGVyZWQgb24gdGhlIGhvc3RlZCBpbnN0YW5jZS5cbiAgICogRGVmZXJyZWQgc2libGluZyBwbHVnaW5zIG1heSBhbHNvIHJlZ2lzdGVyIHRocm91Z2ggdGhlIHBsdWdpbiBleHBvcnRcbiAgICogYmVmb3JlIHRoZSBpbnN0YW5jZSBpcyBidWlsdC5cbiAgICovXG4gIHdvcmtmbG93cz86IFJlY29yZDxzdHJpbmcsIEFueVdvcmtmbG93PjtcbiAgLyoqXG4gICAqIEFnZW50IGlkIHVzZWQgd2hlbiB0aGUgY2xpZW50IGRvZXNuJ3Qgc3BlY2lmeSBvbmUgKHRoZSBiYXJlLFxuICAgKiB1bi1zdWZmaXhlZCBoaXN0b3J5IC8gc3VnZ2VzdGlvbnMgcm91dGVzIHJlc29sdmUgdG8gaXQpLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgZmlyc3Qga2V5IGluIGBhZ2VudHNgIChvciBgXCJkZWZhdWx0XCJgIHdoZW5cbiAgICogYGFnZW50c2AgaXMgb21pdHRlZCkuIE11c3QgbWF0Y2ggYW4gaWQgaW4gYGFnZW50c2Agd2hlbiBib3RoIGFyZVxuICAgKiBzZXQ7IGEgbWlzbWF0Y2ggdGhyb3dzIGF0IHNldHVwIHdpdGggdGhlIGF2YWlsYWJsZSBjYW5kaWRhdGVzLlxuICAgKi9cbiAgZGVmYXVsdEFnZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGx1Z2luLWxldmVsIGRlZmF1bHQgbW9kZWwgYXBwbGllZCB0byBldmVyeSBhZ2VudCB0aGF0IG9taXRzIGl0c1xuICAgKiBvd24gYG1vZGVsYC4gTWlycm9ycyBBcHBLaXQncyBgYWdlbnRzKHsgZGVmYXVsdE1vZGVsIH0pYC5cbiAgICpcbiAgICogLSBgc3RyaW5nYDogc2hvcnRoYW5kIGZvciBcInVzZSB0aGUgT0JPIGF1dG8tcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiYCkuXG4gICAqIC0gQW55IG90aGVyIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50PE1hc3RyYU1vZGVsQ29uZmlnPmA6IHBhc3NlZFxuICAgKiAgIHRocm91Z2ggdmVyYmF0aW0uIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYXV0aFxuICAgKiAgIG9yIGBwcm92aWRlcklkYC5cbiAgICpcbiAgICogUmVzb2x1dGlvbiBvcmRlciBwZXIgYWdlbnQ6IGBkZWYubW9kZWxgIOKGkiBgZGVmYXVsdE1vZGVsYCDihpJcbiAgICogYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCDihpIgYnVpbHQtaW4gYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAgICogcmVzb2x2ZXIuXG4gICAqL1xuICBkZWZhdWx0TW9kZWw/OiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHwgc3RyaW5nO1xuICAvKipcbiAgICogRnV6enktbWF0Y2ggbG9vc2UgbW9kZWwgbmFtZXMgKGBcImNsYXVkZSBzb25uZXRcImApIGFnYWluc3QgdGhlIHdvcmtzcGFjZSdzXG4gICAqIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgdG8gcmVxdWlyZSBleGFjdCBlbmRwb2ludCBuYW1lcyBldmVyeXdoZXJlLlxuICAgKi9cbiAgbW9kZWxGdXp6eU1hdGNoPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGZvciB0aGUgZnV6enkgbWF0Y2hlciwgMCAoZXhhY3QpIHRvIDEgKGFueXRoaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYDAuNGA7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogTG93ZXIgdmFsdWVzIHJlamVjdCBsb29zZSBtYXRjaGVzOyByYWlzZSBpdCBpZiB5b3UgaGF2ZSBhIHNwcmF3bGluZ1xuICAgKiBlbmRwb2ludCBjYXRhbG9ndWUgd2l0aCBzaW1pbGFyLWxvb2tpbmcgbmFtZXMuXG4gICAqL1xuICBtb2RlbEZ1enp5VGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICogVFRMIGZvciB0aGUgaW4tbWVtb3J5IHNlcnZpbmctZW5kcG9pbnRzIGxpc3QgY2FjaGUsIGluIG1pbGxpc2Vjb25kcy5cbiAgICogRGVmYXVsdHMgdG8gNSBtaW51dGVzOyBubyBlbnYgZmFsbGJhY2suXG4gICAqXG4gICAqIFRoZSBjYWNoZSBpcyBwZXIgd29ya3NwYWNlIGhvc3QgYW5kIHNoYXJlZCBhY3Jvc3MgdXNlcnM7IGNvbmN1cnJlbnRcbiAgICogY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZSBpbi1mbGlnaHQgZmV0Y2guXG4gICAqL1xuICBtb2RlbENhY2hlVHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBMZXQgY2xpZW50cyBwaWNrIHRoZSBiYWNraW5nIGVuZHBvaW50IHBlciByZXF1ZXN0LiBEZWZhdWx0cyB0byBgdHJ1ZWA7XG4gICAqIG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogUmVhZHMgdGhlIGBYLU1hc3RyYS1Nb2RlbGAgaGVhZGVyLCB0aGUgYD9tb2RlbD1gIHF1ZXJ5IHN0cmluZywgb3IgYVxuICAgKiBgbW9kZWxgIGJvZHkgZmllbGQsIGluIHRoYXQgb3JkZXIuIERpc2FibGUgd2hlbiBydW5uaW5nIG11bHRpLXRlbmFudFxuICAgKiB3aGVyZSB1bnRydXN0ZWQgY2xpZW50cyBzaG91bGRuJ3QgY2hvb3NlIHRoZSBlbmRwb2ludC5cbiAgICovXG4gIG1vZGVsT3ZlcnJpZGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUHJpb3JpdHktb3JkZXJlZCBsaXN0IG9mIGVuZHBvaW50IG5hbWVzIHRyaWVkICpmaXJzdCogd2hlbiBub1xuICAgKiBhZ2VudCAvIHBsdWdpbiAvIGVudiAvIHJlcXVlc3Qtb3ZlcnJpZGUgbW9kZWwgaWQgaXMgc2V0LCBhaGVhZCBvZlxuICAgKiB0aGUgZHluYW1pYyBzY29yZS1jbGFzc2lmaWVkIGNhdGFsb2d1ZS4gVGhlIHJlc29sdmVyIHBpY2tzIHRoZVxuICAgKiBmaXJzdCBpZCB0aGF0IGlzIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZSdzXG4gICAqIGAvc2VydmluZy1lbmRwb2ludHNgIGxpc3RpbmcuXG4gICAqXG4gICAqIFdoZW4gdW5zZXQsIHJlc29sdXRpb24gaXMgZHJpdmVuIGJ5IHRoZSBsaXZlIEZvdW5kYXRpb24gTW9kZWwgQVBJXG4gICAqIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzOiBlbmRwb2ludHMgYXJlIGNsYXNzaWZpZWQgaW50b1xuICAgKiBjaGF0IGNsYXNzZXMgKGBjbGFzc2lmeUVuZHBvaW50c2ApIGFuZCB3YWxrZWQgYmVzdC1maXJzdFxuICAgKiAoQ2hhdFRoaW5raW5nIC0+IENoYXRCYWxhbmNlZCAtPiBDaGF0RmFzdCkuIFRoZSBhdXRvbWF0aWMgZGVmYXVsdCBpc1xuICAgKiBsaXZlLW9ubHkgYW5kIGZhaWxzIHdoZW4gbm8gbWF0Y2hpbmcgZW5kcG9pbnQgaXMgY3VycmVudGx5IGF2YWlsYWJsZS5cbiAgICogU2V0IHRoaXMgdG8gcGluIGEgcmVndWxhdGVkIHdvcmtzcGFjZSB0byBhbiBhcHByb3ZlZCBzdWJzZXQsIG9yIHRvIHB1dFxuICAgKiBjdXN0b20gZW5kcG9pbnRzIGluIGZyb250IG9mIHRoZSBhdXRvLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLlxuICAgKi9cbiAgZGVmYXVsdE1vZGVsRmFsbGJhY2tzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCAoZGVmYXVsdCksIGV2ZXJ5IGFnZW50IGdldHMgYSBidWlsdC1pbiBpbnB1dFxuICAgKiBwcm9jZXNzb3IgdGhhdCBzdHJpcHMgYGNoYXJ0SWRgIGZpZWxkcyBmcm9tIHByaW9yIGFzc2lzdGFudFxuICAgKiB0b29sLWludm9jYXRpb24gcmVzdWx0cyBiZWZvcmUgdGhleSByZWFjaCB0aGUgbW9kZWwuIFRoaXNcbiAgICogcHJldmVudHMgdGhlIG1vZGVsIGZyb20gcmV1c2luZyB0dXJuLXNjb3BlZCBjaGFydElkcyBpdCBzZWVzXG4gICAqIGluIG1lbW9yeSByZWNhbGwgKHdoaWNoIHdvdWxkIGxlYXZlIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnNcbiAgICogcG9pbnRpbmcgYXQgd3JpdGVyIGV2ZW50cyB0aGF0IG5vIGxvbmdlciBleGlzdCkuXG4gICAqXG4gICAqIFNldCB0byBgZmFsc2VgIHRvIG9wdCBvdXQgLSB1c2VmdWwgaWYgYSBub24tZGVmYXVsdCBhZ2VudFxuICAgKiBuZWVkcyBmdWxsIHZpc2liaWxpdHkgaW50byBwcmlvciBjaGFydElkcyAoZS5nLiBhbiBhdWRpdFxuICAgKiBhZ2VudCByZWFzb25pbmcgYWJvdXQgY2hhcnQgbGluZWFnZSkuXG4gICAqL1xuICBzdHJpcFN0YWxlQ2hhcnRzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFN0eWxlIGd1YXJkcmFpbHMgYXBwZW5kZWQgdG8gZXZlcnkgYWdlbnQncyBgaW5zdHJ1Y3Rpb25zYCB0byBjdXJiXG4gICAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIHRocm93YXdheVxuICAgKiBjbG9zZXJzLCBleGNlc3NpdmUgaGVkZ2luZykuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiB1c2UgdGhlIGJ1aWx0LWluXG4gICAqICAgYERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TYCBmcm9tIGBhZ2VudHMudHNgLlxuICAgKiAtIGBzdHJpbmdgOiByZXBsYWNlIHRoZSBkZWZhdWx0IHdpdGggdGhlIHN1cHBsaWVkIGJsb2NrLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgZW50aXJlbHkgKGFnZW50cyBzZWUgb25seSB0aGVpciBiZXNwb2tlXG4gICAqICAgYGluc3RydWN0aW9uc2ApLlxuICAgKlxuICAgKiBBcHBlbmRlZCAobm90IHByZXBlbmRlZCkgc28gdGhlIGFnZW50J3Mgcm9sZSBhbmQgcnVsZXMgY29tZSBmaXJzdFxuICAgKiBhbmQgdGhlIHN0eWxlIGJsb2NrIGxlYW5zIG9uIHRoZSBtb2RlbCdzIHJlY2VuY3kgYmlhcy5cbiAgICovXG4gIHN0eWxlSW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgZmFsc2U7XG4gIC8qKlxuICAgKiBHZW5pZSBzcGFjZXMgdGhpcyBwbHVnaW4ncyBhZ2VudHMgY2FuIGRlbGVnYXRlIHRvLiBPbmUgTWFzdHJhXG4gICAqIHRvb2wgaXMgcmVnaXN0ZXJlZCBwZXIgYWxpYXMgKGBnZW5pZWAgZm9yIHRoZSB3ZWxsLWtub3duXG4gICAqIGBkZWZhdWx0YCBhbGlhcywgYGdlbmllXzxhbGlhcz5gIG90aGVyd2lzZSkuIEVhY2ggdG9vbCBzcGluc1xuICAgKiB1cCBhIHBlci1xdWVzdGlvbiBHZW5pZSBzdWItYWdlbnQgdGhhdCBydW5zIERhdGFicmlja3NcbiAgICogXCJhZ2VudCBtb2RlXCIgYWdhaW5zdCB0aGUgc3BhY2UsIGJyb2FkY2FzdHMgd2lyZSBldmVudHMgdG8gdGhlXG4gICAqIFVJLCBmZXRjaGVzIHN0YXRlbWVudCByb3dzIGZvciBub24tZW1wdHkgcmVzdWx0cywgYW5kIHJldHVybnNcbiAgICogYSBgKHN0cmluZyB8IGRhdGEgfCBjaGFydClbXWAgc3VtbWFyeSB0aGUgaG9zdCBVSSByZW5kZXJzXG4gICAqIGlubGluZS5cbiAgICpcbiAgICogRW50cmllcyBhY2NlcHQgZWl0aGVyIGEgZnVsbCB7QGxpbmsgR2VuaWVTcGFjZUNvbmZpZ30gb2JqZWN0XG4gICAqIG9yIGEgYmFyZSBgc3BhY2VfaWRgIHN0cmluZyB3aGVuIG5vIGV4dHJhcyBhcmUgbmVlZGVkOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGdlbmllU3BhY2VzOiB7XG4gICAqICAgICBkZWZhdWx0OiBcIjAxZWYwZDNjMGUxYjFmNGE4ZDJjM2U0ZjVhNmI3YzhkXCIsXG4gICAqICAgICBmb3JlY2FzdHM6IHsgc3BhY2VJZDogXCIwMWVmLi4uXCIsIGhpbnQ6IFwid2Vla2x5IGRlbWFuZCBmb3JlY2FzdHNcIiB9LFxuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogUmVhY2ggdGhlIHNwYWNlcyBmcm9tIGFuIGFnZW50J3MgYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayB2aWFcbiAgICogYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWA7IHRoZSByZXN1bHRpbmcgdG9vbHMgYWNjZXB0XG4gICAqIGB7IGNvbnRlbnQsIGNvbnZlcnNhdGlvbklkPyB9YCBhbmQgcmV0dXJuIGEgaHlkcmF0ZWQgc3VtbWFyeS5cbiAgICpcbiAgICogKipGYWxsYmFjayBkaXNjb3ZlcnkqKiAoaGlnaGVzdCBwcmVjZWRlbmNlIGZpcnN0KTogaWYgdGhpc1xuICAgKiBmaWVsZCBpcyBvbWl0dGVkLCB0aGUgR2VuaWUgYWdlbnQgYWxzbyBwaWNrcyB1cCBzcGFjZXMgZnJvbVxuICAgKiAoMSkgdGhlIEFwcEtpdCBgZ2VuaWUoeyBzcGFjZXM6IHsgLi4uIH0gfSlgIHBsdWdpbiBpbnN0YW5jZVxuICAgKiB3aGVuIHJlZ2lzdGVyZWQsIGFuZCAoMikgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYFxuICAgKiBlbnYgdmFyIChyZWdpc3RlcmVkIHVuZGVyIHRoZSBgZGVmYXVsdGAgYWxpYXMpLiBUaGlzIGtlZXBzXG4gICAqIGV4aXN0aW5nIEFwcEtpdCBkZXBsb3ltZW50cyB3b3JraW5nIHdpdGhvdXQgcmVzdGF0aW5nIHRoZVxuICAgKiBzcGFjZXMgY29uZmlnIGluIHR3byBwbGFjZXMuXG4gICAqL1xuICBnZW5pZVNwYWNlcz86IEdlbmllU3BhY2VzQ29uZmlnO1xuICAvKipcbiAgICogVXNlIHRoZSBzdHJlYW1pbmcgR2VuaWUgQWdlbnQgTW9kZSBBUEkgZm9yIGBhc2tfZ2VuaWVgLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIFNldCBgZmFsc2VgIHRvIGZvcmNlIHRoZSBsZWdhY3kgQ29udmVyc2F0aW9uIEFQSSBwb2xsaW5nIGRyaXZlci4gQVxuICAgKiBwcmUtc3RyZWFtIGZlYXR1cmUtZGlzYWJsZWQgb3IgcHJldmlldy10b2dnbGUgcmVzcG9uc2UgZmFsbHMgYmFja1xuICAgKiBhdXRvbWF0aWNhbGx5LiBEaXJlY3QgR2VuaWUgY2hhdCBhbHdheXMgcmVxdWlyZXMgQWdlbnQgTW9kZSBhbmQgaWdub3Jlc1xuICAgKiB0aGlzIG9wdGlvbi5cbiAgICovXG4gIGdlbmllQWdlbnRNb2RlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRUTCBmb3IgdGhlIGluLW1lbW9yeSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZSwgaW5cbiAgICogbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuIFRoZSBHZW5pZSBhZ2VudCBjYWxsc1xuICAgKiBgY2xpZW50LmdlbmllLmdldFNwYWNlKC4uLilgIG9uIGV2ZXJ5IGNvbGQtc3RhcnQgdG8gZ2V0IHRoZVxuICAgKiB0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkOyBjYWNoZWQgcmVzcG9uc2VzIHNraXAgdGhlXG4gICAqIHJvdW5kLXRyaXAgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZVxuICAgKiBpbi1mbGlnaHQgZmV0Y2guIERyb3AgdG8gYSBzbWFsbGVyIHZhbHVlIHdoZW4gYW5hbHlzdHMgYXJlXG4gICAqIGFjdGl2ZWx5IGVkaXRpbmcgc3BhY2UgbWV0YWRhdGEgYW5kIHlvdSB3YW50IGNoYW5nZXMgdmlzaWJsZVxuICAgKiB3aXRoaW4gc2Vjb25kczsgcmFpc2UgaXQgdG8gYW1vcnRpc2UgdGhlIHJvdW5kLXRyaXAgd2hlblxuICAgKiBzcGFjZSBtZXRhZGF0YSBpcyBlZmZlY3RpdmVseSBmcm96ZW4uXG4gICAqXG4gICAqIEJhY2tlZCBieSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYCwgc28gdGhlIGNhY2hlIHBhcnRpY2lwYXRlc1xuICAgKiBpbiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSBhbmQgYmVuZWZpdHMgZnJvbVxuICAgKiBMYWtlYmFzZSBwZXJzaXN0ZW5jZSB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAgICovXG4gIGdlbmllU3BhY2VDYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuLiBPbmUgc3RlcCA9IG9uZVxuICAgKiByb3VuZC10cmlwIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIChhIHRvb2wgY2FsbCBjb25zdW1lcyBhXG4gICAqIHN0ZXAsIHRoZSBmaW5hbC10ZXh0IHJlcGx5IGNvbnN1bWVzIG9uZSB0b28pLiBBcHBsaWVzIHRvXG4gICAqIGV2ZXJ5IGFnZW50IHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c31cbiAgICogLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFyZW4ndCBzdXJmYWNlZCB5ZXQgYmVjYXVzZSB0aGUgc2FtZVxuICAgKiBjZWlsaW5nIGhhcyBiZWVuIHN1ZmZpY2llbnQgYWNyb3NzIGV2ZXJ5IHdvcmtsb2FkIHdlJ3ZlIHJ1bi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTfSAoMjUpLCBzaXplZCB0byBmaXRcbiAgICogYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWAgY2FsbHNcbiAgICogKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICAgKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gICAqIGFuc3dlcmluZy4gTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZiA1IHdvdWxkXG4gICAqIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIGFmdGVyIDItMyB0b29sIGNhbGxzLCBzb1xuICAgKiBleHBsaWNpdGx5IHJhaXNpbmcgdGhlIGNlaWxpbmcgaGVyZSBpcyB3aGF0IGxldHMgdGhlXG4gICAqIGFnZW50LW1vZGUgbG9vcCBwbGF5IG91dC5cbiAgICpcbiAgICogTG93ZXIgd2hlbiBhbiB1bnVzdWFsbHkgc2xvdyBvciBleHBlbnNpdmUgbW9kZWwgbWFrZXMgbG9uZ1xuICAgKiB0dXJucyB1bmFmZm9yZGFibGU7IHJhaXNlIGZvciBleHBsb3JhdG9yeSB3b3JrbG9hZHMgdGhhdCBuZWVkXG4gICAqIHRvIGRyaWxsIGRlZXAgaW50byBhIGRhdGFzZXQgd2l0aGluIGEgc2luZ2xlIHR1cm4uXG4gICAqL1xuICBhZ2VudE1heFN0ZXBzPzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgcG9zdC10dXJuIGZvbGxvdy11cCBxdWVzdGlvbnMuIGB0cnVlYCBzZWxlY3RzIHNvdXJjZXNcbiAgICogYXV0b21hdGljYWxseTsgYFwiZ2VuZXJhdGVkXCJgIG9yIGBcImdlbmllXCJgIHBpbnMgb25lIHNvdXJjZTsgYGZhbHNlYCBvclxuICAgKiBvbWlzc2lvbiBkaXNhYmxlcyBmb2xsb3ctdXBzLlxuICAgKi9cbiAgZm9sbG93VXBTdWdnZXN0aW9ucz86IGZhbHNlIHwgdHJ1ZSB8IFwiZ2VuZXJhdGVkXCIgfCBcImdlbmllXCIgfCBGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnO1xuICAvKipcbiAgICogV2lyZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICogYEBtYXN0cmEvb3RlbC1icmlkZ2VgLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogb24gb25seSB3aGVuXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgb3JcbiAgICogICBgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVGAgaXMgc2V0LiBXaGVuIHVuc2V0LCB0aGVcbiAgICogICBicmlkZ2UgaXMgc2tpcHBlZCBzbyBNYXN0cmEgZG9lcyBub3QgbG9nXG4gICAqICAgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIG9uIHRoZSBub29wIHRyYWNlci5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uIGV2ZW4gd2l0aG91dCBhbiBPVExQIGVuZHBvaW50LlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi5cbiAgICovXG4gIG9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuICAvKipcbiAgICogRmVlZGJhY2sgZGVzdGluYXRpb24uIGBhdXRvYCBwcmVmZXJzIEdlbmllIHdoZW4gR2VuaWUgQWdlbnQgTW9kZSBpc1xuICAgKiBhdmFpbGFibGUsIG90aGVyd2lzZSBNTGZsb3cgd2hlbiB0cmFjaW5nIGlzIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSBub25lLlxuICAgKiBFeHBsaWNpdCBgZ2VuaWVgIG9yIGBtbGZsb3dgIGZhaWxzIHN0YXJ0dXAgd2hlbiB1bmF2YWlsYWJsZS5cbiAgICovXG4gIGZlZWRiYWNrTW9kZT86IEZlZWRiYWNrTW9kZU9wdGlvbjtcbiAgLyoqXG4gICAqIEV4cG9zZSB0aGUgcGx1Z2luJ3MgYWdlbnRzIChhbmQgb3B0aW9uYWxseSB0b29scykgYXMgYSBNYXN0cmEgTUNQXG4gICAqIHNlcnZlciBzbyBleHRlcm5hbCBNQ1AgY2xpZW50cyAtIENsYXVkZSBEZXNrdG9wLCBDdXJzb3IsIHRoZSBNYXN0cmFcbiAgICogcGxheWdyb3VuZCwgb3IgYW5vdGhlciBhZ2VudCAtIGNhbiBjYWxsIHRoZW0gb3ZlciB0aGUgc3RhbmRhcmQgTUNQXG4gICAqIHRyYW5zcG9ydHMuIEVuYWJsZWQgYnkgZGVmYXVsdCAoYWdlbnRzIG9ubHkpOiB3cmFwcGluZyB0aGVcbiAgICogYWxyZWFkeS1yZWdpc3RlcmVkIGFnZW50cyBjb3N0cyBub3RoaW5nIGV4dHJhLCBzbyB0aGUgZW5kcG9pbnQgaXMgb25cbiAgICogb3V0IG9mIHRoZSBib3g7IG9ubHkgdGhlIGFtYmllbnQgdG9vbHMgKHdoaWNoIGFzc3VtZSBhbiBpbi1wcm9jZXNzXG4gICAqIGNoYXQgdHVybikgc3RheSBvZmYgdW5sZXNzIGV4cGxpY2l0bHkgb3B0ZWQgaW4uXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpIC8gYHRydWVgOiBleHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhc1xuICAgKiAgIGFuIGBhc2tfPGFnZW50SWQ+YCBNQ1AgdG9vbCB1bmRlciBhIHNlcnZlciB3aG9zZSBpZCBpcyB0aGUgcGx1Z2luXG4gICAqICAgbmFtZS5cbiAgICogLSBgZmFsc2VgOiBubyBNQ1AgZW5kcG9pbnRzLlxuICAgKiAtIHtAbGluayBNYXN0cmFNY3BDb25maWd9OiBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIgaWQsXG4gICAqICAgYWR2ZXJ0aXNlZCBtZXRhZGF0YSwgYW5kIHdoaWNoIGFnZW50cyAvIHRvb2xzIGFyZSBleHBvc2VkLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBzdG9jayBNYXN0cmEgTUNQIHJvdXRlcyBtb3VudCB1bmRlciB0aGUgcGx1Z2luJ3NcbiAgICogYmFzZSBwYXRoIChubyBiZXNwb2tlIHJvdXRlIGlzIGFkZGVkIC0gdGhlIHNlcnZlciBpcyBoYW5kZWQgdG8gdGhlXG4gICAqIGBNYXN0cmFgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHdoaWNoIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyk6XG4gICAqXG4gICAqIC0gU3RyZWFtYWJsZSBIVFRQOiBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21jcGBcbiAgICogLSBTU0UgKGxlZ2FjeSk6ICAgIGBHRVQgIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vc3NlYFxuICAgKiAgICAgICAgICAgICAgICAgICAgYFBPU1QgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9tZXNzYWdlc2BcbiAgICpcbiAgICogUmVxdWVzdHMgcnVuIHVuZGVyIHRoZSBzYW1lIEFwcEtpdCBPQk8gc2NvcGUgYXMgdGhlIGNoYXQgcm91dGVzLCBzb1xuICAgKiBhbiBhZ2VudCBpbnZva2VkIG92ZXIgTUNQIHJlc29sdmVzIGl0cyBtb2RlbCBhbmQgdG9vbHMgYXMgdGhlXG4gICAqIGNhbGxpbmcgdXNlci5cbiAgICovXG4gIG1jcD86IGJvb2xlYW4gfCBNYXN0cmFNY3BDb25maWc7XG4gIC8qKlxuICAgKiBIb3cgbXVjaCBvZiB0aGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2AgbWFuYWdlbWVudCBBUEkgaXMgcmVhY2hhYmxlXG4gICAqIHRocm91Z2ggdGhlIHBsdWdpbiBtb3VudC4gYEBtYXN0cmEvZXhwcmVzc2AgcmVnaXN0ZXJzIGl0cyBmdWxsIHJvdXRlXG4gICAqIHRhYmxlIChhZ2VudCBpbmZlcmVuY2UgcGx1cyBhZG1pbiAvIG11dGF0aW5nIHJvdXRlczogZGlyZWN0IHRvb2xcbiAgICogZXhlY3V0aW9uLCB3b3JrZmxvdyBjb250cm9sLCByYXcgbWVtb3J5IHJlYWQvd3JpdGUsIHRlbGVtZXRyeSwgbG9ncyxcbiAgICogc2NvcmVzKS4gQXBwS2l0IGFscmVhZHkgYXV0aGVudGljYXRlcyBldmVyeSByZXF1ZXN0IGFzIHRoZSBPQk8gdXNlcixcbiAgICogYnV0IG5vdGhpbmcgdGhlcmUgcmVzdHJpY3RzICp3aGljaCogb2YgdGhvc2Ugb3BlcmF0aW9ucyB0aGUgYnJvd3NlclxuICAgKiBjbGllbnQgbWF5IGludm9rZS5cbiAgICpcbiAgICogLSBgXCJzY29wZWRcImAgKGRlZmF1bHQpOiBvbmx5IHRoZSByb3V0ZXMgdGhlIGNoYXQgY2xpZW50IGxlZ2l0aW1hdGVseVxuICAgKiAgIG5lZWRzIGFyZSBkaXNwYXRjaGVkIHRvIE1hc3RyYSAtIGFnZW50IGluZmVyZW5jZVxuICAgKiAgIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICogICBwbHVnaW4ncyBvd24gT0JPLSBhbmQgcmVzb3VyY2Utc2NvcGVkIGAvcm91dGUvKmAgcm91dGVzIChoaXN0b3J5IC9cbiAgICogICB0aHJlYWRzKSwgYW5kLCB3aGVuIHtAbGluayBtY3B9IGlzIGVuYWJsZWQsIHRoZSBNQ1AgdHJhbnNwb3J0LlxuICAgKiAgIEV2ZXJ5dGhpbmcgZWxzZSAodG9vbCBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnksXG4gICAqICAgdGVsZW1ldHJ5LCBsb2dzLCBzY29yZXMsIGFuZCBvdGhlciBtdXRhdGlvbnMpIGlzIHJlamVjdGVkIHdpdGhcbiAgICogICBgNDAzYCBiZWZvcmUgaXQgcmVhY2hlcyBNYXN0cmEuXG4gICAqIC0gYFwiZnVsbFwiYDogZGlzcGF0Y2ggdGhlIGVudGlyZSBzdG9jayBNYXN0cmEgQVBJLiBVc2Ugb25seSBmb3IgYVxuICAgKiAgIHRydXN0ZWQgZmlyc3QtcGFydHkgY29uc29sZSB0aGF0IGdlbnVpbmVseSBuZWVkcyB0aGUgbWFuYWdlbWVudFxuICAgKiAgIHN1cmZhY2UuXG4gICAqL1xuICBhcGlBY2Nlc3M/OiBcInNjb3BlZFwiIHwgXCJmdWxsXCI7XG4gIC8qKlxuICAgKiBXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IHRoZSBhZ2VudHMnIHdvcmtzcGFjZSBjYWxscyBydW4gYXM6IHRoZVxuICAgKiBzZXJ2aW5nLWVuZHBvaW50IGNhdGFsb2d1ZSBiZWhpbmQgdGhlIG1vZGVsIHBpY2tlciwgR2VuaWUgc3VnZ2VzdGlvbnMsXG4gICAqIGBhc2tfZ2VuaWVgLCBhbmQgdGhlIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2ggYmVoaW5kIGEgYFtkYXRhOjxpZD5dYFxuICAgKiBlbWJlZC4gRmFsbHMgYmFjayB0byBgTUFTVFJBX0dFTklFX0lERU5USVRZYCwgdGhlbiBgXCJ1c2VyXCJgLlxuICAgKlxuICAgKiBPbi1iZWhhbGYtb2YgKE9CTykgYXV0aCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGJlIGEgbWVtYmVyIG9mIHRoZVxuICAgKiBXT1JLU1BBQ0UsIG5vdCBqdXN0IG9mIHRoZSBEYXRhYnJpY2tzIGFjY291bnQuIEFuIGFwcCBzaGFyZWQgd2l0aCBhblxuICAgKiBhY2NvdW50LWxldmVsIGdyb3VwIGNhbiBiZSBvcGVuZWQgYnkgc29tZW9uZSB3aG9zZSB0b2tlbiBpcyB2YWxpZCBidXQgd2hvc2VcbiAgICogZXZlcnkgd29ya3NwYWNlIGNhbGwgZmFpbHMgd2l0aCBgVW5hdXRob3JpemVkIGFjY2VzcyB0byBPcmc6IDxpZD5gIC0gYW5kXG4gICAqIGdyYW50aW5nIHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIG5vdCBhbHdheXMgcG9zc2libGUsIHNpbmNlIGEgd29ya3NwYWNlXG4gICAqIGNhcHMgbWVtYmVyc2hpcCB3ZWxsIGJlbG93IHRoZSBzaXplIG9mIGEgbGFyZ2UgYWNjb3VudCdzIHVzZXIgZ3JvdXAuIFRoZVxuICAgKiBhcHAncyBzZXJ2aWNlIHByaW5jaXBhbCBhbHJlYWR5IGhvbGRzIHRoZSBncmFudHMgdGhlIGFwcCB3YXMgZGVwbG95ZWQgd2l0aC5cbiAgICpcbiAgICogLSBgXCJ1c2VyXCJgIChkZWZhdWx0KTogYWx3YXlzIE9CTy4gUGVyLXVzZXIgYXR0cmlidXRpb24sIGFuZCBHZW5pZSAvIFVuaXR5XG4gICAqICAgQ2F0YWxvZyByb3cgZmlsdGVycyBhcHBseSBwZXIgdXNlci4gQ29ycmVjdCB3aGVuIGV2ZXJ5IGNhbGxlciBpcyBhXG4gICAqICAgd29ya3NwYWNlIG1lbWJlci5cbiAgICogLSBgXCJzZXJ2aWNlLXByaW5jaXBhbFwiYDogYWx3YXlzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwuIE5lZWRzIG5vIE9CT1xuICAgKiAgIHNjb3BlcyBhbmQgd29ya3MgZm9yIGFueSBjYWxsZXIgd2hvIGNhbiBvcGVuIHRoZSBhcHAsIGF0IHRoZSBjb3N0IG9mXG4gICAqICAgcGVyLXVzZXIgYXR0cmlidXRpb24gaW4gR2VuaWUgLyBVbml0eSBDYXRhbG9nLlxuICAgKiAtIGBcImF1dG9cImA6IE9CTyB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgYW4gT0JPIHRva2VuLCB0aGUgc2VydmljZSBwcmluY2lwYWxcbiAgICogICB3aGVuIGl0IGRvZXMgbm90LiBGb3IgYW4gYXBwIHNlcnZpbmcgQk9USCB0aGUgcGxhdGZvcm0gZnJvbnQgZG9vciBhbmQgYVxuICAgKiAgIGRvb3IgdGhhdCBoYXMgbm8gdG9rZW4gdG8gZm9yd2FyZCAtIGEgYEBkYngtdG9vbHMvdHVubmVsYCBnYXRlLCBhXG4gICAqICAgVGVhbXMgY2hhbm5lbCAtIHdoZXJlIEFwcEtpdCdzIGBhc1VzZXJgIHdvdWxkIG90aGVyd2lzZSB0aHJvd1xuICAgKiAgIGBBdXRoZW50aWNhdGlvbkVycm9yYCBvdXRzaWRlIGBOT0RFX0VOVj1kZXZlbG9wbWVudGAuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlLXByaW5jaXBhbCBwYXRoIGNoYW5nZXMgb25seSB0aGUgRGF0YWJyaWNrcyBDUkVERU5USUFMLiBNZW1vcnlcbiAgICogdGhyZWFkcywgdGhlIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhIHN0aWxsIGtleSBvZmYgdGhlXG4gICAqIGZvcndhcmRlZCB1c2VyLCBzbyBjYWxsZXJzIHNoYXJpbmcgdGhlIHNlcnZpY2UgcHJpbmNpcGFsJ3MgZGF0YSBhY2Nlc3Mga2VlcFxuICAgKiBzZXBhcmF0ZSBjb252ZXJzYXRpb25zIGFuZCBjYW5ub3QgcmVhZCBlYWNoIG90aGVyJ3MgdGhyZWFkcyBvciBjaGFydHMuXG4gICAqIERpcmVjdCBHZW5pZSBjaGF0IGRvZXMgbm90IHVzZSB0aGlzIG9wdGlvbjogaXRzIGNvbnZlcnNhdGlvbnMgYW5kIG1lc3NhZ2VzXG4gICAqIGFsd2F5cyBydW4gdW5kZXIgQXBwS2l0IE9CTyBzbyBHZW5pZSByZW1haW5zIHRoZSBwZXItdXNlciBzdGF0ZSBvd25lci5cbiAgICpcbiAgICogQGV4YW1wbGUgQW4gYXBwIGFueSBhY2NvdW50IHVzZXIgY2FuIG9wZW5cbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJzZXJ2aWNlLXByaW5jaXBhbFwiLCBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBzcGFjZUlkIH0gfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBPbmUgYXBwIGJlaGluZCBib3RoIHRoZSBmcm9udCBkb29yIGFuZCBhIHB1YmxpYyB0dW5uZWxcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJhdXRvXCIsIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHNwYWNlSWQgfSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZW5pZUlkZW50aXR5PzogTWFzdHJhSWRlbnRpdHlNb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGNoYXJ0cyBwcm9kdWNlZCBieSB0aGUgYnVpbHQtaW5cbiAgICogYHJlbmRlcl9kYXRhYCAvIGBwcmVwYXJlX2NoYXJ0YCB0b29scy4gV2hlbiBzZXQsIHRoZSBjaGFydCBwbGFubmVyJ3NcbiAgICogRWNoYXJ0cyBvdXRwdXQgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3MgcGFsZXR0ZSAoc2VyaWVzIGNvbG9ycyBkZXJpdmVkXG4gICAqIGZyb20gYGNvbG9ycy5wcmltYXJ5YCAvIGBjb2xvcnMuYWNjZW50YCkgYW5kIHNhbnMgZm9udFxuICAgKiAoYHR5cG9ncmFwaHkuc2Fuc2ApIGluc3RlYWQgb2YgRWNoYXJ0cycgZGVmYXVsdHMuIE9taXQgZm9yIHRoZSBkZWZhdWx0XG4gICAqIEVjaGFydHMgbG9vay5cbiAgICpcbiAgICogUGFzcyB0aGUgcG9ydGFibGUge0BsaW5rIEJyYW5kQ29udGV4dH0gc2hhcmVkIGFjcm9zcyB0aGUgVUkgYW5kXG4gICAqIGxpYnJhcmllcyAoZS5nLiBgYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dGAgZnJvbSBgQGRieC10b29scy9zaGFyZWQtY29yZWAsXG4gICAqIG9yIGEgY3VzdG9tZXIgYnJhbmQpIC0gdGhlIHNhbWUgb2JqZWN0IHRoZSBlbWFpbCBhZGQtb24gYW5kIHRoZSBVSVxuICAgKiBgQnJhbmRQcm92aWRlcmAgY29uc3VtZSwgc28gYSBob3N0IHRoZW1lcyBjaGFydHMsIGVtYWlsLCBhbmQgVUkgZnJvbSBvbmVcbiAgICogc291cmNlLlxuICAgKi9cbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQ7XG4gIC8qKlxuICAgKiBSZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBtYXRlcmlhbGl6ZWQgb25jZSBhdCBhcHAgc3RhcnR1cC4gQSBzaW5nbGVcbiAgICogc291cmNlLCBhIGxpc3QsIG9yIGEgYHsgc291cmNlcywgZmFpbE9uRXJyb3I/LCAuLi4gfWAgYmFnLlxuICAgKlxuICAgKiBFYWNoIHNvdXJjZSBpcyBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGEgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkaXJlY3RcbiAgICogYFNLSUxMLm1kYCAvIGFyY2hpdmUgZG93bmxvYWQgVVJMLiBSZXNvbHV0aW9uIHByZWZlcnMgdGhlIE9QVElPTkFMIGBza2lsbHNgXG4gICAqIG5wbSBDTEkgKGEgcGVlciBkZXApIHdoaWNoIGlzIGNvcGllZCBpbnRvIGEgdGVtcCBkaXIgYW5kIHRoZW4gcGVyc2lzdGVkO1xuICAgKiB3aXRob3V0IGl0LCBhIFVSTCBzb3VyY2UgaXMgZmV0Y2hlZCBkaXJlY3RseS4gQSBzb3VyY2UgdGhhdCByZXNvbHZlc1xuICAgKiB0aHJvdWdoIG5laXRoZXIgZmFpbHMgc3RhcnR1cCB1bmxlc3MgYGZhaWxPbkVycm9yOiBmYWxzZWAuXG4gICAqXG4gICAqIEFJIFRvb2xzIGlzIGNhY2hlZCBkYWlseSB3aXRoIGBAZGJ4LXRvb2xzL2NhY2hlYCBhbmQgc2VydmVkIHRvIGV2ZXJ5XG4gICAqIGF1dG8tY3JlYXRlZCB3b3Jrc3BhY2UgZnJvbSB0aGUgc2hhcmVkIGAvLmRhdGFicmlja3Mvc2tpbGxzYCBtZW1vcnkgbW91bnQuXG4gICAqIE90aGVyIHNvdXJjZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIERhdGFicmlja3MgdXNlcidzIEFzc2lzdGFudCBza2lsbHMgZm9sZGVyXG4gICAqIHdoZW4gd3JpdGFibGUsIHdpdGggYSByZWFkLW9ubHkgbG9jYWwtbWVtb3J5IGZhbGxiYWNrLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoeyByZW1vdGVTa2lsbHM6IFwidmVyY2VsLWxhYnMvYWdlbnQtc2tpbGxzXCIgfSk7XG4gICAqIG1hc3RyYSh7XG4gICAqICAgcmVtb3RlU2tpbGxzOiB7XG4gICAqICAgICBzb3VyY2VzOiBbXCJ2ZXJjZWwtbGFicy9hZ2VudC1za2lsbHNcIiwgXCJodHRwczovL2V4YW1wbGUuY29tL3NraWxsLm1kXCJdLFxuICAgKiAgICAgZmFpbE9uRXJyb3I6IGZhbHNlLFxuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW90ZVNraWxscz86IFJlbW90ZVNraWxsc09wdGlvbjtcbiAgLyoqIFJlYWQtb25seSBsb2NhbCBza2lsbCB0cmVlcyBtb3VudGVkIGZvciBmaWxlcywgc2VhcmNoYWJsZSBieSBwYXRoLCBhbmQgcGFzc2VkIGFzIHN0YW5kYXJkIGFnZW50LWxldmVsIHNraWxscy4gKi9cbiAgbG9jYWxTa2lsbE1vdW50cz86IExvY2FsU2tpbGxNb3VudFtdO1xufVxuXG4vKipcbiAqIEpTT04gU2NoZW1hIHB1Ymxpc2hlZCBvbiB0aGUgbWFuaWZlc3QncyBgY29uZmlnLnNjaGVtYWAsIG1pcnJvcmluZyB0aGVcbiAqIGRvY3VtZW50ZWQgZGVmYXVsdHMgYW5kIGVudmlyb25tZW50IGZhbGxiYWNrcyBvZiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfS5cbiAqXG4gKiBDb3ZlcnMgdGhlIEpTT04tZXhwcmVzc2libGUgb3B0aW9ucyBvbmx5LiBgYWdlbnRzYCwgYHRvb2xzYCwgYW5kIGFcbiAqIGBkZWZhdWx0TW9kZWxgIHBhc3NlZCBhcyBhIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50YCBhcmUgY29kZS1kZWZpbmVkXG4gKiAoZnVuY3Rpb25zIC8gY2xhc3MgaW5zdGFuY2VzKSwgc28gdGhleSBjYXJyeSBubyBzY2hlbWEgZW50cnk7IHRoZVxuICogYGRlZmF1bHRNb2RlbGAgcHJvcGVydHkgYmVsb3cgZGVzY3JpYmVzIGl0cyBzdHJpbmcgZm9ybS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9DT05GSUdfU0NIRU1BOiBDb25maWdTY2hlbWEgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBiYWNrZ3JvdW5kVHVybnM6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUnVuIHR1cm5zIHRocm91Z2ggTWFzdHJhIGV2ZW50ZWQgZHVyYWJsZSBleGVjdXRpb24gc28gdGhleSBjb250aW51ZSBhZnRlciBicm93c2VyIGRpc2Nvbm5lY3RzIGFuZCByZW1haW4gcmVjb25uZWN0YWJsZSBieSBydW4gaWQuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBwcm92aWRlcklkOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246ICdBSSBTREsgcHJvdmlkZXItb3B0aW9ucyBuYW1lc3BhY2UuIERlZmF1bHRzIHRvIFwib3BlbmFpXCIuJyxcbiAgICB9LFxuICAgIHJlbW90ZVNraWxsczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYXJyYXlcIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1JlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIHByb3Zpc2lvbmVkIGF0IHN0YXJ0dXAgYW5kIHBhc3NlZCB0aHJvdWdoIE1hc3RyYSBzdGFuZGFyZCBhZ2VudC1sZXZlbCBza2lsbCB0b29sczogXCJhaXRvb2xzXCIgZm9yIERhdGFicmlja3NcXCcgb3duIHNraWxsIHNldCwgYSBHaXRIdWIgb3duZXIvcmVwbywgYSBnaXQvR2l0TGFiIFVSTCwgb3IgYSBkaXJlY3QgU0tJTEwubWQvYXJjaGl2ZSBVUkwuIFNvdXJjZXMgcmV0YWluIGEgcHJvY2Vzcy1tZW1vcnkgY29weSBldmVuIHdoZW4gcGVyc2lzdGVkIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIgQXNzaXN0YW50IHNraWxscyBmb2xkZXIuJyxcbiAgICB9LFxuICAgIHN0b3JhZ2U6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcyAvIG1lc3NhZ2VzLiBgdHJ1ZWAgY2FwdHVyZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgZXhpc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgc2VwYXJhdGVseSBjb25maWd1cmVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIG1lbW9yeToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBnVmVjdG9yIHN0b3JlIGZvciBNYXN0cmEgc2VtYW50aWMgcmVjYWxsLiBgdHJ1ZWAgY2FwdHVyZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgZXhpc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgc2VwYXJhdGVseSBjb25maWd1cmVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIGNvZGVNb2RlOiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwic3RyaW5nXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0V4cG9zZSBleGVjdXRhYmxlIHJlcXVlc3QgdG9vbHMgdGhyb3VnaCBuYXRpdmUgTWFzdHJhIENvZGUgTW9kZSBmb3IgVHlwZVNjcmlwdCBiYXRjaGluZywgYWdncmVnYXRpb24sIGFuZCBhcml0aG1ldGljLiBEZWZhdWx0cyB0byBmYWxzZS4gVXNlIFwiYXV0b1wiIHRvIHNlbGVjdCBhbiBpbnN0YWxsZWQgc3VwcG9ydGVkIG9wdGlvbmFsIHRyYW5zcG9ydCBvciBzdGF5IGRpc2FibGVkLCBcImlzb2xhdGVkLXZtXCIgdG8gcmVxdWlyZSB0aGUgbmF0aXZlIHRyYW5zcG9ydCwgXCJxdWlja2pzXCIgdG8gcmVxdWlyZSB0aGUgcG9ydGFibGUgdHJhbnNwb3J0LCBvciBhbiBvYmplY3Qgd2l0aCB0cmFuc3BvcnQgcGx1cyBpZCBhbmQgdGltZW91dC4gTmVpdGhlciB0cmFuc3BvcnQgcnVucyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2UgY29tbWFuZCBzYW5kYm94LicsXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwic3RyaW5nXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdDb21tYW5kIHNhbmRib3ggZm9yIGF1dG8tY3JlYXRlZCBhZ2VudCB3b3Jrc3BhY2VzLiBEZWZhdWx0cyB0byBNb250eS4gRmFsc2UgZGlzYWJsZXMgY29tbWFuZCBleGVjdXRpb247IHRydWUgb3IgXCJtb250eVwiIHNlbGVjdHMgTW9udHk7IGFuIGV4cGxpY2l0IHNhbmRib3ggb3IgcmVzb2x2ZXIgc3VwcGxpZXMgYW5vdGhlciB0cmFuc3BvcnQuJyxcbiAgICB9LFxuICAgIHdvcmtzcGFjZUZhbGxiYWNrVG9UbXA6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQWRkIHVzZXItc2NvcGVkIC90bXAgdG8gYXV0by1jcmVhdGVkIGFnZW50IHdvcmtzcGFjZXMgb25seSB3aGVuIG5vIGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBwYXRoIG1vdW50cyB3cml0YWJsZS4gRGVmYXVsdHMgdG8gZmFsc2UuXCIsXG4gICAgfSxcbiAgICB3b3Jrc3BhY2VTa2lsbHM6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJVc2UgTWFzdHJhJ3MgbmF0aXZlIG9uLWRlbWFuZCB3b3Jrc3BhY2Ugc2tpbGwgc2VhcmNoIGFuZCB3cml0YWJsZSBza2lsbCBzYXZlcy4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIHdvcmtzcGFjZVRvb2xzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2UgdG9vbCBjb25maWd1cmF0aW9uIGZvciBhdmFpbGFiaWxpdHksIGFwcHJvdmFscywgcmVhZC1iZWZvcmUtd3JpdGUsIG91dHB1dCBsaW1pdHMsIGFuZCBob29rcy5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRBZ2VudDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFnZW50IGlkIHVzZWQgd2hlbiB0aGUgY2xpZW50IG5hbWVzIG5vbmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCByZWdpc3RlcmVkIGFnZW50LCBlbHNlIHRoZSBidWlsdC1pbiBgZGVmYXVsdGAuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTZXJ2aW5nIGVuZHBvaW50IGFwcGxpZWQgdG8gZXZlcnkgYWdlbnQgdGhhdCBvbWl0cyBpdHMgb3duIG1vZGVsLiBGYWxscyBiYWNrIHRvIERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FLCB0aGVuIHRoZSBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIGNhdGFsb2d1ZSBlbmRwb2ludC5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRNb2RlbEZhbGxiYWNrczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJpb3JpdHktb3JkZXJlZCBlbmRwb2ludCBuYW1lcyB0cmllZCBiZWZvcmUgdGhlIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBlbHNlIHBpbnMgYSBtb2RlbC5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlNYXRjaDoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSB3b3Jrc3BhY2UgY2F0YWxvZ3VlLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eVRocmVzaG9sZDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGZvciB0aGUgZnV6enkgbWF0Y2hlciwgMCAoZXhhY3QpIHRvIDEgKGFueXRoaW5nKS4gRGVmYXVsdHMgdG8gMC40LlwiLFxuICAgIH0sXG4gICAgbW9kZWxDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVFRMIGluIG1zIGZvciB0aGUgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgcGVyIHdvcmtzcGFjZSBob3N0LiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXCIsXG4gICAgfSxcbiAgICBtb2RlbE92ZXJyaWRlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhvbm9yIGEgcGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGUgZnJvbSB0aGUgWC1NYXN0cmEtTW9kZWwgaGVhZGVyLCA/bW9kZWw9IHF1ZXJ5LCBvciBhIGBtb2RlbGAgYm9keSBmaWVsZC4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgdHlwZTogW1wic3RyaW5nXCIsIFwib2JqZWN0XCJdIH0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJHZW5pZSBzcGFjZXMgdGhlIGFnZW50cyBjYW4gZGVsZWdhdGUgdG8sIGtleWVkIGJ5IGFsaWFzICh0aGUgdG9vbC1uYW1lIHN1ZmZpeCkuIEVhY2ggdmFsdWUgaXMgYSBzcGFjZSBpZCBvciBgeyBzcGFjZUlkLCBoaW50IH1gLiBGYWxscyBiYWNrIHRvIHRoZSBgZ2VuaWVgIHBsdWdpbidzIG93biBgc3BhY2VzYCBjb25maWcsIHRoZW4gREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzLlwiLFxuICAgIH0sXG4gICAgZ2VuaWVBZ2VudE1vZGU6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVXNlIHRoZSBzdHJlYW1pbmcgR2VuaWUgQWdlbnQgTW9kZSBBUEkgZm9yIGFnZW50LWJhY2tlZCBhc2tfZ2VuaWUuIERlZmF1bHRzIHRvIHRydWU7IGZhbHNlIGZvcmNlcyBsZWdhY3kgcG9sbGluZy4gRmVhdHVyZS1kaXNhYmxlZCBvciBwcmV2aWV3LXRvZ2dsZSByZXNwb25zZXMgZmFsbCBiYWNrIGF1dG9tYXRpY2FsbHkgYmVmb3JlIHN0cmVhbWluZy4gRGlyZWN0IEdlbmllIGNoYXQgYWx3YXlzIHJlcXVpcmVzIEFnZW50IE1vZGUuXCIsXG4gICAgfSxcbiAgICBnZW5pZVNwYWNlQ2FjaGVUdGxNczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRUTCBpbiBtcyBmb3IgdGhlIEdlbmllIHNwYWNlIG1ldGFkYXRhIGNhY2hlLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXCIsXG4gICAgfSxcbiAgICBhZ2VudE1heFN0ZXBzOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuIChhIHRvb2wgY2FsbCBhbmQgdGhlIGZpbmFsIHJlcGx5IGVhY2ggY29uc3VtZSBvbmUpLiBEZWZhdWx0cyB0byAyNS5cIixcbiAgICB9LFxuICAgIGZvbGxvd1VwU3VnZ2VzdGlvbnM6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJzdHJpbmdcIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ09wdGlvbmFsIHBvc3QtdHVybiBmb2xsb3ctdXBzLiBUcnVlIHNlbGVjdHMgc291cmNlcyBhdXRvbWF0aWNhbGx5OyBcImdlbmVyYXRlZFwiIG9yIFwiZ2VuaWVcIiBwaW5zIG9uZSBzb3VyY2U7IGFuIG9iamVjdCBhZGRzIGEgbGltaXQsIHRpbWVvdXQsIGFuZCBvcHRpb25hbCB0b29sIGV4cG9zdXJlLiBEZWZhdWx0cyBvZmYuJyxcbiAgICB9LFxuICAgIHN0cmlwU3RhbGVDaGFydHM6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU3RyaXAgY2hhcnRJZHMgZnJvbSByZWNhbGxlZCBhc3Npc3RhbnQgdG9vbCByZXN1bHRzIHNvIHRoZSBtb2RlbCBjYW5ub3QgcmV1c2UgYSB0dXJuLXNjb3BlZCBjaGFydCBtYXJrZXIuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBzdHlsZUluc3RydWN0aW9uczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYm9vbGVhblwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlN0eWxlIGd1YXJkcmFpbHMgYXBwZW5kZWQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuIEEgc3RyaW5nIHJlcGxhY2VzIHRoZSBidWlsdC1pbiBibG9jaywgYGZhbHNlYCBkaXNhYmxlcyBpdC5cIixcbiAgICB9LFxuICAgIG9ic2VydmFiaWxpdHk6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQnJpZGdlIE1hc3RyYSBzcGFucyBpbnRvIEFwcEtpdCdzIE9UZWwgcGlwZWxpbmUuIERlZmF1bHRzIHRvIG9uIG9ubHkgd2hlbiBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQgb3IgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVCBpcyBzZXQuXCIsXG4gICAgfSxcbiAgICBmZWVkYmFja01vZGU6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJhdXRvXCIsIFwiZ2VuaWVcIiwgXCJtbGZsb3dcIiwgXCJub25lXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRmVlZGJhY2sgZGVzdGluYXRpb24uIEF1dG8gcHJlZmVycyBHZW5pZSBpbiBHZW5pZSBBZ2VudCBNb2RlLCBvdGhlcndpc2UgTUxmbG93IHdoZW4gY29uZmlndXJlZCwgb3RoZXJ3aXNlIG5vbmUuIEV4cGxpY2l0IHVuYXZhaWxhYmxlIG1vZGVzIGZhaWwgc3RhcnR1cC5cIixcbiAgICB9LFxuICAgIG1jcDoge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkV4cG9zZSB0aGUgcmVnaXN0ZXJlZCBhZ2VudHMgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGFnZW50cy1vbmx5OyBhbiBvYmplY3QgdHVuZXMgdGhlIHNlcnZlciBpZCwgYWR2ZXJ0aXNlZCBtZXRhZGF0YSwgYW5kIHdoZXRoZXIgYW1iaWVudCB0b29scyBhcmUgZXhwb3NlZC5cIixcbiAgICB9LFxuICAgIGdlbmllSWRlbnRpdHk6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAvLyBEZXJpdmVkIGZyb20gdGhlIHJlc29sdmVyJ3Mgb3duIGxpc3QsIHNvIGEgbW9kZSBjYW4gbmV2ZXIgYmUgYWNjZXB0ZWQgYXRcbiAgICAgIC8vIHJ1bnRpbWUgd2hpbGUgdGhlIHB1Ymxpc2hlZCBzY2hlbWEgKGFuZCB0aGUgVUkgYnVpbHQgZnJvbSBpdCkgb21pdHMgaXQuXG4gICAgICBlbnVtOiBbLi4uSURFTlRJVFlfTU9ERVNdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IGFnZW50LWJhY2tlZCB3b3Jrc3BhY2UgY2FsbHMgKHNlcnZpbmcgY2F0YWxvZ3VlLCBHZW5pZSwgc3RhdGVtZW50IGV4ZWN1dGlvbikgcnVuIGFzLiBEaXJlY3QgR2VuaWUgY2hhdCBhbHdheXMgdXNlcyBPQk8uIFwidXNlclwiIChkZWZhdWx0KSBpcyBhbHdheXMgT0JPLCBzbyBjYWxsZXJzIG11c3QgYmUgd29ya3NwYWNlIG1lbWJlcnM7IFwic2VydmljZS1wcmluY2lwYWxcIiBhbHdheXMgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLCBzbyBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwIHdvcmtzLCBhdCB0aGUgY29zdCBvZiBwZXItdXNlciBhdHRyaWJ1dGlvbjsgXCJhdXRvXCIgdXNlcyBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiBhbmQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIHdoZW4gaXQgZG9lcyBub3QsIGZvciBhbiBhcHAgdGhhdCBhbHNvIHNlcnZlcyBhIHR1bm5lbCBvciB3ZWJob29rIGRvb3IuIEZhbGxzIGJhY2sgdG8gTUFTVFJBX0dFTklFX0lERU5USVRZLicsXG4gICAgfSxcbiAgICBhcGlBY2Nlc3M6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJzY29wZWRcIiwgXCJmdWxsXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgbXVjaCBvZiB0aGUgc3RvY2sgQG1hc3RyYS9leHByZXNzIEFQSSBpcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW91bnQuIFwic2NvcGVkXCIgKGRlZmF1bHQpIGFsbG93cyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpcyBwbHVnaW5cXCdzIG93biByb3V0ZXMsIGFuZCBNQ1A7IFwiZnVsbFwiIGRpc3BhdGNoZXMgdGhlIGVudGlyZSBtYW5hZ2VtZW50IHN1cmZhY2UuJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9ydGFibGUgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGdlbmVyYXRlZCBjaGFydHMgKHNlcmllcyBwYWxldHRlIGZyb20gY29sb3JzLnByaW1hcnkgLyBjb2xvcnMuYWNjZW50LCBiYXNlIGZvbnQgZnJvbSB0eXBvZ3JhcGh5LnNhbnMpLlwiLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ChatFast post-turn follow-up suggestion generation.
3
+ *
4
+ * @module
5
+ */
6
+ import type { OutputProcessor } from "@mastra/core/processors";
7
+ import type { RequestContext } from "@mastra/core/request-context";
8
+ import type { MastraStreamTransform } from "@mastra/core/stream";
9
+ import type { MastraPluginConfig } from "./config.ts";
10
+ /** Trusted request-context key carrying the current user message. */
11
+ export declare const FOLLOW_UP_USER_TEXT_KEY = "mastra__follow_up_user_text";
12
+ /** Trusted request-context key carrying native Genie follow-up questions. */
13
+ export declare const FOLLOW_UP_NATIVE_QUESTIONS_KEY = "mastra__follow_up_native_questions";
14
+ /** Trusted request-context key coordinating one post-turn stream with its processor. */
15
+ export declare const FOLLOW_UP_RUN_ID_KEY = "mastra__follow_up_run_id";
16
+ /** Fully resolved follow-up suggestion settings. */
17
+ export interface ResolvedFollowUpSuggestionsConfig {
18
+ mode: "auto" | "generated" | "genie";
19
+ limit: number;
20
+ timeoutMs: number;
21
+ exposeTool: boolean;
22
+ }
23
+ /** Inputs for one follow-up generation pass. */
24
+ export interface SuggestFollowUpsOptions {
25
+ userText: string;
26
+ answer: string;
27
+ /** Bounded serialized tool inputs and outputs that ground the next questions. */
28
+ turnContext?: string;
29
+ nativeQuestions?: readonly string[];
30
+ requestContext?: RequestContext;
31
+ abortSignal?: AbortSignal;
32
+ }
33
+ /** Replaceable suggestion boundary used by the finish callback and tests. */
34
+ export type FollowUpSuggester = (config: MastraPluginConfig, options: SuggestFollowUpsOptions) => Promise<string[]>;
35
+ /** Resolve disabled, shorthand, and configured suggestion policy forms. */
36
+ export declare function resolveFollowUpSuggestionsConfig(value: MastraPluginConfig["followUpSuggestions"]): ResolvedFollowUpSuggestionsConfig | undefined;
37
+ /** Generate grounded follow-ups through ChatFast, failing open to an empty list. */
38
+ export declare function suggestFollowUps(config: MastraPluginConfig, options: SuggestFollowUpsOptions): Promise<string[]>;
39
+ /** Build Mastra's final output processor for configured generated follow-ups. */
40
+ export declare function buildFollowUpSuggestionsProcessor(config: MastraPluginConfig, suggester?: FollowUpSuggester): OutputProcessor | undefined;
41
+ /** Inject the processor's persisted data part before Mastra's finish chunk. */
42
+ export declare function buildFollowUpSuggestionsTransform(runId: string): MastraStreamTransform;
43
+ /** Build the optional explicitly callable follow-up suggestion tool. */
44
+ export declare function buildSuggestFollowUpsTool(config: MastraPluginConfig): import("@mastra/core/tools").Tool<{
45
+ userText: string;
46
+ answer: string;
47
+ turnContext?: string | undefined;
48
+ nativeQuestions?: string[] | undefined;
49
+ }, {
50
+ questions: string[];
51
+ }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "suggest_follow_ups", unknown>;