@pipeline-builder/api-core 4.1.20 → 4.1.21

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 (36) hide show
  1. package/lib/helpers/access-helpers.d.ts +50 -2
  2. package/lib/helpers/access-helpers.js +44 -3
  3. package/lib/helpers/index.d.ts +1 -1
  4. package/lib/helpers/index.js +2 -2
  5. package/lib/middleware/ask-provenance.d.ts +53 -0
  6. package/lib/middleware/ask-provenance.js +26 -0
  7. package/lib/middleware/index.d.ts +1 -0
  8. package/lib/middleware/index.js +2 -1
  9. package/lib/services/http-client.d.ts +0 -1
  10. package/lib/services/http-client.js +5 -7
  11. package/lib/services/index.d.ts +2 -2
  12. package/lib/services/index.js +3 -3
  13. package/lib/services/remote-audit-client.d.ts +1 -15
  14. package/lib/services/remote-audit-client.js +2 -295
  15. package/lib/services/s3-client.d.ts +54 -0
  16. package/lib/services/s3-client.js +106 -0
  17. package/lib/types/ask-proposals.d.ts +269 -0
  18. package/lib/types/ask-proposals.js +308 -0
  19. package/lib/types/compliance-exemption.d.ts +24 -0
  20. package/lib/types/compliance-exemption.js +4 -0
  21. package/lib/types/index.d.ts +5 -2
  22. package/lib/types/index.js +5 -2
  23. package/lib/types/remote-audit-actions.d.ts +23 -0
  24. package/lib/types/remote-audit-actions.js +305 -0
  25. package/lib/utils/date.d.ts +19 -0
  26. package/lib/utils/date.js +22 -0
  27. package/lib/utils/dsse.d.ts +32 -0
  28. package/lib/utils/dsse.js +55 -0
  29. package/lib/utils/index.d.ts +3 -1
  30. package/lib/utils/index.js +4 -2
  31. package/lib/utils/response.d.ts +34 -4
  32. package/lib/utils/response.js +30 -5
  33. package/lib/utils/sensitive-patterns.js +17 -1
  34. package/lib/validation/index.d.ts +2 -2
  35. package/lib/validation/index.js +3 -3
  36. package/package.json +13 -1
@@ -4,9 +4,23 @@ import type { Visibility } from '../types/visibility.js';
4
4
  /** The slice of a catalog entity the write gate needs. */
5
5
  export interface VisibilityWriteTarget {
6
6
  /** Rung the row currently sits at — see {@link Visibility}. */
7
- visibility?: string;
7
+ visibility?: string | null;
8
8
  /** Author. The only non-admin who may touch a `private` row. */
9
- createdBy?: string;
9
+ createdBy?: string | null;
10
+ }
11
+ /**
12
+ * The caller's authority on the visibility ladder, as PLAIN DATA.
13
+ *
14
+ * Captured from the request (`isSystemAdmin(req)`,
15
+ * `userHasPermission(req, '<entity>:publish')`) at the edge, so the same gate
16
+ * can run where no `Request` exists — a plugin deploy performed by a BullMQ
17
+ * worker, or `CrudService.bulkDelete` down in the data layer. That is the whole
18
+ * reason {@link checkWriteAccess} and {@link checkVisibilityWriteAccess} are two
19
+ * functions: one rule, two ways of naming the caller.
20
+ */
21
+ export interface WriteAccess {
22
+ isSystemAdmin: boolean;
23
+ canPublish: boolean;
10
24
  }
11
25
  /**
12
26
  * Check whether the caller may modify a catalog entity, per its visibility rung.
@@ -49,6 +63,40 @@ export type VisibilityWriteVerdict = 'ok' | 'needs-publish' | 'not-author';
49
63
  * - `public` → requires `publishPermission`
50
64
  */
51
65
  export declare function checkVisibilityWriteAccess(req: Request, resource: VisibilityWriteTarget, userId: string, publishPermission: Permission): VisibilityWriteVerdict;
66
+ /**
67
+ * The visibility write rule itself, over a request-free {@link WriteAccess}.
68
+ *
69
+ * THE one implementation — `checkVisibilityWriteAccess` is this function with
70
+ * the caller's authority read off a `Request`. The job path (a plugin deploy
71
+ * running in a BullMQ worker, long after the HTTP request is gone) and the
72
+ * request path must never drift: a job-path gate that disagreed with the
73
+ * request-path gate is a tenancy bug, not a cosmetic one, so there is no second
74
+ * copy of the rungs to drift.
75
+ *
76
+ * Callers layer their own not-found / already-exists policy on top and turn the
77
+ * verdict into a user-facing message; the RULE stays here.
78
+ *
79
+ * - `private` → author only (fails closed on an empty `userId`)
80
+ * - `org` → any member of the org
81
+ * - `public` → requires the publish capability
82
+ */
83
+ export declare function checkWriteAccess(resource: VisibilityWriteTarget, userId: string, access: WriteAccess): VisibilityWriteVerdict;
84
+ /** A bulk-operation row: its id, plus the slice the write gate reads. */
85
+ export interface BulkWriteRow extends VisibilityWriteTarget {
86
+ id: string;
87
+ }
88
+ /**
89
+ * Apply the per-row write gate across a BULK operation's matched rows, and
90
+ * refuse the WHOLE batch if any row fails.
91
+ *
92
+ * All-or-nothing on purpose: a partial bulk write is impossible for a client to
93
+ * reason about, and the 403 names the offending `ids` so the caller can retry
94
+ * with a narrowed set.
95
+ *
96
+ * Returns `true` having ALREADY sent a 403 (so the route returns); `false` when
97
+ * every row is writable and the batch may proceed.
98
+ */
99
+ export declare function rejectForbiddenBulkRows(req: Request, res: Response, rows: readonly BulkWriteRow[], userId: string, publishPermission: Permission, message: string): boolean;
52
100
  /**
53
101
  * Resolve the effective visibility for an entity being created or updated.
54
102
  *
@@ -50,9 +50,32 @@ export function requireVisibilityWriteAccess(req, res, resource, userId, publish
50
50
  * - `public` → requires `publishPermission`
51
51
  */
52
52
  export function checkVisibilityWriteAccess(req, resource, userId, publishPermission) {
53
- if (isSystemAdmin(req))
53
+ return checkWriteAccess(resource, userId, {
54
+ isSystemAdmin: isSystemAdmin(req),
55
+ canPublish: userHasPermission(req, publishPermission),
56
+ });
57
+ }
58
+ /**
59
+ * The visibility write rule itself, over a request-free {@link WriteAccess}.
60
+ *
61
+ * THE one implementation — `checkVisibilityWriteAccess` is this function with
62
+ * the caller's authority read off a `Request`. The job path (a plugin deploy
63
+ * running in a BullMQ worker, long after the HTTP request is gone) and the
64
+ * request path must never drift: a job-path gate that disagreed with the
65
+ * request-path gate is a tenancy bug, not a cosmetic one, so there is no second
66
+ * copy of the rungs to drift.
67
+ *
68
+ * Callers layer their own not-found / already-exists policy on top and turn the
69
+ * verdict into a user-facing message; the RULE stays here.
70
+ *
71
+ * - `private` → author only (fails closed on an empty `userId`)
72
+ * - `org` → any member of the org
73
+ * - `public` → requires the publish capability
74
+ */
75
+ export function checkWriteAccess(resource, userId, access) {
76
+ if (access.isSystemAdmin)
54
77
  return 'ok';
55
- if (resource.visibility === 'public' && !userHasPermission(req, publishPermission)) {
78
+ if (resource.visibility === 'public' && !access.canPublish) {
56
79
  return 'needs-publish';
57
80
  }
58
81
  // Fail closed on an anonymous/absent caller — an empty userId must never match
@@ -62,6 +85,24 @@ export function checkVisibilityWriteAccess(req, resource, userId, publishPermiss
62
85
  }
63
86
  return 'ok';
64
87
  }
88
+ /**
89
+ * Apply the per-row write gate across a BULK operation's matched rows, and
90
+ * refuse the WHOLE batch if any row fails.
91
+ *
92
+ * All-or-nothing on purpose: a partial bulk write is impossible for a client to
93
+ * reason about, and the 403 names the offending `ids` so the caller can retry
94
+ * with a narrowed set.
95
+ *
96
+ * Returns `true` having ALREADY sent a 403 (so the route returns); `false` when
97
+ * every row is writable and the batch may proceed.
98
+ */
99
+ export function rejectForbiddenBulkRows(req, res, rows, userId, publishPermission, message) {
100
+ const forbidden = rows.filter((row) => checkVisibilityWriteAccess(req, row, userId, publishPermission) !== 'ok');
101
+ if (forbidden.length === 0)
102
+ return false;
103
+ sendError(res, 403, message, ErrorCode.INSUFFICIENT_PERMISSIONS, { ids: forbidden.map((row) => row.id) });
104
+ return true;
105
+ }
65
106
  /**
66
107
  * Resolve the effective visibility for an entity being created or updated.
67
108
  *
@@ -97,4 +138,4 @@ export function resolveVisibility(req, requested, publishPermission, fallback =
97
138
  return 'private';
98
139
  return fallback;
99
140
  }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9hY2Nlc3MtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBVWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxHQUFZLEVBQ1osR0FBYSxFQUNiLFFBQStCLEVBQy9CLE1BQWMsRUFDZCxpQkFBNkI7SUFFN0IsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRixJQUFJLE9BQU8sS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsU0FBUyxDQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gsT0FBTyxLQUFLLGVBQWU7UUFDekIsQ0FBQyxDQUFDLHFEQUFxRDtRQUN2RCxDQUFDLENBQUMsZ0RBQWdELEVBQ3BELFNBQVMsQ0FBQyx3QkFBd0IsQ0FDbkMsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUtEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLEdBQVksRUFDWixRQUErQixFQUMvQixNQUFjLEVBQ2QsaUJBQTZCO0lBRTdCLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXBDLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ25GLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsMkRBQTJEO0lBQzNELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDcEYsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEdBQVksRUFDWixTQUE2QixFQUM3QixpQkFBNkIsRUFDN0IsUUFBUSxHQUFlLFNBQVM7SUFFaEMsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDM0IsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEUsQ0FBQztJQUNELElBQUksU0FBUyxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0QyxJQUFJLFNBQVMsS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUMsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBpc1N5c3RlbUFkbWluLCB1c2VySGFzUGVybWlzc2lvbiB9IGZyb20gJy4uL21pZGRsZXdhcmUvcGVybWlzc2lvbi1nYXRlcy5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcuLi90eXBlcy9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFZpc2liaWxpdHkgfSBmcm9tICcuLi90eXBlcy92aXNpYmlsaXR5LmpzJztcbmltcG9ydCB7IHNlbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqIFRoZSBzbGljZSBvZiBhIGNhdGFsb2cgZW50aXR5IHRoZSB3cml0ZSBnYXRlIG5lZWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXNpYmlsaXR5V3JpdGVUYXJnZXQge1xuICAvKiogUnVuZyB0aGUgcm93IGN1cnJlbnRseSBzaXRzIGF0IOKAlCBzZWUge0BsaW5rIFZpc2liaWxpdHl9LiAqL1xuICB2aXNpYmlsaXR5Pzogc3RyaW5nO1xuICAvKiogQXV0aG9yLiBUaGUgb25seSBub24tYWRtaW4gd2hvIG1heSB0b3VjaCBhIGBwcml2YXRlYCByb3cuICovXG4gIGNyZWF0ZWRCeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBjYWxsZXIgbWF5IG1vZGlmeSBhIGNhdGFsb2cgZW50aXR5LCBwZXIgaXRzIHZpc2liaWxpdHkgcnVuZy5cbiAqIFRoZSBzaW5nbGUgd3JpdGUgZ2F0ZSBiZWhpbmQgZXZlcnkgcGlwZWxpbmUgLyBwbHVnaW4gLyB0ZW1wbGF0ZSBtdXRhdGlvbi5cbiAqXG4gKiAtIGBwdWJsaWNgIOKAlCBhIHN5c3RlbSBhZG1pbiwgb3IgdGhlIGhvbGRlciBvZiBgcHVibGlzaFBlcm1pc3Npb25gICh0aGUgc2FtZVxuICogICBwZXJtaXNzaW9uIHRoYXQgbGV0IHRoZW0gcHVibGlzaCBpdCBpbiB0aGUgZmlyc3QgcGxhY2UsIHNvIHdob2V2ZXIgY2FuXG4gKiAgIHB1Ymxpc2ggY2FuIGFsc28gbWFuYWdlIHdoYXQgdGhleSBwdWJsaXNoZWQpXG4gKiAtIGBvcmdgIOKAlCBhbnlvbmUgd2hvIGdvdCB0aGlzIGZhcjogdGhlIHJlc291cmNlJ3MgYDp3cml0ZWAgcGVybWlzc2lvbiBwbHVzIHRoZVxuICogICBvcmcgc2NvcGluZyB0aGUgY2FsbGVyIGFscmVhZHkgcGFzc2VkIElTIHRoZSBnYXRlXG4gKiAtIGBwcml2YXRlYCDigJQgdGhlIEFVVEhPUiBhbG9uZSAocGx1cyBzeXN0ZW0gYWRtaW5zKVxuICpcbiAqIFRoZSBgcHJpdmF0ZWAgYnJhbmNoIGlzIGxvYWQtYmVhcmluZyBvbiB0aGUgVE9NQlNUT05FIHBhdGhzIChyZXN0b3JlIC8gcHVyZ2UpLFxuICogd2hpY2ggYXJlIG9yZy1zY29wZWQgcmF0aGVyIHRoYW4gdmlzaWJpbGl0eS1zY29wZWQgYmVjYXVzZSBzb2Z0LWRlbGV0ZSBpcyBvbmVcbiAqIHNoYXJlZCBjb2RlIHBhdGgg4oCUIHdpdGhvdXQgaXQsIGFueSBvcmcgbWVtYmVyIGNvdWxkIHJlc3VycmVjdCBzb21lb25lIGVsc2Unc1xuICogcGVyc29uYWwgZHJhZnQuIE9uIHRoZSBsaXZlIHBhdGhzIHRoZSByZWFkIHByZWRpY2F0ZSBoYXMgYWxyZWFkeSBoaWRkZW4gdGhlXG4gKiByb3csIG1ha2luZyB0aGlzIGRlZmVuc2UgaW4gZGVwdGguXG4gKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlcXVlc3QgbWF5IHByb2NlZWQ7IHJldHVybnMgYGZhbHNlYCBoYXZpbmcgQUxSRUFEWSBzZW50XG4gKiBhIDQwMy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKCFyZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzKHJlcSwgcmVzLCBwaXBlbGluZSwgdXNlcklkLCAncGlwZWxpbmVzOnB1Ymxpc2gnKSkgcmV0dXJuO1xuICogYXdhaXQgcGlwZWxpbmVTZXJ2aWNlLmRlbGV0ZShpZCwgb3JnSWQsIHVzZXJJZCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgcmVzb3VyY2U6IFZpc2liaWxpdHlXcml0ZVRhcmdldCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHB1Ymxpc2hQZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZlcmRpY3QgPSBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcyhyZXEsIHJlc291cmNlLCB1c2VySWQsIHB1Ymxpc2hQZXJtaXNzaW9uKTtcbiAgaWYgKHZlcmRpY3QgPT09ICdvaycpIHJldHVybiB0cnVlO1xuICBzZW5kRXJyb3IoXG4gICAgcmVzLFxuICAgIDQwMyxcbiAgICB2ZXJkaWN0ID09PSAnbmVlZHMtcHVibGlzaCdcbiAgICAgID8gJ1lvdSBsYWNrIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoaXMgcHVibGljIHJlc291cmNlLidcbiAgICAgIDogJ09ubHkgdGhlIGF1dGhvciBjYW4gbW9kaWZ5IGEgcHJpdmF0ZSByZXNvdXJjZS4nLFxuICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoeSBhIHdyaXRlIHdhcyByZWZ1c2VkLCBvciBgJ29rJ2AuIFNlZSB7QGxpbmsgY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3N9LiAqL1xuZXhwb3J0IHR5cGUgVmlzaWJpbGl0eVdyaXRlVmVyZGljdCA9ICdvaycgfCAnbmVlZHMtcHVibGlzaCcgfCAnbm90LWF1dGhvcic7XG5cbi8qKlxuICogVGhlIHZpc2liaWxpdHkgd3JpdGUgcnVsZSBhcyBhIFBSRURJQ0FURSwgd2l0aCBubyByZXNwb25zZSBzaWRlLWVmZmVjdC5cbiAqXG4gKiBFeHRyYWN0ZWQgc28gQlVMSyByb3V0ZXMgYXBwbHkgdGhlIGlkZW50aWNhbCBydWxlIHBlciByb3cgaW5zdGVhZCBvZlxuICogcmUtZGVyaXZpbmcgaXQg4oCUIGEgYnVsayBydWxlIHRoYXQgZGlzYWdyZWVkIHdvdWxkIDQwMyBjYXNlcyBzaW5nbGUtcm93XG4gKiBkZWxldGUvdXBkYXRlIGFsbG93IChhbiBgb3JnYCByb3cgd2l0aCBwbGFpbiBgOndyaXRlYCwgdGhlIGRlZmF1bHQgcnVuZykuXG4gKlxuICogICAtIGBwcml2YXRlYCDihpIgYXV0aG9yIG9ubHlcbiAqICAgLSBgb3JnYCAgICAg4oaSIGFueSBtZW1iZXIgb2YgdGhlIG9yZ1xuICogICAtIGBwdWJsaWNgICDihpIgcmVxdWlyZXMgYHB1Ymxpc2hQZXJtaXNzaW9uYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzb3VyY2U6IFZpc2liaWxpdHlXcml0ZVRhcmdldCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHB1Ymxpc2hQZXJtaXNzaW9uOiBQZXJtaXNzaW9uLFxuKTogVmlzaWJpbGl0eVdyaXRlVmVyZGljdCB7XG4gIGlmIChpc1N5c3RlbUFkbWluKHJlcSkpIHJldHVybiAnb2snO1xuXG4gIGlmIChyZXNvdXJjZS52aXNpYmlsaXR5ID09PSAncHVibGljJyAmJiAhdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwdWJsaXNoUGVybWlzc2lvbikpIHtcbiAgICByZXR1cm4gJ25lZWRzLXB1Ymxpc2gnO1xuICB9XG5cbiAgLy8gRmFpbCBjbG9zZWQgb24gYW4gYW5vbnltb3VzL2Fic2VudCBjYWxsZXIg4oCUIGFuIGVtcHR5IHVzZXJJZCBtdXN0IG5ldmVyIG1hdGNoXG4gIC8vIGFuIGVtcHR5IGBjcmVhdGVkQnlgIGFuZCBoYW5kIG92ZXIgc29tZW9uZSBlbHNlJ3MgZHJhZnQuXG4gIGlmIChyZXNvdXJjZS52aXNpYmlsaXR5ID09PSAncHJpdmF0ZScgJiYgKCF1c2VySWQgfHwgcmVzb3VyY2UuY3JlYXRlZEJ5ICE9PSB1c2VySWQpKSB7XG4gICAgcmV0dXJuICdub3QtYXV0aG9yJztcbiAgfVxuXG4gIHJldHVybiAnb2snO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSB2aXNpYmlsaXR5IGZvciBhbiBlbnRpdHkgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLlxuICpcbiAqIGBwdWJsaWNgIHJlcXVpcmVzIHRoZSBwdWJsaXNoIGNhcGFiaWxpdHkgKHN1cGVyYWRtaW5zIHBhc3MgdmlhIGltcGxpY2l0LWFsbCk7XG4gKiBhIGNhbGxlciB3aG8gYXNrcyBmb3IgaXQgd2l0aG91dCB0aGUgcGVybWlzc2lvbiBpcyBjbGFtcGVkIHRvIGBvcmdgIHJhdGhlclxuICogdGhhbiBkcm9wcGVkIHRvIGEgcGVyc29uYWwgZHJhZnQg4oCUIHRoZXkgYXNrZWQgdG8gU0hBUkUgaXQsIGFuZCBgb3JnYCBpcyB0aGVcbiAqIHdpZGVzdCBydW5nIHRoZXkgYXJlIGVudGl0bGVkIHRvLiBBbnl0aGluZyBlbHNlIHBhc3NlcyB0aHJvdWdoLlxuICpcbiAqIGBmYWxsYmFja2AgaXMgdGhlIHJ1bmcgYW4gVU5TUEVDSUZJRUQgdmlzaWJpbGl0eSBsYW5kcyBvbiwgYW5kIGl0IGlzXG4gKiBkZWxpYmVyYXRlbHkgcGVyLWVudGl0eSBldmVuIHRob3VnaCB0aGUgbGFkZGVyIGl0c2VsZiBpcyBpZGVudGljYWwgZXZlcnl3aGVyZTpcbiAqXG4gKiAtICoqdGVtcGxhdGVzKiogZGVmYXVsdCB0byBgcHJpdmF0ZWAg4oCUIGRyYWZ0LWZpcnN0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGVcbiAqICAgcGVyc29uYWwgcnVuZzsgeW91IHBvbGlzaCBhIHN0YXJ0ZXIgYmVmb3JlIHB1Ymxpc2hpbmcgaXQuXG4gKiAtICoqcGlwZWxpbmVzIC8gcGx1Z2lucyoqIGRlZmF1bHQgdG8gYG9yZ2Ag4oCUIHRoZXkgYXJlIHRlYW0gYXNzZXRzIHRoYXQgZGVwbG95XG4gKiAgIHNoYXJlZCBpbmZyYXN0cnVjdHVyZSwgc28gY3JlYXRpbmcgb25lIG11c3Qgbm90IGhpZGUgaXQgZnJvbSB0aGUgdGVhbS4gQVxuICogICBwZXJzb25hbCBkcmFmdCBzdGF5cyBhdmFpbGFibGUsIGJ1dCBvcHQtaW4uXG4gKlxuICogU2FtZSBsYWRkZXIsIHNhbWUgZ2F0ZSwgZGlmZmVyZW50IGNlbnRyZSBvZiBncmF2aXR5IOKAlCBleHByZXNzZWQgYXMgYW4gYXJndW1lbnRcbiAqIHJhdGhlciB0aGFuIGEgc2Vjb25kIGNvZGUgcGF0aC5cbiAqXG4gKiBQZXJtaXNzaW9uLWJhc2VkIChub3QgY29hcnNlLXJvbGUtYmFzZWQpOiBhIGJlc3Bva2UgY3VzdG9tIFJvbGUgY2FuIGJlIGdyYW50ZWRcbiAqIHB1Ymxpc2ggcmlnaHRzIHJlZ2FyZGxlc3Mgb2YgaXRzIGBtZW1iZXJgIGxhYmVsLiBCdWlsdC1pblxuICogQWRtaW4vT3duZXIgYnVuZGxlcyBjYXJyeSB0aGUgcHVibGlzaCBwZXJtaXNzaW9uczsgdGhlIGJ1aWx0LWluIE1lbWJlciBidW5kbGVcbiAqIGRvZXMgbm90LCBzbyBtZW1iZXJzIHRvcCBvdXQgYXQgYG9yZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmlzaWJpbGl0eShcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGZhbGxiYWNrOiBWaXNpYmlsaXR5ID0gJ3ByaXZhdGUnLFxuKTogVmlzaWJpbGl0eSB7XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuIHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgcHVibGlzaFBlcm1pc3Npb24pID8gJ3B1YmxpYycgOiAnb3JnJztcbiAgfVxuICBpZiAocmVxdWVzdGVkID09PSAnb3JnJykgcmV0dXJuICdvcmcnO1xuICBpZiAocmVxdWVzdGVkID09PSAncHJpdmF0ZScpIHJldHVybiAncHJpdmF0ZSc7XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiJdfQ==
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9hY2Nlc3MtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBeUJqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsR0FBWSxFQUNaLEdBQWEsRUFDYixRQUErQixFQUMvQixNQUFjLEVBQ2QsaUJBQTZCO0lBRTdCLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDckYsSUFBSSxPQUFPLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2xDLFNBQVMsQ0FDUCxHQUFHLEVBQ0gsR0FBRyxFQUNILE9BQU8sS0FBSyxlQUFlO1FBQ3pCLENBQUMsQ0FBQyxxREFBcUQ7UUFDdkQsQ0FBQyxDQUFDLGdEQUFnRCxFQUNwRCxTQUFTLENBQUMsd0JBQXdCLENBQ25DLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFLRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxHQUFZLEVBQ1osUUFBK0IsRUFDL0IsTUFBYyxFQUNkLGlCQUE2QjtJQUU3QixPQUFPLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7UUFDeEMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFDakMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQztLQUN0RCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLFFBQStCLEVBQy9CLE1BQWMsRUFDZCxNQUFtQjtJQUVuQixJQUFJLE1BQU0sQ0FBQyxhQUFhO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFdEMsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLDJEQUEyRDtJQUMzRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3BGLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFPRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxHQUFZLEVBQ1osR0FBYSxFQUNiLElBQTZCLEVBQzdCLE1BQWMsRUFDZCxpQkFBNkIsRUFDN0IsT0FBZTtJQUVmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDakgsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUcsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsR0FBWSxFQUNaLFNBQTZCLEVBQzdCLGlCQUE2QixFQUM3QixRQUFRLEdBQWUsU0FBUztJQUVoQyxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQixPQUFPLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBSSxTQUFTLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RDLElBQUksU0FBUyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGlzU3lzdGVtQWRtaW4sIHVzZXJIYXNQZXJtaXNzaW9uIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9wZXJtaXNzaW9uLWdhdGVzLmpzJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcbmltcG9ydCB0eXBlIHsgVmlzaWJpbGl0eSB9IGZyb20gJy4uL3R5cGVzL3Zpc2liaWxpdHkuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKiogVGhlIHNsaWNlIG9mIGEgY2F0YWxvZyBlbnRpdHkgdGhlIHdyaXRlIGdhdGUgbmVlZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlXcml0ZVRhcmdldCB7XG4gIC8qKiBSdW5nIHRoZSByb3cgY3VycmVudGx5IHNpdHMgYXQg4oCUIHNlZSB7QGxpbmsgVmlzaWJpbGl0eX0uICovXG4gIHZpc2liaWxpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAvKiogQXV0aG9yLiBUaGUgb25seSBub24tYWRtaW4gd2hvIG1heSB0b3VjaCBhIGBwcml2YXRlYCByb3cuICovXG4gIGNyZWF0ZWRCeT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogVGhlIGNhbGxlcidzIGF1dGhvcml0eSBvbiB0aGUgdmlzaWJpbGl0eSBsYWRkZXIsIGFzIFBMQUlOIERBVEEuXG4gKlxuICogQ2FwdHVyZWQgZnJvbSB0aGUgcmVxdWVzdCAoYGlzU3lzdGVtQWRtaW4ocmVxKWAsXG4gKiBgdXNlckhhc1Blcm1pc3Npb24ocmVxLCAnPGVudGl0eT46cHVibGlzaCcpYCkgYXQgdGhlIGVkZ2UsIHNvIHRoZSBzYW1lIGdhdGVcbiAqIGNhbiBydW4gd2hlcmUgbm8gYFJlcXVlc3RgIGV4aXN0cyDigJQgYSBwbHVnaW4gZGVwbG95IHBlcmZvcm1lZCBieSBhIEJ1bGxNUVxuICogd29ya2VyLCBvciBgQ3J1ZFNlcnZpY2UuYnVsa0RlbGV0ZWAgZG93biBpbiB0aGUgZGF0YSBsYXllci4gVGhhdCBpcyB0aGUgd2hvbGVcbiAqIHJlYXNvbiB7QGxpbmsgY2hlY2tXcml0ZUFjY2Vzc30gYW5kIHtAbGluayBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2Vzc30gYXJlIHR3b1xuICogZnVuY3Rpb25zOiBvbmUgcnVsZSwgdHdvIHdheXMgb2YgbmFtaW5nIHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVBY2Nlc3Mge1xuICBpc1N5c3RlbUFkbWluOiBib29sZWFuO1xuICBjYW5QdWJsaXNoOiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGNhbGxlciBtYXkgbW9kaWZ5IGEgY2F0YWxvZyBlbnRpdHksIHBlciBpdHMgdmlzaWJpbGl0eSBydW5nLlxuICogVGhlIHNpbmdsZSB3cml0ZSBnYXRlIGJlaGluZCBldmVyeSBwaXBlbGluZSAvIHBsdWdpbiAvIHRlbXBsYXRlIG11dGF0aW9uLlxuICpcbiAqIC0gYHB1YmxpY2Ag4oCUIGEgc3lzdGVtIGFkbWluLCBvciB0aGUgaG9sZGVyIG9mIGBwdWJsaXNoUGVybWlzc2lvbmAgKHRoZSBzYW1lXG4gKiAgIHBlcm1pc3Npb24gdGhhdCBsZXQgdGhlbSBwdWJsaXNoIGl0IGluIHRoZSBmaXJzdCBwbGFjZSwgc28gd2hvZXZlciBjYW5cbiAqICAgcHVibGlzaCBjYW4gYWxzbyBtYW5hZ2Ugd2hhdCB0aGV5IHB1Ymxpc2hlZClcbiAqIC0gYG9yZ2Ag4oCUIGFueW9uZSB3aG8gZ290IHRoaXMgZmFyOiB0aGUgcmVzb3VyY2UncyBgOndyaXRlYCBwZXJtaXNzaW9uIHBsdXMgdGhlXG4gKiAgIG9yZyBzY29waW5nIHRoZSBjYWxsZXIgYWxyZWFkeSBwYXNzZWQgSVMgdGhlIGdhdGVcbiAqIC0gYHByaXZhdGVgIOKAlCB0aGUgQVVUSE9SIGFsb25lIChwbHVzIHN5c3RlbSBhZG1pbnMpXG4gKlxuICogVGhlIGBwcml2YXRlYCBicmFuY2ggaXMgbG9hZC1iZWFyaW5nIG9uIHRoZSBUT01CU1RPTkUgcGF0aHMgKHJlc3RvcmUgLyBwdXJnZSksXG4gKiB3aGljaCBhcmUgb3JnLXNjb3BlZCByYXRoZXIgdGhhbiB2aXNpYmlsaXR5LXNjb3BlZCBiZWNhdXNlIHNvZnQtZGVsZXRlIGlzIG9uZVxuICogc2hhcmVkIGNvZGUgcGF0aCDigJQgd2l0aG91dCBpdCwgYW55IG9yZyBtZW1iZXIgY291bGQgcmVzdXJyZWN0IHNvbWVvbmUgZWxzZSdzXG4gKiBwZXJzb25hbCBkcmFmdC4gT24gdGhlIGxpdmUgcGF0aHMgdGhlIHJlYWQgcHJlZGljYXRlIGhhcyBhbHJlYWR5IGhpZGRlbiB0aGVcbiAqIHJvdywgbWFraW5nIHRoaXMgZGVmZW5zZSBpbiBkZXB0aC5cbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVxdWVzdCBtYXkgcHJvY2VlZDsgcmV0dXJucyBgZmFsc2VgIGhhdmluZyBBTFJFQURZIHNlbnRcbiAqIGEgNDAzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoIXJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MocmVxLCByZXMsIHBpcGVsaW5lLCB1c2VySWQsICdwaXBlbGluZXM6cHVibGlzaCcpKSByZXR1cm47XG4gKiBhd2FpdCBwaXBlbGluZVNlcnZpY2UuZGVsZXRlKGlkLCBvcmdJZCwgdXNlcklkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyhcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICByZXNvdXJjZTogVmlzaWJpbGl0eVdyaXRlVGFyZ2V0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdmVyZGljdCA9IGNoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzKHJlcSwgcmVzb3VyY2UsIHVzZXJJZCwgcHVibGlzaFBlcm1pc3Npb24pO1xuICBpZiAodmVyZGljdCA9PT0gJ29rJykgcmV0dXJuIHRydWU7XG4gIHNlbmRFcnJvcihcbiAgICByZXMsXG4gICAgNDAzLFxuICAgIHZlcmRpY3QgPT09ICduZWVkcy1wdWJsaXNoJ1xuICAgICAgPyAnWW91IGxhY2sgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhpcyBwdWJsaWMgcmVzb3VyY2UuJ1xuICAgICAgOiAnT25seSB0aGUgYXV0aG9yIGNhbiBtb2RpZnkgYSBwcml2YXRlIHJlc291cmNlLicsXG4gICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2h5IGEgd3JpdGUgd2FzIHJlZnVzZWQsIG9yIGAnb2snYC4gU2VlIHtAbGluayBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2Vzc30uICovXG5leHBvcnQgdHlwZSBWaXNpYmlsaXR5V3JpdGVWZXJkaWN0ID0gJ29rJyB8ICduZWVkcy1wdWJsaXNoJyB8ICdub3QtYXV0aG9yJztcblxuLyoqXG4gKiBUaGUgdmlzaWJpbGl0eSB3cml0ZSBydWxlIGFzIGEgUFJFRElDQVRFLCB3aXRoIG5vIHJlc3BvbnNlIHNpZGUtZWZmZWN0LlxuICpcbiAqIEV4dHJhY3RlZCBzbyBCVUxLIHJvdXRlcyBhcHBseSB0aGUgaWRlbnRpY2FsIHJ1bGUgcGVyIHJvdyBpbnN0ZWFkIG9mXG4gKiByZS1kZXJpdmluZyBpdCDigJQgYSBidWxrIHJ1bGUgdGhhdCBkaXNhZ3JlZWQgd291bGQgNDAzIGNhc2VzIHNpbmdsZS1yb3dcbiAqIGRlbGV0ZS91cGRhdGUgYWxsb3cgKGFuIGBvcmdgIHJvdyB3aXRoIHBsYWluIGA6d3JpdGVgLCB0aGUgZGVmYXVsdCBydW5nKS5cbiAqXG4gKiAgIC0gYHByaXZhdGVgIOKGkiBhdXRob3Igb25seVxuICogICAtIGBvcmdgICAgICDihpIgYW55IG1lbWJlciBvZiB0aGUgb3JnXG4gKiAgIC0gYHB1YmxpY2AgIOKGkiByZXF1aXJlcyBgcHVibGlzaFBlcm1pc3Npb25gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcyhcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXNvdXJjZTogVmlzaWJpbGl0eVdyaXRlVGFyZ2V0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4pOiBWaXNpYmlsaXR5V3JpdGVWZXJkaWN0IHtcbiAgcmV0dXJuIGNoZWNrV3JpdGVBY2Nlc3MocmVzb3VyY2UsIHVzZXJJZCwge1xuICAgIGlzU3lzdGVtQWRtaW46IGlzU3lzdGVtQWRtaW4ocmVxKSxcbiAgICBjYW5QdWJsaXNoOiB1c2VySGFzUGVybWlzc2lvbihyZXEsIHB1Ymxpc2hQZXJtaXNzaW9uKSxcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIHZpc2liaWxpdHkgd3JpdGUgcnVsZSBpdHNlbGYsIG92ZXIgYSByZXF1ZXN0LWZyZWUge0BsaW5rIFdyaXRlQWNjZXNzfS5cbiAqXG4gKiBUSEUgb25lIGltcGxlbWVudGF0aW9uIOKAlCBgY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3NgIGlzIHRoaXMgZnVuY3Rpb24gd2l0aFxuICogdGhlIGNhbGxlcidzIGF1dGhvcml0eSByZWFkIG9mZiBhIGBSZXF1ZXN0YC4gVGhlIGpvYiBwYXRoIChhIHBsdWdpbiBkZXBsb3lcbiAqIHJ1bm5pbmcgaW4gYSBCdWxsTVEgd29ya2VyLCBsb25nIGFmdGVyIHRoZSBIVFRQIHJlcXVlc3QgaXMgZ29uZSkgYW5kIHRoZVxuICogcmVxdWVzdCBwYXRoIG11c3QgbmV2ZXIgZHJpZnQ6IGEgam9iLXBhdGggZ2F0ZSB0aGF0IGRpc2FncmVlZCB3aXRoIHRoZVxuICogcmVxdWVzdC1wYXRoIGdhdGUgaXMgYSB0ZW5hbmN5IGJ1Zywgbm90IGEgY29zbWV0aWMgb25lLCBzbyB0aGVyZSBpcyBubyBzZWNvbmRcbiAqIGNvcHkgb2YgdGhlIHJ1bmdzIHRvIGRyaWZ0LlxuICpcbiAqIENhbGxlcnMgbGF5ZXIgdGhlaXIgb3duIG5vdC1mb3VuZCAvIGFscmVhZHktZXhpc3RzIHBvbGljeSBvbiB0b3AgYW5kIHR1cm4gdGhlXG4gKiB2ZXJkaWN0IGludG8gYSB1c2VyLWZhY2luZyBtZXNzYWdlOyB0aGUgUlVMRSBzdGF5cyBoZXJlLlxuICpcbiAqICAgLSBgcHJpdmF0ZWAg4oaSIGF1dGhvciBvbmx5IChmYWlscyBjbG9zZWQgb24gYW4gZW1wdHkgYHVzZXJJZGApXG4gKiAgIC0gYG9yZ2AgICAgIOKGkiBhbnkgbWVtYmVyIG9mIHRoZSBvcmdcbiAqICAgLSBgcHVibGljYCAg4oaSIHJlcXVpcmVzIHRoZSBwdWJsaXNoIGNhcGFiaWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrV3JpdGVBY2Nlc3MoXG4gIHJlc291cmNlOiBWaXNpYmlsaXR5V3JpdGVUYXJnZXQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2Nlc3M6IFdyaXRlQWNjZXNzLFxuKTogVmlzaWJpbGl0eVdyaXRlVmVyZGljdCB7XG4gIGlmIChhY2Nlc3MuaXNTeXN0ZW1BZG1pbikgcmV0dXJuICdvayc7XG5cbiAgaWYgKHJlc291cmNlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnICYmICFhY2Nlc3MuY2FuUHVibGlzaCkge1xuICAgIHJldHVybiAnbmVlZHMtcHVibGlzaCc7XG4gIH1cblxuICAvLyBGYWlsIGNsb3NlZCBvbiBhbiBhbm9ueW1vdXMvYWJzZW50IGNhbGxlciDigJQgYW4gZW1wdHkgdXNlcklkIG11c3QgbmV2ZXIgbWF0Y2hcbiAgLy8gYW4gZW1wdHkgYGNyZWF0ZWRCeWAgYW5kIGhhbmQgb3ZlciBzb21lb25lIGVsc2UncyBkcmFmdC5cbiAgaWYgKHJlc291cmNlLnZpc2liaWxpdHkgPT09ICdwcml2YXRlJyAmJiAoIXVzZXJJZCB8fCByZXNvdXJjZS5jcmVhdGVkQnkgIT09IHVzZXJJZCkpIHtcbiAgICByZXR1cm4gJ25vdC1hdXRob3InO1xuICB9XG5cbiAgcmV0dXJuICdvayc7XG59XG5cbi8qKiBBIGJ1bGstb3BlcmF0aW9uIHJvdzogaXRzIGlkLCBwbHVzIHRoZSBzbGljZSB0aGUgd3JpdGUgZ2F0ZSByZWFkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa1dyaXRlUm93IGV4dGVuZHMgVmlzaWJpbGl0eVdyaXRlVGFyZ2V0IHtcbiAgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcHBseSB0aGUgcGVyLXJvdyB3cml0ZSBnYXRlIGFjcm9zcyBhIEJVTEsgb3BlcmF0aW9uJ3MgbWF0Y2hlZCByb3dzLCBhbmRcbiAqIHJlZnVzZSB0aGUgV0hPTEUgYmF0Y2ggaWYgYW55IHJvdyBmYWlscy5cbiAqXG4gKiBBbGwtb3Itbm90aGluZyBvbiBwdXJwb3NlOiBhIHBhcnRpYWwgYnVsayB3cml0ZSBpcyBpbXBvc3NpYmxlIGZvciBhIGNsaWVudCB0b1xuICogcmVhc29uIGFib3V0LCBhbmQgdGhlIDQwMyBuYW1lcyB0aGUgb2ZmZW5kaW5nIGBpZHNgIHNvIHRoZSBjYWxsZXIgY2FuIHJldHJ5XG4gKiB3aXRoIGEgbmFycm93ZWQgc2V0LlxuICpcbiAqIFJldHVybnMgYHRydWVgIGhhdmluZyBBTFJFQURZIHNlbnQgYSA0MDMgKHNvIHRoZSByb3V0ZSByZXR1cm5zKTsgYGZhbHNlYCB3aGVuXG4gKiBldmVyeSByb3cgaXMgd3JpdGFibGUgYW5kIHRoZSBiYXRjaCBtYXkgcHJvY2VlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdEZvcmJpZGRlbkJ1bGtSb3dzKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIHJvd3M6IHJlYWRvbmx5IEJ1bGtXcml0ZVJvd1tdLFxuICB1c2VySWQ6IHN0cmluZyxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIG1lc3NhZ2U6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmb3JiaWRkZW4gPSByb3dzLmZpbHRlcigocm93KSA9PiBjaGVja1Zpc2liaWxpdHlXcml0ZUFjY2VzcyhyZXEsIHJvdywgdXNlcklkLCBwdWJsaXNoUGVybWlzc2lvbikgIT09ICdvaycpO1xuICBpZiAoZm9yYmlkZGVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBzZW5kRXJyb3IocmVzLCA0MDMsIG1lc3NhZ2UsIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsIHsgaWRzOiBmb3JiaWRkZW4ubWFwKChyb3cpID0+IHJvdy5pZCkgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSB2aXNpYmlsaXR5IGZvciBhbiBlbnRpdHkgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkLlxuICpcbiAqIGBwdWJsaWNgIHJlcXVpcmVzIHRoZSBwdWJsaXNoIGNhcGFiaWxpdHkgKHN1cGVyYWRtaW5zIHBhc3MgdmlhIGltcGxpY2l0LWFsbCk7XG4gKiBhIGNhbGxlciB3aG8gYXNrcyBmb3IgaXQgd2l0aG91dCB0aGUgcGVybWlzc2lvbiBpcyBjbGFtcGVkIHRvIGBvcmdgIHJhdGhlclxuICogdGhhbiBkcm9wcGVkIHRvIGEgcGVyc29uYWwgZHJhZnQg4oCUIHRoZXkgYXNrZWQgdG8gU0hBUkUgaXQsIGFuZCBgb3JnYCBpcyB0aGVcbiAqIHdpZGVzdCBydW5nIHRoZXkgYXJlIGVudGl0bGVkIHRvLiBBbnl0aGluZyBlbHNlIHBhc3NlcyB0aHJvdWdoLlxuICpcbiAqIGBmYWxsYmFja2AgaXMgdGhlIHJ1bmcgYW4gVU5TUEVDSUZJRUQgdmlzaWJpbGl0eSBsYW5kcyBvbiwgYW5kIGl0IGlzXG4gKiBkZWxpYmVyYXRlbHkgcGVyLWVudGl0eSBldmVuIHRob3VnaCB0aGUgbGFkZGVyIGl0c2VsZiBpcyBpZGVudGljYWwgZXZlcnl3aGVyZTpcbiAqXG4gKiAtICoqdGVtcGxhdGVzKiogZGVmYXVsdCB0byBgcHJpdmF0ZWAg4oCUIGRyYWZ0LWZpcnN0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGVcbiAqICAgcGVyc29uYWwgcnVuZzsgeW91IHBvbGlzaCBhIHN0YXJ0ZXIgYmVmb3JlIHB1Ymxpc2hpbmcgaXQuXG4gKiAtICoqcGlwZWxpbmVzIC8gcGx1Z2lucyoqIGRlZmF1bHQgdG8gYG9yZ2Ag4oCUIHRoZXkgYXJlIHRlYW0gYXNzZXRzIHRoYXQgZGVwbG95XG4gKiAgIHNoYXJlZCBpbmZyYXN0cnVjdHVyZSwgc28gY3JlYXRpbmcgb25lIG11c3Qgbm90IGhpZGUgaXQgZnJvbSB0aGUgdGVhbS4gQVxuICogICBwZXJzb25hbCBkcmFmdCBzdGF5cyBhdmFpbGFibGUsIGJ1dCBvcHQtaW4uXG4gKlxuICogU2FtZSBsYWRkZXIsIHNhbWUgZ2F0ZSwgZGlmZmVyZW50IGNlbnRyZSBvZiBncmF2aXR5IOKAlCBleHByZXNzZWQgYXMgYW4gYXJndW1lbnRcbiAqIHJhdGhlciB0aGFuIGEgc2Vjb25kIGNvZGUgcGF0aC5cbiAqXG4gKiBQZXJtaXNzaW9uLWJhc2VkIChub3QgY29hcnNlLXJvbGUtYmFzZWQpOiBhIGJlc3Bva2UgY3VzdG9tIFJvbGUgY2FuIGJlIGdyYW50ZWRcbiAqIHB1Ymxpc2ggcmlnaHRzIHJlZ2FyZGxlc3Mgb2YgaXRzIGBtZW1iZXJgIGxhYmVsLiBCdWlsdC1pblxuICogQWRtaW4vT3duZXIgYnVuZGxlcyBjYXJyeSB0aGUgcHVibGlzaCBwZXJtaXNzaW9uczsgdGhlIGJ1aWx0LWluIE1lbWJlciBidW5kbGVcbiAqIGRvZXMgbm90LCBzbyBtZW1iZXJzIHRvcCBvdXQgYXQgYG9yZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmlzaWJpbGl0eShcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHVibGlzaFBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGZhbGxiYWNrOiBWaXNpYmlsaXR5ID0gJ3ByaXZhdGUnLFxuKTogVmlzaWJpbGl0eSB7XG4gIGlmIChyZXF1ZXN0ZWQgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuIHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgcHVibGlzaFBlcm1pc3Npb24pID8gJ3B1YmxpYycgOiAnb3JnJztcbiAgfVxuICBpZiAocmVxdWVzdGVkID09PSAnb3JnJykgcmV0dXJuICdvcmcnO1xuICBpZiAocmVxdWVzdGVkID09PSAncHJpdmF0ZScpIHJldHVybiAncHJpdmF0ZSc7XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  export * from './crud-helpers.js';
2
- export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, resolveVisibility, } from './access-helpers.js';
2
+ export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, checkWriteAccess, rejectForbiddenBulkRows, resolveVisibility, type VisibilityWriteTarget, type VisibilityWriteVerdict, type WriteAccess, type BulkWriteRow, } from './access-helpers.js';
3
3
  export { loadAndRestore, loadAndPurge, type RestorableService, type PurgeableService, type TombstoneAuthorizer, type TombstoneRouteOptions, } from './restore-helpers.js';
4
4
  export * from './sse-helpers.js';
5
5
  export * from './org-hierarchy.js';
@@ -1,9 +1,9 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export * from './crud-helpers.js';
4
- export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, resolveVisibility, } from './access-helpers.js';
4
+ export { requireVisibilityWriteAccess, checkVisibilityWriteAccess, checkWriteAccess, rejectForbiddenBulkRows, resolveVisibility, } from './access-helpers.js';
5
5
  export { loadAndRestore, loadAndPurge, } from './restore-helpers.js';
6
6
  export * from './sse-helpers.js';
7
7
  export * from './org-hierarchy.js';
8
8
  export { fetchParentOrgId, fetchOrgDescendants, fetchOrgNames, fetchOrgMembership, } from './org-hierarchy-http.js';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIsaUJBQWlCLEdBQ2xCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGNBQWMsRUFDZCxZQUFZLEdBS2IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGtCQUFrQixHQUNuQixNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1oZWxwZXJzLmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MsXG4gIGNoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzLFxuICByZXNvbHZlVmlzaWJpbGl0eSxcbn0gZnJvbSAnLi9hY2Nlc3MtaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBsb2FkQW5kUmVzdG9yZSxcbiAgbG9hZEFuZFB1cmdlLFxuICB0eXBlIFJlc3RvcmFibGVTZXJ2aWNlLFxuICB0eXBlIFB1cmdlYWJsZVNlcnZpY2UsXG4gIHR5cGUgVG9tYnN0b25lQXV0aG9yaXplcixcbiAgdHlwZSBUb21ic3RvbmVSb3V0ZU9wdGlvbnMsXG59IGZyb20gJy4vcmVzdG9yZS1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc3NlLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9vcmctaGllcmFyY2h5LmpzJztcbmV4cG9ydCB7XG4gIGZldGNoUGFyZW50T3JnSWQsXG4gIGZldGNoT3JnRGVzY2VuZGFudHMsXG4gIGZldGNoT3JnTmFtZXMsXG4gIGZldGNoT3JnTWVtYmVyc2hpcCxcbn0gZnJvbSAnLi9vcmctaGllcmFyY2h5LWh0dHAuanMnO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixpQkFBaUIsR0FLbEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsY0FBYyxFQUNkLFlBQVksR0FLYixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2Isa0JBQWtCLEdBQ25CLE1BQU0seUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9jcnVkLWhlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyxcbiAgY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MsXG4gIGNoZWNrV3JpdGVBY2Nlc3MsXG4gIHJlamVjdEZvcmJpZGRlbkJ1bGtSb3dzLFxuICByZXNvbHZlVmlzaWJpbGl0eSxcbiAgdHlwZSBWaXNpYmlsaXR5V3JpdGVUYXJnZXQsXG4gIHR5cGUgVmlzaWJpbGl0eVdyaXRlVmVyZGljdCxcbiAgdHlwZSBXcml0ZUFjY2VzcyxcbiAgdHlwZSBCdWxrV3JpdGVSb3csXG59IGZyb20gJy4vYWNjZXNzLWhlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgbG9hZEFuZFJlc3RvcmUsXG4gIGxvYWRBbmRQdXJnZSxcbiAgdHlwZSBSZXN0b3JhYmxlU2VydmljZSxcbiAgdHlwZSBQdXJnZWFibGVTZXJ2aWNlLFxuICB0eXBlIFRvbWJzdG9uZUF1dGhvcml6ZXIsXG4gIHR5cGUgVG9tYnN0b25lUm91dGVPcHRpb25zLFxufSBmcm9tICcuL3Jlc3RvcmUtaGVscGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NzZS1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vb3JnLWhpZXJhcmNoeS5qcyc7XG5leHBvcnQge1xuICBmZXRjaFBhcmVudE9yZ0lkLFxuICBmZXRjaE9yZ0Rlc2NlbmRhbnRzLFxuICBmZXRjaE9yZ05hbWVzLFxuICBmZXRjaE9yZ01lbWJlcnNoaXAsXG59IGZyb20gJy4vb3JnLWhpZXJhcmNoeS1odHRwLmpzJztcbiJdfQ==
@@ -0,0 +1,53 @@
1
+ /**
2
+ * `proposable` — the gate on the one request header a client may use to
3
+ * influence an audit event.
4
+ *
5
+ * The Ask panel's confirm path commits a drafted change through the SAME route
6
+ * the dashboard's own button calls, with the user's own session. Design rule 6
7
+ * says the resulting audit event must record that an AI drafted it, so an
8
+ * incident review can tell "the admin changed this" from "an AI drafted it and
9
+ * the admin clicked Apply". The browser says so with `X-PB-Proposed-By`.
10
+ *
11
+ * That is a client writing into the hash-chained audit trail, so the channel is
12
+ * made as narrow as a channel can be: ONE header, ONE accepted value (the
13
+ * shared `ASK_AGENT_PROPOSER` constant), writing ONE additive key. There is no
14
+ * free text and no object to merge — `withProposalProvenance` re-derives the
15
+ * fragment from the constant rather than copying anything off the request, so
16
+ * the worst a caller can do is assert the one thing the header exists to
17
+ * assert.
18
+ *
19
+ * REJECT, NOT IGNORE. A value other than the constant fails the request with a
20
+ * 400 before the handler runs, because:
21
+ *
22
+ * - Silently dropping it reproduces the exact bug this work exists to fix. The
23
+ * reason provenance was never sent before is that the update schemas are
24
+ * non-strict `z.object`s that STRIP unknown keys, so a client could send the
25
+ * field and have it vanish. A header that is quietly ignored is the same
26
+ * trap one layer up, and the next reader would have to prove by experiment
27
+ * whether it lands.
28
+ * - No legitimate client sends any other value, so a rejection can break
29
+ * nothing that works today. An unexpected value is either a client bug —
30
+ * which should fail loudly, at the write, not leave a trail that is silently
31
+ * missing its marker — or someone probing what the audit trail will accept,
32
+ * which should be counted (`ask_provenance_refused_total`) rather than
33
+ * absorbed.
34
+ * - Failing BEFORE the mutation means a refusal never leaves a written change
35
+ * whose provenance was thrown away. The alternative — write, then drop the
36
+ * marker — is the one outcome that makes the trail actively misleading.
37
+ *
38
+ * Belt and braces: {@link readProposerClaim} honours nothing but the constant,
39
+ * so even a route that forgot this gate cannot store a forged proposer. The
40
+ * gate turns "ignored" into "refused"; it is not what makes forgery harmless.
41
+ */
42
+ import type { Request, Response, NextFunction } from 'express';
43
+ /** Counter incremented when a request claims a proposer that is not the agent. */
44
+ export declare const ASK_PROVENANCE_REFUSED_COUNTER = "ask_provenance_refused_total";
45
+ /**
46
+ * Express middleware for a route an Ask proposal may commit to: accept the
47
+ * agent provenance marker, refuse any other proposer with a 400.
48
+ *
49
+ * Place it in the chain beside `audited(...)`, before the handler:
50
+ * `router.put('/:id', audited('pipeline.update'), proposable, withRoute(h))`.
51
+ * The handler then records with `withProposalProvenance(req.headers, {...})`.
52
+ */
53
+ export declare function proposable(req: Request, res: Response, next: NextFunction): void;
@@ -0,0 +1,26 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { ASK_PROPOSED_BY_HEADER, readProposerClaim } from '../types/ask-proposals.js';
4
+ import { emitCounter } from '../utils/metric-emitter.js';
5
+ import { sendBadRequest } from '../utils/response.js';
6
+ /** Counter incremented when a request claims a proposer that is not the agent. */
7
+ export const ASK_PROVENANCE_REFUSED_COUNTER = 'ask_provenance_refused_total';
8
+ /**
9
+ * Express middleware for a route an Ask proposal may commit to: accept the
10
+ * agent provenance marker, refuse any other proposer with a 400.
11
+ *
12
+ * Place it in the chain beside `audited(...)`, before the handler:
13
+ * `router.put('/:id', audited('pipeline.update'), proposable, withRoute(h))`.
14
+ * The handler then records with `withProposalProvenance(req.headers, {...})`.
15
+ */
16
+ export function proposable(req, res, next) {
17
+ if (readProposerClaim(req.headers) === 'foreign') {
18
+ emitCounter(ASK_PROVENANCE_REFUSED_COUNTER, { method: req.method });
19
+ // The rejected value is never echoed back — it is attacker-controlled text,
20
+ // and the rule is short enough to state outright.
21
+ sendBadRequest(res, `Unrecognised ${ASK_PROPOSED_BY_HEADER} header: the only proposer this route accepts is the Ask agent.`);
22
+ return;
23
+ }
24
+ next();
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLXByb3ZlbmFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9hc2stcHJvdmVuYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBNkN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyw4QkFBOEIsQ0FBQztBQUU3RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQWtCO0lBQ3hFLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2pELFdBQVcsQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRSw0RUFBNEU7UUFDNUUsa0RBQWtEO1FBQ2xELGNBQWMsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLHNCQUFzQixpRUFBaUUsQ0FBQyxDQUFDO1FBQzdILE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxFQUFFLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogYHByb3Bvc2FibGVgIOKAlCB0aGUgZ2F0ZSBvbiB0aGUgb25lIHJlcXVlc3QgaGVhZGVyIGEgY2xpZW50IG1heSB1c2UgdG9cbiAqIGluZmx1ZW5jZSBhbiBhdWRpdCBldmVudC5cbiAqXG4gKiBUaGUgQXNrIHBhbmVsJ3MgY29uZmlybSBwYXRoIGNvbW1pdHMgYSBkcmFmdGVkIGNoYW5nZSB0aHJvdWdoIHRoZSBTQU1FIHJvdXRlXG4gKiB0aGUgZGFzaGJvYXJkJ3Mgb3duIGJ1dHRvbiBjYWxscywgd2l0aCB0aGUgdXNlcidzIG93biBzZXNzaW9uLiBEZXNpZ24gcnVsZSA2XG4gKiBzYXlzIHRoZSByZXN1bHRpbmcgYXVkaXQgZXZlbnQgbXVzdCByZWNvcmQgdGhhdCBhbiBBSSBkcmFmdGVkIGl0LCBzbyBhblxuICogaW5jaWRlbnQgcmV2aWV3IGNhbiB0ZWxsIFwidGhlIGFkbWluIGNoYW5nZWQgdGhpc1wiIGZyb20gXCJhbiBBSSBkcmFmdGVkIGl0IGFuZFxuICogdGhlIGFkbWluIGNsaWNrZWQgQXBwbHlcIi4gVGhlIGJyb3dzZXIgc2F5cyBzbyB3aXRoIGBYLVBCLVByb3Bvc2VkLUJ5YC5cbiAqXG4gKiBUaGF0IGlzIGEgY2xpZW50IHdyaXRpbmcgaW50byB0aGUgaGFzaC1jaGFpbmVkIGF1ZGl0IHRyYWlsLCBzbyB0aGUgY2hhbm5lbCBpc1xuICogbWFkZSBhcyBuYXJyb3cgYXMgYSBjaGFubmVsIGNhbiBiZTogT05FIGhlYWRlciwgT05FIGFjY2VwdGVkIHZhbHVlICh0aGVcbiAqIHNoYXJlZCBgQVNLX0FHRU5UX1BST1BPU0VSYCBjb25zdGFudCksIHdyaXRpbmcgT05FIGFkZGl0aXZlIGtleS4gVGhlcmUgaXMgbm9cbiAqIGZyZWUgdGV4dCBhbmQgbm8gb2JqZWN0IHRvIG1lcmdlIOKAlCBgd2l0aFByb3Bvc2FsUHJvdmVuYW5jZWAgcmUtZGVyaXZlcyB0aGVcbiAqIGZyYWdtZW50IGZyb20gdGhlIGNvbnN0YW50IHJhdGhlciB0aGFuIGNvcHlpbmcgYW55dGhpbmcgb2ZmIHRoZSByZXF1ZXN0LCBzb1xuICogdGhlIHdvcnN0IGEgY2FsbGVyIGNhbiBkbyBpcyBhc3NlcnQgdGhlIG9uZSB0aGluZyB0aGUgaGVhZGVyIGV4aXN0cyB0b1xuICogYXNzZXJ0LlxuICpcbiAqIFJFSkVDVCwgTk9UIElHTk9SRS4gQSB2YWx1ZSBvdGhlciB0aGFuIHRoZSBjb25zdGFudCBmYWlscyB0aGUgcmVxdWVzdCB3aXRoIGFcbiAqIDQwMCBiZWZvcmUgdGhlIGhhbmRsZXIgcnVucywgYmVjYXVzZTpcbiAqXG4gKiAgLSBTaWxlbnRseSBkcm9wcGluZyBpdCByZXByb2R1Y2VzIHRoZSBleGFjdCBidWcgdGhpcyB3b3JrIGV4aXN0cyB0byBmaXguIFRoZVxuICogICAgcmVhc29uIHByb3ZlbmFuY2Ugd2FzIG5ldmVyIHNlbnQgYmVmb3JlIGlzIHRoYXQgdGhlIHVwZGF0ZSBzY2hlbWFzIGFyZVxuICogICAgbm9uLXN0cmljdCBgei5vYmplY3RgcyB0aGF0IFNUUklQIHVua25vd24ga2V5cywgc28gYSBjbGllbnQgY291bGQgc2VuZCB0aGVcbiAqICAgIGZpZWxkIGFuZCBoYXZlIGl0IHZhbmlzaC4gQSBoZWFkZXIgdGhhdCBpcyBxdWlldGx5IGlnbm9yZWQgaXMgdGhlIHNhbWVcbiAqICAgIHRyYXAgb25lIGxheWVyIHVwLCBhbmQgdGhlIG5leHQgcmVhZGVyIHdvdWxkIGhhdmUgdG8gcHJvdmUgYnkgZXhwZXJpbWVudFxuICogICAgd2hldGhlciBpdCBsYW5kcy5cbiAqICAtIE5vIGxlZ2l0aW1hdGUgY2xpZW50IHNlbmRzIGFueSBvdGhlciB2YWx1ZSwgc28gYSByZWplY3Rpb24gY2FuIGJyZWFrXG4gKiAgICBub3RoaW5nIHRoYXQgd29ya3MgdG9kYXkuIEFuIHVuZXhwZWN0ZWQgdmFsdWUgaXMgZWl0aGVyIGEgY2xpZW50IGJ1ZyDigJRcbiAqICAgIHdoaWNoIHNob3VsZCBmYWlsIGxvdWRseSwgYXQgdGhlIHdyaXRlLCBub3QgbGVhdmUgYSB0cmFpbCB0aGF0IGlzIHNpbGVudGx5XG4gKiAgICBtaXNzaW5nIGl0cyBtYXJrZXIg4oCUIG9yIHNvbWVvbmUgcHJvYmluZyB3aGF0IHRoZSBhdWRpdCB0cmFpbCB3aWxsIGFjY2VwdCxcbiAqICAgIHdoaWNoIHNob3VsZCBiZSBjb3VudGVkIChgYXNrX3Byb3ZlbmFuY2VfcmVmdXNlZF90b3RhbGApIHJhdGhlciB0aGFuXG4gKiAgICBhYnNvcmJlZC5cbiAqICAtIEZhaWxpbmcgQkVGT1JFIHRoZSBtdXRhdGlvbiBtZWFucyBhIHJlZnVzYWwgbmV2ZXIgbGVhdmVzIGEgd3JpdHRlbiBjaGFuZ2VcbiAqICAgIHdob3NlIHByb3ZlbmFuY2Ugd2FzIHRocm93biBhd2F5LiBUaGUgYWx0ZXJuYXRpdmUg4oCUIHdyaXRlLCB0aGVuIGRyb3AgdGhlXG4gKiAgICBtYXJrZXIg4oCUIGlzIHRoZSBvbmUgb3V0Y29tZSB0aGF0IG1ha2VzIHRoZSB0cmFpbCBhY3RpdmVseSBtaXNsZWFkaW5nLlxuICpcbiAqIEJlbHQgYW5kIGJyYWNlczoge0BsaW5rIHJlYWRQcm9wb3NlckNsYWltfSBob25vdXJzIG5vdGhpbmcgYnV0IHRoZSBjb25zdGFudCxcbiAqIHNvIGV2ZW4gYSByb3V0ZSB0aGF0IGZvcmdvdCB0aGlzIGdhdGUgY2Fubm90IHN0b3JlIGEgZm9yZ2VkIHByb3Bvc2VyLiBUaGVcbiAqIGdhdGUgdHVybnMgXCJpZ25vcmVkXCIgaW50byBcInJlZnVzZWRcIjsgaXQgaXMgbm90IHdoYXQgbWFrZXMgZm9yZ2VyeSBoYXJtbGVzcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IEFTS19QUk9QT1NFRF9CWV9IRUFERVIsIHJlYWRQcm9wb3NlckNsYWltIH0gZnJvbSAnLi4vdHlwZXMvYXNrLXByb3Bvc2Fscy5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IHNlbmRCYWRSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKiogQ291bnRlciBpbmNyZW1lbnRlZCB3aGVuIGEgcmVxdWVzdCBjbGFpbXMgYSBwcm9wb3NlciB0aGF0IGlzIG5vdCB0aGUgYWdlbnQuICovXG5leHBvcnQgY29uc3QgQVNLX1BST1ZFTkFOQ0VfUkVGVVNFRF9DT1VOVEVSID0gJ2Fza19wcm92ZW5hbmNlX3JlZnVzZWRfdG90YWwnO1xuXG4vKipcbiAqIEV4cHJlc3MgbWlkZGxld2FyZSBmb3IgYSByb3V0ZSBhbiBBc2sgcHJvcG9zYWwgbWF5IGNvbW1pdCB0bzogYWNjZXB0IHRoZVxuICogYWdlbnQgcHJvdmVuYW5jZSBtYXJrZXIsIHJlZnVzZSBhbnkgb3RoZXIgcHJvcG9zZXIgd2l0aCBhIDQwMC5cbiAqXG4gKiBQbGFjZSBpdCBpbiB0aGUgY2hhaW4gYmVzaWRlIGBhdWRpdGVkKC4uLilgLCBiZWZvcmUgdGhlIGhhbmRsZXI6XG4gKiBgcm91dGVyLnB1dCgnLzppZCcsIGF1ZGl0ZWQoJ3BpcGVsaW5lLnVwZGF0ZScpLCBwcm9wb3NhYmxlLCB3aXRoUm91dGUoaCkpYC5cbiAqIFRoZSBoYW5kbGVyIHRoZW4gcmVjb3JkcyB3aXRoIGB3aXRoUHJvcG9zYWxQcm92ZW5hbmNlKHJlcS5oZWFkZXJzLCB7Li4ufSlgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcG9zYWJsZShyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQge1xuICBpZiAocmVhZFByb3Bvc2VyQ2xhaW0ocmVxLmhlYWRlcnMpID09PSAnZm9yZWlnbicpIHtcbiAgICBlbWl0Q291bnRlcihBU0tfUFJPVkVOQU5DRV9SRUZVU0VEX0NPVU5URVIsIHsgbWV0aG9kOiByZXEubWV0aG9kIH0pO1xuICAgIC8vIFRoZSByZWplY3RlZCB2YWx1ZSBpcyBuZXZlciBlY2hvZWQgYmFjayDigJQgaXQgaXMgYXR0YWNrZXItY29udHJvbGxlZCB0ZXh0LFxuICAgIC8vIGFuZCB0aGUgcnVsZSBpcyBzaG9ydCBlbm91Z2ggdG8gc3RhdGUgb3V0cmlnaHQuXG4gICAgc2VuZEJhZFJlcXVlc3QocmVzLCBgVW5yZWNvZ25pc2VkICR7QVNLX1BST1BPU0VEX0JZX0hFQURFUn0gaGVhZGVyOiB0aGUgb25seSBwcm9wb3NlciB0aGlzIHJvdXRlIGFjY2VwdHMgaXMgdGhlIEFzayBhZ2VudC5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbmV4dCgpO1xufVxuIl19
@@ -7,5 +7,6 @@ export { isSystemOrgId, SYSTEM_ORG_ID, SYSTEM_ORG_SLUG, } from './system-org.js'
7
7
  export { serviceNameOf, isServiceTokenDenied, signServiceToken, getServiceAuthHeader, isServicePrincipal, isServiceAccountPrincipal, isServicePrincipalNamed, verifyServicePrincipal, } from './service-tokens.js';
8
8
  export { requireSystemOrg, requireEcosystemPermission } from './ecosystem-guard.js';
9
9
  export { mongoSanitize, MAX_SANITIZE_DEPTH, } from './mongo-sanitize.js';
10
+ export { proposable, ASK_PROVENANCE_REFUSED_COUNTER, } from './ask-provenance.js';
10
11
  export { requireStepUp, type StepUpMethod, STRONG_STEP_UP_METHODS, } from './step-up.js';
11
12
  export { tagRouteGate, getRouteGates, audited, buildRouteTable, isWriteMethod, summarizeRouteTable, type RouteTableEntry, } from './route-table.js';
@@ -9,6 +9,7 @@ export { isSystemOrgId, SYSTEM_ORG_ID, SYSTEM_ORG_SLUG, } from './system-org.js'
9
9
  export { serviceNameOf, isServiceTokenDenied, signServiceToken, getServiceAuthHeader, isServicePrincipal, isServiceAccountPrincipal, isServicePrincipalNamed, verifyServicePrincipal, } from './service-tokens.js';
10
10
  export { requireSystemOrg, requireEcosystemPermission } from './ecosystem-guard.js';
11
11
  export { mongoSanitize, MAX_SANITIZE_DEPTH, } from './mongo-sanitize.js';
12
+ export { proposable, ASK_PROVENANCE_REFUSED_COUNTER, } from './ask-provenance.js';
12
13
  export { requireStepUp, STRONG_STEP_UP_METHODS, } from './step-up.js';
13
14
  export { tagRouteGate, getRouteGates, audited, buildRouteTable, isWriteMethod, summarizeRouteTable, } from './route-table.js';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHNCQUFzQixHQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxXQUFXLEdBQ1osTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQiwwQkFBMEIsRUFDMUIsd0JBQXdCLEdBRXpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsY0FBYyxHQUVmLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGFBQWEsRUFDYixhQUFhLEVBQ2IsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEYsT0FBTyxFQUNMLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsYUFBYSxFQUViLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixPQUFPLEVBQ1AsZUFBZSxFQUNmLGFBQWEsRUFDYixtQkFBbUIsR0FFcEIsTUFBTSxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICB2ZXJpZnlVc2VySnd0LFxuICB2ZXJpZnlCZWFyZXJUb2tlbixcbiAgaGFzVmFsaWRJZGVudGl0eUNsYWltcyxcbn0gZnJvbSAnLi9qd3QtdmVyaWZ5LmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVBdXRoLFxufSBmcm9tICcuL2F1dGguanMnO1xuZXhwb3J0IHtcbiAgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIGlzQWNjZXNzVG9rZW5SZXZva2VkLFxufSBmcm9tICcuL3Jldm9jYXRpb24uanMnO1xuZXhwb3J0IHtcbiAgcmVxdWlyZUFzc3VyYW5jZSxcbiAgcmVmdXNlV2Vha1Nlc3Npb24sXG4gIHJlZnVzZUZvck9yZ0FkbWluQXNzdXJhbmNlLFxuICByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2UsXG4gIHR5cGUgQXNzdXJhbmNlT3B0aW9ucyxcbn0gZnJvbSAnLi9hc3N1cmFuY2UuanMnO1xuZXhwb3J0IHtcbiAgdXNlckhhc1Blcm1pc3Npb24sXG4gIHNldEF1dGh6RGVuaWFsQXVkaXRvcixcbiAgcmVjb3JkQXV0aHpEZW5pYWwsXG4gIHJlcXVpcmVQZXJtaXNzaW9uLFxuICByZXF1aXJlQWxsUGVybWlzc2lvbnMsXG4gIHJlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlLFxuICByZXF1aXJlU2VydmljZVByaW5jaXBhbCxcbiAgcmVxdWlyZUludGVybmFsU2VydmljZSxcbiAgaXNTeXN0ZW1BZG1pbixcbiAgaGFzU2NvcGUsXG4gIHJlcXVpcmVTeXN0ZW1BZG1pbixcbiAgcmVxdWlyZUZlYXR1cmUsXG4gIHR5cGUgQXV0aHpEZW5pYWxJbmZvLFxufSBmcm9tICcuL3Blcm1pc3Npb24tZ2F0ZXMuanMnO1xuZXhwb3J0IHtcbiAgaXNTeXN0ZW1PcmdJZCxcbiAgU1lTVEVNX09SR19JRCxcbiAgU1lTVEVNX09SR19TTFVHLFxufSBmcm9tICcuL3N5c3RlbS1vcmcuanMnO1xuZXhwb3J0IHtcbiAgc2VydmljZU5hbWVPZixcbiAgaXNTZXJ2aWNlVG9rZW5EZW5pZWQsXG4gIHNpZ25TZXJ2aWNlVG9rZW4sXG4gIGdldFNlcnZpY2VBdXRoSGVhZGVyLFxuICBpc1NlcnZpY2VQcmluY2lwYWwsXG4gIGlzU2VydmljZUFjY291bnRQcmluY2lwYWwsXG4gIGlzU2VydmljZVByaW5jaXBhbE5hbWVkLFxuICB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsLFxufSBmcm9tICcuL3NlcnZpY2UtdG9rZW5zLmpzJztcbmV4cG9ydCB7IHJlcXVpcmVTeXN0ZW1PcmcsIHJlcXVpcmVFY29zeXN0ZW1QZXJtaXNzaW9uIH0gZnJvbSAnLi9lY29zeXN0ZW0tZ3VhcmQuanMnO1xuZXhwb3J0IHtcbiAgbW9uZ29TYW5pdGl6ZSxcbiAgTUFYX1NBTklUSVpFX0RFUFRILFxufSBmcm9tICcuL21vbmdvLXNhbml0aXplLmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVTdGVwVXAsXG4gIHR5cGUgU3RlcFVwTWV0aG9kLFxuICBTVFJPTkdfU1RFUF9VUF9NRVRIT0RTLFxufSBmcm9tICcuL3N0ZXAtdXAuanMnO1xuZXhwb3J0IHtcbiAgdGFnUm91dGVHYXRlLFxuICBnZXRSb3V0ZUdhdGVzLFxuICBhdWRpdGVkLFxuICBidWlsZFJvdXRlVGFibGUsXG4gIGlzV3JpdGVNZXRob2QsXG4gIHN1bW1hcml6ZVJvdXRlVGFibGUsXG4gIHR5cGUgUm91dGVUYWJsZUVudHJ5LFxufSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbiJdfQ==
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHNCQUFzQixHQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxXQUFXLEdBQ1osTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQiwwQkFBMEIsRUFDMUIsd0JBQXdCLEdBRXpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsY0FBYyxHQUVmLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGFBQWEsRUFDYixhQUFhLEVBQ2IsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEYsT0FBTyxFQUNMLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsVUFBVSxFQUNWLDhCQUE4QixHQUMvQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxhQUFhLEVBRWIsc0JBQXNCLEdBQ3ZCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxZQUFZLEVBQ1osYUFBYSxFQUNiLE9BQU8sRUFDUCxlQUFlLEVBQ2YsYUFBYSxFQUNiLG1CQUFtQixHQUVwQixNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHZlcmlmeVVzZXJKd3QsXG4gIHZlcmlmeUJlYXJlclRva2VuLFxuICBoYXNWYWxpZElkZW50aXR5Q2xhaW1zLFxufSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuZXhwb3J0IHtcbiAgcmVxdWlyZUF1dGgsXG59IGZyb20gJy4vYXV0aC5qcyc7XG5leHBvcnQge1xuICBzZXRUb2tlblJldm9jYXRpb25TdG9yZSxcbiAgaXNBY2Nlc3NUb2tlblJldm9rZWQsXG59IGZyb20gJy4vcmV2b2NhdGlvbi5qcyc7XG5leHBvcnQge1xuICByZXF1aXJlQXNzdXJhbmNlLFxuICByZWZ1c2VXZWFrU2Vzc2lvbixcbiAgcmVmdXNlRm9yT3JnQWRtaW5Bc3N1cmFuY2UsXG4gIHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZSxcbiAgdHlwZSBBc3N1cmFuY2VPcHRpb25zLFxufSBmcm9tICcuL2Fzc3VyYW5jZS5qcyc7XG5leHBvcnQge1xuICB1c2VySGFzUGVybWlzc2lvbixcbiAgc2V0QXV0aHpEZW5pYWxBdWRpdG9yLFxuICByZWNvcmRBdXRoekRlbmlhbCxcbiAgcmVxdWlyZVBlcm1pc3Npb24sXG4gIHJlcXVpcmVBbGxQZXJtaXNzaW9ucyxcbiAgcmVxdWlyZVBlcm1pc3Npb25PclNlcnZpY2UsXG4gIHJlcXVpcmVTZXJ2aWNlUHJpbmNpcGFsLFxuICByZXF1aXJlSW50ZXJuYWxTZXJ2aWNlLFxuICBpc1N5c3RlbUFkbWluLFxuICBoYXNTY29wZSxcbiAgcmVxdWlyZVN5c3RlbUFkbWluLFxuICByZXF1aXJlRmVhdHVyZSxcbiAgdHlwZSBBdXRoekRlbmlhbEluZm8sXG59IGZyb20gJy4vcGVybWlzc2lvbi1nYXRlcy5qcyc7XG5leHBvcnQge1xuICBpc1N5c3RlbU9yZ0lkLFxuICBTWVNURU1fT1JHX0lELFxuICBTWVNURU1fT1JHX1NMVUcsXG59IGZyb20gJy4vc3lzdGVtLW9yZy5qcyc7XG5leHBvcnQge1xuICBzZXJ2aWNlTmFtZU9mLFxuICBpc1NlcnZpY2VUb2tlbkRlbmllZCxcbiAgc2lnblNlcnZpY2VUb2tlbixcbiAgZ2V0U2VydmljZUF1dGhIZWFkZXIsXG4gIGlzU2VydmljZVByaW5jaXBhbCxcbiAgaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbCxcbiAgaXNTZXJ2aWNlUHJpbmNpcGFsTmFtZWQsXG4gIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwsXG59IGZyb20gJy4vc2VydmljZS10b2tlbnMuanMnO1xuZXhwb3J0IHsgcmVxdWlyZVN5c3RlbU9yZywgcmVxdWlyZUVjb3N5c3RlbVBlcm1pc3Npb24gfSBmcm9tICcuL2Vjb3N5c3RlbS1ndWFyZC5qcyc7XG5leHBvcnQge1xuICBtb25nb1Nhbml0aXplLFxuICBNQVhfU0FOSVRJWkVfREVQVEgsXG59IGZyb20gJy4vbW9uZ28tc2FuaXRpemUuanMnO1xuZXhwb3J0IHtcbiAgcHJvcG9zYWJsZSxcbiAgQVNLX1BST1ZFTkFOQ0VfUkVGVVNFRF9DT1VOVEVSLFxufSBmcm9tICcuL2Fzay1wcm92ZW5hbmNlLmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVTdGVwVXAsXG4gIHR5cGUgU3RlcFVwTWV0aG9kLFxuICBTVFJPTkdfU1RFUF9VUF9NRVRIT0RTLFxufSBmcm9tICcuL3N0ZXAtdXAuanMnO1xuZXhwb3J0IHtcbiAgdGFnUm91dGVHYXRlLFxuICBnZXRSb3V0ZUdhdGVzLFxuICBhdWRpdGVkLFxuICBidWlsZFJvdXRlVGFibGUsXG4gIGlzV3JpdGVNZXRob2QsXG4gIHN1bW1hcml6ZVJvdXRlVGFibGUsXG4gIHR5cGUgUm91dGVUYWJsZUVudHJ5LFxufSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbiJdfQ==
@@ -123,7 +123,6 @@ export declare class InternalHttpClient {
123
123
  * - All delays include ±25% jitter to prevent thundering herd.
124
124
  */
125
125
  private requestWithRetry;
126
- private sleep;
127
126
  /**
128
127
  * Internal request method.
129
128
  */
@@ -4,10 +4,11 @@ import * as http from 'http';
4
4
  import { getCircuitBreaker, circuitBreakerKey, CircuitOpenError } from './circuit-breaker.js';
5
5
  import { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
6
6
  import { HttpStatus } from '../constants/http-status.js';
7
+ import { sleep } from '../utils/concurrency.js';
8
+ import { envInt } from '../utils/env.js';
7
9
  import { createLogger } from '../utils/logger.js';
8
10
  import { emitCounter } from '../utils/metric-emitter.js';
9
11
  import { errorMessage } from '../utils/response.js';
10
- import { envInt } from '../utils/env.js';
11
12
  const logger = createLogger('http-client');
12
13
  /**
13
14
  * Default request timeout in milliseconds (env: `HTTP_CLIENT_TIMEOUT`).
@@ -166,7 +167,7 @@ export class InternalHttpClient {
166
167
  if (decision.shouldRetry && (response.statusCode === 429 || retrySafe)) {
167
168
  logger.debug(decision.reason + ', retrying', { method, path, attempt: attempt + 1, delayMs: decision.delayMs });
168
169
  emitCounter('s2s_request_retries_total', { target, method });
169
- await this.sleep(decision.delayMs);
170
+ await sleep(decision.delayMs);
170
171
  continue;
171
172
  }
172
173
  // Terminal response. A 5xx is a downstream fault (feeds the breaker); a
@@ -196,7 +197,7 @@ export class InternalHttpClient {
196
197
  if (decision.shouldRetry && retrySafe) {
197
198
  logger.debug('Retrying after error', { method, path, error: lastError.message, attempt: attempt + 1 });
198
199
  emitCounter('s2s_request_retries_total', { target, method });
199
- await this.sleep(decision.delayMs);
200
+ await sleep(decision.delayMs);
200
201
  continue;
201
202
  }
202
203
  // Not retrying (non-idempotent, or attempts exhausted) — a connection
@@ -211,9 +212,6 @@ export class InternalHttpClient {
211
212
  emitCounter('s2s_requests_total', { target, method, outcome: 'error' });
212
213
  throw lastError;
213
214
  }
214
- sleep(ms) {
215
- return new Promise(resolve => setTimeout(resolve, ms));
216
- }
217
215
  /**
218
216
  * Internal request method.
219
217
  */
@@ -417,4 +415,4 @@ export function createSafeClient(config, options) {
417
415
  },
418
416
  };
419
417
  }
420
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXhFOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTlFOzs7OztHQUtHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJ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TSxDQUNWLElBQVksRUFDWixPQUF3QjtZQUV4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZGLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgZ2V0Q2lyY3VpdEJyZWFrZXIsIGNpcmN1aXRCcmVha2VyS2V5LCBDaXJjdWl0T3BlbkVycm9yIH0gZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICBnZXRSZXRyeURlY2lzaW9uLFxuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG4gIHR5cGUgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdodHRwLWNsaWVudCcpO1xuXG4vKipcbiAqIERlZmF1bHQgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZW52OiBgSFRUUF9DTElFTlRfVElNRU9VVGApLlxuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSBlbnZJbnQoJ0hUVFBfQ0xJRU5UX1RJTUVPVVQnLCA1MDAwLCB7IG1pbjogMSB9KTtcblxuLyoqXG4gKiBEZWZhdWx0IGNhcCBvbiBjb25jdXJyZW50IGtlZXAtYWxpdmUgc29ja2V0cyBwZXIgY2xpZW50IGFnZW50XG4gKiAoZW52OiBgSFRUUF9DTElFTlRfTUFYX1NPQ0tFVFNgKS4gTm9kZSdzIGRlZmF1bHQgaXMgYEluZmluaXR5YCwgd2hpY2ggbGV0cyBhXG4gKiBidXJzdCBvZiBjb25jdXJyZW50IGNhbGxzIG9wZW4gdW5ib3VuZGVkIHNvY2tldHMgYWdhaW5zdCBhIGRvd25zdHJlYW0gc2VydmljZVxuICogKGZkIGV4aGF1c3Rpb24gKyBjb25uZWN0aW9uLXN0b3JtIG9uIHRoZSBjYWxsZWUpLiA2NCBpcyBhbXBsZSBmb3JcbiAqIHNlcnZpY2UtdG8tc2VydmljZSBmYW4tb3V0IHdoaWxlIHN0YXlpbmcgYm91bmRlZC5cbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfU09DS0VUUyA9IGVudkludCgnSFRUUF9DTElFTlRfTUFYX1NPQ0tFVFMnLCA2NCwgeyBtaW46IDEgfSk7XG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gYSByZXNwb25zZSBib2R5IChieXRlczsgZW52OiBgSFRUUF9DTElFTlRfTUFYX1JFU1BPTlNFX0JZVEVTYCxcbiAqIGRlZmF1bHQgMTAgTWlCKS4gRXZlcnkgcmVzcG9uc2UgaXMgYnVmZmVyZWQgYW5kIEpTT04tcGFyc2VkIGluIG1lbW9yeSwgc28gYW5cbiAqIHVuYm91bmRlZCBib2R5IGZyb20gYSBtaXNiZWhhdmluZyAob3IgY29tcHJvbWlzZWQpIHBlZXIgaXMgYSBtZW1vcnkgRG9TIG9uIHRoZVxuICogY2FsbGVyLiBFeGNlZWRpbmcgaXQgYWJvcnRzIHRoZSByZXF1ZXN0IHdpdGgge0BsaW5rIFJlc3BvbnNlVG9vTGFyZ2VFcnJvcn0uXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX1JFU1BPTlNFX0JZVEVTID0gZW52SW50KCdIVFRQX0NMSUVOVF9NQVhfUkVTUE9OU0VfQllURVMnLCAxMCAqIDEwMjQgKiAxMDI0LCB7IG1pbjogMSB9KTtcblxuLyoqIEEgcmVzcG9uc2UgYm9keSBleGNlZWRlZCB0aGUgY2xpZW50J3MgYG1heFJlc3BvbnNlQnl0ZXNgLiBOb3QgcmV0cmllZC4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZVRvb0xhcmdlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnUkVTUE9OU0VfVE9PX0xBUkdFJztcbiAgY29uc3RydWN0b3IobGltaXQ6IG51bWJlcikge1xuICAgIHN1cGVyKGBSZXNwb25zZSBib2R5IGV4Y2VlZGVkICR7bGltaXR9IGJ5dGVzYCk7XG4gICAgdGhpcy5uYW1lID0gJ1Jlc3BvbnNlVG9vTGFyZ2VFcnJvcic7XG4gIH1cbn1cblxuLy8gSFRUUCBtZXRob2RzIHRoYXQgYXJlIGlkZW1wb3RlbnQgYnkgZGVmaW5pdGlvbiDigJQgc2FmZSB0byBhdXRvLXJldHJ5IG9uIGFcbi8vIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgd2l0aG91dCByaXNraW5nIGEgZHVwbGljYXRlIHNpZGUgZWZmZWN0LlxuY29uc3QgSURFTVBPVEVOVF9NRVRIT0RTID0gbmV3IFNldChbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXSk7XG5cbi8qKlxuICogSFRUUCByZXF1ZXN0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE9wdGlvbnMge1xuICAvKiogUmVxdWVzdCBoZWFkZXJzICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKSAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMg4oCUIGRvdWJsZXMgZWFjaCBhdHRlbXB0IChkZWZhdWx0OiAyMDApICovXG4gIHJldHJ5RGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgc3BlY2lmaWNhbGx5IGZvciA0MjkgcmF0ZSBsaW1pdGluZyAoZGVmYXVsdDogNCkgKi9cbiAgbWF4UmF0ZUxpbWl0UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmcgKGFkZGVkIGFzIFgtUmVxdWVzdC1JZCBoZWFkZXIpICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRyZWF0IHRoaXMgcmVxdWVzdCBhcyBzYWZlIHRvIGF1dG8tcmV0cnkgb24gNXh4L2Nvbm5lY3Rpb24vdGltZW91dCBldmVuXG4gICAqIHRob3VnaCB0aGUgbWV0aG9kIGlzIG5vbi1pZGVtcG90ZW50IChlLmcuIHRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50IGJ5IGFuXG4gICAqIElkZW1wb3RlbmN5LUtleSwgb3IgdGhlIG9wZXJhdGlvbiBpcyBuYXR1cmFsbHkgaWRlbXBvdGVudCkuIERlZmF1bHQgZmFsc2U6XG4gICAqIG5vbi1pZGVtcG90ZW50IG1ldGhvZHMgYXJlIE5PVCByZXRyaWVkIG9uIHRob3NlIGZhaWx1cmVzLCBvbmx5IG9uIDQyOS5cbiAgICovXG4gIGlkZW1wb3RlbnQ/OiBib29sZWFuO1xuICAvKiogQ2FwIG9uIHRoaXMgcmVzcG9uc2UncyBib2R5IGluIGJ5dGVzIChkZWZhdWx0OiB0aGUgY2xpZW50J3MsIGVsc2UgMTAgTWlCKS4gKi9cbiAgbWF4UmVzcG9uc2VCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvdXRlIGNsYXNzIGZvciB0aGUgY2lyY3VpdCBicmVha2VyIChkZWZhdWx0OiB0aGUgY2xpZW50J3MsIGVsc2VcbiAgICogYCdkZWZhdWx0J2ApLiBSZXF1ZXN0cyBpbiBkaWZmZXJlbnQgY2xhc3NlcyB0byB0aGUgc2FtZSBgaG9zdDpwb3J0YCB0cmlwXG4gICAqIGluZGVwZW5kZW50IGJyZWFrZXJzIOKAlCBzZWUgYGNpcmN1aXRCcmVha2VyS2V5YC5cbiAgICovXG4gIGJyZWFrZXJDbGFzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIVFRQIGNsaWVudCByZXNwb25zZSB3cmFwcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRSZXNwb25zZTxUID0gdW5rbm93bj4ge1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIC8qKiBSZXNwb25zZSBib2R5IChwYXJzZWQgSlNPTikgKi9cbiAgYm9keTogVDtcbiAgLyoqIFJlc3BvbnNlIGhlYWRlcnMgKi9cbiAgaGVhZGVyczogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzO1xufVxuXG4vKipcbiAqIEludGVybmFsIEhUVFAgY2xpZW50IGZvciBzZXJ2aWNlLXRvLXNlcnZpY2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudCh7XG4gKiAgIGhvc3Q6ICdxdW90YScsXG4gKiAgIHBvcnQ6IDMwMDAsXG4gKiAgIHRpbWVvdXQ6IDUwMDAsXG4gKiB9KTtcbiAqXG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9vcmcxMjMvYXBpQ2FsbHMnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wb3N0KCcvb3JnMTIzL2luY3JlbWVudCcsIHsgcXVvdGFUeXBlOiAnYXBpQ2FsbHMnIH0pO1xuICogYGBgXG4gKi9cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBwb29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY2FsbGVyLW93bmVkIGBodHRwLkFnZW50YCB0byB1c2UgaW5zdGVhZCBvZiB0aGUgcHJvY2Vzcy13aWRlIHNoYXJlZCBvbmUuXG4gICAqIFRoZSBjbGllbnQgbmV2ZXIgZGVzdHJveXMgaXQuXG4gICAqL1xuICBhZ2VudD86IGh0dHAuQWdlbnQ7XG4gIC8qKiBDYXAgb24gY29uY3VycmVudCBrZWVwLWFsaXZlIHNvY2tldHMgZm9yIHRoZSBzaGFyZWQgYWdlbnQgKGRlZmF1bHQgNjQpLiAqL1xuICBtYXhTb2NrZXRzPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCBjaXJjdWl0LWJyZWFrZXIgcm91dGUgY2xhc3MgZm9yIHRoaXMgY2xpZW50J3MgcmVxdWVzdHMuICovXG4gIGJyZWFrZXJDbGFzcz86IHN0cmluZztcbiAgLyoqIERlZmF1bHQgcmVzcG9uc2UtYm9keSBjYXAgKGJ5dGVzKSBmb3IgdGhpcyBjbGllbnQncyByZXF1ZXN0cy4gKi9cbiAgbWF4UmVzcG9uc2VCeXRlcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUga2VlcC1hbGl2ZSBhZ2VudHMsIG9uZSBwZXIgYGhvc3Q6cG9ydGAgKGFuZCBzb2NrZXQgY2FwKSDigJRcbiAqIG1pcnJvcmluZyB0aGUgcGVyLXRhcmdldCBjaXJjdWl0LWJyZWFrZXIgcmVnaXN0cnkuIENsaWVudHMgYXJlIGNoZWFwIGFuZCBvZnRlblxuICogYnVpbHQgcGVyIGNhbGwgKGFuIG9yZy1oaWVyYXJjaHkgd2FsayBidWlsZHMgb25lIHBlciBob3ApLCBzbyBhIHBlci1jbGllbnRcbiAqIGFnZW50IHRocmV3IGF3YXkgaXRzIHBvb2xlZCBzb2NrZXRzIGV2ZXJ5IHRpbWUgYW5kIHRoZSBzb2NrZXQgY2FwIGJvdW5kZWRcbiAqIG5vdGhpbmcuIFNoYXJpbmcgdGhlIGFnZW50IHBvb2xzIGNvbm5lY3Rpb25zIHRvIGEgZG93bnN0cmVhbSBhY3Jvc3MgZXZlcnlcbiAqIGNsaWVudCB0aGF0IHRhcmdldHMgaXQuXG4gKi9cbmNvbnN0IHNoYXJlZEFnZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBodHRwLkFnZW50PigpO1xuXG5mdW5jdGlvbiBnZXRTaGFyZWRBZ2VudChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlciwgbWF4U29ja2V0czogbnVtYmVyKTogaHR0cC5BZ2VudCB7XG4gIGNvbnN0IGtleSA9IGAke2hvc3R9OiR7cG9ydH06JHttYXhTb2NrZXRzfWA7XG4gIGxldCBhZ2VudCA9IHNoYXJlZEFnZW50cy5nZXQoa2V5KTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUsIG1heFNvY2tldHMgfSk7XG4gICAgc2hhcmVkQWdlbnRzLnNldChrZXksIGFnZW50KTtcbiAgfVxuICByZXR1cm4gYWdlbnQ7XG59XG5cbi8qKlxuICogQ2xvc2UgZXZlcnkgc2hhcmVkIGtlZXAtYWxpdmUgYWdlbnQgKGlkbGUgc29ja2V0cyBhcmUgcmVsZWFzZWQ7IGluLWZsaWdodFxuICogcmVxdWVzdHMgZmluaXNoKS4gRm9yIHByb2Nlc3Mgc2h1dGRvd24gYW5kIHRlc3RzIOKAlCBhIGxhdGVyIHJlcXVlc3Qgc2ltcGx5XG4gKiBidWlsZHMgYSBmcmVzaCBhZ2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3lTaGFyZWRIdHRwQWdlbnRzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGFnZW50IG9mIHNoYXJlZEFnZW50cy52YWx1ZXMoKSkgYWdlbnQuZGVzdHJveSgpO1xuICBzaGFyZWRBZ2VudHMuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsSHR0cENsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxTZXJ2aWNlQ29uZmlnPjtcbiAgcHJpdmF0ZSBhZ2VudDogaHR0cC5BZ2VudDtcbiAgcHJpdmF0ZSBicmVha2VyQ2xhc3M/OiBzdHJpbmc7XG4gIHByaXZhdGUgbWF4UmVzcG9uc2VCeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgSFRUUCBjbGllbnQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBTZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25uZWN0aW9uLXBvb2wgY29udHJvbHMgKG93biBhZ2VudCAvIHNvY2tldCBjYXApXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnQgPSBvcHRpb25zPy5hZ2VudFxuICAgICAgPz8gZ2V0U2hhcmVkQWdlbnQodGhpcy5jb25maWcuaG9zdCwgdGhpcy5jb25maWcucG9ydCwgb3B0aW9ucz8ubWF4U29ja2V0cyA/PyBERUZBVUxUX01BWF9TT0NLRVRTKTtcbiAgICB0aGlzLmJyZWFrZXJDbGFzcyA9IG9wdGlvbnM/LmJyZWFrZXJDbGFzcztcbiAgICB0aGlzLm1heFJlc3BvbnNlQnl0ZXMgPSBvcHRpb25zPy5tYXhSZXNwb25zZUJ5dGVzID8/IERFRkFVTFRfTUFYX1JFU1BPTlNFX0JZVEVTO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBHRVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGdldDxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0dFVCcsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBPU1QgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignUE9TVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBQVVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHB1dDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQVVQnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgREVMRVRFIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBkZWxldGU8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdERUxFVEUnLCBwYXRoLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzLlxuICAgKlxuICAgKiAtIDQyOSAocmF0ZSBsaW1pdCk6IHJlc3BlY3RzIGBSZXRyeS1BZnRlcmAgaGVhZGVyLCB1c2VzIGxvbmdlciBiYXNlIGRlbGF5ICg0eCksXG4gICAqICAgcmV0cmllcyB1cCB0byBgbWF4UmF0ZUxpbWl0UmV0cmllc2AgdGltZXMgKGRlZmF1bHQgNCkuXG4gICAqIC0gNTAyLzUwMy81MDQgKHNlcnZlciBlcnJvcnMpOiBzdGFuZGFyZCBleHBvbmVudGlhbCBiYWNrb2ZmLCB1cCB0byBgbWF4UmV0cmllc2AgKGRlZmF1bHQgMikuXG4gICAqIC0gQ29ubmVjdGlvbiBlcnJvcnMgLyB0aW1lb3V0czogcmV0cmllcyB1cCB0byBgbWF4UmV0cmllc2AuXG4gICAqIC0gQWxsIGRlbGF5cyBpbmNsdWRlIMKxMjUlIGppdHRlciB0byBwcmV2ZW50IHRodW5kZXJpbmcgaGVyZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdFdpdGhSZXRyeTxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIC8vIEEgbWFsZm9ybWVkIHBhdGggaXMgYSBDTElFTlQgYnVnLCBub3QgYSBkb3duc3RyZWFtIGZhdWx0IOKAlCByZWplY3QgaXQgdXBcbiAgICAvLyBmcm9udCBzbyBpdCBuZXZlciBidXJucyByZXRyaWVzIG9yIGZlZWRzIHRoZSBjaXJjdWl0IGJyZWFrZXIgKHdoaWNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNoZWQgdHJhZmZpYyB0byBhIHBlcmZlY3RseSBoZWFsdGh5IGRvd25zdHJlYW0pLiByZXF1ZXN0KCkga2VlcHNcbiAgICAvLyB0aGUgc2FtZSBndWFyZCBhcyBkZWZlbmNlLWluLWRlcHRoLlxuICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlDb25maWc6IFJldHJ5Q29uZmlnID0ge1xuICAgICAgbWF4UmV0cmllczogb3B0aW9ucz8ubWF4UmV0cmllcyA/PyBERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgbWF4UmF0ZUxpbWl0UmV0cmllczogb3B0aW9ucz8ubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IG9wdGlvbnM/LnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gICAgY29uc3QgdG90YWxNYXhBdHRlbXB0cyA9IE1hdGgubWF4KHJldHJ5Q29uZmlnLm1heFJldHJpZXMsIHJldHJ5Q29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTKTtcblxuICAgIC8vIFdoZXRoZXIgaXQncyBzYWZlIHRvIGF1dG8tcmV0cnkgdGhpcyByZXF1ZXN0IG9uIGEgNXh4L2Nvbm5lY3Rpb24vdGltZW91dC5cbiAgICAvLyBBIHRpbWVkLW91dCBQT1NUIG1heSBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgc2VydmVyLXNpZGUsIHNvIHJldHJ5aW5nXG4gICAgLy8gYSBub24taWRlbXBvdGVudCByZXF1ZXN0IHJpc2tzIGEgRFVQTElDQVRFIHNpZGUgZWZmZWN0IChkb3VibGUtY2hhcmdlLFxuICAgIC8vIGRvdWJsZS1jcmVhdGUpLiBPbmx5IEdFVC9IRUFEL09QVElPTlMsIGFuIGV4cGxpY2l0IGBpZGVtcG90ZW50YCBvcHQtaW4sIG9yXG4gICAgLy8gYSByZXF1ZXN0IGNhcnJ5aW5nIGFuIElkZW1wb3RlbmN5LUtleSBhcmUgYXV0by1yZXRyaWVkIG9uIHRob3NlIGZhaWx1cmVzLlxuICAgIC8vICg0MjkgaXMgYWx3YXlzIHJldHJpZWQg4oCUIHNlZSBiZWxvdyDigJQgc2luY2UgaXQgd2FzIHJlamVjdGVkLCBub3QgcHJvY2Vzc2VkLilcbiAgICBjb25zdCByZXRyeVNhZmUgPVxuICAgICAgSURFTVBPVEVOVF9NRVRIT0RTLmhhcyhtZXRob2QudG9VcHBlckNhc2UoKSkgfHxcbiAgICAgIG9wdGlvbnM/LmlkZW1wb3RlbnQgPT09IHRydWUgfHxcbiAgICAgICEhKG9wdGlvbnM/LmhlYWRlcnMgJiYgKG9wdGlvbnMuaGVhZGVyc1snSWRlbXBvdGVuY3ktS2V5J10gfHwgb3B0aW9ucy5oZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSkpO1xuXG4gICAgLy8gUGVyLXRhcmdldCBjaXJjdWl0IGJyZWFrZXIgKyBTMlMgcmVxdWVzdCBtZXRyaWNzLiBgdGFyZ2V0YCBpcyB0aGUgc2hhcmVkXG4gICAgLy8gYnJlYWtlci9tZXRyaWMga2V5IHNvIG9uZSBiYWQgZG93bnN0cmVhbSB0cmlwcyBvbmNlIChub3Qgb25jZS1wZXItY2xpZW50KVxuICAgIC8vIGFuZCBkYXNoYm9hcmRzIGNhbiBzZWUgUzJTIGhlYWx0aCBwZXIgY2FsbGVlLlxuICAgIGNvbnN0IHRhcmdldCA9IGAke3RoaXMuY29uZmlnLmhvc3R9OiR7dGhpcy5jb25maWcucG9ydH1gO1xuICAgIGNvbnN0IGJyZWFrZXIgPSBnZXRDaXJjdWl0QnJlYWtlcihjaXJjdWl0QnJlYWtlcktleSh0YXJnZXQsIG9wdGlvbnM/LmJyZWFrZXJDbGFzcyA/PyB0aGlzLmJyZWFrZXJDbGFzcykpO1xuICAgIGlmICghYnJlYWtlci5hbGxvd1JlcXVlc3QoKSkge1xuICAgICAgLy8gRmFzdC1mYWlsIHdpdGhvdXQgdG91Y2hpbmcgdGhlIG5ldHdvcmsg4oCUIHRoaXMgaXMgdGhlIGxvYWQtc2hlZGRpbmcgdGhhdFxuICAgICAgLy8gcHJldmVudHMgYSBkb3duc3RyZWFtIGJyb3dub3V0IGZyb20gY2FzY2FkaW5nIHZpYSByZXRyeSBzdG9ybXMuXG4gICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ2NpcmN1aXRfb3BlbicgfSk7XG4gICAgICB0aHJvdyBuZXcgQ2lyY3VpdE9wZW5FcnJvcih0YXJnZXQpO1xuICAgIH1cblxuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gdG90YWxNYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdDxUPihtZXRob2QsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZ2V0UmV0cnlEZWNpc2lvbihyZXNwb25zZS5zdGF0dXNDb2RlLCByZXNwb25zZS5oZWFkZXJzLCBhdHRlbXB0LCByZXRyeUNvbmZpZyk7XG4gICAgICAgIC8vIDQyOSBpcyBzYWZlIHRvIHJldHJ5IGZvciBBTlkgbWV0aG9kIChyYXRlLWxpbWl0ZWQg4oaSIG5vdCBwcm9jZXNzZWQpOyBhXG4gICAgICAgIC8vIDV4eC9nYXRld2F5IGVycm9yIGlzIG9ubHkgcmV0cmllZCB3aGVuIHRoZSByZXF1ZXN0IGlzIHJldHJ5LXNhZmUuXG4gICAgICAgIGlmIChkZWNpc2lvbi5zaG91bGRSZXRyeSAmJiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDI5IHx8IHJldHJ5U2FmZSkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoZGVjaXNpb24ucmVhc29uICsgJywgcmV0cnlpbmcnLCB7IG1ldGhvZCwgcGF0aCwgYXR0ZW1wdDogYXR0ZW1wdCArIDEsIGRlbGF5TXM6IGRlY2lzaW9uLmRlbGF5TXMgfSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0X3JldHJpZXNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZXJtaW5hbCByZXNwb25zZS4gQSA1eHggaXMgYSBkb3duc3RyZWFtIGZhdWx0IChmZWVkcyB0aGUgYnJlYWtlcik7IGFcbiAgICAgICAgLy8gNDI5IGlzIGJhY2twcmVzc3VyZSwgbm90IGEgZmF1bHQg4oCUIHRoZSBzZXJ2aWNlIGFuc3dlcmVkLCBzbyBpdCBjb3VudHNcbiAgICAgICAgLy8gYXMgc3VjY2VzcyBmb3IgYnJlYWtlciBwdXJwb3NlcyAobmV2ZXIgdHJpcCB0aGUgYnJlYWtlciBvbiByYXRlIGxpbWl0cykuXG4gICAgICAgIGNvbnN0IGlzU2VydmVyRmF1bHQgPSByZXNwb25zZS5zdGF0dXNDb2RlID49IDUwMCAmJiByZXNwb25zZS5zdGF0dXNDb2RlIDw9IDU5OTtcbiAgICAgICAgaWYgKGlzU2VydmVyRmF1bHQpIHtcbiAgICAgICAgICBicmVha2VyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ3NlcnZlcl9lcnJvcicgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWtlci5yZWNvcmRTdWNjZXNzKCk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG5cbiAgICAgICAgLy8gQW4gb3ZlcnNpemVkIGJvZHkgaXMgdGhlIHBlZXIncyBjb250ZW50LCBub3QgYSB0cmFuc2llbnQgZmF1bHQ6IG5ldmVyXG4gICAgICAgIC8vIHJlLWRvd25sb2FkIGl0LCBhbmQgbmV2ZXIgY291bnQgaXQgYWdhaW5zdCB0aGUgYnJlYWtlci5cbiAgICAgICAgaWYgKGxhc3RFcnJvciBpbnN0YW5jZW9mIFJlc3BvbnNlVG9vTGFyZ2VFcnJvcikge1xuICAgICAgICAgIGJyZWFrZXIucmVjb3JkU3VjY2VzcygpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAndG9vX2xhcmdlJyB9KTtcbiAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRFcnJvclJldHJ5RGVjaXNpb24oYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkgJiYgcmV0cnlTYWZlKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXRyeWluZyBhZnRlciBlcnJvcicsIHsgbWV0aG9kLCBwYXRoLCBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxIH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdF9yZXRyaWVzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCB9KTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCByZXRyeWluZyAobm9uLWlkZW1wb3RlbnQsIG9yIGF0dGVtcHRzIGV4aGF1c3RlZCkg4oCUIGEgY29ubmVjdGlvblxuICAgICAgICAvLyBlcnJvci90aW1lb3V0IGlzIGEgZG93bnN0cmVhbSBmYXVsdDogZmVlZCB0aGUgYnJlYWtlciBhbmQgZmFpbCBub3cuXG4gICAgICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgdGhyb3cgbGFzdEVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvb3AgZXhoYXVzdGVkIHdpdGhvdXQgcmV0dXJuaW5nIChhbGwgYXR0ZW1wdHMgcmV0cmllZCB0aGVuIHJhbiBvdXQpLlxuICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnZXJyb3InIH0pO1xuICAgIHRocm93IGxhc3RFcnJvciE7XG4gIH1cblxuICBwcml2YXRlIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgcmVxdWVzdCBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU2VyaWFsaXplIHdoZW4gYm9keSBpcyBkZWZpbmVkIChpbmNsdWRpbmcgMC9mYWxzZS8nJyB3aGljaCBhcmUgdmFsaWQgSlNPTiB2YWx1ZXMpLlxuICAgICAgY29uc3QgYm9keVN0ciA9IGJvZHkgIT09IHVuZGVmaW5lZCA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBoZWFkZXJzOiBodHRwLk91dGdvaW5nSHR0cEhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICB9O1xuXG4gICAgICAvLyBQcm9wYWdhdGUgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZ1xuICAgICAgaWYgKG9wdGlvbnM/LnJlcXVlc3RJZCkge1xuICAgICAgICBoZWFkZXJzWydYLVJlcXVlc3QtSWQnXSA9IG9wdGlvbnMucmVxdWVzdElkO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm9keVN0cikge1xuICAgICAgICBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gQnVmZmVyLmJ5dGVMZW5ndGgoYm9keVN0cik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHBhdGggdG8gcHJldmVudCBwcm90b2NvbCBpbmplY3Rpb24gLyByZXF1ZXN0IHNtdWdnbGluZ1xuICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJzovLycpIHx8IHBhdGguc3RhcnRzV2l0aCgnLy8nKSB8fCAvW1xcclxcblxcMF0vLnRlc3QocGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3QgcGF0aDogJHtwYXRofWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMuY29uZmlnLnRpbWVvdXQ7XG4gICAgICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/Lm1heFJlc3BvbnNlQnl0ZXMgPz8gdGhpcy5tYXhSZXNwb25zZUJ5dGVzO1xuXG4gICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogaHR0cC5SZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgaG9zdG5hbWU6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgIHBhdGg6IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWAsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgLy8gU29ja2V0IElETEUgdGltZW91dC4gVGhlIHRvdGFsIGRlYWRsaW5lIGJlbG93IGJvdW5kcyB0aGUgd2hvbGVcbiAgICAgICAgLy8gZXhjaGFuZ2Ug4oCUIGEgcGVlciB0cmlja2xpbmcgb25lIGJ5dGUgcGVyIGludGVydmFsIG5ldmVyIGdvZXMgaWRsZS5cbiAgICAgICAgdGltZW91dDogdGltZW91dE1zLFxuICAgICAgICBhZ2VudDogdGhpcy5hZ2VudCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHRsZSBleGFjdGx5IG9uY2UsIHdoaWNoZXZlciBvZiB0aGUgbWFueSB0ZXJtaW5hbCBldmVudHMgZmlyZXMgZmlyc3RcbiAgICAgIC8vIChyZXNwb25zZSBlbmQsIHJlcXVlc3QvcmVzcG9uc2UgZXJyb3IsIGFib3J0LCBwcmVtYXR1cmUgY2xvc2UsIGRlYWRsaW5lLFxuICAgICAgLy8gc2l6ZSBjYXApLiBFdmVyeSBleGl0IHBhdGggY2xlYXJzIHRoZSBkZWFkbGluZSB0aW1lci5cbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgZGVhZGxpbmU6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZmFpbCA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChkZWFkbGluZSkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzdWNjZWVkID0gKHZhbHVlOiBIdHRwQ2xpZW50UmVzcG9uc2U8VD4pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChkZWFkbGluZSkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICAgIHJlcy5vbignZGF0YScsIChyYXc6IEJ1ZmZlciB8IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShyYXcpIDogcmF3O1xuICAgICAgICAgIHJlY2VpdmVkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAocmVjZWl2ZWQgPiBtYXhCeXRlcykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVzcG9uc2UgZXhjZWVkZWQgc2l6ZSBjYXAnLCB7IGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsIHBhdGgsIG1heEJ5dGVzIH0pO1xuICAgICAgICAgICAgZmFpbChuZXcgUmVzcG9uc2VUb29MYXJnZUVycm9yKG1heEJ5dGVzKSk7XG4gICAgICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRoZSByZXNwb25zZSBzdHJlYW0gZmFpbGluZyBvciBiZWluZyBjdXQgbWlkLWJvZHkgbXVzdCByZWplY3Qg4oCUIGJlZm9yZSxcbiAgICAgICAgLy8gdGhlc2UgbGVmdCB0aGUgcHJvbWlzZSBwZW5kaW5nIGZvcmV2ZXIgKGEgaHVuZyBjYWxsZXIsIGFuZCBhIGJyZWFrZXJcbiAgICAgICAgLy8gcHJvYmUgdGhhdCBuZXZlciByZXBvcnRlZCBiYWNrKS5cbiAgICAgICAgcmVzLm9uKCdlcnJvcicsIChlcnJvcikgPT4gZmFpbChlcnJvcikpO1xuICAgICAgICByZXMub24oJ2Fib3J0ZWQnLCAoKSA9PiBmYWlsKG5ldyBFcnJvcignUmVzcG9uc2UgYWJvcnRlZCBieSBwZWVyIGJlZm9yZSBjb21wbGV0aW9uJykpKTtcbiAgICAgICAgcmVzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBpZiAoIXJlcy5jb21wbGV0ZSkgZmFpbChuZXcgRXJyb3IoJ1Jlc3BvbnNlIGNsb3NlZCBiZWZvcmUgY29tcGxldGlvbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmOCcpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gZGF0YSA/IEpTT04ucGFyc2UoZGF0YSkgOiB7fTtcbiAgICAgICAgICAgIHN1Y2NlZWQoe1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSB8fCBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgICAgYm9keTogcGFyc2VkQm9keSBhcyBULFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UgYm9keScsIHtcbiAgICAgICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShwYXJzZUVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3VjY2VlZCh7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlIHx8IEh0dHBTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICAgICAgICBib2R5OiB7fSBhcyBULFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOyAvLyBvdXIgb3duIGRlc3Ryb3koKSBhZnRlciBhIGRlYWRsaW5lL3NpemUtY2FwIGZhaWx1cmVcbiAgICAgICAgLy8gTm9kZSBkdWFsLXN0YWNrIGNvbm5lY3QgZmFpbHVyZXMgYXJlIGFuIEFnZ3JlZ2F0ZUVycm9yIHdpdGggYW4gZW1wdHlcbiAgICAgICAgLy8gYC5tZXNzYWdlYDsgdGhlIGNhdXNlIGlzIGluIGAuY29kZWAgKEVDT05OUkVGVVNFRC9FVElNRURPVVQpLiBGYWxsXG4gICAgICAgIC8vIGJhY2sgc28gdGhlIGxvZyBpc24ndCBhIGJsYW5rIGBlcnJvcjpcIlwiYC5cbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXJyb3IubWVzc2FnZSB8fCAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIHx8IGVycm9yLm5hbWU7XG4gICAgICAgIGxvZ2dlci5lcnJvcignSFRUUCByZXF1ZXN0IGZhaWxlZCcsIHtcbiAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgZXJyb3I6IGRldGFpbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9ICgpID0+IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCk7XG5cbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVxdWVzdCB0aW1lb3V0IChzb2NrZXQgaWRsZSknLCB7IGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsIHBhdGgsIHRpbWVvdXQ6IHRpbWVvdXRNcyB9KTtcbiAgICAgICAgZmFpbCh0aW1lb3V0RXJyb3IoKSk7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIHJlcXVlc3QgY2xvc2luZyBiZWZvcmUgd2Ugc2V0dGxlZCAobm8gcmVzcG9uc2UsIG9yIGEgcmVzcG9uc2Ugd2VcbiAgICAgIC8vIG5ldmVyIGZpbmlzaGVkKSBpcyBhIGZhaWx1cmUsIG5vdCBzaWxlbmNlLlxuICAgICAgcmVxLm9uKCdjbG9zZScsICgpID0+IGZhaWwobmV3IEVycm9yKCdSZXF1ZXN0IGNsb3NlZCBiZWZvcmUgYSByZXNwb25zZSBjb21wbGV0ZWQnKSkpO1xuXG4gICAgICAvLyBUT1RBTCBkZWFkbGluZSBmb3IgdGhlIGV4Y2hhbmdlIChjb25uZWN0ICsgc2VuZCArIGZ1bGwgYm9keSkuXG4gICAgICBkZWFkbGluZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignSFRUUCByZXF1ZXN0IHRpbWVvdXQgKHRvdGFsIGRlYWRsaW5lKScsIHsgaG9zdDogdGhpcy5jb25maWcuaG9zdCwgcGF0aCwgdGltZW91dDogdGltZW91dE1zIH0pO1xuICAgICAgICBmYWlsKHRpbWVvdXRFcnJvcigpKTtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICBkZWFkbGluZS51bnJlZj8uKCk7XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIHJlcS53cml0ZShib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgcmVxLmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEhUVFAgY2xpZW50IHdpdGggZXJyb3IgaGFuZGxpbmcgdGhhdCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqIFVzZWZ1bCBmb3IgZmFpbC1vcGVuIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbGllbnQgd3JhcHBlciB3aXRoIHNhZmUgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2FmZUNsaWVudChjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KGNvbmZpZywgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBTYWZlIEdFVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGdldDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+IHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5nZXQ8VD4ocGF0aCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIEdFVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIFBPU1QgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwb3N0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnBvc3Q8VD4ocGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIFBPU1QgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBERUxFVEUgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci4gVXNlZCBieSBkZXN0cnVjdGl2ZVxuICAgICAqIGNyb3NzLXNlcnZpY2Ugb3BlcmF0aW9ucyAoZS5nLiBvcmctY2FzY2FkZSBkZWxldGUgaW4gcGxhdGZvcm0pLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZTxUPihcbiAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZGVsZXRlPFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBERUxFVEUgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUV4RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUU5RTs7Ozs7R0FLRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsTUFB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LENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkYsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBnZXRDaXJjdWl0QnJlYWtlciwgY2lyY3VpdEJyZWFrZXJLZXksIENpcmN1aXRPcGVuRXJyb3IgfSBmcm9tICcuL2NpcmN1aXQtYnJlYWtlci5qcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9SRVRSSUVTLFxuICBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gIGdldFJldHJ5RGVjaXNpb24sXG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbiAgdHlwZSBSZXRyeUNvbmZpZyxcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL3V0aWxzL2NvbmN1cnJlbmN5LmpzJztcbmltcG9ydCB7IGVudkludCB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaHR0cC1jbGllbnQnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGVudjogYEhUVFBfQ0xJRU5UX1RJTUVPVVRgKS5cbiAqL1xuY29uc3QgREVGQVVMVF9USU1FT1VUID0gZW52SW50KCdIVFRQX0NMSUVOVF9USU1FT1VUJywgNTAwMCwgeyBtaW46IDEgfSk7XG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gY29uY3VycmVudCBrZWVwLWFsaXZlIHNvY2tldHMgcGVyIGNsaWVudCBhZ2VudFxuICogKGVudjogYEhUVFBfQ0xJRU5UX01BWF9TT0NLRVRTYCkuIE5vZGUncyBkZWZhdWx0IGlzIGBJbmZpbml0eWAsIHdoaWNoIGxldHMgYVxuICogYnVyc3Qgb2YgY29uY3VycmVudCBjYWxscyBvcGVuIHVuYm91bmRlZCBzb2NrZXRzIGFnYWluc3QgYSBkb3duc3RyZWFtIHNlcnZpY2VcbiAqIChmZCBleGhhdXN0aW9uICsgY29ubmVjdGlvbi1zdG9ybSBvbiB0aGUgY2FsbGVlKS4gNjQgaXMgYW1wbGUgZm9yXG4gKiBzZXJ2aWNlLXRvLXNlcnZpY2UgZmFuLW91dCB3aGlsZSBzdGF5aW5nIGJvdW5kZWQuXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX1NPQ0tFVFMgPSBlbnZJbnQoJ0hUVFBfQ0xJRU5UX01BWF9TT0NLRVRTJywgNjQsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIERlZmF1bHQgY2FwIG9uIGEgcmVzcG9uc2UgYm9keSAoYnl0ZXM7IGVudjogYEhUVFBfQ0xJRU5UX01BWF9SRVNQT05TRV9CWVRFU2AsXG4gKiBkZWZhdWx0IDEwIE1pQikuIEV2ZXJ5IHJlc3BvbnNlIGlzIGJ1ZmZlcmVkIGFuZCBKU09OLXBhcnNlZCBpbiBtZW1vcnksIHNvIGFuXG4gKiB1bmJvdW5kZWQgYm9keSBmcm9tIGEgbWlzYmVoYXZpbmcgKG9yIGNvbXByb21pc2VkKSBwZWVyIGlzIGEgbWVtb3J5IERvUyBvbiB0aGVcbiAqIGNhbGxlci4gRXhjZWVkaW5nIGl0IGFib3J0cyB0aGUgcmVxdWVzdCB3aXRoIHtAbGluayBSZXNwb25zZVRvb0xhcmdlRXJyb3J9LlxuICovXG5jb25zdCBERUZBVUxUX01BWF9SRVNQT05TRV9CWVRFUyA9IGVudkludCgnSFRUUF9DTElFTlRfTUFYX1JFU1BPTlNFX0JZVEVTJywgMTAgKiAxMDI0ICogMTAyNCwgeyBtaW46IDEgfSk7XG5cbi8qKiBBIHJlc3BvbnNlIGJvZHkgZXhjZWVkZWQgdGhlIGNsaWVudCdzIGBtYXhSZXNwb25zZUJ5dGVzYC4gTm90IHJldHJpZWQuICovXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VUb29MYXJnZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ1JFU1BPTlNFX1RPT19MQVJHRSc7XG4gIGNvbnN0cnVjdG9yKGxpbWl0OiBudW1iZXIpIHtcbiAgICBzdXBlcihgUmVzcG9uc2UgYm9keSBleGNlZWRlZCAke2xpbWl0fSBieXRlc2ApO1xuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZVRvb0xhcmdlRXJyb3InO1xuICB9XG59XG5cbi8vIEhUVFAgbWV0aG9kcyB0aGF0IGFyZSBpZGVtcG90ZW50IGJ5IGRlZmluaXRpb24g4oCUIHNhZmUgdG8gYXV0by1yZXRyeSBvbiBhXG4vLyA1eHgvY29ubmVjdGlvbi90aW1lb3V0IHdpdGhvdXQgcmlza2luZyBhIGR1cGxpY2F0ZSBzaWRlIGVmZmVjdC5cbmNvbnN0IElERU1QT1RFTlRfTUVUSE9EUyA9IG5ldyBTZXQoWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJ10pO1xuXG4vKipcbiAqIEhUVFAgcmVxdWVzdCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFJlcXVlc3QgaGVhZGVycyAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZGVmYXVsdDogMikgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIEJhc2UgZGVsYXkgYmV0d2VlbiByZXRyaWVzIGluIG1zIOKAlCBkb3VibGVzIGVhY2ggYXR0ZW1wdCAoZGVmYXVsdDogMjAwKSAqL1xuICByZXRyeURlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHNwZWNpZmljYWxseSBmb3IgNDI5IHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IDQpICovXG4gIG1heFJhdGVMaW1pdFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nIChhZGRlZCBhcyBYLVJlcXVlc3QtSWQgaGVhZGVyKSAqL1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUcmVhdCB0aGlzIHJlcXVlc3QgYXMgc2FmZSB0byBhdXRvLXJldHJ5IG9uIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgZXZlblxuICAgKiB0aG91Z2ggdGhlIG1ldGhvZCBpcyBub24taWRlbXBvdGVudCAoZS5nLiB0aGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudCBieSBhblxuICAgKiBJZGVtcG90ZW5jeS1LZXksIG9yIHRoZSBvcGVyYXRpb24gaXMgbmF0dXJhbGx5IGlkZW1wb3RlbnQpLiBEZWZhdWx0IGZhbHNlOlxuICAgKiBub24taWRlbXBvdGVudCBtZXRob2RzIGFyZSBOT1QgcmV0cmllZCBvbiB0aG9zZSBmYWlsdXJlcywgb25seSBvbiA0MjkuXG4gICAqL1xuICBpZGVtcG90ZW50PzogYm9vbGVhbjtcbiAgLyoqIENhcCBvbiB0aGlzIHJlc3BvbnNlJ3MgYm9keSBpbiBieXRlcyAoZGVmYXVsdDogdGhlIGNsaWVudCdzLCBlbHNlIDEwIE1pQikuICovXG4gIG1heFJlc3BvbnNlQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSb3V0ZSBjbGFzcyBmb3IgdGhlIGNpcmN1aXQgYnJlYWtlciAoZGVmYXVsdDogdGhlIGNsaWVudCdzLCBlbHNlXG4gICAqIGAnZGVmYXVsdCdgKS4gUmVxdWVzdHMgaW4gZGlmZmVyZW50IGNsYXNzZXMgdG8gdGhlIHNhbWUgYGhvc3Q6cG9ydGAgdHJpcFxuICAgKiBpbmRlcGVuZGVudCBicmVha2VycyDigJQgc2VlIGBjaXJjdWl0QnJlYWtlcktleWAuXG4gICAqL1xuICBicmVha2VyQ2xhc3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSFRUUCBjbGllbnQgcmVzcG9uc2Ugd3JhcHBlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwQ2xpZW50UmVzcG9uc2U8VCA9IHVua25vd24+IHtcbiAgLyoqIEhUVFAgc3RhdHVzIGNvZGUgKi9cbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICAvKiogUmVzcG9uc2UgYm9keSAocGFyc2VkIEpTT04pICovXG4gIGJvZHk6IFQ7XG4gIC8qKiBSZXNwb25zZSBoZWFkZXJzICovXG4gIGhlYWRlcnM6IGh0dHAuSW5jb21pbmdIdHRwSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBIVFRQIGNsaWVudCBmb3Igc2VydmljZS10by1zZXJ2aWNlIGNvbW11bmljYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQoe1xuICogICBob3N0OiAncXVvdGEnLFxuICogICBwb3J0OiAzMDAwLFxuICogICB0aW1lb3V0OiA1MDAwLFxuICogfSk7XG4gKlxuICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvb3JnMTIzL2FwaUNhbGxzJyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucG9zdCgnL29yZzEyMy9pbmNyZW1lbnQnLCB7IHF1b3RhVHlwZTogJ2FwaUNhbGxzJyB9KTtcbiAqIGBgYFxuICovXG4vKipcbiAqIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNsaWVudCdzIGNvbm5lY3Rpb24gcG9vbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwQ2xpZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGNhbGxlci1vd25lZCBgaHR0cC5BZ2VudGAgdG8gdXNlIGluc3RlYWQgb2YgdGhlIHByb2Nlc3Mtd2lkZSBzaGFyZWQgb25lLlxuICAgKiBUaGUgY2xpZW50IG5ldmVyIGRlc3Ryb3lzIGl0LlxuICAgKi9cbiAgYWdlbnQ/OiBodHRwLkFnZW50O1xuICAvKiogQ2FwIG9uIGNvbmN1cnJlbnQga2VlcC1hbGl2ZSBzb2NrZXRzIGZvciB0aGUgc2hhcmVkIGFnZW50IChkZWZhdWx0IDY0KS4gKi9cbiAgbWF4U29ja2V0cz86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgY2lyY3VpdC1icmVha2VyIHJvdXRlIGNsYXNzIGZvciB0aGlzIGNsaWVudCdzIHJlcXVlc3RzLiAqL1xuICBicmVha2VyQ2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IHJlc3BvbnNlLWJvZHkgY2FwIChieXRlcykgZm9yIHRoaXMgY2xpZW50J3MgcmVxdWVzdHMuICovXG4gIG1heFJlc3BvbnNlQnl0ZXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvY2Vzcy13aWRlIGtlZXAtYWxpdmUgYWdlbnRzLCBvbmUgcGVyIGBob3N0OnBvcnRgIChhbmQgc29ja2V0IGNhcCkg4oCUXG4gKiBtaXJyb3JpbmcgdGhlIHBlci10YXJnZXQgY2lyY3VpdC1icmVha2VyIHJlZ2lzdHJ5LiBDbGllbnRzIGFyZSBjaGVhcCBhbmQgb2Z0ZW5cbiAqIGJ1aWx0IHBlciBjYWxsIChhbiBvcmctaGllcmFyY2h5IHdhbGsgYnVpbGRzIG9uZSBwZXIgaG9wKSwgc28gYSBwZXItY2xpZW50XG4gKiBhZ2VudCB0aHJldyBhd2F5IGl0cyBwb29sZWQgc29ja2V0cyBldmVyeSB0aW1lIGFuZCB0aGUgc29ja2V0IGNhcCBib3VuZGVkXG4gKiBub3RoaW5nLiBTaGFyaW5nIHRoZSBhZ2VudCBwb29scyBjb25uZWN0aW9ucyB0byBhIGRvd25zdHJlYW0gYWNyb3NzIGV2ZXJ5XG4gKiBjbGllbnQgdGhhdCB0YXJnZXRzIGl0LlxuICovXG5jb25zdCBzaGFyZWRBZ2VudHMgPSBuZXcgTWFwPHN0cmluZywgaHR0cC5BZ2VudD4oKTtcblxuZnVuY3Rpb24gZ2V0U2hhcmVkQWdlbnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIsIG1heFNvY2tldHM6IG51bWJlcik6IGh0dHAuQWdlbnQge1xuICBjb25zdCBrZXkgPSBgJHtob3N0fToke3BvcnR9OiR7bWF4U29ja2V0c31gO1xuICBsZXQgYWdlbnQgPSBzaGFyZWRBZ2VudHMuZ2V0KGtleSk7XG4gIGlmICghYWdlbnQpIHtcbiAgICBhZ2VudCA9IG5ldyBodHRwLkFnZW50KHsga2VlcEFsaXZlOiB0cnVlLCBtYXhTb2NrZXRzIH0pO1xuICAgIHNoYXJlZEFnZW50cy5zZXQoa2V5LCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIENsb3NlIGV2ZXJ5IHNoYXJlZCBrZWVwLWFsaXZlIGFnZW50IChpZGxlIHNvY2tldHMgYXJlIHJlbGVhc2VkOyBpbi1mbGlnaHRcbiAqIHJlcXVlc3RzIGZpbmlzaCkuIEZvciBwcm9jZXNzIHNodXRkb3duIGFuZCB0ZXN0cyDigJQgYSBsYXRlciByZXF1ZXN0IHNpbXBseVxuICogYnVpbGRzIGEgZnJlc2ggYWdlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95U2hhcmVkSHR0cEFnZW50cygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhZ2VudCBvZiBzaGFyZWRBZ2VudHMudmFsdWVzKCkpIGFnZW50LmRlc3Ryb3koKTtcbiAgc2hhcmVkQWdlbnRzLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEh0dHBDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8U2VydmljZUNvbmZpZz47XG4gIHByaXZhdGUgYWdlbnQ6IGh0dHAuQWdlbnQ7XG4gIHByaXZhdGUgYnJlYWtlckNsYXNzPzogc3RyaW5nO1xuICBwcml2YXRlIG1heFJlc3BvbnNlQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IEhUVFAgY2xpZW50IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29ubmVjdGlvbi1wb29sIGNvbnRyb2xzIChvd24gYWdlbnQgLyBzb2NrZXQgY2FwKVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTZXJ2aWNlQ29uZmlnLCBvcHRpb25zPzogSHR0cENsaWVudE9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyBERUZBVUxUX1RJTUVPVVQsXG4gICAgfTtcbiAgICB0aGlzLmFnZW50ID0gb3B0aW9ucz8uYWdlbnRcbiAgICAgID8/IGdldFNoYXJlZEFnZW50KHRoaXMuY29uZmlnLmhvc3QsIHRoaXMuY29uZmlnLnBvcnQsIG9wdGlvbnM/Lm1heFNvY2tldHMgPz8gREVGQVVMVF9NQVhfU09DS0VUUyk7XG4gICAgdGhpcy5icmVha2VyQ2xhc3MgPSBvcHRpb25zPy5icmVha2VyQ2xhc3M7XG4gICAgdGhpcy5tYXhSZXNwb25zZUJ5dGVzID0gb3B0aW9ucz8ubWF4UmVzcG9uc2VCeXRlcyA/PyBERUZBVUxUX01BWF9SRVNQT05TRV9CWVRFUztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgR0VUIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBnZXQ8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdHRVQnLCBwYXRoLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBQT1NUIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBwb3N0PFQgPSB1bmtub3duPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ1BPU1QnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgUFVUIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBwdXQ8VCA9IHVua25vd24+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignUFVUJywgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIERFTEVURSByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlPFQgPSB1bmtub3duPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignREVMRVRFJywgcGF0aCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHdpdGggcmV0cnkgbG9naWMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcy5cbiAgICpcbiAgICogLSA0MjkgKHJhdGUgbGltaXQpOiByZXNwZWN0cyBgUmV0cnktQWZ0ZXJgIGhlYWRlciwgdXNlcyBsb25nZXIgYmFzZSBkZWxheSAoNHgpLFxuICAgKiAgIHJldHJpZXMgdXAgdG8gYG1heFJhdGVMaW1pdFJldHJpZXNgIHRpbWVzIChkZWZhdWx0IDQpLlxuICAgKiAtIDUwMi81MDMvNTA0IChzZXJ2ZXIgZXJyb3JzKTogc3RhbmRhcmQgZXhwb25lbnRpYWwgYmFja29mZiwgdXAgdG8gYG1heFJldHJpZXNgIChkZWZhdWx0IDIpLlxuICAgKiAtIENvbm5lY3Rpb24gZXJyb3JzIC8gdGltZW91dHM6IHJldHJpZXMgdXAgdG8gYG1heFJldHJpZXNgLlxuICAgKiAtIEFsbCBkZWxheXMgaW5jbHVkZSDCsTI1JSBqaXR0ZXIgdG8gcHJldmVudCB0aHVuZGVyaW5nIGhlcmQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlcXVlc3RXaXRoUmV0cnk8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICAvLyBBIG1hbGZvcm1lZCBwYXRoIGlzIGEgQ0xJRU5UIGJ1Zywgbm90IGEgZG93bnN0cmVhbSBmYXVsdCDigJQgcmVqZWN0IGl0IHVwXG4gICAgLy8gZnJvbnQgc28gaXQgbmV2ZXIgYnVybnMgcmV0cmllcyBvciBmZWVkcyB0aGUgY2lyY3VpdCBicmVha2VyICh3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzaGVkIHRyYWZmaWMgdG8gYSBwZXJmZWN0bHkgaGVhbHRoeSBkb3duc3RyZWFtKS4gcmVxdWVzdCgpIGtlZXBzXG4gICAgLy8gdGhlIHNhbWUgZ3VhcmQgYXMgZGVmZW5jZS1pbi1kZXB0aC5cbiAgICBpZiAocGF0aC5pbmNsdWRlcygnOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCcvLycpIHx8IC9bXFxyXFxuXFwwXS8udGVzdChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3QgcGF0aDogJHtwYXRofWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5Q29uZmlnOiBSZXRyeUNvbmZpZyA9IHtcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnM/Lm1heFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgICAgIG1heFJhdGVMaW1pdFJldHJpZXM6IG9wdGlvbnM/Lm1heFJhdGVMaW1pdFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICAgICAgcmV0cnlEZWxheU1zOiBvcHRpb25zPy5yZXRyeURlbGF5TXMgPz8gREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgICB9O1xuICAgIGNvbnN0IHRvdGFsTWF4QXR0ZW1wdHMgPSBNYXRoLm1heChyZXRyeUNvbmZpZy5tYXhSZXRyaWVzLCByZXRyeUNvbmZpZy5tYXhSYXRlTGltaXRSZXRyaWVzID8/IERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyk7XG5cbiAgICAvLyBXaGV0aGVyIGl0J3Mgc2FmZSB0byBhdXRvLXJldHJ5IHRoaXMgcmVxdWVzdCBvbiBhIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQuXG4gICAgLy8gQSB0aW1lZC1vdXQgUE9TVCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIHNlcnZlci1zaWRlLCBzbyByZXRyeWluZ1xuICAgIC8vIGEgbm9uLWlkZW1wb3RlbnQgcmVxdWVzdCByaXNrcyBhIERVUExJQ0FURSBzaWRlIGVmZmVjdCAoZG91YmxlLWNoYXJnZSxcbiAgICAvLyBkb3VibGUtY3JlYXRlKS4gT25seSBHRVQvSEVBRC9PUFRJT05TLCBhbiBleHBsaWNpdCBgaWRlbXBvdGVudGAgb3B0LWluLCBvclxuICAgIC8vIGEgcmVxdWVzdCBjYXJyeWluZyBhbiBJZGVtcG90ZW5jeS1LZXkgYXJlIGF1dG8tcmV0cmllZCBvbiB0aG9zZSBmYWlsdXJlcy5cbiAgICAvLyAoNDI5IGlzIGFsd2F5cyByZXRyaWVkIOKAlCBzZWUgYmVsb3cg4oCUIHNpbmNlIGl0IHdhcyByZWplY3RlZCwgbm90IHByb2Nlc3NlZC4pXG4gICAgY29uc3QgcmV0cnlTYWZlID1cbiAgICAgIElERU1QT1RFTlRfTUVUSE9EUy5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpIHx8XG4gICAgICBvcHRpb25zPy5pZGVtcG90ZW50ID09PSB0cnVlIHx8XG4gICAgICAhIShvcHRpb25zPy5oZWFkZXJzICYmIChvcHRpb25zLmhlYWRlcnNbJ0lkZW1wb3RlbmN5LUtleSddIHx8IG9wdGlvbnMuaGVhZGVyc1snaWRlbXBvdGVuY3kta2V5J10pKTtcblxuICAgIC8vIFBlci10YXJnZXQgY2lyY3VpdCBicmVha2VyICsgUzJTIHJlcXVlc3QgbWV0cmljcy4gYHRhcmdldGAgaXMgdGhlIHNoYXJlZFxuICAgIC8vIGJyZWFrZXIvbWV0cmljIGtleSBzbyBvbmUgYmFkIGRvd25zdHJlYW0gdHJpcHMgb25jZSAobm90IG9uY2UtcGVyLWNsaWVudClcbiAgICAvLyBhbmQgZGFzaGJvYXJkcyBjYW4gc2VlIFMyUyBoZWFsdGggcGVyIGNhbGxlZS5cbiAgICBjb25zdCB0YXJnZXQgPSBgJHt0aGlzLmNvbmZpZy5ob3N0fToke3RoaXMuY29uZmlnLnBvcnR9YDtcbiAgICBjb25zdCBicmVha2VyID0gZ2V0Q2lyY3VpdEJyZWFrZXIoY2lyY3VpdEJyZWFrZXJLZXkodGFyZ2V0LCBvcHRpb25zPy5icmVha2VyQ2xhc3MgPz8gdGhpcy5icmVha2VyQ2xhc3MpKTtcbiAgICBpZiAoIWJyZWFrZXIuYWxsb3dSZXF1ZXN0KCkpIHtcbiAgICAgIC8vIEZhc3QtZmFpbCB3aXRob3V0IHRvdWNoaW5nIHRoZSBuZXR3b3JrIOKAlCB0aGlzIGlzIHRoZSBsb2FkLXNoZWRkaW5nIHRoYXRcbiAgICAgIC8vIHByZXZlbnRzIGEgZG93bnN0cmVhbSBicm93bm91dCBmcm9tIGNhc2NhZGluZyB2aWEgcmV0cnkgc3Rvcm1zLlxuICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdjaXJjdWl0X29wZW4nIH0pO1xuICAgICAgdGhyb3cgbmV3IENpcmN1aXRPcGVuRXJyb3IodGFyZ2V0KTtcbiAgICB9XG5cbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IHRvdGFsTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8VD4obWV0aG9kLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGdldFJldHJ5RGVjaXNpb24ocmVzcG9uc2Uuc3RhdHVzQ29kZSwgcmVzcG9uc2UuaGVhZGVycywgYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICAvLyA0MjkgaXMgc2FmZSB0byByZXRyeSBmb3IgQU5ZIG1ldGhvZCAocmF0ZS1saW1pdGVkIOKGkiBub3QgcHJvY2Vzc2VkKTsgYVxuICAgICAgICAvLyA1eHgvZ2F0ZXdheSBlcnJvciBpcyBvbmx5IHJldHJpZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyByZXRyeS1zYWZlLlxuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkgJiYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQyOSB8fCByZXRyeVNhZmUpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGRlY2lzaW9uLnJlYXNvbiArICcsIHJldHJ5aW5nJywgeyBtZXRob2QsIHBhdGgsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLCBkZWxheU1zOiBkZWNpc2lvbi5kZWxheU1zIH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdF9yZXRyaWVzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCB9KTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlcm1pbmFsIHJlc3BvbnNlLiBBIDV4eCBpcyBhIGRvd25zdHJlYW0gZmF1bHQgKGZlZWRzIHRoZSBicmVha2VyKTsgYVxuICAgICAgICAvLyA0MjkgaXMgYmFja3ByZXNzdXJlLCBub3QgYSBmYXVsdCDigJQgdGhlIHNlcnZpY2UgYW5zd2VyZWQsIHNvIGl0IGNvdW50c1xuICAgICAgICAvLyBhcyBzdWNjZXNzIGZvciBicmVha2VyIHB1cnBvc2VzIChuZXZlciB0cmlwIHRoZSBicmVha2VyIG9uIHJhdGUgbGltaXRzKS5cbiAgICAgICAgY29uc3QgaXNTZXJ2ZXJGYXVsdCA9IHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNTAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPD0gNTk5O1xuICAgICAgICBpZiAoaXNTZXJ2ZXJGYXVsdCkge1xuICAgICAgICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnc2VydmVyX2Vycm9yJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVha2VyLnJlY29yZFN1Y2Nlc3MoKTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcblxuICAgICAgICAvLyBBbiBvdmVyc2l6ZWQgYm9keSBpcyB0aGUgcGVlcidzIGNvbnRlbnQsIG5vdCBhIHRyYW5zaWVudCBmYXVsdDogbmV2ZXJcbiAgICAgICAgLy8gcmUtZG93bmxvYWQgaXQsIGFuZCBuZXZlciBjb3VudCBpdCBhZ2FpbnN0IHRoZSBicmVha2VyLlxuICAgICAgICBpZiAobGFzdEVycm9yIGluc3RhbmNlb2YgUmVzcG9uc2VUb29MYXJnZUVycm9yKSB7XG4gICAgICAgICAgYnJlYWtlci5yZWNvcmRTdWNjZXNzKCk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICd0b29fbGFyZ2UnIH0pO1xuICAgICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGdldEVycm9yUmV0cnlEZWNpc2lvbihhdHRlbXB0LCByZXRyeUNvbmZpZyk7XG4gICAgICAgIGlmIChkZWNpc2lvbi5zaG91bGRSZXRyeSAmJiByZXRyeVNhZmUpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JldHJ5aW5nIGFmdGVyIGVycm9yJywgeyBtZXRob2QsIHBhdGgsIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSwgYXR0ZW1wdDogYXR0ZW1wdCArIDEgfSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0X3JldHJpZXNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kIH0pO1xuICAgICAgICAgIGF3YWl0IHNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCByZXRyeWluZyAobm9uLWlkZW1wb3RlbnQsIG9yIGF0dGVtcHRzIGV4aGF1c3RlZCkg4oCUIGEgY29ubmVjdGlvblxuICAgICAgICAvLyBlcnJvci90aW1lb3V0IGlzIGEgZG93bnN0cmVhbSBmYXVsdDogZmVlZCB0aGUgYnJlYWtlciBhbmQgZmFpbCBub3cuXG4gICAgICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgdGhyb3cgbGFzdEVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvb3AgZXhoYXVzdGVkIHdpdGhvdXQgcmV0dXJuaW5nIChhbGwgYXR0ZW1wdHMgcmV0cmllZCB0aGVuIHJhbiBvdXQpLlxuICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnZXJyb3InIH0pO1xuICAgIHRocm93IGxhc3RFcnJvciE7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgcmVxdWVzdCBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU2VyaWFsaXplIHdoZW4gYm9keSBpcyBkZWZpbmVkIChpbmNsdWRpbmcgMC9mYWxzZS8nJyB3aGljaCBhcmUgdmFsaWQgSlNPTiB2YWx1ZXMpLlxuICAgICAgY29uc3QgYm9keVN0ciA9IGJvZHkgIT09IHVuZGVmaW5lZCA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBoZWFkZXJzOiBodHRwLk91dGdvaW5nSHR0cEhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICB9O1xuXG4gICAgICAvLyBQcm9wYWdhdGUgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZ1xuICAgICAgaWYgKG9wdGlvbnM/LnJlcXVlc3RJZCkge1xuICAgICAgICBoZWFkZXJzWydYLVJlcXVlc3QtSWQnXSA9IG9wdGlvbnMucmVxdWVzdElkO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm9keVN0cikge1xuICAgICAgICBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gQnVmZmVyLmJ5dGVMZW5ndGgoYm9keVN0cik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHBhdGggdG8gcHJldmVudCBwcm90b2NvbCBpbmplY3Rpb24gLyByZXF1ZXN0IHNtdWdnbGluZ1xuICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJzovLycpIHx8IHBhdGguc3RhcnRzV2l0aCgnLy8nKSB8fCAvW1xcclxcblxcMF0vLnRlc3QocGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3QgcGF0aDogJHtwYXRofWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMuY29uZmlnLnRpbWVvdXQ7XG4gICAgICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/Lm1heFJlc3BvbnNlQnl0ZXMgPz8gdGhpcy5tYXhSZXNwb25zZUJ5dGVzO1xuXG4gICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogaHR0cC5SZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgaG9zdG5hbWU6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgIHBhdGg6IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWAsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgLy8gU29ja2V0IElETEUgdGltZW91dC4gVGhlIHRvdGFsIGRlYWRsaW5lIGJlbG93IGJvdW5kcyB0aGUgd2hvbGVcbiAgICAgICAgLy8gZXhjaGFuZ2Ug4oCUIGEgcGVlciB0cmlja2xpbmcgb25lIGJ5dGUgcGVyIGludGVydmFsIG5ldmVyIGdvZXMgaWRsZS5cbiAgICAgICAgdGltZW91dDogdGltZW91dE1zLFxuICAgICAgICBhZ2VudDogdGhpcy5hZ2VudCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHRsZSBleGFjdGx5IG9uY2UsIHdoaWNoZXZlciBvZiB0aGUgbWFueSB0ZXJtaW5hbCBldmVudHMgZmlyZXMgZmlyc3RcbiAgICAgIC8vIChyZXNwb25zZSBlbmQsIHJlcXVlc3QvcmVzcG9uc2UgZXJyb3IsIGFib3J0LCBwcmVtYXR1cmUgY2xvc2UsIGRlYWRsaW5lLFxuICAgICAgLy8gc2l6ZSBjYXApLiBFdmVyeSBleGl0IHBhdGggY2xlYXJzIHRoZSBkZWFkbGluZSB0aW1lci5cbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgZGVhZGxpbmU6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZmFpbCA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChkZWFkbGluZSkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzdWNjZWVkID0gKHZhbHVlOiBIdHRwQ2xpZW50UmVzcG9uc2U8VD4pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChkZWFkbGluZSkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICAgIHJlcy5vbignZGF0YScsIChyYXc6IEJ1ZmZlciB8IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShyYXcpIDogcmF3O1xuICAgICAgICAgIHJlY2VpdmVkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAocmVjZWl2ZWQgPiBtYXhCeXRlcykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVzcG9uc2UgZXhjZWVkZWQgc2l6ZSBjYXAnLCB7IGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsIHBhdGgsIG1heEJ5dGVzIH0pO1xuICAgICAgICAgICAgZmFpbChuZXcgUmVzcG9uc2VUb29MYXJnZUVycm9yKG1heEJ5dGVzKSk7XG4gICAgICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRoZSByZXNwb25zZSBzdHJlYW0gZmFpbGluZyBvciBiZWluZyBjdXQgbWlkLWJvZHkgbXVzdCByZWplY3Qg4oCUIGJlZm9yZSxcbiAgICAgICAgLy8gdGhlc2UgbGVmdCB0aGUgcHJvbWlzZSBwZW5kaW5nIGZvcmV2ZXIgKGEgaHVuZyBjYWxsZXIsIGFuZCBhIGJyZWFrZXJcbiAgICAgICAgLy8gcHJvYmUgdGhhdCBuZXZlciByZXBvcnRlZCBiYWNrKS5cbiAgICAgICAgcmVzLm9uKCdlcnJvcicsIChlcnJvcikgPT4gZmFpbChlcnJvcikpO1xuICAgICAgICByZXMub24oJ2Fib3J0ZWQnLCAoKSA9PiBmYWlsKG5ldyBFcnJvcignUmVzcG9uc2UgYWJvcnRlZCBieSBwZWVyIGJlZm9yZSBjb21wbGV0aW9uJykpKTtcbiAgICAgICAgcmVzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBpZiAoIXJlcy5jb21wbGV0ZSkgZmFpbChuZXcgRXJyb3IoJ1Jlc3BvbnNlIGNsb3NlZCBiZWZvcmUgY29tcGxldGlvbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmOCcpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gZGF0YSA/IEpTT04ucGFyc2UoZGF0YSkgOiB7fTtcbiAgICAgICAgICAgIHN1Y2NlZWQoe1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSB8fCBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgICAgYm9keTogcGFyc2VkQm9keSBhcyBULFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UgYm9keScsIHtcbiAgICAgICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShwYXJzZUVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3VjY2VlZCh7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlIHx8IEh0dHBTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICAgICAgICBib2R5OiB7fSBhcyBULFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOyAvLyBvdXIgb3duIGRlc3Ryb3koKSBhZnRlciBhIGRlYWRsaW5lL3NpemUtY2FwIGZhaWx1cmVcbiAgICAgICAgLy8gTm9kZSBkdWFsLXN0YWNrIGNvbm5lY3QgZmFpbHVyZXMgYXJlIGFuIEFnZ3JlZ2F0ZUVycm9yIHdpdGggYW4gZW1wdHlcbiAgICAgICAgLy8gYC5tZXNzYWdlYDsgdGhlIGNhdXNlIGlzIGluIGAuY29kZWAgKEVDT05OUkVGVVNFRC9FVElNRURPVVQpLiBGYWxsXG4gICAgICAgIC8vIGJhY2sgc28gdGhlIGxvZyBpc24ndCBhIGJsYW5rIGBlcnJvcjpcIlwiYC5cbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXJyb3IubWVzc2FnZSB8fCAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIHx8IGVycm9yLm5hbWU7XG4gICAgICAgIGxvZ2dlci5lcnJvcignSFRUUCByZXF1ZXN0IGZhaWxlZCcsIHtcbiAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgZXJyb3I6IGRldGFpbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9ICgpID0+IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCk7XG5cbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVxdWVzdCB0aW1lb3V0IChzb2NrZXQgaWRsZSknLCB7IGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsIHBhdGgsIHRpbWVvdXQ6IHRpbWVvdXRNcyB9KTtcbiAgICAgICAgZmFpbCh0aW1lb3V0RXJyb3IoKSk7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIHJlcXVlc3QgY2xvc2luZyBiZWZvcmUgd2Ugc2V0dGxlZCAobm8gcmVzcG9uc2UsIG9yIGEgcmVzcG9uc2Ugd2VcbiAgICAgIC8vIG5ldmVyIGZpbmlzaGVkKSBpcyBhIGZhaWx1cmUsIG5vdCBzaWxlbmNlLlxuICAgICAgcmVxLm9uKCdjbG9zZScsICgpID0+IGZhaWwobmV3IEVycm9yKCdSZXF1ZXN0IGNsb3NlZCBiZWZvcmUgYSByZXNwb25zZSBjb21wbGV0ZWQnKSkpO1xuXG4gICAgICAvLyBUT1RBTCBkZWFkbGluZSBmb3IgdGhlIGV4Y2hhbmdlIChjb25uZWN0ICsgc2VuZCArIGZ1bGwgYm9keSkuXG4gICAgICBkZWFkbGluZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignSFRUUCByZXF1ZXN0IHRpbWVvdXQgKHRvdGFsIGRlYWRsaW5lKScsIHsgaG9zdDogdGhpcy5jb25maWcuaG9zdCwgcGF0aCwgdGltZW91dDogdGltZW91dE1zIH0pO1xuICAgICAgICBmYWlsKHRpbWVvdXRFcnJvcigpKTtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICBkZWFkbGluZS51bnJlZj8uKCk7XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIHJlcS53cml0ZShib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgcmVxLmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEhUVFAgY2xpZW50IHdpdGggZXJyb3IgaGFuZGxpbmcgdGhhdCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqIFVzZWZ1bCBmb3IgZmFpbC1vcGVuIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbGllbnQgd3JhcHBlciB3aXRoIHNhZmUgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2FmZUNsaWVudChjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KGNvbmZpZywgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBTYWZlIEdFVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGdldDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+IHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5nZXQ8VD4ocGF0aCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIEdFVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIFBPU1QgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwb3N0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnBvc3Q8VD4ocGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIFBPU1QgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBERUxFVEUgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci4gVXNlZCBieSBkZXN0cnVjdGl2ZVxuICAgICAqIGNyb3NzLXNlcnZpY2Ugb3BlcmF0aW9ucyAoZS5nLiBvcmctY2FzY2FkZSBkZWxldGUgaW4gcGxhdGZvcm0pLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZTxUPihcbiAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZGVsZXRlPFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBERUxFVEUgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19