@dbx-tools/appkit-mastra 0.9.132 → 0.9.136

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.
@@ -72,10 +72,9 @@ export declare class MastraServer extends ExpressMastraServer {
72
72
  private config;
73
73
  private log;
74
74
  /**
75
- * Whether to stamp the MLflow trace-id header on responses. Shares the
76
- * plugin's feedback gate via {@link resolveFeedbackEnabled}.
75
+ * Whether to stamp the MLflow trace-id header on responses.
77
76
  */
78
- private feedbackEnabled;
77
+ private mlflowFeedback;
79
78
  constructor(config: MastraPluginConfig, ...args: ConstructorParameters<typeof ExpressMastraServer>);
80
79
  registerAuthMiddleware(): void;
81
80
  configureRequestContextUser(req: express.Request, requestContext: RequestContext): Promise<void>;
package/lib/src/server.js CHANGED
@@ -13,7 +13,6 @@ import { MastraServer as ExpressMastraServer } from "@mastra/express";
13
13
  import { trace } from "@opentelemetry/api";
14
14
  import { attributedUserId, MASTRA_AUTH_MODE_KEY, MASTRA_REQUEST_ID_KEY, MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY, MASTRA_USER_NAME_KEY, } from "./config.js";
15
15
  import { requestUserEmail, requestUserId } from "./identity.js";
16
- import { resolveFeedbackEnabled } from "./mlflow.js";
17
16
  import { MASTRA_ORIGIN_KEY } from "./request-context.js";
18
17
  import { extractModelOverride, MASTRA_MODEL_OVERRIDE_KEY, MASTRA_RESOLVED_MODEL_KEY, resolveServingConfig, } from "./serving.js";
19
18
  import { recordActiveTraceAuth, recordActiveTraceUser } from "./telemetry.js";
@@ -165,15 +164,14 @@ export class MastraServer extends ExpressMastraServer {
165
164
  config;
166
165
  log;
167
166
  /**
168
- * Whether to stamp the MLflow trace-id header on responses. Shares the
169
- * plugin's feedback gate via {@link resolveFeedbackEnabled}.
167
+ * Whether to stamp the MLflow trace-id header on responses.
170
168
  */
171
- feedbackEnabled;
169
+ mlflowFeedback;
172
170
  constructor(config, ...args) {
173
171
  super(...args);
174
172
  this.config = config;
175
173
  this.log = log.logger(config);
176
- this.feedbackEnabled = resolveFeedbackEnabled(config.feedback);
174
+ this.mlflowFeedback = config.feedbackMode === "mlflow";
177
175
  }
178
176
  registerAuthMiddleware() {
179
177
  super.registerAuthMiddleware();
@@ -274,7 +272,7 @@ export class MastraServer extends ExpressMastraServer {
274
272
  * degrading gracefully rather than emitting a bogus trace id.
275
273
  */
276
274
  configureMlflowTraceId(res) {
277
- if (!this.feedbackEnabled || res.headersSent)
275
+ if (!this.mlflowFeedback || res.headersSent)
278
276
  return;
279
277
  if (res.getHeader(feedback.MLFLOW_TRACE_ID_HEADER))
280
278
  return;
@@ -467,4 +465,4 @@ export function attachStaleResumeRecovery(app) {
467
465
  res.end();
468
466
  });
469
467
  }
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLElBQUksbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLG9CQUFvQixHQUdyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxxQkFBcUIsRUFB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LENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDekMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUNILElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDVCxDQUFDO1FBQ0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2xFLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4cHJlc3MtbGF5ZXIgcGx1bWJpbmcgZm9yIHRoZSBNYXN0cmEgcGx1Z2luOiBhIGBNYXN0cmFTZXJ2ZXJgIHRoYXRcbiAqIHN0YW1wcyB0aGUgcGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YCBhbmQgYSBzY29wZWQgbmF0aXZlIEFQSSBnYXRlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgaGFzaCwgaHR0cCwgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgaXNTdGFsZU1hc3RyYVJlc3VtZUVycm9yIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYS9yZXN1bWVcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBSZXF1ZXN0Q29udGV4dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IE1hc3RyYVNlcnZlciBhcyBFeHByZXNzTWFzdHJhU2VydmVyIH0gZnJvbSBcIkBtYXN0cmEvZXhwcmVzc1wiO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7XG4gIGF0dHJpYnV0ZWRVc2VySWQsXG4gIE1BU1RSQV9BVVRIX01PREVfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfT1JJR0lOX0tFWSB9IGZyb20gXCIuL3JlcXVlc3QtY29udGV4dC50c1wiO1xuaW1wb3J0IHtcbiAgZXh0cmFjdE1vZGVsT3ZlcnJpZGUsXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIHJlc29sdmVTZXJ2aW5nQ29uZmlnLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlVXNlciB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuLyoqXG4gKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLlxuICogYHRyYWNlLmdldEFjdGl2ZVNwYW4oKWAgcmV0dXJucyBhIG5vbi1yZWNvcmRpbmcgc3BhbiB3aXRoIHRoaXMgaWRcbiAqIHdoZW4gbm8gU0RLIGlzIHJlZ2lzdGVyZWQsIHdoaWNoIG11c3QgbmV2ZXIgYmUgc3VyZmFjZWQgYXMgYSB0cmFjZSB0b1xuICogYXR0YWNoIGZlZWRiYWNrIHRvLlxuICovXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3NlcnZlclwiKTtcbmNvbnN0IElOVkFMSURfVFJBQ0VfSUQgPSBcIjBcIi5yZXBlYXQoMzIpO1xuY29uc3QgVFJVU1RFRF9SRVFVRVNUX0NPTlRFWFRfS0VZUyA9IFtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX0FVVEhfTU9ERV9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX09SSUdJTl9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKiogUmVzb2x2ZSB0aGUgY2Fub25pY2FsIGJyb3dzZXIgb3JpZ2luIGZyb20gc3RhbmRhcmQgcHJveHkgYW5kIGJyb3dzZXIgaGVhZGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0T3JpZ2luKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbcmVxLmdldChcIm9yaWdpblwiKSwgcmVxLmdldChcInJlZmVyZXJcIildKSB7XG4gICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodmFsdWUpO1xuICAgICAgaWYgKHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIikgcmV0dXJuIHVybC5vcmlnaW47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDb250aW51ZSB0byBwcm94eSBoZWFkZXJzLlxuICAgIH1cbiAgfVxuICBjb25zdCBob3N0ID0gcmVxLmdldChcIngtZm9yd2FyZGVkLWhvc3RcIik/LnNwbGl0KFwiLFwiLCAxKVswXT8udHJpbSgpIHx8IHJlcS5nZXQoXCJob3N0XCIpPy50cmltKCk7XG4gIGlmICghaG9zdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcHJvdG9jb2wgPVxuICAgIHJlcS5nZXQoXCJ4LWZvcndhcmRlZC1wcm90b1wiKT8uc3BsaXQoXCIsXCIsIDEpWzBdPy50cmltKCkgfHwgcmVxLnByb3RvY29sIHx8IFwiaHR0cHNcIjtcbiAgaWYgKHByb3RvY29sICE9PSBcImh0dHBcIiAmJiBwcm90b2NvbCAhPT0gXCJodHRwc1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKGAke3Byb3RvY29sfTovLyR7aG9zdH1gKS5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaG8gYSB0dXJuIGlzIEFUVFJJQlVURUQgdG8sIGluZGVwZW5kZW50IG9mIHdoaWNoIERhdGFicmlja3MgY3JlZGVudGlhbCBydW5zXG4gKiBpdHMgY2FsbHMuIFN1cHBsaWVkIGJ5IHRoZSBIVFRQIG1pZGRsZXdhcmUgZnJvbSB0aGUgZm9yd2FyZGVkIHVzZXIgaGVhZGVycyBzb1xuICogdGhhdCBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgLSB3aGVyZSBldmVyeSByZXF1ZXN0IHNoYXJlcyB0aGUgYXBwIFNQJ3NcbiAqIGNsaWVudCAtIHRoZSBtZW1vcnkgdGhyZWFkLCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0cmFjZSBtZXRhZGF0YVxuICogc3RpbGwga2V5IG9mZiB0aGUgcmVhbCBjYWxsZXIuIElnbm9yZWQgaW4gYW4gT0JPICh1c2VyKSBjb250ZXh0LCB3aG9zZSBvd25cbiAqIHVzZXIgaWQgLyBlbWFpbCBhcmUgYXV0aG9yaXRhdGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVkSWRlbnRpdHkge1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC11c2VyYCBpZCwgdXNlZCB3aGVuIHRoZSBjbGllbnQgaXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICB1c2VySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLWVtYWlsYCwgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgdW5kZXIgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICBlbWFpbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFtcCB0aGUgQXBwS2l0IHVzZXIgKHBsdXMgdGhlIHJlc291cmNlIGlkIGFuZCB0cmFjZSBtZXRhZGF0YSkgb250b1xuICogYHJlcXVlc3RDb250ZXh0YC5cbiAqXG4gKiBTcGxpdCBvdXQgb2Yge0BsaW5rIE1hc3RyYVNlcnZlcn0gYmVjYXVzZSB0aGUgSFRUUCBtaWRkbGV3YXJlIGlzIG5vdCB0aGUgb25seVxuICogY2FsbGVyIHRoYXQgbmVlZHMgaXQ6IGFuIG91dC1vZi1iYW5kIHR1cm4gKGEgVGVhbXMgYWN0aXZpdHkgYXJyaXZpbmcgb25cbiAqIGFub3RoZXIgcGx1Z2luJ3Mgcm91dGUsIGEgc2NoZWR1bGVkIGpvYikgZHJpdmVzIGBhZ2VudC5nZW5lcmF0ZWAgZGlyZWN0bHksIGFuZFxuICogd2l0aG91dCB0aGlzIHN0YW1wIGV2ZXJ5IHVzZXItc2NvcGVkIHRvb2wgLSBgYXNrX2dlbmllYCBhYm92ZSBhbGwgLSBmYWlscyB3aXRoXG4gKiBcImludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luXCIuIFRob3NlXG4gKiBjYWxsZXJzIGJ1aWxkIGEgY29udGV4dCB3aXRoIHtAbGluayBjcmVhdGVSZXF1ZXN0Q29udGV4dH0gaW5zdGVhZCBvZiBhXG4gKiByZXF1ZXN0LlxuICpcbiAqIFRoZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgYWx3YXlzIGNvbWVzIGZyb20gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHQ7XG4gKiBgYXR0cmlidXRlZGAgb25seSBjaGFuZ2VzIFdITyB0aGUgdHVybiBpcyBhdHRyaWJ1dGVkIHRvIHdoZW4gdGhhdCBjb250ZXh0IGlzXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwgKHNlZSB7QGxpbmsgQXR0cmlidXRlZElkZW50aXR5fSkuXG4gKlxuICogSWRlbXBvdGVudDogcmV0dXJucyBpbW1lZGlhdGVseSB3aGVuIHRoZSB1c2VyIGFuZCByZXNvdXJjZSBpZCBhcmUgYWxyZWFkeVxuICogcHJlc2VudCwgc28gdGhlIG1pZGRsZXdhcmUgY2FuIGNhbGwgaXQgb3ZlciBhIGNvbnRleHQgYW5vdGhlciBsYXllciBzdGFtcGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIoXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgYXR0cmlidXRlZDogQXR0cmlidXRlZElkZW50aXR5ID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKFtNQVNUUkFfVVNFUl9LRVksIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVldLmV2ZXJ5KChrZXkpID0+IHJlcXVlc3RDb250ZXh0LmdldChrZXkpKSkgcmV0dXJuO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBpc1VzZXJDb250ZXh0ID0gXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dDtcbiAgLy8gVGhlIERhdGFicmlja3MgQ1JFREVOVElBTCBpcyBhbHdheXMgdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHQncyBjbGllbnRcbiAgLy8gKE9CTyBpbiBhIHVzZXIgY29udGV4dCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIG90aGVyd2lzZSkuIFdITyB0aGUgdHVybiBpc1xuICAvLyBhdHRyaWJ1dGVkIHRvIGNhbiBkaWZmZXI6IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSBldmVyeSByZXF1ZXN0IHNoYXJlc1xuICAvLyB0aGUgU1AgY2xpZW50LCBidXQgdGhlIGZvcndhcmRlZCB1c2VyIGlkIG11c3Qgc3RpbGwga2V5IHRoZSBtZW1vcnkgdGhyZWFkXG4gIC8vIGFuZCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlIHNvIHR3byBjYWxsZXJzIGRvbid0IHNoYXJlIGEgY29udmVyc2F0aW9uLlxuICBjb25zdCB1c2VyOiBVc2VyID0ge1xuICAgIGlkOiBhdHRyaWJ1dGVkVXNlcklkKGV4ZWN1dGlvbkNvbnRleHQsIGF0dHJpYnV0ZWQudXNlcklkKSxcbiAgICBleGVjdXRpb25Db250ZXh0LFxuICB9O1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfS0VZLCB1c2VyKTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIHVzZXIuaWQpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX0FVVEhfTU9ERV9LRVksIGlzVXNlckNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgLy8gQXBwS2l0J3MgYFVzZXJDb250ZXh0YCBzdXJmYWNlcyBkaXNwbGF5IG5hbWUgLyBlbWFpbCBvbmx5IG9uXG4gIC8vIE9CTyByZXF1ZXN0cy4gU2VydmljZS1jb250ZXh0IGNhbGxzIChiYWNrZ3JvdW5kIHRhc2tzLCBzZXJ2ZXJcbiAgLy8gc3RhcnQtdXApIGxlYXZlIHRoZXNlIHVuZGVmaW5lZCBhbmQgd2Ugc2tpcCB0aGUgc3RhbXAgc29cbiAgLy8gZG93bnN0cmVhbSB0cmFjZSBtZXRhZGF0YSBzdGF5cyBhYnNlbnQgcmF0aGVyIHRoYW4gZW1wdHkuIEluXG4gIC8vIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgZm9yd2FyZGVkIGVtYWlsIHN0aWxsIGlkZW50aWZpZXMgdGhlIGNhbGxlcixcbiAgLy8gc28gaXQgaXMgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgU1AuXG4gIGxldCB1c2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGF0dHJpYnV0ZWQuZW1haWw7XG4gIGlmIChpc1VzZXJDb250ZXh0KSB7XG4gICAgdXNlck5hbWUgPSBleGVjdXRpb25Db250ZXh0LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gZXhlY3V0aW9uQ29udGV4dC51c2VyRW1haWwgPz8gZW1haWw7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY3VycmVudFVzZXIubWUoKTtcbiAgICB1c2VyTmFtZSA9IGN1cnJlbnRVc2VyPy51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGN1cnJlbnRVc2VyPy5lbWFpbHM/LmZpbHRlcigoZW1haWwpID0+IGVtYWlsLnByaW1hcnkpLmZpbmQoKGVtYWlsKSA9PiBlbWFpbC52YWx1ZSlcbiAgICAgID8udmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmICh1c2VyTmFtZSkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9OQU1FX0tFWSwgdXNlck5hbWUpO1xuICB9XG4gIGlmIChlbWFpbCkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9FTUFJTF9LRVksIGVtYWlsKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgUmVxdWVzdENvbnRleHRgIGEgTk9OLUhUVFAgYWdlbnQgdHVybiBuZWVkcy5cbiAqXG4gKiBFdmVyeXRoaW5nIE1hc3RyYSdzIHRvb2xzIHJlYWQgb2ZmIHRoZSBjb250ZXh0IGlzIHN0YW1wZWQgdGhlIHNhbWUgd2F5IHRoZVxuICogcmVxdWVzdCBtaWRkbGV3YXJlIHN0YW1wcyBpdCAtIHRoZSBBcHBLaXQgdXNlciAoc28gYGFza19nZW5pZWAgYW5kIHRoZSBtb2RlbFxuICogcmVzb2x2ZXIgY2FuIG1pbnQgdXNlci1zY29wZWQgdG9rZW5zKSwgdGhlIG1lbW9yeSB0aHJlYWQgLyByZXNvdXJjZSBwYWlyLCBhbmRcbiAqIGEgcmVxdWVzdCBpZCBzbyB0aGUgdHVybidzIHNwYW5zIGpvaW4gdXAgaW4gdHJhY2VzLiBUaGUgcmVzdWx0IGlzIHBhc3NlZCBhc1xuICogYHJlcXVlc3RDb250ZXh0YCB0byBgYWdlbnQuZ2VuZXJhdGVgIC8gYGFnZW50LnN0cmVhbWAuXG4gKlxuICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgY2FyZCB0dXJuIGFuc3dlciB3aXRoIHRoZSBTQU1FIGRhdGEgYSBjaGF0IHR1cm4gZG9lczogdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgaXMgcHJlc2VudGF0aW9uLCBub3QgY2FwYWJpbGl0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCk7XG4gIGlmIChvcHRpb25zLnRocmVhZElkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIG9wdGlvbnMudGhyZWFkSWQpO1xuICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB1c2VyIHNvIGFuIGV4cGxpY2l0IHJlc291cmNlIGlkIChhIGNoYW5uZWwgbWVtYmVyLCBzYXkpXG4gIC8vIHdpbnMgb3ZlciB0aGUgYW1iaWVudCBpZGVudGl0eSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgIGRlZmF1bHRlZCB0by5cbiAgaWYgKG9wdGlvbnMucmVzb3VyY2VJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIG9wdGlvbnMucmVzb3VyY2VJZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIG9wdGlvbnMucmVxdWVzdElkID8/IGhhc2guaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RhbXAgdGhlIE1MZmxvdyB0cmFjZS1pZCBoZWFkZXIgb24gcmVzcG9uc2VzLiBTaGFyZXMgdGhlXG4gICAqIHBsdWdpbidzIGZlZWRiYWNrIGdhdGUgdmlhIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfS5cbiAgICovXG4gIHByaXZhdGUgZmVlZGJhY2tFbmFibGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBFeHByZXNzTWFzdHJhU2VydmVyPlxuICApIHtcbiAgICBzdXBlciguLi5hcmdzKTtcbiAgICB0aGlzLmxvZyA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgICB0aGlzLmZlZWRiYWNrRW5hYmxlZCA9IHJlc29sdmVGZWVkYmFja0VuYWJsZWQoY29uZmlnLmZlZWRiYWNrKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTogdm9pZCB7XG4gICAgc3VwZXIucmVnaXN0ZXJBdXRoTWlkZGxld2FyZSgpO1xuICAgIHRoaXMuYXBwLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVzLmxvY2Fscy5yZXF1ZXN0Q29udGV4dCEgYXMgUmVxdWVzdENvbnRleHQ7XG4gICAgICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKHJlcSwgcmVzLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0T3JpZ2luKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXEsIHJlcXVlc3RDb250ZXh0KTtcblxuICAgICAgdGhpcy5jb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlcyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcImF1dGg6bWlkZGxld2FyZVwiLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSksXG4gICAgICAgIHRocmVhZElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpLFxuICAgICAgICByZXNvdXJjZUlkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgICAgIHVzZXJOYW1lOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgICB1c2VyRW1haWw6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgICBtb2RlbE92ZXJyaWRlOiByZXF1ZXN0Q29udGV4dC5nZXQoXG4gICAgICAgICAgLy8gaW1wb3J0ZWQgYmVsb3c7IGxvZ2dlZCBzbyBhIG1pc3JvdXRlZCByZXF1ZXN0IHNob3dzXG4gICAgICAgICAgLy8gdXAgYWxvbmdzaWRlIGl0cyBtb2RlbCBzZWxlY3Rpb24gaW4gYExPR19MRVZFTD1kZWJ1Z2AuXG4gICAgICAgICAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGFzcyB0aGUgZm9yd2FyZGVkIGNhbGxlciBpZGVudGl0eSBzbyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgc3RpbGwga2V5c1xuICAgIC8vIG1lbW9yeSAvIGNhY2hlIC8gdHJhY2VzIHBlciB1c2VyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIGFwcCBTUC5cbiAgICAvLyBJbiBhbiBPQk8gY29udGV4dCB0aGVzZSBhcmUgaWdub3JlZCBpbiBmYXZvciBvZiB0aGUgY29udGV4dCdzIG93biB1c2VyLlxuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICB1c2VySWQ6IHJlcXVlc3RVc2VySWQocmVxKSxcbiAgICAgIGVtYWlsOiByZXF1ZXN0VXNlckVtYWlsKHJlcSksXG4gICAgfSk7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChcImlzVXNlckNvbnRleHRcIiBpbiB1c2VyLmV4ZWN1dGlvbkNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgICB9XG4gICAgY29uc3QgdHJhY2VVc2VyID0gW1xuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpLFxuICAgIF0uZmluZCgodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICByZWNvcmRBY3RpdmVUcmFjZVVzZXIodHJhY2VVc2VyKTtcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgcHVibGljIGJyb3dzZXIgb3JpZ2luIHNvIHBsdWdpbiB0b29scyBjYW4gcmV0dXJuIGNhbm9uaWNhbCBhcHAgbGlua3MuICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0T3JpZ2luKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW4gPSByZXF1ZXN0T3JpZ2luKHJlcSk7XG4gICAgaWYgKG9yaWdpbikgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9PUklHSU5fS0VZLCBvcmlnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIGEgcGVyLXJlcXVlc3QgaWQgYW5kIGVjaG8gaXQgb24gdGhlIHJlc3BvbnNlIHNvIGFuIHVwc3RyZWFtXG4gICAqIHByb3h5IC8gY3VybCBjbGllbnQgLyBicm93c2VyLXNpZGUgbG9nIGxpbmUgY2FuIHBhaXIgaXRzIHZpZXcgb2ZcbiAgICogdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbWF0Y2hpbmcgdHJhY2Ugc3Bhbi4gUmV1c2VzIGBYLVJlcXVlc3QtSWRgXG4gICAqIHdoZW4gdGhlIHVwc3RyZWFtIGFscmVhZHkgc3VwcGxpZXMgb25lIHNvIG11bHRpLWhvcCB0cmFjZXMgc3RheVxuICAgKiBqb2luZWQ7IG90aGVyd2lzZSBtaW50cyBhIFVVSUR2NC5cbiAgICpcbiAgICogVGhlIGlkIGlzIHN1cmZhY2VkIGFzIGBtYXN0cmFfX3JlcXVlc3RJZGAgc3BhbiBtZXRhZGF0YSB2aWFcbiAgICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBhbmQgYXMgdGhlIGBYLVJlcXVlc3QtSWRgXG4gICAqIHJlc3BvbnNlIGhlYWRlciBzbyBkZXYgdG9vbHMgY2FuIGNvcHkgaXQgZnJvbSBlaXRoZXIgc2lkZS5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gICkge1xuICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSkgcmV0dXJuO1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbXCJ4LXJlcXVlc3QtaWRcIl07XG4gICAgY29uc3QgdXBzdHJlYW0gPSBBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSA/IGhlYWRlclZhbHVlWzBdIDogaGVhZGVyVmFsdWU7XG4gICAgY29uc3QgcmVxdWVzdElkID0gdXBzdHJlYW0/LnRyaW0oKSB8fCBoYXNoLmlkKCk7XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgcmVxdWVzdElkKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiWC1SZXF1ZXN0LUlkXCIsIHJlcXVlc3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgT0F1dGggc2NvcGVzIGZyb20gdGhlIGZvcndhcmRlZCBhY2Nlc3MgdG9rZW4gb25cbiAgICoge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSBmb3Igd29ya3NwYWNlIG1vdW50IGdhdGluZy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICBjb25zdCBzY29wZXMgPSBbXG4gICAgICAuLi5vYmplY3RcbiAgICAgICAgLnNlcXVlbmNlKHRva2VuLmdldEFjY2Vzc1Rva2VuU2NvcGVzKHJlcSksIHRva2VuLmdldEFjY2Vzc1Rva2VuU2NvcGVzKHJlcSwgXCJhdXRob3JpemF0aW9uXCIpKVxuICAgICAgICAuZGlzdGluY3QoKSxcbiAgICBdO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfU0NPUEVTX0tFWSwgc2NvcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBvbiB0aGUgcmVzcG9uc2Ugc28gdGhlIGNoYXQgY2xpZW50XG4gICAqIGNhbiBhdHRhY2ggdGh1bWJzIC8gY29tbWVudCBmZWVkYmFjayB0byBpdCBsYXRlci4gTUxmbG93IGRlcml2ZXNcbiAgICogaXRzIHRyYWNlIGlkIGZyb20gdGhlIE9wZW5UZWxlbWV0cnkgdHJhY2UgaWQgKGB0ci08aGV4PmApLCBhbmQgZXZlcnlcbiAgICogTWFzdHJhIHNwYW4gZm9yIHRoaXMgcmVxdWVzdCBpbmhlcml0cyB0aGUgYW1iaWVudCBPVGVsIGNvbnRleHQgKHNlZVxuICAgKiBgb2JzZXJ2YWJpbGl0eS50c2ApLCBzbyB0aGUgYWN0aXZlIHNwYW4ncyB0cmFjZSBpZCBoZXJlIGlzIHRoZSBpZFxuICAgKiBNTGZsb3cgd2lsbCByZWNvcmQgZm9yIHRoZSB0dXJuLlxuICAgKlxuICAgKiBOby1vcCB1bmxlc3MgZmVlZGJhY2sgaXMgZW5hYmxlZCwgYW5kIHdoZW4gbm8gbGl2ZSBPVGVsIHNwYW4gaXNcbiAgICogYWN0aXZlIChlLmcuIHRoZSBPVExQIFNESyBpc24ndCByZWdpc3RlcmVkKTogaW4gdGhhdCBjYXNlIHRoZSBoZWFkZXJcbiAgICogaXMgc2ltcGx5IGFic2VudCBhbmQgdGhlIGNsaWVudCBoaWRlcyBmZWVkYmFjayBmb3IgdGhhdCBtZXNzYWdlLFxuICAgKiBkZWdyYWRpbmcgZ3JhY2VmdWxseSByYXRoZXIgdGhhbiBlbWl0dGluZyBhIGJvZ3VzIHRyYWNlIGlkLlxuICAgKi9cbiAgY29uZmlndXJlTWxmbG93VHJhY2VJZChyZXM6IGV4cHJlc3MuUmVzcG9uc2UpIHtcbiAgICBpZiAoIXRoaXMuZmVlZGJhY2tFbmFibGVkIHx8IHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIGlmIChyZXMuZ2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIpKSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VJZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gICAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHRocmVhZCBpZCB0aGlzIHJlcXVlc3QgdGFyZ2V0cyBhbmQgcGluIGl0IG9uXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAgKGNvbnN1bWVkIGJ5IHRoZSBhZ2VudCBzdHJlYW0gZm9yIHBlcnNpc3RlbmNlIGFuZFxuICAgKiBieSBuYXRpdmUgbWVtb3J5IHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGh0dHAucGFyc2VDb29raWVzKHJlcS5oZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgY29va2llTmFtZSA9IHN0cmluZ1V0aWxzLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgICAgeyBkZWxpbWl0ZXI6IFwiX1wiLCBkaXN0aW5jdDogdHJ1ZSB9LFxuICAgICAgXCJhcHBraXRcIixcbiAgICAgIHRoaXMuY29uZmlnLm5hbWUhLFxuICAgICAgXCJzZXNzaW9uSWRcIixcbiAgICApO1xuICAgIGxldCBzZXNzaW9uSWQgPSBjb29raWVzW2Nvb2tpZU5hbWVdO1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICBzZXNzaW9uSWQgPSBoYXNoLmlkKCk7XG4gICAgICByZXMuY29va2llKGNvb2tpZU5hbWUsIHNlc3Npb25JZCwge1xuICAgICAgICBodHRwT25seTogdHJ1ZSxcbiAgICAgICAgc2FtZVNpdGU6IFwibGF4XCIsXG4gICAgICAgIHNlY3VyZTogcmVxLnNlY3VyZSxcbiAgICAgICAgcGF0aDogXCIvXCIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIGNsaWVudC1zZWxlY3RlZCB0aHJlYWQgaWQgZnJvbSB0aGUgcmVxdWVzdCwgcHJlZmVycmluZ1xuICAgKiB0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgb3ZlciB0aGUgYD90aHJlYWRJZD1gIHF1ZXJ5LiBSZXR1cm5zXG4gICAqIGBudWxsYCB3aGVuIG5laXRoZXIgY2FycmllcyBhIG5vbi1lbXB0eSB2YWx1ZSBzbyB0aGUgY2FsbGVyIGZhbGxzXG4gICAqIGJhY2sgdG8gdGhlIHNlc3Npb24gY29va2llLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkUmVxdWVzdGVkVGhyZWFkSWQocmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW3RocmVhZC5USFJFQURfSURfSEVBREVSXTtcbiAgICBjb25zdCBxdWVyeVZhbHVlID0gcmVxLnF1ZXJ5W3RocmVhZC5USFJFQURfSURfUVVFUlldO1xuICAgIHJldHVybiAoXG4gICAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZSkgPz9cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVG9nZXRoZXIgd2l0aFxuICogdGhlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgbXV0YXRpb25zIGJlbG93LCB0aGVzZSBhcmUgdGhlIG9ubHkgc3RvY2sgTWFzdHJhXG4gKiB3cml0ZXMgdGhlIGJyb3dzZXIgY2xpZW50IGNhbiBtYWtlLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG4vKiogUGVyc2lzdGVkIGFwcHJvdmFsIGRpc2NvdmVyeSBmb3Igb25lIGFnZW50LiAqL1xuY29uc3QgQUdFTlRfU1VTUEVOREVEX1JVTlMgPSAvXlxcL2FnZW50c1xcL1teL10rXFwvc3VzcGVuZGVkLXJ1bnMkL2k7XG4vKiogT2ZmaWNpYWwgQUkgU0RLIFVJIHN0cmVhbSByb3V0ZSwgaW5jbHVkaW5nIGByZXN1bWVEYXRhYCBjb250aW51YXRpb25zLiAqL1xuY29uc3QgQUdFTlRfQ0hBVCA9IC9eXFwvY2hhdFxcL1teL10rJC9pO1xuLyoqIER1cmFibGUgcnVuIG9ic2VydmF0aW9uIGZvciBvbmUgYWdlbnQtb3duZWQgY2hhdCBzdHJlYW0uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTiA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rJC9pO1xuLyoqIEV4cGxpY2l0IGNhbmNlbGxhdGlvbiBmb3Igb25lIGR1cmFibGUgY2hhdCBydW4uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTl9BQk9SVCA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rXFwvYWJvcnQkL2k7XG4vKiogTmF0aXZlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgcmVhZHMgdXNlZCBieSBoaXN0b3J5IGFuZCB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBNRU1PUllfUkVBRCA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkcyg/OlxcL1teL10rKD86XFwvbWVzc2FnZXMpPyk/JC9pO1xuLyoqIE5hdGl2ZSB0aHJlYWQgcmVuYW1lL2RlbGV0ZSByb3V0ZXMuICovXG5jb25zdCBNRU1PUllfVEhSRUFEX01VVEFUSU9OID0gL15cXC9tZW1vcnlcXC90aHJlYWRzXFwvW14vXSskL2k7XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2NoYXQveGAsIGAvbWVtb3J5L3RocmVhZHNgLCBgL21jcC8uLi5gKS4gSW4gYFwic2NvcGVkXCJgXG4gKiBtb2RlIHRoZSBhbGxvd2xpc3QgaXMgZGVsaWJlcmF0ZWx5IHRpZ2h0IC0gdGhlIGNoYXQgY2xpZW50IG9ubHkgZXZlclxuICogbmVlZHMgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHJlc291cmNlLXNjb3BlZCBtZW1vcnksXG4gKiB0aGlzIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUC4gVGhlIHJlbWFpbmluZ1xuICogYWRtaW4sIG11dGF0aW5nLCBhbmQgYnVsay1leHBvcnQgc3VyZmFjZSBzdGF5cyBkZW5pZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGUgcGx1Z2luJ3MgYC9yb3V0ZS8qYCBhZGRpdGlvbnMgdmFsaWRhdGUgdGhlaXIgb3duIGlucHV0cyBhbmQgdHJ1c3RlZFxuICAvLyBBcHBLaXQgcmVxdWVzdCBjb250ZXh0IGJlZm9yZSByZWFjaGluZyBwcm9kdWN0IGJlaGF2aW9yLlxuICBpZiAocCA9PT0gXCIvcm91dGVcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG9wdHMubWNwRW5hYmxlZCAmJiAocCA9PT0gXCIvbWNwXCIgfHwgcC5zdGFydHNXaXRoKFwiL21jcC9cIikpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbSA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfQ0hBVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgQUdFTlRfQ0hBVF9SVU4udGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9DSEFUX1JVTl9BQk9SVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgKEFHRU5UX01FVEFEQVRBLnRlc3QocCkgfHwgQUdFTlRfU1VTUEVOREVEX1JVTlMudGVzdChwKSkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiBNRU1PUllfUkVBRC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChtID09PSBcIlBBVENIXCIgfHwgbSA9PT0gXCJERUxFVEVcIikgJiYgTUVNT1JZX1RIUkVBRF9NVVRBVElPTi50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIHAgPT09IFwiL21lbW9yeS9tZXNzYWdlcy9kZWxldGVcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBLZWVwIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlcyBtb3VudC1yZWxhdGl2ZSB3aGVuIHRoZSBFeHByZXNzIHN1YmFwcCBpc1xuICogaG9zdGVkIHVuZGVyIEFwcEtpdCdzIGAvYXBpLzxwbHVnaW4+YCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgaXNDdXN0b21Sb3V0ZSA9XG4gICAgICByZXEucGF0aCA9PT0gXCIvY2hhdFwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL2NoYXQvXCIpIHx8XG4gICAgICByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9yb3V0ZS9cIik7XG4gICAgaWYgKCFpc0N1c3RvbVJvdXRlKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5wYXRoO1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluaXNoIGEgY2hhdCByZXF1ZXN0IHdoZW4gTWFzdHJhIHRocm93cyBiZWNhdXNlIHRoZSB3b3JrZmxvdyBpcyBub1xuICogbG9uZ2VyIHN1c3BlbmRlZC4gRHVwbGljYXRlIGFwcHJvdmUvcmVzdW1lIGFuZCBsYXRlIGBjb25zdW1lU3RyZWFtYFxuICogYm90aCBoaXQgdGhhdCBwYXRoOyB0aGUgY2xpZW50IGFscmVhZHkgaGFzIChvciB3aWxsIHJlbG9hZCkgdGhlXG4gKiBjb21wbGV0ZWQgdHVybi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFN0YWxlUmVzdW1lUmVjb3ZlcnkoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZShcbiAgICAoZXJyb3I6IHVua25vd24sIHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UsIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcihlcnJvcikpIHtcbiAgICAgICAgbmV4dChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci53YXJuKFwiaWdub3JlZCBzdGFsZSBtYXN0cmEgcmVzdW1lXCIsIHtcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLnN0YXR1cygyMDApO1xuICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcInRleHQvZXZlbnQtc3RyZWFtOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgICAgcmVzLnNldEhlYWRlcihcImNhY2hlLWNvbnRyb2xcIiwgXCJuby1jYWNoZVwiKTtcbiAgICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwic3RhcnRcIiB9KX1cXG5cXG5gKTtcbiAgICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwiZmluaXNoXCIgfSl9XFxuXFxuYCk7XG4gICAgICByZXMud3JpdGUoXCJkYXRhOiBbRE9ORV1cXG5cXG5cIik7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSxcbiAgKTtcbn1cbiJdfQ==
468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLElBQUksbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLG9CQUFvQixHQUdyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixvQkFBb0IsR0FDckIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUU7Ozs7O0dB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NkJBQTZCLEVBQUU7WUFDekMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUNILElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDVCxDQUFDO1FBQ0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2xFLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4cHJlc3MtbGF5ZXIgcGx1bWJpbmcgZm9yIHRoZSBNYXN0cmEgcGx1Z2luOiBhIGBNYXN0cmFTZXJ2ZXJgIHRoYXRcbiAqIHN0YW1wcyB0aGUgcGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YCBhbmQgYSBzY29wZWQgbmF0aXZlIEFQSSBnYXRlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgaGFzaCwgaHR0cCwgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgaXNTdGFsZU1hc3RyYVJlc3VtZUVycm9yIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYS9yZXN1bWVcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBSZXF1ZXN0Q29udGV4dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IE1hc3RyYVNlcnZlciBhcyBFeHByZXNzTWFzdHJhU2VydmVyIH0gZnJvbSBcIkBtYXN0cmEvZXhwcmVzc1wiO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7XG4gIGF0dHJpYnV0ZWRVc2VySWQsXG4gIE1BU1RSQV9BVVRIX01PREVfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfT1JJR0lOX0tFWSB9IGZyb20gXCIuL3JlcXVlc3QtY29udGV4dC50c1wiO1xuaW1wb3J0IHtcbiAgZXh0cmFjdE1vZGVsT3ZlcnJpZGUsXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIHJlc29sdmVTZXJ2aW5nQ29uZmlnLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlVXNlciB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuLyoqXG4gKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLlxuICogYHRyYWNlLmdldEFjdGl2ZVNwYW4oKWAgcmV0dXJucyBhIG5vbi1yZWNvcmRpbmcgc3BhbiB3aXRoIHRoaXMgaWRcbiAqIHdoZW4gbm8gU0RLIGlzIHJlZ2lzdGVyZWQsIHdoaWNoIG11c3QgbmV2ZXIgYmUgc3VyZmFjZWQgYXMgYSB0cmFjZSB0b1xuICogYXR0YWNoIGZlZWRiYWNrIHRvLlxuICovXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3NlcnZlclwiKTtcbmNvbnN0IElOVkFMSURfVFJBQ0VfSUQgPSBcIjBcIi5yZXBlYXQoMzIpO1xuY29uc3QgVFJVU1RFRF9SRVFVRVNUX0NPTlRFWFRfS0VZUyA9IFtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX0FVVEhfTU9ERV9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX09SSUdJTl9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKiogUmVzb2x2ZSB0aGUgY2Fub25pY2FsIGJyb3dzZXIgb3JpZ2luIGZyb20gc3RhbmRhcmQgcHJveHkgYW5kIGJyb3dzZXIgaGVhZGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0T3JpZ2luKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbcmVxLmdldChcIm9yaWdpblwiKSwgcmVxLmdldChcInJlZmVyZXJcIildKSB7XG4gICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodmFsdWUpO1xuICAgICAgaWYgKHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIikgcmV0dXJuIHVybC5vcmlnaW47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDb250aW51ZSB0byBwcm94eSBoZWFkZXJzLlxuICAgIH1cbiAgfVxuICBjb25zdCBob3N0ID0gcmVxLmdldChcIngtZm9yd2FyZGVkLWhvc3RcIik/LnNwbGl0KFwiLFwiLCAxKVswXT8udHJpbSgpIHx8IHJlcS5nZXQoXCJob3N0XCIpPy50cmltKCk7XG4gIGlmICghaG9zdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcHJvdG9jb2wgPVxuICAgIHJlcS5nZXQoXCJ4LWZvcndhcmRlZC1wcm90b1wiKT8uc3BsaXQoXCIsXCIsIDEpWzBdPy50cmltKCkgfHwgcmVxLnByb3RvY29sIHx8IFwiaHR0cHNcIjtcbiAgaWYgKHByb3RvY29sICE9PSBcImh0dHBcIiAmJiBwcm90b2NvbCAhPT0gXCJodHRwc1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKGAke3Byb3RvY29sfTovLyR7aG9zdH1gKS5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaG8gYSB0dXJuIGlzIEFUVFJJQlVURUQgdG8sIGluZGVwZW5kZW50IG9mIHdoaWNoIERhdGFicmlja3MgY3JlZGVudGlhbCBydW5zXG4gKiBpdHMgY2FsbHMuIFN1cHBsaWVkIGJ5IHRoZSBIVFRQIG1pZGRsZXdhcmUgZnJvbSB0aGUgZm9yd2FyZGVkIHVzZXIgaGVhZGVycyBzb1xuICogdGhhdCBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgLSB3aGVyZSBldmVyeSByZXF1ZXN0IHNoYXJlcyB0aGUgYXBwIFNQJ3NcbiAqIGNsaWVudCAtIHRoZSBtZW1vcnkgdGhyZWFkLCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0cmFjZSBtZXRhZGF0YVxuICogc3RpbGwga2V5IG9mZiB0aGUgcmVhbCBjYWxsZXIuIElnbm9yZWQgaW4gYW4gT0JPICh1c2VyKSBjb250ZXh0LCB3aG9zZSBvd25cbiAqIHVzZXIgaWQgLyBlbWFpbCBhcmUgYXV0aG9yaXRhdGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVkSWRlbnRpdHkge1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC11c2VyYCBpZCwgdXNlZCB3aGVuIHRoZSBjbGllbnQgaXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICB1c2VySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLWVtYWlsYCwgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgdW5kZXIgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICBlbWFpbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFtcCB0aGUgQXBwS2l0IHVzZXIgKHBsdXMgdGhlIHJlc291cmNlIGlkIGFuZCB0cmFjZSBtZXRhZGF0YSkgb250b1xuICogYHJlcXVlc3RDb250ZXh0YC5cbiAqXG4gKiBTcGxpdCBvdXQgb2Yge0BsaW5rIE1hc3RyYVNlcnZlcn0gYmVjYXVzZSB0aGUgSFRUUCBtaWRkbGV3YXJlIGlzIG5vdCB0aGUgb25seVxuICogY2FsbGVyIHRoYXQgbmVlZHMgaXQ6IGFuIG91dC1vZi1iYW5kIHR1cm4gKGEgVGVhbXMgYWN0aXZpdHkgYXJyaXZpbmcgb25cbiAqIGFub3RoZXIgcGx1Z2luJ3Mgcm91dGUsIGEgc2NoZWR1bGVkIGpvYikgZHJpdmVzIGBhZ2VudC5nZW5lcmF0ZWAgZGlyZWN0bHksIGFuZFxuICogd2l0aG91dCB0aGlzIHN0YW1wIGV2ZXJ5IHVzZXItc2NvcGVkIHRvb2wgLSBgYXNrX2dlbmllYCBhYm92ZSBhbGwgLSBmYWlscyB3aXRoXG4gKiBcImludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luXCIuIFRob3NlXG4gKiBjYWxsZXJzIGJ1aWxkIGEgY29udGV4dCB3aXRoIHtAbGluayBjcmVhdGVSZXF1ZXN0Q29udGV4dH0gaW5zdGVhZCBvZiBhXG4gKiByZXF1ZXN0LlxuICpcbiAqIFRoZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgYWx3YXlzIGNvbWVzIGZyb20gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHQ7XG4gKiBgYXR0cmlidXRlZGAgb25seSBjaGFuZ2VzIFdITyB0aGUgdHVybiBpcyBhdHRyaWJ1dGVkIHRvIHdoZW4gdGhhdCBjb250ZXh0IGlzXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwgKHNlZSB7QGxpbmsgQXR0cmlidXRlZElkZW50aXR5fSkuXG4gKlxuICogSWRlbXBvdGVudDogcmV0dXJucyBpbW1lZGlhdGVseSB3aGVuIHRoZSB1c2VyIGFuZCByZXNvdXJjZSBpZCBhcmUgYWxyZWFkeVxuICogcHJlc2VudCwgc28gdGhlIG1pZGRsZXdhcmUgY2FuIGNhbGwgaXQgb3ZlciBhIGNvbnRleHQgYW5vdGhlciBsYXllciBzdGFtcGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIoXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgYXR0cmlidXRlZDogQXR0cmlidXRlZElkZW50aXR5ID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKFtNQVNUUkFfVVNFUl9LRVksIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVldLmV2ZXJ5KChrZXkpID0+IHJlcXVlc3RDb250ZXh0LmdldChrZXkpKSkgcmV0dXJuO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBpc1VzZXJDb250ZXh0ID0gXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dDtcbiAgLy8gVGhlIERhdGFicmlja3MgQ1JFREVOVElBTCBpcyBhbHdheXMgdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHQncyBjbGllbnRcbiAgLy8gKE9CTyBpbiBhIHVzZXIgY29udGV4dCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIG90aGVyd2lzZSkuIFdITyB0aGUgdHVybiBpc1xuICAvLyBhdHRyaWJ1dGVkIHRvIGNhbiBkaWZmZXI6IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSBldmVyeSByZXF1ZXN0IHNoYXJlc1xuICAvLyB0aGUgU1AgY2xpZW50LCBidXQgdGhlIGZvcndhcmRlZCB1c2VyIGlkIG11c3Qgc3RpbGwga2V5IHRoZSBtZW1vcnkgdGhyZWFkXG4gIC8vIGFuZCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlIHNvIHR3byBjYWxsZXJzIGRvbid0IHNoYXJlIGEgY29udmVyc2F0aW9uLlxuICBjb25zdCB1c2VyOiBVc2VyID0ge1xuICAgIGlkOiBhdHRyaWJ1dGVkVXNlcklkKGV4ZWN1dGlvbkNvbnRleHQsIGF0dHJpYnV0ZWQudXNlcklkKSxcbiAgICBleGVjdXRpb25Db250ZXh0LFxuICB9O1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfS0VZLCB1c2VyKTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIHVzZXIuaWQpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX0FVVEhfTU9ERV9LRVksIGlzVXNlckNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgLy8gQXBwS2l0J3MgYFVzZXJDb250ZXh0YCBzdXJmYWNlcyBkaXNwbGF5IG5hbWUgLyBlbWFpbCBvbmx5IG9uXG4gIC8vIE9CTyByZXF1ZXN0cy4gU2VydmljZS1jb250ZXh0IGNhbGxzIChiYWNrZ3JvdW5kIHRhc2tzLCBzZXJ2ZXJcbiAgLy8gc3RhcnQtdXApIGxlYXZlIHRoZXNlIHVuZGVmaW5lZCBhbmQgd2Ugc2tpcCB0aGUgc3RhbXAgc29cbiAgLy8gZG93bnN0cmVhbSB0cmFjZSBtZXRhZGF0YSBzdGF5cyBhYnNlbnQgcmF0aGVyIHRoYW4gZW1wdHkuIEluXG4gIC8vIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgZm9yd2FyZGVkIGVtYWlsIHN0aWxsIGlkZW50aWZpZXMgdGhlIGNhbGxlcixcbiAgLy8gc28gaXQgaXMgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgU1AuXG4gIGxldCB1c2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGF0dHJpYnV0ZWQuZW1haWw7XG4gIGlmIChpc1VzZXJDb250ZXh0KSB7XG4gICAgdXNlck5hbWUgPSBleGVjdXRpb25Db250ZXh0LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gZXhlY3V0aW9uQ29udGV4dC51c2VyRW1haWwgPz8gZW1haWw7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY3VycmVudFVzZXIubWUoKTtcbiAgICB1c2VyTmFtZSA9IGN1cnJlbnRVc2VyPy51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGN1cnJlbnRVc2VyPy5lbWFpbHM/LmZpbHRlcigoZW1haWwpID0+IGVtYWlsLnByaW1hcnkpLmZpbmQoKGVtYWlsKSA9PiBlbWFpbC52YWx1ZSlcbiAgICAgID8udmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmICh1c2VyTmFtZSkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9OQU1FX0tFWSwgdXNlck5hbWUpO1xuICB9XG4gIGlmIChlbWFpbCkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9FTUFJTF9LRVksIGVtYWlsKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgUmVxdWVzdENvbnRleHRgIGEgTk9OLUhUVFAgYWdlbnQgdHVybiBuZWVkcy5cbiAqXG4gKiBFdmVyeXRoaW5nIE1hc3RyYSdzIHRvb2xzIHJlYWQgb2ZmIHRoZSBjb250ZXh0IGlzIHN0YW1wZWQgdGhlIHNhbWUgd2F5IHRoZVxuICogcmVxdWVzdCBtaWRkbGV3YXJlIHN0YW1wcyBpdCAtIHRoZSBBcHBLaXQgdXNlciAoc28gYGFza19nZW5pZWAgYW5kIHRoZSBtb2RlbFxuICogcmVzb2x2ZXIgY2FuIG1pbnQgdXNlci1zY29wZWQgdG9rZW5zKSwgdGhlIG1lbW9yeSB0aHJlYWQgLyByZXNvdXJjZSBwYWlyLCBhbmRcbiAqIGEgcmVxdWVzdCBpZCBzbyB0aGUgdHVybidzIHNwYW5zIGpvaW4gdXAgaW4gdHJhY2VzLiBUaGUgcmVzdWx0IGlzIHBhc3NlZCBhc1xuICogYHJlcXVlc3RDb250ZXh0YCB0byBgYWdlbnQuZ2VuZXJhdGVgIC8gYGFnZW50LnN0cmVhbWAuXG4gKlxuICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgY2FyZCB0dXJuIGFuc3dlciB3aXRoIHRoZSBTQU1FIGRhdGEgYSBjaGF0IHR1cm4gZG9lczogdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgaXMgcHJlc2VudGF0aW9uLCBub3QgY2FwYWJpbGl0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCk7XG4gIGlmIChvcHRpb25zLnRocmVhZElkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIG9wdGlvbnMudGhyZWFkSWQpO1xuICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB1c2VyIHNvIGFuIGV4cGxpY2l0IHJlc291cmNlIGlkIChhIGNoYW5uZWwgbWVtYmVyLCBzYXkpXG4gIC8vIHdpbnMgb3ZlciB0aGUgYW1iaWVudCBpZGVudGl0eSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgIGRlZmF1bHRlZCB0by5cbiAgaWYgKG9wdGlvbnMucmVzb3VyY2VJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIG9wdGlvbnMucmVzb3VyY2VJZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIG9wdGlvbnMucmVxdWVzdElkID8/IGhhc2guaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RhbXAgdGhlIE1MZmxvdyB0cmFjZS1pZCBoZWFkZXIgb24gcmVzcG9uc2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBtbGZsb3dGZWVkYmFjazogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRXhwcmVzc01hc3RyYVNlcnZlcj5cbiAgKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gICAgdGhpcy5tbGZsb3dGZWVkYmFjayA9IGNvbmZpZy5mZWVkYmFja01vZGUgPT09IFwibWxmbG93XCI7XG4gIH1cblxuICBvdmVycmlkZSByZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTtcbiAgICB0aGlzLmFwcC51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcy5sb2NhbHMucmVxdWVzdENvbnRleHQhIGFzIFJlcXVlc3RDb250ZXh0O1xuICAgICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE9yaWdpbihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRTY29wZXMocmVxLCByZXF1ZXN0Q29udGV4dCk7XG5cbiAgICAgIHRoaXMuY29uZmlndXJlTWxmbG93VHJhY2VJZChyZXMpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJhdXRoOm1pZGRsZXdhcmVcIiwge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVRVUVTVF9JRF9LRVkpLFxuICAgICAgICB0aHJlYWRJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSxcbiAgICAgICAgcmVzb3VyY2VJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpLFxuICAgICAgICB1c2VyTmFtZTogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZKSxcbiAgICAgICAgdXNlckVtYWlsOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZKSxcbiAgICAgICAgbW9kZWxPdmVycmlkZTogcmVxdWVzdENvbnRleHQuZ2V0KFxuICAgICAgICAgIC8vIGltcG9ydGVkIGJlbG93OyBsb2dnZWQgc28gYSBtaXNyb3V0ZWQgcmVxdWVzdCBzaG93c1xuICAgICAgICAgIC8vIHVwIGFsb25nc2lkZSBpdHMgbW9kZWwgc2VsZWN0aW9uIGluIGBMT0dfTEVWRUw9ZGVidWdgLlxuICAgICAgICAgIFwibWFzdHJhX19tb2RlbF9vdmVycmlkZVwiLFxuICAgICAgICApLFxuICAgICAgfSk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBhc3MgdGhlIGZvcndhcmRlZCBjYWxsZXIgaWRlbnRpdHkgc28gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHN0aWxsIGtleXNcbiAgICAvLyBtZW1vcnkgLyBjYWNoZSAvIHRyYWNlcyBwZXIgdXNlciBldmVuIHRob3VnaCB0aGUgY2xpZW50IGlzIHRoZSBhcHAgU1AuXG4gICAgLy8gSW4gYW4gT0JPIGNvbnRleHQgdGhlc2UgYXJlIGlnbm9yZWQgaW4gZmF2b3Igb2YgdGhlIGNvbnRleHQncyBvd24gdXNlci5cbiAgICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCwge1xuICAgICAgdXNlcklkOiByZXF1ZXN0VXNlcklkKHJlcSksXG4gICAgICBlbWFpbDogcmVxdWVzdFVzZXJFbWFpbChyZXEpLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICByZWNvcmRBY3RpdmVUcmFjZUF1dGgoXCJpc1VzZXJDb250ZXh0XCIgaW4gdXNlci5leGVjdXRpb25Db250ZXh0ID8gXCJvYm9cIiA6IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gICAgfVxuICAgIGNvbnN0IHRyYWNlVXNlciA9IFtcbiAgICAgIHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZKSxcbiAgICAgIHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSxcbiAgICBdLmZpbmQoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgcmVjb3JkQWN0aXZlVHJhY2VVc2VyKHRyYWNlVXNlcik7XG4gIH1cblxuICAvKiogU3RhbXAgdGhlIHB1YmxpYyBicm93c2VyIG9yaWdpbiBzbyBwbHVnaW4gdG9vbHMgY2FuIHJldHVybiBjYW5vbmljYWwgYXBwIGxpbmtzLiAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE9yaWdpbihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luID0gcmVxdWVzdE9yaWdpbihyZXEpO1xuICAgIGlmIChvcmlnaW4pIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfT1JJR0lOX0tFWSwgb3JpZ2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBhIHBlci1yZXF1ZXN0IGlkIGFuZCBlY2hvIGl0IG9uIHRoZSByZXNwb25zZSBzbyBhbiB1cHN0cmVhbVxuICAgKiBwcm94eSAvIGN1cmwgY2xpZW50IC8gYnJvd3Nlci1zaWRlIGxvZyBsaW5lIGNhbiBwYWlyIGl0cyB2aWV3IG9mXG4gICAqIHRoZSByZXF1ZXN0IHdpdGggdGhlIG1hdGNoaW5nIHRyYWNlIHNwYW4uIFJldXNlcyBgWC1SZXF1ZXN0LUlkYFxuICAgKiB3aGVuIHRoZSB1cHN0cmVhbSBhbHJlYWR5IHN1cHBsaWVzIG9uZSBzbyBtdWx0aS1ob3AgdHJhY2VzIHN0YXlcbiAgICogam9pbmVkOyBvdGhlcndpc2UgbWludHMgYSBVVUlEdjQuXG4gICAqXG4gICAqIFRoZSBpZCBpcyBzdXJmYWNlZCBhcyBgbWFzdHJhX19yZXF1ZXN0SWRgIHNwYW4gbWV0YWRhdGEgdmlhXG4gICAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gYW5kIGFzIHRoZSBgWC1SZXF1ZXN0LUlkYFxuICAgKiByZXNwb25zZSBoZWFkZXIgc28gZGV2IHRvb2xzIGNhbiBjb3B5IGl0IGZyb20gZWl0aGVyIHNpZGUuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW1wieC1yZXF1ZXN0LWlkXCJdO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHVwc3RyZWFtPy50cmltKCkgfHwgaGFzaC5pZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4ub2JqZWN0XG4gICAgICAgIC5zZXF1ZW5jZSh0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEpLCB0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEsIFwiYXV0aG9yaXphdGlvblwiKSlcbiAgICAgICAgLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLm1sZmxvd0ZlZWRiYWNrIHx8IHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIGlmIChyZXMuZ2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIpKSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VJZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gICAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHRocmVhZCBpZCB0aGlzIHJlcXVlc3QgdGFyZ2V0cyBhbmQgcGluIGl0IG9uXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAgKGNvbnN1bWVkIGJ5IHRoZSBhZ2VudCBzdHJlYW0gZm9yIHBlcnNpc3RlbmNlIGFuZFxuICAgKiBieSBuYXRpdmUgbWVtb3J5IHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGh0dHAucGFyc2VDb29raWVzKHJlcS5oZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgY29va2llTmFtZSA9IHN0cmluZ1V0aWxzLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgICAgeyBkZWxpbWl0ZXI6IFwiX1wiLCBkaXN0aW5jdDogdHJ1ZSB9LFxuICAgICAgXCJhcHBraXRcIixcbiAgICAgIHRoaXMuY29uZmlnLm5hbWUhLFxuICAgICAgXCJzZXNzaW9uSWRcIixcbiAgICApO1xuICAgIGxldCBzZXNzaW9uSWQgPSBjb29raWVzW2Nvb2tpZU5hbWVdO1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICBzZXNzaW9uSWQgPSBoYXNoLmlkKCk7XG4gICAgICByZXMuY29va2llKGNvb2tpZU5hbWUsIHNlc3Npb25JZCwge1xuICAgICAgICBodHRwT25seTogdHJ1ZSxcbiAgICAgICAgc2FtZVNpdGU6IFwibGF4XCIsXG4gICAgICAgIHNlY3VyZTogcmVxLnNlY3VyZSxcbiAgICAgICAgcGF0aDogXCIvXCIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIGNsaWVudC1zZWxlY3RlZCB0aHJlYWQgaWQgZnJvbSB0aGUgcmVxdWVzdCwgcHJlZmVycmluZ1xuICAgKiB0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgb3ZlciB0aGUgYD90aHJlYWRJZD1gIHF1ZXJ5LiBSZXR1cm5zXG4gICAqIGBudWxsYCB3aGVuIG5laXRoZXIgY2FycmllcyBhIG5vbi1lbXB0eSB2YWx1ZSBzbyB0aGUgY2FsbGVyIGZhbGxzXG4gICAqIGJhY2sgdG8gdGhlIHNlc3Npb24gY29va2llLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkUmVxdWVzdGVkVGhyZWFkSWQocmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW3RocmVhZC5USFJFQURfSURfSEVBREVSXTtcbiAgICBjb25zdCBxdWVyeVZhbHVlID0gcmVxLnF1ZXJ5W3RocmVhZC5USFJFQURfSURfUVVFUlldO1xuICAgIHJldHVybiAoXG4gICAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZSkgPz9cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVG9nZXRoZXIgd2l0aFxuICogdGhlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgbXV0YXRpb25zIGJlbG93LCB0aGVzZSBhcmUgdGhlIG9ubHkgc3RvY2sgTWFzdHJhXG4gKiB3cml0ZXMgdGhlIGJyb3dzZXIgY2xpZW50IGNhbiBtYWtlLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG4vKiogUGVyc2lzdGVkIGFwcHJvdmFsIGRpc2NvdmVyeSBmb3Igb25lIGFnZW50LiAqL1xuY29uc3QgQUdFTlRfU1VTUEVOREVEX1JVTlMgPSAvXlxcL2FnZW50c1xcL1teL10rXFwvc3VzcGVuZGVkLXJ1bnMkL2k7XG4vKiogT2ZmaWNpYWwgQUkgU0RLIFVJIHN0cmVhbSByb3V0ZSwgaW5jbHVkaW5nIGByZXN1bWVEYXRhYCBjb250aW51YXRpb25zLiAqL1xuY29uc3QgQUdFTlRfQ0hBVCA9IC9eXFwvY2hhdFxcL1teL10rJC9pO1xuLyoqIER1cmFibGUgcnVuIG9ic2VydmF0aW9uIGZvciBvbmUgYWdlbnQtb3duZWQgY2hhdCBzdHJlYW0uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTiA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rJC9pO1xuLyoqIEV4cGxpY2l0IGNhbmNlbGxhdGlvbiBmb3Igb25lIGR1cmFibGUgY2hhdCBydW4uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTl9BQk9SVCA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rXFwvYWJvcnQkL2k7XG4vKiogTmF0aXZlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgcmVhZHMgdXNlZCBieSBoaXN0b3J5IGFuZCB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBNRU1PUllfUkVBRCA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkcyg/OlxcL1teL10rKD86XFwvbWVzc2FnZXMpPyk/JC9pO1xuLyoqIE5hdGl2ZSB0aHJlYWQgcmVuYW1lL2RlbGV0ZSByb3V0ZXMuICovXG5jb25zdCBNRU1PUllfVEhSRUFEX01VVEFUSU9OID0gL15cXC9tZW1vcnlcXC90aHJlYWRzXFwvW14vXSskL2k7XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2NoYXQveGAsIGAvbWVtb3J5L3RocmVhZHNgLCBgL21jcC8uLi5gKS4gSW4gYFwic2NvcGVkXCJgXG4gKiBtb2RlIHRoZSBhbGxvd2xpc3QgaXMgZGVsaWJlcmF0ZWx5IHRpZ2h0IC0gdGhlIGNoYXQgY2xpZW50IG9ubHkgZXZlclxuICogbmVlZHMgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHJlc291cmNlLXNjb3BlZCBtZW1vcnksXG4gKiB0aGlzIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUC4gVGhlIHJlbWFpbmluZ1xuICogYWRtaW4sIG11dGF0aW5nLCBhbmQgYnVsay1leHBvcnQgc3VyZmFjZSBzdGF5cyBkZW5pZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGUgcGx1Z2luJ3MgYC9yb3V0ZS8qYCBhZGRpdGlvbnMgdmFsaWRhdGUgdGhlaXIgb3duIGlucHV0cyBhbmQgdHJ1c3RlZFxuICAvLyBBcHBLaXQgcmVxdWVzdCBjb250ZXh0IGJlZm9yZSByZWFjaGluZyBwcm9kdWN0IGJlaGF2aW9yLlxuICBpZiAocCA9PT0gXCIvcm91dGVcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG9wdHMubWNwRW5hYmxlZCAmJiAocCA9PT0gXCIvbWNwXCIgfHwgcC5zdGFydHNXaXRoKFwiL21jcC9cIikpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbSA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfQ0hBVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgQUdFTlRfQ0hBVF9SVU4udGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9DSEFUX1JVTl9BQk9SVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgKEFHRU5UX01FVEFEQVRBLnRlc3QocCkgfHwgQUdFTlRfU1VTUEVOREVEX1JVTlMudGVzdChwKSkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiBNRU1PUllfUkVBRC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChtID09PSBcIlBBVENIXCIgfHwgbSA9PT0gXCJERUxFVEVcIikgJiYgTUVNT1JZX1RIUkVBRF9NVVRBVElPTi50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIHAgPT09IFwiL21lbW9yeS9tZXNzYWdlcy9kZWxldGVcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBLZWVwIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlcyBtb3VudC1yZWxhdGl2ZSB3aGVuIHRoZSBFeHByZXNzIHN1YmFwcCBpc1xuICogaG9zdGVkIHVuZGVyIEFwcEtpdCdzIGAvYXBpLzxwbHVnaW4+YCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgaXNDdXN0b21Sb3V0ZSA9XG4gICAgICByZXEucGF0aCA9PT0gXCIvY2hhdFwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL2NoYXQvXCIpIHx8XG4gICAgICByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9yb3V0ZS9cIik7XG4gICAgaWYgKCFpc0N1c3RvbVJvdXRlKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5wYXRoO1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluaXNoIGEgY2hhdCByZXF1ZXN0IHdoZW4gTWFzdHJhIHRocm93cyBiZWNhdXNlIHRoZSB3b3JrZmxvdyBpcyBub1xuICogbG9uZ2VyIHN1c3BlbmRlZC4gRHVwbGljYXRlIGFwcHJvdmUvcmVzdW1lIGFuZCBsYXRlIGBjb25zdW1lU3RyZWFtYFxuICogYm90aCBoaXQgdGhhdCBwYXRoOyB0aGUgY2xpZW50IGFscmVhZHkgaGFzIChvciB3aWxsIHJlbG9hZCkgdGhlXG4gKiBjb21wbGV0ZWQgdHVybi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFN0YWxlUmVzdW1lUmVjb3ZlcnkoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZShcbiAgICAoZXJyb3I6IHVua25vd24sIHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UsIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcihlcnJvcikpIHtcbiAgICAgICAgbmV4dChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci53YXJuKFwiaWdub3JlZCBzdGFsZSBtYXN0cmEgcmVzdW1lXCIsIHtcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLnN0YXR1cygyMDApO1xuICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcInRleHQvZXZlbnQtc3RyZWFtOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgICAgcmVzLnNldEhlYWRlcihcImNhY2hlLWNvbnRyb2xcIiwgXCJuby1jYWNoZVwiKTtcbiAgICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwic3RhcnRcIiB9KX1cXG5cXG5gKTtcbiAgICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwiZmluaXNoXCIgfSl9XFxuXFxuYCk7XG4gICAgICByZXMud3JpdGUoXCJkYXRhOiBbRE9ORV1cXG5cXG5cIik7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSxcbiAgKTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie-chat.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/request-context.ts","../src/rest.ts","../src/server.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/telemetry.ts","../src/trace-attributes.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/feedback-mode.ts","../src/filesystems.ts","../src/genie-chat.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/request-context.ts","../src/rest.ts","../src/server.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/telemetry.ts","../src/trace-attributes.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -35,21 +35,21 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@databricks/appkit": "0.81.0",
38
- "@dbx-tools/appkit": "^0.9.132",
39
- "@dbx-tools/cache": "^0.9.132",
40
- "@dbx-tools/core": "^0.9.132",
41
- "@dbx-tools/databricks": "^0.9.132",
42
- "@dbx-tools/fs": "^0.9.132",
43
- "@dbx-tools/genie": "^0.9.132",
44
- "@dbx-tools/model": "^0.9.132",
45
- "@dbx-tools/model-protocol": "^0.9.132",
46
- "@dbx-tools/path": "^0.9.132",
47
- "@dbx-tools/postgres": "^0.9.132",
48
- "@dbx-tools/shared-core": "^0.9.132",
49
- "@dbx-tools/shared-fs": "^0.9.132",
50
- "@dbx-tools/shared-genie": "^0.9.132",
51
- "@dbx-tools/shared-mastra": "^0.9.132",
52
- "@dbx-tools/shared-model": "^0.9.132",
38
+ "@dbx-tools/appkit": "^0.9.136",
39
+ "@dbx-tools/cache": "^0.9.136",
40
+ "@dbx-tools/core": "^0.9.136",
41
+ "@dbx-tools/databricks": "^0.9.136",
42
+ "@dbx-tools/fs": "^0.9.136",
43
+ "@dbx-tools/genie": "^0.9.136",
44
+ "@dbx-tools/model": "^0.9.136",
45
+ "@dbx-tools/model-protocol": "^0.9.136",
46
+ "@dbx-tools/path": "^0.9.136",
47
+ "@dbx-tools/postgres": "^0.9.136",
48
+ "@dbx-tools/shared-core": "^0.9.136",
49
+ "@dbx-tools/shared-fs": "^0.9.136",
50
+ "@dbx-tools/shared-genie": "^0.9.136",
51
+ "@dbx-tools/shared-mastra": "^0.9.136",
52
+ "@dbx-tools/shared-model": "^0.9.136",
53
53
  "@mastra/ai-sdk": "1.10.5",
54
54
  "@mastra/core": "1.71.0",
55
55
  "@mastra/express": "1.5.15",
@@ -108,6 +108,10 @@
108
108
  "types": "./lib/src/evaluation.d.ts",
109
109
  "default": "./lib/src/evaluation.js"
110
110
  },
111
+ "./feedback-mode": {
112
+ "types": "./lib/src/feedback-mode.d.ts",
113
+ "default": "./lib/src/feedback-mode.js"
114
+ },
111
115
  "./filesystems": {
112
116
  "types": "./lib/src/filesystems.d.ts",
113
117
  "default": "./lib/src/filesystems.js"
@@ -223,7 +227,7 @@
223
227
  "./package.json": "./package.json"
224
228
  }
225
229
  },
226
- "version": "0.9.132",
230
+ "version": "0.9.136",
227
231
  "types": "./lib/index.d.ts",
228
232
  "dbxToolsConfig": {
229
233
  "tags": [
@@ -260,6 +264,10 @@
260
264
  "types": "./lib/src/evaluation.d.ts",
261
265
  "default": "./lib/src/evaluation.js"
262
266
  },
267
+ "./feedback-mode": {
268
+ "types": "./lib/src/feedback-mode.d.ts",
269
+ "default": "./lib/src/feedback-mode.js"
270
+ },
263
271
  "./filesystems": {
264
272
  "types": "./lib/src/filesystems.d.ts",
265
273
  "default": "./lib/src/filesystems.js"
package/src/config.ts CHANGED
@@ -17,9 +17,11 @@
17
17
  import { getExecutionContext, type BasePluginConfig, type ConfigSchema } from "@databricks/appkit";
18
18
  import { appkit } from "@dbx-tools/appkit";
19
19
  import type { BrandContext } from "@dbx-tools/shared-core";
20
+ import type { FeedbackModeOption } from "@dbx-tools/shared-mastra/feedback";
20
21
  import type { AgentConfig } from "@mastra/core/agent";
21
22
  import type { RequestContext } from "@mastra/core/request-context";
22
23
  import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from "@mastra/core/request-context";
24
+ import type { AnyWorkflow } from "@mastra/core/workflows";
23
25
  import type {
24
26
  WorkspaceSandbox,
25
27
  WorkspaceSandboxResolver,
@@ -315,6 +317,12 @@ export interface MastraPluginConfig extends BasePluginConfig {
315
317
  * library; for per-agent tools set `agents[id].tools` instead.
316
318
  */
317
319
  tools?: MastraTools;
320
+ /**
321
+ * Code-defined Mastra workflows registered on the hosted instance.
322
+ * Deferred sibling plugins may also register through the plugin export
323
+ * before the instance is built.
324
+ */
325
+ workflows?: Record<string, AnyWorkflow>;
318
326
  /**
319
327
  * Agent id used when the client doesn't specify one (the bare,
320
328
  * un-suffixed history / suggestions routes resolve to it).
@@ -509,24 +517,11 @@ export interface MastraPluginConfig extends BasePluginConfig {
509
517
  */
510
518
  observability?: boolean;
511
519
  /**
512
- * Log user feedback (thumbs up/down + freeform comments) to MLflow as
513
- * trace assessments, and surface the feedback controls in the chat UI.
514
- *
515
- * - `undefined` (default, auto): enabled only when MLflow tracing is
516
- * wired - an OTLP exporter endpoint is set and an MLflow experiment
517
- * is named (the same signals the observability pipeline needs to
518
- * ship traces to MLflow). Otherwise off, since there'd be no trace
519
- * to attach feedback to.
520
- * - `true`: force on. Requires `MLFLOW_EXPERIMENT_ID` or
521
- * `MLFLOW_EXPERIMENT_NAME`; app startup fails when neither is configured.
522
- * Use this when trace export is wired in a way the auto-probe does not
523
- * recognize.
524
- * - `false`: force off. No trace-id header, no feedback route, no UI.
525
- *
526
- * Feedback attaches to a turn's MLflow trace via the OpenTelemetry
527
- * trace id the server stamps on each response; see `mlflow.ts`.
520
+ * Feedback destination. `auto` prefers Genie when Genie Agent Mode is
521
+ * available, otherwise MLflow when tracing is configured, otherwise none.
522
+ * Explicit `genie` or `mlflow` fails startup when unavailable.
528
523
  */
529
- feedback?: boolean;
524
+ feedbackMode?: FeedbackModeOption;
530
525
  /**
531
526
  * Expose the plugin's agents (and optionally tools) as a Mastra MCP
532
527
  * server so external MCP clients - Claude Desktop, Cursor, the Mastra
@@ -800,10 +795,11 @@ export const MASTRA_CONFIG_SCHEMA: ConfigSchema = {
800
795
  description:
801
796
  "Bridge Mastra spans into AppKit's OTel pipeline. Defaults to on only when OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_TRACES_ENDPOINT is set.",
802
797
  },
803
- feedback: {
804
- type: "boolean",
798
+ feedbackMode: {
799
+ type: "string",
800
+ enum: ["auto", "genie", "mlflow", "none"],
805
801
  description:
806
- "Log thumbs / comment assessments to MLflow and surface the feedback controls. Defaults to on only when an OTLP endpoint and MLFLOW_EXPERIMENT_ID or MLFLOW_EXPERIMENT_NAME are set. Explicit true fails startup unless an experiment id or name is configured.",
802
+ "Feedback destination. Auto prefers Genie in Genie Agent Mode, otherwise MLflow when configured, otherwise none. Explicit unavailable modes fail startup.",
807
803
  },
808
804
  mcp: {
809
805
  type: ["boolean", "object"],
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Feedback destination resolution.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ import { ConfigurationError } from "@databricks/appkit";
8
+ import type { FeedbackMode, FeedbackModeOption } from "@dbx-tools/shared-mastra/feedback";
9
+
10
+ /** Runtime availability used by automatic feedback selection. */
11
+ export interface FeedbackAvailability {
12
+ /** Genie Agent Mode has at least one configured space. */
13
+ genie: boolean;
14
+ /** MLflow tracing has a configured experiment and exporter. */
15
+ mlflow: boolean;
16
+ }
17
+
18
+ /** Resolve auto feedback or fail an explicitly unavailable destination. */
19
+ export function resolveFeedbackMode(
20
+ configured: FeedbackModeOption | undefined,
21
+ availability: FeedbackAvailability,
22
+ ): FeedbackMode {
23
+ const mode = configured ?? "auto";
24
+ if (mode === "none") return "none";
25
+ if (mode === "auto") {
26
+ if (availability.genie) return "genie";
27
+ if (availability.mlflow) return "mlflow";
28
+ return "none";
29
+ }
30
+ if (availability[mode]) return mode;
31
+ throw new ConfigurationError(
32
+ `mastra: feedbackMode "${mode}" is unavailable in this configuration`,
33
+ { context: { feedbackMode: mode } },
34
+ );
35
+ }