@pipeline-builder/api-core 4.1.20 → 4.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/helpers/access-helpers.d.ts +50 -2
- package/lib/helpers/access-helpers.js +44 -3
- package/lib/helpers/index.d.ts +1 -1
- package/lib/helpers/index.js +2 -2
- package/lib/middleware/ask-provenance.d.ts +53 -0
- package/lib/middleware/ask-provenance.js +26 -0
- package/lib/middleware/index.d.ts +1 -0
- package/lib/middleware/index.js +2 -1
- package/lib/services/http-client.d.ts +0 -1
- package/lib/services/http-client.js +5 -7
- package/lib/services/index.d.ts +2 -2
- package/lib/services/index.js +3 -3
- package/lib/services/remote-audit-client.d.ts +1 -15
- package/lib/services/remote-audit-client.js +2 -295
- package/lib/services/s3-client.d.ts +54 -0
- package/lib/services/s3-client.js +106 -0
- package/lib/types/ask-proposals.d.ts +269 -0
- package/lib/types/ask-proposals.js +308 -0
- package/lib/types/compliance-exemption.d.ts +24 -0
- package/lib/types/compliance-exemption.js +4 -0
- package/lib/types/index.d.ts +5 -2
- package/lib/types/index.js +5 -2
- package/lib/types/remote-audit-actions.d.ts +23 -0
- package/lib/types/remote-audit-actions.js +305 -0
- package/lib/utils/date.d.ts +19 -0
- package/lib/utils/date.js +22 -0
- package/lib/utils/dsse.d.ts +32 -0
- package/lib/utils/dsse.js +55 -0
- package/lib/utils/index.d.ts +3 -1
- package/lib/utils/index.js +4 -2
- package/lib/utils/response.d.ts +34 -4
- package/lib/utils/response.js +30 -5
- package/lib/utils/sensitive-patterns.js +17 -1
- package/lib/validation/index.d.ts +2 -2
- package/lib/validation/index.js +3 -3
- package/package.json +14 -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
|
-
|
|
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' && !
|
|
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==
|
package/lib/helpers/index.d.ts
CHANGED
|
@@ -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';
|
package/lib/helpers/index.js
CHANGED
|
@@ -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,
|
|
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';
|
package/lib/middleware/index.js
CHANGED
|
@@ -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,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHNCQUFzQixHQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxXQUFXLEdBQ1osTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQiwwQkFBMEIsRUFDMUIsd0JBQXdCLEdBRXpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsY0FBYyxHQUVmLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGFBQWEsRUFDYixhQUFhLEVBQ2IsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEYsT0FBTyxFQUNMLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsVUFBVSxFQUNWLDhCQUE4QixHQUMvQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxhQUFhLEVBRWIsc0JBQXNCLEdBQ3ZCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxZQUFZLEVBQ1osYUFBYSxFQUNiLE9BQU8sRUFDUCxlQUFlLEVBQ2YsYUFBYSxFQUNiLG1CQUFtQixHQUVwQixNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHZlcmlmeVVzZXJKd3QsXG4gIHZlcmlmeUJlYXJlclRva2VuLFxuICBoYXNWYWxpZElkZW50aXR5Q2xhaW1zLFxufSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuZXhwb3J0IHtcbiAgcmVxdWlyZUF1dGgsXG59IGZyb20gJy4vYXV0aC5qcyc7XG5leHBvcnQge1xuICBzZXRUb2tlblJldm9jYXRpb25TdG9yZSxcbiAgaXNBY2Nlc3NUb2tlblJldm9rZWQsXG59IGZyb20gJy4vcmV2b2NhdGlvbi5qcyc7XG5leHBvcnQge1xuICByZXF1aXJlQXNzdXJhbmNlLFxuICByZWZ1c2VXZWFrU2Vzc2lvbixcbiAgcmVmdXNlRm9yT3JnQWRtaW5Bc3N1cmFuY2UsXG4gIHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZSxcbiAgdHlwZSBBc3N1cmFuY2VPcHRpb25zLFxufSBmcm9tICcuL2Fzc3VyYW5jZS5qcyc7XG5leHBvcnQge1xuICB1c2VySGFzUGVybWlzc2lvbixcbiAgc2V0QXV0aHpEZW5pYWxBdWRpdG9yLFxuICByZWNvcmRBdXRoekRlbmlhbCxcbiAgcmVxdWlyZVBlcm1pc3Npb24sXG4gIHJlcXVpcmVBbGxQZXJtaXNzaW9ucyxcbiAgcmVxdWlyZVBlcm1pc3Npb25PclNlcnZpY2UsXG4gIHJlcXVpcmVTZXJ2aWNlUHJpbmNpcGFsLFxuICByZXF1aXJlSW50ZXJuYWxTZXJ2aWNlLFxuICBpc1N5c3RlbUFkbWluLFxuICBoYXNTY29wZSxcbiAgcmVxdWlyZVN5c3RlbUFkbWluLFxuICByZXF1aXJlRmVhdHVyZSxcbiAgdHlwZSBBdXRoekRlbmlhbEluZm8sXG59IGZyb20gJy4vcGVybWlzc2lvbi1nYXRlcy5qcyc7XG5leHBvcnQge1xuICBpc1N5c3RlbU9yZ0lkLFxuICBTWVNURU1fT1JHX0lELFxuICBTWVNURU1fT1JHX1NMVUcsXG59IGZyb20gJy4vc3lzdGVtLW9yZy5qcyc7XG5leHBvcnQge1xuICBzZXJ2aWNlTmFtZU9mLFxuICBpc1NlcnZpY2VUb2tlbkRlbmllZCxcbiAgc2lnblNlcnZpY2VUb2tlbixcbiAgZ2V0U2VydmljZUF1dGhIZWFkZXIsXG4gIGlzU2VydmljZVByaW5jaXBhbCxcbiAgaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbCxcbiAgaXNTZXJ2aWNlUHJpbmNpcGFsTmFtZWQsXG4gIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwsXG59IGZyb20gJy4vc2VydmljZS10b2tlbnMuanMnO1xuZXhwb3J0IHsgcmVxdWlyZVN5c3RlbU9yZywgcmVxdWlyZUVjb3N5c3RlbVBlcm1pc3Npb24gfSBmcm9tICcuL2Vjb3N5c3RlbS1ndWFyZC5qcyc7XG5leHBvcnQge1xuICBtb25nb1Nhbml0aXplLFxuICBNQVhfU0FOSVRJWkVfREVQVEgsXG59IGZyb20gJy4vbW9uZ28tc2FuaXRpemUuanMnO1xuZXhwb3J0IHtcbiAgcHJvcG9zYWJsZSxcbiAgQVNLX1BST1ZFTkFOQ0VfUkVGVVNFRF9DT1VOVEVSLFxufSBmcm9tICcuL2Fzay1wcm92ZW5hbmNlLmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVTdGVwVXAsXG4gIHR5cGUgU3RlcFVwTWV0aG9kLFxuICBTVFJPTkdfU1RFUF9VUF9NRVRIT0RTLFxufSBmcm9tICcuL3N0ZXAtdXAuanMnO1xuZXhwb3J0IHtcbiAgdGFnUm91dGVHYXRlLFxuICBnZXRSb3V0ZUdhdGVzLFxuICBhdWRpdGVkLFxuICBidWlsZFJvdXRlVGFibGUsXG4gIGlzV3JpdGVNZXRob2QsXG4gIHN1bW1hcml6ZVJvdXRlVGFibGUsXG4gIHR5cGUgUm91dGVUYWJsZUVudHJ5LFxufSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbiJdfQ==
|
|
@@ -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
|
|
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
|
|
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
|