@dbx-tools/appkit-mastra 0.6.72 → 0.6.73

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.
@@ -23,7 +23,7 @@ import type { Agent } from "@mastra/core/agent";
23
23
  export interface LoadHistoryOptions {
24
24
  agent: Agent;
25
25
  threadId: string;
26
- resourceId?: string;
26
+ resourceId: string;
27
27
  page?: number;
28
28
  perPage?: number;
29
29
  /** When true, returns the *oldest* page first (chronological). */
@@ -49,6 +49,7 @@ export declare function loadHistory(opts: LoadHistoryOptions): Promise<MastraHis
49
49
  export interface ClearHistoryOptions {
50
50
  agent: Agent;
51
51
  threadId: string;
52
+ resourceId: string;
52
53
  }
53
54
  /**
54
55
  * Wipe every persisted message tied to a thread. Returns the count
@@ -57,7 +57,7 @@ export async function loadHistory(opts) {
57
57
  const startedAt = Date.now();
58
58
  const result = await memory.recall({
59
59
  threadId: opts.threadId,
60
- ...(opts.resourceId ? { resourceId: opts.resourceId } : {}),
60
+ resourceId: opts.resourceId,
61
61
  page,
62
62
  perPage,
63
63
  orderBy: {
@@ -104,6 +104,15 @@ export async function clearHistory(opts) {
104
104
  logger.debug("clear:no-memory", { agentId: opts.agent.id, threadId: opts.threadId });
105
105
  return { cleared: 0 };
106
106
  }
107
+ const existing = await memory.getThreadById({ threadId: opts.threadId });
108
+ if (!existing || existing.resourceId !== opts.resourceId) {
109
+ logger.debug("clear:not-owned", {
110
+ agentId: opts.agent.id,
111
+ threadId: opts.threadId,
112
+ found: existing !== null,
113
+ });
114
+ return { cleared: 0 };
115
+ }
107
116
  // Mastra's `deleteThread` cascades to the message table, so we
108
117
  // can't ask for a count after the fact. Read it pre-delete with a
109
118
  // one-page recall sized to fit common threads in a single round
@@ -112,6 +121,7 @@ export async function clearHistory(opts) {
112
121
  try {
113
122
  const probe = await memory.recall({
114
123
  threadId: opts.threadId,
124
+ resourceId: opts.resourceId,
115
125
  page: 0,
116
126
  perPage: 1,
117
127
  });
@@ -127,20 +137,7 @@ export async function clearHistory(opts) {
127
137
  });
128
138
  }
129
139
  const startedAt = Date.now();
130
- try {
131
- await memory.deleteThread(opts.threadId);
132
- }
133
- catch (err) {
134
- // Mastra's `deleteThread` raises when the thread row was never
135
- // created (e.g. clearing an empty session). Surface as a soft
136
- // warn and treat as success - the user-facing semantic is
137
- // "history is now empty" which is already true.
138
- logger.warn("clear:delete-soft-failed", {
139
- agentId: opts.agent.id,
140
- threadId: opts.threadId,
141
- error: error.errorMessage(err),
142
- });
143
- }
140
+ await memory.deleteThread(opts.threadId);
144
141
  logger.info("clear:done", {
145
142
  agentId: opts.agent.id,
146
143
  threadId: opts.threadId,
@@ -199,6 +196,11 @@ export function historyRoute(options) {
199
196
  };
200
197
  }
201
198
  const resourceId = requestContext.get(MASTRA_RESOURCE_ID_KEY);
199
+ if (!resourceId) {
200
+ return {
201
+ error: c.json({ error: "resource id missing from request context" }, 400),
202
+ };
203
+ }
202
204
  return { agentId, agent, threadId, resourceId };
203
205
  };
204
206
  return [
@@ -211,7 +213,7 @@ export function historyRoute(options) {
211
213
  const payload = await loadHistory({
212
214
  agent: ctx.agent,
213
215
  threadId: ctx.threadId,
214
- ...(ctx.resourceId ? { resourceId: ctx.resourceId } : {}),
216
+ resourceId: ctx.resourceId,
215
217
  page: parseIntParam(c.req.query("page")),
216
218
  perPage: parseIntParam(c.req.query("perPage")),
217
219
  });
@@ -227,6 +229,7 @@ export function historyRoute(options) {
227
229
  const { cleared } = await clearHistory({
228
230
  agent: ctx.agent,
229
231
  threadId: ctx.threadId,
232
+ resourceId: ctx.resourceId,
230
233
  });
231
234
  const payload = {
232
235
  ok: true,
@@ -261,4 +264,4 @@ function toEpoch(value) {
261
264
  }
262
265
  return 0;
263
266
  }
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oaXN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1wRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUU1QyxxRUFBcUU7QUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsNkVBQTZFO0FBQzdFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQWF6Qjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLElBQXdCO0lBQ3hELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ3pDLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsR0FBRyxFQUFFLFlBQVk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMs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LFNBQVMsT0FBTyxDQUFDLEtBQWM7SUFDN0IsSUFBSSxLQUFLLFlBQVksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhyZWFkIGhpc3RvcnkgbG9hZGVyIGV4cG9zZWQgYXMgYSBNYXN0cmEgY3VzdG9tIEFQSSByb3V0ZS5cbiAqXG4gKiBCYWNrZWQgZW50aXJlbHkgYnkgbmF0aXZlIE1hc3RyYTogbG9va3MgdXAgdGhlIGFjdGl2ZSBhZ2VudCBieSBpZCxcbiAqIGFza3MgaXRzIGBNZW1vcnlgIGluc3RhbmNlIHRvIGByZWNhbGxgIGEgcGFnZSBvZiBgTWFzdHJhREJNZXNzYWdlYHMsXG4gKiBhbmQgY29udmVydHMgdGhlIHJlc3VsdCB0byBBSSBTREsgVjUgYFVJTWVzc2FnZWBzIHdpdGggdGhlIG9mZmljaWFsXG4gKiB7QGxpbmsgdG9BSVNka1Y1TWVzc2FnZXN9IGhlbHBlciBmcm9tIGBAbWFzdHJhL2FpLXNkay91aWAuIE5vIGRpcmVjdFxuICogZGF0YWJhc2UgcmVhZHMuXG4gKlxuICogVGhlIHJvdXRlIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgaGlzdG9yeVJvdXRlfSBhcyBhIE1hc3RyYVxuICogYHJlZ2lzdGVyQXBpUm91dGVgIHNvIGl0IHNpdHMgaW4gdGhlIHNhbWUgZGlzcGF0Y2hlciBwaXBlbGluZSBhc1xuICogdGhlIHN0YW5kYXJkIGFnZW50IHJvdXRlcy4gVGhhdCBtZWFucyB0aGUgYE1hc3RyYVNlcnZlcmAgYXV0aFxuICogbWlkZGxld2FyZSAoaW4gYC4vc2VydmVyLnRzYCkgaGFzIGFscmVhZHkgcG9wdWxhdGVkIGBSZXF1ZXN0Q29udGV4dGAgd2l0aFxuICogYE1BU1RSQV9USFJFQURfSURfS0VZYCBhbmQgYE1BU1RSQV9SRVNPVVJDRV9JRF9LRVlgIGJ5IHRoZSB0aW1lXG4gKiB0aGUgaGFuZGxlciBydW5zIC0gbm8gY29va2llIG9yIHVzZXIgbG9va3VwcyBoYXBwZW4gaGVyZSwgYW5kIHRoZVxuICogc2Vzc2lvbi1jb29raWUgbG9naWMgc3RheXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaW4gYHNlcnZlci50c2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBNYXN0cmFDbGVhckhpc3RvcnlSZXNwb25zZSxcbiAgTWFzdHJhSGlzdG9yeVJlc3BvbnNlLFxuICBNYXN0cmFIaXN0b3J5VUlNZXNzYWdlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyB0b0FJU2RrVjVNZXNzYWdlcyB9IGZyb20gXCJAbWFzdHJhL2FpLXNkay91aVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhREJNZXNzYWdlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudC9tZXNzYWdlLWxpc3RcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIE1BU1RSQV9USFJFQURfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dFdpdGhNYXN0cmEgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NlcnZlclwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJBcGlSb3V0ZSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvc2VydmVyXCI7XG5cbmltcG9ydCB7IGNsYW1wUGVyUGFnZSwgcGFyc2VJbnRQYXJhbSB9IGZyb20gXCIuL3BhZ2luYXRpb24udHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9oaXN0b3J5XCIpO1xuXG4vKiogRGVmYXVsdCBoaXN0b3J5IHBhZ2Ugc2l6ZTsgbWF0Y2hlcyB0aGUgTWFzdHJhIHN0b3JhZ2UgZGVmYXVsdC4gKi9cbmNvbnN0IERFRkFVTFRfUEVSX1BBR0UgPSAyMDtcbi8qKiBIYXJkIGNhcCBzbyBhIG1pc2JlaGF2aW5nIGNsaWVudCBjYW4ndCBmZXRjaCB0aGUgd2hvbGUgdGhyZWFkIGF0IG9uY2UuICovXG5jb25zdCBNQVhfUEVSX1BBR0UgPSAyMDA7XG5cbi8qKiBJbnB1dHMgYWNjZXB0ZWQgYnkge0BsaW5rIGxvYWRIaXN0b3J5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZEhpc3RvcnlPcHRpb25zIHtcbiAgYWdlbnQ6IEFnZW50O1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkPzogc3RyaW5nO1xuICBwYWdlPzogbnVtYmVyO1xuICBwZXJQYWdlPzogbnVtYmVyO1xuICAvKiogV2hlbiB0cnVlLCByZXR1cm5zIHRoZSAqb2xkZXN0KiBwYWdlIGZpcnN0IChjaHJvbm9sb2dpY2FsKS4gKi9cbiAgYXNjZW5kaW5nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHBhZ2Ugb2YgVUktZm9ybWF0dGVkIG1lc3NhZ2VzIGZvciBhIHRocmVhZC5cbiAqXG4gKiBVc2VzIHRoZSBhZ2VudCdzIHJlc29sdmVkIGBNZW1vcnlgIChgZ2V0TWVtb3J5KClgKSBzbyBwZXItYWdlbnRcbiAqIHN0b3JhZ2UgbmFtZXNwYWNlcyAoYG1hc3RyYV88YWdlbnRJZD5gIHNjaGVtYXMpIGFuZCBhbnkgZnV0dXJlXG4gKiBtZW1vcnktc2lkZSBmaWx0ZXJzIGFwcGx5IGF1dG9tYXRpY2FsbHkuIFdoZW4gdGhlIGFnZW50IGhhcyBub1xuICogbWVtb3J5IGNvbmZpZ3VyZWQgdGhlIHJlc3BvbnNlIGlzIGEgc3VjY2Vzc2Z1bCBlbXB0eSBwYWdlIHNvXG4gKiBjYWxsZXJzIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIHN0YXRlbGVzcyBhZ2VudHMuXG4gKlxuICogUGFnaW5hdGlvbiBpcyBkZXNjZW5kaW5nLWJ5LWRlZmF1bHQ6IHBhZ2UgMCBpcyB0aGUgbW9zdCByZWNlbnRcbiAqIHBhZ2UsIHBhZ2UgMSB0aGUgcGFnZSBiZWZvcmUgdGhhdCwgZXRjLiBUaGUgcmV0dXJuZWQgYHVpTWVzc2FnZXNgXG4gKiBhcmUgYWx3YXlzIHJlLXNvcnRlZCBpbnRvIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCAtPiBuZXdlc3QpXG4gKiBzbyB0aGUgY2xpZW50IGNhbiBwcmVwZW5kIHRoZW0gYWJvdmUgdGhlIGV4aXN0aW5nIHRyYW5zY3JpcHRcbiAqIHdpdGhvdXQgc29ydGluZyBsb2NhbGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3Rvcnkob3B0czogTG9hZEhpc3RvcnlPcHRpb25zKTogUHJvbWlzZTxNYXN0cmFIaXN0b3J5UmVzcG9uc2U+IHtcbiAgY29uc3QgcGVyUGFnZSA9IGNsYW1wUGVyUGFnZShvcHRzLnBlclBhZ2UsIHtcbiAgICBmYWxsYmFjazogREVGQVVMVF9QRVJfUEFHRSxcbiAgICBtYXg6IE1BWF9QRVJfUEFHRSxcbiAgfSk7XG4gIGNvbnN0IHBhZ2UgPSBNYXRoLm1heCgwLCBNYXRoLnRydW5jKG9wdHMucGFnZSA/PyAwKSk7XG4gIGNvbnN0IG1lbW9yeSA9IGF3YWl0IG9wdHMuYWdlbnQuZ2V0TWVtb3J5KCk7XG4gIGlmICghbWVtb3J5KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVjYWxsOm5vLW1lbW9yeVwiLCB7IGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsIHRocmVhZElkOiBvcHRzLnRocmVhZElkIH0pO1xuICAgIHJldHVybiB7IHVpTWVzc2FnZXM6IFtdLCBwYWdlLCBwZXJQYWdlLCB0b3RhbDogMCwgaGFzTW9yZTogZmFsc2UgfTtcbiAgfVxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBtZW1vcnkucmVjYWxsKHtcbiAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICAuLi4ob3B0cy5yZXNvdXJjZUlkID8geyByZXNvdXJjZUlkOiBvcHRzLnJlc291cmNlSWQgfSA6IHt9KSxcbiAgICBwYWdlLFxuICAgIHBlclBhZ2UsXG4gICAgb3JkZXJCeToge1xuICAgICAgZmllbGQ6IFwiY3JlYXRlZEF0XCIsXG4gICAgICBkaXJlY3Rpb246IG9wdHMuYXNjZW5kaW5nID8gXCJBU0NcIiA6IFwiREVTQ1wiLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBjaHJvbm9sb2dpY2FsID0gc29ydENocm9ub2xvZ2ljYWwocmVzdWx0Lm1lc3NhZ2VzKTtcbiAgY29uc3QgdWlNZXNzYWdlcyA9IHRvQUlTZGtWNU1lc3NhZ2VzKGNocm9ub2xvZ2ljYWwpIGFzIHVua25vd24gYXMgTWFzdHJhSGlzdG9yeVVJTWVzc2FnZVtdO1xuICBsb2dnZXIuZGVidWcoXCJyZWNhbGw6ZG9uZVwiLCB7XG4gICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICBwYWdlLFxuICAgIHBlclBhZ2UsXG4gICAgcmV0dXJuZWQ6IHVpTWVzc2FnZXMubGVuZ3RoLFxuICAgIHRvdGFsOiByZXN1bHQudG90YWwsXG4gICAgaGFzTW9yZTogcmVzdWx0Lmhhc01vcmUsXG4gICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB1aU1lc3NhZ2VzLFxuICAgIHBhZ2UsXG4gICAgcGVyUGFnZSxcbiAgICB0b3RhbDogcmVzdWx0LnRvdGFsLFxuICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlLFxuICB9O1xufVxuXG4vKiogSW5wdXRzIGFjY2VwdGVkIGJ5IHtAbGluayBjbGVhckhpc3Rvcnl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGVhckhpc3RvcnlPcHRpb25zIHtcbiAgYWdlbnQ6IEFnZW50O1xuICB0aHJlYWRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdpcGUgZXZlcnkgcGVyc2lzdGVkIG1lc3NhZ2UgdGllZCB0byBhIHRocmVhZC4gUmV0dXJucyB0aGUgY291bnRcbiAqIG9mIG1lc3NhZ2VzIHRoYXQgd2VyZSBvbiB0aGUgdGhyZWFkIGF0IGRlbGV0ZSB0aW1lIHNvIHRoZSBjYWxsZXJcbiAqIGNhbiByZW5kZXIgYSBcImNsZWFyZWQgTiBtZXNzYWdlc1wiIGFmZm9yZGFuY2Ugd2l0aG91dCBhblxuICogYWRkaXRpb25hbCByb3VuZC10cmlwLlxuICpcbiAqIEFnZW50cyB3aXRob3V0IGEgY29uZmlndXJlZCBgTWVtb3J5YCByZXNvbHZlIHRvIGEgbm8tb3AgKGNvdW50XG4gKiAwKSwgbWF0Y2hpbmcge0BsaW5rIGxvYWRIaXN0b3J5fSdzIFwic3RhdGVsZXNzIGFnZW50cyByZXR1cm4gYW5cbiAqIGVtcHR5IHBhZ2VcIiBzdGFuY2Ugc28gY2FsbGVycyBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSB0aGVtLlxuICogVGhyZWFkcyB0aGF0IGRvbid0IGV4aXN0IHlldCBhcmUgYWxzbyBhIHN1Y2Nlc3NmdWwgbm8tb3AgLSB0aGVcbiAqIG9wZXJhdGlvbiBpcyBpZGVtcG90ZW50IHNvIHRoZSBVSSBjYW4gZmlyZS1hbmQtZm9yZ2V0IHdpdGhvdXRcbiAqIHRyYWNraW5nIHRocmVhZCBleGlzdGVuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhckhpc3Rvcnkob3B0czogQ2xlYXJIaXN0b3J5T3B0aW9ucyk6IFByb21pc2U8eyBjbGVhcmVkOiBudW1iZXIgfT4ge1xuICBjb25zdCBtZW1vcnkgPSBhd2FpdCBvcHRzLmFnZW50LmdldE1lbW9yeSgpO1xuICBpZiAoIW1lbW9yeSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyOm5vLW1lbW9yeVwiLCB7IGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsIHRocmVhZElkOiBvcHRzLnRocmVhZElkIH0pO1xuICAgIHJldHVybiB7IGNsZWFyZWQ6IDAgfTtcbiAgfVxuICAvLyBNYXN0cmEncyBgZGVsZXRlVGhyZWFkYCBjYXNjYWRlcyB0byB0aGUgbWVzc2FnZSB0YWJsZSwgc28gd2VcbiAgLy8gY2FuJ3QgYXNrIGZvciBhIGNvdW50IGFmdGVyIHRoZSBmYWN0LiBSZWFkIGl0IHByZS1kZWxldGUgd2l0aCBhXG4gIC8vIG9uZS1wYWdlIHJlY2FsbCBzaXplZCB0byBmaXQgY29tbW9uIHRocmVhZHMgaW4gYSBzaW5nbGUgcm91bmRcbiAgLy8gdHJpcDsgdGhlIHZhbHVlIGlzIGZvciB0ZWxlbWV0cnkgLyBVSSwgbm90IGNvcnJlY3RuZXNzLlxuICBsZXQgY2xlYXJlZCA9IDA7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvYmUgPSBhd2FpdCBtZW1vcnkucmVjYWxsKHtcbiAgICAgIHRocmVhZElkOiBvcHRzLnRocmVhZElkLFxuICAgICAgcGFnZTogMCxcbiAgICAgIHBlclBhZ2U6IDEsXG4gICAgfSk7XG4gICAgY2xlYXJlZCA9IHByb2JlLnRvdGFsO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBBIG1pc3NpbmctdGhyZWFkIGVycm9yIGlzIHRoZSBoYXBweS1wYXRoIFwibm90aGluZyB0byBjb3VudFwiO1xuICAgIC8vIGV2ZXJ5IG90aGVyIGVycm9yIGlzIGxvZ2dlZCBidXQgZG9lc24ndCBibG9jayB0aGUgZGVsZXRlLlxuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyOnByb2JlLWZhaWxlZFwiLCB7XG4gICAgICBhZ2VudElkOiBvcHRzLmFnZW50LmlkLFxuICAgICAgdGhyZWFkSWQ6IG9wdHMudGhyZWFkSWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGF3YWl0IG1lbW9yeS5kZWxldGVUaHJlYWQob3B0cy50aHJlYWRJZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIE1hc3RyYSdzIGBkZWxldGVUaHJlYWRgIHJhaXNlcyB3aGVuIHRoZSB0aHJlYWQgcm93IHdhcyBuZXZlclxuICAgIC8vIGNyZWF0ZWQgKGUuZy4gY2xlYXJpbmcgYW4gZW1wdHkgc2Vzc2lvbikuIFN1cmZhY2UgYXMgYSBzb2Z0XG4gICAgLy8gd2FybiBhbmQgdHJlYXQgYXMgc3VjY2VzcyAtIHRoZSB1c2VyLWZhY2luZyBzZW1hbnRpYyBpc1xuICAgIC8vIFwiaGlzdG9yeSBpcyBub3cgZW1wdHlcIiB3aGljaCBpcyBhbHJlYWR5IHRydWUuXG4gICAgbG9nZ2VyLndhcm4oXCJjbGVhcjpkZWxldGUtc29mdC1mYWlsZWRcIiwge1xuICAgICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICAgIHRocmVhZElkOiBvcHRzLnRocmVhZElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG4gIGxvZ2dlci5pbmZvKFwiY2xlYXI6ZG9uZVwiLCB7XG4gICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICBjbGVhcmVkLFxuICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgfSk7XG4gIHJldHVybiB7IGNsZWFyZWQgfTtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkge0BsaW5rIGhpc3RvcnlSb3V0ZX0uICovXG5leHBvcnQgdHlwZSBIaXN0b3J5Um91dGVPcHRpb25zID1cbiAgeyBwYXRoOiBgJHtzdHJpbmd9OmFnZW50SWQke3N0cmluZ31gOyBhZ2VudD86IG5ldmVyIH0gfCB7IHBhdGg6IHN0cmluZzsgYWdlbnQ6IHN0cmluZyB9O1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBgPHBhdGg+YCBNYXN0cmEgY3VzdG9tIEFQSSByb3V0ZS4gSGFuZGxlcyB0d29cbiAqIG1ldGhvZHMgb24gdGhlIHNhbWUgbW91bnQ6XG4gKlxuICogICAtIGBHRVRgOiByZXR1cm4gYSBwYWdlIG9mIEFJIFNESyBWNSBgVUlNZXNzYWdlYHMgZm9yIHRoZVxuICogICAgIGNhbGxlcidzIGN1cnJlbnQgdGhyZWFkICh7QGxpbmsgbG9hZEhpc3Rvcnl9KS5cbiAqICAgLSBgREVMRVRFYDogd2lwZSBldmVyeSBwZXJzaXN0ZWQgbWVzc2FnZSBvbiB0aGUgY2FsbGVyJ3NcbiAqICAgICB0aHJlYWQgKHtAbGluayBjbGVhckhpc3Rvcnl9KS4gVGhlIHNlc3Npb24gY29va2llIHRoYXRcbiAqICAgICBhbmNob3JzIHRoZSB0aHJlYWQgaWQgaXMgbGVmdCBhbG9uZSBzbyB0aGUgdXNlciBrZWVwcyB0aGVcbiAqICAgICBzYW1lIHRocmVhZCAtIG9ubHkgdGhlIGNvbnRlbnRzIGdvIGF3YXkuXG4gKlxuICogRm9sbG93cyB0aGUgYEBtYXN0cmEvYWktc2RrYCBgY2hhdFJvdXRlYCBjb252ZW50aW9uIGZvciBhZ2VudFxuICogYmluZGluZzogcGFzcyBgYWdlbnRgIGZvciBhIGZpeGVkLWFnZW50IG1vdW50LCBvciBpbmNsdWRlXG4gKiBgOmFnZW50SWRgIGluIHRoZSBwYXRoIGZvciBkeW5hbWljIHJvdXRpbmcuIFRoZSBwbHVnaW4gcmVnaXN0ZXJzXG4gKiBib3RoIGAvcm91dGUvaGlzdG9yeWAgKGRlZmF1bHQgYWdlbnQpIGFuZCBgL3JvdXRlL2hpc3RvcnkvOmFnZW50SWRgLlxuICpcbiAqIFRoZSBoYW5kbGVyIHJlYWRzIGB0aHJlYWRJZGAgYW5kIGByZXNvdXJjZUlkYCBmcm9tIGBSZXF1ZXN0Q29udGV4dGBcbiAqIChwb3B1bGF0ZWQgdXBzdHJlYW0gYnkgYE1hc3RyYVNlcnZlci5yZWdpc3RlckF1dGhNaWRkbGV3YXJlYCksIHNvXG4gKiBubyBjb29raWUgb3IgdXNlciBsb29rdXBzIGhhcHBlbiBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlzdG9yeVJvdXRlKG9wdGlvbnM6IEhpc3RvcnlSb3V0ZU9wdGlvbnMpIHtcbiAgY29uc3QgeyBwYXRoIH0gPSBvcHRpb25zO1xuICBjb25zdCBmaXhlZEFnZW50ID0gXCJhZ2VudFwiIGluIG9wdGlvbnMgPyBvcHRpb25zLmFnZW50IDogdW5kZWZpbmVkO1xuICBpZiAoIWZpeGVkQWdlbnQgJiYgIXBhdGguaW5jbHVkZXMoXCI6YWdlbnRJZFwiKSkge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcImhpc3RvcnlSb3V0ZS5wYXRoXCIsXG4gICAgICBwYXRoLFxuICAgICAgXCJhIHBhdGggY29udGFpbmluZyBgOmFnZW50SWRgLCBvciBhbiBleHBsaWNpdCBgYWdlbnRgXCIsXG4gICAgKTtcbiAgfVxuICAvLyBUaW55IHJlc29sdmVyIHNoYXJlZCBieSBHRVQgLyBERUxFVEU6IGRlcml2ZSB0aGUgYWN0aXZlIGFnZW50XG4gIC8vIGFuZCB0aHJlYWQgaWQsIHJldHVybmluZyBhIEpTT04gZXJyb3IgcmVzcG9uc2Ugd2hlbiBlaXRoZXIgaXNcbiAgLy8gbWlzc2luZy4gS2VlcHMgYm90aCBoYW5kbGVycyB0aGluIGFuZCBnaXZlcyB0aGVtIGlkZW50aWNhbFxuICAvLyB2YWxpZGF0aW9uIGJlaGF2aW91ci5cbiAgY29uc3QgcmVzb2x2ZUNvbnRleHQgPSAoYzogQ29udGV4dFdpdGhNYXN0cmEpID0+IHtcbiAgICBjb25zdCBtYXN0cmEgPSBjLmdldChcIm1hc3RyYVwiKTtcbiAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGMuZ2V0KFwicmVxdWVzdENvbnRleHRcIik7XG4gICAgY29uc3QgYWdlbnRJZCA9IGZpeGVkQWdlbnQgPz8gYy5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgIGlmICghYWdlbnRJZCkge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGMuanNvbih7IGVycm9yOiBcImFnZW50SWQgaXMgcmVxdWlyZWRcIiB9LCA0MDApIH0gYXMgY29uc3Q7XG4gICAgfVxuICAgIGNvbnN0IGFnZW50ID0gbWFzdHJhLmdldEFnZW50QnlJZChhZ2VudElkKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogYy5qc29uKHsgZXJyb3I6IGBVbmtub3duIGFnZW50IFwiJHthZ2VudElkfVwiYCB9LCA0MDQpLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICB9XG4gICAgY29uc3QgdGhyZWFkSWQgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXRocmVhZElkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogYy5qc29uKHsgZXJyb3I6IFwidGhyZWFkIGlkIG1pc3NpbmcgZnJvbSByZXF1ZXN0IGNvbnRleHRcIiB9LCA0MDApLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgYWdlbnRJZCwgYWdlbnQsIHRocmVhZElkLCByZXNvdXJjZUlkIH0gYXMgY29uc3Q7XG4gIH07XG5cbiAgcmV0dXJuIFtcbiAgICByZWdpc3RlckFwaVJvdXRlKHBhdGgsIHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjOiBDb250ZXh0V2l0aE1hc3RyYSkgPT4ge1xuICAgICAgICBjb25zdCBjdHggPSByZXNvbHZlQ29udGV4dChjKTtcbiAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiBjdHgpIHJldHVybiBjdHguZXJyb3I7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBsb2FkSGlzdG9yeSh7XG4gICAgICAgICAgYWdlbnQ6IGN0eC5hZ2VudCxcbiAgICAgICAgICB0aHJlYWRJZDogY3R4LnRocmVhZElkLFxuICAgICAgICAgIC4uLihjdHgucmVzb3VyY2VJZCA/IHsgcmVzb3VyY2VJZDogY3R4LnJlc291cmNlSWQgfSA6IHt9KSxcbiAgICAgICAgICBwYWdlOiBwYXJzZUludFBhcmFtKGMucmVxLnF1ZXJ5KFwicGFnZVwiKSksXG4gICAgICAgICAgcGVyUGFnZTogcGFyc2VJbnRQYXJhbShjLnJlcS5xdWVyeShcInBlclBhZ2VcIikpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGMuanNvbihwYXlsb2FkKTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShwYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYzogQ29udGV4dFdpdGhNYXN0cmEpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gcmVzb2x2ZUNvbnRleHQoYyk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gY3R4KSByZXR1cm4gY3R4LmVycm9yO1xuICAgICAgICBjb25zdCB7IGNsZWFyZWQgfSA9IGF3YWl0IGNsZWFySGlzdG9yeSh7XG4gICAgICAgICAgYWdlbnQ6IGN0eC5hZ2VudCxcbiAgICAgICAgICB0aHJlYWRJZDogY3R4LnRocmVhZElkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogTWFzdHJhQ2xlYXJIaXN0b3J5UmVzcG9uc2UgPSB7XG4gICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgYWdlbnRJZDogY3R4LmFnZW50SWQsXG4gICAgICAgICAgdGhyZWFkSWQ6IGN0eC50aHJlYWRJZCxcbiAgICAgICAgICBjbGVhcmVkLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYy5qc29uKHBheWxvYWQpO1xuICAgICAgfSxcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBTb3J0IG1lc3NhZ2VzIG9sZGVzdC1maXJzdCBieSBgY3JlYXRlZEF0YCwgZmFsbGluZyBiYWNrIHRvIHdoYXRldmVyXG4gKiBvcmRlciB0aGUgc3RvcmFnZSByZXR1cm5lZCB0aGVtIGluLiBUaGUgbmF0aXZlIGByZWNhbGxgIGNhbGwgaG9ub3JzXG4gKiBgb3JkZXJCeWAgYnV0IGRvZXNuJ3QgZ3VhcmFudGVlIGEgc3RhYmxlIHNlY29uZGFyeSBzb3J0LCBzbyB3ZVxuICogbm9ybWFsaXplIGhlcmUgYmVmb3JlIGhhbmRpbmcgdGhlIHBhZ2UgdG8gdGhlIEFJIFNESyBjb252ZXJ0ZXIuXG4gKi9cbmZ1bmN0aW9uIHNvcnRDaHJvbm9sb2dpY2FsKG1lc3NhZ2VzOiBNYXN0cmFEQk1lc3NhZ2VbXSk6IE1hc3RyYURCTWVzc2FnZVtdIHtcbiAgcmV0dXJuIFsuLi5tZXNzYWdlc10uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHRhID0gdG9FcG9jaChhLmNyZWF0ZWRBdCk7XG4gICAgY29uc3QgdGIgPSB0b0Vwb2NoKGIuY3JlYXRlZEF0KTtcbiAgICByZXR1cm4gdGEgLSB0YjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRXBvY2godmFsdWU6IHVua25vd24pOiBudW1iZXIge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdmFsdWUuZ2V0VGltZSgpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQpID8gMCA6IHBhcnNlZDtcbiAgfVxuICByZXR1cm4gMDtcbn1cbiJdfQ==
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oaXN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1wRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUU1QyxxRUFBcUU7QUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsNkVBQTZFO0FBQzdFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQWF6Qjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLElBQXdCO0lBQ3hELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ3pDLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsR0FBRyxFQUFFLFlBQVk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMs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QyxTQUFTLENBQUMsQ0FBQztRQUNoQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLElBQUksS0FBSyxZQUFZLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRocmVhZCBoaXN0b3J5IGxvYWRlciBleHBvc2VkIGFzIGEgTWFzdHJhIGN1c3RvbSBBUEkgcm91dGUuXG4gKlxuICogQmFja2VkIGVudGlyZWx5IGJ5IG5hdGl2ZSBNYXN0cmE6IGxvb2tzIHVwIHRoZSBhY3RpdmUgYWdlbnQgYnkgaWQsXG4gKiBhc2tzIGl0cyBgTWVtb3J5YCBpbnN0YW5jZSB0byBgcmVjYWxsYCBhIHBhZ2Ugb2YgYE1hc3RyYURCTWVzc2FnZWBzLFxuICogYW5kIGNvbnZlcnRzIHRoZSByZXN1bHQgdG8gQUkgU0RLIFY1IGBVSU1lc3NhZ2VgcyB3aXRoIHRoZSBvZmZpY2lhbFxuICoge0BsaW5rIHRvQUlTZGtWNU1lc3NhZ2VzfSBoZWxwZXIgZnJvbSBgQG1hc3RyYS9haS1zZGsvdWlgLiBObyBkaXJlY3RcbiAqIGRhdGFiYXNlIHJlYWRzLlxuICpcbiAqIFRoZSByb3V0ZSBpcyByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIGhpc3RvcnlSb3V0ZX0gYXMgYSBNYXN0cmFcbiAqIGByZWdpc3RlckFwaVJvdXRlYCBzbyBpdCBzaXRzIGluIHRoZSBzYW1lIGRpc3BhdGNoZXIgcGlwZWxpbmUgYXNcbiAqIHRoZSBzdGFuZGFyZCBhZ2VudCByb3V0ZXMuIFRoYXQgbWVhbnMgdGhlIGBNYXN0cmFTZXJ2ZXJgIGF1dGhcbiAqIG1pZGRsZXdhcmUgKGluIGAuL3NlcnZlci50c2ApIGhhcyBhbHJlYWR5IHBvcHVsYXRlZCBgUmVxdWVzdENvbnRleHRgIHdpdGhcbiAqIGBNQVNUUkFfVEhSRUFEX0lEX0tFWWAgYW5kIGBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZYCBieSB0aGUgdGltZVxuICogdGhlIGhhbmRsZXIgcnVucyAtIG5vIGNvb2tpZSBvciB1c2VyIGxvb2t1cHMgaGFwcGVuIGhlcmUsIGFuZCB0aGVcbiAqIHNlc3Npb24tY29va2llIGxvZ2ljIHN0YXlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGluIGBzZXJ2ZXIudHNgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWFzdHJhQ2xlYXJIaXN0b3J5UmVzcG9uc2UsXG4gIE1hc3RyYUhpc3RvcnlSZXNwb25zZSxcbiAgTWFzdHJhSGlzdG9yeVVJTWVzc2FnZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgdG9BSVNka1Y1TWVzc2FnZXMgfSBmcm9tIFwiQG1hc3RyYS9haS1zZGsvdWlcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYURCTWVzc2FnZSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnQvbWVzc2FnZS1saXN0XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRXaXRoTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9zZXJ2ZXJcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQXBpUm91dGUgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NlcnZlclwiO1xuXG5pbXBvcnQgeyBjbGFtcFBlclBhZ2UsIHBhcnNlSW50UGFyYW0gfSBmcm9tIFwiLi9wYWdpbmF0aW9uLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvaGlzdG9yeVwiKTtcblxuLyoqIERlZmF1bHQgaGlzdG9yeSBwYWdlIHNpemU7IG1hdGNoZXMgdGhlIE1hc3RyYSBzdG9yYWdlIGRlZmF1bHQuICovXG5jb25zdCBERUZBVUxUX1BFUl9QQUdFID0gMjA7XG4vKiogSGFyZCBjYXAgc28gYSBtaXNiZWhhdmluZyBjbGllbnQgY2FuJ3QgZmV0Y2ggdGhlIHdob2xlIHRocmVhZCBhdCBvbmNlLiAqL1xuY29uc3QgTUFYX1BFUl9QQUdFID0gMjAwO1xuXG4vKiogSW5wdXRzIGFjY2VwdGVkIGJ5IHtAbGluayBsb2FkSGlzdG9yeX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRIaXN0b3J5T3B0aW9ucyB7XG4gIGFnZW50OiBBZ2VudDtcbiAgdGhyZWFkSWQ6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBwYWdlPzogbnVtYmVyO1xuICBwZXJQYWdlPzogbnVtYmVyO1xuICAvKiogV2hlbiB0cnVlLCByZXR1cm5zIHRoZSAqb2xkZXN0KiBwYWdlIGZpcnN0IChjaHJvbm9sb2dpY2FsKS4gKi9cbiAgYXNjZW5kaW5nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHBhZ2Ugb2YgVUktZm9ybWF0dGVkIG1lc3NhZ2VzIGZvciBhIHRocmVhZC5cbiAqXG4gKiBVc2VzIHRoZSBhZ2VudCdzIHJlc29sdmVkIGBNZW1vcnlgIChgZ2V0TWVtb3J5KClgKSBzbyBwZXItYWdlbnRcbiAqIHN0b3JhZ2UgbmFtZXNwYWNlcyAoYG1hc3RyYV88YWdlbnRJZD5gIHNjaGVtYXMpIGFuZCBhbnkgZnV0dXJlXG4gKiBtZW1vcnktc2lkZSBmaWx0ZXJzIGFwcGx5IGF1dG9tYXRpY2FsbHkuIFdoZW4gdGhlIGFnZW50IGhhcyBub1xuICogbWVtb3J5IGNvbmZpZ3VyZWQgdGhlIHJlc3BvbnNlIGlzIGEgc3VjY2Vzc2Z1bCBlbXB0eSBwYWdlIHNvXG4gKiBjYWxsZXJzIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIHN0YXRlbGVzcyBhZ2VudHMuXG4gKlxuICogUGFnaW5hdGlvbiBpcyBkZXNjZW5kaW5nLWJ5LWRlZmF1bHQ6IHBhZ2UgMCBpcyB0aGUgbW9zdCByZWNlbnRcbiAqIHBhZ2UsIHBhZ2UgMSB0aGUgcGFnZSBiZWZvcmUgdGhhdCwgZXRjLiBUaGUgcmV0dXJuZWQgYHVpTWVzc2FnZXNgXG4gKiBhcmUgYWx3YXlzIHJlLXNvcnRlZCBpbnRvIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCAtPiBuZXdlc3QpXG4gKiBzbyB0aGUgY2xpZW50IGNhbiBwcmVwZW5kIHRoZW0gYWJvdmUgdGhlIGV4aXN0aW5nIHRyYW5zY3JpcHRcbiAqIHdpdGhvdXQgc29ydGluZyBsb2NhbGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3Rvcnkob3B0czogTG9hZEhpc3RvcnlPcHRpb25zKTogUHJvbWlzZTxNYXN0cmFIaXN0b3J5UmVzcG9uc2U+IHtcbiAgY29uc3QgcGVyUGFnZSA9IGNsYW1wUGVyUGFnZShvcHRzLnBlclBhZ2UsIHtcbiAgICBmYWxsYmFjazogREVGQVVMVF9QRVJfUEFHRSxcbiAgICBtYXg6IE1BWF9QRVJfUEFHRSxcbiAgfSk7XG4gIGNvbnN0IHBhZ2UgPSBNYXRoLm1heCgwLCBNYXRoLnRydW5jKG9wdHMucGFnZSA/PyAwKSk7XG4gIGNvbnN0IG1lbW9yeSA9IGF3YWl0IG9wdHMuYWdlbnQuZ2V0TWVtb3J5KCk7XG4gIGlmICghbWVtb3J5KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVjYWxsOm5vLW1lbW9yeVwiLCB7IGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsIHRocmVhZElkOiBvcHRzLnRocmVhZElkIH0pO1xuICAgIHJldHVybiB7IHVpTWVzc2FnZXM6IFtdLCBwYWdlLCBwZXJQYWdlLCB0b3RhbDogMCwgaGFzTW9yZTogZmFsc2UgfTtcbiAgfVxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBtZW1vcnkucmVjYWxsKHtcbiAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICByZXNvdXJjZUlkOiBvcHRzLnJlc291cmNlSWQsXG4gICAgcGFnZSxcbiAgICBwZXJQYWdlLFxuICAgIG9yZGVyQnk6IHtcbiAgICAgIGZpZWxkOiBcImNyZWF0ZWRBdFwiLFxuICAgICAgZGlyZWN0aW9uOiBvcHRzLmFzY2VuZGluZyA/IFwiQVNDXCIgOiBcIkRFU0NcIixcbiAgICB9LFxuICB9KTtcbiAgY29uc3QgY2hyb25vbG9naWNhbCA9IHNvcnRDaHJvbm9sb2dpY2FsKHJlc3VsdC5tZXNzYWdlcyk7XG4gIGNvbnN0IHVpTWVzc2FnZXMgPSB0b0FJU2RrVjVNZXNzYWdlcyhjaHJvbm9sb2dpY2FsKSBhcyB1bmtub3duIGFzIE1hc3RyYUhpc3RvcnlVSU1lc3NhZ2VbXTtcbiAgbG9nZ2VyLmRlYnVnKFwicmVjYWxsOmRvbmVcIiwge1xuICAgIGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsXG4gICAgdGhyZWFkSWQ6IG9wdHMudGhyZWFkSWQsXG4gICAgcGFnZSxcbiAgICBwZXJQYWdlLFxuICAgIHJldHVybmVkOiB1aU1lc3NhZ2VzLmxlbmd0aCxcbiAgICB0b3RhbDogcmVzdWx0LnRvdGFsLFxuICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlLFxuICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdWlNZXNzYWdlcyxcbiAgICBwYWdlLFxuICAgIHBlclBhZ2UsXG4gICAgdG90YWw6IHJlc3VsdC50b3RhbCxcbiAgICBoYXNNb3JlOiByZXN1bHQuaGFzTW9yZSxcbiAgfTtcbn1cblxuLyoqIElucHV0cyBhY2NlcHRlZCBieSB7QGxpbmsgY2xlYXJIaXN0b3J5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xlYXJIaXN0b3J5T3B0aW9ucyB7XG4gIGFnZW50OiBBZ2VudDtcbiAgdGhyZWFkSWQ6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdpcGUgZXZlcnkgcGVyc2lzdGVkIG1lc3NhZ2UgdGllZCB0byBhIHRocmVhZC4gUmV0dXJucyB0aGUgY291bnRcbiAqIG9mIG1lc3NhZ2VzIHRoYXQgd2VyZSBvbiB0aGUgdGhyZWFkIGF0IGRlbGV0ZSB0aW1lIHNvIHRoZSBjYWxsZXJcbiAqIGNhbiByZW5kZXIgYSBcImNsZWFyZWQgTiBtZXNzYWdlc1wiIGFmZm9yZGFuY2Ugd2l0aG91dCBhblxuICogYWRkaXRpb25hbCByb3VuZC10cmlwLlxuICpcbiAqIEFnZW50cyB3aXRob3V0IGEgY29uZmlndXJlZCBgTWVtb3J5YCByZXNvbHZlIHRvIGEgbm8tb3AgKGNvdW50XG4gKiAwKSwgbWF0Y2hpbmcge0BsaW5rIGxvYWRIaXN0b3J5fSdzIFwic3RhdGVsZXNzIGFnZW50cyByZXR1cm4gYW5cbiAqIGVtcHR5IHBhZ2VcIiBzdGFuY2Ugc28gY2FsbGVycyBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSB0aGVtLlxuICogVGhyZWFkcyB0aGF0IGRvbid0IGV4aXN0IHlldCBhcmUgYWxzbyBhIHN1Y2Nlc3NmdWwgbm8tb3AgLSB0aGVcbiAqIG9wZXJhdGlvbiBpcyBpZGVtcG90ZW50IHNvIHRoZSBVSSBjYW4gZmlyZS1hbmQtZm9yZ2V0IHdpdGhvdXRcbiAqIHRyYWNraW5nIHRocmVhZCBleGlzdGVuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhckhpc3Rvcnkob3B0czogQ2xlYXJIaXN0b3J5T3B0aW9ucyk6IFByb21pc2U8eyBjbGVhcmVkOiBudW1iZXIgfT4ge1xuICBjb25zdCBtZW1vcnkgPSBhd2FpdCBvcHRzLmFnZW50LmdldE1lbW9yeSgpO1xuICBpZiAoIW1lbW9yeSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNsZWFyOm5vLW1lbW9yeVwiLCB7IGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsIHRocmVhZElkOiBvcHRzLnRocmVhZElkIH0pO1xuICAgIHJldHVybiB7IGNsZWFyZWQ6IDAgfTtcbiAgfVxuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IG1lbW9yeS5nZXRUaHJlYWRCeUlkKHsgdGhyZWFkSWQ6IG9wdHMudGhyZWFkSWQgfSk7XG4gIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcucmVzb3VyY2VJZCAhPT0gb3B0cy5yZXNvdXJjZUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2xlYXI6bm90LW93bmVkXCIsIHtcbiAgICAgIGFnZW50SWQ6IG9wdHMuYWdlbnQuaWQsXG4gICAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICAgIGZvdW5kOiBleGlzdGluZyAhPT0gbnVsbCxcbiAgICB9KTtcbiAgICByZXR1cm4geyBjbGVhcmVkOiAwIH07XG4gIH1cbiAgLy8gTWFzdHJhJ3MgYGRlbGV0ZVRocmVhZGAgY2FzY2FkZXMgdG8gdGhlIG1lc3NhZ2UgdGFibGUsIHNvIHdlXG4gIC8vIGNhbid0IGFzayBmb3IgYSBjb3VudCBhZnRlciB0aGUgZmFjdC4gUmVhZCBpdCBwcmUtZGVsZXRlIHdpdGggYVxuICAvLyBvbmUtcGFnZSByZWNhbGwgc2l6ZWQgdG8gZml0IGNvbW1vbiB0aHJlYWRzIGluIGEgc2luZ2xlIHJvdW5kXG4gIC8vIHRyaXA7IHRoZSB2YWx1ZSBpcyBmb3IgdGVsZW1ldHJ5IC8gVUksIG5vdCBjb3JyZWN0bmVzcy5cbiAgbGV0IGNsZWFyZWQgPSAwO1xuICB0cnkge1xuICAgIGNvbnN0IHByb2JlID0gYXdhaXQgbWVtb3J5LnJlY2FsbCh7XG4gICAgICB0aHJlYWRJZDogb3B0cy50aHJlYWRJZCxcbiAgICAgIHJlc291cmNlSWQ6IG9wdHMucmVzb3VyY2VJZCxcbiAgICAgIHBhZ2U6IDAsXG4gICAgICBwZXJQYWdlOiAxLFxuICAgIH0pO1xuICAgIGNsZWFyZWQgPSBwcm9iZS50b3RhbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQSBtaXNzaW5nLXRocmVhZCBlcnJvciBpcyB0aGUgaGFwcHktcGF0aCBcIm5vdGhpbmcgdG8gY291bnRcIjtcbiAgICAvLyBldmVyeSBvdGhlciBlcnJvciBpcyBsb2dnZWQgYnV0IGRvZXNuJ3QgYmxvY2sgdGhlIGRlbGV0ZS5cbiAgICBsb2dnZXIuZGVidWcoXCJjbGVhcjpwcm9iZS1mYWlsZWRcIiwge1xuICAgICAgYWdlbnRJZDogb3B0cy5hZ2VudC5pZCxcbiAgICAgIHRocmVhZElkOiBvcHRzLnRocmVhZElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgYXdhaXQgbWVtb3J5LmRlbGV0ZVRocmVhZChvcHRzLnRocmVhZElkKTtcbiAgbG9nZ2VyLmluZm8oXCJjbGVhcjpkb25lXCIsIHtcbiAgICBhZ2VudElkOiBvcHRzLmFnZW50LmlkLFxuICAgIHRocmVhZElkOiBvcHRzLnRocmVhZElkLFxuICAgIGNsZWFyZWQsXG4gICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICB9KTtcbiAgcmV0dXJuIHsgY2xlYXJlZCB9O1xufVxuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSB7QGxpbmsgaGlzdG9yeVJvdXRlfS4gKi9cbmV4cG9ydCB0eXBlIEhpc3RvcnlSb3V0ZU9wdGlvbnMgPVxuICB7IHBhdGg6IGAke3N0cmluZ306YWdlbnRJZCR7c3RyaW5nfWA7IGFnZW50PzogbmV2ZXIgfSB8IHsgcGF0aDogc3RyaW5nOyBhZ2VudDogc3RyaW5nIH07XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIGA8cGF0aD5gIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlLiBIYW5kbGVzIHR3b1xuICogbWV0aG9kcyBvbiB0aGUgc2FtZSBtb3VudDpcbiAqXG4gKiAgIC0gYEdFVGA6IHJldHVybiBhIHBhZ2Ugb2YgQUkgU0RLIFY1IGBVSU1lc3NhZ2VgcyBmb3IgdGhlXG4gKiAgICAgY2FsbGVyJ3MgY3VycmVudCB0aHJlYWQgKHtAbGluayBsb2FkSGlzdG9yeX0pLlxuICogICAtIGBERUxFVEVgOiB3aXBlIGV2ZXJ5IHBlcnNpc3RlZCBtZXNzYWdlIG9uIHRoZSBjYWxsZXInc1xuICogICAgIHRocmVhZCAoe0BsaW5rIGNsZWFySGlzdG9yeX0pLiBUaGUgc2Vzc2lvbiBjb29raWUgdGhhdFxuICogICAgIGFuY2hvcnMgdGhlIHRocmVhZCBpZCBpcyBsZWZ0IGFsb25lIHNvIHRoZSB1c2VyIGtlZXBzIHRoZVxuICogICAgIHNhbWUgdGhyZWFkIC0gb25seSB0aGUgY29udGVudHMgZ28gYXdheS5cbiAqXG4gKiBGb2xsb3dzIHRoZSBgQG1hc3RyYS9haS1zZGtgIGBjaGF0Um91dGVgIGNvbnZlbnRpb24gZm9yIGFnZW50XG4gKiBiaW5kaW5nOiBwYXNzIGBhZ2VudGAgZm9yIGEgZml4ZWQtYWdlbnQgbW91bnQsIG9yIGluY2x1ZGVcbiAqIGA6YWdlbnRJZGAgaW4gdGhlIHBhdGggZm9yIGR5bmFtaWMgcm91dGluZy4gVGhlIHBsdWdpbiByZWdpc3RlcnNcbiAqIGJvdGggYC9yb3V0ZS9oaXN0b3J5YCAoZGVmYXVsdCBhZ2VudCkgYW5kIGAvcm91dGUvaGlzdG9yeS86YWdlbnRJZGAuXG4gKlxuICogVGhlIGhhbmRsZXIgcmVhZHMgYHRocmVhZElkYCBhbmQgYHJlc291cmNlSWRgIGZyb20gYFJlcXVlc3RDb250ZXh0YFxuICogKHBvcHVsYXRlZCB1cHN0cmVhbSBieSBgTWFzdHJhU2VydmVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmVgKSwgc29cbiAqIG5vIGNvb2tpZSBvciB1c2VyIGxvb2t1cHMgaGFwcGVuIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaXN0b3J5Um91dGUob3B0aW9uczogSGlzdG9yeVJvdXRlT3B0aW9ucykge1xuICBjb25zdCB7IHBhdGggfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGZpeGVkQWdlbnQgPSBcImFnZW50XCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMuYWdlbnQgOiB1bmRlZmluZWQ7XG4gIGlmICghZml4ZWRBZ2VudCAmJiAhcGF0aC5pbmNsdWRlcyhcIjphZ2VudElkXCIpKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgIFwiaGlzdG9yeVJvdXRlLnBhdGhcIixcbiAgICAgIHBhdGgsXG4gICAgICBcImEgcGF0aCBjb250YWluaW5nIGA6YWdlbnRJZGAsIG9yIGFuIGV4cGxpY2l0IGBhZ2VudGBcIixcbiAgICApO1xuICB9XG4gIC8vIFRpbnkgcmVzb2x2ZXIgc2hhcmVkIGJ5IEdFVCAvIERFTEVURTogZGVyaXZlIHRoZSBhY3RpdmUgYWdlbnRcbiAgLy8gYW5kIHRocmVhZCBpZCwgcmV0dXJuaW5nIGEgSlNPTiBlcnJvciByZXNwb25zZSB3aGVuIGVpdGhlciBpc1xuICAvLyBtaXNzaW5nLiBLZWVwcyBib3RoIGhhbmRsZXJzIHRoaW4gYW5kIGdpdmVzIHRoZW0gaWRlbnRpY2FsXG4gIC8vIHZhbGlkYXRpb24gYmVoYXZpb3VyLlxuICBjb25zdCByZXNvbHZlQ29udGV4dCA9IChjOiBDb250ZXh0V2l0aE1hc3RyYSkgPT4ge1xuICAgIGNvbnN0IG1hc3RyYSA9IGMuZ2V0KFwibWFzdHJhXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gYy5nZXQoXCJyZXF1ZXN0Q29udGV4dFwiKTtcbiAgICBjb25zdCBhZ2VudElkID0gZml4ZWRBZ2VudCA/PyBjLnJlcS5wYXJhbShcImFnZW50SWRcIik7XG4gICAgaWYgKCFhZ2VudElkKSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogYy5qc29uKHsgZXJyb3I6IFwiYWdlbnRJZCBpcyByZXF1aXJlZFwiIH0sIDQwMCkgfSBhcyBjb25zdDtcbiAgICB9XG4gICAgY29uc3QgYWdlbnQgPSBtYXN0cmEuZ2V0QWdlbnRCeUlkKGFnZW50SWQpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBjLmpzb24oeyBlcnJvcjogYFVua25vd24gYWdlbnQgXCIke2FnZW50SWR9XCJgIH0sIDQwNCksXG4gICAgICB9IGFzIGNvbnN0O1xuICAgIH1cbiAgICBjb25zdCB0aHJlYWRJZCA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghdGhyZWFkSWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBjLmpzb24oeyBlcnJvcjogXCJ0aHJlYWQgaWQgbWlzc2luZyBmcm9tIHJlcXVlc3QgY29udGV4dFwiIH0sIDQwMCksXG4gICAgICB9IGFzIGNvbnN0O1xuICAgIH1cbiAgICBjb25zdCByZXNvdXJjZUlkID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXJlc291cmNlSWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBjLmpzb24oeyBlcnJvcjogXCJyZXNvdXJjZSBpZCBtaXNzaW5nIGZyb20gcmVxdWVzdCBjb250ZXh0XCIgfSwgNDAwKSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgfVxuICAgIHJldHVybiB7IGFnZW50SWQsIGFnZW50LCB0aHJlYWRJZCwgcmVzb3VyY2VJZCB9IGFzIGNvbnN0O1xuICB9O1xuXG4gIHJldHVybiBbXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShwYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYzogQ29udGV4dFdpdGhNYXN0cmEpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gcmVzb2x2ZUNvbnRleHQoYyk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gY3R4KSByZXR1cm4gY3R4LmVycm9yO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgbG9hZEhpc3Rvcnkoe1xuICAgICAgICAgIGFnZW50OiBjdHguYWdlbnQsXG4gICAgICAgICAgdGhyZWFkSWQ6IGN0eC50aHJlYWRJZCxcbiAgICAgICAgICByZXNvdXJjZUlkOiBjdHgucmVzb3VyY2VJZCxcbiAgICAgICAgICBwYWdlOiBwYXJzZUludFBhcmFtKGMucmVxLnF1ZXJ5KFwicGFnZVwiKSksXG4gICAgICAgICAgcGVyUGFnZTogcGFyc2VJbnRQYXJhbShjLnJlcS5xdWVyeShcInBlclBhZ2VcIikpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGMuanNvbihwYXlsb2FkKTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShwYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYzogQ29udGV4dFdpdGhNYXN0cmEpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gcmVzb2x2ZUNvbnRleHQoYyk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gY3R4KSByZXR1cm4gY3R4LmVycm9yO1xuICAgICAgICBjb25zdCB7IGNsZWFyZWQgfSA9IGF3YWl0IGNsZWFySGlzdG9yeSh7XG4gICAgICAgICAgYWdlbnQ6IGN0eC5hZ2VudCxcbiAgICAgICAgICB0aHJlYWRJZDogY3R4LnRocmVhZElkLFxuICAgICAgICAgIHJlc291cmNlSWQ6IGN0eC5yZXNvdXJjZUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogTWFzdHJhQ2xlYXJIaXN0b3J5UmVzcG9uc2UgPSB7XG4gICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgYWdlbnRJZDogY3R4LmFnZW50SWQsXG4gICAgICAgICAgdGhyZWFkSWQ6IGN0eC50aHJlYWRJZCxcbiAgICAgICAgICBjbGVhcmVkLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYy5qc29uKHBheWxvYWQpO1xuICAgICAgfSxcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBTb3J0IG1lc3NhZ2VzIG9sZGVzdC1maXJzdCBieSBgY3JlYXRlZEF0YCwgZmFsbGluZyBiYWNrIHRvIHdoYXRldmVyXG4gKiBvcmRlciB0aGUgc3RvcmFnZSByZXR1cm5lZCB0aGVtIGluLiBUaGUgbmF0aXZlIGByZWNhbGxgIGNhbGwgaG9ub3JzXG4gKiBgb3JkZXJCeWAgYnV0IGRvZXNuJ3QgZ3VhcmFudGVlIGEgc3RhYmxlIHNlY29uZGFyeSBzb3J0LCBzbyB3ZVxuICogbm9ybWFsaXplIGhlcmUgYmVmb3JlIGhhbmRpbmcgdGhlIHBhZ2UgdG8gdGhlIEFJIFNESyBjb252ZXJ0ZXIuXG4gKi9cbmZ1bmN0aW9uIHNvcnRDaHJvbm9sb2dpY2FsKG1lc3NhZ2VzOiBNYXN0cmFEQk1lc3NhZ2VbXSk6IE1hc3RyYURCTWVzc2FnZVtdIHtcbiAgcmV0dXJuIFsuLi5tZXNzYWdlc10uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHRhID0gdG9FcG9jaChhLmNyZWF0ZWRBdCk7XG4gICAgY29uc3QgdGIgPSB0b0Vwb2NoKGIuY3JlYXRlZEF0KTtcbiAgICByZXR1cm4gdGEgLSB0YjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRXBvY2godmFsdWU6IHVua25vd24pOiBudW1iZXIge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdmFsdWUuZ2V0VGltZSgpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQpID8gMCA6IHBhcnNlZDtcbiAgfVxuICByZXR1cm4gMDtcbn1cbiJdfQ==
@@ -45,8 +45,8 @@ import type { MastraPluginConfig } from "./config.ts";
45
45
  * only way to keep serving against an already-usable schema is to treat
46
46
  * migration failure as success and mark the store initialized.
47
47
  *
48
- * Concurrent first callers share one soft attempt; `isInitialized` is set
49
- * before the soft promise settles so later callers skip DDL entirely.
48
+ * Concurrent first callers share one soft attempt. Non-ownership failures stay
49
+ * fatal so missing schemas/tables are retried or surfaced instead of hidden.
50
50
  */
51
51
  export declare function withSoftStorageInit(store: PostgresStore): PostgresStore;
52
52
  /**
package/lib/src/memory.js CHANGED
@@ -46,6 +46,10 @@ const loggedMigrationErrors = new Set();
46
46
  function isDebugEnabled() {
47
47
  return log.isLevelEnabled("debug");
48
48
  }
49
+ /** Whether a migration failed only because this role does not own an existing object. */
50
+ function isOwnershipMigrationError(err) {
51
+ return error.errorContext(err).hasMessage("must be owner");
52
+ }
49
53
  /**
50
54
  * Soften {@link PostgresStore.init} so a failed migration (e.g. Lakebase
51
55
  * `must be owner of table …` on `ALTER`) is logged once instead of rethrown
@@ -55,8 +59,8 @@ function isDebugEnabled() {
55
59
  * only way to keep serving against an already-usable schema is to treat
56
60
  * migration failure as success and mark the store initialized.
57
61
  *
58
- * Concurrent first callers share one soft attempt; `isInitialized` is set
59
- * before the soft promise settles so later callers skip DDL entirely.
62
+ * Concurrent first callers share one soft attempt. Non-ownership failures stay
63
+ * fatal so missing schemas/tables are retried or surfaced instead of hidden.
60
64
  */
61
65
  export function withSoftStorageInit(store) {
62
66
  const soft = store;
@@ -70,10 +74,8 @@ export function withSoftStorageInit(store) {
70
74
  await originalInit();
71
75
  }
72
76
  catch (err) {
73
- // Mark success-for-serving before logging so a racing caller that
74
- // passed the `isInitialized` check still joins this promise rather
75
- // than starting another DDL pass.
76
- soft.isInitialized = true;
77
+ if (!isOwnershipMigrationError(err))
78
+ throw err;
77
79
  const message = error.errorMessage(err);
78
80
  if (!loggedMigrationErrors.has(message)) {
79
81
  loggedMigrationErrors.add(message);
@@ -92,10 +94,12 @@ export function withSoftStorageInit(store) {
92
94
  })();
93
95
  try {
94
96
  await softInitPromise;
95
- }
96
- finally {
97
97
  soft.isInitialized = true;
98
98
  }
99
+ catch (err) {
100
+ softInitPromise = undefined;
101
+ throw err;
102
+ }
99
103
  };
100
104
  return store;
101
105
  }
@@ -334,4 +338,4 @@ function collectAgentDefinitions(config) {
334
338
  function withId(value, fallback) {
335
339
  return value.id ? value : { ...value, id: fallback };
336
340
  }
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sSUFBSSxDQUFDO0FBSTNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLGtGQUFrRjtBQUNsRixNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFaEQsMERBQTBEO0FBQzFELFNBQVMsY0FBYztJQUNyQixPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQW9CO0lBQ3RELE1BQU0sSUFBSSxHQUFHLEtBS1osQ0FBQztJQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksZUFBMEMsQ0FBQztJQUUvQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQ3JCLElBQUksSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPO1FBQy9CLGVBQWUsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzlCLElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLGtFQUFrRTtnQkFDbEUsbUVBQW1FO2dCQUNuRSxrQ0FBa0M7Z0JBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ3hDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxjQUFjLEVBQUUsRUFBRSxDQUFDO3dCQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN2RCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRTs0QkFDN0MsS0FBSyxFQUFFLE9BQU87NEJBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFOzRCQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07eUJBQ3BCLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNMLElBQUksQ0FBQztZQUNILE1BQU0sZUFBZSxDQUFDO1FBQ3hCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxRQUFvQjtJQUNuRSw4REFBOEQ7SUFDOUQsZ0VBQWdFO0lBQ2hFLG9FQUFvRTtJQUNwRSxtQ0FBbUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFNRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBMEI7SUFDdEQsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEQsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkQsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDakcsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxNQUEwQixFQUMxQixvQkFBMEI7SUFFMUIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBSUw7SUFDQTtJQUpYLFlBQVksQ0FBdUI7SUFFM0MsWUFDbUIsTUFBMEIsRUFDMUIsb0JBQTBCO1FBRDFCLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQzFCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBTTtJQUMxQyxDQUFDO0lBRUo7Ozs7Ozs7Ozs7T0FVRztJQUNILGVBQWU7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQy9CLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsT0FBTyxtQkFBbUIsQ0FDeEIsSUFBSSxhQUFhLENBQ2YsTUFBTSxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsQ0FFcEMsQ0FDTCxDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxtQkFBbUIsQ0FDeEIsSUFBSSxhQUFhLENBQUM7WUFDaEIsRUFBRSxFQUFFLHdCQUF3QjtZQUM1QixVQUFVLEVBQUUsaUJBQWlCO1lBQzdCLElBQUksRUFBRSxJQUFJLENBQUMsb0JBQW9CO1NBQ2hDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLE9BQWUsRUFBRSxHQUEwQjtRQUNsRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzFELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDN0MsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUU7WUFDL0IsT0FBTztZQUNQLE9BQU8sRUFBRSxPQUFPLEtBQUssU0FBUztZQUM5QixNQUFNLEVBQUUsTUFBTSxLQUFLLFNBQVM7WUFDNUIsVUFBVSxFQUNSLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVE7U0FDNUYsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLE1BQU0sQ0FBQztZQUNoQixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxFQUFFO2dCQUNQLFlBQVksRUFBRSxFQUFFO2dCQUNoQixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUscURBQXFEO2dCQUNyRCwyREFBMkQ7Z0JBQzNELDREQUE0RDtnQkFDNUQsNERBQTREO2dCQUM1RCxnRUFBZ0U7Z0JBQ2hFLDBEQUEwRDtnQkFDMUQsR0FBRyxDQUFDLE9BQU87b0JBQ1QsQ0FBQyxDQUFDO3dCQUNFLGFBQWEsRUFBRTs0QkFDYixLQUFLLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7NEJBQ2hDLFlBQVksRUFBRSxrQkFBa0I7eUJBQ2pDO3FCQUNGO29CQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsT0FBZSxFQUFFLE9BQXVCO1FBQzNELElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDL0IsSUFBSSxPQUFPLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxPQUFPLG1CQUFtQixDQUN4QixJQUFJLGFBQWEsQ0FBQztnQkFDaEIsRUFBRSxFQUFFLGlCQUFpQixPQUFPLEVBQUU7Z0JBQzlCLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7Z0JBQzNDLElBQUksRUFBRSxJQUFJLENBQUMsb0JBQW9CO2FBQ2hDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUNELDhEQUE4RDtRQUM5RCxnRUFBZ0U7UUFDaEUsMkRBQTJEO1FBQzNELE9BQU8sbUJBQW1CLENBQ3hCLElBQUksYUFBYSxDQUNmLE1BQU0sQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLE9BQU8sRUFBRSxDQUV0QyxDQUNMLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLFdBQVcsQ0FBQyxPQUFzQjtRQUN4QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQy9CLElBQUksT0FBTyxPQUFPLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2hFLE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxJQUFVO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDO1FBQzFCLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRTtRQUNwQix3RUFBd0U7UUFDeEUsMEVBQTBFO1FBQzFFLDRFQUE0RTtRQUM1RSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLHdFQUF3RTtRQUN4RSxrRUFBa0U7UUFDbEUsVUFBVSxFQUFFLGlCQUFpQjtRQUM3QixJQUFJLEVBQUUsSUFBSTtRQUNWLElBQUksRUFBRSxDQUFDLENBQUM7UUFDUixRQUFRLEVBQUUsR0FBRztRQUNiLElBQUksRUFBRSxHQUFHO1FBQ1QsUUFBUSxFQUFFLEdBQUc7S0FDZCxDQUFDLENBQUM7SUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLEtBQUssV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsYUFBYSxDQUFDLE9BQW1DO0lBQ3hELE9BQU8sSUFBSSxRQUFRLENBQ2pCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsY0FBYyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBOEMsQ0FDeEYsQ0FBQztBQUNKLENBQUM7QUFFRCxnRUFBZ0U7QUFDaEUsU0FBUyxzQkFBc0IsQ0FBQyxPQUFtRDtJQUNqRixPQUFPLE9BQU8sS0FBSyxJQUFJLENBQUM7QUFDMUIsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxTQUFTLHVCQUF1QixDQUFDLE1BQTBCO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDN0IsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDekMsSUFBSSxPQUFRLE1BQWdDLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxNQUErQixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUErQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLE1BQU0sQ0FBNEIsS0FBUSxFQUFFLFFBQWdCO0lBQ25FLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZS1iYWNrZWQgTWFzdHJhIG1lbW9yeSB3aXJpbmcuXG4gKlxuICogUHJvdmlkZXMgYSB7QGxpbmsgTWVtb3J5QnVpbGRlcn0gdGhhdCBtaW50cyBvbmUgYE1lbW9yeWAgcGVyIGFnZW50XG4gKiB3aXRoIHR3byBpbmRlcGVuZGVudCBrbm9iczpcbiAqXG4gKiAtICoqU3RvcmFnZSoqICh0aHJlYWRzIC8gbWVzc2FnZXMgdmlhIGBQb3N0Z3Jlc1N0b3JlYCk6IGRlZmF1bHRzIHRvXG4gKiAgICoqcGVyLWFnZW50KiogbmFtZXNwYWNpbmcgdmlhIHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzb1xuICogICBjb252ZXJzYXRpb24gaGlzdG9yeSBzdGF5cyBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZVxuICogICBkYXRhYmFzZS4gYFBvc3RncmVzU3RvcmVgIGF1dG8tY3JlYXRlcyB0aGUgc2NoZW1hIHdpdGhcbiAqICAgYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUU2Agb24gaW5pdC4gQSBmYWlsZWQgbWlncmF0aW9uIChjb21tb24gb25cbiAqICAgTGFrZWJhc2Ugd2hlbiB0aGUgY29ubmVjdGluZyByb2xlIGlzIG5vdCB0aGUgdGFibGUgb3duZXIpIGlzIGxvZ2dlZFxuICogICBhbmQgc2tpcHBlZCB2aWEge0BsaW5rIHdpdGhTb2Z0U3RvcmFnZUluaXR9IHNvIGV4aXN0aW5nIHRhYmxlcyBrZWVwXG4gKiAgIHNlcnZpbmcgaW5zdGVhZCBvZiByZXRyeWluZyBEREwgb24gZXZlcnkgcmVxdWVzdC5cbiAqIC0gKipNZW1vcnkqKiAoc2VtYW50aWMgcmVjYWxsIHZpYSBgUGdWZWN0b3JgKTogZGVmYXVsdHMgdG8gYSBzaW5nbGVcbiAqICAgKipzaGFyZWQqKiBpbnN0YW5jZSBhY3Jvc3MgZXZlcnkgYWdlbnQuIENyb3NzLWFnZW50IHJlY2FsbCBvbiBvbmVcbiAqICAgaW5kZXggaXMgYWxtb3N0IGFsd2F5cyB3aGF0IHVzZXJzIHdhbnQ7IG9wdCBpbnRvIHBlci1hZ2VudCByZWNhbGxcbiAqICAgYnkgcGFzc2luZyBhIHtAbGluayBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZX0gb24gdGhlIGFnZW50LlxuICpcbiAqIEFkZGl0aW9uYWxseSwge0BsaW5rIE1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlfSByZXR1cm5zIGFcbiAqICoqTWFzdHJhLWluc3RhbmNlLWxldmVsKiogYFBvc3RncmVzU3RvcmVgIChzY2hlbWEgYG1hc3RyYV9pbnN0YW5jZWApXG4gKiB1c2VkIGZvciB3b3JrZmxvdyBzbmFwc2hvdHMgLSB0aGUgcGVyc2lzdGVuY2UgbGF5ZXJcbiAqIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgcmVhZHMgZnJvbSB3aGVuIHdha2luZyBhIHN1c3BlbmRlZFxuICogYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBjYWxsLiBQZXItYWdlbnQgc3RvcmVzIGFyZSBub3QgZW5vdWdoIGZvclxuICogdGhpczogd29ya2Zsb3cgcnVucyBhcmUgc2NvcGVkIHRvIHRoZSBNYXN0cmEgaW5zdGFuY2UsIG5vdCBhblxuICogaW5kaXZpZHVhbCBhZ2VudCdzIGBNZW1vcnlgLlxuICpcbiAqIFBsdWdpbi1sZXZlbCBgY29uZmlnLnN0b3JhZ2VgIC8gYGNvbmZpZy5tZW1vcnlgIGFjdCBhcyB0aGUgYmFzZWxpbmVcbiAqIChhdXRvLWRlZmF1bHRlZCB0byBgdHJ1ZWAgaW4gYHBsdWdpbi50c2Agd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW5cbiAqIGlzIHJlZ2lzdGVyZWQpOyBwZXItYWdlbnQgc2V0dGluZ3MgY2FzY2FkZSBvbiB0b3Agb2YgdGhhdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0VXNlcm5hbWVXaXRoQXBpTG9va3VwIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3IsIGhhc2gsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmYXN0ZW1iZWQgfSBmcm9tIFwiQG1hc3RyYS9mYXN0ZW1iZWRcIjtcbmltcG9ydCB7IE1lbW9yeSB9IGZyb20gXCJAbWFzdHJhL21lbW9yeVwiO1xuaW1wb3J0IHsgUGdWZWN0b3IsIFBvc3RncmVzU3RvcmUgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuaW1wb3J0IHsgUG9vbCwgdHlwZSBQb29sQ29uZmlnIH0gZnJvbSBcInBnXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUgfSBmcm9tIFwiLi9zdG9yYWdlLXNjaGVtYS50c1wiO1xuaW1wb3J0IHsgc3VtbWFyeU1vZGVsLCBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zdW1tYXJpemUudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9tZW1vcnlcIik7XG5cbi8qKiBQcm9jZXNzLXdpZGUgZGVkdXBlIHNvIGluc3RhbmNlICsgcGVyLWFnZW50IHN0b3JlcyBzaGFyZSBvbmUgb3duZXJzaGlwIGxvZy4gKi9cbmNvbnN0IGxvZ2dlZE1pZ3JhdGlvbkVycm9ycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKiogV2hldGhlciBgTE9HX0xFVkVMYCBpcyBjdXJyZW50bHkgYXQgb3IgYmVsb3cgZGVidWcuICovXG5mdW5jdGlvbiBpc0RlYnVnRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxvZy5pc0xldmVsRW5hYmxlZChcImRlYnVnXCIpO1xufVxuXG4vKipcbiAqIFNvZnRlbiB7QGxpbmsgUG9zdGdyZXNTdG9yZS5pbml0fSBzbyBhIGZhaWxlZCBtaWdyYXRpb24gKGUuZy4gTGFrZWJhc2VcbiAqIGBtdXN0IGJlIG93bmVyIG9mIHRhYmxlIOKApmAgb24gYEFMVEVSYCkgaXMgbG9nZ2VkIG9uY2UgaW5zdGVhZCBvZiByZXRocm93blxuICogb24gZXZlcnkgc3RvcmFnZSBjYWxsLlxuICpcbiAqIE1hc3RyYSdzIGBhdWdtZW50V2l0aEluaXRgIHJldHJpZXMgaW5pdCBmb3JldmVyIHdoZW4gaXQgdGhyb3dzLCBzbyB0aGVcbiAqIG9ubHkgd2F5IHRvIGtlZXAgc2VydmluZyBhZ2FpbnN0IGFuIGFscmVhZHktdXNhYmxlIHNjaGVtYSBpcyB0byB0cmVhdFxuICogbWlncmF0aW9uIGZhaWx1cmUgYXMgc3VjY2VzcyBhbmQgbWFyayB0aGUgc3RvcmUgaW5pdGlhbGl6ZWQuXG4gKlxuICogQ29uY3VycmVudCBmaXJzdCBjYWxsZXJzIHNoYXJlIG9uZSBzb2Z0IGF0dGVtcHQ7IGBpc0luaXRpYWxpemVkYCBpcyBzZXRcbiAqIGJlZm9yZSB0aGUgc29mdCBwcm9taXNlIHNldHRsZXMgc28gbGF0ZXIgY2FsbGVycyBza2lwIERETCBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTb2Z0U3RvcmFnZUluaXQoc3RvcmU6IFBvc3RncmVzU3RvcmUpOiBQb3N0Z3Jlc1N0b3JlIHtcbiAgY29uc3Qgc29mdCA9IHN0b3JlIGFzIHVua25vd24gYXMge1xuICAgIGluaXQ6ICgpID0+IFByb21pc2U8dm9pZD47XG4gICAgaWQ6IHN0cmluZztcbiAgICBzY2hlbWE/OiBzdHJpbmc7XG4gICAgaXNJbml0aWFsaXplZDogYm9vbGVhbjtcbiAgfTtcbiAgY29uc3Qgb3JpZ2luYWxJbml0ID0gc29mdC5pbml0LmJpbmQoc29mdCk7XG4gIGxldCBzb2Z0SW5pdFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgc29mdC5pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzb2Z0LmlzSW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBzb2Z0SW5pdFByb21pc2UgPz89IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvcmlnaW5hbEluaXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBNYXJrIHN1Y2Nlc3MtZm9yLXNlcnZpbmcgYmVmb3JlIGxvZ2dpbmcgc28gYSByYWNpbmcgY2FsbGVyIHRoYXRcbiAgICAgICAgLy8gcGFzc2VkIHRoZSBgaXNJbml0aWFsaXplZGAgY2hlY2sgc3RpbGwgam9pbnMgdGhpcyBwcm9taXNlIHJhdGhlclxuICAgICAgICAvLyB0aGFuIHN0YXJ0aW5nIGFub3RoZXIgRERMIHBhc3MuXG4gICAgICAgIHNvZnQuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKTtcbiAgICAgICAgaWYgKCFsb2dnZWRNaWdyYXRpb25FcnJvcnMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgbG9nZ2VkTWlncmF0aW9uRXJyb3JzLmFkZChtZXNzYWdlKTtcbiAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwibWFzdHJhIHN0b3JhZ2UgbWlncmF0aW9uIGZhaWxlZFwiLCBlcnIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIm1hc3RyYSBzdG9yYWdlIG1pZ3JhdGlvbiBmYWlsZWRcIiwge1xuICAgICAgICAgICAgICBlcnJvcjogbWVzc2FnZSxcbiAgICAgICAgICAgICAgc3RvcmVJZDogc29mdC5pZCxcbiAgICAgICAgICAgICAgc2NoZW1hOiBzb2Z0LnNjaGVtYSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNvZnRJbml0UHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc29mdC5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBzdG9yZTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGRlZGljYXRlZCAqKnNlcnZpY2UtcHJpbmNpcGFsKiogTGFrZWJhc2UgcG9vbCBmb3IgTWFzdHJhXG4gKiBtZW1vcnkgZnJvbSB0aGUgbGFrZWJhc2UgcGx1Z2luJ3MgcmVzb2x2ZWQgU1AgcGcgY29uZmlnLlxuICpcbiAqIFRoZSBwbHVnaW4ncyBgZXhwb3J0cygpLnBvb2xgIGlzIGEgYFJvdXRpbmdQb29sYCB0aGF0IHN3aXRjaGVzIHRvXG4gKiB0aGUgcGVyLXVzZXIgKE9CTykgcG9vbCB3aGVuZXZlciBhIHF1ZXJ5IHJ1bnMgaW5zaWRlIGFuIGBhc1VzZXJgXG4gKiBzY29wZSAtIGV4YWN0bHkgdGhlIGNvbnRleHQgdGhlIG1hc3RyYSBwbHVnaW4gZXN0YWJsaXNoZXMgYXJvdW5kXG4gKiBldmVyeSBjaGF0IHR1cm4uIE1lbW9yeSAodGhyZWFkcyAvIG1lc3NhZ2VzICsgc2VtYW50aWMgcmVjYWxsKSBtdXN0XG4gKiBpbnN0ZWFkIGFsd2F5cyBhY3QgYXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbDogaXQgb3ducyB0aGVcbiAqIGF1dG8tY3JlYXRlZCBgbWFzdHJhXypgIHNjaGVtYXMgKGEgcGVyLXVzZXIgcm9sZSB1c3VhbGx5IGNhbid0XG4gKiBgQ1JFQVRFIFNDSEVNQWApIGFuZCBpcyBzaGFyZWQgYWNyb3NzIHVzZXJzLCBzbyBpdCBjYW5ub3QgaW5oZXJpdCBhXG4gKiByZXF1ZXN0J3MgT0JPIGlkZW50aXR5LlxuICpcbiAqIGBwZ0NvbmZpZ2AgbXVzdCBiZSB0aGUgcGx1Z2luJ3MgYGV4cG9ydHMoKS5nZXRQZ0NvbmZpZygpYCBldmFsdWF0ZWRcbiAqICoqb3V0c2lkZSoqIGFueSBgYXNVc2VyYCBzY29wZSAoaS5lLiBkdXJpbmcgc2V0dXApLCBzbyBpdCBjYXJyaWVzXG4gKiB0aGUgU1AgY29ubmVjdGlvbiB0YXJnZXQsIE9BdXRoIHRva2VuLXJlZnJlc2ggYHBhc3N3b3JkYCBjYWxsYmFjayxcbiAqIGFuZCBhbnkgYGxha2ViYXNlKHsgcG9vbCB9KWAgdHVuaW5nIG92ZXJyaWRlcyAtIGFsbCBvZiB3aGljaCB0aGlzXG4gKiBwb29sIGluaGVyaXRzLiBTZWUgdGhlIGNhbGwgc2l0ZSBpbiBgcGx1Z2luLnRzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VQcmluY2lwYWxQb29sKHBnQ29uZmlnOiBQb29sQ29uZmlnKTogUHJvbWlzZTxQb29sPiB7XG4gIC8vIGBnZXRQZ0NvbmZpZygpYCByZXNvbHZlcyB0aGUgU1AgdXNlcm5hbWUgc3luY2hyb25vdXNseSBmcm9tXG4gIC8vIGBQR1VTRVJgIC8gYERBVEFCUklDS1NfQ0xJRU5UX0lEYDsgZmFsbCBiYWNrIHRvIHRoZSBhc3luYyBBUElcbiAgLy8gbG9va3VwIChlLmcuIGxvY2FsIGRldiBhdXRoZW50aWNhdGluZyB2aWEgUEFUKSBzbyB0aGUgcG9vbCBhbHdheXNcbiAgLy8gaGFzIGFuIGlkZW50aXR5IHRvIGNvbm5lY3Qgd2l0aC5cbiAgY29uc3QgdXNlciA9IHBnQ29uZmlnLnVzZXIgPz8gKGF3YWl0IGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCgpKTtcbiAgcmV0dXJuIG5ldyBQb29sKHsgLi4ucGdDb25maWcsIHVzZXIgfSk7XG59XG5cbi8qKiBFZmZlY3RpdmUgcGVyLWtub2Igc2V0dGluZyBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuICovXG50eXBlIFN0b3JhZ2VTZXR0aW5nID0gTWFzdHJhQWdlbnREZWZpbml0aW9uW1wic3RvcmFnZVwiXTtcbnR5cGUgTWVtb3J5U2V0dGluZyA9IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1lbW9yeVwiXTtcblxuLyoqXG4gKiBUcnVlIHdoZW4gYW55IHBsdWdpbi1sZXZlbCBvciBwZXItYWdlbnQgc2V0dGluZyBjb3VsZCBuZWVkIHRoZVxuICogTGFrZWJhc2UgcG9vbC4gVXNlZCBieSBgcGx1Z2luLnRzYCB0byBnYXRlIGNyZWF0aW9uIG9mIHRoZVxuICogc2VydmljZS1wcmluY2lwYWwgcG9vbCBhbmQgdGhlIHtAbGluayBNZW1vcnlCdWlsZGVyfSB0aGF0IGNvbnN1bWVzXG4gKiBpdDsgd2hlbiBmYWxzZSBuZWl0aGVyIGlzIGJ1aWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNMYWtlYmFzZShjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoc2V0dGluZ05lZWRzU2hhcmVkUG9vbChjb25maWcuc3RvcmFnZSkpIHJldHVybiB0cnVlO1xuICBpZiAoc2V0dGluZ05lZWRzU2hhcmVkUG9vbChjb25maWcubWVtb3J5KSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGRlZnMgPSBjb2xsZWN0QWdlbnREZWZpbml0aW9ucyhjb25maWcpO1xuICByZXR1cm4gZGVmcy5zb21lKChkKSA9PiBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGQuc3RvcmFnZSkgfHwgc2V0dGluZ05lZWRzU2hhcmVkUG9vbChkLm1lbW9yeSkpO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHBlci1hZ2VudCB7QGxpbmsgTWVtb3J5fSBmYWN0b3J5IGJvdW5kIHRvIHRoZSBzdXBwbGllZFxuICogc2VydmljZS1wcmluY2lwYWwgcG9vbCAoc2VlIHtAbGluayBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbH0pLlxuICogQ2FjaGVzIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCBzaW5nbGV0b24gKGJ1aWx0IG9uIGZpcnN0IG5lZWQpIHNvIGVhY2hcbiAqIGFnZW50IGJ1aWxkIGlzIE8oMSkgYWZ0ZXIgdGhlIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtb3J5QnVpbGRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHNlcnZpY2VQcmluY2lwYWxQb29sOiBQb29sLFxuKTogTWVtb3J5QnVpbGRlciB7XG4gIHJldHVybiBuZXcgTWVtb3J5QnVpbGRlcihjb25maWcsIHNlcnZpY2VQcmluY2lwYWxQb29sKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIGBNZW1vcnlgIHBlciBhZ2VudCBhZ2FpbnN0IGEgc2hhcmVkIHNlcnZpY2UtcHJpbmNpcGFsXG4gKiBMYWtlYmFzZSBwb29sLiBQZXItaW5zdGFuY2Ugc3RhdGUga2VlcHMgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIGFsaXZlXG4gKiBhY3Jvc3MgY2FsbHMgc28gcmVnaXN0ZXJpbmcgTiBhZ2VudHMgc3RheXMgY2hlYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnlCdWlsZGVyIHtcbiAgcHJpdmF0ZSBzaGFyZWRWZWN0b3I6IFBnVmVjdG9yIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlUHJpbmNpcGFsUG9vbDogUG9vbCxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2UgdXNlZCBmb3Igd29ya2Zsb3dcbiAgICogc25hcHNob3RzLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gcGx1Z2luLWxldmVsIGBzdG9yYWdlYCBpc1xuICAgKiBkaXNhYmxlZCwgaW4gd2hpY2ggY2FzZSBgYWdlbnQucmVzdW1lU3RyZWFtKClgIChhbmQgdGhlcmVmb3JlXG4gICAqIHRoZSBgcmVxdWlyZUFwcHJvdmFsYCBmbG93KSB3aWxsIG5vdCBiZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIFRoZSBzdG9yZSBsaXZlcyBpbiBhIGRlZGljYXRlZCBgbWFzdHJhX2luc3RhbmNlYCBzY2hlbWEgc28gaXRcbiAgICogbmV2ZXIgY29sbGlkZXMgd2l0aCBwZXItYWdlbnQge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IG5hbWVzcGFjZXMuXG4gICAqIFdvcmtmbG93IHNuYXBzaG90cyBhcmUgbm90IHBlci1hZ2VudCBzdGF0ZTsgdGhleSBiZWxvbmcgdG8gdGhlXG4gICAqIGBNYXN0cmFgIGluc3RhbmNlIHRoYXQgb3ducyB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgKi9cbiAgaW5zdGFuY2VTdG9yYWdlKCk6IFBvc3RncmVzU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLmNvbmZpZy5zdG9yYWdlO1xuICAgIGlmICghc2V0dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHNldHRpbmcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgICBuZXcgUG9zdGdyZXNTdG9yZShcbiAgICAgICAgICB3aXRoSWQoc2V0dGluZywgXCJtYXN0cmEtc3RvcmVfX2luc3RhbmNlXCIpIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczxcbiAgICAgICAgICAgIHR5cGVvZiBQb3N0Z3Jlc1N0b3JlXG4gICAgICAgICAgPlswXSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoe1xuICAgICAgICBpZDogXCJtYXN0cmEtc3RvcmVfX2luc3RhbmNlXCIsXG4gICAgICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgICAgIHBvb2w6IHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYE1lbW9yeWAgZm9yIGBhZ2VudElkYCBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgYWdlbnQgaGFzIG5laXRoZXIgc3RvcmFnZSBub3IgYVxuICAgKiB2ZWN0b3Igc3RvcmUgZW5hYmxlZCAtIE1hc3RyYSBhY2NlcHRzIGEgbWlzc2luZyBgbWVtb3J5YCBmaWVsZFxuICAgKiBhbmQgdHJlYXRzIHRoZSBhZ2VudCBhcyBzdGF0ZWxlc3MuXG4gICAqL1xuICBmb3JBZ2VudChhZ2VudElkOiBzdHJpbmcsIGRlZjogTWFzdHJhQWdlbnREZWZpbml0aW9uKTogTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdG9yYWdlU2V0dGluZyA9IGRlZi5zdG9yYWdlID8/IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgY29uc3QgbWVtb3J5U2V0dGluZyA9IGRlZi5tZW1vcnkgPz8gdGhpcy5jb25maWcubWVtb3J5O1xuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYnVpbGRTdG9yYWdlKGFnZW50SWQsIHN0b3JhZ2VTZXR0aW5nKTtcbiAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLmJ1aWxkVmVjdG9yKG1lbW9yeVNldHRpbmcpO1xuICAgIGlmICghc3RvcmFnZSAmJiAhdmVjdG9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpzdGF0ZWxlc3NcIiwgeyBhZ2VudElkIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpjb25maWd1cmVkXCIsIHtcbiAgICAgIGFnZW50SWQsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlICE9PSB1bmRlZmluZWQsXG4gICAgICB2ZWN0b3I6IHZlY3RvciAhPT0gdW5kZWZpbmVkLFxuICAgICAgdmVjdG9yTW9kZTpcbiAgICAgICAgdmVjdG9yID09PSB1bmRlZmluZWQgPyBcIm9mZlwiIDogdHlwZW9mIG1lbW9yeVNldHRpbmcgPT09IFwib2JqZWN0XCIgPyBcImRlZGljYXRlZFwiIDogXCJzaGFyZWRcIixcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgTWVtb3J5KHtcbiAgICAgIC4uLihzdG9yYWdlID8geyBzdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4odmVjdG9yID8geyB2ZWN0b3IsIGVtYmVkZGVyOiBmYXN0ZW1iZWQgfSA6IHt9KSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgbGFzdE1lc3NhZ2VzOiAxMCxcbiAgICAgICAgLi4uKHZlY3RvciA/IHsgc2VtYW50aWNSZWNhbGw6IHsgdG9wSzogMywgbWVzc2FnZVJhbmdlOiAyIH0gfSA6IHt9KSxcbiAgICAgICAgLy8gQXV0by1uYW1lIGVhY2ggdGhyZWFkIGZyb20gaXRzIG9wZW5pbmcgdHVybiBzbyB0aGVcbiAgICAgICAgLy8gY29udmVyc2F0aW9uIGxpc3QgdGhlIFVJIHJlbmRlcnMgc2hvd3MgbWVhbmluZ2Z1bCB0aXRsZXNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiByYXcgaWRzLiBUaXRsaW5nIHJ1bnMgb24gdGhlIHNtYWxsIC8gZmFzdCBjaGF0XG4gICAgICAgIC8vIHRpZXIgKHNlZSBgc3VtbWFyaXplLnRzYCkgcmF0aGVyIHRoYW4gdGhlIGFnZW50J3MgcHJpbWFyeVxuICAgICAgICAvLyBtb2RlbCwgc28gbmFtaW5nIGEgdGhyZWFkIG5ldmVyIHNwZW5kcyB0aGUgaGVhdnl3ZWlnaHQgbW9kZWwuXG4gICAgICAgIC8vIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIHN0b3JhZ2UgaXMgb247IGhhcm1sZXNzIG90aGVyd2lzZS5cbiAgICAgICAgLi4uKHN0b3JhZ2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZ2VuZXJhdGVUaXRsZToge1xuICAgICAgICAgICAgICAgIG1vZGVsOiBzdW1tYXJ5TW9kZWwodGhpcy5jb25maWcpLFxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uczogVElUTEVfSU5TVFJVQ1RJT05TLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdG9yYWdlKGFnZW50SWQ6IHN0cmluZywgc2V0dGluZzogU3RvcmFnZVNldHRpbmcpOiBQb3N0Z3Jlc1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNldHRpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKHtcbiAgICAgICAgICBpZDogYG1hc3RyYS1zdG9yZV9fJHthZ2VudElkfWAsXG4gICAgICAgICAgc2NoZW1hTmFtZTogYWdlbnRTdG9yYWdlU2NoZW1hTmFtZShhZ2VudElkKSxcbiAgICAgICAgICBwb29sOiB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIENhc3Q6IGB3aXRoSWRgIGd1YXJhbnRlZXMgYGlkYCBpcyBzZXQsIGJ1dCB0aGUgZGlzdHJpYnV0aXZlXG4gICAgLy8gT21pdCArIGBpZD86IHN0cmluZ2Agc2hhcGUgZG9lc24ndCBzdHJ1Y3R1cmFsbHkgbmFycm93IHRvIHRoZVxuICAgIC8vIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWVtYmVycy4gUnVudGltZSBzaGFwZSBpcyBpZGVudGljYWwuXG4gICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICBuZXcgUG9zdGdyZXNTdG9yZShcbiAgICAgICAgd2l0aElkKHNldHRpbmcsIGBtYXN0cmEtc3RvcmVfXyR7YWdlbnRJZH1gKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8XG4gICAgICAgICAgdHlwZW9mIFBvc3RncmVzU3RvcmVcbiAgICAgICAgPlswXSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBhZ2VudCdzIHZlY3RvciBzdG9yZS4gQ2FzY2FkZTpcbiAgICpcbiAgICogLSBmYWxzeTogbm8gdmVjdG9yLlxuICAgKiAtIGBib29sZWFuYCAvIGB1bmRlZmluZWQtaW5oZXJpdGluZy10cnVlYDogcmV0dXJuIHRoZSBzaGFyZWRcbiAgICogICBzaW5nbGV0b24gKGJ1aWx0IGxhemlseSBvbiBmaXJzdCBjYWxsKS4gQWxsIGFnZW50cyB0aGF0XG4gICAqICAgZGVmYXVsdC1lbmFibGUgbWVtb3J5IHdyaXRlIGludG8gYW5kIHJlY2FsbCBmcm9tIG9uZSBpbmRleC5cbiAgICogLSBvYmplY3Q6IGJ1aWxkIGEgZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgZm9yIHRoaXMgYWdlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVmVjdG9yKHNldHRpbmc6IE1lbW9yeVNldHRpbmcpOiBQZ1ZlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0aGlzLmdldFNoYXJlZFZlY3RvcigpO1xuICAgIHJldHVybiBidWlsZFBnVmVjdG9yKHNldHRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGFyZWRWZWN0b3IoKTogUGdWZWN0b3Ige1xuICAgIGlmICghdGhpcy5zaGFyZWRWZWN0b3IpIHtcbiAgICAgIHRoaXMuc2hhcmVkVmVjdG9yID0gYnVpbGRTaGFyZWRQZ1ZlY3Rvcih0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVmVjdG9yO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHRoYXQgYmFja3MgdGhlIGRlZmF1bHRcbiAqIGBkZWYubWVtb3J5ID09PSB0cnVlYCBjYXNlIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqXG4gKiBgUGdWZWN0b3JgJ3MgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGNvbm5lY3Rpb24tc3R5bGUgY29uZmlnc1xuICogKGBIb3N0Q29uZmlnYCAvIGBDb25uZWN0aW9uU3RyaW5nQ29uZmlnYCAvIGBDbGllbnRDb25maWdgKTsgdGhlcmUgaXNcbiAqIG5vIGB7IHBvb2wgfWAgc2hvcnRoYW5kIHRoZSB3YXkgYFBvc3RncmVzU3RvcmVgIGhhcyBvbmUuIFdvcnNlLCB0aGVcbiAqIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkga2lja3Mgb2ZmIGEgYGNhY2hlV2FybXVwUHJvbWlzZWAgSUlGRSB0aGF0XG4gKiBjYWxscyBgdGhpcy5wb29sLmNvbm5lY3QoKWAgYmVmb3JlIHJldHVybmluZywgc28gd2UgY2FuJ3QgY2xlYW5seVxuICogaGFuZCBpdCBhbiBpbmVydCBjb25maWcgYW5kIHBhdGNoIHRoZSBwb29sIGFmdGVyd2FyZHMuXG4gKlxuICogVGhlIHRyaWNrOiBwYXNzIGlsbGVnYWwtYnV0LXZhbGlkYXRpb24tcGFzc2luZyBwbGFjZWhvbGRlcnMgc28gdGhlXG4gKiB3YXJtdXAncyBgbmV0LmNvbm5lY3QoKWAgcmVqZWN0cyBzeW5jaHJvbm91c2x5IHdpdGggYFJhbmdlRXJyb3JgXG4gKiAoTm9kZSB2YWxpZGF0ZXMgYDAgPD0gcG9ydCA8IDY1NTM2YCkuIFRoZSBJSUZFJ3MgYGNhdGNoIHt9YCBzd2FsbG93c1xuICogaXQsIG5vIEROUyBsb29rdXAgb3IgVENQIGF0dGVtcHQgaGFwcGVucywgYW5kIHdlIHRoZW4gc3dhcFxuICogYHBnVmVjdG9yLnBvb2xgIHRvIHRoZSBsYWtlYmFzZSBwb29sLiBFdmVyeSBzdWJzZXF1ZW50IGBQZ1ZlY3RvcmBcbiAqIG1ldGhvZCByZWFkcyBgdGhpcy5wb29sYCBhdCBjYWxsIHRpbWUsIHNvIGFsbCByZWFsIEkvTyBnb2VzIHRocm91Z2hcbiAqIHRoZSBsYWtlYmFzZSBwb29sIGZyb20gdGhlbiBvbi4gVGhlIHBsYWNlaG9sZGVyIHBvb2wgaXMgYC5lbmQoKWAnZFxuICogc28gaXRzIHNvY2tldCBib29rLWtlZXBpbmcgaXMgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2hhcmVkUGdWZWN0b3IocG9vbDogUG9vbCk6IFBnVmVjdG9yIHtcbiAgY29uc3QgdmVjdG9yID0gbmV3IFBnVmVjdG9yKHtcbiAgICBpZDogYHBnJHtoYXNoLmlkKCl9YCxcbiAgICAvLyBLZWVwIHRoZSByZWNhbGwgaW5kZXggb3V0IG9mIGBwdWJsaWNgOiBvbiBhIExha2ViYXNlIGRhdGFiYXNlIHRoZSBhcHBcbiAgICAvLyBzZXJ2aWNlIHByaW5jaXBhbCBoYXMgbm8gQ1JFQVRFIG9uIGBwdWJsaWNgIChQRzE1KyBsb2NrcyBpdCBkb3duKSwgc28gYVxuICAgIC8vIGRlZmF1bHQtc2NoZW1hIFBnVmVjdG9yIGZhaWxzIG9uIENSRUFURSBJTkRFWCB3aXRoIFwicGVybWlzc2lvbiBkZW5pZWQgZm9yXG4gICAgLy8gc2NoZW1hIHB1YmxpY1wiLiBQZ1ZlY3RvciBydW5zIENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyBmb3IgYSBuYW1lZFxuICAgIC8vIHNjaGVtYSwgc28gdGhlIFNQIGNyZWF0ZXMgYW5kIG93bnMgYG1hc3RyYV9pbnN0YW5jZWAgKHRoZSBzYW1lXG4gICAgLy8gaW5zdGFuY2UtbGV2ZWwgc2NoZW1hIHRoZSB3b3JrZmxvdy1zbmFwc2hvdCBzdG9yZSB1c2VzKSBhbmQgdGhlIGluZGV4XG4gICAgLy8gbGFuZHMgdGhlcmUuIFRhYmxlIG5hbWVzIGRvbid0IGNvbGxpZGUgd2l0aCB0aGUgc3RvcmFnZSB0YWJsZXMuXG4gICAgc2NoZW1hTmFtZTogXCJtYXN0cmFfaW5zdGFuY2VcIixcbiAgICBob3N0OiBcIi0xXCIsXG4gICAgcG9ydDogLTEsXG4gICAgZGF0YWJhc2U6IFwiX1wiLFxuICAgIHVzZXI6IFwiX1wiLFxuICAgIHBhc3N3b3JkOiBcIl9cIixcbiAgfSk7XG4gIGNvbnN0IHBsYWNlaG9sZGVyID0gdmVjdG9yLnBvb2w7XG4gIHZlY3Rvci5wb29sID0gcG9vbDtcbiAgdm9pZCBwbGFjZWhvbGRlci5lbmQoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gdmVjdG9yO1xufVxuXG4vKiogUGVyLWFnZW50IGRlZGljYXRlZCBgUGdWZWN0b3JgIChyYXJlOyBvcHQtaW4gdmlhIG9iamVjdCBvdmVycmlkZSkuICovXG5mdW5jdGlvbiBidWlsZFBnVmVjdG9yKHNldHRpbmc6IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlKTogUGdWZWN0b3Ige1xuICByZXR1cm4gbmV3IFBnVmVjdG9yKFxuICAgIHdpdGhJZChzZXR0aW5nLCBgcGctdmVjdG9yX18ke2hhc2guaWQoKX1gKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFBnVmVjdG9yPlswXSxcbiAgKTtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGlzIHNldHRpbmcgcmVxdWlyZXMgdGhlIHNoYXJlZCBMYWtlYmFzZSBwb29sLiAqL1xuZnVuY3Rpb24gc2V0dGluZ05lZWRzU2hhcmVkUG9vbChzZXR0aW5nOiBTdG9yYWdlU2V0dGluZyB8IE1lbW9yeVNldHRpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNldHRpbmcgPT09IHRydWU7XG59XG5cbi8qKiBXYWxrIHRoZSB0aHJlZSBzaGFwZXMgb2YgYGNvbmZpZy5hZ2VudHNgIGludG8gYSBmbGF0IGxpc3QuICovXG5mdW5jdGlvbiBjb2xsZWN0QWdlbnREZWZpbml0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltdIHtcbiAgY29uc3QgYWdlbnRzID0gY29uZmlnLmFnZW50cztcbiAgaWYgKCFhZ2VudHMpIHJldHVybiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWdlbnRzKSkgcmV0dXJuIGFnZW50cztcbiAgaWYgKHR5cGVvZiAoYWdlbnRzIGFzIE1hc3RyYUFnZW50RGVmaW5pdGlvbikuaW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFthZ2VudHMgYXMgTWFzdHJhQWdlbnREZWZpbml0aW9uXTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhZ2VudHMgYXMgUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPik7XG59XG5cbi8qKiBGaWxsIGluIGEgZGVmYXVsdCBgaWRgIHdoZW4gdGhlIGNhbGxlciBkaWRuJ3Qgc3VwcGx5IG9uZS4gKi9cbmZ1bmN0aW9uIHdpdGhJZDxUIGV4dGVuZHMgeyBpZD86IHN0cmluZyB9Pih2YWx1ZTogVCwgZmFsbGJhY2s6IHN0cmluZyk6IFQge1xuICByZXR1cm4gdmFsdWUuaWQgPyB2YWx1ZSA6IHsgLi4udmFsdWUsIGlkOiBmYWxsYmFjayB9O1xufVxuIl19
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sSUFBSSxDQUFDO0FBSTNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLGtGQUFrRjtBQUNsRixNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFaEQsMERBQTBEO0FBQzFELFNBQVMsY0FBYztJQUNyQixPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFTLHlCQUF5QixDQUFDLEdBQVk7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMs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O1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3pDLElBQUksT0FBUSxNQUFnQyxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2RSxPQUFPLENBQUMsTUFBK0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBK0MsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxnRUFBZ0U7QUFDaEUsU0FBUyxNQUFNLENBQTRCLEtBQVEsRUFBRSxRQUFnQjtJQUNuRSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UtYmFja2VkIE1hc3RyYSBtZW1vcnkgd2lyaW5nLlxuICpcbiAqIFByb3ZpZGVzIGEge0BsaW5rIE1lbW9yeUJ1aWxkZXJ9IHRoYXQgbWludHMgb25lIGBNZW1vcnlgIHBlciBhZ2VudFxuICogd2l0aCB0d28gaW5kZXBlbmRlbnQga25vYnM6XG4gKlxuICogLSAqKlN0b3JhZ2UqKiAodGhyZWFkcyAvIG1lc3NhZ2VzIHZpYSBgUG9zdGdyZXNTdG9yZWApOiBkZWZhdWx0cyB0b1xuICogICAqKnBlci1hZ2VudCoqIG5hbWVzcGFjaW5nIHZpYSB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gc29cbiAqICAgY29udmVyc2F0aW9uIGhpc3Rvcnkgc3RheXMgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWVcbiAqICAgZGF0YWJhc2UuIGBQb3N0Z3Jlc1N0b3JlYCBhdXRvLWNyZWF0ZXMgdGhlIHNjaGVtYSB3aXRoXG4gKiAgIGBDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFNgIG9uIGluaXQuIEEgZmFpbGVkIG1pZ3JhdGlvbiAoY29tbW9uIG9uXG4gKiAgIExha2ViYXNlIHdoZW4gdGhlIGNvbm5lY3Rpbmcgcm9sZSBpcyBub3QgdGhlIHRhYmxlIG93bmVyKSBpcyBsb2dnZWRcbiAqICAgYW5kIHNraXBwZWQgdmlhIHtAbGluayB3aXRoU29mdFN0b3JhZ2VJbml0fSBzbyBleGlzdGluZyB0YWJsZXMga2VlcFxuICogICBzZXJ2aW5nIGluc3RlYWQgb2YgcmV0cnlpbmcgRERMIG9uIGV2ZXJ5IHJlcXVlc3QuXG4gKiAtICoqTWVtb3J5KiogKHNlbWFudGljIHJlY2FsbCB2aWEgYFBnVmVjdG9yYCk6IGRlZmF1bHRzIHRvIGEgc2luZ2xlXG4gKiAgICoqc2hhcmVkKiogaW5zdGFuY2UgYWNyb3NzIGV2ZXJ5IGFnZW50LiBDcm9zcy1hZ2VudCByZWNhbGwgb24gb25lXG4gKiAgIGluZGV4IGlzIGFsbW9zdCBhbHdheXMgd2hhdCB1c2VycyB3YW50OyBvcHQgaW50byBwZXItYWdlbnQgcmVjYWxsXG4gKiAgIGJ5IHBhc3NpbmcgYSB7QGxpbmsgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGV9IG9uIHRoZSBhZ2VudC5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIHtAbGluayBNZW1vcnlCdWlsZGVyLmluc3RhbmNlU3RvcmFnZX0gcmV0dXJucyBhXG4gKiAqKk1hc3RyYS1pbnN0YW5jZS1sZXZlbCoqIGBQb3N0Z3Jlc1N0b3JlYCAoc2NoZW1hIGBtYXN0cmFfaW5zdGFuY2VgKVxuICogdXNlZCBmb3Igd29ya2Zsb3cgc25hcHNob3RzIC0gdGhlIHBlcnNpc3RlbmNlIGxheWVyXG4gKiBgYWdlbnQucmVzdW1lU3RyZWFtKClgIHJlYWRzIGZyb20gd2hlbiB3YWtpbmcgYSBzdXNwZW5kZWRcbiAqIGByZXF1aXJlQXBwcm92YWxgIHRvb2wgY2FsbC4gUGVyLWFnZW50IHN0b3JlcyBhcmUgbm90IGVub3VnaCBmb3JcbiAqIHRoaXM6IHdvcmtmbG93IHJ1bnMgYXJlIHNjb3BlZCB0byB0aGUgTWFzdHJhIGluc3RhbmNlLCBub3QgYW5cbiAqIGluZGl2aWR1YWwgYWdlbnQncyBgTWVtb3J5YC5cbiAqXG4gKiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5zdG9yYWdlYCAvIGBjb25maWcubWVtb3J5YCBhY3QgYXMgdGhlIGJhc2VsaW5lXG4gKiAoYXV0by1kZWZhdWx0ZWQgdG8gYHRydWVgIGluIGBwbHVnaW4udHNgIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luXG4gKiBpcyByZWdpc3RlcmVkKTsgcGVyLWFnZW50IHNldHRpbmdzIGNhc2NhZGUgb24gdG9wIG9mIHRoYXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yLCBoYXNoLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZmFzdGVtYmVkIH0gZnJvbSBcIkBtYXN0cmEvZmFzdGVtYmVkXCI7XG5pbXBvcnQgeyBNZW1vcnkgfSBmcm9tIFwiQG1hc3RyYS9tZW1vcnlcIjtcbmltcG9ydCB7IFBnVmVjdG9yLCBQb3N0Z3Jlc1N0b3JlIH0gZnJvbSBcIkBtYXN0cmEvcGdcIjtcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lIH0gZnJvbSBcIi4vc3RvcmFnZS1zY2hlbWEudHNcIjtcbmltcG9ydCB7IHN1bW1hcnlNb2RlbCwgVElUTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWVtb3J5XCIpO1xuXG4vKiogUHJvY2Vzcy13aWRlIGRlZHVwZSBzbyBpbnN0YW5jZSArIHBlci1hZ2VudCBzdG9yZXMgc2hhcmUgb25lIG93bmVyc2hpcCBsb2cuICovXG5jb25zdCBsb2dnZWRNaWdyYXRpb25FcnJvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqIFdoZXRoZXIgYExPR19MRVZFTGAgaXMgY3VycmVudGx5IGF0IG9yIGJlbG93IGRlYnVnLiAqL1xuZnVuY3Rpb24gaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBsb2cuaXNMZXZlbEVuYWJsZWQoXCJkZWJ1Z1wiKTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtaWdyYXRpb24gZmFpbGVkIG9ubHkgYmVjYXVzZSB0aGlzIHJvbGUgZG9lcyBub3Qgb3duIGFuIGV4aXN0aW5nIG9iamVjdC4gKi9cbmZ1bmN0aW9uIGlzT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvci5lcnJvckNvbnRleHQoZXJyKS5oYXNNZXNzYWdlKFwibXVzdCBiZSBvd25lclwiKTtcbn1cblxuLyoqXG4gKiBTb2Z0ZW4ge0BsaW5rIFBvc3RncmVzU3RvcmUuaW5pdH0gc28gYSBmYWlsZWQgbWlncmF0aW9uIChlLmcuIExha2ViYXNlXG4gKiBgbXVzdCBiZSBvd25lciBvZiB0YWJsZSDigKZgIG9uIGBBTFRFUmApIGlzIGxvZ2dlZCBvbmNlIGluc3RlYWQgb2YgcmV0aHJvd25cbiAqIG9uIGV2ZXJ5IHN0b3JhZ2UgY2FsbC5cbiAqXG4gKiBNYXN0cmEncyBgYXVnbWVudFdpdGhJbml0YCByZXRyaWVzIGluaXQgZm9yZXZlciB3aGVuIGl0IHRocm93cywgc28gdGhlXG4gKiBvbmx5IHdheSB0byBrZWVwIHNlcnZpbmcgYWdhaW5zdCBhbiBhbHJlYWR5LXVzYWJsZSBzY2hlbWEgaXMgdG8gdHJlYXRcbiAqIG1pZ3JhdGlvbiBmYWlsdXJlIGFzIHN1Y2Nlc3MgYW5kIG1hcmsgdGhlIHN0b3JlIGluaXRpYWxpemVkLlxuICpcbiAqIENvbmN1cnJlbnQgZmlyc3QgY2FsbGVycyBzaGFyZSBvbmUgc29mdCBhdHRlbXB0LiBOb24tb3duZXJzaGlwIGZhaWx1cmVzIHN0YXlcbiAqIGZhdGFsIHNvIG1pc3Npbmcgc2NoZW1hcy90YWJsZXMgYXJlIHJldHJpZWQgb3Igc3VyZmFjZWQgaW5zdGVhZCBvZiBoaWRkZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU29mdFN0b3JhZ2VJbml0KHN0b3JlOiBQb3N0Z3Jlc1N0b3JlKTogUG9zdGdyZXNTdG9yZSB7XG4gIGNvbnN0IHNvZnQgPSBzdG9yZSBhcyB1bmtub3duIGFzIHtcbiAgICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc2NoZW1hPzogc3RyaW5nO1xuICAgIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIH07XG4gIGNvbnN0IG9yaWdpbmFsSW5pdCA9IHNvZnQuaW5pdC5iaW5kKHNvZnQpO1xuICBsZXQgc29mdEluaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIHNvZnQuaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc29mdC5pc0luaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ2luYWxJbml0KCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVycikpIHRocm93IGVycjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICBpZiAoIWxvZ2dlZE1pZ3JhdGlvbkVycm9ycy5oYXMobWVzc2FnZSkpIHtcbiAgICAgICAgICBsb2dnZWRNaWdyYXRpb25FcnJvcnMuYWRkKG1lc3NhZ2UpO1xuICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJtYXN0cmEgc3RvcmFnZSBtaWdyYXRpb24gZmFpbGVkXCIsIGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwibWFzdHJhIHN0b3JhZ2UgbWlncmF0aW9uIGZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgIGVycm9yOiBtZXNzYWdlLFxuICAgICAgICAgICAgICBzdG9yZUlkOiBzb2Z0LmlkLFxuICAgICAgICAgICAgICBzY2hlbWE6IHNvZnQuc2NoZW1hLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc29mdEluaXRQcm9taXNlO1xuICAgICAgc29mdC5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNvZnRJbml0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG4gIHJldHVybiBzdG9yZTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGRlZGljYXRlZCAqKnNlcnZpY2UtcHJpbmNpcGFsKiogTGFrZWJhc2UgcG9vbCBmb3IgTWFzdHJhXG4gKiBtZW1vcnkgZnJvbSB0aGUgbGFrZWJhc2UgcGx1Z2luJ3MgcmVzb2x2ZWQgU1AgcGcgY29uZmlnLlxuICpcbiAqIFRoZSBwbHVnaW4ncyBgZXhwb3J0cygpLnBvb2xgIGlzIGEgYFJvdXRpbmdQb29sYCB0aGF0IHN3aXRjaGVzIHRvXG4gKiB0aGUgcGVyLXVzZXIgKE9CTykgcG9vbCB3aGVuZXZlciBhIHF1ZXJ5IHJ1bnMgaW5zaWRlIGFuIGBhc1VzZXJgXG4gKiBzY29wZSAtIGV4YWN0bHkgdGhlIGNvbnRleHQgdGhlIG1hc3RyYSBwbHVnaW4gZXN0YWJsaXNoZXMgYXJvdW5kXG4gKiBldmVyeSBjaGF0IHR1cm4uIE1lbW9yeSAodGhyZWFkcyAvIG1lc3NhZ2VzICsgc2VtYW50aWMgcmVjYWxsKSBtdXN0XG4gKiBpbnN0ZWFkIGFsd2F5cyBhY3QgYXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbDogaXQgb3ducyB0aGVcbiAqIGF1dG8tY3JlYXRlZCBgbWFzdHJhXypgIHNjaGVtYXMgKGEgcGVyLXVzZXIgcm9sZSB1c3VhbGx5IGNhbid0XG4gKiBgQ1JFQVRFIFNDSEVNQWApIGFuZCBpcyBzaGFyZWQgYWNyb3NzIHVzZXJzLCBzbyBpdCBjYW5ub3QgaW5oZXJpdCBhXG4gKiByZXF1ZXN0J3MgT0JPIGlkZW50aXR5LlxuICpcbiAqIGBwZ0NvbmZpZ2AgbXVzdCBiZSB0aGUgcGx1Z2luJ3MgYGV4cG9ydHMoKS5nZXRQZ0NvbmZpZygpYCBldmFsdWF0ZWRcbiAqICoqb3V0c2lkZSoqIGFueSBgYXNVc2VyYCBzY29wZSAoaS5lLiBkdXJpbmcgc2V0dXApLCBzbyBpdCBjYXJyaWVzXG4gKiB0aGUgU1AgY29ubmVjdGlvbiB0YXJnZXQsIE9BdXRoIHRva2VuLXJlZnJlc2ggYHBhc3N3b3JkYCBjYWxsYmFjayxcbiAqIGFuZCBhbnkgYGxha2ViYXNlKHsgcG9vbCB9KWAgdHVuaW5nIG92ZXJyaWRlcyAtIGFsbCBvZiB3aGljaCB0aGlzXG4gKiBwb29sIGluaGVyaXRzLiBTZWUgdGhlIGNhbGwgc2l0ZSBpbiBgcGx1Z2luLnRzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VQcmluY2lwYWxQb29sKHBnQ29uZmlnOiBQb29sQ29uZmlnKTogUHJvbWlzZTxQb29sPiB7XG4gIC8vIGBnZXRQZ0NvbmZpZygpYCByZXNvbHZlcyB0aGUgU1AgdXNlcm5hbWUgc3luY2hyb25vdXNseSBmcm9tXG4gIC8vIGBQR1VTRVJgIC8gYERBVEFCUklDS1NfQ0xJRU5UX0lEYDsgZmFsbCBiYWNrIHRvIHRoZSBhc3luYyBBUElcbiAgLy8gbG9va3VwIChlLmcuIGxvY2FsIGRldiBhdXRoZW50aWNhdGluZyB2aWEgUEFUKSBzbyB0aGUgcG9vbCBhbHdheXNcbiAgLy8gaGFzIGFuIGlkZW50aXR5IHRvIGNvbm5lY3Qgd2l0aC5cbiAgY29uc3QgdXNlciA9IHBnQ29uZmlnLnVzZXIgPz8gKGF3YWl0IGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCgpKTtcbiAgcmV0dXJuIG5ldyBQb29sKHsgLi4ucGdDb25maWcsIHVzZXIgfSk7XG59XG5cbi8qKiBFZmZlY3RpdmUgcGVyLWtub2Igc2V0dGluZyBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuICovXG50eXBlIFN0b3JhZ2VTZXR0aW5nID0gTWFzdHJhQWdlbnREZWZpbml0aW9uW1wic3RvcmFnZVwiXTtcbnR5cGUgTWVtb3J5U2V0dGluZyA9IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1lbW9yeVwiXTtcblxuLyoqXG4gKiBUcnVlIHdoZW4gYW55IHBsdWdpbi1sZXZlbCBvciBwZXItYWdlbnQgc2V0dGluZyBjb3VsZCBuZWVkIHRoZVxuICogTGFrZWJhc2UgcG9vbC4gVXNlZCBieSBgcGx1Z2luLnRzYCB0byBnYXRlIGNyZWF0aW9uIG9mIHRoZVxuICogc2VydmljZS1wcmluY2lwYWwgcG9vbCBhbmQgdGhlIHtAbGluayBNZW1vcnlCdWlsZGVyfSB0aGF0IGNvbnN1bWVzXG4gKiBpdDsgd2hlbiBmYWxzZSBuZWl0aGVyIGlzIGJ1aWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNMYWtlYmFzZShjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoc2V0dGluZ05lZWRzU2hhcmVkUG9vbChjb25maWcuc3RvcmFnZSkpIHJldHVybiB0cnVlO1xuICBpZiAoc2V0dGluZ05lZWRzU2hhcmVkUG9vbChjb25maWcubWVtb3J5KSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGRlZnMgPSBjb2xsZWN0QWdlbnREZWZpbml0aW9ucyhjb25maWcpO1xuICByZXR1cm4gZGVmcy5zb21lKChkKSA9PiBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGQuc3RvcmFnZSkgfHwgc2V0dGluZ05lZWRzU2hhcmVkUG9vbChkLm1lbW9yeSkpO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHBlci1hZ2VudCB7QGxpbmsgTWVtb3J5fSBmYWN0b3J5IGJvdW5kIHRvIHRoZSBzdXBwbGllZFxuICogc2VydmljZS1wcmluY2lwYWwgcG9vbCAoc2VlIHtAbGluayBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbH0pLlxuICogQ2FjaGVzIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCBzaW5nbGV0b24gKGJ1aWx0IG9uIGZpcnN0IG5lZWQpIHNvIGVhY2hcbiAqIGFnZW50IGJ1aWxkIGlzIE8oMSkgYWZ0ZXIgdGhlIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtb3J5QnVpbGRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHNlcnZpY2VQcmluY2lwYWxQb29sOiBQb29sLFxuKTogTWVtb3J5QnVpbGRlciB7XG4gIHJldHVybiBuZXcgTWVtb3J5QnVpbGRlcihjb25maWcsIHNlcnZpY2VQcmluY2lwYWxQb29sKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIGBNZW1vcnlgIHBlciBhZ2VudCBhZ2FpbnN0IGEgc2hhcmVkIHNlcnZpY2UtcHJpbmNpcGFsXG4gKiBMYWtlYmFzZSBwb29sLiBQZXItaW5zdGFuY2Ugc3RhdGUga2VlcHMgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIGFsaXZlXG4gKiBhY3Jvc3MgY2FsbHMgc28gcmVnaXN0ZXJpbmcgTiBhZ2VudHMgc3RheXMgY2hlYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnlCdWlsZGVyIHtcbiAgcHJpdmF0ZSBzaGFyZWRWZWN0b3I6IFBnVmVjdG9yIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlUHJpbmNpcGFsUG9vbDogUG9vbCxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2UgdXNlZCBmb3Igd29ya2Zsb3dcbiAgICogc25hcHNob3RzLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gcGx1Z2luLWxldmVsIGBzdG9yYWdlYCBpc1xuICAgKiBkaXNhYmxlZCwgaW4gd2hpY2ggY2FzZSBgYWdlbnQucmVzdW1lU3RyZWFtKClgIChhbmQgdGhlcmVmb3JlXG4gICAqIHRoZSBgcmVxdWlyZUFwcHJvdmFsYCBmbG93KSB3aWxsIG5vdCBiZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIFRoZSBzdG9yZSBsaXZlcyBpbiBhIGRlZGljYXRlZCBgbWFzdHJhX2luc3RhbmNlYCBzY2hlbWEgc28gaXRcbiAgICogbmV2ZXIgY29sbGlkZXMgd2l0aCBwZXItYWdlbnQge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IG5hbWVzcGFjZXMuXG4gICAqIFdvcmtmbG93IHNuYXBzaG90cyBhcmUgbm90IHBlci1hZ2VudCBzdGF0ZTsgdGhleSBiZWxvbmcgdG8gdGhlXG4gICAqIGBNYXN0cmFgIGluc3RhbmNlIHRoYXQgb3ducyB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgKi9cbiAgaW5zdGFuY2VTdG9yYWdlKCk6IFBvc3RncmVzU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLmNvbmZpZy5zdG9yYWdlO1xuICAgIGlmICghc2V0dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHNldHRpbmcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgICBuZXcgUG9zdGdyZXNTdG9yZShcbiAgICAgICAgICB3aXRoSWQoc2V0dGluZywgXCJtYXN0cmEtc3RvcmVfX2luc3RhbmNlXCIpIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczxcbiAgICAgICAgICAgIHR5cGVvZiBQb3N0Z3Jlc1N0b3JlXG4gICAgICAgICAgPlswXSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoe1xuICAgICAgICBpZDogXCJtYXN0cmEtc3RvcmVfX2luc3RhbmNlXCIsXG4gICAgICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgICAgIHBvb2w6IHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYE1lbW9yeWAgZm9yIGBhZ2VudElkYCBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgYWdlbnQgaGFzIG5laXRoZXIgc3RvcmFnZSBub3IgYVxuICAgKiB2ZWN0b3Igc3RvcmUgZW5hYmxlZCAtIE1hc3RyYSBhY2NlcHRzIGEgbWlzc2luZyBgbWVtb3J5YCBmaWVsZFxuICAgKiBhbmQgdHJlYXRzIHRoZSBhZ2VudCBhcyBzdGF0ZWxlc3MuXG4gICAqL1xuICBmb3JBZ2VudChhZ2VudElkOiBzdHJpbmcsIGRlZjogTWFzdHJhQWdlbnREZWZpbml0aW9uKTogTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdG9yYWdlU2V0dGluZyA9IGRlZi5zdG9yYWdlID8/IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgY29uc3QgbWVtb3J5U2V0dGluZyA9IGRlZi5tZW1vcnkgPz8gdGhpcy5jb25maWcubWVtb3J5O1xuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYnVpbGRTdG9yYWdlKGFnZW50SWQsIHN0b3JhZ2VTZXR0aW5nKTtcbiAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLmJ1aWxkVmVjdG9yKG1lbW9yeVNldHRpbmcpO1xuICAgIGlmICghc3RvcmFnZSAmJiAhdmVjdG9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpzdGF0ZWxlc3NcIiwgeyBhZ2VudElkIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpjb25maWd1cmVkXCIsIHtcbiAgICAgIGFnZW50SWQsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlICE9PSB1bmRlZmluZWQsXG4gICAgICB2ZWN0b3I6IHZlY3RvciAhPT0gdW5kZWZpbmVkLFxuICAgICAgdmVjdG9yTW9kZTpcbiAgICAgICAgdmVjdG9yID09PSB1bmRlZmluZWQgPyBcIm9mZlwiIDogdHlwZW9mIG1lbW9yeVNldHRpbmcgPT09IFwib2JqZWN0XCIgPyBcImRlZGljYXRlZFwiIDogXCJzaGFyZWRcIixcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgTWVtb3J5KHtcbiAgICAgIC4uLihzdG9yYWdlID8geyBzdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4odmVjdG9yID8geyB2ZWN0b3IsIGVtYmVkZGVyOiBmYXN0ZW1iZWQgfSA6IHt9KSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgbGFzdE1lc3NhZ2VzOiAxMCxcbiAgICAgICAgLi4uKHZlY3RvciA/IHsgc2VtYW50aWNSZWNhbGw6IHsgdG9wSzogMywgbWVzc2FnZVJhbmdlOiAyIH0gfSA6IHt9KSxcbiAgICAgICAgLy8gQXV0by1uYW1lIGVhY2ggdGhyZWFkIGZyb20gaXRzIG9wZW5pbmcgdHVybiBzbyB0aGVcbiAgICAgICAgLy8gY29udmVyc2F0aW9uIGxpc3QgdGhlIFVJIHJlbmRlcnMgc2hvd3MgbWVhbmluZ2Z1bCB0aXRsZXNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiByYXcgaWRzLiBUaXRsaW5nIHJ1bnMgb24gdGhlIHNtYWxsIC8gZmFzdCBjaGF0XG4gICAgICAgIC8vIHRpZXIgKHNlZSBgc3VtbWFyaXplLnRzYCkgcmF0aGVyIHRoYW4gdGhlIGFnZW50J3MgcHJpbWFyeVxuICAgICAgICAvLyBtb2RlbCwgc28gbmFtaW5nIGEgdGhyZWFkIG5ldmVyIHNwZW5kcyB0aGUgaGVhdnl3ZWlnaHQgbW9kZWwuXG4gICAgICAgIC8vIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIHN0b3JhZ2UgaXMgb247IGhhcm1sZXNzIG90aGVyd2lzZS5cbiAgICAgICAgLi4uKHN0b3JhZ2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZ2VuZXJhdGVUaXRsZToge1xuICAgICAgICAgICAgICAgIG1vZGVsOiBzdW1tYXJ5TW9kZWwodGhpcy5jb25maWcpLFxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uczogVElUTEVfSU5TVFJVQ1RJT05TLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdG9yYWdlKGFnZW50SWQ6IHN0cmluZywgc2V0dGluZzogU3RvcmFnZVNldHRpbmcpOiBQb3N0Z3Jlc1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNldHRpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKHtcbiAgICAgICAgICBpZDogYG1hc3RyYS1zdG9yZV9fJHthZ2VudElkfWAsXG4gICAgICAgICAgc2NoZW1hTmFtZTogYWdlbnRTdG9yYWdlU2NoZW1hTmFtZShhZ2VudElkKSxcbiAgICAgICAgICBwb29sOiB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIENhc3Q6IGB3aXRoSWRgIGd1YXJhbnRlZXMgYGlkYCBpcyBzZXQsIGJ1dCB0aGUgZGlzdHJpYnV0aXZlXG4gICAgLy8gT21pdCArIGBpZD86IHN0cmluZ2Agc2hhcGUgZG9lc24ndCBzdHJ1Y3R1cmFsbHkgbmFycm93IHRvIHRoZVxuICAgIC8vIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWVtYmVycy4gUnVudGltZSBzaGFwZSBpcyBpZGVudGljYWwuXG4gICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICBuZXcgUG9zdGdyZXNTdG9yZShcbiAgICAgICAgd2l0aElkKHNldHRpbmcsIGBtYXN0cmEtc3RvcmVfXyR7YWdlbnRJZH1gKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8XG4gICAgICAgICAgdHlwZW9mIFBvc3RncmVzU3RvcmVcbiAgICAgICAgPlswXSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBhZ2VudCdzIHZlY3RvciBzdG9yZS4gQ2FzY2FkZTpcbiAgICpcbiAgICogLSBmYWxzeTogbm8gdmVjdG9yLlxuICAgKiAtIGBib29sZWFuYCAvIGB1bmRlZmluZWQtaW5oZXJpdGluZy10cnVlYDogcmV0dXJuIHRoZSBzaGFyZWRcbiAgICogICBzaW5nbGV0b24gKGJ1aWx0IGxhemlseSBvbiBmaXJzdCBjYWxsKS4gQWxsIGFnZW50cyB0aGF0XG4gICAqICAgZGVmYXVsdC1lbmFibGUgbWVtb3J5IHdyaXRlIGludG8gYW5kIHJlY2FsbCBmcm9tIG9uZSBpbmRleC5cbiAgICogLSBvYmplY3Q6IGJ1aWxkIGEgZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgZm9yIHRoaXMgYWdlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVmVjdG9yKHNldHRpbmc6IE1lbW9yeVNldHRpbmcpOiBQZ1ZlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0aGlzLmdldFNoYXJlZFZlY3RvcigpO1xuICAgIHJldHVybiBidWlsZFBnVmVjdG9yKHNldHRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGFyZWRWZWN0b3IoKTogUGdWZWN0b3Ige1xuICAgIGlmICghdGhpcy5zaGFyZWRWZWN0b3IpIHtcbiAgICAgIHRoaXMuc2hhcmVkVmVjdG9yID0gYnVpbGRTaGFyZWRQZ1ZlY3Rvcih0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVmVjdG9yO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHRoYXQgYmFja3MgdGhlIGRlZmF1bHRcbiAqIGBkZWYubWVtb3J5ID09PSB0cnVlYCBjYXNlIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqXG4gKiBgUGdWZWN0b3JgJ3MgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGNvbm5lY3Rpb24tc3R5bGUgY29uZmlnc1xuICogKGBIb3N0Q29uZmlnYCAvIGBDb25uZWN0aW9uU3RyaW5nQ29uZmlnYCAvIGBDbGllbnRDb25maWdgKTsgdGhlcmUgaXNcbiAqIG5vIGB7IHBvb2wgfWAgc2hvcnRoYW5kIHRoZSB3YXkgYFBvc3RncmVzU3RvcmVgIGhhcyBvbmUuIFdvcnNlLCB0aGVcbiAqIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkga2lja3Mgb2ZmIGEgYGNhY2hlV2FybXVwUHJvbWlzZWAgSUlGRSB0aGF0XG4gKiBjYWxscyBgdGhpcy5wb29sLmNvbm5lY3QoKWAgYmVmb3JlIHJldHVybmluZywgc28gd2UgY2FuJ3QgY2xlYW5seVxuICogaGFuZCBpdCBhbiBpbmVydCBjb25maWcgYW5kIHBhdGNoIHRoZSBwb29sIGFmdGVyd2FyZHMuXG4gKlxuICogVGhlIHRyaWNrOiBwYXNzIGlsbGVnYWwtYnV0LXZhbGlkYXRpb24tcGFzc2luZyBwbGFjZWhvbGRlcnMgc28gdGhlXG4gKiB3YXJtdXAncyBgbmV0LmNvbm5lY3QoKWAgcmVqZWN0cyBzeW5jaHJvbm91c2x5IHdpdGggYFJhbmdlRXJyb3JgXG4gKiAoTm9kZSB2YWxpZGF0ZXMgYDAgPD0gcG9ydCA8IDY1NTM2YCkuIFRoZSBJSUZFJ3MgYGNhdGNoIHt9YCBzd2FsbG93c1xuICogaXQsIG5vIEROUyBsb29rdXAgb3IgVENQIGF0dGVtcHQgaGFwcGVucywgYW5kIHdlIHRoZW4gc3dhcFxuICogYHBnVmVjdG9yLnBvb2xgIHRvIHRoZSBsYWtlYmFzZSBwb29sLiBFdmVyeSBzdWJzZXF1ZW50IGBQZ1ZlY3RvcmBcbiAqIG1ldGhvZCByZWFkcyBgdGhpcy5wb29sYCBhdCBjYWxsIHRpbWUsIHNvIGFsbCByZWFsIEkvTyBnb2VzIHRocm91Z2hcbiAqIHRoZSBsYWtlYmFzZSBwb29sIGZyb20gdGhlbiBvbi4gVGhlIHBsYWNlaG9sZGVyIHBvb2wgaXMgYC5lbmQoKWAnZFxuICogc28gaXRzIHNvY2tldCBib29rLWtlZXBpbmcgaXMgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2hhcmVkUGdWZWN0b3IocG9vbDogUG9vbCk6IFBnVmVjdG9yIHtcbiAgY29uc3QgdmVjdG9yID0gbmV3IFBnVmVjdG9yKHtcbiAgICBpZDogYHBnJHtoYXNoLmlkKCl9YCxcbiAgICAvLyBLZWVwIHRoZSByZWNhbGwgaW5kZXggb3V0IG9mIGBwdWJsaWNgOiBvbiBhIExha2ViYXNlIGRhdGFiYXNlIHRoZSBhcHBcbiAgICAvLyBzZXJ2aWNlIHByaW5jaXBhbCBoYXMgbm8gQ1JFQVRFIG9uIGBwdWJsaWNgIChQRzE1KyBsb2NrcyBpdCBkb3duKSwgc28gYVxuICAgIC8vIGRlZmF1bHQtc2NoZW1hIFBnVmVjdG9yIGZhaWxzIG9uIENSRUFURSBJTkRFWCB3aXRoIFwicGVybWlzc2lvbiBkZW5pZWQgZm9yXG4gICAgLy8gc2NoZW1hIHB1YmxpY1wiLiBQZ1ZlY3RvciBydW5zIENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyBmb3IgYSBuYW1lZFxuICAgIC8vIHNjaGVtYSwgc28gdGhlIFNQIGNyZWF0ZXMgYW5kIG93bnMgYG1hc3RyYV9pbnN0YW5jZWAgKHRoZSBzYW1lXG4gICAgLy8gaW5zdGFuY2UtbGV2ZWwgc2NoZW1hIHRoZSB3b3JrZmxvdy1zbmFwc2hvdCBzdG9yZSB1c2VzKSBhbmQgdGhlIGluZGV4XG4gICAgLy8gbGFuZHMgdGhlcmUuIFRhYmxlIG5hbWVzIGRvbid0IGNvbGxpZGUgd2l0aCB0aGUgc3RvcmFnZSB0YWJsZXMuXG4gICAgc2NoZW1hTmFtZTogXCJtYXN0cmFfaW5zdGFuY2VcIixcbiAgICBob3N0OiBcIi0xXCIsXG4gICAgcG9ydDogLTEsXG4gICAgZGF0YWJhc2U6IFwiX1wiLFxuICAgIHVzZXI6IFwiX1wiLFxuICAgIHBhc3N3b3JkOiBcIl9cIixcbiAgfSk7XG4gIGNvbnN0IHBsYWNlaG9sZGVyID0gdmVjdG9yLnBvb2w7XG4gIHZlY3Rvci5wb29sID0gcG9vbDtcbiAgdm9pZCBwbGFjZWhvbGRlci5lbmQoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gdmVjdG9yO1xufVxuXG4vKiogUGVyLWFnZW50IGRlZGljYXRlZCBgUGdWZWN0b3JgIChyYXJlOyBvcHQtaW4gdmlhIG9iamVjdCBvdmVycmlkZSkuICovXG5mdW5jdGlvbiBidWlsZFBnVmVjdG9yKHNldHRpbmc6IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlKTogUGdWZWN0b3Ige1xuICByZXR1cm4gbmV3IFBnVmVjdG9yKFxuICAgIHdpdGhJZChzZXR0aW5nLCBgcGctdmVjdG9yX18ke2hhc2guaWQoKX1gKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFBnVmVjdG9yPlswXSxcbiAgKTtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGlzIHNldHRpbmcgcmVxdWlyZXMgdGhlIHNoYXJlZCBMYWtlYmFzZSBwb29sLiAqL1xuZnVuY3Rpb24gc2V0dGluZ05lZWRzU2hhcmVkUG9vbChzZXR0aW5nOiBTdG9yYWdlU2V0dGluZyB8IE1lbW9yeVNldHRpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNldHRpbmcgPT09IHRydWU7XG59XG5cbi8qKiBXYWxrIHRoZSB0aHJlZSBzaGFwZXMgb2YgYGNvbmZpZy5hZ2VudHNgIGludG8gYSBmbGF0IGxpc3QuICovXG5mdW5jdGlvbiBjb2xsZWN0QWdlbnREZWZpbml0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltdIHtcbiAgY29uc3QgYWdlbnRzID0gY29uZmlnLmFnZW50cztcbiAgaWYgKCFhZ2VudHMpIHJldHVybiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWdlbnRzKSkgcmV0dXJuIGFnZW50cztcbiAgaWYgKHR5cGVvZiAoYWdlbnRzIGFzIE1hc3RyYUFnZW50RGVmaW5pdGlvbikuaW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFthZ2VudHMgYXMgTWFzdHJhQWdlbnREZWZpbml0aW9uXTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhhZ2VudHMgYXMgUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPik7XG59XG5cbi8qKiBGaWxsIGluIGEgZGVmYXVsdCBgaWRgIHdoZW4gdGhlIGNhbGxlciBkaWRuJ3Qgc3VwcGx5IG9uZS4gKi9cbmZ1bmN0aW9uIHdpdGhJZDxUIGV4dGVuZHMgeyBpZD86IHN0cmluZyB9Pih2YWx1ZTogVCwgZmFsbGJhY2s6IHN0cmluZyk6IFQge1xuICByZXR1cm4gdmFsdWUuaWQgPyB2YWx1ZSA6IHsgLi4udmFsdWUsIGlkOiBmYWxsYmFjayB9O1xufVxuIl19
package/package.json CHANGED
@@ -31,18 +31,18 @@
31
31
  "dependencies": {
32
32
  "@databricks/appkit": "^0.43.0",
33
33
  "@databricks/sdk-experimental": "^0.17.0",
34
- "@dbx-tools/appkit": "0.6.72",
35
- "@dbx-tools/core": "0.6.72",
36
- "@dbx-tools/databricks": "0.6.72",
37
- "@dbx-tools/fs": "0.6.72",
38
- "@dbx-tools/genie": "0.6.72",
39
- "@dbx-tools/model": "0.6.72",
40
- "@dbx-tools/path": "0.6.72",
41
- "@dbx-tools/shared-core": "0.6.72",
42
- "@dbx-tools/shared-fs": "0.6.72",
43
- "@dbx-tools/shared-genie": "0.6.72",
44
- "@dbx-tools/shared-mastra": "0.6.72",
45
- "@dbx-tools/shared-model": "0.6.72",
34
+ "@dbx-tools/appkit": "0.6.73",
35
+ "@dbx-tools/core": "0.6.73",
36
+ "@dbx-tools/databricks": "0.6.73",
37
+ "@dbx-tools/fs": "0.6.73",
38
+ "@dbx-tools/genie": "0.6.73",
39
+ "@dbx-tools/model": "0.6.73",
40
+ "@dbx-tools/path": "0.6.73",
41
+ "@dbx-tools/shared-core": "0.6.73",
42
+ "@dbx-tools/shared-fs": "0.6.73",
43
+ "@dbx-tools/shared-genie": "0.6.73",
44
+ "@dbx-tools/shared-mastra": "0.6.73",
45
+ "@dbx-tools/shared-model": "0.6.73",
46
46
  "@mastra/ai-sdk": "^1.6.0",
47
47
  "@mastra/core": "^1.47.0",
48
48
  "@mastra/express": "^1.4.2",
@@ -71,7 +71,7 @@
71
71
  "./package.json": "./package.json"
72
72
  }
73
73
  },
74
- "version": "0.6.72",
74
+ "version": "0.6.73",
75
75
  "types": "./lib/index.d.ts",
76
76
  "type": "module",
77
77
  "exports": {
package/src/history.ts CHANGED
@@ -45,7 +45,7 @@ const MAX_PER_PAGE = 200;
45
45
  export interface LoadHistoryOptions {
46
46
  agent: Agent;
47
47
  threadId: string;
48
- resourceId?: string;
48
+ resourceId: string;
49
49
  page?: number;
50
50
  perPage?: number;
51
51
  /** When true, returns the *oldest* page first (chronological). */
@@ -81,7 +81,7 @@ export async function loadHistory(opts: LoadHistoryOptions): Promise<MastraHisto
81
81
  const startedAt = Date.now();
82
82
  const result = await memory.recall({
83
83
  threadId: opts.threadId,
84
- ...(opts.resourceId ? { resourceId: opts.resourceId } : {}),
84
+ resourceId: opts.resourceId,
85
85
  page,
86
86
  perPage,
87
87
  orderBy: {
@@ -114,6 +114,7 @@ export async function loadHistory(opts: LoadHistoryOptions): Promise<MastraHisto
114
114
  export interface ClearHistoryOptions {
115
115
  agent: Agent;
116
116
  threadId: string;
117
+ resourceId: string;
117
118
  }
118
119
 
119
120
  /**
@@ -135,6 +136,15 @@ export async function clearHistory(opts: ClearHistoryOptions): Promise<{ cleared
135
136
  logger.debug("clear:no-memory", { agentId: opts.agent.id, threadId: opts.threadId });
136
137
  return { cleared: 0 };
137
138
  }
139
+ const existing = await memory.getThreadById({ threadId: opts.threadId });
140
+ if (!existing || existing.resourceId !== opts.resourceId) {
141
+ logger.debug("clear:not-owned", {
142
+ agentId: opts.agent.id,
143
+ threadId: opts.threadId,
144
+ found: existing !== null,
145
+ });
146
+ return { cleared: 0 };
147
+ }
138
148
  // Mastra's `deleteThread` cascades to the message table, so we
139
149
  // can't ask for a count after the fact. Read it pre-delete with a
140
150
  // one-page recall sized to fit common threads in a single round
@@ -143,6 +153,7 @@ export async function clearHistory(opts: ClearHistoryOptions): Promise<{ cleared
143
153
  try {
144
154
  const probe = await memory.recall({
145
155
  threadId: opts.threadId,
156
+ resourceId: opts.resourceId,
146
157
  page: 0,
147
158
  perPage: 1,
148
159
  });
@@ -158,19 +169,7 @@ export async function clearHistory(opts: ClearHistoryOptions): Promise<{ cleared
158
169
  }
159
170
 
160
171
  const startedAt = Date.now();
161
- try {
162
- await memory.deleteThread(opts.threadId);
163
- } catch (err) {
164
- // Mastra's `deleteThread` raises when the thread row was never
165
- // created (e.g. clearing an empty session). Surface as a soft
166
- // warn and treat as success - the user-facing semantic is
167
- // "history is now empty" which is already true.
168
- logger.warn("clear:delete-soft-failed", {
169
- agentId: opts.agent.id,
170
- threadId: opts.threadId,
171
- error: error.errorMessage(err),
172
- });
173
- }
172
+ await memory.deleteThread(opts.threadId);
174
173
  logger.info("clear:done", {
175
174
  agentId: opts.agent.id,
176
175
  threadId: opts.threadId,
@@ -238,6 +237,11 @@ export function historyRoute(options: HistoryRouteOptions) {
238
237
  } as const;
239
238
  }
240
239
  const resourceId = requestContext.get(MASTRA_RESOURCE_ID_KEY) as string | undefined;
240
+ if (!resourceId) {
241
+ return {
242
+ error: c.json({ error: "resource id missing from request context" }, 400),
243
+ } as const;
244
+ }
241
245
  return { agentId, agent, threadId, resourceId } as const;
242
246
  };
243
247
 
@@ -250,7 +254,7 @@ export function historyRoute(options: HistoryRouteOptions) {
250
254
  const payload = await loadHistory({
251
255
  agent: ctx.agent,
252
256
  threadId: ctx.threadId,
253
- ...(ctx.resourceId ? { resourceId: ctx.resourceId } : {}),
257
+ resourceId: ctx.resourceId,
254
258
  page: parseIntParam(c.req.query("page")),
255
259
  perPage: parseIntParam(c.req.query("perPage")),
256
260
  });
@@ -265,6 +269,7 @@ export function historyRoute(options: HistoryRouteOptions) {
265
269
  const { cleared } = await clearHistory({
266
270
  agent: ctx.agent,
267
271
  threadId: ctx.threadId,
272
+ resourceId: ctx.resourceId,
268
273
  });
269
274
  const payload: MastraClearHistoryResponse = {
270
275
  ok: true,
package/src/memory.ts CHANGED
@@ -54,6 +54,11 @@ function isDebugEnabled(): boolean {
54
54
  return log.isLevelEnabled("debug");
55
55
  }
56
56
 
57
+ /** Whether a migration failed only because this role does not own an existing object. */
58
+ function isOwnershipMigrationError(err: unknown): boolean {
59
+ return error.errorContext(err).hasMessage("must be owner");
60
+ }
61
+
57
62
  /**
58
63
  * Soften {@link PostgresStore.init} so a failed migration (e.g. Lakebase
59
64
  * `must be owner of table …` on `ALTER`) is logged once instead of rethrown
@@ -63,8 +68,8 @@ function isDebugEnabled(): boolean {
63
68
  * only way to keep serving against an already-usable schema is to treat
64
69
  * migration failure as success and mark the store initialized.
65
70
  *
66
- * Concurrent first callers share one soft attempt; `isInitialized` is set
67
- * before the soft promise settles so later callers skip DDL entirely.
71
+ * Concurrent first callers share one soft attempt. Non-ownership failures stay
72
+ * fatal so missing schemas/tables are retried or surfaced instead of hidden.
68
73
  */
69
74
  export function withSoftStorageInit(store: PostgresStore): PostgresStore {
70
75
  const soft = store as unknown as {
@@ -82,10 +87,7 @@ export function withSoftStorageInit(store: PostgresStore): PostgresStore {
82
87
  try {
83
88
  await originalInit();
84
89
  } catch (err) {
85
- // Mark success-for-serving before logging so a racing caller that
86
- // passed the `isInitialized` check still joins this promise rather
87
- // than starting another DDL pass.
88
- soft.isInitialized = true;
90
+ if (!isOwnershipMigrationError(err)) throw err;
89
91
  const message = error.errorMessage(err);
90
92
  if (!loggedMigrationErrors.has(message)) {
91
93
  loggedMigrationErrors.add(message);
@@ -103,8 +105,10 @@ export function withSoftStorageInit(store: PostgresStore): PostgresStore {
103
105
  })();
104
106
  try {
105
107
  await softInitPromise;
106
- } finally {
107
108
  soft.isInitialized = true;
109
+ } catch (err) {
110
+ softInitPromise = undefined;
111
+ throw err;
108
112
  }
109
113
  };
110
114
  return store;