@dbx-tools/appkit-mastra 0.9.154 → 0.9.158

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/index.ts +32 -24
  2. package/lib/index.d.ts +32 -24
  3. package/lib/index.js +32 -23
  4. package/lib/src/agents.d.ts +5 -6
  5. package/lib/src/agents.js +12 -15
  6. package/lib/src/chart.js +33 -33
  7. package/lib/src/chat.js +10 -13
  8. package/lib/src/config.d.ts +6 -7
  9. package/lib/src/config.js +2 -2
  10. package/lib/src/evaluation.js +7 -9
  11. package/lib/src/feedback-mode.d.ts +1 -1
  12. package/lib/src/feedback-mode.js +1 -1
  13. package/lib/src/filesystems.js +6 -6
  14. package/lib/src/follow-up-suggestions.js +10 -10
  15. package/lib/src/genie-chat.js +27 -29
  16. package/lib/src/genie.d.ts +2 -2
  17. package/lib/src/genie.js +29 -29
  18. package/lib/src/identity.d.ts +3 -30
  19. package/lib/src/identity.js +2 -27
  20. package/lib/src/memory.js +6 -6
  21. package/lib/src/mlflow.d.ts +4 -4
  22. package/lib/src/mlflow.js +15 -18
  23. package/lib/src/model.d.ts +3 -3
  24. package/lib/src/model.js +6 -6
  25. package/lib/src/monty-sandbox.js +8 -8
  26. package/lib/src/observability.d.ts +6 -5
  27. package/lib/src/observability.js +8 -6
  28. package/lib/src/plugin.d.ts +1 -1
  29. package/lib/src/plugin.js +48 -50
  30. package/lib/src/remote-skills.d.ts +3 -4
  31. package/lib/src/remote-skills.js +46 -46
  32. package/lib/src/rest.d.ts +2 -2
  33. package/lib/src/rest.js +3 -3
  34. package/lib/src/server.js +17 -20
  35. package/lib/src/serving.js +10 -11
  36. package/lib/src/statement.js +7 -7
  37. package/lib/src/storage-schema.js +4 -4
  38. package/lib/src/summarize.js +5 -5
  39. package/lib/src/telemetry.d.ts +0 -6
  40. package/lib/src/telemetry.js +34 -41
  41. package/lib/src/validation.js +3 -4
  42. package/lib/src/workspaces.d.ts +2 -2
  43. package/lib/src/workspaces.js +34 -36
  44. package/lib/src/writer.d.ts +2 -2
  45. package/lib/src/writer.js +3 -3
  46. package/package.json +17 -305
  47. package/src/agents.ts +27 -21
  48. package/src/chart.ts +43 -37
  49. package/src/chat.ts +10 -12
  50. package/src/config.ts +6 -7
  51. package/src/evaluation.ts +6 -8
  52. package/src/feedback-mode.ts +1 -1
  53. package/src/filesystems.ts +5 -5
  54. package/src/follow-up-suggestions.ts +9 -9
  55. package/src/genie-chat.ts +32 -31
  56. package/src/genie.ts +29 -29
  57. package/src/identity.ts +3 -38
  58. package/src/memory.ts +5 -5
  59. package/src/mlflow.ts +21 -21
  60. package/src/model.ts +7 -7
  61. package/src/monty-sandbox.ts +7 -7
  62. package/src/observability.ts +8 -6
  63. package/src/plugin.ts +75 -61
  64. package/src/remote-skills.ts +63 -55
  65. package/src/rest.ts +4 -4
  66. package/src/server.ts +32 -20
  67. package/src/serving.ts +14 -11
  68. package/src/statement.ts +10 -6
  69. package/src/storage-schema.ts +3 -3
  70. package/src/summarize.ts +4 -4
  71. package/src/telemetry.ts +49 -55
  72. package/src/validation.ts +2 -3
  73. package/src/workspaces.ts +52 -42
  74. package/src/writer.ts +3 -3
@@ -50,38 +50,11 @@
50
50
  *
51
51
  * @module
52
52
  */
53
- import { identity } from "@dbx-tools/appkit";
54
- /** Identity a chat turn's Databricks calls run as. See the module docs. */
55
- export type MastraIdentityMode = identity.IdentityMode;
53
+ import { type IdentityMode } from "@dbx-tools/appkit";
56
54
  /** Environment fallback for `config.genieIdentity`. */
57
55
  export declare const IDENTITY_ENV = "MASTRA_GENIE_IDENTITY";
58
- /** Every accepted {@link MastraIdentityMode}. */
59
- export declare const IDENTITY_MODES: readonly identity.IdentityMode[];
60
- /**
61
- * Default mode. `"user"` keeps OBO the only identity unless an app opts in, so
62
- * adopting this option can never silently widen an existing app's data access.
63
- */
64
- export declare const DEFAULT_IDENTITY_MODE: identity.IdentityMode;
65
- /** Header Databricks Apps forward the signed-in user's id on. */
66
- export declare const USER_ID_HEADER = "x-forwarded-user";
67
- /** Header Databricks Apps forward the signed-in user's email on. */
68
- export declare const USER_EMAIL_HEADER = "x-forwarded-email";
69
56
  /**
70
57
  * Resolve the configured mode: explicit plugin config, then {@link IDENTITY_ENV},
71
- * then {@link DEFAULT_IDENTITY_MODE}. An unrecognized value throws.
72
- */
73
- export declare function resolveIdentityMode(configured: string | undefined): MastraIdentityMode;
74
- /**
75
- * The forwarded user id on `req`, or `undefined`. Used to attribute a turn to
76
- * the real caller when the Databricks client is the app SP but memory / cache /
77
- * traces must still key off the user.
78
- */
79
- export declare const requestUserId: typeof identity.requestUserId;
80
- /** The forwarded user email on `req`, or `undefined`. */
81
- export declare const requestUserEmail: typeof identity.requestUserEmail;
82
- /**
83
- * Whether this request should run its Databricks calls as the app service
84
- * principal rather than OBO - `"service-principal"` always, `"user"` never, and
85
- * `"auto"` only when the request carries no OBO token for AppKit to use.
58
+ * then AppKit's default identity mode. An unrecognized value throws.
86
59
  */
87
- export declare const useServicePrincipal: typeof identity.useServicePrincipal;
60
+ export declare function resolveIdentityMode(configured: string | undefined): IdentityMode;
@@ -53,36 +53,11 @@
53
53
  import { identity } from "@dbx-tools/appkit";
54
54
  /** Environment fallback for `config.genieIdentity`. */
55
55
  export const IDENTITY_ENV = "MASTRA_GENIE_IDENTITY";
56
- /** Every accepted {@link MastraIdentityMode}. */
57
- export const IDENTITY_MODES = identity.IDENTITY_MODES;
58
- /**
59
- * Default mode. `"user"` keeps OBO the only identity unless an app opts in, so
60
- * adopting this option can never silently widen an existing app's data access.
61
- */
62
- export const DEFAULT_IDENTITY_MODE = identity.DEFAULT_IDENTITY_MODE;
63
- /** Header Databricks Apps forward the signed-in user's id on. */
64
- export const USER_ID_HEADER = identity.USER_ID_HEADER;
65
- /** Header Databricks Apps forward the signed-in user's email on. */
66
- export const USER_EMAIL_HEADER = identity.USER_EMAIL_HEADER;
67
56
  /**
68
57
  * Resolve the configured mode: explicit plugin config, then {@link IDENTITY_ENV},
69
- * then {@link DEFAULT_IDENTITY_MODE}. An unrecognized value throws.
58
+ * then AppKit's default identity mode. An unrecognized value throws.
70
59
  */
71
60
  export function resolveIdentityMode(configured) {
72
61
  return identity.resolveIdentityMode(configured, IDENTITY_ENV, "genieIdentity");
73
62
  }
74
- /**
75
- * The forwarded user id on `req`, or `undefined`. Used to attribute a turn to
76
- * the real caller when the Databricks client is the app SP but memory / cache /
77
- * traces must still key off the user.
78
- */
79
- export const requestUserId = identity.requestUserId;
80
- /** The forwarded user email on `req`, or `undefined`. */
81
- export const requestUserEmail = identity.requestUserEmail;
82
- /**
83
- * Whether this request should run its Databricks calls as the app service
84
- * principal rather than OBO - `"service-principal"` always, `"user"` never, and
85
- * `"auto"` only when the request carries no OBO token for AppKit to use.
86
- */
87
- export const useServicePrincipal = identity.useServicePrincipal;
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUs3Qyx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDO0FBRXBELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUV0RDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7QUFFcEUsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0FBRXRELG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7QUFFNUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQThCO0lBQ2hFLE9BQU8sUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztBQUVwRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgYSBjaGF0IHR1cm4ncyB3b3Jrc3BhY2UgY2FsbHMgcnVuIGFzLlxuICpcbiAqIEV2ZXJ5IERhdGFicmlja3MgY2FsbCBhIHR1cm4gbWFrZXMgLSB0aGUgYC9zZXJ2aW5nLWVuZHBvaW50c2AgY2F0YWxvZ3VlIHRoZVxuICogbW9kZWwgcGlja2VyIHJlYWRzLCBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50XG4gKiBFeGVjdXRpb24gZmV0Y2ggYmVoaW5kIGEgYFtkYXRhOjxpZD5dYCBlbWJlZCAtIGdvZXMgdGhyb3VnaCB0aGUgd29ya3NwYWNlXG4gKiBjbGllbnQgb24gdGhlIGFtYmllbnQgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiBUaGF0IGNvbnRleHQgaXMgdXNlci1zY29wZWRcbiAqIChPQk8pIHdoZW5ldmVyIHRoZSBwbHVnaW4gZW50ZXJzIGBhc1VzZXIocmVxKWAgYW5kIHRoZSBhcHAncyBzZXJ2aWNlIHByaW5jaXBhbFxuICogb3RoZXJ3aXNlLCBzbyBPTkUgZGVjaXNpb24gLSBkbyB3ZSBlbnRlciB0aGF0IHNjb3BlIGZvciB0aGlzIHJlcXVlc3QgLSBtb3Zlc1xuICogZXZlcnkgY2FsbCBzaXRlIHRvZ2V0aGVyLlxuICpcbiAqIFRoZSBkZWNpc2lvbiBpdHNlbGYgaXMgTk9UIE1hc3RyYS1zcGVjaWZpYyAoYXV0aGVudGljYXRlZCB3ZWJob29rcyBhbmQgdGhlXG4gKiB0dW5uZWwgZ2F0ZSBmYWNlIGl0IHRvbyksIHNvIGl0IGxpdmVzIGluIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgaWRlbnRpdHlgXG4gKiBtb2R1bGUgLSB3aGljaCBhbHNvIGRvY3VtZW50cyB0aGUgbWVhc3VyZWQgQXBwS2l0IGJlaGF2aW9yIHRoYXQgbWFrZXNcbiAqIGBcImF1dG9cImAgbmVjZXNzYXJ5LiBUaGlzIG1vZHVsZSBpcyB0aGUgTWFzdHJhLWZhY2luZyBiaW5kaW5nOiB0aGUgcGx1Z2luJ3Mgb3duXG4gKiBjb25maWcgZmllbGQgYW5kIGVudiB2YXIsIHJlLWV4cG9ydGluZyB0aGUgc2hhcmVkIHZvY2FidWxhcnkgc28gYSBjb25zdW1lclxuICogaW1wb3J0aW5nIGBAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFgIG5lZWRzIG5vIHNlY29uZCBpbXBvcnQuXG4gKlxuICogV2h5IHRoZSBvcHRpb24gZXhpc3RzOiBPQk8gcmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBhIG1lbWJlciBvZiB0aGVcbiAqIFdPUktTUEFDRSwgbm90IG1lcmVseSBvZiB0aGUgRGF0YWJyaWNrcyBhY2NvdW50LiBBbiBhcHAgc2hhcmVkIHdpdGggYW5cbiAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIHRoZXJlZm9yZSBiZSBvcGVuZWQgYnkgc29tZW9uZSB3aG9zZSBPQk8gdG9rZW4gaXNcbiAqIHBlcmZlY3RseSB2YWxpZCBidXQgd2hvc2UgZXZlcnkgd29ya3NwYWNlIGNhbGwgZmFpbHMgd2l0aCBgVW5hdXRob3JpemVkXG4gKiBhY2Nlc3MgdG8gT3JnOiA8d29ya3NwYWNlLWlkPmAsIGFuZCBncmFudGluZyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCBpcyBub3RcbiAqIGFsd2F5cyBhdmFpbGFibGUgLSBhIHdvcmtzcGFjZSBjYXBzIG1lbWJlcnNoaXAgZmFyIGJlbG93IHRoZSBzaXplIG9mIGEgbGFyZ2VcbiAqIGFjY291bnQncyB1c2VyIGdyb3VwLiBUaGUgYXBwJ3Mgb3duIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIEdlbmllXG4gKiAvIHdhcmVob3VzZSAvIHNlcnZpbmcgLyBVbml0eSBDYXRhbG9nIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLCBhbmRcbiAqIHdvcmtzIGZvciBldmVyeSBjYWxsZXIuXG4gKlxuICogVGhlIG1vZGVzLCBmcm9tIGBjb25maWcuZ2VuaWVJZGVudGl0eWAgKGVudjoge0BsaW5rIElERU5USVRZX0VOVn0pOlxuICpcbiAqICAgLSBgXCJ1c2VyXCJgIChkZWZhdWx0KTogYWx3YXlzIE9CTy4gQ2FsbHMgYXJlIGF0dHJpYnV0ZWQgcGVyIHVzZXIgYW5kIEdlbmllIC9cbiAqICAgICBVbml0eSBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW5ldmVyIGV2ZXJ5IGNhbGxlciBpc1xuICogICAgIGEgd29ya3NwYWNlIG1lbWJlci4gVGhpcyBpcyB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvciwgc28gdGhlIG9wdGlvbiBpc1xuICogICAgIHB1cmVseSBhZGRpdGl2ZSAtIGFuIGFwcCB0aGF0IG5ldmVyIHNldHMgaXQgaXMgdW5jaGFuZ2VkLlxuICogICAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgOiBhbHdheXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbC4gTmVlZHMgbm8gT0JPXG4gKiAgICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCwgYXQgdGhlIGNvc3Qgb2ZcbiAqICAgICBwZXItdXNlciBhdHRyaWJ1dGlvbiBpbiBHZW5pZSAvIFVuaXR5IENhdGFsb2cuXG4gKiAgIC0gYFwiYXV0b1wiYDogT0JPIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBhbiBPQk8gdG9rZW4sIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICogICAgIHdoZW4gaXQgZG9lcyBub3QuIFRoZSBtb2RlIGZvciBhbiBhcHAgdGhhdCBzZXJ2ZXMgQk9USCB0aGUgcGxhdGZvcm0gZnJvbnRcbiAqICAgICBkb29yIGFuZCBhIGRvb3Igd2l0aCBubyBPQk8gdG9rZW4gdG8gZm9yd2FyZCAoYSBgQGRieC10b29scy90dW5uZWxgXG4gKiAgICAgZ2F0ZSBvciBhbiBhdXRoZW50aWNhdGVkIHdlYmhvb2spLCBzaW5jZSBhIHNpbmdsZSBjb250YWluZXIgc2VydmVzIGJvdGhcbiAqICAgICBhdCBvbmNlLlxuICpcbiAqIFdoYXQgdGhlIHNlcnZpY2UtcHJpbmNpcGFsIHBhdGggZG9lcyBOT1QgY2hhbmdlIGlzIFdITyB0aGUgdHVybiBiZWxvbmdzIHRvLlxuICogVGhlIG1lbW9yeSB0aHJlYWQncyBgcmVzb3VyY2VJZGAsIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0aGUgdXNlclxuICogbWV0YWRhdGEgb24gdHJhY2VzIHN0aWxsIGNvbWUgZnJvbSB0aGUgZm9yd2FyZGVkIHJlcXVlc3QgaGVhZGVycywgc28gdHdvXG4gKiBhY2NvdW50IHVzZXJzIHNoYXJpbmcgdGhlIHNlcnZpY2UgcHJpbmNpcGFsJ3MgZGF0YSBhY2Nlc3Mgc3RpbGwgZ2V0IHNlcGFyYXRlXG4gKiBjb252ZXJzYXRpb25zIGFuZCBjYW5ub3QgcmVhZCBlYWNoIG90aGVyJ3MgdGhyZWFkcyBvciBjYWNoZWQgY2hhcnRzLiBPbmx5IHRoZVxuICogRGF0YWJyaWNrcyBjcmVkZW50aWFsIGlzIHNoYXJlZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaWRlbnRpdHkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcblxuLyoqIElkZW50aXR5IGEgY2hhdCB0dXJuJ3MgRGF0YWJyaWNrcyBjYWxscyBydW4gYXMuIFNlZSB0aGUgbW9kdWxlIGRvY3MuICovXG5leHBvcnQgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgPSBpZGVudGl0eS5JZGVudGl0eU1vZGU7XG5cbi8qKiBFbnZpcm9ubWVudCBmYWxsYmFjayBmb3IgYGNvbmZpZy5nZW5pZUlkZW50aXR5YC4gKi9cbmV4cG9ydCBjb25zdCBJREVOVElUWV9FTlYgPSBcIk1BU1RSQV9HRU5JRV9JREVOVElUWVwiO1xuXG4vKiogRXZlcnkgYWNjZXB0ZWQge0BsaW5rIE1hc3RyYUlkZW50aXR5TW9kZX0uICovXG5leHBvcnQgY29uc3QgSURFTlRJVFlfTU9ERVMgPSBpZGVudGl0eS5JREVOVElUWV9NT0RFUztcblxuLyoqXG4gKiBEZWZhdWx0IG1vZGUuIGBcInVzZXJcImAga2VlcHMgT0JPIHRoZSBvbmx5IGlkZW50aXR5IHVubGVzcyBhbiBhcHAgb3B0cyBpbiwgc29cbiAqIGFkb3B0aW5nIHRoaXMgb3B0aW9uIGNhbiBuZXZlciBzaWxlbnRseSB3aWRlbiBhbiBleGlzdGluZyBhcHAncyBkYXRhIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSURFTlRJVFlfTU9ERSA9IGlkZW50aXR5LkRFRkFVTFRfSURFTlRJVFlfTU9ERTtcblxuLyoqIEhlYWRlciBEYXRhYnJpY2tzIEFwcHMgZm9yd2FyZCB0aGUgc2lnbmVkLWluIHVzZXIncyBpZCBvbi4gKi9cbmV4cG9ydCBjb25zdCBVU0VSX0lEX0hFQURFUiA9IGlkZW50aXR5LlVTRVJfSURfSEVBREVSO1xuXG4vKiogSGVhZGVyIERhdGFicmlja3MgQXBwcyBmb3J3YXJkIHRoZSBzaWduZWQtaW4gdXNlcidzIGVtYWlsIG9uLiAqL1xuZXhwb3J0IGNvbnN0IFVTRVJfRU1BSUxfSEVBREVSID0gaWRlbnRpdHkuVVNFUl9FTUFJTF9IRUFERVI7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgY29uZmlndXJlZCBtb2RlOiBleHBsaWNpdCBwbHVnaW4gY29uZmlnLCB0aGVuIHtAbGluayBJREVOVElUWV9FTlZ9LFxuICogdGhlbiB7QGxpbmsgREVGQVVMVF9JREVOVElUWV9NT0RFfS4gQW4gdW5yZWNvZ25pemVkIHZhbHVlIHRocm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogTWFzdHJhSWRlbnRpdHlNb2RlIHtcbiAgcmV0dXJuIGlkZW50aXR5LnJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZCwgSURFTlRJVFlfRU5WLCBcImdlbmllSWRlbnRpdHlcIik7XG59XG5cbi8qKlxuICogVGhlIGZvcndhcmRlZCB1c2VyIGlkIG9uIGByZXFgLCBvciBgdW5kZWZpbmVkYC4gVXNlZCB0byBhdHRyaWJ1dGUgYSB0dXJuIHRvXG4gKiB0aGUgcmVhbCBjYWxsZXIgd2hlbiB0aGUgRGF0YWJyaWNrcyBjbGllbnQgaXMgdGhlIGFwcCBTUCBidXQgbWVtb3J5IC8gY2FjaGUgL1xuICogdHJhY2VzIG11c3Qgc3RpbGwga2V5IG9mZiB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcXVlc3RVc2VySWQgPSBpZGVudGl0eS5yZXF1ZXN0VXNlcklkO1xuXG4vKiogVGhlIGZvcndhcmRlZCB1c2VyIGVtYWlsIG9uIGByZXFgLCBvciBgdW5kZWZpbmVkYC4gKi9cbmV4cG9ydCBjb25zdCByZXF1ZXN0VXNlckVtYWlsID0gaWRlbnRpdHkucmVxdWVzdFVzZXJFbWFpbDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcmVxdWVzdCBzaG91bGQgcnVuIGl0cyBEYXRhYnJpY2tzIGNhbGxzIGFzIHRoZSBhcHAgc2VydmljZVxuICogcHJpbmNpcGFsIHJhdGhlciB0aGFuIE9CTyAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgIGFsd2F5cywgYFwidXNlclwiYCBuZXZlciwgYW5kXG4gKiBgXCJhdXRvXCJgIG9ubHkgd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIG5vIE9CTyB0b2tlbiBmb3IgQXBwS2l0IHRvIHVzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVNlcnZpY2VQcmluY2lwYWwgPSBpZGVudGl0eS51c2VTZXJ2aWNlUHJpbmNpcGFsO1xuIl19
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQXFCLE1BQU0sbUJBQW1CLENBQUM7QUFFaEUsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQztBQUVwRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBOEI7SUFDaEUsT0FBTyxRQUFRLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IGEgY2hhdCB0dXJuJ3Mgd29ya3NwYWNlIGNhbGxzIHJ1biBhcy5cbiAqXG4gKiBFdmVyeSBEYXRhYnJpY2tzIGNhbGwgYSB0dXJuIG1ha2VzIC0gdGhlIGAvc2VydmluZy1lbmRwb2ludHNgIGNhdGFsb2d1ZSB0aGVcbiAqIG1vZGVsIHBpY2tlciByZWFkcywgR2VuaWUgc3VnZ2VzdGlvbnMsIGBhc2tfZ2VuaWVgLCBhbmQgdGhlIFN0YXRlbWVudFxuICogRXhlY3V0aW9uIGZldGNoIGJlaGluZCBhIGBbZGF0YTo8aWQ+XWAgZW1iZWQgLSBnb2VzIHRocm91Z2ggdGhlIHdvcmtzcGFjZVxuICogY2xpZW50IG9uIHRoZSBhbWJpZW50IEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gVGhhdCBjb250ZXh0IGlzIHVzZXItc2NvcGVkXG4gKiAoT0JPKSB3aGVuZXZlciB0aGUgcGx1Z2luIGVudGVycyBgYXNVc2VyKHJlcSlgIGFuZCB0aGUgYXBwJ3Mgc2VydmljZSBwcmluY2lwYWxcbiAqIG90aGVyd2lzZSwgc28gT05FIGRlY2lzaW9uIC0gZG8gd2UgZW50ZXIgdGhhdCBzY29wZSBmb3IgdGhpcyByZXF1ZXN0IC0gbW92ZXNcbiAqIGV2ZXJ5IGNhbGwgc2l0ZSB0b2dldGhlci5cbiAqXG4gKiBUaGUgZGVjaXNpb24gaXRzZWxmIGlzIE5PVCBNYXN0cmEtc3BlY2lmaWMgKGF1dGhlbnRpY2F0ZWQgd2ViaG9va3MgYW5kIHRoZVxuICogdHVubmVsIGdhdGUgZmFjZSBpdCB0b28pLCBzbyBpdCBsaXZlcyBpbiBgQGRieC10b29scy9hcHBraXRgJ3MgYGlkZW50aXR5YFxuICogbW9kdWxlIC0gd2hpY2ggYWxzbyBkb2N1bWVudHMgdGhlIG1lYXN1cmVkIEFwcEtpdCBiZWhhdmlvciB0aGF0IG1ha2VzXG4gKiBgXCJhdXRvXCJgIG5lY2Vzc2FyeS4gVGhpcyBtb2R1bGUgaXMgdGhlIE1hc3RyYS1mYWNpbmcgYmluZGluZzogdGhlIHBsdWdpbidzIG93blxuICogY29uZmlnIGZpZWxkIGFuZCBlbnYgdmFyLCByZS1leHBvcnRpbmcgdGhlIHNoYXJlZCB2b2NhYnVsYXJ5IHNvIGEgY29uc3VtZXJcbiAqIGltcG9ydGluZyBgQGRieC10b29scy9hcHBraXQtbWFzdHJhYCBuZWVkcyBubyBzZWNvbmQgaW1wb3J0LlxuICpcbiAqIFdoeSB0aGUgb3B0aW9uIGV4aXN0czogT0JPIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBtZW1iZXIgb2YgdGhlXG4gKiBXT1JLU1BBQ0UsIG5vdCBtZXJlbHkgb2YgdGhlIERhdGFicmlja3MgYWNjb3VudC4gQW4gYXBwIHNoYXJlZCB3aXRoIGFuXG4gKiBhY2NvdW50LWxldmVsIGdyb3VwIGNhbiB0aGVyZWZvcmUgYmUgb3BlbmVkIGJ5IHNvbWVvbmUgd2hvc2UgT0JPIHRva2VuIGlzXG4gKiBwZXJmZWN0bHkgdmFsaWQgYnV0IHdob3NlIGV2ZXJ5IHdvcmtzcGFjZSBjYWxsIGZhaWxzIHdpdGggYFVuYXV0aG9yaXplZFxuICogYWNjZXNzIHRvIE9yZzogPHdvcmtzcGFjZS1pZD5gLCBhbmQgZ3JhbnRpbmcgd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgbm90XG4gKiBhbHdheXMgYXZhaWxhYmxlIC0gYSB3b3Jrc3BhY2UgY2FwcyBtZW1iZXJzaGlwIGZhciBiZWxvdyB0aGUgc2l6ZSBvZiBhIGxhcmdlXG4gKiBhY2NvdW50J3MgdXNlciBncm91cC4gVGhlIGFwcCdzIG93biBzZXJ2aWNlIHByaW5jaXBhbCBhbHJlYWR5IGhvbGRzIHRoZSBHZW5pZVxuICogLyB3YXJlaG91c2UgLyBzZXJ2aW5nIC8gVW5pdHkgQ2F0YWxvZyBncmFudHMgdGhlIGFwcCB3YXMgZGVwbG95ZWQgd2l0aCwgYW5kXG4gKiB3b3JrcyBmb3IgZXZlcnkgY2FsbGVyLlxuICpcbiAqIFRoZSBtb2RlcywgZnJvbSBgY29uZmlnLmdlbmllSWRlbnRpdHlgIChlbnY6IHtAbGluayBJREVOVElUWV9FTlZ9KTpcbiAqXG4gKiAgIC0gYFwidXNlclwiYCAoZGVmYXVsdCk6IGFsd2F5cyBPQk8uIENhbGxzIGFyZSBhdHRyaWJ1dGVkIHBlciB1c2VyIGFuZCBHZW5pZSAvXG4gKiAgICAgVW5pdHkgQ2F0YWxvZyByb3cgZmlsdGVycyBhcHBseSBwZXIgdXNlci4gQ29ycmVjdCB3aGVuZXZlciBldmVyeSBjYWxsZXIgaXNcbiAqICAgICBhIHdvcmtzcGFjZSBtZW1iZXIuIFRoaXMgaXMgdGhlIGhpc3RvcmljYWwgYmVoYXZpb3IsIHNvIHRoZSBvcHRpb24gaXNcbiAqICAgICBwdXJlbHkgYWRkaXRpdmUgLSBhbiBhcHAgdGhhdCBuZXZlciBzZXRzIGl0IGlzIHVuY2hhbmdlZC5cbiAqICAgLSBgXCJzZXJ2aWNlLXByaW5jaXBhbFwiYDogYWx3YXlzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwuIE5lZWRzIG5vIE9CT1xuICogICAgIHNjb3BlcyBhbmQgd29ya3MgZm9yIGFueSBjYWxsZXIgd2hvIGNhbiBvcGVuIHRoZSBhcHAsIGF0IHRoZSBjb3N0IG9mXG4gKiAgICAgcGVyLXVzZXIgYXR0cmlidXRpb24gaW4gR2VuaWUgLyBVbml0eSBDYXRhbG9nLlxuICogICAtIGBcImF1dG9cImA6IE9CTyB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgYW4gT0JPIHRva2VuLCB0aGUgc2VydmljZSBwcmluY2lwYWxcbiAqICAgICB3aGVuIGl0IGRvZXMgbm90LiBUaGUgbW9kZSBmb3IgYW4gYXBwIHRoYXQgc2VydmVzIEJPVEggdGhlIHBsYXRmb3JtIGZyb250XG4gKiAgICAgZG9vciBhbmQgYSBkb29yIHdpdGggbm8gT0JPIHRva2VuIHRvIGZvcndhcmQgKGEgYEBkYngtdG9vbHMvdHVubmVsYFxuICogICAgIGdhdGUgb3IgYW4gYXV0aGVudGljYXRlZCB3ZWJob29rKSwgc2luY2UgYSBzaW5nbGUgY29udGFpbmVyIHNlcnZlcyBib3RoXG4gKiAgICAgYXQgb25jZS5cbiAqXG4gKiBXaGF0IHRoZSBzZXJ2aWNlLXByaW5jaXBhbCBwYXRoIGRvZXMgTk9UIGNoYW5nZSBpcyBXSE8gdGhlIHR1cm4gYmVsb25ncyB0by5cbiAqIFRoZSBtZW1vcnkgdGhyZWFkJ3MgYHJlc291cmNlSWRgLCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdGhlIHVzZXJcbiAqIG1ldGFkYXRhIG9uIHRyYWNlcyBzdGlsbCBjb21lIGZyb20gdGhlIGZvcndhcmRlZCByZXF1ZXN0IGhlYWRlcnMsIHNvIHR3b1xuICogYWNjb3VudCB1c2VycyBzaGFyaW5nIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCdzIGRhdGEgYWNjZXNzIHN0aWxsIGdldCBzZXBhcmF0ZVxuICogY29udmVyc2F0aW9ucyBhbmQgY2Fubm90IHJlYWQgZWFjaCBvdGhlcidzIHRocmVhZHMgb3IgY2FjaGVkIGNoYXJ0cy4gT25seSB0aGVcbiAqIERhdGFicmlja3MgY3JlZGVudGlhbCBpcyBzaGFyZWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGlkZW50aXR5LCB0eXBlIElkZW50aXR5TW9kZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuXG4vKiogRW52aXJvbm1lbnQgZmFsbGJhY2sgZm9yIGBjb25maWcuZ2VuaWVJZGVudGl0eWAuICovXG5leHBvcnQgY29uc3QgSURFTlRJVFlfRU5WID0gXCJNQVNUUkFfR0VOSUVfSURFTlRJVFlcIjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjb25maWd1cmVkIG1vZGU6IGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4ge0BsaW5rIElERU5USVRZX0VOVn0sXG4gKiB0aGVuIEFwcEtpdCdzIGRlZmF1bHQgaWRlbnRpdHkgbW9kZS4gQW4gdW5yZWNvZ25pemVkIHZhbHVlIHRocm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogSWRlbnRpdHlNb2RlIHtcbiAgcmV0dXJuIGlkZW50aXR5LnJlc29sdmVJZGVudGl0eU1vZGUoY29uZmlndXJlZCwgSURFTlRJVFlfRU5WLCBcImdlbmllSWRlbnRpdHlcIik7XG59XG4iXX0=
package/lib/src/memory.js CHANGED
@@ -31,8 +31,8 @@
31
31
  *
32
32
  * @module
33
33
  */
34
- import { migration as appkitMigration } from "@dbx-tools/appkit";
35
- import { hash, log } from "@dbx-tools/shared-core";
34
+ import { handleOwnershipMigrationError } from "@dbx-tools/appkit";
35
+ import { log, id } from "@dbx-tools/shared-core";
36
36
  import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, } from "@mastra/core/request-context";
37
37
  import { fastembed } from "@mastra/fastembed";
38
38
  import { Memory } from "@mastra/memory";
@@ -87,7 +87,7 @@ export function withSoftStorageInit(store) {
87
87
  await originalInit();
88
88
  }
89
89
  catch (err) {
90
- if (!appkitMigration.handleOwnershipMigrationError(err, {
90
+ if (!handleOwnershipMigrationError(err, {
91
91
  scope: "mastra-storage",
92
92
  logger,
93
93
  event: "mastra storage migration failed",
@@ -298,7 +298,7 @@ export class MemoryBuilder {
298
298
  */
299
299
  function buildSharedPgVector(pool) {
300
300
  const vector = new PgVector({
301
- id: `pg${hash.id()}`,
301
+ id: `pg${id()}`,
302
302
  // Keep the recall index out of `public`: on a Lakebase database the app
303
303
  // service principal has no CREATE on `public` (PG15+ locks it down), so a
304
304
  // default-schema PgVector fails on CREATE INDEX with "permission denied for
@@ -320,7 +320,7 @@ function buildSharedPgVector(pool) {
320
320
  }
321
321
  /** Per-agent dedicated `PgVector` (rare; opt-in via object override). */
322
322
  function buildPgVector(setting) {
323
- return new PgVector(withId(setting, `pg-vector__${hash.id()}`));
323
+ return new PgVector(withId(setting, `pg-vector__${id()}`));
324
324
  }
325
325
  /** True when this setting requires the shared Lakebase pool. */
326
326
  function settingNeedsSharedPool(setting) {
@@ -342,4 +342,4 @@ function collectAgentDefinitions(config) {
342
342
  function withId(value, fallback) {
343
343
  return value.id ? value : { ...value, id: fallback };
344
344
  }
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsR0FFckIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sSUFBSSxDQUFDO0FBSTNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLGNBQXVEO0lBRXZELE1BQU0sUUFBUSxHQUFHLGNBQWMsRUFBRSxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMzRCxNQUFNLFVBQVUsR0FBRyxjQUFjLEVBQUUsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDL0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3JGLE9BQU8sRUFB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QUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUE4QyxDQUN4RixDQUFDO0FBQ0osQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLHNCQUFzQixDQUFDLE9BQW1EO0lBQ2pGLE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQztBQUMxQixDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLFNBQVMsdUJBQXVCLENBQUMsTUFBMEI7SUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN6QyxJQUFJLGNBQWMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsTUFBa0MsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLE1BQU0sQ0FBNEIsS0FBUSxFQUFFLFFBQWdCO0lBQ25FLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZS1iYWNrZWQgTWFzdHJhIG1lbW9yeSB3aXJpbmcuXG4gKlxuICogUHJvdmlkZXMgYSB7QGxpbmsgTWVtb3J5QnVpbGRlcn0gdGhhdCBtaW50cyBvbmUgYE1lbW9yeWAgcGVyIGFnZW50XG4gKiB3aXRoIHR3byBpbmRlcGVuZGVudCBrbm9iczpcbiAqXG4gKiAtICoqU3RvcmFnZSoqICh0aHJlYWRzIC8gbWVzc2FnZXMgdmlhIGBQb3N0Z3Jlc1N0b3JlYCk6IGRlZmF1bHRzIHRvXG4gKiAgICoqcGVyLWFnZW50KiogbmFtZXNwYWNpbmcgdmlhIHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzb1xuICogICBjb252ZXJzYXRpb24gaGlzdG9yeSBzdGF5cyBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZVxuICogICBkYXRhYmFzZS4gYFBvc3RncmVzU3RvcmVgIGF1dG8tY3JlYXRlcyB0aGUgc2NoZW1hIHdpdGhcbiAqICAgYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUU2Agb24gaW5pdC4gQSBmYWlsZWQgbWlncmF0aW9uIChjb21tb24gb25cbiAqICAgTGFrZWJhc2Ugd2hlbiB0aGUgY29ubmVjdGluZyByb2xlIGlzIG5vdCB0aGUgdGFibGUgb3duZXIpIGlzIGxvZ2dlZFxuICogICBhbmQgc2tpcHBlZCB2aWEge0BsaW5rIHdpdGhTb2Z0U3RvcmFnZUluaXR9IHNvIGV4aXN0aW5nIHRhYmxlcyBrZWVwXG4gKiAgIHNlcnZpbmcgaW5zdGVhZCBvZiByZXRyeWluZyBEREwgb24gZXZlcnkgcmVxdWVzdC5cbiAqIC0gKipNZW1vcnkqKiAoc2VtYW50aWMgcmVjYWxsIHZpYSBgUGdWZWN0b3JgKTogZGVmYXVsdHMgdG8gYSBzaW5nbGVcbiAqICAgKipzaGFyZWQqKiBpbnN0YW5jZSBhY3Jvc3MgZXZlcnkgYWdlbnQuIENyb3NzLWFnZW50IHJlY2FsbCBvbiBvbmVcbiAqICAgaW5kZXggaXMgYWxtb3N0IGFsd2F5cyB3aGF0IHVzZXJzIHdhbnQ7IG9wdCBpbnRvIHBlci1hZ2VudCByZWNhbGxcbiAqICAgYnkgcGFzc2luZyBhIHtAbGluayBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZX0gb24gdGhlIGFnZW50LlxuICpcbiAqIEFkZGl0aW9uYWxseSwge0BsaW5rIE1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlfSByZXR1cm5zIGFcbiAqICoqTWFzdHJhLWluc3RhbmNlLWxldmVsKiogYFBvc3RncmVzU3RvcmVgIChzY2hlbWEgYG1hc3RyYV9pbnN0YW5jZWApXG4gKiB1c2VkIGZvciB3b3JrZmxvdyBzbmFwc2hvdHMgLSB0aGUgcGVyc2lzdGVuY2UgbGF5ZXJcbiAqIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgcmVhZHMgZnJvbSB3aGVuIHdha2luZyBhIHN1c3BlbmRlZFxuICogYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBjYWxsLiBQZXItYWdlbnQgc3RvcmVzIGFyZSBub3QgZW5vdWdoIGZvclxuICogdGhpczogd29ya2Zsb3cgcnVucyBhcmUgc2NvcGVkIHRvIHRoZSBNYXN0cmEgaW5zdGFuY2UsIG5vdCBhblxuICogaW5kaXZpZHVhbCBhZ2VudCdzIGBNZW1vcnlgLlxuICpcbiAqIFBsdWdpbi1sZXZlbCBgY29uZmlnLnN0b3JhZ2VgIC8gYGNvbmZpZy5tZW1vcnlgIGFjdCBhcyB0aGUgYmFzZWxpbmVcbiAqIChhdXRvLWRlZmF1bHRlZCB0byBgdHJ1ZWAgaW4gYHBsdWdpbi50c2Agd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW5cbiAqIGlzIHJlZ2lzdGVyZWQpOyBwZXItYWdlbnQgc2V0dGluZ3MgY2FzY2FkZSBvbiB0b3Agb2YgdGhhdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWlncmF0aW9uIGFzIGFwcGtpdE1pZ3JhdGlvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgaGFzaCwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRNZW1vcnlPcHRpb24gfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgdHlwZSBSZXF1ZXN0Q29udGV4dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGZhc3RlbWJlZCB9IGZyb20gXCJAbWFzdHJhL2Zhc3RlbWJlZFwiO1xuaW1wb3J0IHsgTWVtb3J5IH0gZnJvbSBcIkBtYXN0cmEvbWVtb3J5XCI7XG5pbXBvcnQgeyBQZ1ZlY3RvciwgUG9zdGdyZXNTdG9yZSB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5pbXBvcnQgeyBQb29sLCB0eXBlIFBvb2xDb25maWcgfSBmcm9tIFwicGdcIjtcblxuaW1wb3J0IHR5cGUgeyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlIH0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZSB9IGZyb20gXCIuL3N0b3JhZ2Utc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyBzdW1tYXJ5TW9kZWwsIFRJVExFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL21lbW9yeVwiKTtcblxuLyoqIFJlc29sdmUgdGhlIHRydXN0ZWQgTWFzdHJhIG1lbW9yeSBzY29wZSBzdGFtcGVkIGJ5IEFwcEtpdCBtaWRkbGV3YXJlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RNZW1vcnlTY29wZShcbiAgcmVxdWVzdENvbnRleHQ6IFBpY2s8UmVxdWVzdENvbnRleHQsIFwiZ2V0XCI+IHwgdW5kZWZpbmVkLFxuKTogQWdlbnRNZW1vcnlPcHRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCB0aHJlYWRJZCA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpO1xuICBjb25zdCByZXNvdXJjZUlkID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgaWYgKHR5cGVvZiB0aHJlYWRJZCAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgcmVzb3VyY2VJZCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgdGhyZWFkOiB0aHJlYWRJZCwgcmVzb3VyY2U6IHJlc291cmNlSWQgfTtcbn1cblxuLyoqIE92ZXJsYXkgdHJ1c3RlZCByZXF1ZXN0IG1lbW9yeSBpZGVudGlmaWVycyBvbnRvIE1hc3RyYSBleGVjdXRpb24gb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvcHRpb25zOiBULFxuICByZXF1ZXN0Q29udGV4dDogUGljazxSZXF1ZXN0Q29udGV4dCwgXCJnZXRcIj4gfCB1bmRlZmluZWQsXG4pOiBUICYgeyBtZW1vcnk/OiBBZ2VudE1lbW9yeU9wdGlvbiB9IHtcbiAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0TWVtb3J5U2NvcGUocmVxdWVzdENvbnRleHQpO1xuICBpZiAoIXNjb3BlKSByZXR1cm4gb3B0aW9ucztcbiAgY29uc3QgbWVtb3J5ID0gKG9wdGlvbnMgYXMgeyBtZW1vcnk/OiBBZ2VudE1lbW9yeU9wdGlvbiB9KS5tZW1vcnk7XG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZW1vcnk6IHtcbiAgICAgIC4uLm1lbW9yeSxcbiAgICAgIC4uLnNjb3BlLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogU29mdGVuIHtAbGluayBQb3N0Z3Jlc1N0b3JlLmluaXR9IHNvIGEgZmFpbGVkIG1pZ3JhdGlvbiAoZS5nLiBMYWtlYmFzZVxuICogYG11c3QgYmUgb3duZXIgb2YgdGFibGUg4oCmYCBvbiBgQUxURVJgKSBpcyBsb2dnZWQgb25jZSBpbnN0ZWFkIG9mIHJldGhyb3duXG4gKiBvbiBldmVyeSBzdG9yYWdlIGNhbGwuXG4gKlxuICogTWFzdHJhJ3MgYGF1Z21lbnRXaXRoSW5pdGAgcmV0cmllcyBpbml0IGZvcmV2ZXIgd2hlbiBpdCB0aHJvd3MsIHNvIHRoZVxuICogb25seSB3YXkgdG8ga2VlcCBzZXJ2aW5nIGFnYWluc3QgYW4gYWxyZWFkeS11c2FibGUgc2NoZW1hIGlzIHRvIHRyZWF0XG4gKiBtaWdyYXRpb24gZmFpbHVyZSBhcyBzdWNjZXNzIGFuZCBtYXJrIHRoZSBzdG9yZSBpbml0aWFsaXplZC5cbiAqXG4gKiBDb25jdXJyZW50IGZpcnN0IGNhbGxlcnMgc2hhcmUgb25lIHNvZnQgYXR0ZW1wdC4gTm9uLW93bmVyc2hpcCBmYWlsdXJlcyBzdGF5XG4gKiBmYXRhbCBzbyBtaXNzaW5nIHNjaGVtYXMvdGFibGVzIGFyZSByZXRyaWVkIG9yIHN1cmZhY2VkIGluc3RlYWQgb2YgaGlkZGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNvZnRTdG9yYWdlSW5pdChzdG9yZTogUG9zdGdyZXNTdG9yZSk6IFBvc3RncmVzU3RvcmUge1xuICBjb25zdCBzb2Z0ID0gc3RvcmUgYXMgdW5rbm93biBhcyB7XG4gICAgaW5pdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHNjaGVtYT86IHN0cmluZztcbiAgICBpc0luaXRpYWxpemVkOiBib29sZWFuO1xuICB9O1xuICBjb25zdCBvcmlnaW5hbEluaXQgPSBzb2Z0LmluaXQuYmluZChzb2Z0KTtcbiAgbGV0IHNvZnRJbml0UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBzb2Z0LmluaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNvZnQuaXNJbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHNvZnRJbml0UHJvbWlzZSA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9yaWdpbmFsSW5pdCgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhYXBwa2l0TWlncmF0aW9uLmhhbmRsZU93bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVyciwge1xuICAgICAgICAgICAgc2NvcGU6IFwibWFzdHJhLXN0b3JhZ2VcIixcbiAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIGV2ZW50OiBcIm1hc3RyYSBzdG9yYWdlIG1pZ3JhdGlvbiBmYWlsZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgc3RvcmVJZDogc29mdC5pZCwgc2NoZW1hOiBzb2Z0LnNjaGVtYSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNvZnRJbml0UHJvbWlzZTtcbiAgICAgIHNvZnQuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzb2Z0SW5pdFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3RvcmU7XG59XG5cbi8qKiBFZmZlY3RpdmUgcGVyLWtub2Igc2V0dGluZyBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuICovXG50eXBlIFN0b3JhZ2VTZXR0aW5nID0gQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wic3RvcmFnZVwiXTtcbnR5cGUgTWVtb3J5U2V0dGluZyA9IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1lbW9yeVwiXTtcblxuLyoqXG4gKiBUcnVlIHdoZW4gYW55IHBsdWdpbi1sZXZlbCBvciBwZXItYWdlbnQgc2V0dGluZyBjb3VsZCBuZWVkIHRoZVxuICogTGFrZWJhc2UgcG9vbC4gVXNlZCBieSBgcGx1Z2luLnRzYCB0byBnYXRlIGNyZWF0aW9uIG9mIHRoZVxuICogc2VydmljZS1wcmluY2lwYWwgcG9vbCBhbmQgdGhlIHtAbGluayBNZW1vcnlCdWlsZGVyfSB0aGF0IGNvbnN1bWVzXG4gKiBpdDsgd2hlbiBmYWxzZSBuZWl0aGVyIGlzIGJ1aWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNMYWtlYmFzZShjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoc2V0dGluZ05lZWRzU2hhcmVkUG9vbChjb25maWcuc3RvcmFnZSkpIHJldHVybiB0cnVlO1xuICBpZiAoc2V0dGluZ05lZWRzU2hhcmVkUG9vbChjb25maWcubWVtb3J5KSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGRlZnMgPSBjb2xsZWN0QWdlbnREZWZpbml0aW9ucyhjb25maWcpO1xuICByZXR1cm4gZGVmcy5zb21lKChkKSA9PiBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGQuc3RvcmFnZSkgfHwgc2V0dGluZ05lZWRzU2hhcmVkUG9vbChkLm1lbW9yeSkpO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHBlci1hZ2VudCB7QGxpbmsgTWVtb3J5fSBmYWN0b3J5IGJvdW5kIHRvIHRoZSBvcHRpb25hbFxuICogc2VydmljZS1wcmluY2lwYWwgTGFrZWJhc2UgcG9vbC5cbiAqIENhY2hlcyB0aGUgc2hhcmVkIGBQZ1ZlY3RvcmAgc2luZ2xldG9uIChidWlsdCBvbiBmaXJzdCBuZWVkKSBzbyBlYWNoXG4gKiBhZ2VudCBidWlsZCBpcyBPKDEpIGFmdGVyIHRoZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUJ1aWxkZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBzZXJ2aWNlUHJpbmNpcGFsUG9vbD86IFBvb2wsXG4pOiBNZW1vcnlCdWlsZGVyIHtcbiAgcmV0dXJuIG5ldyBNZW1vcnlCdWlsZGVyKGNvbmZpZywgc2VydmljZVByaW5jaXBhbFBvb2wpO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcGx1Z2luLW93bmVkIExha2ViYXNlIHBvb2wgdXNlZCBieSBkdXJhYmxlIHdvcmtmbG93IHN0b3JhZ2UuXG4gKlxuICogQGludGVybmFsXG4gKlxuICogQXBwS2l0IHNodXRzIHBsdWdpbiBob29rcyBkb3duIGNvbmN1cnJlbnRseSwgc28gYm9ycm93aW5nIHRoZSBuYXRpdmVcbiAqIExha2ViYXNlIHBsdWdpbidzIHBvb2wgbGV0cyBpdHMgc2h1dGRvd24gcmFjZSBNYXN0cmEncyBmaW5hbCBzbmFwc2hvdCB3cml0ZXMuXG4gKiBBIGNhbGxlci1wcm92aWRlZCBwb29sIGlzIG5vdCBjbG9zZWQgYnkgUG9zdGdyZXNTdG9yZTsgaWRsZSBjb25uZWN0aW9ucyBkb1xuICogbm90IGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgYW5kIHJlbWFpbiBhdmFpbGFibGUgdG8gcnVucyBNYXN0cmEgaXMgc3RpbGxcbiAqIGRyYWluaW5nIGFmdGVyIGl0cyBib3VuZGVkIHNodXRkb3duIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hc3RyYUxha2ViYXNlUG9vbChjb25maWc6IFBvb2xDb25maWcpOiBQb29sIHtcbiAgcmV0dXJuIG5ldyBQb29sKHtcbiAgICAuLi5jb25maWcsXG4gICAgYWxsb3dFeGl0T25JZGxlOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIGBNZW1vcnlgIHBlciBhZ2VudCBhZ2FpbnN0IGEgc2hhcmVkIHNlcnZpY2UtcHJpbmNpcGFsXG4gKiBMYWtlYmFzZSBwb29sLiBQZXItaW5zdGFuY2Ugc3RhdGUga2VlcHMgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIGFsaXZlXG4gKiBhY3Jvc3MgY2FsbHMgc28gcmVnaXN0ZXJpbmcgTiBhZ2VudHMgc3RheXMgY2hlYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnlCdWlsZGVyIHtcbiAgcHJpdmF0ZSBzaGFyZWRWZWN0b3I6IFBnVmVjdG9yIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlUHJpbmNpcGFsUG9vbD86IFBvb2wsXG4gICkge31cblxuICAvKipcbiAgICogQnVpbGQgdGhlIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlIHVzZWQgZm9yIHdvcmtmbG93XG4gICAqIHNuYXBzaG90cy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHBsdWdpbi1sZXZlbCBgc3RvcmFnZWAgaXNcbiAgICogZGlzYWJsZWQsIGluIHdoaWNoIGNhc2UgYGFnZW50LnJlc3VtZVN0cmVhbSgpYCAoYW5kIHRoZXJlZm9yZVxuICAgKiB0aGUgYHJlcXVpcmVBcHByb3ZhbGAgZmxvdykgd2lsbCBub3QgYmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBUaGUgc3RvcmUgbGl2ZXMgaW4gYSBkZWRpY2F0ZWQgYG1hc3RyYV9pbnN0YW5jZWAgc2NoZW1hIHNvIGl0XG4gICAqIG5ldmVyIGNvbGxpZGVzIHdpdGggcGVyLWFnZW50IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBuYW1lc3BhY2VzLlxuICAgKiBXb3JrZmxvdyBzbmFwc2hvdHMgYXJlIG5vdCBwZXItYWdlbnQgc3RhdGU7IHRoZXkgYmVsb25nIHRvIHRoZVxuICAgKiBgTWFzdHJhYCBpbnN0YW5jZSB0aGF0IG93bnMgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAgICovXG4gIGluc3RhbmNlU3RvcmFnZSgpOiBQb3N0Z3Jlc1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZXR0aW5nID0gdGhpcy5jb25maWcuc3RvcmFnZTtcbiAgICBpZiAoIXNldHRpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gd2l0aFNvZnRTdG9yYWdlSW5pdChcbiAgICAgICAgbmV3IFBvc3RncmVzU3RvcmUoXG4gICAgICAgICAgd2l0aElkKHNldHRpbmcsIFwibWFzdHJhLXN0b3JlX19pbnN0YW5jZVwiKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8XG4gICAgICAgICAgICB0eXBlb2YgUG9zdGdyZXNTdG9yZVxuICAgICAgICAgID5bMF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICBuZXcgUG9zdGdyZXNTdG9yZSh7XG4gICAgICAgIGlkOiBcIm1hc3RyYS1zdG9yZV9faW5zdGFuY2VcIixcbiAgICAgICAgc2NoZW1hTmFtZTogXCJtYXN0cmFfaW5zdGFuY2VcIixcbiAgICAgICAgcG9vbDogdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBgTWVtb3J5YCBmb3IgYGFnZW50SWRgIGFmdGVyIHRoZSBwbHVnaW4vYWdlbnQgY2FzY2FkZS5cbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBhZ2VudCBoYXMgbmVpdGhlciBzdG9yYWdlIG5vciBhXG4gICAqIHZlY3RvciBzdG9yZSBlbmFibGVkIC0gTWFzdHJhIGFjY2VwdHMgYSBtaXNzaW5nIGBtZW1vcnlgIGZpZWxkXG4gICAqIGFuZCB0cmVhdHMgdGhlIGFnZW50IGFzIHN0YXRlbGVzcy5cbiAgICovXG4gIGZvckFnZW50KGFnZW50SWQ6IHN0cmluZywgZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24pOiBNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0b3JhZ2VTZXR0aW5nID0gZGVmLnN0b3JhZ2UgPz8gdGhpcy5jb25maWcuc3RvcmFnZTtcbiAgICBjb25zdCBtZW1vcnlTZXR0aW5nID0gZGVmLm1lbW9yeSA/PyB0aGlzLmNvbmZpZy5tZW1vcnk7XG5cbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5idWlsZFN0b3JhZ2UoYWdlbnRJZCwgc3RvcmFnZVNldHRpbmcpO1xuICAgIGNvbnN0IHZlY3RvciA9IHRoaXMuYnVpbGRWZWN0b3IobWVtb3J5U2V0dGluZyk7XG4gICAgaWYgKCFzdG9yYWdlICYmICF2ZWN0b3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImFnZW50OnN0YXRlbGVzc1wiLCB7IGFnZW50SWQgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcImFnZW50OmNvbmZpZ3VyZWRcIiwge1xuICAgICAgYWdlbnRJZCxcbiAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UgIT09IHVuZGVmaW5lZCxcbiAgICAgIHZlY3RvcjogdmVjdG9yICE9PSB1bmRlZmluZWQsXG4gICAgICB2ZWN0b3JNb2RlOlxuICAgICAgICB2ZWN0b3IgPT09IHVuZGVmaW5lZCA/IFwib2ZmXCIgOiB0eXBlb2YgbWVtb3J5U2V0dGluZyA9PT0gXCJvYmplY3RcIiA/IFwiZGVkaWNhdGVkXCIgOiBcInNoYXJlZFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBNZW1vcnkoe1xuICAgICAgLi4uKHN0b3JhZ2UgPyB7IHN0b3JhZ2UgfSA6IHt9KSxcbiAgICAgIC4uLih2ZWN0b3IgPyB7IHZlY3RvciwgZW1iZWRkZXI6IGZhc3RlbWJlZCB9IDoge30pLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBsYXN0TWVzc2FnZXM6IDEwLFxuICAgICAgICAuLi4odmVjdG9yXG4gICAgICAgICAgPyB7IHNlbWFudGljUmVjYWxsOiB7IHRvcEs6IDMsIG1lc3NhZ2VSYW5nZTogMiwgc2NvcGU6IFwicmVzb3VyY2VcIiBhcyBjb25zdCB9IH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLy8gQXV0by1uYW1lIGVhY2ggdGhyZWFkIGZyb20gaXRzIG9wZW5pbmcgdHVybiBzbyB0aGVcbiAgICAgICAgLy8gY29udmVyc2F0aW9uIGxpc3QgdGhlIFVJIHJlbmRlcnMgc2hvd3MgbWVhbmluZ2Z1bCB0aXRsZXNcbiAgICAgICAgLy8gaW5zdGVhZCBvZiByYXcgaWRzLiBUaXRsaW5nIHJ1bnMgb24gdGhlIHNtYWxsIC8gZmFzdCBjaGF0XG4gICAgICAgIC8vIHRpZXIgKHNlZSBgc3VtbWFyaXplLnRzYCkgcmF0aGVyIHRoYW4gdGhlIGFnZW50J3MgcHJpbWFyeVxuICAgICAgICAvLyBtb2RlbCwgc28gbmFtaW5nIGEgdGhyZWFkIG5ldmVyIHNwZW5kcyB0aGUgaGVhdnl3ZWlnaHQgbW9kZWwuXG4gICAgICAgIC8vIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIHN0b3JhZ2UgaXMgb247IGhhcm1sZXNzIG90aGVyd2lzZS5cbiAgICAgICAgLi4uKHN0b3JhZ2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZ2VuZXJhdGVUaXRsZToge1xuICAgICAgICAgICAgICAgIG1vZGVsOiBzdW1tYXJ5TW9kZWwodGhpcy5jb25maWcpLFxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uczogVElUTEVfSU5TVFJVQ1RJT05TLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTdG9yYWdlKGFnZW50SWQ6IHN0cmluZywgc2V0dGluZzogU3RvcmFnZVNldHRpbmcpOiBQb3N0Z3Jlc1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNldHRpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKCF0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKHtcbiAgICAgICAgICBpZDogYG1hc3RyYS1zdG9yZV9fJHthZ2VudElkfWAsXG4gICAgICAgICAgc2NoZW1hTmFtZTogYWdlbnRTdG9yYWdlU2NoZW1hTmFtZShhZ2VudElkKSxcbiAgICAgICAgICBwb29sOiB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIENhc3Q6IGB3aXRoSWRgIGd1YXJhbnRlZXMgYGlkYCBpcyBzZXQsIGJ1dCB0aGUgZGlzdHJpYnV0aXZlXG4gICAgLy8gT21pdCArIGBpZD86IHN0cmluZ2Agc2hhcGUgZG9lc24ndCBzdHJ1Y3R1cmFsbHkgbmFycm93IHRvIHRoZVxuICAgIC8vIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWVtYmVycy4gUnVudGltZSBzaGFwZSBpcyBpZGVudGljYWwuXG4gICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICBuZXcgUG9zdGdyZXNTdG9yZShcbiAgICAgICAgd2l0aElkKHNldHRpbmcsIGBtYXN0cmEtc3RvcmVfXyR7YWdlbnRJZH1gKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8XG4gICAgICAgICAgdHlwZW9mIFBvc3RncmVzU3RvcmVcbiAgICAgICAgPlswXSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBhZ2VudCdzIHZlY3RvciBzdG9yZS4gQ2FzY2FkZTpcbiAgICpcbiAgICogLSBmYWxzeTogbm8gdmVjdG9yLlxuICAgKiAtIGBib29sZWFuYCAvIGB1bmRlZmluZWQtaW5oZXJpdGluZy10cnVlYDogcmV0dXJuIHRoZSBzaGFyZWRcbiAgICogICBzaW5nbGV0b24gKGJ1aWx0IGxhemlseSBvbiBmaXJzdCBjYWxsKS4gQWxsIGFnZW50cyB0aGF0XG4gICAqICAgZGVmYXVsdC1lbmFibGUgbWVtb3J5IHdyaXRlIGludG8gYW5kIHJlY2FsbCBmcm9tIG9uZSBpbmRleC5cbiAgICogLSBvYmplY3Q6IGJ1aWxkIGEgZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgZm9yIHRoaXMgYWdlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVmVjdG9yKHNldHRpbmc6IE1lbW9yeVNldHRpbmcpOiBQZ1ZlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0aGlzLmdldFNoYXJlZFZlY3RvcigpO1xuICAgIHJldHVybiBidWlsZFBnVmVjdG9yKHNldHRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGFyZWRWZWN0b3IoKTogUGdWZWN0b3Ige1xuICAgIGlmICghdGhpcy5zaGFyZWRWZWN0b3IpIHtcbiAgICAgIGlmICghdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMYWtlYmFzZSBpcyByZXF1aXJlZCBmb3IgUGdWZWN0b3IgbWVtb3J5XCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5zaGFyZWRWZWN0b3IgPSBidWlsZFNoYXJlZFBnVmVjdG9yKHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaGFyZWRWZWN0b3I7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc2hhcmVkIGBQZ1ZlY3RvcmAgdGhhdCBiYWNrcyB0aGUgZGVmYXVsdFxuICogYGRlZi5tZW1vcnkgPT09IHRydWVgIGNhc2UgYWNyb3NzIGV2ZXJ5IGFnZW50LlxuICpcbiAqIGBQZ1ZlY3RvcmAncyBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgY29ubmVjdGlvbi1zdHlsZSBjb25maWdzXG4gKiAoYEhvc3RDb25maWdgIC8gYENvbm5lY3Rpb25TdHJpbmdDb25maWdgIC8gYENsaWVudENvbmZpZ2ApOyB0aGVyZSBpc1xuICogbm8gYHsgcG9vbCB9YCBzaG9ydGhhbmQgdGhlIHdheSBgUG9zdGdyZXNTdG9yZWAgaGFzIG9uZS4gV29yc2UsIHRoZVxuICogY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBraWNrcyBvZmYgYSBgY2FjaGVXYXJtdXBQcm9taXNlYCBJSUZFIHRoYXRcbiAqIGNhbGxzIGB0aGlzLnBvb2wuY29ubmVjdCgpYCBiZWZvcmUgcmV0dXJuaW5nLCBzbyB3ZSBjYW4ndCBjbGVhbmx5XG4gKiBoYW5kIGl0IGFuIGluZXJ0IGNvbmZpZyBhbmQgcGF0Y2ggdGhlIHBvb2wgYWZ0ZXJ3YXJkcy5cbiAqXG4gKiBUaGUgdHJpY2s6IHBhc3MgaWxsZWdhbC1idXQtdmFsaWRhdGlvbi1wYXNzaW5nIHBsYWNlaG9sZGVycyBzbyB0aGVcbiAqIHdhcm11cCdzIGBuZXQuY29ubmVjdCgpYCByZWplY3RzIHN5bmNocm9ub3VzbHkgd2l0aCBgUmFuZ2VFcnJvcmBcbiAqIChOb2RlIHZhbGlkYXRlcyBgMCA8PSBwb3J0IDwgNjU1MzZgKS4gVGhlIElJRkUncyBgY2F0Y2gge31gIHN3YWxsb3dzXG4gKiBpdCwgbm8gRE5TIGxvb2t1cCBvciBUQ1AgYXR0ZW1wdCBoYXBwZW5zLCBhbmQgd2UgdGhlbiBzd2FwXG4gKiBgcGdWZWN0b3IucG9vbGAgdG8gdGhlIGxha2ViYXNlIHBvb2wuIEV2ZXJ5IHN1YnNlcXVlbnQgYFBnVmVjdG9yYFxuICogbWV0aG9kIHJlYWRzIGB0aGlzLnBvb2xgIGF0IGNhbGwgdGltZSwgc28gYWxsIHJlYWwgSS9PIGdvZXMgdGhyb3VnaFxuICogdGhlIGxha2ViYXNlIHBvb2wgZnJvbSB0aGVuIG9uLiBUaGUgcGxhY2Vob2xkZXIgcG9vbCBpcyBgLmVuZCgpYCdkXG4gKiBzbyBpdHMgc29ja2V0IGJvb2sta2VlcGluZyBpcyByZWxlYXNlZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTaGFyZWRQZ1ZlY3Rvcihwb29sOiBQb29sKTogUGdWZWN0b3Ige1xuICBjb25zdCB2ZWN0b3IgPSBuZXcgUGdWZWN0b3Ioe1xuICAgIGlkOiBgcGcke2hhc2guaWQoKX1gLFxuICAgIC8vIEtlZXAgdGhlIHJlY2FsbCBpbmRleCBvdXQgb2YgYHB1YmxpY2A6IG9uIGEgTGFrZWJhc2UgZGF0YWJhc2UgdGhlIGFwcFxuICAgIC8vIHNlcnZpY2UgcHJpbmNpcGFsIGhhcyBubyBDUkVBVEUgb24gYHB1YmxpY2AgKFBHMTUrIGxvY2tzIGl0IGRvd24pLCBzbyBhXG4gICAgLy8gZGVmYXVsdC1zY2hlbWEgUGdWZWN0b3IgZmFpbHMgb24gQ1JFQVRFIElOREVYIHdpdGggXCJwZXJtaXNzaW9uIGRlbmllZCBmb3JcbiAgICAvLyBzY2hlbWEgcHVibGljXCIuIFBnVmVjdG9yIHJ1bnMgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTIGZvciBhIG5hbWVkXG4gICAgLy8gc2NoZW1hLCBzbyB0aGUgU1AgY3JlYXRlcyBhbmQgb3ducyBgbWFzdHJhX2luc3RhbmNlYCAodGhlIHNhbWVcbiAgICAvLyBpbnN0YW5jZS1sZXZlbCBzY2hlbWEgdGhlIHdvcmtmbG93LXNuYXBzaG90IHN0b3JlIHVzZXMpIGFuZCB0aGUgaW5kZXhcbiAgICAvLyBsYW5kcyB0aGVyZS4gVGFibGUgbmFtZXMgZG9uJ3QgY29sbGlkZSB3aXRoIHRoZSBzdG9yYWdlIHRhYmxlcy5cbiAgICBzY2hlbWFOYW1lOiBcIm1hc3RyYV9pbnN0YW5jZVwiLFxuICAgIGhvc3Q6IFwiLTFcIixcbiAgICBwb3J0OiAtMSxcbiAgICBkYXRhYmFzZTogXCJfXCIsXG4gICAgdXNlcjogXCJfXCIsXG4gICAgcGFzc3dvcmQ6IFwiX1wiLFxuICB9KTtcbiAgY29uc3QgcGxhY2Vob2xkZXIgPSB2ZWN0b3IucG9vbDtcbiAgdmVjdG9yLnBvb2wgPSBwb29sO1xuICB2b2lkIHBsYWNlaG9sZGVyLmVuZCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIHJldHVybiB2ZWN0b3I7XG59XG5cbi8qKiBQZXItYWdlbnQgZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgKHJhcmU7IG9wdC1pbiB2aWEgb2JqZWN0IG92ZXJyaWRlKS4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGdWZWN0b3Ioc2V0dGluZzogTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUpOiBQZ1ZlY3RvciB7XG4gIHJldHVybiBuZXcgUGdWZWN0b3IoXG4gICAgd2l0aElkKHNldHRpbmcsIGBwZy12ZWN0b3JfXyR7aGFzaC5pZCgpfWApIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgUGdWZWN0b3I+WzBdLFxuICApO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoaXMgc2V0dGluZyByZXF1aXJlcyB0aGUgc2hhcmVkIExha2ViYXNlIHBvb2wuICovXG5mdW5jdGlvbiBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nIHwgTWVtb3J5U2V0dGluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2V0dGluZyA9PT0gdHJ1ZTtcbn1cblxuLyoqIFdhbGsgdGhlIHRocmVlIHNoYXBlcyBvZiBgY29uZmlnLmFnZW50c2AgaW50byBhIGZsYXQgbGlzdC4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBZ2VudERlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW10ge1xuICBjb25zdCBhZ2VudHMgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWFnZW50cykgcmV0dXJuIFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShhZ2VudHMpKSByZXR1cm4gYWdlbnRzO1xuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBhZ2VudHMpIHtcbiAgICByZXR1cm4gW2FnZW50cyBhcyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25dO1xuICB9XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGFnZW50cyk7XG59XG5cbi8qKiBGaWxsIGluIGEgZGVmYXVsdCBgaWRgIHdoZW4gdGhlIGNhbGxlciBkaWRuJ3Qgc3VwcGx5IG9uZS4gKi9cbmZ1bmN0aW9uIHdpdGhJZDxUIGV4dGVuZHMgeyBpZD86IHN0cmluZyB9Pih2YWx1ZTogVCwgZmFsbGJhY2s6IHN0cmluZyk6IFQge1xuICByZXR1cm4gdmFsdWUuaWQgPyB2YWx1ZSA6IHsgLi4udmFsdWUsIGlkOiBmYWxsYmFjayB9O1xufVxuIl19
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEdBRXJCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLElBQUksQ0FBQztBQUkzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUzQyw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxjQUF1RDtJQUV2RCxNQUFNLFFBQVEsR0FBRyxjQUFjLEVBQUUsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsY0FBYyxFQUFFLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQy9ELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRixPQUFPLEVBQUUsTUFBTSxF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O0FBQ0osQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLHNCQUFzQixDQUFDLE9BQW1EO0lBQ2pGLE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQztBQUMxQixDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLFNBQVMsdUJBQXVCLENBQUMsTUFBMEI7SUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN6QyxJQUFJLGNBQWMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsTUFBa0MsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLE1BQU0sQ0FBNEIsS0FBUSxFQUFFLFFBQWdCO0lBQ25FLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZS1iYWNrZWQgTWFzdHJhIG1lbW9yeSB3aXJpbmcuXG4gKlxuICogUHJvdmlkZXMgYSB7QGxpbmsgTWVtb3J5QnVpbGRlcn0gdGhhdCBtaW50cyBvbmUgYE1lbW9yeWAgcGVyIGFnZW50XG4gKiB3aXRoIHR3byBpbmRlcGVuZGVudCBrbm9iczpcbiAqXG4gKiAtICoqU3RvcmFnZSoqICh0aHJlYWRzIC8gbWVzc2FnZXMgdmlhIGBQb3N0Z3Jlc1N0b3JlYCk6IGRlZmF1bHRzIHRvXG4gKiAgICoqcGVyLWFnZW50KiogbmFtZXNwYWNpbmcgdmlhIHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzb1xuICogICBjb252ZXJzYXRpb24gaGlzdG9yeSBzdGF5cyBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZVxuICogICBkYXRhYmFzZS4gYFBvc3RncmVzU3RvcmVgIGF1dG8tY3JlYXRlcyB0aGUgc2NoZW1hIHdpdGhcbiAqICAgYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUU2Agb24gaW5pdC4gQSBmYWlsZWQgbWlncmF0aW9uIChjb21tb24gb25cbiAqICAgTGFrZWJhc2Ugd2hlbiB0aGUgY29ubmVjdGluZyByb2xlIGlzIG5vdCB0aGUgdGFibGUgb3duZXIpIGlzIGxvZ2dlZFxuICogICBhbmQgc2tpcHBlZCB2aWEge0BsaW5rIHdpdGhTb2Z0U3RvcmFnZUluaXR9IHNvIGV4aXN0aW5nIHRhYmxlcyBrZWVwXG4gKiAgIHNlcnZpbmcgaW5zdGVhZCBvZiByZXRyeWluZyBEREwgb24gZXZlcnkgcmVxdWVzdC5cbiAqIC0gKipNZW1vcnkqKiAoc2VtYW50aWMgcmVjYWxsIHZpYSBgUGdWZWN0b3JgKTogZGVmYXVsdHMgdG8gYSBzaW5nbGVcbiAqICAgKipzaGFyZWQqKiBpbnN0YW5jZSBhY3Jvc3MgZXZlcnkgYWdlbnQuIENyb3NzLWFnZW50IHJlY2FsbCBvbiBvbmVcbiAqICAgaW5kZXggaXMgYWxtb3N0IGFsd2F5cyB3aGF0IHVzZXJzIHdhbnQ7IG9wdCBpbnRvIHBlci1hZ2VudCByZWNhbGxcbiAqICAgYnkgcGFzc2luZyBhIHtAbGluayBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZX0gb24gdGhlIGFnZW50LlxuICpcbiAqIEFkZGl0aW9uYWxseSwge0BsaW5rIE1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlfSByZXR1cm5zIGFcbiAqICoqTWFzdHJhLWluc3RhbmNlLWxldmVsKiogYFBvc3RncmVzU3RvcmVgIChzY2hlbWEgYG1hc3RyYV9pbnN0YW5jZWApXG4gKiB1c2VkIGZvciB3b3JrZmxvdyBzbmFwc2hvdHMgLSB0aGUgcGVyc2lzdGVuY2UgbGF5ZXJcbiAqIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgcmVhZHMgZnJvbSB3aGVuIHdha2luZyBhIHN1c3BlbmRlZFxuICogYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBjYWxsLiBQZXItYWdlbnQgc3RvcmVzIGFyZSBub3QgZW5vdWdoIGZvclxuICogdGhpczogd29ya2Zsb3cgcnVucyBhcmUgc2NvcGVkIHRvIHRoZSBNYXN0cmEgaW5zdGFuY2UsIG5vdCBhblxuICogaW5kaXZpZHVhbCBhZ2VudCdzIGBNZW1vcnlgLlxuICpcbiAqIFBsdWdpbi1sZXZlbCBgY29uZmlnLnN0b3JhZ2VgIC8gYGNvbmZpZy5tZW1vcnlgIGFjdCBhcyB0aGUgYmFzZWxpbmVcbiAqIChhdXRvLWRlZmF1bHRlZCB0byBgdHJ1ZWAgaW4gYHBsdWdpbi50c2Agd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW5cbiAqIGlzIHJlZ2lzdGVyZWQpOyBwZXItYWdlbnQgc2V0dGluZ3MgY2FzY2FkZSBvbiB0b3Agb2YgdGhhdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaGFuZGxlT3duZXJzaGlwTWlncmF0aW9uRXJyb3IgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgaWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudE1lbW9yeU9wdGlvbiB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICB0eXBlIFJlcXVlc3RDb250ZXh0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgZmFzdGVtYmVkIH0gZnJvbSBcIkBtYXN0cmEvZmFzdGVtYmVkXCI7XG5pbXBvcnQgeyBNZW1vcnkgfSBmcm9tIFwiQG1hc3RyYS9tZW1vcnlcIjtcbmltcG9ydCB7IFBnVmVjdG9yLCBQb3N0Z3Jlc1N0b3JlIH0gZnJvbSBcIkBtYXN0cmEvcGdcIjtcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lIH0gZnJvbSBcIi4vc3RvcmFnZS1zY2hlbWEudHNcIjtcbmltcG9ydCB7IHN1bW1hcnlNb2RlbCwgVElUTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWVtb3J5XCIpO1xuXG4vKiogUmVzb2x2ZSB0aGUgdHJ1c3RlZCBNYXN0cmEgbWVtb3J5IHNjb3BlIHN0YW1wZWQgYnkgQXBwS2l0IG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdE1lbW9yeVNjb3BlKFxuICByZXF1ZXN0Q29udGV4dDogUGljazxSZXF1ZXN0Q29udGV4dCwgXCJnZXRcIj4gfCB1bmRlZmluZWQsXG4pOiBBZ2VudE1lbW9yeU9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSk7XG4gIGNvbnN0IHJlc291cmNlSWQgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpO1xuICBpZiAodHlwZW9mIHRocmVhZElkICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiByZXNvdXJjZUlkICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyB0aHJlYWQ6IHRocmVhZElkLCByZXNvdXJjZTogcmVzb3VyY2VJZCB9O1xufVxuXG4vKiogT3ZlcmxheSB0cnVzdGVkIHJlcXVlc3QgbWVtb3J5IGlkZW50aWZpZXJzIG9udG8gTWFzdHJhIGV4ZWN1dGlvbiBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9wdGlvbnM6IFQsXG4gIHJlcXVlc3RDb250ZXh0OiBQaWNrPFJlcXVlc3RDb250ZXh0LCBcImdldFwiPiB8IHVuZGVmaW5lZCxcbik6IFQgJiB7IG1lbW9yeT86IEFnZW50TWVtb3J5T3B0aW9uIH0ge1xuICBjb25zdCBzY29wZSA9IHJlcXVlc3RNZW1vcnlTY29wZShyZXF1ZXN0Q29udGV4dCk7XG4gIGlmICghc2NvcGUpIHJldHVybiBvcHRpb25zO1xuICBjb25zdCBtZW1vcnkgPSAob3B0aW9ucyBhcyB7IG1lbW9yeT86IEFnZW50TWVtb3J5T3B0aW9uIH0pLm1lbW9yeTtcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1lbW9yeToge1xuICAgICAgLi4ubWVtb3J5LFxuICAgICAgLi4uc2NvcGUsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTb2Z0ZW4ge0BsaW5rIFBvc3RncmVzU3RvcmUuaW5pdH0gc28gYSBmYWlsZWQgbWlncmF0aW9uIChlLmcuIExha2ViYXNlXG4gKiBgbXVzdCBiZSBvd25lciBvZiB0YWJsZSDigKZgIG9uIGBBTFRFUmApIGlzIGxvZ2dlZCBvbmNlIGluc3RlYWQgb2YgcmV0aHJvd25cbiAqIG9uIGV2ZXJ5IHN0b3JhZ2UgY2FsbC5cbiAqXG4gKiBNYXN0cmEncyBgYXVnbWVudFdpdGhJbml0YCByZXRyaWVzIGluaXQgZm9yZXZlciB3aGVuIGl0IHRocm93cywgc28gdGhlXG4gKiBvbmx5IHdheSB0byBrZWVwIHNlcnZpbmcgYWdhaW5zdCBhbiBhbHJlYWR5LXVzYWJsZSBzY2hlbWEgaXMgdG8gdHJlYXRcbiAqIG1pZ3JhdGlvbiBmYWlsdXJlIGFzIHN1Y2Nlc3MgYW5kIG1hcmsgdGhlIHN0b3JlIGluaXRpYWxpemVkLlxuICpcbiAqIENvbmN1cnJlbnQgZmlyc3QgY2FsbGVycyBzaGFyZSBvbmUgc29mdCBhdHRlbXB0LiBOb24tb3duZXJzaGlwIGZhaWx1cmVzIHN0YXlcbiAqIGZhdGFsIHNvIG1pc3Npbmcgc2NoZW1hcy90YWJsZXMgYXJlIHJldHJpZWQgb3Igc3VyZmFjZWQgaW5zdGVhZCBvZiBoaWRkZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU29mdFN0b3JhZ2VJbml0KHN0b3JlOiBQb3N0Z3Jlc1N0b3JlKTogUG9zdGdyZXNTdG9yZSB7XG4gIGNvbnN0IHNvZnQgPSBzdG9yZSBhcyB1bmtub3duIGFzIHtcbiAgICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc2NoZW1hPzogc3RyaW5nO1xuICAgIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIH07XG4gIGNvbnN0IG9yaWdpbmFsSW5pdCA9IHNvZnQuaW5pdC5iaW5kKHNvZnQpO1xuICBsZXQgc29mdEluaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIHNvZnQuaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc29mdC5pc0luaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ2luYWxJbml0KCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYW5kbGVPd25lcnNoaXBNaWdyYXRpb25FcnJvcihlcnIsIHtcbiAgICAgICAgICAgIHNjb3BlOiBcIm1hc3RyYS1zdG9yYWdlXCIsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICBldmVudDogXCJtYXN0cmEgc3RvcmFnZSBtaWdyYXRpb24gZmFpbGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiB7IHN0b3JlSWQ6IHNvZnQuaWQsIHNjaGVtYTogc29mdC5zY2hlbWEgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzb2Z0LmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc29mdEluaXRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuXG4vKiogRWZmZWN0aXZlIHBlci1rbm9iIHNldHRpbmcgYWZ0ZXIgdGhlIHBsdWdpbi9hZ2VudCBjYXNjYWRlLiAqL1xudHlwZSBTdG9yYWdlU2V0dGluZyA9IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcInN0b3JhZ2VcIl07XG50eXBlIE1lbW9yeVNldHRpbmcgPSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJtZW1vcnlcIl07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGFueSBwbHVnaW4tbGV2ZWwgb3IgcGVyLWFnZW50IHNldHRpbmcgY291bGQgbmVlZCB0aGVcbiAqIExha2ViYXNlIHBvb2wuIFVzZWQgYnkgYHBsdWdpbi50c2AgdG8gZ2F0ZSBjcmVhdGlvbiBvZiB0aGVcbiAqIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgYW5kIHRoZSB7QGxpbmsgTWVtb3J5QnVpbGRlcn0gdGhhdCBjb25zdW1lc1xuICogaXQ7IHdoZW4gZmFsc2UgbmVpdGhlciBpcyBidWlsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzTGFrZWJhc2UoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBib29sZWFuIHtcbiAgaWYgKHNldHRpbmdOZWVkc1NoYXJlZFBvb2woY29uZmlnLnN0b3JhZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHNldHRpbmdOZWVkc1NoYXJlZFBvb2woY29uZmlnLm1lbW9yeSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBkZWZzID0gY29sbGVjdEFnZW50RGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgcmV0dXJuIGRlZnMuc29tZSgoZCkgPT4gc2V0dGluZ05lZWRzU2hhcmVkUG9vbChkLnN0b3JhZ2UpIHx8IHNldHRpbmdOZWVkc1NoYXJlZFBvb2woZC5tZW1vcnkpKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBwZXItYWdlbnQge0BsaW5rIE1lbW9yeX0gZmFjdG9yeSBib3VuZCB0byB0aGUgb3B0aW9uYWxcbiAqIHNlcnZpY2UtcHJpbmNpcGFsIExha2ViYXNlIHBvb2wuXG4gKiBDYWNoZXMgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHNpbmdsZXRvbiAoYnVpbHQgb24gZmlyc3QgbmVlZCkgc28gZWFjaFxuICogYWdlbnQgYnVpbGQgaXMgTygxKSBhZnRlciB0aGUgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlCdWlsZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgc2VydmljZVByaW5jaXBhbFBvb2w/OiBQb29sLFxuKTogTWVtb3J5QnVpbGRlciB7XG4gIHJldHVybiBuZXcgTWVtb3J5QnVpbGRlcihjb25maWcsIHNlcnZpY2VQcmluY2lwYWxQb29sKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIHBsdWdpbi1vd25lZCBMYWtlYmFzZSBwb29sIHVzZWQgYnkgZHVyYWJsZSB3b3JrZmxvdyBzdG9yYWdlLlxuICpcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEFwcEtpdCBzaHV0cyBwbHVnaW4gaG9va3MgZG93biBjb25jdXJyZW50bHksIHNvIGJvcnJvd2luZyB0aGUgbmF0aXZlXG4gKiBMYWtlYmFzZSBwbHVnaW4ncyBwb29sIGxldHMgaXRzIHNodXRkb3duIHJhY2UgTWFzdHJhJ3MgZmluYWwgc25hcHNob3Qgd3JpdGVzLlxuICogQSBjYWxsZXItcHJvdmlkZWQgcG9vbCBpcyBub3QgY2xvc2VkIGJ5IFBvc3RncmVzU3RvcmU7IGlkbGUgY29ubmVjdGlvbnMgZG9cbiAqIG5vdCBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIGFuZCByZW1haW4gYXZhaWxhYmxlIHRvIHJ1bnMgTWFzdHJhIGlzIHN0aWxsXG4gKiBkcmFpbmluZyBhZnRlciBpdHMgYm91bmRlZCBzaHV0ZG93biB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNYXN0cmFMYWtlYmFzZVBvb2woY29uZmlnOiBQb29sQ29uZmlnKTogUG9vbCB7XG4gIHJldHVybiBuZXcgUG9vbCh7XG4gICAgLi4uY29uZmlnLFxuICAgIGFsbG93RXhpdE9uSWRsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBgTWVtb3J5YCBwZXIgYWdlbnQgYWdhaW5zdCBhIHNoYXJlZCBzZXJ2aWNlLXByaW5jaXBhbFxuICogTGFrZWJhc2UgcG9vbC4gUGVyLWluc3RhbmNlIHN0YXRlIGtlZXBzIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCBhbGl2ZVxuICogYWNyb3NzIGNhbGxzIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLlxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5QnVpbGRlciB7XG4gIHByaXZhdGUgc2hhcmVkVmVjdG9yOiBQZ1ZlY3RvciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZVByaW5jaXBhbFBvb2w/OiBQb29sLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBNYXN0cmEtaW5zdGFuY2UtbGV2ZWwgc3RvcmFnZSB1c2VkIGZvciB3b3JrZmxvd1xuICAgKiBzbmFwc2hvdHMuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBwbHVnaW4tbGV2ZWwgYHN0b3JhZ2VgIGlzXG4gICAqIGRpc2FibGVkLCBpbiB3aGljaCBjYXNlIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgKGFuZCB0aGVyZWZvcmVcbiAgICogdGhlIGByZXF1aXJlQXBwcm92YWxgIGZsb3cpIHdpbGwgbm90IGJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogVGhlIHN0b3JlIGxpdmVzIGluIGEgZGVkaWNhdGVkIGBtYXN0cmFfaW5zdGFuY2VgIHNjaGVtYSBzbyBpdFxuICAgKiBuZXZlciBjb2xsaWRlcyB3aXRoIHBlci1hZ2VudCB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gbmFtZXNwYWNlcy5cbiAgICogV29ya2Zsb3cgc25hcHNob3RzIGFyZSBub3QgcGVyLWFnZW50IHN0YXRlOyB0aGV5IGJlbG9uZyB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdGhhdCBvd25zIHRoZSB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqL1xuICBpbnN0YW5jZVN0b3JhZ2UoKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2V0dGluZyA9IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKFxuICAgICAgICAgIHdpdGhJZChzZXR0aW5nLCBcIm1hc3RyYS1zdG9yZV9faW5zdGFuY2VcIikgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgICAgdHlwZW9mIFBvc3RncmVzU3RvcmVcbiAgICAgICAgICA+WzBdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoe1xuICAgICAgICBpZDogXCJtYXN0cmEtc3RvcmVfX2luc3RhbmNlXCIsXG4gICAgICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgICAgIHBvb2w6IHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYE1lbW9yeWAgZm9yIGBhZ2VudElkYCBhZnRlciB0aGUgcGx1Z2luL2FnZW50IGNhc2NhZGUuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgYWdlbnQgaGFzIG5laXRoZXIgc3RvcmFnZSBub3IgYVxuICAgKiB2ZWN0b3Igc3RvcmUgZW5hYmxlZCAtIE1hc3RyYSBhY2NlcHRzIGEgbWlzc2luZyBgbWVtb3J5YCBmaWVsZFxuICAgKiBhbmQgdHJlYXRzIHRoZSBhZ2VudCBhcyBzdGF0ZWxlc3MuXG4gICAqL1xuICBmb3JBZ2VudChhZ2VudElkOiBzdHJpbmcsIGRlZjogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uKTogTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdG9yYWdlU2V0dGluZyA9IGRlZi5zdG9yYWdlID8/IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgY29uc3QgbWVtb3J5U2V0dGluZyA9IGRlZi5tZW1vcnkgPz8gdGhpcy5jb25maWcubWVtb3J5O1xuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYnVpbGRTdG9yYWdlKGFnZW50SWQsIHN0b3JhZ2VTZXR0aW5nKTtcbiAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLmJ1aWxkVmVjdG9yKG1lbW9yeVNldHRpbmcpO1xuICAgIGlmICghc3RvcmFnZSAmJiAhdmVjdG9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpzdGF0ZWxlc3NcIiwgeyBhZ2VudElkIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJhZ2VudDpjb25maWd1cmVkXCIsIHtcbiAgICAgIGFnZW50SWQsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlICE9PSB1bmRlZmluZWQsXG4gICAgICB2ZWN0b3I6IHZlY3RvciAhPT0gdW5kZWZpbmVkLFxuICAgICAgdmVjdG9yTW9kZTpcbiAgICAgICAgdmVjdG9yID09PSB1bmRlZmluZWQgPyBcIm9mZlwiIDogdHlwZW9mIG1lbW9yeVNldHRpbmcgPT09IFwib2JqZWN0XCIgPyBcImRlZGljYXRlZFwiIDogXCJzaGFyZWRcIixcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgTWVtb3J5KHtcbiAgICAgIC4uLihzdG9yYWdlID8geyBzdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4odmVjdG9yID8geyB2ZWN0b3IsIGVtYmVkZGVyOiBmYXN0ZW1iZWQgfSA6IHt9KSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgbGFzdE1lc3NhZ2VzOiAxMCxcbiAgICAgICAgLi4uKHZlY3RvclxuICAgICAgICAgID8geyBzZW1hbnRpY1JlY2FsbDogeyB0b3BLOiAzLCBtZXNzYWdlUmFuZ2U6IDIsIHNjb3BlOiBcInJlc291cmNlXCIgYXMgY29uc3QgfSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC8vIEF1dG8tbmFtZSBlYWNoIHRocmVhZCBmcm9tIGl0cyBvcGVuaW5nIHR1cm4gc28gdGhlXG4gICAgICAgIC8vIGNvbnZlcnNhdGlvbiBsaXN0IHRoZSBVSSByZW5kZXJzIHNob3dzIG1lYW5pbmdmdWwgdGl0bGVzXG4gICAgICAgIC8vIGluc3RlYWQgb2YgcmF3IGlkcy4gVGl0bGluZyBydW5zIG9uIHRoZSBzbWFsbCAvIGZhc3QgY2hhdFxuICAgICAgICAvLyB0aWVyIChzZWUgYHN1bW1hcml6ZS50c2ApIHJhdGhlciB0aGFuIHRoZSBhZ2VudCdzIHByaW1hcnlcbiAgICAgICAgLy8gbW9kZWwsIHNvIG5hbWluZyBhIHRocmVhZCBuZXZlciBzcGVuZHMgdGhlIGhlYXZ5d2VpZ2h0IG1vZGVsLlxuICAgICAgICAvLyBPbmx5IG1lYW5pbmdmdWwgd2hlbiBzdG9yYWdlIGlzIG9uOyBoYXJtbGVzcyBvdGhlcndpc2UuXG4gICAgICAgIC4uLihzdG9yYWdlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlVGl0bGU6IHtcbiAgICAgICAgICAgICAgICBtb2RlbDogc3VtbWFyeU1vZGVsKHRoaXMuY29uZmlnKSxcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFRJVExFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RvcmFnZShhZ2VudElkOiBzdHJpbmcsIHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmICghdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgICBuZXcgUG9zdGdyZXNTdG9yZSh7XG4gICAgICAgICAgaWQ6IGBtYXN0cmEtc3RvcmVfXyR7YWdlbnRJZH1gLFxuICAgICAgICAgIHNjaGVtYU5hbWU6IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUoYWdlbnRJZCksXG4gICAgICAgICAgcG9vbDogdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDYXN0OiBgd2l0aElkYCBndWFyYW50ZWVzIGBpZGAgaXMgc2V0LCBidXQgdGhlIGRpc3RyaWJ1dGl2ZVxuICAgIC8vIE9taXQgKyBgaWQ/OiBzdHJpbmdgIHNoYXBlIGRvZXNuJ3Qgc3RydWN0dXJhbGx5IG5hcnJvdyB0byB0aGVcbiAgICAvLyBkaXNjcmltaW5hdGVkIHVuaW9uIG1lbWJlcnMuIFJ1bnRpbWUgc2hhcGUgaXMgaWRlbnRpY2FsLlxuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoXG4gICAgICAgIHdpdGhJZChzZXR0aW5nLCBgbWFzdHJhLXN0b3JlX18ke2FnZW50SWR9YCkgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBQb3N0Z3Jlc1N0b3JlXG4gICAgICAgID5bMF0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYWdlbnQncyB2ZWN0b3Igc3RvcmUuIENhc2NhZGU6XG4gICAqXG4gICAqIC0gZmFsc3k6IG5vIHZlY3Rvci5cbiAgICogLSBgYm9vbGVhbmAgLyBgdW5kZWZpbmVkLWluaGVyaXRpbmctdHJ1ZWA6IHJldHVybiB0aGUgc2hhcmVkXG4gICAqICAgc2luZ2xldG9uIChidWlsdCBsYXppbHkgb24gZmlyc3QgY2FsbCkuIEFsbCBhZ2VudHMgdGhhdFxuICAgKiAgIGRlZmF1bHQtZW5hYmxlIG1lbW9yeSB3cml0ZSBpbnRvIGFuZCByZWNhbGwgZnJvbSBvbmUgaW5kZXguXG4gICAqIC0gb2JqZWN0OiBidWlsZCBhIGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzIGFnZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFZlY3RvcihzZXR0aW5nOiBNZW1vcnlTZXR0aW5nKTogUGdWZWN0b3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghc2V0dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHNldHRpbmcgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdGhpcy5nZXRTaGFyZWRWZWN0b3IoKTtcbiAgICByZXR1cm4gYnVpbGRQZ1ZlY3RvcihzZXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2hhcmVkVmVjdG9yKCk6IFBnVmVjdG9yIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVkVmVjdG9yKSB7XG4gICAgICBpZiAoIXRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTGFrZWJhc2UgaXMgcmVxdWlyZWQgZm9yIFBnVmVjdG9yIG1lbW9yeVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hhcmVkVmVjdG9yID0gYnVpbGRTaGFyZWRQZ1ZlY3Rvcih0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVmVjdG9yO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHRoYXQgYmFja3MgdGhlIGRlZmF1bHRcbiAqIGBkZWYubWVtb3J5ID09PSB0cnVlYCBjYXNlIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqXG4gKiBgUGdWZWN0b3JgJ3MgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGNvbm5lY3Rpb24tc3R5bGUgY29uZmlnc1xuICogKGBIb3N0Q29uZmlnYCAvIGBDb25uZWN0aW9uU3RyaW5nQ29uZmlnYCAvIGBDbGllbnRDb25maWdgKTsgdGhlcmUgaXNcbiAqIG5vIGB7IHBvb2wgfWAgc2hvcnRoYW5kIHRoZSB3YXkgYFBvc3RncmVzU3RvcmVgIGhhcyBvbmUuIFdvcnNlLCB0aGVcbiAqIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkga2lja3Mgb2ZmIGEgYGNhY2hlV2FybXVwUHJvbWlzZWAgSUlGRSB0aGF0XG4gKiBjYWxscyBgdGhpcy5wb29sLmNvbm5lY3QoKWAgYmVmb3JlIHJldHVybmluZywgc28gd2UgY2FuJ3QgY2xlYW5seVxuICogaGFuZCBpdCBhbiBpbmVydCBjb25maWcgYW5kIHBhdGNoIHRoZSBwb29sIGFmdGVyd2FyZHMuXG4gKlxuICogVGhlIHRyaWNrOiBwYXNzIGlsbGVnYWwtYnV0LXZhbGlkYXRpb24tcGFzc2luZyBwbGFjZWhvbGRlcnMgc28gdGhlXG4gKiB3YXJtdXAncyBgbmV0LmNvbm5lY3QoKWAgcmVqZWN0cyBzeW5jaHJvbm91c2x5IHdpdGggYFJhbmdlRXJyb3JgXG4gKiAoTm9kZSB2YWxpZGF0ZXMgYDAgPD0gcG9ydCA8IDY1NTM2YCkuIFRoZSBJSUZFJ3MgYGNhdGNoIHt9YCBzd2FsbG93c1xuICogaXQsIG5vIEROUyBsb29rdXAgb3IgVENQIGF0dGVtcHQgaGFwcGVucywgYW5kIHdlIHRoZW4gc3dhcFxuICogYHBnVmVjdG9yLnBvb2xgIHRvIHRoZSBsYWtlYmFzZSBwb29sLiBFdmVyeSBzdWJzZXF1ZW50IGBQZ1ZlY3RvcmBcbiAqIG1ldGhvZCByZWFkcyBgdGhpcy5wb29sYCBhdCBjYWxsIHRpbWUsIHNvIGFsbCByZWFsIEkvTyBnb2VzIHRocm91Z2hcbiAqIHRoZSBsYWtlYmFzZSBwb29sIGZyb20gdGhlbiBvbi4gVGhlIHBsYWNlaG9sZGVyIHBvb2wgaXMgYC5lbmQoKWAnZFxuICogc28gaXRzIHNvY2tldCBib29rLWtlZXBpbmcgaXMgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2hhcmVkUGdWZWN0b3IocG9vbDogUG9vbCk6IFBnVmVjdG9yIHtcbiAgY29uc3QgdmVjdG9yID0gbmV3IFBnVmVjdG9yKHtcbiAgICBpZDogYHBnJHtpZCgpfWAsXG4gICAgLy8gS2VlcCB0aGUgcmVjYWxsIGluZGV4IG91dCBvZiBgcHVibGljYDogb24gYSBMYWtlYmFzZSBkYXRhYmFzZSB0aGUgYXBwXG4gICAgLy8gc2VydmljZSBwcmluY2lwYWwgaGFzIG5vIENSRUFURSBvbiBgcHVibGljYCAoUEcxNSsgbG9ja3MgaXQgZG93biksIHNvIGFcbiAgICAvLyBkZWZhdWx0LXNjaGVtYSBQZ1ZlY3RvciBmYWlscyBvbiBDUkVBVEUgSU5ERVggd2l0aCBcInBlcm1pc3Npb24gZGVuaWVkIGZvclxuICAgIC8vIHNjaGVtYSBwdWJsaWNcIi4gUGdWZWN0b3IgcnVucyBDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgZm9yIGEgbmFtZWRcbiAgICAvLyBzY2hlbWEsIHNvIHRoZSBTUCBjcmVhdGVzIGFuZCBvd25zIGBtYXN0cmFfaW5zdGFuY2VgICh0aGUgc2FtZVxuICAgIC8vIGluc3RhbmNlLWxldmVsIHNjaGVtYSB0aGUgd29ya2Zsb3ctc25hcHNob3Qgc3RvcmUgdXNlcykgYW5kIHRoZSBpbmRleFxuICAgIC8vIGxhbmRzIHRoZXJlLiBUYWJsZSBuYW1lcyBkb24ndCBjb2xsaWRlIHdpdGggdGhlIHN0b3JhZ2UgdGFibGVzLlxuICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgaG9zdDogXCItMVwiLFxuICAgIHBvcnQ6IC0xLFxuICAgIGRhdGFiYXNlOiBcIl9cIixcbiAgICB1c2VyOiBcIl9cIixcbiAgICBwYXNzd29yZDogXCJfXCIsXG4gIH0pO1xuICBjb25zdCBwbGFjZWhvbGRlciA9IHZlY3Rvci5wb29sO1xuICB2ZWN0b3IucG9vbCA9IHBvb2w7XG4gIHZvaWQgcGxhY2Vob2xkZXIuZW5kKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHZlY3Rvcjtcbn1cblxuLyoqIFBlci1hZ2VudCBkZWRpY2F0ZWQgYFBnVmVjdG9yYCAocmFyZTsgb3B0LWluIHZpYSBvYmplY3Qgb3ZlcnJpZGUpLiAqL1xuZnVuY3Rpb24gYnVpbGRQZ1ZlY3RvcihzZXR0aW5nOiBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSk6IFBnVmVjdG9yIHtcbiAgcmV0dXJuIG5ldyBQZ1ZlY3RvcihcbiAgICB3aXRoSWQoc2V0dGluZywgYHBnLXZlY3Rvcl9fJHtpZCgpfWApIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgUGdWZWN0b3I+WzBdLFxuICApO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoaXMgc2V0dGluZyByZXF1aXJlcyB0aGUgc2hhcmVkIExha2ViYXNlIHBvb2wuICovXG5mdW5jdGlvbiBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nIHwgTWVtb3J5U2V0dGluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2V0dGluZyA9PT0gdHJ1ZTtcbn1cblxuLyoqIFdhbGsgdGhlIHRocmVlIHNoYXBlcyBvZiBgY29uZmlnLmFnZW50c2AgaW50byBhIGZsYXQgbGlzdC4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBZ2VudERlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW10ge1xuICBjb25zdCBhZ2VudHMgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWFnZW50cykgcmV0dXJuIFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShhZ2VudHMpKSByZXR1cm4gYWdlbnRzO1xuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBhZ2VudHMpIHtcbiAgICByZXR1cm4gW2FnZW50cyBhcyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25dO1xuICB9XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGFnZW50cyk7XG59XG5cbi8qKiBGaWxsIGluIGEgZGVmYXVsdCBgaWRgIHdoZW4gdGhlIGNhbGxlciBkaWRuJ3Qgc3VwcGx5IG9uZS4gKi9cbmZ1bmN0aW9uIHdpdGhJZDxUIGV4dGVuZHMgeyBpZD86IHN0cmluZyB9Pih2YWx1ZTogVCwgZmFsbGJhY2s6IHN0cmluZyk6IFQge1xuICByZXR1cm4gdmFsdWUuaWQgPyB2YWx1ZSA6IHsgLi4udmFsdWUsIGlkOiBmYWxsYmFjayB9O1xufVxuIl19
@@ -24,8 +24,8 @@
24
24
  *
25
25
  * @module
26
26
  */
27
- import { appkit } from "@dbx-tools/appkit";
28
- import { feedback } from "@dbx-tools/shared-mastra";
27
+ import { type WorkspaceClientLike } from "@dbx-tools/appkit";
28
+ import { type MlflowFeedbackRequest } from "@dbx-tools/shared-mastra";
29
29
  import type { Context } from "@opentelemetry/api";
30
30
  import type { ReadableSpan, Span as SdkSpan, SpanProcessor } from "@opentelemetry/sdk-trace-base";
31
31
  type MlflowModule = typeof import("@mlflow/core");
@@ -48,7 +48,7 @@ export declare class AgentTraceSpanProcessor implements SpanProcessor {
48
48
  shutdown(): Promise<void>;
49
49
  }
50
50
  /** Workspace client carried on an AppKit execution context. */
51
- type WorkspaceClient = appkit.WorkspaceClientLike;
51
+ type WorkspaceClient = WorkspaceClientLike;
52
52
  /**
53
53
  * UC table prefix the assessments API needs, read from experiment tags.
54
54
  *
@@ -134,7 +134,7 @@ export declare function mlflowEnabled(): boolean;
134
134
  */
135
135
  export declare function mlflowExperimentManagerUrl(client: WorkspaceClient): Promise<string | undefined>;
136
136
  /** Parameters for {@link logFeedback}. */
137
- export type LogFeedbackParams = feedback.MlflowFeedbackRequest & {
137
+ export type LogFeedbackParams = MlflowFeedbackRequest & {
138
138
  /** Identity the feedback is attributed to (user email / id). */
139
139
  sourceId?: string;
140
140
  };