@pipeline-builder/pipeline-events 4.3.3 → 4.3.5

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.
@@ -0,0 +1,37 @@
1
+ import { type SynthFailure } from '@pipeline-builder/pipeline-core/lib/core/synth-failure.js';
2
+ /**
3
+ * The build id of a failed CodeBuild action, from the event detail; null for a
4
+ * non-CodeBuild action or an event that carries no external execution id.
5
+ */
6
+ export declare function codeBuildIdOf(detail: Record<string, unknown>): string | null;
7
+ /**
8
+ * The compute size a finished CodeBuild action ran on, AS AWS SPELLS IT
9
+ * (`BUILD_GENERAL1_MEDIUM`), or null.
10
+ *
11
+ * Returned raw and narrowed server-side rather than here, for one hard reason:
12
+ * this Lambda ships as a SINGLE bundled file, and the vocabulary lives in the
13
+ * pipeline-core barrel, which carries dynamic imports that break that constraint
14
+ * (`test/single-file-constraint.test.ts` is the check). Sending the raw string
15
+ * also keeps the stored `detail.computeType` the observation rather than an
16
+ * interpretation of it.
17
+ *
18
+ * WHY IT IS READ FROM AWS rather than from our own stored pipeline config: the
19
+ * config holds a step's REQUESTED compute type, and what the build actually ran
20
+ * on is what consumed vCPU — a pipeline edited between the start and the finish
21
+ * would otherwise be priced against the new value. `BatchGetBuilds` answers the
22
+ * authoritative one, and this Lambda already holds that permission for the
23
+ * failure-reason read below.
24
+ *
25
+ * Best-effort, like everything else here: a throttle or a missing permission
26
+ * yields null, the event forwards without the field, and the ingest records that
27
+ * action as unmeasured rather than as free. A size that cannot be read must not
28
+ * be guessed — SMALL is the cheapest and therefore the most flattering guess.
29
+ *
30
+ * NOT folded into {@link readSynthFailure}, which makes the same call: that one
31
+ * runs on FAILED actions only, this one on every terminal CodeBuild action, and
32
+ * sharing a cache between them would mean holding build records for the whole
33
+ * batch to save one call on the minority path.
34
+ */
35
+ export declare function readBuildCompute(region: string, buildId: string): Promise<string | null>;
36
+ /** Find the `PB_SYNTH_FAILURE` line in a failed build's log, or null. */
37
+ export declare function readSynthFailure(region: string, buildId: string): Promise<SynthFailure | null>;
@@ -0,0 +1,111 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { parseSynthFailure, SYNTH_FAILURE_MARKER } from '@pipeline-builder/pipeline-core/lib/core/synth-failure.js';
4
+ import { loadSdk, log } from './util.js';
5
+ let loader = loadSdk;
6
+ const clients = new Map();
7
+ /** @internal Test-only: substitute the SDK loader (and drop cached clients). */
8
+ export function _setFailureReasonLoaderForTests(next) {
9
+ loader = next ?? loadSdk;
10
+ clients.clear();
11
+ }
12
+ async function client(kind, region) {
13
+ const mod = kind === 'codebuild'
14
+ ? await loader('@aws-sdk/client-codebuild')
15
+ : await loader('@aws-sdk/client-cloudwatch-logs');
16
+ const key = `${kind}:${region}`;
17
+ let c = clients.get(key);
18
+ if (!c) {
19
+ c = kind === 'codebuild'
20
+ ? new mod.CodeBuildClient({ region })
21
+ : new mod.CloudWatchLogsClient({ region });
22
+ clients.set(key, c);
23
+ }
24
+ return { client: c, mod };
25
+ }
26
+ /** A CodeBuild build id: `<project>:<uuid>`. */
27
+ const BUILD_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{1,254}:[0-9a-f-]{36}$/;
28
+ /**
29
+ * The build id of a failed CodeBuild action, from the event detail; null for a
30
+ * non-CodeBuild action or an event that carries no external execution id.
31
+ */
32
+ export function codeBuildIdOf(detail) {
33
+ const type = detail.type;
34
+ if (type?.provider !== undefined && type.provider !== 'CodeBuild')
35
+ return null;
36
+ const result = detail['execution-result'];
37
+ const id = result?.['external-execution-id'];
38
+ return typeof id === 'string' && BUILD_ID_RE.test(id) ? id : null;
39
+ }
40
+ /**
41
+ * The compute size a finished CodeBuild action ran on, AS AWS SPELLS IT
42
+ * (`BUILD_GENERAL1_MEDIUM`), or null.
43
+ *
44
+ * Returned raw and narrowed server-side rather than here, for one hard reason:
45
+ * this Lambda ships as a SINGLE bundled file, and the vocabulary lives in the
46
+ * pipeline-core barrel, which carries dynamic imports that break that constraint
47
+ * (`test/single-file-constraint.test.ts` is the check). Sending the raw string
48
+ * also keeps the stored `detail.computeType` the observation rather than an
49
+ * interpretation of it.
50
+ *
51
+ * WHY IT IS READ FROM AWS rather than from our own stored pipeline config: the
52
+ * config holds a step's REQUESTED compute type, and what the build actually ran
53
+ * on is what consumed vCPU — a pipeline edited between the start and the finish
54
+ * would otherwise be priced against the new value. `BatchGetBuilds` answers the
55
+ * authoritative one, and this Lambda already holds that permission for the
56
+ * failure-reason read below.
57
+ *
58
+ * Best-effort, like everything else here: a throttle or a missing permission
59
+ * yields null, the event forwards without the field, and the ingest records that
60
+ * action as unmeasured rather than as free. A size that cannot be read must not
61
+ * be guessed — SMALL is the cheapest and therefore the most flattering guess.
62
+ *
63
+ * NOT folded into {@link readSynthFailure}, which makes the same call: that one
64
+ * runs on FAILED actions only, this one on every terminal CodeBuild action, and
65
+ * sharing a cache between them would mean holding build records for the whole
66
+ * batch to save one call on the minority path.
67
+ */
68
+ export async function readBuildCompute(region, buildId) {
69
+ try {
70
+ const cb = await client('codebuild', region);
71
+ const out = await cb.client.send(new cb.mod.BatchGetBuildsCommand({ ids: [buildId] }));
72
+ return out.builds?.[0]?.environment?.computeType ?? null;
73
+ }
74
+ catch (err) {
75
+ log.warn('Could not read the build\'s compute size (forwarding without it)', {
76
+ buildId, error: String(err),
77
+ });
78
+ return null;
79
+ }
80
+ }
81
+ /** Find the `PB_SYNTH_FAILURE` line in a failed build's log, or null. */
82
+ export async function readSynthFailure(region, buildId) {
83
+ try {
84
+ const cb = await client('codebuild', region);
85
+ const out = await cb.client.send(new cb.mod.BatchGetBuildsCommand({ ids: [buildId] }));
86
+ const logs = out.builds?.[0]?.logs;
87
+ if (!logs?.groupName || !logs.streamName)
88
+ return null;
89
+ const cw = await client('logs', region);
90
+ const res = await cw.client.send(new cw.mod.FilterLogEventsCommand({
91
+ logGroupName: logs.groupName,
92
+ logStreamNames: [logs.streamName],
93
+ filterPattern: `"${SYNTH_FAILURE_MARKER}"`,
94
+ limit: 5,
95
+ }));
96
+ for (const event of res.events ?? []) {
97
+ const failure = typeof event.message === 'string' ? parseSynthFailure(event.message) : null;
98
+ if (failure)
99
+ return failure;
100
+ }
101
+ return null;
102
+ }
103
+ catch (err) {
104
+ log.warn('Could not read the failed build\'s structured failure reason (forwarding without it)', {
105
+ buildId,
106
+ error: err instanceof Error ? err.message : String(err),
107
+ });
108
+ return null;
109
+ }
110
+ }
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpbHVyZS1yZWFzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZmFpbHVyZS1yZWFzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQXFCLE1BQU0sMkRBQTJELENBQUM7QUFDdkksT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUF5Q3pDLElBQUksTUFBTSxHQUFXLE9BQU8sQ0FBQztBQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUU3QyxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLCtCQUErQixDQUFDLElBQXdCO0lBQ3RFLE1BQU0sR0FBRyxJQUFJLElBQUksT0FBTyxDQUFDO0lBQ3pCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRUQsS0FBSyxVQUFVLE1BQU0sQ0FBQyxJQUEwQixFQUFFLE1BQWM7SUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLFdBQVc7UUFDOUIsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFrQiwyQkFBMkIsQ0FBQztRQUM1RCxDQUFDLENBQUMsTUFBTSxNQUFNLENBQWEsaUNBQWlDLENBQUMsQ0FBQztJQUNoRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUNoQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUMsR0FBRyxJQUFJLEtBQUssV0FBVztZQUN0QixDQUFDLENBQUMsSUFBSyxHQUF1QixDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzFELENBQUMsQ0FBQyxJQUFLLEdBQWtCLENBQUMsb0JBQW9CLENBQUMsRUFBRSxN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LFVBQVUsQ0FBQztZQUNqQyxhQUFhLEVBQUUsSUFBSSxvQkFBb0IsR0FBRztZQUMxQyxLQUFLLEVBQUUsQ0FBQztTQUNULENBQUMsQ0FBNkMsQ0FBQztRQUNoRCxLQUFLLE1BQU0sS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckMsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDNUYsSUFBSSxPQUFPO2dCQUFFLE9BQU8sT0FBTyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxzRkFBc0YsRUFBRTtZQUMvRixPQUFPO1lBQ1AsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDeEQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwYXJzZVN5bnRoRmFpbHVyZSwgU1lOVEhfRkFJTFVSRV9NQVJLRVIsIHR5cGUgU3ludGhGYWlsdXJlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9saWIvY29yZS9zeW50aC1mYWlsdXJlLmpzJztcbmltcG9ydCB7IGxvYWRTZGssIGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIFN0cnVjdHVyZWQgZmFpbHVyZSByZWFzb25zIGZvciBmYWlsZWQgQ29kZUJ1aWxkIGFjdGlvbnMuXG4vL1xuLy8gQSBDb2RlUGlwZWxpbmUgYWN0aW9uLWZhaWx1cmUgZXZlbnQgY2FycmllcyBvbmx5IENvZGVCdWlsZCdzIGdlbmVyaWMgc3VtbWFyeVxuLy8gKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGNvbW1hbmQ6IOKApiBleGl0IHN0YXR1cyAxXCIpLCBuZXZlciB0aGUgYnVpbGQgb3V0cHV0IOKAlFxuLy8gc28gV0hZIGEgc3ludGggcmVmdXNlZCBhIHBsdWdpbiAobm90IGluc3RhbGxlZCwgZGVuaWVkIGJ5IHBvbGljeSwgYmFkIHNpZ25hdHVyZSlcbi8vIHdhcyByZWFkYWJsZSBvbmx5IGluIHRoZSBidWlsZCBsb2cuIGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYCBwcmludHNcbi8vIG9uZSBgUEJfU1lOVEhfRkFJTFVSRSB74oCmfWAgbGluZSB3aGVuIGl0IGZhaWxzIGluc2lkZSBDb2RlQnVpbGQ7IHRoaXMgbW9kdWxlXG4vLyBmaW5kcyB0aGF0IGxpbmUgaW4gdGhlIGZhaWxlZCBidWlsZCdzIENsb3VkV2F0Y2ggbG9nIHN0cmVhbS5cbi8vXG4vLyBJbi1hY2NvdW50IGFuZCBiZXN0LWVmZm9ydDogQmF0Y2hHZXRCdWlsZHMg4oaSIHRoZSBidWlsZCdzIGxvZyBncm91cC9zdHJlYW0g4oaSXG4vLyBGaWx0ZXJMb2dFdmVudHMgZm9yIHRoZSBtYXJrZXIuIEFueSBmYWlsdXJlIChubyBwZXJtaXNzaW9uLCBsb2dzIG5vdCB5ZXRcbi8vIGZsdXNoZWQsIG5vIG1hcmtlcikgeWllbGRzIG51bGwgYW5kIHRoZSBldmVudCBpcyBmb3J3YXJkZWQgd2l0aG91dCBpdCDigJQgYVxuLy8gbWlzc2luZyByZWFzb24gbXVzdCBuZXZlciBob2xkIHVwIGV2ZW50IGluZ2VzdGlvbi4gUmVxdWlyZXNcbi8vIGBjb2RlYnVpbGQ6QmF0Y2hHZXRCdWlsZHNgICsgYGxvZ3M6RmlsdGVyTG9nRXZlbnRzYCAoZXZlbnRzLXN0YWNrLmpzb24pLlxuLy9cbi8vIFRoZSBTREsgY2xpZW50cyBjb21lIGZyb20gdGhlIExhbWJkYSBydW50aW1lICh2YXJpYWJsZS1zcGVjaWZpZXIgbG9hZCwgbGlrZVxuLy8gQ29kZUNvbW1pdC9TUVMpLCBzbyB0aGV5IGFyZSBub3QgZGVwZW5kZW5jaWVzIG9mIHRoaXMgcGFja2FnZS5cblxuaW50ZXJmYWNlIFNka0NsaWVudCB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfVxuaW50ZXJmYWNlIENvZGVCdWlsZE1vZHVsZSB7XG4gIENvZGVCdWlsZENsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU2RrQ2xpZW50O1xuICBCYXRjaEdldEJ1aWxkc0NvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgaWRzOiBzdHJpbmdbXSB9KSA9PiB1bmtub3duO1xufVxuXG4vKiogV2hhdCBgQmF0Y2hHZXRCdWlsZHNgIGFuc3dlcnMsIGZvciB0aGUgdHdvIHRoaW5ncyB0aGlzIG1vZHVsZSByZWFkcyBvZmYgaXQuICovXG5pbnRlcmZhY2UgQmF0Y2hHZXRCdWlsZHNPdXRwdXQge1xuICBidWlsZHM/OiBBcnJheTx7XG4gICAgbG9ncz86IHsgZ3JvdXBOYW1lPzogc3RyaW5nOyBzdHJlYW1OYW1lPzogc3RyaW5nIH07XG4gICAgZW52aXJvbm1lbnQ/OiB7IGNvbXB1dGVUeXBlPzogc3RyaW5nIH07XG4gIH0+O1xufVxuaW50ZXJmYWNlIExvZ3NNb2R1bGUge1xuICBDbG91ZFdhdGNoTG9nc0NsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU2RrQ2xpZW50O1xuICBGaWx0ZXJMb2dFdmVudHNDb21tYW5kOiBuZXcgKGlucHV0OiB7XG4gICAgbG9nR3JvdXBOYW1lOiBzdHJpbmc7IGxvZ1N0cmVhbU5hbWVzOiBzdHJpbmdbXTsgZmlsdGVyUGF0dGVybjogc3RyaW5nOyBsaW1pdDogbnVtYmVyO1xuICB9KSA9PiB1bmtub3duO1xufVxuXG50eXBlIExvYWRlciA9IDxUPihwa2c6IHN0cmluZykgPT4gUHJvbWlzZTxUPjtcbmxldCBsb2FkZXI6IExvYWRlciA9IGxvYWRTZGs7XG5jb25zdCBjbGllbnRzID0gbmV3IE1hcDxzdHJpbmcsIFNka0NsaWVudD4oKTtcblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IHN1YnN0aXR1dGUgdGhlIFNESyBsb2FkZXIgKGFuZCBkcm9wIGNhY2hlZCBjbGllbnRzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfc2V0RmFpbHVyZVJlYXNvbkxvYWRlckZvclRlc3RzKG5leHQ6IExvYWRlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBsb2FkZXIgPSBuZXh0ID8/IGxvYWRTZGs7XG4gIGNsaWVudHMuY2xlYXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xpZW50KGtpbmQ6ICdjb2RlYnVpbGQnIHwgJ2xvZ3MnLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8eyBjbGllbnQ6IFNka0NsaWVudDsgbW9kOiBDb2RlQnVpbGRNb2R1bGUgfCBMb2dzTW9kdWxlIH0+IHtcbiAgY29uc3QgbW9kID0ga2luZCA9PT0gJ2NvZGVidWlsZCdcbiAgICA/IGF3YWl0IGxvYWRlcjxDb2RlQnVpbGRNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtY29kZWJ1aWxkJylcbiAgICA6IGF3YWl0IGxvYWRlcjxMb2dzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LWNsb3Vkd2F0Y2gtbG9ncycpO1xuICBjb25zdCBrZXkgPSBgJHtraW5kfToke3JlZ2lvbn1gO1xuICBsZXQgYyA9IGNsaWVudHMuZ2V0KGtleSk7XG4gIGlmICghYykge1xuICAgIGMgPSBraW5kID09PSAnY29kZWJ1aWxkJ1xuICAgICAgPyBuZXcgKG1vZCBhcyBDb2RlQnVpbGRNb2R1bGUpLkNvZGVCdWlsZENsaWVudCh7IHJlZ2lvbiB9KVxuICAgICAgOiBuZXcgKG1vZCBhcyBMb2dzTW9kdWxlKS5DbG91ZFdhdGNoTG9nc0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzLnNldChrZXksIGMpO1xuICB9XG4gIHJldHVybiB7IGNsaWVudDogYywgbW9kIH07XG59XG5cbi8qKiBBIENvZGVCdWlsZCBidWlsZCBpZDogYDxwcm9qZWN0Pjo8dXVpZD5gLiAqL1xuY29uc3QgQlVJTERfSURfUkUgPSAvXltBLVphLXowLTldW0EtWmEtejAtOV8tXXsxLDI1NH06WzAtOWEtZi1dezM2fSQvO1xuXG4vKipcbiAqIFRoZSBidWlsZCBpZCBvZiBhIGZhaWxlZCBDb2RlQnVpbGQgYWN0aW9uLCBmcm9tIHRoZSBldmVudCBkZXRhaWw7IG51bGwgZm9yIGFcbiAqIG5vbi1Db2RlQnVpbGQgYWN0aW9uIG9yIGFuIGV2ZW50IHRoYXQgY2FycmllcyBubyBleHRlcm5hbCBleGVjdXRpb24gaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlQnVpbGRJZE9mKGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdHlwZSA9IGRldGFpbC50eXBlIGFzIHsgcHJvdmlkZXI/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlPy5wcm92aWRlciAhPT0gdW5kZWZpbmVkICYmIHR5cGUucHJvdmlkZXIgIT09ICdDb2RlQnVpbGQnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgeyAnZXh0ZXJuYWwtZXhlY3V0aW9uLWlkJz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaWQgPSByZXN1bHQ/LlsnZXh0ZXJuYWwtZXhlY3V0aW9uLWlkJ107XG4gIHJldHVybiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIEJVSUxEX0lEX1JFLnRlc3QoaWQpID8gaWQgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBjb21wdXRlIHNpemUgYSBmaW5pc2hlZCBDb2RlQnVpbGQgYWN0aW9uIHJhbiBvbiwgQVMgQVdTIFNQRUxMUyBJVFxuICogKGBCVUlMRF9HRU5FUkFMMV9NRURJVU1gKSwgb3IgbnVsbC5cbiAqXG4gKiBSZXR1cm5lZCByYXcgYW5kIG5hcnJvd2VkIHNlcnZlci1zaWRlIHJhdGhlciB0aGFuIGhlcmUsIGZvciBvbmUgaGFyZCByZWFzb246XG4gKiB0aGlzIExhbWJkYSBzaGlwcyBhcyBhIFNJTkdMRSBidW5kbGVkIGZpbGUsIGFuZCB0aGUgdm9jYWJ1bGFyeSBsaXZlcyBpbiB0aGVcbiAqIHBpcGVsaW5lLWNvcmUgYmFycmVsLCB3aGljaCBjYXJyaWVzIGR5bmFtaWMgaW1wb3J0cyB0aGF0IGJyZWFrIHRoYXQgY29uc3RyYWludFxuICogKGB0ZXN0L3NpbmdsZS1maWxlLWNvbnN0cmFpbnQudGVzdC50c2AgaXMgdGhlIGNoZWNrKS4gU2VuZGluZyB0aGUgcmF3IHN0cmluZ1xuICogYWxzbyBrZWVwcyB0aGUgc3RvcmVkIGBkZXRhaWwuY29tcHV0ZVR5cGVgIHRoZSBvYnNlcnZhdGlvbiByYXRoZXIgdGhhbiBhblxuICogaW50ZXJwcmV0YXRpb24gb2YgaXQuXG4gKlxuICogV0hZIElUIElTIFJFQUQgRlJPTSBBV1MgcmF0aGVyIHRoYW4gZnJvbSBvdXIgb3duIHN0b3JlZCBwaXBlbGluZSBjb25maWc6IHRoZVxuICogY29uZmlnIGhvbGRzIGEgc3RlcCdzIFJFUVVFU1RFRCBjb21wdXRlIHR5cGUsIGFuZCB3aGF0IHRoZSBidWlsZCBhY3R1YWxseSByYW5cbiAqIG9uIGlzIHdoYXQgY29uc3VtZWQgdkNQVSDigJQgYSBwaXBlbGluZSBlZGl0ZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIHRoZSBmaW5pc2hcbiAqIHdvdWxkIG90aGVyd2lzZSBiZSBwcmljZWQgYWdhaW5zdCB0aGUgbmV3IHZhbHVlLiBgQmF0Y2hHZXRCdWlsZHNgIGFuc3dlcnMgdGhlXG4gKiBhdXRob3JpdGF0aXZlIG9uZSwgYW5kIHRoaXMgTGFtYmRhIGFscmVhZHkgaG9sZHMgdGhhdCBwZXJtaXNzaW9uIGZvciB0aGVcbiAqIGZhaWx1cmUtcmVhc29uIHJlYWQgYmVsb3cuXG4gKlxuICogQmVzdC1lZmZvcnQsIGxpa2UgZXZlcnl0aGluZyBlbHNlIGhlcmU6IGEgdGhyb3R0bGUgb3IgYSBtaXNzaW5nIHBlcm1pc3Npb25cbiAqIHlpZWxkcyBudWxsLCB0aGUgZXZlbnQgZm9yd2FyZHMgd2l0aG91dCB0aGUgZmllbGQsIGFuZCB0aGUgaW5nZXN0IHJlY29yZHMgdGhhdFxuICogYWN0aW9uIGFzIHVubWVhc3VyZWQgcmF0aGVyIHRoYW4gYXMgZnJlZS4gQSBzaXplIHRoYXQgY2Fubm90IGJlIHJlYWQgbXVzdCBub3RcbiAqIGJlIGd1ZXNzZWQg4oCUIFNNQUxMIGlzIHRoZSBjaGVhcGVzdCBhbmQgdGhlcmVmb3JlIHRoZSBtb3N0IGZsYXR0ZXJpbmcgZ3Vlc3MuXG4gKlxuICogTk9UIGZvbGRlZCBpbnRvIHtAbGluayByZWFkU3ludGhGYWlsdXJlfSwgd2hpY2ggbWFrZXMgdGhlIHNhbWUgY2FsbDogdGhhdCBvbmVcbiAqIHJ1bnMgb24gRkFJTEVEIGFjdGlvbnMgb25seSwgdGhpcyBvbmUgb24gZXZlcnkgdGVybWluYWwgQ29kZUJ1aWxkIGFjdGlvbiwgYW5kXG4gKiBzaGFyaW5nIGEgY2FjaGUgYmV0d2VlbiB0aGVtIHdvdWxkIG1lYW4gaG9sZGluZyBidWlsZCByZWNvcmRzIGZvciB0aGUgd2hvbGVcbiAqIGJhdGNoIHRvIHNhdmUgb25lIGNhbGwgb24gdGhlIG1pbm9yaXR5IHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQnVpbGRDb21wdXRlKHJlZ2lvbjogc3RyaW5nLCBidWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjYiA9IGF3YWl0IGNsaWVudCgnY29kZWJ1aWxkJywgcmVnaW9uKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjYi5jbGllbnQuc2VuZChcbiAgICAgIG5ldyAoY2IubW9kIGFzIENvZGVCdWlsZE1vZHVsZSkuQmF0Y2hHZXRCdWlsZHNDb21tYW5kKHsgaWRzOiBbYnVpbGRJZF0gfSksXG4gICAgKSBhcyBCYXRjaEdldEJ1aWxkc091dHB1dDtcbiAgICByZXR1cm4gb3V0LmJ1aWxkcz8uWzBdPy5lbnZpcm9ubWVudD8uY29tcHV0ZVR5cGUgPz8gbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCByZWFkIHRoZSBidWlsZFxcJ3MgY29tcHV0ZSBzaXplIChmb3J3YXJkaW5nIHdpdGhvdXQgaXQpJywge1xuICAgICAgYnVpbGRJZCwgZXJyb3I6IFN0cmluZyhlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKiBGaW5kIHRoZSBgUEJfU1lOVEhfRkFJTFVSRWAgbGluZSBpbiBhIGZhaWxlZCBidWlsZCdzIGxvZywgb3IgbnVsbC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU3ludGhGYWlsdXJlKHJlZ2lvbjogc3RyaW5nLCBidWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPFN5bnRoRmFpbHVyZSB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjYiA9IGF3YWl0IGNsaWVudCgnY29kZWJ1aWxkJywgcmVnaW9uKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjYi5jbGllbnQuc2VuZChcbiAgICAgIG5ldyAoY2IubW9kIGFzIENvZGVCdWlsZE1vZHVsZSkuQmF0Y2hHZXRCdWlsZHNDb21tYW5kKHsgaWRzOiBbYnVpbGRJZF0gfSksXG4gICAgKSBhcyBCYXRjaEdldEJ1aWxkc091dHB1dDtcbiAgICBjb25zdCBsb2dzID0gb3V0LmJ1aWxkcz8uWzBdPy5sb2dzO1xuICAgIGlmICghbG9ncz8uZ3JvdXBOYW1lIHx8ICFsb2dzLnN0cmVhbU5hbWUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3cgPSBhd2FpdCBjbGllbnQoJ2xvZ3MnLCByZWdpb24pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN3LmNsaWVudC5zZW5kKG5ldyAoY3cubW9kIGFzIExvZ3NNb2R1bGUpLkZpbHRlckxvZ0V2ZW50c0NvbW1hbmQoe1xuICAgICAgbG9nR3JvdXBOYW1lOiBsb2dzLmdyb3VwTmFtZSxcbiAgICAgIGxvZ1N0cmVhbU5hbWVzOiBbbG9ncy5zdHJlYW1OYW1lXSxcbiAgICAgIGZpbHRlclBhdHRlcm46IGBcIiR7U1lOVEhfRkFJTFVSRV9NQVJLRVJ9XCJgLFxuICAgICAgbGltaXQ6IDUsXG4gICAgfSkpIGFzIHsgZXZlbnRzPzogQXJyYXk8eyBtZXNzYWdlPzogc3RyaW5nIH0+IH07XG4gICAgZm9yIChjb25zdCBldmVudCBvZiByZXMuZXZlbnRzID8/IFtdKSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gdHlwZW9mIGV2ZW50Lm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gcGFyc2VTeW50aEZhaWx1cmUoZXZlbnQubWVzc2FnZSkgOiBudWxsO1xuICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCByZWFkIHRoZSBmYWlsZWQgYnVpbGRcXCdzIHN0cnVjdHVyZWQgZmFpbHVyZSByZWFzb24gKGZvcndhcmRpbmcgd2l0aG91dCBpdCknLCB7XG4gICAgICBidWlsZElkLFxuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
package/lib/health.d.ts CHANGED
@@ -2,9 +2,10 @@
2
2
  * Throttled, best-effort post-success work: emit per-org ingest-health and self-heal
3
3
  * the DLQ. Never throws. `forwarded`/`lastEventAt` accumulate PER ORG across batches
4
4
  * between health posts; `dropped` is the shared fleet DLQ depth snapshot. A per-org
5
- * counter is zeroed only after that org's health POST is confirmed 2xx.
5
+ * counter is zeroed only after that org's health POST is confirmed 2xx. `requestId`
6
+ * is the batch's request id (see index.ts), sent as `X-Request-Id`.
6
7
  */
7
- export declare function reportHealthAndRedrive(baseUrl: string, mainQueueArn: string | undefined): Promise<void>;
8
+ export declare function reportHealthAndRedrive(baseUrl: string, mainQueueArn: string | undefined, requestId: string): Promise<void>;
8
9
  /** Count a forwarded batch toward each resolved org's delivery-health report. */
9
10
  export declare function recordForwarded(events: ReadonlyArray<{
10
11
  orgId: string | null;
package/lib/health.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { correlationHeaders } from '@pipeline-builder/pipeline-core/lib/core/audit-correlation.js';
3
4
  import { getAuthToken } from './auth.js';
4
- import { BoundedMap, CACHE_MAX_ENTRIES, fetchWithTimeout, loadSdk, log } from './util.js';
5
+ import { arnRef, BoundedMap, CACHE_MAX_ENTRIES, fetchWithTimeout, loadSdk, log } from './util.js';
5
6
  let sqsMod;
6
7
  let sqsClientsByRegion;
7
8
  async function sqsClient(region) {
@@ -78,12 +79,12 @@ async function startMoveTask(region, dlqArn, mainArn) {
78
79
  /** POST one org's ingest-health signal. Returns true only on a confirmed 2xx so the
79
80
  * caller resets that org's `forwarded` counter ONLY when the signal was accepted
80
81
  * (a dropped/failed POST must not silently zero the accumulated count). */
81
- async function postIngestHealth(baseUrl, body) {
82
+ async function postIngestHealth(baseUrl, body, requestId) {
82
83
  try {
83
84
  const token = await getAuthToken();
84
85
  const res = await fetchWithTimeout(`${baseUrl}/api/reports/ingest-health`, {
85
86
  method: 'POST',
86
- headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
87
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, ...correlationHeaders({ requestId }) },
87
88
  body: JSON.stringify(body),
88
89
  });
89
90
  if (!res.ok) {
@@ -101,9 +102,10 @@ async function postIngestHealth(baseUrl, body) {
101
102
  * Throttled, best-effort post-success work: emit per-org ingest-health and self-heal
102
103
  * the DLQ. Never throws. `forwarded`/`lastEventAt` accumulate PER ORG across batches
103
104
  * between health posts; `dropped` is the shared fleet DLQ depth snapshot. A per-org
104
- * counter is zeroed only after that org's health POST is confirmed 2xx.
105
+ * counter is zeroed only after that org's health POST is confirmed 2xx. `requestId`
106
+ * is the batch's request id (see index.ts), sent as `X-Request-Id`.
105
107
  */
106
- export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
108
+ export async function reportHealthAndRedrive(baseUrl, mainQueueArn, requestId) {
107
109
  const now = Date.now();
108
110
  if (now - lastHealthAt < HEALTH_THROTTLE_MS)
109
111
  return;
@@ -136,7 +138,7 @@ export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
136
138
  forwarded,
137
139
  dropped: depth,
138
140
  lastEventAt,
139
- });
141
+ }, requestId);
140
142
  // Reset the forwarded counter ONLY on a confirmed 2xx — a failed/dropped POST
141
143
  // keeps the count so the next tick re-reports it instead of losing it.
142
144
  if (ok)
@@ -147,7 +149,7 @@ export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
147
149
  // past the ceiling — that message keeps failing and would loop DLQ→main→DLQ.
148
150
  if (oldestAgeSec > MAX_DLQ_REDRIVE_AGE_SEC) {
149
151
  log.warn('DLQ oldest message exceeds poison-age ceiling — skipping redrive (needs manual attention)', {
150
- dlqArn: q.dlqArn, dropped: depth, oldestAgeSec, ceilingSec: MAX_DLQ_REDRIVE_AGE_SEC,
152
+ dlq: arnRef(q.dlqArn), dropped: depth, oldestAgeSec, ceilingSec: MAX_DLQ_REDRIVE_AGE_SEC,
151
153
  });
152
154
  }
153
155
  else {
@@ -155,7 +157,7 @@ export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
155
157
  if (!(await hasActiveMoveTask(q.region, q.dlqArn))) {
156
158
  lastRedriveAt = now;
157
159
  await startMoveTask(q.region, q.dlqArn, q.mainArn);
158
- log.info('Started self-healing DLQ→main redrive', { dlqArn: q.dlqArn, dropped: depth, oldestAgeSec });
160
+ log.info('Started self-healing DLQ→main redrive', { dlq: arnRef(q.dlqArn), dropped: depth, oldestAgeSec });
159
161
  }
160
162
  }
161
163
  catch (err) {
@@ -188,4 +190,4 @@ export function _resetHealthForTests() {
188
190
  lastHealthAt = 0;
189
191
  lastRedriveAt = 0;
190
192
  }
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBeUIxRixJQUFJLE1BQTZCLENBQUM7QUFDbEMsSUFBSSxrQkFBMEQsQ0FBQztBQUMvRCxLQUFLLFVBQVUsU0FBUyxDQUFDLE1BQWM7SUFDckMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQVkscUJBQXFCLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsa0JBQWtCO1FBQUUsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixrRkFBa0Y7QUFDbEYsbUZBQW1GO0FBQ25GLG9GQUFvRjtBQUNwRixzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxVQUFVLENBQWlCLGlCQUFpQixDQUFDLENBQUM7QUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBaUIsaUJBQWlCLENBQUMsQ0FBQztBQUMzRSxJQUFJLFlBQVksR0FB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Q3ZILEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4QyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUk7Z0JBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNqQixhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZ2V0QXV0aFRva2VuIH0gZnJvbSAnLi9hdXRoLmpzJztcbmltcG9ydCB7IEJvdW5kZWRNYXAsIENBQ0hFX01BWF9FTlRSSUVTLCBmZXRjaFdpdGhUaW1lb3V0LCBsb2FkU2RrLCBsb2cgfSBmcm9tICcuL3V0aWwuanMnO1xuXG4vLyBEZWxpdmVyeSBoZWFsdGggKyBzZWxmLWhlYWxpbmcgRExRIHJlZHJpdmUuXG4vLyBBZnRlciBhIFNVQ0NFU1NGVUwgYmF0Y2ggUE9TVCB3ZSAodGhyb3R0bGVkLCBiZXN0LWVmZm9ydCk6XG4vLyAgIDEuIFBPU1QgYW4gaW5nZXN0LWhlYWx0aCBzaWduYWwgdG8gL2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGggc28gdGhlIFJlcG9ydHMgVUlcbi8vICAgICAgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuXG4vLyAgIDIuIElmIHRoZSBETFEgaXMgbm9uLWVtcHR5LCBubyBtb3ZlIHRhc2sgaXMgYWxyZWFkeSBydW5uaW5nLCBBTkQgdGhlIG9sZGVzdCBETFFcbi8vICAgICAgbWVzc2FnZSBpcyB5b3VuZ2VyIHRoYW4gdGhlIHBvaXNvbi1hZ2UgY2VpbGluZywga2ljayBvZmYgYW4gU1FTXG4vLyAgICAgIE1lc3NhZ2VNb3ZlVGFzayAoRExRIOKGkiBtYWluIHF1ZXVlKSBzbyByZXRyeWFibGUgZmFpbHVyZXMgc2VsZi1oZWFsIHdpdGhvdXQgYVxuLy8gICAgICBuZXcgQVdTIHNlcnZpY2UuIFRoZSByZXBvcnRpbmcgaW5nZXN0J3MgcGFydGlhbC11bmlxdWUgaW5kZXggZGVkdXBlcyBhbnlcbi8vICAgICAgcmVkZWxpdmVyZWQgZXZlbnQsIHNvIGEgcmVkcml2ZSBjYW4ndCBkb3VibGUtY291bnQuXG4vLyBHdWFyZHM6IG9ubHkgb24gc3VjY2Vzcywgb25lLWF0LWEtdGltZSAoTGlzdE1lc3NhZ2VNb3ZlVGFza3MpLCBhIHBvaXNvbi1hZ2UgY2VpbGluZ1xuLy8gKHNvIGEgbWVzc2FnZSB0aGF0IGFsd2F5cyBmYWlscyBjYW4ndCBsb29wIERMUeKGkm1haW7ihpJETFEgZm9yZXZlciksIGFuZCB0aHJvdHRsZWQgdmlhXG4vLyBtb2R1bGUgdGltZXN0YW1wcy4gTkVWRVIgdGhyb3dzIOKAlCBhIGZhaWx1cmUgaGVyZSBtdXN0IG5vdCBmYWlsIHRoZSBiYXRjaC5cbi8vXG4vLyBJQU0gcmVxdWlyZWQgKGRvY3VtZW50IG9ubHkg4oCUIGdyYW50ZWQgb24gdGhlIGV2ZW50cyBzdGFjayk6XG4vLyAgIHNxczpHZXRRdWV1ZUF0dHJpYnV0ZXMsIHNxczpMaXN0TWVzc2FnZU1vdmVUYXNrcywgc3FzOlN0YXJ0TWVzc2FnZU1vdmVUYXNrIChvbiB0aGUgRExRKVxuXG5pbnRlcmZhY2UgU3FzQ2xpZW50TGlrZSB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfVxuaW50ZXJmYWNlIFNxc01vZHVsZSB7XG4gIFNRU0NsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU3FzQ2xpZW50TGlrZTtcbiAgR2V0UXVldWVBdHRyaWJ1dGVzQ29tbWFuZDogbmV3IChpbnB1dDogeyBRdWV1ZVVybDogc3RyaW5nOyBBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10gfSkgPT4gdW5rbm93bjtcbiAgTGlzdE1lc3NhZ2VNb3ZlVGFza3NDb21tYW5kOiBuZXcgKGlucHV0OiB7IFNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG4gIFN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZDogbmV3IChpbnB1dDogeyBTb3VyY2VBcm46IHN0cmluZzsgRGVzdGluYXRpb25Bcm4/OiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbn1cbmxldCBzcXNNb2Q6IFNxc01vZHVsZSB8IHVuZGVmaW5lZDtcbmxldCBzcXNDbGllbnRzQnlSZWdpb246IE1hcDxzdHJpbmcsIFNxc0NsaWVudExpa2U+IHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gc3FzQ2xpZW50KHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxTcXNDbGllbnRMaWtlPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgaWYgKCFzcXNDbGllbnRzQnlSZWdpb24pIHNxc0NsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXAoKTtcbiAgbGV0IGNsaWVudCA9IHNxc0NsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBuZXcgc3FzTW9kLlNRU0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBzcXNDbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vLyBEZWxpdmVyeS1oZWFsdGggY291bnRlcnMgYXJlIGF0dHJpYnV0ZWQgUEVSIFJFU09MVkVEIE9SRyAodGhlIGZvcndhcmRlciBpcyBhIGZsZWV0XG4vLyBMYW1iZGEgc2VydmluZyBtYW55IG9yZ3M7IGEgc2luZ2xlIGdsb2JhbCBjb3VudGVyIHdvdWxkIG1pcy1hdHRyaWJ1dGUgb25lIG9yZydzXG4vLyB0aHJvdWdocHV0IHRvIGFub3RoZXIpLiBLZXllZCBieSBvcmdJZCAoJycgYnVja2V0ID0gcGlwZWxpbmUgd2l0aCBubyBPcmdJZCB0YWcpLlxuLy8gVGhlIERMUSBkZXB0aCAoYGRyb3BwZWRgKSBpcyBnZW51aW5lbHkgZmxlZXQtZ2xvYmFsIOKAlCBvbmUgc2hhcmVkIERMUSDigJQgc28gaXQgaXMgYVxuLy8gc2luZ2xlIHNuYXBzaG90IHBvc3RlZCBhbG9uZ3NpZGUgZWFjaCBvcmcncyBoZWFsdGgsIGRvY3VtZW50ZWQgYXMgdGhlIHNoYXJlZCBkZXB0aC5cbmNvbnN0IGZvcndhcmRlZEJ5T3JnID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCBudW1iZXI+KENBQ0hFX01BWF9FTlRSSUVTKTtcbmNvbnN0IGxhc3RFdmVudEF0QnlPcmcgPSBuZXcgQm91bmRlZE1hcDxzdHJpbmcsIHN0cmluZz4oQ0FDSEVfTUFYX0VOVFJJRVMpO1xubGV0IGxhc3RIZWFsdGhBdCA9IDA7XG5sZXQgbGFzdFJlZHJpdmVBdCA9IDA7XG5jb25zdCBIRUFMVEhfVEhST1RUTEVfTVMgPSA2MCAqIDEwMDA7XG5jb25zdCBSRURSSVZFX1RIUk9UVExFX01TID0gNSAqIDYwICogMTAwMDtcbi8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IGlmIHRoZSBvbGRlc3QgRExRIG1lc3NhZ2UgaXMgb2xkZXIgdGhhbiB0aGlzLCB3ZSBTVE9QXG4vLyByZWRyaXZpbmcgaXQgKERMUeKGkm1haW7ihpJmYWls4oaSRExRIHdvdWxkIGxvb3AgZm9yZXZlcikuIFN1Y2ggbWVzc2FnZXMgYXJlIGxlZnQgZm9yIGFuXG4vLyBhbGFybSAvIG1hbnVhbCBpbnNwZWN0aW9uIGluc3RlYWQgb2YgY2h1cm5pbmcgdGhlIGZsZWV0IGluZGVmaW5pdGVseS5cbmNvbnN0IE1BWF9ETFFfUkVEUklWRV9BR0VfU0VDID0gNiAqIDYwICogNjA7IC8vIDYgaG91cnNcblxuLyoqIFBhcnNlIHRoZSBTUVMgdHJpZ2dlciBBUk4gYW5kIGRlcml2ZSB0aGUgbWFpbiArIERMUSBBUk5zIGFuZCB0aGUgRExRIFVSTC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVF1ZXVlcyhtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcmVnaW9uOiBzdHJpbmc7IG1haW5Bcm46IHN0cmluZzsgZGxxQXJuOiBzdHJpbmc7IGRscVVybDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIW1haW5RdWV1ZUFybikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gYXJuOmF3czpzcXM6e3JlZ2lvbn06e2FjY291bnR9OntuYW1lfVxuICBjb25zdCBwYXJ0cyA9IG1haW5RdWV1ZUFybi5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgNiB8fCBwYXJ0c1syXSAhPT0gJ3NxcycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFssICwgLCByZWdpb24sIGFjY291bnQsIG5hbWVdID0gcGFydHM7XG4gIGNvbnN0IGRscUFybiA9IHByb2Nlc3MuZW52LkVWRU5UX0RMUV9BUk4gfHwgYGFybjphd3M6c3FzOiR7cmVnaW9ufToke2FjY291bnR9OiR7bmFtZX0tZGxxYDtcbiAgY29uc3QgZGxxTmFtZSA9IGRscUFybi5zcGxpdCgnOicpLnBvcCgpID8/IGAke25hbWV9LWRscWA7XG4gIGNvbnN0IGRscVVybCA9IGBodHRwczovL3Nxcy4ke3JlZ2lvbn0uYW1hem9uYXdzLmNvbS8ke2FjY291bnR9LyR7ZGxxTmFtZX1gO1xuICByZXR1cm4geyByZWdpb24sIG1haW5Bcm46IG1haW5RdWV1ZUFybiwgZGxxQXJuLCBkbHFVcmwgfTtcbn1cblxuLyoqIFNuYXBzaG90IHRoZSBETFEgZGVwdGggKyB0aGUgYWdlIChzZWNvbmRzKSBvZiBpdHMgb2xkZXN0IG1lc3NhZ2UgKGZvciB0aGVcbiAqICBwb2lzb24tbWVzc2FnZSByZWRyaXZlIGNlaWxpbmcpLiBNaXNzaW5nL05hTiBhdHRyaWJ1dGVzIGZhbGwgYmFjayB0byAwLiAqL1xuYXN5bmMgZnVuY3Rpb24gZGxxU3RhdHMocmVnaW9uOiBzdHJpbmcsIGRscVVybDogc3RyaW5nKTogUHJvbWlzZTx7IGRlcHRoOiBudW1iZXI7IG9sZGVzdEFnZVNlYzogbnVtYmVyIH0+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5HZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kKHtcbiAgICBRdWV1ZVVybDogZGxxVXJsLFxuICAgIEF0dHJpYnV0ZU5hbWVzOiBbJ0FwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcycsICdBcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZSddLFxuICB9KSkgYXMgeyBBdHRyaWJ1dGVzPzogeyBBcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXM/OiBzdHJpbmc7IEFwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlPzogc3RyaW5nIH0gfTtcbiAgY29uc3QgbiA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzID8/ICcwJyk7XG4gIGNvbnN0IGFnZSA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2UgPz8gJzAnKTtcbiAgcmV0dXJuIHtcbiAgICBkZXB0aDogTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDAsXG4gICAgb2xkZXN0QWdlU2VjOiBOdW1iZXIuaXNGaW5pdGUoYWdlKSA/IGFnZSA6IDAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FjdGl2ZU1vdmVUYXNrKHJlZ2lvbjogc3RyaW5nLCBkbHFBcm46IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLkxpc3RNZXNzYWdlTW92ZVRhc2tzQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuIH0pKSBhcyB7XG4gICAgUmVzdWx0cz86IEFycmF5PHsgU3RhdHVzPzogc3RyaW5nIH0+O1xuICB9O1xuICByZXR1cm4gKG91dC5SZXN1bHRzID8/IFtdKS5zb21lKHQgPT4gdC5TdGF0dXMgPT09ICdSVU5OSU5HJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TW92ZVRhc2socmVnaW9uOiBzdHJpbmcsIGRscUFybjogc3RyaW5nLCBtYWluQXJuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5TdGFydE1lc3NhZ2VNb3ZlVGFza0NvbW1hbmQoeyBTb3VyY2VBcm46IGRscUFybiwgRGVzdGluYXRpb25Bcm46IG1haW5Bcm4gfSkpO1xufVxuXG4vKiogUE9TVCBvbmUgb3JnJ3MgaW5nZXN0LWhlYWx0aCBzaWduYWwuIFJldHVybnMgdHJ1ZSBvbmx5IG9uIGEgY29uZmlybWVkIDJ4eCBzbyB0aGVcbiAqICBjYWxsZXIgcmVzZXRzIHRoYXQgb3JnJ3MgYGZvcndhcmRlZGAgY291bnRlciBPTkxZIHdoZW4gdGhlIHNpZ25hbCB3YXMgYWNjZXB0ZWRcbiAqICAoYSBkcm9wcGVkL2ZhaWxlZCBQT1NUIG11c3Qgbm90IHNpbGVudGx5IHplcm8gdGhlIGFjY3VtdWxhdGVkIGNvdW50KS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RJbmdlc3RIZWFsdGgoYmFzZVVybDogc3RyaW5nLCBib2R5OiB7IG9yZ0lkPzogc3RyaW5nOyBmb3J3YXJkZWQ6IG51bWJlcjsgZHJvcHBlZDogbnVtYmVyOyBsYXN0RXZlbnRBdD86IHN0cmluZyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBdXRoVG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGxvZy53YXJuKCdpbmdlc3QtaGVhbHRoIFBPU1QgcmV0dXJuZWQgbm9uLTJ4eCAoaWdub3JlZCknLCB7IHN0YXR1czogcmVzLnN0YXR1cywgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignaW5nZXN0LWhlYWx0aCBQT1NUIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSwgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3R0bGVkLCBiZXN0LWVmZm9ydCBwb3N0LXN1Y2Nlc3Mgd29yazogZW1pdCBwZXItb3JnIGluZ2VzdC1oZWFsdGggYW5kIHNlbGYtaGVhbFxuICogdGhlIERMUS4gTmV2ZXIgdGhyb3dzLiBgZm9yd2FyZGVkYC9gbGFzdEV2ZW50QXRgIGFjY3VtdWxhdGUgUEVSIE9SRyBhY3Jvc3MgYmF0Y2hlc1xuICogYmV0d2VlbiBoZWFsdGggcG9zdHM7IGBkcm9wcGVkYCBpcyB0aGUgc2hhcmVkIGZsZWV0IERMUSBkZXB0aCBzbmFwc2hvdC4gQSBwZXItb3JnXG4gKiBjb3VudGVyIGlzIHplcm9lZCBvbmx5IGFmdGVyIHRoYXQgb3JnJ3MgaGVhbHRoIFBPU1QgaXMgY29uZmlybWVkIDJ4eC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcG9ydEhlYWx0aEFuZFJlZHJpdmUoYmFzZVVybDogc3RyaW5nLCBtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAobm93IC0gbGFzdEhlYWx0aEF0IDwgSEVBTFRIX1RIUk9UVExFX01TKSByZXR1cm47XG4gIGxhc3RIZWFsdGhBdCA9IG5vdztcbiAgdHJ5IHtcbiAgICBjb25zdCBxID0gZGVyaXZlUXVldWVzKG1haW5RdWV1ZUFybik7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgb2xkZXN0QWdlU2VjID0gMDtcbiAgICBpZiAocSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBkbHFTdGF0cyhxLnJlZ2lvbiwgcS5kbHFVcmwpO1xuICAgICAgICBkZXB0aCA9IHN0YXRzLmRlcHRoO1xuICAgICAgICBvbGRlc3RBZ2VTZWMgPSBzdGF0cy5vbGRlc3RBZ2VTZWM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBzdGF0cyBjaGVjayBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUG9zdCBvbmUgaGVhbHRoIHNpZ25hbCBwZXIgcmVzb2x2ZWQgb3JnLCBhdHRyaWJ1dGluZyBpdHMgb3duIGZvcndhcmRlZCBjb3VudCArXG4gICAgLy8gbGFzdCBldmVudCB0aW1lLiBgZHJvcHBlZGAgKHRoZSBzaGFyZWQgZmxlZXQgRExRIGRlcHRoKSByaWRlcyBhbG9uZyBvbiBlYWNoLlxuICAgIC8vIFNuYXBzaG90IHRoZSBrZXlzIGZpcnN0IHNvIHdlIGRvbid0IG11dGF0ZSB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZy5cbiAgICBjb25zdCBvcmdLZXlzID0gbmV3IFNldChbLi4uZm9yd2FyZGVkQnlPcmcua2V5cygpLCAuLi5sYXN0RXZlbnRBdEJ5T3JnLmtleXMoKV0pO1xuICAgIGlmIChvcmdLZXlzLnNpemUgPT09IDApIG9yZ0tleXMuYWRkKCcnKTsgLy8gbm90aGluZyBmb3J3YXJkZWQgeWV0IOKGkiBzdGlsbCByZXBvcnQgZGVwdGhcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmdLZXlzKSB7XG4gICAgICBjb25zdCBmb3J3YXJkZWQgPSBmb3J3YXJkZWRCeU9yZy5nZXQoa2V5KSA/PyAwO1xuICAgICAgY29uc3QgbGFzdEV2ZW50QXQgPSBsYXN0RXZlbnRBdEJ5T3JnLmdldChrZXkpO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCBwb3N0SW5nZXN0SGVhbHRoKGJhc2VVcmwsIHtcbiAgICAgICAgLi4uKGtleSA/IHsgb3JnSWQ6IGtleSB9IDoge30pLFxuICAgICAgICBmb3J3YXJkZWQsXG4gICAgICAgIGRyb3BwZWQ6IGRlcHRoLFxuICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgIH0pO1xuICAgICAgLy8gUmVzZXQgdGhlIGZvcndhcmRlZCBjb3VudGVyIE9OTFkgb24gYSBjb25maXJtZWQgMnh4IOKAlCBhIGZhaWxlZC9kcm9wcGVkIFBPU1RcbiAgICAgIC8vIGtlZXBzIHRoZSBjb3VudCBzbyB0aGUgbmV4dCB0aWNrIHJlLXJlcG9ydHMgaXQgaW5zdGVhZCBvZiBsb3NpbmcgaXQuXG4gICAgICBpZiAob2spIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIDApO1xuICAgIH1cblxuICAgIGlmIChxICYmIGRlcHRoID4gMCAmJiBub3cgLSBsYXN0UmVkcml2ZUF0ID49IFJFRFJJVkVfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IG5ldmVyIHJlZHJpdmUgYSBETFEgd2hvc2Ugb2xkZXN0IG1lc3NhZ2UgaGFzIGFnZWRcbiAgICAgIC8vIHBhc3QgdGhlIGNlaWxpbmcg4oCUIHRoYXQgbWVzc2FnZSBrZWVwcyBmYWlsaW5nIGFuZCB3b3VsZCBsb29wIERMUeKGkm1haW7ihpJETFEuXG4gICAgICBpZiAob2xkZXN0QWdlU2VjID4gTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBvbGRlc3QgbWVzc2FnZSBleGNlZWRzIHBvaXNvbi1hZ2UgY2VpbGluZyDigJQgc2tpcHBpbmcgcmVkcml2ZSAobmVlZHMgbWFudWFsIGF0dGVudGlvbiknLCB7XG4gICAgICAgICAgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYywgY2VpbGluZ1NlYzogTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhd2FpdCBoYXNBY3RpdmVNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4pKSkge1xuICAgICAgICAgICAgbGFzdFJlZHJpdmVBdCA9IG5vdztcbiAgICAgICAgICAgIGF3YWl0IHN0YXJ0TW92ZVRhc2socS5yZWdpb24sIHEuZGxxQXJuLCBxLm1haW5Bcm4pO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1N0YXJ0ZWQgc2VsZi1oZWFsaW5nIERMUeKGkm1haW4gcmVkcml2ZScsIHsgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy53YXJuKCdETFEgcmVkcml2ZSBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdoZWFsdGgvcmVkcml2ZSBzdGVwIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgfVxufVxuXG4vKiogQ291bnQgYSBmb3J3YXJkZWQgYmF0Y2ggdG93YXJkIGVhY2ggcmVzb2x2ZWQgb3JnJ3MgZGVsaXZlcnktaGVhbHRoIHJlcG9ydC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRGb3J3YXJkZWQoZXZlbnRzOiBSZWFkb25seUFycmF5PHsgb3JnSWQ6IHN0cmluZyB8IG51bGw7IGNvbXBsZXRlZEF0Pzogc3RyaW5nOyBzdGFydGVkQXQ/OiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGNvbnN0IGtleSA9IGUub3JnSWQgPz8gJyc7XG4gICAgZm9yd2FyZGVkQnlPcmcuc2V0KGtleSwgKGZvcndhcmRlZEJ5T3JnLmdldChrZXkpID8/IDApICsgMSk7XG4gICAgY29uc3QgYXQgPSBlLmNvbXBsZXRlZEF0IHx8IGUuc3RhcnRlZEF0O1xuICAgIGlmIChhdCkge1xuICAgICAgY29uc3QgcHJldiA9IGxhc3RFdmVudEF0QnlPcmcuZ2V0KGtleSk7XG4gICAgICBpZiAoIXByZXYgfHwgYXQgPiBwcmV2KSBsYXN0RXZlbnRBdEJ5T3JnLnNldChrZXksIGF0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IGZvcmdldCBoZWFsdGggY291bnRlcnMgYW5kIHRocm90dGxlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRIZWFsdGhGb3JUZXN0cygpOiB2b2lkIHtcbiAgZm9yd2FyZGVkQnlPcmcuY2xlYXIoKTtcbiAgbGFzdEV2ZW50QXRCeU9yZy5jbGVhcigpO1xuICBsYXN0SGVhbHRoQXQgPSAwO1xuICBsYXN0UmVkcml2ZUF0ID0gMDtcbn1cbiJdfQ==
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlCbEcsSUFBSSxNQUE2QixDQUFDO0FBQ2xDLElBQUksa0JBQTBELENBQUM7QUFDL0QsS0FBSyxVQUFVLFNBQVMsQ0FBQyxNQUFjO0lBQ3JDLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFZLHFCQUFxQixDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDLGtCQUFrQjtRQUFFLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDeEQsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxxRkFBcUY7QUFDckYsa0ZBQWtGO0FBQ2xGLG1GQUFtRjtBQUNuRixvRkFBb0Y7QUFDcEYsc0ZBQXNGO0FBQ3RGLE1BQU0sY0FBYyxHQUFHLElBQUksVUFBVSxDQUFpQixpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sZ0JBQWdCLEdB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LENBQUM7UUFDYixHQUFHLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztBQUNILENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUF5RjtJQUN2SCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFCLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDeEMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJO2dCQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsYUFBYSxHQUFHLENBQUMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNvcnJlbGF0aW9uSGVhZGVycyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUvbGliL2NvcmUvYXVkaXQtY29ycmVsYXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0QXV0aFRva2VuIH0gZnJvbSAnLi9hdXRoLmpzJztcbmltcG9ydCB7IGFyblJlZiwgQm91bmRlZE1hcCwgQ0FDSEVfTUFYX0VOVFJJRVMsIGZldGNoV2l0aFRpbWVvdXQsIGxvYWRTZGssIGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIERlbGl2ZXJ5IGhlYWx0aCArIHNlbGYtaGVhbGluZyBETFEgcmVkcml2ZS5cbi8vIEFmdGVyIGEgU1VDQ0VTU0ZVTCBiYXRjaCBQT1NUIHdlICh0aHJvdHRsZWQsIGJlc3QtZWZmb3J0KTpcbi8vICAgMS4gUE9TVCBhbiBpbmdlc3QtaGVhbHRoIHNpZ25hbCB0byAvYXBpL3JlcG9ydHMvaW5nZXN0LWhlYWx0aCBzbyB0aGUgUmVwb3J0cyBVSVxuLy8gICAgICBjYW4gc2hvdyBmbG93aW5nIC8gc3RhbGUgLyBkcm9wcGluZy5cbi8vICAgMi4gSWYgdGhlIERMUSBpcyBub24tZW1wdHksIG5vIG1vdmUgdGFzayBpcyBhbHJlYWR5IHJ1bm5pbmcsIEFORCB0aGUgb2xkZXN0IERMUVxuLy8gICAgICBtZXNzYWdlIGlzIHlvdW5nZXIgdGhhbiB0aGUgcG9pc29uLWFnZSBjZWlsaW5nLCBraWNrIG9mZiBhbiBTUVNcbi8vICAgICAgTWVzc2FnZU1vdmVUYXNrIChETFEg4oaSIG1haW4gcXVldWUpIHNvIHJldHJ5YWJsZSBmYWlsdXJlcyBzZWxmLWhlYWwgd2l0aG91dCBhXG4vLyAgICAgIG5ldyBBV1Mgc2VydmljZS4gVGhlIHJlcG9ydGluZyBpbmdlc3QncyBwYXJ0aWFsLXVuaXF1ZSBpbmRleCBkZWR1cGVzIGFueVxuLy8gICAgICByZWRlbGl2ZXJlZCBldmVudCwgc28gYSByZWRyaXZlIGNhbid0IGRvdWJsZS1jb3VudC5cbi8vIEd1YXJkczogb25seSBvbiBzdWNjZXNzLCBvbmUtYXQtYS10aW1lIChMaXN0TWVzc2FnZU1vdmVUYXNrcyksIGEgcG9pc29uLWFnZSBjZWlsaW5nXG4vLyAoc28gYSBtZXNzYWdlIHRoYXQgYWx3YXlzIGZhaWxzIGNhbid0IGxvb3AgRExR4oaSbWFpbuKGkkRMUSBmb3JldmVyKSwgYW5kIHRocm90dGxlZCB2aWFcbi8vIG1vZHVsZSB0aW1lc3RhbXBzLiBORVZFUiB0aHJvd3Mg4oCUIGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIGJhdGNoLlxuLy9cbi8vIElBTSByZXF1aXJlZCAoZG9jdW1lbnQgb25seSDigJQgZ3JhbnRlZCBvbiB0aGUgZXZlbnRzIHN0YWNrKTpcbi8vICAgc3FzOkdldFF1ZXVlQXR0cmlidXRlcywgc3FzOkxpc3RNZXNzYWdlTW92ZVRhc2tzLCBzcXM6U3RhcnRNZXNzYWdlTW92ZVRhc2sgKG9uIHRoZSBETFEpXG5cbmludGVyZmFjZSBTcXNDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB9XG5pbnRlcmZhY2UgU3FzTW9kdWxlIHtcbiAgU1FTQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBTcXNDbGllbnRMaWtlO1xuICBHZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kOiBuZXcgKGlucHV0OiB7IFF1ZXVlVXJsOiBzdHJpbmc7IEF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSB9KSA9PiB1bmtub3duO1xuICBMaXN0TWVzc2FnZU1vdmVUYXNrc0NvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgU291cmNlQXJuOiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbiAgU3RhcnRNZXNzYWdlTW92ZVRhc2tDb21tYW5kOiBuZXcgKGlucHV0OiB7IFNvdXJjZUFybjogc3RyaW5nOyBEZXN0aW5hdGlvbkFybj86IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IHNxc01vZDogU3FzTW9kdWxlIHwgdW5kZWZpbmVkO1xubGV0IHNxc0NsaWVudHNCeVJlZ2lvbjogTWFwPHN0cmluZywgU3FzQ2xpZW50TGlrZT4gfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBzcXNDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPFNxc0NsaWVudExpa2U+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBpZiAoIXNxc0NsaWVudHNCeVJlZ2lvbikgc3FzQ2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcCgpO1xuICBsZXQgY2xpZW50ID0gc3FzQ2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNsaWVudCA9IG5ldyBzcXNNb2QuU1FTQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHNxc0NsaWVudHNCeVJlZ2lvbi5zZXQocmVnaW9uLCBjbGllbnQpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8vIERlbGl2ZXJ5LWhlYWx0aCBjb3VudGVycyBhcmUgYXR0cmlidXRlZCBQRVIgUkVTT0xWRUQgT1JHICh0aGUgZm9yd2FyZGVyIGlzIGEgZmxlZXRcbi8vIExhbWJkYSBzZXJ2aW5nIG1hbnkgb3JnczsgYSBzaW5nbGUgZ2xvYmFsIGNvdW50ZXIgd291bGQgbWlzLWF0dHJpYnV0ZSBvbmUgb3JnJ3Ncbi8vIHRocm91Z2hwdXQgdG8gYW5vdGhlcikuIEtleWVkIGJ5IG9yZ0lkICgnJyBidWNrZXQgPSBwaXBlbGluZSB3aXRoIG5vIE9yZ0lkIHRhZykuXG4vLyBUaGUgRExRIGRlcHRoIChgZHJvcHBlZGApIGlzIGdlbnVpbmVseSBmbGVldC1nbG9iYWwg4oCUIG9uZSBzaGFyZWQgRExRIOKAlCBzbyBpdCBpcyBhXG4vLyBzaW5nbGUgc25hcHNob3QgcG9zdGVkIGFsb25nc2lkZSBlYWNoIG9yZydzIGhlYWx0aCwgZG9jdW1lbnRlZCBhcyB0aGUgc2hhcmVkIGRlcHRoLlxuY29uc3QgZm9yd2FyZGVkQnlPcmcgPSBuZXcgQm91bmRlZE1hcDxzdHJpbmcsIG51bWJlcj4oQ0FDSEVfTUFYX0VOVFJJRVMpO1xuY29uc3QgbGFzdEV2ZW50QXRCeU9yZyA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgc3RyaW5nPihDQUNIRV9NQVhfRU5UUklFUyk7XG5sZXQgbGFzdEhlYWx0aEF0ID0gMDtcbmxldCBsYXN0UmVkcml2ZUF0ID0gMDtcbmNvbnN0IEhFQUxUSF9USFJPVFRMRV9NUyA9IDYwICogMTAwMDtcbmNvbnN0IFJFRFJJVkVfVEhST1RUTEVfTVMgPSA1ICogNjAgKiAxMDAwO1xuLy8gUG9pc29uLW1lc3NhZ2UgY2VpbGluZzogaWYgdGhlIG9sZGVzdCBETFEgbWVzc2FnZSBpcyBvbGRlciB0aGFuIHRoaXMsIHdlIFNUT1Bcbi8vIHJlZHJpdmluZyBpdCAoRExR4oaSbWFpbuKGkmZhaWzihpJETFEgd291bGQgbG9vcCBmb3JldmVyKS4gU3VjaCBtZXNzYWdlcyBhcmUgbGVmdCBmb3IgYW5cbi8vIGFsYXJtIC8gbWFudWFsIGluc3BlY3Rpb24gaW5zdGVhZCBvZiBjaHVybmluZyB0aGUgZmxlZXQgaW5kZWZpbml0ZWx5LlxuY29uc3QgTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMgPSA2ICogNjAgKiA2MDsgLy8gNiBob3Vyc1xuXG4vKiogUGFyc2UgdGhlIFNRUyB0cmlnZ2VyIEFSTiBhbmQgZGVyaXZlIHRoZSBtYWluICsgRExRIEFSTnMgYW5kIHRoZSBETFEgVVJMLiAqL1xuZnVuY3Rpb24gZGVyaXZlUXVldWVzKG1haW5RdWV1ZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyByZWdpb246IHN0cmluZzsgbWFpbkFybjogc3RyaW5nOyBkbHFBcm46IHN0cmluZzsgZGxxVXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGlmICghbWFpblF1ZXVlQXJuKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBhcm46YXdzOnNxczp7cmVnaW9ufTp7YWNjb3VudH06e25hbWV9XG4gIGNvbnN0IHBhcnRzID0gbWFpblF1ZXVlQXJuLnNwbGl0KCc6Jyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPCA2IHx8IHBhcnRzWzJdICE9PSAnc3FzJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgWywgLCAsIHJlZ2lvbiwgYWNjb3VudCwgbmFtZV0gPSBwYXJ0cztcbiAgY29uc3QgZGxxQXJuID0gcHJvY2Vzcy5lbnYuRVZFTlRfRExRX0FSTiB8fCBgYXJuOmF3czpzcXM6JHtyZWdpb259OiR7YWNjb3VudH06JHtuYW1lfS1kbHFgO1xuICBjb25zdCBkbHFOYW1lID0gZGxxQXJuLnNwbGl0KCc6JykucG9wKCkgPz8gYCR7bmFtZX0tZGxxYDtcbiAgY29uc3QgZGxxVXJsID0gYGh0dHBzOi8vc3FzLiR7cmVnaW9ufS5hbWF6b25hd3MuY29tLyR7YWNjb3VudH0vJHtkbHFOYW1lfWA7XG4gIHJldHVybiB7IHJlZ2lvbiwgbWFpbkFybjogbWFpblF1ZXVlQXJuLCBkbHFBcm4sIGRscVVybCB9O1xufVxuXG4vKiogU25hcHNob3QgdGhlIERMUSBkZXB0aCArIHRoZSBhZ2UgKHNlY29uZHMpIG9mIGl0cyBvbGRlc3QgbWVzc2FnZSAoZm9yIHRoZVxuICogIHBvaXNvbi1tZXNzYWdlIHJlZHJpdmUgY2VpbGluZykuIE1pc3NpbmcvTmFOIGF0dHJpYnV0ZXMgZmFsbCBiYWNrIHRvIDAuICovXG5hc3luYyBmdW5jdGlvbiBkbHFTdGF0cyhyZWdpb246IHN0cmluZywgZGxxVXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVwdGg6IG51bWJlcjsgb2xkZXN0QWdlU2VjOiBudW1iZXIgfT4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLkdldFF1ZXVlQXR0cmlidXRlc0NvbW1hbmQoe1xuICAgIFF1ZXVlVXJsOiBkbHFVcmwsXG4gICAgQXR0cmlidXRlTmFtZXM6IFsnQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzJywgJ0FwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlJ10sXG4gIH0pKSBhcyB7IEF0dHJpYnV0ZXM/OiB7IEFwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcz86IHN0cmluZzsgQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2U/OiBzdHJpbmcgfSB9O1xuICBjb25zdCBuID0gTnVtYmVyKG91dC5BdHRyaWJ1dGVzPy5BcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXMgPz8gJzAnKTtcbiAgY29uc3QgYWdlID0gTnVtYmVyKG91dC5BdHRyaWJ1dGVzPy5BcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZSA/PyAnMCcpO1xuICByZXR1cm4ge1xuICAgIGRlcHRoOiBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogMCxcbiAgICBvbGRlc3RBZ2VTZWM6IE51bWJlci5pc0Zpbml0ZShhZ2UpID8gYWdlIDogMCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQWN0aXZlTW92ZVRhc2socmVnaW9uOiBzdHJpbmcsIGRscUFybjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgc3FzQ2xpZW50KHJlZ2lvbik7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBzcXNNb2QuTGlzdE1lc3NhZ2VNb3ZlVGFza3NDb21tYW5kKHsgU291cmNlQXJuOiBkbHFBcm4gfSkpIGFzIHtcbiAgICBSZXN1bHRzPzogQXJyYXk8eyBTdGF0dXM/OiBzdHJpbmcgfT47XG4gIH07XG4gIHJldHVybiAob3V0LlJlc3VsdHMgPz8gW10pLnNvbWUodCA9PiB0LlN0YXR1cyA9PT0gJ1JVTk5JTkcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNb3ZlVGFzayhyZWdpb246IHN0cmluZywgZGxxQXJuOiBzdHJpbmcsIG1haW5Bcm46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLlN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuLCBEZXN0aW5hdGlvbkFybjogbWFpbkFybiB9KSk7XG59XG5cbi8qKiBQT1NUIG9uZSBvcmcncyBpbmdlc3QtaGVhbHRoIHNpZ25hbC4gUmV0dXJucyB0cnVlIG9ubHkgb24gYSBjb25maXJtZWQgMnh4IHNvIHRoZVxuICogIGNhbGxlciByZXNldHMgdGhhdCBvcmcncyBgZm9yd2FyZGVkYCBjb3VudGVyIE9OTFkgd2hlbiB0aGUgc2lnbmFsIHdhcyBhY2NlcHRlZFxuICogIChhIGRyb3BwZWQvZmFpbGVkIFBPU1QgbXVzdCBub3Qgc2lsZW50bHkgemVybyB0aGUgYWNjdW11bGF0ZWQgY291bnQpLiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEluZ2VzdEhlYWx0aChiYXNlVXJsOiBzdHJpbmcsIGJvZHk6IHsgb3JnSWQ/OiBzdHJpbmc7IGZvcndhcmRlZDogbnVtYmVyOyBkcm9wcGVkOiBudW1iZXI7IGxhc3RFdmVudEF0Pzogc3RyaW5nIH0sIHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBdXRoVG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCwgLi4uY29ycmVsYXRpb25IZWFkZXJzKHsgcmVxdWVzdElkIH0pIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbG9nLndhcm4oJ2luZ2VzdC1oZWFsdGggUE9TVCByZXR1cm5lZCBub24tMnh4IChpZ25vcmVkKScsIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBvcmdJZDogYm9keS5vcmdJZCB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdpbmdlc3QtaGVhbHRoIFBPU1QgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IFN0cmluZyhlcnIpLCBvcmdJZDogYm9keS5vcmdJZCB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdHRsZWQsIGJlc3QtZWZmb3J0IHBvc3Qtc3VjY2VzcyB3b3JrOiBlbWl0IHBlci1vcmcgaW5nZXN0LWhlYWx0aCBhbmQgc2VsZi1oZWFsXG4gKiB0aGUgRExRLiBOZXZlciB0aHJvd3MuIGBmb3J3YXJkZWRgL2BsYXN0RXZlbnRBdGAgYWNjdW11bGF0ZSBQRVIgT1JHIGFjcm9zcyBiYXRjaGVzXG4gKiBiZXR3ZWVuIGhlYWx0aCBwb3N0czsgYGRyb3BwZWRgIGlzIHRoZSBzaGFyZWQgZmxlZXQgRExRIGRlcHRoIHNuYXBzaG90LiBBIHBlci1vcmdcbiAqIGNvdW50ZXIgaXMgemVyb2VkIG9ubHkgYWZ0ZXIgdGhhdCBvcmcncyBoZWFsdGggUE9TVCBpcyBjb25maXJtZWQgMnh4LiBgcmVxdWVzdElkYFxuICogaXMgdGhlIGJhdGNoJ3MgcmVxdWVzdCBpZCAoc2VlIGluZGV4LnRzKSwgc2VudCBhcyBgWC1SZXF1ZXN0LUlkYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcG9ydEhlYWx0aEFuZFJlZHJpdmUoYmFzZVVybDogc3RyaW5nLCBtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKG5vdyAtIGxhc3RIZWFsdGhBdCA8IEhFQUxUSF9USFJPVFRMRV9NUykgcmV0dXJuO1xuICBsYXN0SGVhbHRoQXQgPSBub3c7XG4gIHRyeSB7XG4gICAgY29uc3QgcSA9IGRlcml2ZVF1ZXVlcyhtYWluUXVldWVBcm4pO1xuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IG9sZGVzdEFnZVNlYyA9IDA7XG4gICAgaWYgKHEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZGxxU3RhdHMocS5yZWdpb24sIHEuZGxxVXJsKTtcbiAgICAgICAgZGVwdGggPSBzdGF0cy5kZXB0aDtcbiAgICAgICAgb2xkZXN0QWdlU2VjID0gc3RhdHMub2xkZXN0QWdlU2VjO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy53YXJuKCdETFEgc3RhdHMgY2hlY2sgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvc3Qgb25lIGhlYWx0aCBzaWduYWwgcGVyIHJlc29sdmVkIG9yZywgYXR0cmlidXRpbmcgaXRzIG93biBmb3J3YXJkZWQgY291bnQgK1xuICAgIC8vIGxhc3QgZXZlbnQgdGltZS4gYGRyb3BwZWRgICh0aGUgc2hhcmVkIGZsZWV0IERMUSBkZXB0aCkgcmlkZXMgYWxvbmcgb24gZWFjaC5cbiAgICAvLyBTbmFwc2hvdCB0aGUga2V5cyBmaXJzdCBzbyB3ZSBkb24ndCBtdXRhdGUgdGhlIG1hcCB3aGlsZSBpdGVyYXRpbmcuXG4gICAgY29uc3Qgb3JnS2V5cyA9IG5ldyBTZXQoWy4uLmZvcndhcmRlZEJ5T3JnLmtleXMoKSwgLi4ubGFzdEV2ZW50QXRCeU9yZy5rZXlzKCldKTtcbiAgICBpZiAob3JnS2V5cy5zaXplID09PSAwKSBvcmdLZXlzLmFkZCgnJyk7IC8vIG5vdGhpbmcgZm9yd2FyZGVkIHlldCDihpIgc3RpbGwgcmVwb3J0IGRlcHRoXG4gICAgZm9yIChjb25zdCBrZXkgb2Ygb3JnS2V5cykge1xuICAgICAgY29uc3QgZm9yd2FyZGVkID0gZm9yd2FyZGVkQnlPcmcuZ2V0KGtleSkgPz8gMDtcbiAgICAgIGNvbnN0IGxhc3RFdmVudEF0ID0gbGFzdEV2ZW50QXRCeU9yZy5nZXQoa2V5KTtcbiAgICAgIGNvbnN0IG9rID0gYXdhaXQgcG9zdEluZ2VzdEhlYWx0aChiYXNlVXJsLCB7XG4gICAgICAgIC4uLihrZXkgPyB7IG9yZ0lkOiBrZXkgfSA6IHt9KSxcbiAgICAgICAgZm9yd2FyZGVkLFxuICAgICAgICBkcm9wcGVkOiBkZXB0aCxcbiAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICB9LCByZXF1ZXN0SWQpO1xuICAgICAgLy8gUmVzZXQgdGhlIGZvcndhcmRlZCBjb3VudGVyIE9OTFkgb24gYSBjb25maXJtZWQgMnh4IOKAlCBhIGZhaWxlZC9kcm9wcGVkIFBPU1RcbiAgICAgIC8vIGtlZXBzIHRoZSBjb3VudCBzbyB0aGUgbmV4dCB0aWNrIHJlLXJlcG9ydHMgaXQgaW5zdGVhZCBvZiBsb3NpbmcgaXQuXG4gICAgICBpZiAob2spIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIDApO1xuICAgIH1cblxuICAgIGlmIChxICYmIGRlcHRoID4gMCAmJiBub3cgLSBsYXN0UmVkcml2ZUF0ID49IFJFRFJJVkVfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IG5ldmVyIHJlZHJpdmUgYSBETFEgd2hvc2Ugb2xkZXN0IG1lc3NhZ2UgaGFzIGFnZWRcbiAgICAgIC8vIHBhc3QgdGhlIGNlaWxpbmcg4oCUIHRoYXQgbWVzc2FnZSBrZWVwcyBmYWlsaW5nIGFuZCB3b3VsZCBsb29wIERMUeKGkm1haW7ihpJETFEuXG4gICAgICBpZiAob2xkZXN0QWdlU2VjID4gTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBvbGRlc3QgbWVzc2FnZSBleGNlZWRzIHBvaXNvbi1hZ2UgY2VpbGluZyDigJQgc2tpcHBpbmcgcmVkcml2ZSAobmVlZHMgbWFudWFsIGF0dGVudGlvbiknLCB7XG4gICAgICAgICAgZGxxOiBhcm5SZWYocS5kbHFBcm4pLCBkcm9wcGVkOiBkZXB0aCwgb2xkZXN0QWdlU2VjLCBjZWlsaW5nU2VjOiBNQVhfRExRX1JFRFJJVkVfQUdFX1NFQyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghKGF3YWl0IGhhc0FjdGl2ZU1vdmVUYXNrKHEucmVnaW9uLCBxLmRscUFybikpKSB7XG4gICAgICAgICAgICBsYXN0UmVkcml2ZUF0ID0gbm93O1xuICAgICAgICAgICAgYXdhaXQgc3RhcnRNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4sIHEubWFpbkFybik7XG4gICAgICAgICAgICBsb2cuaW5mbygnU3RhcnRlZCBzZWxmLWhlYWxpbmcgRExR4oaSbWFpbiByZWRyaXZlJywgeyBkbHE6IGFyblJlZihxLmRscUFybiksIGRyb3BwZWQ6IGRlcHRoLCBvbGRlc3RBZ2VTZWMgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2cud2FybignRExRIHJlZHJpdmUgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignaGVhbHRoL3JlZHJpdmUgc3RlcCBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gIH1cbn1cblxuLyoqIENvdW50IGEgZm9yd2FyZGVkIGJhdGNoIHRvd2FyZCBlYWNoIHJlc29sdmVkIG9yZydzIGRlbGl2ZXJ5LWhlYWx0aCByZXBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkRm9yd2FyZGVkKGV2ZW50czogUmVhZG9ubHlBcnJheTx7IG9yZ0lkOiBzdHJpbmcgfCBudWxsOyBjb21wbGV0ZWRBdD86IHN0cmluZzsgc3RhcnRlZEF0Pzogc3RyaW5nIH0+KTogdm9pZCB7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBjb25zdCBrZXkgPSBlLm9yZ0lkID8/ICcnO1xuICAgIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIChmb3J3YXJkZWRCeU9yZy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICAgIGNvbnN0IGF0ID0gZS5jb21wbGV0ZWRBdCB8fCBlLnN0YXJ0ZWRBdDtcbiAgICBpZiAoYXQpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBsYXN0RXZlbnRBdEJ5T3JnLmdldChrZXkpO1xuICAgICAgaWYgKCFwcmV2IHx8IGF0ID4gcHJldikgbGFzdEV2ZW50QXRCeU9yZy5zZXQoa2V5LCBhdCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgaGVhbHRoIGNvdW50ZXJzIGFuZCB0aHJvdHRsZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0SGVhbHRoRm9yVGVzdHMoKTogdm9pZCB7XG4gIGZvcndhcmRlZEJ5T3JnLmNsZWFyKCk7XG4gIGxhc3RFdmVudEF0QnlPcmcuY2xlYXIoKTtcbiAgbGFzdEhlYWx0aEF0ID0gMDtcbiAgbGFzdFJlZHJpdmVBdCA9IDA7XG59XG4iXX0=
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { SQSBatchResponse, SQSEvent } from 'aws-lambda';
1
+ import type { Context, SQSBatchResponse, SQSEvent } from 'aws-lambda';
2
2
  /**
3
3
  * Pipeline event ingestion Lambda handler.
4
4
  *
@@ -24,4 +24,4 @@ import type { SQSBatchResponse, SQSEvent } from 'aws-lambda';
24
24
  * self-healing redrive; defaults to `<main-queue-arn>-dlq` derived from the SQS
25
25
  * trigger's eventSourceARN.
26
26
  */
27
- export declare const handler: (event: SQSEvent) => Promise<SQSBatchResponse>;
27
+ export declare const handler: (event: SQSEvent, context?: Pick<Context, 'awsRequestId'>) => Promise<SQSBatchResponse>;
package/lib/index.js CHANGED
@@ -1,3 +1,31 @@
1
+ // src/index.ts
2
+ import { randomUUID } from "node:crypto";
3
+
4
+ // ../pipeline-core/lib/core/audit-correlation.js
5
+ var REQUEST_ID_HEADER = "X-Request-Id";
6
+ var PIPELINE_EXECUTION_ID_HEADER = "X-Pipeline-Execution-Id";
7
+ var CODEBUILD_BUILD_ID_HEADER = "X-CodeBuild-Build-Id";
8
+ var MAX_CORRELATION_VALUE = 128;
9
+ function sanitizeCorrelationValue(value) {
10
+ if (typeof value !== "string")
11
+ return void 0;
12
+ const clean = value.replace(/[^\x21-\x7e]/g, "").slice(0, MAX_CORRELATION_VALUE);
13
+ return clean.length > 0 ? clean : void 0;
14
+ }
15
+ function correlationHeaders(ids) {
16
+ const headers = {};
17
+ const requestId = sanitizeCorrelationValue(ids.requestId);
18
+ const executionId = sanitizeCorrelationValue(ids.pipelineExecutionId);
19
+ const buildId = sanitizeCorrelationValue(ids.codeBuildBuildId);
20
+ if (requestId)
21
+ headers[REQUEST_ID_HEADER] = requestId;
22
+ if (executionId)
23
+ headers[PIPELINE_EXECUTION_ID_HEADER] = executionId;
24
+ if (buildId)
25
+ headers[CODEBUILD_BUILD_ID_HEADER] = buildId;
26
+ return headers;
27
+ }
28
+
1
29
  // ../pipeline-core/lib/handlers/platform-credential.js
2
30
  import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
3
31
  var ACCESS_KEY_PREFIXES = ["pb_sa_", "pb_pat_"];
@@ -7,8 +35,8 @@ function assertAccessKey(value, source) {
7
35
  const looksLikeJwt = value.split(".").length === 3;
8
36
  throw new Error(`${source} does not hold an opaque access key (expected a "pb_sa_\u2026" value)` + (looksLikeJwt ? ' \u2014 it holds a JWT, not a service-account key. Re-run "pipeline-manager infra store-token" to issue one.' : "."));
9
37
  }
10
- async function readCredentialSecret(secretName, client = new SecretsManagerClient({})) {
11
- const response = await client.send(new GetSecretValueCommand({ SecretId: secretName }));
38
+ async function readCredentialSecret(secretName, client2 = new SecretsManagerClient({})) {
39
+ const response = await client2.send(new GetSecretValueCommand({ SecretId: secretName }));
12
40
  if (!response.SecretString)
13
41
  throw new Error(`Secret "${secretName}" is empty`);
14
42
  return JSON.parse(response.SecretString);
@@ -56,6 +84,7 @@ function createPlatformCredential(opts) {
56
84
  }
57
85
 
58
86
  // src/util.ts
87
+ import { createHash } from "node:crypto";
59
88
  var log = {
60
89
  info: (msg, data) => console.log(JSON.stringify({ level: "INFO", message: msg, data, ts: (/* @__PURE__ */ new Date()).toISOString() })),
61
90
  warn: (msg, data) => console.log(JSON.stringify({ level: "WARN", message: msg, data, ts: (/* @__PURE__ */ new Date()).toISOString() })),
@@ -77,6 +106,9 @@ var BoundedMap = class extends Map {
77
106
  return super.set(key, value);
78
107
  }
79
108
  };
109
+ function arnRef(arn) {
110
+ return `arn#${createHash("sha256").update(arn).digest("hex").slice(0, 12)}`;
111
+ }
80
112
  var CACHE_MAX_ENTRIES = 5e3;
81
113
  async function loadSdk(pkg) {
82
114
  return await import(pkg);
@@ -140,12 +172,12 @@ var sqsClientsByRegion;
140
172
  async function sqsClient(region) {
141
173
  if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
142
174
  if (!sqsClientsByRegion) sqsClientsByRegion = /* @__PURE__ */ new Map();
143
- let client = sqsClientsByRegion.get(region);
144
- if (!client) {
145
- client = new sqsMod.SQSClient({ region });
146
- sqsClientsByRegion.set(region, client);
175
+ let client2 = sqsClientsByRegion.get(region);
176
+ if (!client2) {
177
+ client2 = new sqsMod.SQSClient({ region });
178
+ sqsClientsByRegion.set(region, client2);
147
179
  }
148
- return client;
180
+ return client2;
149
181
  }
150
182
  var forwardedByOrg = new BoundedMap(CACHE_MAX_ENTRIES);
151
183
  var lastEventAtByOrg = new BoundedMap(CACHE_MAX_ENTRIES);
@@ -166,8 +198,8 @@ function deriveQueues(mainQueueArn) {
166
198
  }
167
199
  async function dlqStats(region, dlqUrl) {
168
200
  if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
169
- const client = await sqsClient(region);
170
- const out = await client.send(new sqsMod.GetQueueAttributesCommand({
201
+ const client2 = await sqsClient(region);
202
+ const out = await client2.send(new sqsMod.GetQueueAttributesCommand({
171
203
  QueueUrl: dlqUrl,
172
204
  AttributeNames: ["ApproximateNumberOfMessages", "ApproximateAgeOfOldestMessage"]
173
205
  }));
@@ -180,21 +212,21 @@ async function dlqStats(region, dlqUrl) {
180
212
  }
181
213
  async function hasActiveMoveTask(region, dlqArn) {
182
214
  if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
183
- const client = await sqsClient(region);
184
- const out = await client.send(new sqsMod.ListMessageMoveTasksCommand({ SourceArn: dlqArn }));
215
+ const client2 = await sqsClient(region);
216
+ const out = await client2.send(new sqsMod.ListMessageMoveTasksCommand({ SourceArn: dlqArn }));
185
217
  return (out.Results ?? []).some((t) => t.Status === "RUNNING");
186
218
  }
187
219
  async function startMoveTask(region, dlqArn, mainArn) {
188
220
  if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
189
- const client = await sqsClient(region);
190
- await client.send(new sqsMod.StartMessageMoveTaskCommand({ SourceArn: dlqArn, DestinationArn: mainArn }));
221
+ const client2 = await sqsClient(region);
222
+ await client2.send(new sqsMod.StartMessageMoveTaskCommand({ SourceArn: dlqArn, DestinationArn: mainArn }));
191
223
  }
192
- async function postIngestHealth(baseUrl, body) {
224
+ async function postIngestHealth(baseUrl, body, requestId) {
193
225
  try {
194
226
  const token = await getAuthToken();
195
227
  const res = await fetchWithTimeout(`${baseUrl}/api/reports/ingest-health`, {
196
228
  method: "POST",
197
- headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` },
229
+ headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}`, ...correlationHeaders({ requestId }) },
198
230
  body: JSON.stringify(body)
199
231
  });
200
232
  if (!res.ok) {
@@ -207,7 +239,7 @@ async function postIngestHealth(baseUrl, body) {
207
239
  return false;
208
240
  }
209
241
  }
210
- async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
242
+ async function reportHealthAndRedrive(baseUrl, mainQueueArn, requestId) {
211
243
  const now = Date.now();
212
244
  if (now - lastHealthAt < HEALTH_THROTTLE_MS) return;
213
245
  lastHealthAt = now;
@@ -234,13 +266,13 @@ async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
234
266
  forwarded,
235
267
  dropped: depth,
236
268
  lastEventAt
237
- });
269
+ }, requestId);
238
270
  if (ok) forwardedByOrg.set(key, 0);
239
271
  }
240
272
  if (q && depth > 0 && now - lastRedriveAt >= REDRIVE_THROTTLE_MS) {
241
273
  if (oldestAgeSec > MAX_DLQ_REDRIVE_AGE_SEC) {
242
274
  log.warn("DLQ oldest message exceeds poison-age ceiling \u2014 skipping redrive (needs manual attention)", {
243
- dlqArn: q.dlqArn,
275
+ dlq: arnRef(q.dlqArn),
244
276
  dropped: depth,
245
277
  oldestAgeSec,
246
278
  ceilingSec: MAX_DLQ_REDRIVE_AGE_SEC
@@ -250,7 +282,7 @@ async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
250
282
  if (!await hasActiveMoveTask(q.region, q.dlqArn)) {
251
283
  lastRedriveAt = now;
252
284
  await startMoveTask(q.region, q.dlqArn, q.mainArn);
253
- log.info("Started self-healing DLQ\u2192main redrive", { dlqArn: q.dlqArn, dropped: depth, oldestAgeSec });
285
+ log.info("Started self-healing DLQ\u2192main redrive", { dlq: arnRef(q.dlqArn), dropped: depth, oldestAgeSec });
254
286
  }
255
287
  } catch (err) {
256
288
  log.warn("DLQ redrive failed (ignored)", { error: err?.name ?? String(err) });
@@ -279,6 +311,105 @@ function _resetHealthForTests() {
279
311
  lastRedriveAt = 0;
280
312
  }
281
313
 
314
+ // ../pipeline-core/lib/core/synth-failure.js
315
+ var SYNTH_FAILURE_MARKER = "PB_SYNTH_FAILURE";
316
+ var MAX_MESSAGE = 1e3;
317
+ var MAX_PLUGINS = 10;
318
+ var MAX_PLUGIN_MESSAGE = 300;
319
+ var clip = (s, max) => s.length > max ? `${s.slice(0, max - 1)}\u2026` : s;
320
+ function synthFailure(message, plugins = []) {
321
+ const codes = [...new Set(plugins.map((p) => p.code))];
322
+ const code = plugins.length === 0 ? "SYNTH_FAILED" : codes.length === 1 ? codes[0] : "PLUGINS_REFUSED";
323
+ return {
324
+ code,
325
+ message: clip(message, MAX_MESSAGE),
326
+ plugins: plugins.slice(0, MAX_PLUGINS).map((p) => ({
327
+ plugin: clip(p.plugin, 100),
328
+ code: clip(p.code, 100),
329
+ message: clip(p.message, MAX_PLUGIN_MESSAGE)
330
+ }))
331
+ };
332
+ }
333
+ function parseSynthFailure(line) {
334
+ const at = line.indexOf(`${SYNTH_FAILURE_MARKER} {`);
335
+ if (at === -1)
336
+ return null;
337
+ try {
338
+ const parsed = JSON.parse(line.slice(at + SYNTH_FAILURE_MARKER.length + 1).trim());
339
+ if (typeof parsed.code !== "string" || typeof parsed.message !== "string")
340
+ return null;
341
+ const plugins = Array.isArray(parsed.plugins) ? parsed.plugins.filter((p) => !!p && typeof p.plugin === "string" && typeof p.code === "string" && typeof p.message === "string") : [];
342
+ return { ...synthFailure(parsed.message, plugins), code: clip(parsed.code, 100) };
343
+ } catch {
344
+ return null;
345
+ }
346
+ }
347
+
348
+ // src/failure-reason.ts
349
+ var loader = loadSdk;
350
+ var clients = /* @__PURE__ */ new Map();
351
+ async function client(kind, region) {
352
+ const mod = kind === "codebuild" ? await loader("@aws-sdk/client-codebuild") : await loader("@aws-sdk/client-cloudwatch-logs");
353
+ const key = `${kind}:${region}`;
354
+ let c = clients.get(key);
355
+ if (!c) {
356
+ c = kind === "codebuild" ? new mod.CodeBuildClient({ region }) : new mod.CloudWatchLogsClient({ region });
357
+ clients.set(key, c);
358
+ }
359
+ return { client: c, mod };
360
+ }
361
+ var BUILD_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{1,254}:[0-9a-f-]{36}$/;
362
+ function codeBuildIdOf(detail) {
363
+ const type = detail.type;
364
+ if (type?.provider !== void 0 && type.provider !== "CodeBuild") return null;
365
+ const result = detail["execution-result"];
366
+ const id = result?.["external-execution-id"];
367
+ return typeof id === "string" && BUILD_ID_RE.test(id) ? id : null;
368
+ }
369
+ async function readBuildCompute(region, buildId) {
370
+ try {
371
+ const cb = await client("codebuild", region);
372
+ const out = await cb.client.send(
373
+ new cb.mod.BatchGetBuildsCommand({ ids: [buildId] })
374
+ );
375
+ return out.builds?.[0]?.environment?.computeType ?? null;
376
+ } catch (err) {
377
+ log.warn("Could not read the build's compute size (forwarding without it)", {
378
+ buildId,
379
+ error: String(err)
380
+ });
381
+ return null;
382
+ }
383
+ }
384
+ async function readSynthFailure(region, buildId) {
385
+ try {
386
+ const cb = await client("codebuild", region);
387
+ const out = await cb.client.send(
388
+ new cb.mod.BatchGetBuildsCommand({ ids: [buildId] })
389
+ );
390
+ const logs = out.builds?.[0]?.logs;
391
+ if (!logs?.groupName || !logs.streamName) return null;
392
+ const cw = await client("logs", region);
393
+ const res = await cw.client.send(new cw.mod.FilterLogEventsCommand({
394
+ logGroupName: logs.groupName,
395
+ logStreamNames: [logs.streamName],
396
+ filterPattern: `"${SYNTH_FAILURE_MARKER}"`,
397
+ limit: 5
398
+ }));
399
+ for (const event of res.events ?? []) {
400
+ const failure = typeof event.message === "string" ? parseSynthFailure(event.message) : null;
401
+ if (failure) return failure;
402
+ }
403
+ return null;
404
+ } catch (err) {
405
+ log.warn("Could not read the failed build's structured failure reason (forwarding without it)", {
406
+ buildId,
407
+ error: err instanceof Error ? err.message : String(err)
408
+ });
409
+ return null;
410
+ }
411
+ }
412
+
282
413
  // src/scm.ts
283
414
  import { GetSecretValueCommand as GetSecretValueCommand2, SecretsManagerClient as SecretsManagerClient2 } from "@aws-sdk/client-secrets-manager";
284
415
  var commitResultCache = new BoundedMap(CACHE_MAX_ENTRIES);
@@ -312,8 +443,8 @@ async function getGitHubToken(orgId) {
312
443
  }
313
444
  let token;
314
445
  try {
315
- const client = new SecretsManagerClient2({});
316
- const res = await client.send(new GetSecretValueCommand2({ SecretId: secretName }));
446
+ const client2 = new SecretsManagerClient2({});
447
+ const res = await client2.send(new GetSecretValueCommand2({ SecretId: secretName }));
317
448
  token = res.SecretString && res.SecretString.length > 0 ? res.SecretString.trim() : null;
318
449
  } catch (err) {
319
450
  log.warn("No github-token secret \u2014 GitHub commit resolution will be unauthenticated", { orgId, error: err?.name });
@@ -358,19 +489,19 @@ var codecommitMod;
358
489
  async function codeCommitClient(region) {
359
490
  if (!codecommitMod) codecommitMod = await loadSdk("@aws-sdk/client-codecommit");
360
491
  if (!codecommitClientsByRegion) codecommitClientsByRegion = /* @__PURE__ */ new Map();
361
- let client = codecommitClientsByRegion.get(region);
362
- if (!client) {
363
- client = new codecommitMod.CodeCommitClient({ region });
364
- codecommitClientsByRegion.set(region, client);
492
+ let client2 = codecommitClientsByRegion.get(region);
493
+ if (!client2) {
494
+ client2 = new codecommitMod.CodeCommitClient({ region });
495
+ codecommitClientsByRegion.set(region, client2);
365
496
  }
366
- return client;
497
+ return client2;
367
498
  }
368
499
  async function codeCommitMeta(region, repositoryName, commitId) {
369
500
  const cached = commitMetaCache.get(commitId);
370
501
  if (cached) return cached;
371
502
  if (!codecommitMod) codecommitMod = await loadSdk("@aws-sdk/client-codecommit");
372
- const client = await codeCommitClient(region);
373
- const out = await client.send(new codecommitMod.GetCommitCommand({ repositoryName, commitId }));
503
+ const client2 = await codeCommitClient(region);
504
+ const out = await client2.send(new codecommitMod.GetCommitCommand({ repositoryName, commitId }));
374
505
  const commit = out.commit;
375
506
  const meta = { date: toIso(commit?.committer?.date ?? commit?.author?.date), parents: commit?.parents };
376
507
  commitMetaCache.set(commitId, meta);
@@ -538,13 +669,13 @@ function parseDeploys(value) {
538
669
  return map;
539
670
  }
540
671
  async function pipelineClient(region) {
541
- let client = clientsByRegion.get(region);
542
- if (!client) {
672
+ let client2 = clientsByRegion.get(region);
673
+ if (!client2) {
543
674
  const { CodePipelineClient } = await loadCodePipeline();
544
- client = new CodePipelineClient({ region });
545
- clientsByRegion.set(region, client);
675
+ client2 = new CodePipelineClient({ region });
676
+ clientsByRegion.set(region, client2);
546
677
  }
547
- return client;
678
+ return client2;
548
679
  }
549
680
  async function resolvePipeline(arn, region) {
550
681
  const cached = resolvedByArn.get(arn);
@@ -552,29 +683,29 @@ async function resolvePipeline(arn, region) {
552
683
  return { pipelineId: cached.pipelineId, orgId: cached.orgId, deploys: cached.deploys };
553
684
  }
554
685
  try {
555
- const client = await pipelineClient(region);
686
+ const client2 = await pipelineClient(region);
556
687
  const { ListTagsForResourceCommand } = await loadCodePipeline();
557
- const out = await client.send(new ListTagsForResourceCommand({ resourceArn: arn }));
688
+ const out = await client2.send(new ListTagsForResourceCommand({ resourceArn: arn }));
558
689
  const pipelineId = out.tags?.find((t) => t.key === PIPELINE_ID_TAG)?.value ?? null;
559
690
  const orgId = out.tags?.find((t) => t.key === ORG_ID_TAG)?.value ?? null;
560
691
  const deploys = parseDeploys(out.tags?.find((t) => t.key === DEPLOYS_TAG)?.value);
561
- if (!pipelineId) log.warn("Pipeline missing pb.pipeline-id tag \u2014 skipping (register it?)", { arn });
692
+ if (!pipelineId) log.warn("Pipeline missing pb.pipeline-id tag \u2014 skipping (register it?)", { pipeline: arnRef(arn) });
562
693
  resolvedByArn.set(arn, { pipelineId, orgId, deploys, ts: Date.now() });
563
694
  return { pipelineId, orgId, deploys };
564
695
  } catch (err) {
565
696
  const name = err?.name;
566
697
  if (name === "AccessDeniedException") {
567
- log.error("AccessDenied calling codepipeline:ListTagsForResource \u2014 grant it to the Lambda role", { arn, error: name });
698
+ log.error("AccessDenied calling codepipeline:ListTagsForResource \u2014 grant it to the Lambda role", { pipeline: arnRef(arn), error: name });
568
699
  throw err;
569
700
  }
570
701
  const e = err;
571
702
  const status = e.$metadata?.httpStatusCode;
572
703
  const retryable = e.$retryable != null || typeof status === "number" && status >= 500 || /throttl|timeout|toomanyrequests|serviceunavailable|econnreset|networkingerror/i.test(name ?? "");
573
704
  if (retryable) {
574
- log.error("Transient error resolving pb.pipeline-id tag \u2014 will retry the batch", { arn, error: name ?? String(err) });
705
+ log.error("Transient error resolving pb.pipeline-id tag \u2014 will retry the batch", { pipeline: arnRef(arn), error: name ?? String(err) });
575
706
  throw err;
576
707
  }
577
- log.error("Failed to resolve pb.pipeline-id tag", { arn, error: name ?? String(err) });
708
+ log.error("Failed to resolve pb.pipeline-id tag", { pipeline: arnRef(arn), error: name ?? String(err) });
578
709
  return { pipelineId: null, orgId: null, deploys: /* @__PURE__ */ new Map() };
579
710
  }
580
711
  }
@@ -583,7 +714,12 @@ function _resetTagsForTests() {
583
714
  }
584
715
 
585
716
  // src/parse.ts
717
+ var MAX_SOURCE_ID = 128;
718
+ function sourceId(v) {
719
+ return typeof v === "string" && v.length > 0 ? v.slice(0, MAX_SOURCE_ID) : void 0;
720
+ }
586
721
  var MAX_ERROR_MESSAGE = 4e3;
722
+ var MAX_DETAIL_BYTES = 7500;
587
723
  function firstAttr(...vals) {
588
724
  for (const v of vals) {
589
725
  if (typeof v === "string" && v.length > 0) return v.slice(0, MAX_ATTR);
@@ -654,7 +790,25 @@ async function parseRecord(record) {
654
790
  }
655
791
  const result = detail["execution-result"];
656
792
  const summary = result?.["external-execution-summary"];
657
- const errorMessage = typeof summary === "string" && summary.length > 0 ? summary.slice(0, MAX_ERROR_MESSAGE) : void 0;
793
+ let errorMessage = typeof summary === "string" && summary.length > 0 ? summary.slice(0, MAX_ERROR_MESSAGE) : void 0;
794
+ let computeType;
795
+ if (eventType === "ACTION" && ["SUCCEEDED", "FAILED", "STOPPED"].includes(state)) {
796
+ const cbId = codeBuildIdOf(detail);
797
+ computeType = (cbId ? await readBuildCompute(event.region, cbId) : null) ?? void 0;
798
+ }
799
+ if (eventType === "ACTION" && state === "FAILED") {
800
+ const buildId = codeBuildIdOf(detail);
801
+ const failure = buildId ? await readSynthFailure(event.region, buildId) : null;
802
+ if (failure) {
803
+ detail.pbFailure = failure;
804
+ if (JSON.stringify(detail).length >= MAX_DETAIL_BYTES) {
805
+ detail.pbFailure = { ...failure, plugins: failure.plugins.map(({ plugin, code }) => ({ plugin, code })) };
806
+ }
807
+ errorMessage = `${failure.code}: ${failure.message}`.slice(0, MAX_ERROR_MESSAGE);
808
+ }
809
+ }
810
+ const sourceEventId = sourceId(event.id);
811
+ const sourceMessageId = sourceId(record.messageId);
658
812
  const { commitSha, commitRef, revisionUrl } = extractCommit(detail);
659
813
  const executionId = detail["execution-id"];
660
814
  const stageName = detail.stage;
@@ -686,14 +840,18 @@ async function parseRecord(record) {
686
840
  ...commitTimestamp && { commitTimestamp },
687
841
  ...commitCount && { commitCount },
688
842
  ...environment && { environment },
843
+ ...computeType && { computeType },
844
+ ...sourceEventId && { sourceEventId },
845
+ ...sourceMessageId && { sourceMessageId },
689
846
  detail
690
847
  };
691
848
  }
692
849
 
693
850
  // src/index.ts
694
- var handler = async (event) => {
851
+ var handler = async (event, context) => {
695
852
  const baseUrl = process.env.PLATFORM_BASE_URL;
696
853
  if (!baseUrl) throw new Error("PLATFORM_BASE_URL environment variable is required");
854
+ const requestId = context?.awsRequestId || randomUUID();
697
855
  const settled = await Promise.all(event.Records.map(async (record) => {
698
856
  try {
699
857
  return { record, parsed: await parseRecord(record) };
@@ -715,7 +873,7 @@ var handler = async (event) => {
715
873
  const payloadEvents = events.map(({ orgId: _orgId, ...rest }) => rest);
716
874
  const post = (token) => fetchWithTimeout(`${baseUrl}/api/reports/events`, {
717
875
  method: "POST",
718
- headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` },
876
+ headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}`, ...correlationHeaders({ requestId }) },
719
877
  body: JSON.stringify({ events: payloadEvents })
720
878
  });
721
879
  let res = await post(await getAuthToken());
@@ -735,7 +893,7 @@ var handler = async (event) => {
735
893
  const result = await res.json().catch(() => ({}));
736
894
  log.info(`Ingested ${events.length} events`, { inserted: result.data });
737
895
  recordForwarded(events);
738
- await reportHealthAndRedrive(baseUrl, event.Records[0]?.eventSourceARN);
896
+ await reportHealthAndRedrive(baseUrl, event.Records[0]?.eventSourceARN, requestId);
739
897
  return batchResponse(failures);
740
898
  };
741
899
  function batchResponse(failed) {
package/lib/parse.d.ts CHANGED
@@ -31,9 +31,27 @@ export interface ParsedEvent {
31
31
  commitTimestamp?: string;
32
32
  /** Number of commits in the resolved range (≥1). Undefined when unresolvable. */
33
33
  commitCount?: number;
34
+ /**
35
+ * The compute size a terminal CodeBuild action ran on (`SMALL` … `X2_LARGE`),
36
+ * read from AWS. Undefined for a non-CodeBuild action, a non-terminal event,
37
+ * or when the read failed — the ingest then records the action as UNMEASURED
38
+ * rather than as free, which is what makes the coverage gap visible instead of
39
+ * looking like idleness.
40
+ *
41
+ * Its own field rather than a `detail` key, for the reason `failure` has one:
42
+ * `detail` is bounded at 8 KB and already sheds content under that bound, so a
43
+ * one-word field riding inside it is a field that can be dropped by an
44
+ * unrelated payload getting large.
45
+ */
46
+ computeType?: string;
34
47
  /** Deploy environment — set only when the event's stage is listed in the
35
48
  * pipeline's `pb.deploys` tag. Undefined otherwise (⇒ not a deploy). */
36
49
  environment?: string;
50
+ /** The EventBridge event `id` (≤128) — lets the server's audit trail name the
51
+ * exact AWS event a row came from. Undefined when the body carries none. */
52
+ sourceEventId?: string;
53
+ /** The SQS record's messageId (≤128) — the delivery that carried the event. */
54
+ sourceMessageId?: string;
37
55
  detail: Record<string, unknown>;
38
56
  }
39
57
  /** Parse + resolve one record to a reportable event, or null to skip it. */
package/lib/parse.js CHANGED
@@ -1,10 +1,19 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { codeBuildIdOf, readBuildCompute, readSynthFailure } from './failure-reason.js';
3
4
  import { classifySource, resolveCommitInfo } from './scm.js';
4
5
  import { MAX_ATTR, resolvePipeline } from './tags.js';
5
6
  import { log } from './util.js';
7
+ /** Cap on `sourceEventId` / `sourceMessageId` — the reporting ingest's max. */
8
+ const MAX_SOURCE_ID = 128;
9
+ /** A non-empty string capped to `MAX_SOURCE_ID`, else undefined. */
10
+ function sourceId(v) {
11
+ return typeof v === 'string' && v.length > 0 ? v.slice(0, MAX_SOURCE_ID) : undefined;
12
+ }
6
13
  /** Cap on the stored failure summary — CodeBuild/Deploy summaries can be long. */
7
14
  const MAX_ERROR_MESSAGE = 4000;
15
+ /** Headroom under the reporting ingest's 8 KB serialized `detail` bound. */
16
+ const MAX_DETAIL_BYTES = 7500;
8
17
  /** First non-empty string among the candidates, capped to the ingest max. */
9
18
  function firstAttr(...vals) {
10
19
  for (const v of vals) {
@@ -110,9 +119,40 @@ export async function parseRecord(record) {
110
119
  // under `execution-result`.
111
120
  const result = detail['execution-result'];
112
121
  const summary = result?.['external-execution-summary'];
113
- const errorMessage = typeof summary === 'string' && summary.length > 0
122
+ let errorMessage = typeof summary === 'string' && summary.length > 0
114
123
  ? summary.slice(0, MAX_ERROR_MESSAGE)
115
124
  : undefined;
125
+ // A failed CodeBuild action may have printed a structured reason (the synth's
126
+ // `PB_SYNTH_FAILURE` line — a refused plugin, with its code). CodeBuild's
127
+ // summary never carries the build output, so read it from the build's log and
128
+ // promote it: the code + message become the failure reason, the per-plugin
129
+ // list rides in `detail.pbFailure`. Best-effort (see failure-reason.ts).
130
+ // The compute size this action ran on, for the vCPU-minute figure Phase 4
131
+ // measures. Only on a TERMINAL CodeBuild action: an in-progress event has no
132
+ // duration to pair it with, so reading it there would spend an AWS call to
133
+ // learn nothing. Best-effort — null forwards without the field.
134
+ let computeType;
135
+ if (eventType === 'ACTION' && ['SUCCEEDED', 'FAILED', 'STOPPED'].includes(state)) {
136
+ const cbId = codeBuildIdOf(detail);
137
+ computeType = (cbId ? await readBuildCompute(event.region, cbId) : null) ?? undefined;
138
+ }
139
+ if (eventType === 'ACTION' && state === 'FAILED') {
140
+ const buildId = codeBuildIdOf(detail);
141
+ const failure = buildId ? await readSynthFailure(event.region, buildId) : null;
142
+ if (failure) {
143
+ detail.pbFailure = failure;
144
+ // The ingest bounds `detail` at 8 KB serialized; keep the codes, drop the
145
+ // per-plugin prose if the whole thing would not fit.
146
+ if (JSON.stringify(detail).length >= MAX_DETAIL_BYTES) {
147
+ detail.pbFailure = { ...failure, plugins: failure.plugins.map(({ plugin, code }) => ({ plugin, code })) };
148
+ }
149
+ errorMessage = `${failure.code}: ${failure.message}`.slice(0, MAX_ERROR_MESSAGE);
150
+ }
151
+ }
152
+ // Audit correlation back to the AWS side: which EventBridge event, carried by
153
+ // which SQS delivery. Both are opaque ids (no ARN, no account).
154
+ const sourceEventId = sourceId(event.id);
155
+ const sourceMessageId = sourceId(record.messageId);
116
156
  // DORA deploy attribution — all optional: omitted (undefined) when the
117
157
  // event/pipeline doesn't carry them.
118
158
  const { commitSha, commitRef, revisionUrl } = extractCommit(detail);
@@ -153,7 +193,10 @@ export async function parseRecord(record) {
153
193
  ...(commitTimestamp && { commitTimestamp }),
154
194
  ...(commitCount && { commitCount }),
155
195
  ...(environment && { environment }),
196
+ ...(computeType && { computeType }),
197
+ ...(sourceEventId && { sourceEventId }),
198
+ ...(sourceMessageId && { sourceMessageId }),
156
199
  detail,
157
200
  };
158
201
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUd0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUEwQ2hDLGtGQUFrRjtBQUNsRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQiw2RUFBNkU7QUFDN0UsU0FBUyxTQUFTLENBQUMsR0FBRyxJQUFlO0lBQ25DLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxhQUFhLENBQUMsTUFBK0I7SUFDcEQscUZBQXFGO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FDcEIsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRCx5RUFBeUU7SUFDekUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUF3QyxDQUFDO0lBRXJGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FDekIs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O0lBQy9FLElBQUksZUFBbUMsQ0FBQztJQUN4QyxJQUFJLFdBQStCLENBQUM7SUFDcEMsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDckQsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEcsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDdkMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxTQUFTO1FBQ1QsTUFBTSxFQUFFLEtBQUs7UUFDYixXQUFXO1FBQ1gsU0FBUztRQUNULFVBQVU7UUFDVixZQUFZO1FBQ1osU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDM0MsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGNsYXNzaWZ5U291cmNlLCByZXNvbHZlQ29tbWl0SW5mbyB9IGZyb20gJy4vc2NtLmpzJztcbmltcG9ydCB7IE1BWF9BVFRSLCByZXNvbHZlUGlwZWxpbmUgfSBmcm9tICcuL3RhZ3MuanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi91dGlsLmpzJztcblxuLy8gRXZlbnQgcGFyc2luZzogYW4gU1FTIHJlY29yZCDihpIgdGhlIG5vcm1hbGl6ZWQgcmVwb3J0aW5nIGV2ZW50LlxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHBsYXRmb3JtIG9yZ0lkIChmcm9tIHRoZSBwaXBlbGluZSdzIE9yZ0lkIHRhZzsgbnVsbCB3aGVuIHVudGFnZ2VkKS5cbiAgICogSU5URVJOQUwg4oCUIHVzZWQgb25seSB0byBrZXkgdGhlIHBlci1vcmcgR2l0SHViIHRva2VuIGFuZCB0byBhdHRyaWJ1dGVcbiAgICogaW5nZXN0LWhlYWx0aC4gU3RyaXBwZWQgZnJvbSB0aGUgcGF5bG9hZCBQT1NUZWQgdG8gL3JlcG9ydHMvZXZlbnRzICh3aGljaFxuICAgKiByZXNvbHZlcyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIG5vdCB0aGUgYm9keSkuXG4gICAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdGhlIGV2ZW50XG4gICAqICBjYXJyaWVzIG5vIHNvdXJjZSByZXZpc2lvbiDigJQgc3RvcmVkIE5VTEwgZG93bnN0cmVhbS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIGJyYW5jaC9yZWYgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdW5hdmFpbGFibGUuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIE9sZGVzdC11bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3RcbiAgICogIGRlcGxveSDigJQgcmVzb2x2ZWQgaW4tYWNjb3VudC4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcmVzb2x2ZWQgcmFuZ2UgKOKJpTEpLiBVbmRlZmluZWQgd2hlbiB1bnJlc29sdmFibGUuICovXG4gIGNvbW1pdENvdW50PzogbnVtYmVyO1xuICAvKiogRGVwbG95IGVudmlyb25tZW50IOKAlCBzZXQgb25seSB3aGVuIHRoZSBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgICogIHBpcGVsaW5lJ3MgYHBiLmRlcGxveXNgIHRhZy4gVW5kZWZpbmVkIG90aGVyd2lzZSAo4oeSIG5vdCBhIGRlcGxveSkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ2FwIG9uIHRoZSBzdG9yZWQgZmFpbHVyZSBzdW1tYXJ5IOKAlCBDb2RlQnVpbGQvRGVwbG95IHN1bW1hcmllcyBjYW4gYmUgbG9uZy4gKi9cbmNvbnN0IE1BWF9FUlJPUl9NRVNTQUdFID0gNDAwMDtcblxuLyoqIEZpcnN0IG5vbi1lbXB0eSBzdHJpbmcgYW1vbmcgdGhlIGNhbmRpZGF0ZXMsIGNhcHBlZCB0byB0aGUgaW5nZXN0IG1heC4gKi9cbmZ1bmN0aW9uIGZpcnN0QXR0ciguLi52YWxzOiB1bmtub3duW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHYgb2YgdmFscykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwKSByZXR1cm4gdi5zbGljZSgwLCBNQVhfQVRUUik7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBleHRyYWN0aW9uIG9mIHRoZSBzb3VyY2UgY29tbWl0IGlkICsgcmVmIChhbmQgdGhlIHJldmlzaW9uIFVSTCwgdXNlZFxuICogb25seSBpbi1hY2NvdW50IHRvIGNsYXNzaWZ5IHRoZSBzb3VyY2UgdHlwZSBmb3IgY29tbWl0LXJhbmdlIHJlc29sdXRpb24pIGZyb20gYVxuICogQ29kZVBpcGVsaW5lIGV2ZW50IGRldGFpbC4gQ29kZVBpcGVsaW5lIHN1cmZhY2VzIHRoZSBzb3VyY2UgcmV2aXNpb24gdW5kZXIgYSBmZXdcbiAqIHNoYXBlcyBkZXBlbmRpbmcgb24gdGhlIGV2ZW50IHR5cGUgLyBzb3VyY2UtYWN0aW9uOyB3ZSBjaGVjayB0aGUga25vd24gb25lcyBhbmRcbiAqIGxlYXZlIHRoZSBmaWVsZHMgdW5kZWZpbmVkIHdoZW4gbm9uZSBhcmUgcHJlc2VudCAoTlVMTCBkb3duc3RyZWFtKS4gTmV2ZXIgcHVsbHMgYW5cbiAqIEFSTi9hY2NvdW50IGlkOiBvbmx5IHJldmlzaW9uL2JyYW5jaC91cmwgc3RyaW5nIGZpZWxkcyBhcmUgcmVhZDsgdGhlIHJldmlzaW9uVXJsXG4gKiBpcyBjb25zdW1lZCBpbi1hY2NvdW50IChzb3VyY2UgY2xhc3NpZmljYXRpb24pIGFuZCBuZXZlciBmb3J3YXJkZWQgb24gaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbW1pdChkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogeyBjb21taXRTaGE/OiBzdHJpbmc7IGNvbW1pdFJlZj86IHN0cmluZzsgcmV2aXNpb25Vcmw/OiBzdHJpbmcgfSB7XG4gIC8vIGBzb3VyY2UtcmV2aXNpb25zYCAoa2ViYWIsIEV2ZW50QnJpZGdlKSAvIGBzb3VyY2VSZXZpc2lvbnNgIChjYW1lbCkg4oCUIGZpcnN0IGVudHJ5LlxuICBjb25zdCByZXZzID0gKGRldGFpbFsnc291cmNlLXJldmlzaW9ucyddID8/IGRldGFpbC5zb3VyY2VSZXZpc2lvbnMpIGFzXG4gICAgfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0UmV2ID0gQXJyYXkuaXNBcnJheShyZXZzKSA/IHJldnNbMF0gOiB1bmRlZmluZWQ7XG4gIC8vIE9uIHNvdXJjZSBhY3Rpb25zIHRoZSByZXZpc2lvbiBpZCBjYW4gYWxzbyByaWRlIG9uIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbW1pdFNoYSA9IGZpcnN0QXR0cihcbiAgICBkZXRhaWwuY29tbWl0SWQsXG4gICAgZGV0YWlsLnJldmlzaW9uSWQsXG4gICAgZmlyc3RSZXY/LnJldmlzaW9uSWQsXG4gICAgZXhlY1Jlc3VsdD8ucmV2aXNpb25JZCxcbiAgKTtcbiAgY29uc3QgY29tbWl0UmVmID0gZmlyc3RBdHRyKFxuICAgIGRldGFpbC5jb21taXRSZWYsXG4gICAgZGV0YWlsLmJyYW5jaCxcbiAgICBkZXRhaWwuc291cmNlQnJhbmNoLFxuICAgIGZpcnN0UmV2Py5icmFuY2hOYW1lLFxuICAgIGZpcnN0UmV2Py5icmFuY2gsXG4gICk7XG4gIGNvbnN0IHJldmlzaW9uVXJsID0gdHlwZW9mIGZpcnN0UmV2Py5yZXZpc2lvblVybCA9PT0gJ3N0cmluZycgPyBmaXJzdFJldi5yZXZpc2lvblVybCA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4geyAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLCAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pLCAuLi4ocmV2aXNpb25VcmwgJiYgeyByZXZpc2lvblVybCB9KSB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2lmeUV2ZW50KGRldGFpbFR5cGU6IHN0cmluZyk6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGV2ZW50U291cmNlOiBzdHJpbmcgfSB7XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdQaXBlbGluZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1N0YWdlIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdTVEFHRScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQWN0aW9uIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdBQ1RJT04nLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLCBzb1xuICAvLyBwYXJzZVJlY29yZCBkcm9wcyB0aGVtIG9uIHRoZSBgZXZlbnRTb3VyY2UgIT09ICdjb2RlcGlwZWxpbmUnYCBjaGVjayBiZWxvdyDigJRcbiAgLy8gdGhlICdCVUlMRCcgZXZlbnRUeXBlIGlzIG5ldmVyIHBlcnNpc3RlZCBoZXJlIChwbHVnaW4gQlVJTEQgZXZlbnRzIGFyZVxuICAvLyByZWNvcmRlZCBkaXJlY3RseSBieSB0aGUgcGx1Z2luIHNlcnZpY2UpLiBUaGUgJ2NvZGVidWlsZCcgc291cmNlIGlzIHdoYXRcbiAgLy8gcm91dGVzIHRoZSBkcm9wOyBrZWVwIHRoaXMgYnJhbmNoIG9ubHkgZm9yIHRoYXQuXG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdCdWlsZCBTdGF0ZScpKSByZXR1cm4geyBldmVudFR5cGU6ICdCVUlMRCcsIGV2ZW50U291cmNlOiAnY29kZWJ1aWxkJyB9O1xuICByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xufVxuXG4vKiogUGFyc2UgKyByZXNvbHZlIG9uZSByZWNvcmQgdG8gYSByZXBvcnRhYmxlIGV2ZW50LCBvciBudWxsIHRvIHNraXAgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBsZXQgZXZlbnQ6IHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcbiAgLy8gQSBtYWxmb3JtZWQgYm9keSBpcyBhIGRlYWQgbWVzc2FnZSAocmV0cnlpbmcgd29uJ3QgaGVscCkg4oCUIGxvZyArIHNraXAgaXQgc29cbiAgLy8gaXQgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2guIFJlc29sdXRpb24gZXJyb3JzIGJlbG93IChlLmcuIEFjY2Vzc0RlbmllZClcbiAgLy8gYXJlIE5PVCBjYXVnaHQgaGVyZTogdGhvc2UgYXJlIHRyYW5zaWVudC9pbmZyYSBhbmQgbXVzdCBwcm9wYWdhdGUgdG8gcmV0cnkuXG4gIHRyeSB7XG4gICAgZXZlbnQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ1NraXBwaW5nIFNRUyByZWNvcmQgd2l0aCB1bnBhcnNlYWJsZSBib2R5JywgeyBtZXNzYWdlSWQ6IHJlY29yZC5tZXNzYWdlSWQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgZXZlbnRUeXBlLCBldmVudFNvdXJjZSB9ID0gY2xhc3NpZnlFdmVudChldmVudFsnZGV0YWlsLXR5cGUnXSk7XG4gIGNvbnN0IGRldGFpbCA9IHsgLi4uZXZlbnQuZGV0YWlsIH07XG4gIC8vIFRoZSByYXcgYWNjb3VudCBuZXZlciBuZWVkcyB0byBsZWF2ZSBBV1Mgbm93IOKAlCBkcm9wIGl0IGZyb20gdGhlIHBheWxvYWQuXG4gIGRlbGV0ZSBkZXRhaWwuYWNjb3VudDtcblxuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsXG4gIC8vIGFuZCBhIHByb2plY3QgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmVzIOKAlCB0aGVyZSdzIG5vIGNsZWFuIDE6MSBtYXBwaW5nXG4gIC8vIHRvIGEgcGlwZWxpbmUgaWQsIHNvIHNraXAgdGhlbS5cbiAgaWYgKGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJykge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBub24tQ29kZVBpcGVsaW5lIGV2ZW50IChubyBwaXBlbGluZSB0YWcgdG8gcmVzb2x2ZSknLCB7IGRldGFpbFR5cGU6IGV2ZW50WydkZXRhaWwtdHlwZSddIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGlwZWxpbmVOYW1lID0gZGV0YWlsLnBpcGVsaW5lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwaXBlbGluZU5hbWUpIHtcbiAgICBsb2cud2FybignQ29kZVBpcGVsaW5lIGV2ZW50IG1pc3NpbmcgcGlwZWxpbmUgbmFtZSDigJQgc2tpcHBpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHBpcGVsaW5lJ3MgcGIucGlwZWxpbmUtaWQgKD0gcGxhdGZvcm0gcGlwZWxpbmVJZCkgKyBwYi5kZXBsb3lzIG1hcC5cbiAgLy8gVGhlIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgb3JnSWQsIGRlcGxveXMgfSA9IGF3YWl0IHJlc29sdmVQaXBlbGluZShhcm4sIGV2ZW50LnJlZ2lvbik7XG4gIGlmICghcGlwZWxpbmVJZCkgcmV0dXJuIG51bGw7IC8vIHVudGFnZ2VkIC8gdW5yZWdpc3RlcmVkIOKGkiBza2lwXG5cbiAgLy8gQVdTIGRvZXMgbm90IGFsd2F5cyBzZW5kIGBzdGFydC10aW1lYC4gYGV2ZW50LnRpbWVgIHN0YW5kcyBpbiBmb3IgaXQgc28gdGhlXG4gIC8vIHJvdyBzdGlsbCBsYW5kcyBpbiB0aGUgcmVwb3J0IHdpbmRvd3MsIHdoaWNoIGZpbHRlciBvbiBgc3RhcnRlZF9hdGAg4oCUIGJ1dCBpdFxuICAvLyBpcyBOT1QgYSBtZWFzdXJlbWVudCwgYW5kIHRoZSBkdXJhdGlvbiBiZWxvdyBtdXN0IG5vdCBiZSBjb21wdXRlZCBmcm9tIGl0LlxuICBjb25zdCBkZWNsYXJlZFN0YXJ0ID0gZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdGFydGVkQXQgPSBkZWNsYXJlZFN0YXJ0IHx8IGV2ZW50LnRpbWU7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlsLnN0YXRlIGFzIHN0cmluZztcblxuICBsZXQgZHVyYXRpb25NczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tcGxldGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb21wbGV0ZWRBdCA9IGV2ZW50LnRpbWU7XG4gICAgLy8gT05MWSBmcm9tIGEgc3RhcnQgQVdTIGFjdHVhbGx5IGRlY2xhcmVkLiBXaXRoIHRoZSBmYWxsYmFjaywgYHN0YXJ0ZWRBdGAgYW5kXG4gICAgLy8gYGNvbXBsZXRlZEF0YCBhcmUgYm90aCBgZXZlbnQudGltZWAgb24gYSB0ZXJtaW5hbCBldmVudCwgc28gdGhlIGR1cmF0aW9uIGNhbWVcbiAgICAvLyBvdXQgYXMgZXhhY3RseSAwIOKAlCByZXBvcnRlZCBhcyBhIHJlYWwgbWVhc3VyZW1lbnQsIGRyYWdnaW5nIGV2ZXJ5IGF2ZXJhZ2UgYW5kXG4gICAgLy8gcDk1IHN0YWdlIGR1cmF0aW9uIHRvd2FyZCB6ZXJvIHdpdGggbm8gc2lnbiBhbnl0aGluZyB3YXMgbWlzc2luZy4gVW5rbm93biBpc1xuICAgIC8vIGxlZnQgdW5rbm93biAoTlVMTCksIHdoaWNoIHRoZSByZXBvcnRzIGFscmVhZHkgaGFuZGxlLlxuICAgIGlmIChkZWNsYXJlZFN0YXJ0KSB7XG4gICAgICBjb25zdCBtcyA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShkZWNsYXJlZFN0YXJ0KS5nZXRUaW1lKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG1zKSAmJiBtcyA+PSAwKSBkdXJhdGlvbk1zID0gbXM7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvbW90ZSB0aGUgZmFpbHVyZSByZWFzb24gdG8gYSB0eXBlZCBmaWVsZC4gT24gQWN0aW9uIGV2ZW50cyBBV1MgcHV0cyB0aGVcbiAgLy8gaHVtYW4tcmVhZGFibGUgc3VtbWFyeSAoYW5kIGEgbG9nIFVSTCArIGVycm9yLWNvZGUsIHdoaWNoIHN0YXkgaW4gYGRldGFpbGApXG4gIC8vIHVuZGVyIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgcmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgeyAnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdW1tYXJ5ID0gcmVzdWx0Py5bJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5J107XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHR5cGVvZiBzdW1tYXJ5ID09PSAnc3RyaW5nJyAmJiBzdW1tYXJ5Lmxlbmd0aCA+IDBcbiAgICA/IHN1bW1hcnkuc2xpY2UoMCwgTUFYX0VSUk9SX01FU1NBR0UpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gRE9SQSBkZXBsb3kgYXR0cmlidXRpb24g4oCUIGFsbCBvcHRpb25hbDogb21pdHRlZCAodW5kZWZpbmVkKSB3aGVuIHRoZVxuICAvLyBldmVudC9waXBlbGluZSBkb2Vzbid0IGNhcnJ5IHRoZW0uXG4gIGNvbnN0IHsgY29tbWl0U2hhLCBjb21taXRSZWYsIHJldmlzaW9uVXJsIH0gPSBleHRyYWN0Q29tbWl0KGRldGFpbCk7XG5cbiAgY29uc3QgZXhlY3V0aW9uSWQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1pZCddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhZ2VOYW1lID0gZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYWN0aW9uTmFtZSA9IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEVudmlyb25tZW50ICjih5IgaXNEZXBsb3kpIGlzIHNldCBPTkxZIHdoZW4gdGhpcyBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgLy8gcGlwZWxpbmUncyBwYi5kZXBsb3lzIHRhZy4gUElQRUxJTkUgZXZlbnRzIGhhdmUgbm8gc3RhZ2Ug4oaSIG5ldmVyIGEgZGVwbG95LlxuICBjb25zdCBlbnZpcm9ubWVudCA9IHN0YWdlTmFtZSA/IGRlcGxveXMuZ2V0KHN0YWdlTmFtZSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gUmVzb2x2ZSB0aGUgY29tbWl0IHJhbmdlIChvbGRlc3QtdW5zaGlwcGVkIHRpbWVzdGFtcCArIGNvdW50KSBmb3IgYW55XG4gIC8vIGV2ZW50IGNhcnJ5aW5nIGEgY29tbWl0LiBCZXN0LWVmZm9ydC9pbi1hY2NvdW50OyBvbWl0dGVkIG9uIGFueSBmYWlsdXJlLlxuICAvLyBHQVRFRCBvbiBgRE9SQV9FTkFCTEVEYCAoc2V0IGJ5IGBzZXR1cC1ldmVudHMgLS13aXRoLWRvcmFgKTogRE9SQSBsZWFkIHRpbWUgaXMgYW5cbiAgLy8gYWR2YW5jZWRfcmVwb3J0aW5nIGFkZC1vbiwgc28gb3JncyB3aXRob3V0IGl0IHNraXAgdGhlIFNDTS9zZWNyZXQgY29zdCBlbnRpcmVseSDigJRcbiAgLy8gc3RhbmRhcmQgcmVwb3J0aW5nIChjb21taXRTaGEgKyBhbGwgb3RoZXIgZmllbGRzKSBzdGlsbCBmb3J3YXJkcyByZWdhcmRsZXNzLlxuICBsZXQgY29tbWl0VGltZXN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21taXRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoY29tbWl0U2hhICYmIHByb2Nlc3MuZW52LkRPUkFfRU5BQkxFRCA9PT0gJ3RydWUnKSB7XG4gICAgY29uc3Qgc3JjID0gY2xhc3NpZnlTb3VyY2UocmV2aXNpb25VcmwpO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZXNvbHZlQ29tbWl0SW5mbyhwaXBlbGluZUlkLCBvcmdJZCwgZXZlbnQucmVnaW9uLCB7IHNoYTogY29tbWl0U2hhLCAuLi5zcmMgfSk7XG4gICAgY29tbWl0VGltZXN0YW1wID0gaW5mby5jb21taXRUaW1lc3RhbXA7XG4gICAgY29tbWl0Q291bnQgPSBpbmZvLmNvbW1pdENvdW50O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvcmdJZCxcbiAgICBwaXBlbGluZUlkLFxuICAgIGV2ZW50U291cmNlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBzdGF0dXM6IHN0YXRlLFxuICAgIGV4ZWN1dGlvbklkLFxuICAgIHN0YWdlTmFtZSxcbiAgICBhY3Rpb25OYW1lLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBzdGFydGVkQXQsXG4gICAgY29tcGxldGVkQXQsXG4gICAgZHVyYXRpb25NcyxcbiAgICAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLFxuICAgIC4uLihjb21taXRSZWYgJiYgeyBjb21taXRSZWYgfSksXG4gICAgLi4uKGNvbW1pdFRpbWVzdGFtcCAmJiB7IGNvbW1pdFRpbWVzdGFtcCB9KSxcbiAgICAuLi4oY29tbWl0Q291bnQgJiYgeyBjb21taXRDb3VudCB9KSxcbiAgICAuLi4oZW52aXJvbm1lbnQgJiYgeyBlbnZpcm9ubWVudCB9KSxcbiAgICBkZXRhaWwsXG4gIH07XG59XG4iXX0=
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUd0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBNERoQywrRUFBK0U7QUFDL0UsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBRTFCLG9FQUFvRTtBQUNwRSxTQUFTLFFBQVEsQ0FBQyxDQUFVO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZGLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFL0IsNEVBQTRFO0FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBRTlCLDZFQUE2RTtBQUM3RSxTQUFTLFNBQVMsQ0FBQyxHQUFHLElBQWU7SUFDbkMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNu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QUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEcsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDdkMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxTQUFTO1FBQ1QsTUFBTSxFQUFFLEtBQUs7UUFDYixXQUFXO1FBQ1gsU0FBUztRQUNULFVBQVU7UUFDVixZQUFZO1FBQ1osU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDM0MsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDbkMsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxlQUFlLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMzQyxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGNvZGVCdWlsZElkT2YsIHJlYWRCdWlsZENvbXB1dGUsIHJlYWRTeW50aEZhaWx1cmUgfSBmcm9tICcuL2ZhaWx1cmUtcmVhc29uLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U291cmNlLCByZXNvbHZlQ29tbWl0SW5mbyB9IGZyb20gJy4vc2NtLmpzJztcbmltcG9ydCB7IE1BWF9BVFRSLCByZXNvbHZlUGlwZWxpbmUgfSBmcm9tICcuL3RhZ3MuanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi91dGlsLmpzJztcblxuLy8gRXZlbnQgcGFyc2luZzogYW4gU1FTIHJlY29yZCDihpIgdGhlIG5vcm1hbGl6ZWQgcmVwb3J0aW5nIGV2ZW50LlxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHBsYXRmb3JtIG9yZ0lkIChmcm9tIHRoZSBwaXBlbGluZSdzIE9yZ0lkIHRhZzsgbnVsbCB3aGVuIHVudGFnZ2VkKS5cbiAgICogSU5URVJOQUwg4oCUIHVzZWQgb25seSB0byBrZXkgdGhlIHBlci1vcmcgR2l0SHViIHRva2VuIGFuZCB0byBhdHRyaWJ1dGVcbiAgICogaW5nZXN0LWhlYWx0aC4gU3RyaXBwZWQgZnJvbSB0aGUgcGF5bG9hZCBQT1NUZWQgdG8gL3JlcG9ydHMvZXZlbnRzICh3aGljaFxuICAgKiByZXNvbHZlcyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIG5vdCB0aGUgYm9keSkuXG4gICAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdGhlIGV2ZW50XG4gICAqICBjYXJyaWVzIG5vIHNvdXJjZSByZXZpc2lvbiDigJQgc3RvcmVkIE5VTEwgZG93bnN0cmVhbS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIGJyYW5jaC9yZWYgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdW5hdmFpbGFibGUuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIE9sZGVzdC11bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3RcbiAgICogIGRlcGxveSDigJQgcmVzb2x2ZWQgaW4tYWNjb3VudC4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcmVzb2x2ZWQgcmFuZ2UgKOKJpTEpLiBVbmRlZmluZWQgd2hlbiB1bnJlc29sdmFibGUuICovXG4gIGNvbW1pdENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGNvbXB1dGUgc2l6ZSBhIHRlcm1pbmFsIENvZGVCdWlsZCBhY3Rpb24gcmFuIG9uIChgU01BTExgIOKApiBgWDJfTEFSR0VgKSxcbiAgICogcmVhZCBmcm9tIEFXUy4gVW5kZWZpbmVkIGZvciBhIG5vbi1Db2RlQnVpbGQgYWN0aW9uLCBhIG5vbi10ZXJtaW5hbCBldmVudCxcbiAgICogb3Igd2hlbiB0aGUgcmVhZCBmYWlsZWQg4oCUIHRoZSBpbmdlc3QgdGhlbiByZWNvcmRzIHRoZSBhY3Rpb24gYXMgVU5NRUFTVVJFRFxuICAgKiByYXRoZXIgdGhhbiBhcyBmcmVlLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb3ZlcmFnZSBnYXAgdmlzaWJsZSBpbnN0ZWFkIG9mXG4gICAqIGxvb2tpbmcgbGlrZSBpZGxlbmVzcy5cbiAgICpcbiAgICogSXRzIG93biBmaWVsZCByYXRoZXIgdGhhbiBhIGBkZXRhaWxgIGtleSwgZm9yIHRoZSByZWFzb24gYGZhaWx1cmVgIGhhcyBvbmU6XG4gICAqIGBkZXRhaWxgIGlzIGJvdW5kZWQgYXQgOCBLQiBhbmQgYWxyZWFkeSBzaGVkcyBjb250ZW50IHVuZGVyIHRoYXQgYm91bmQsIHNvIGFcbiAgICogb25lLXdvcmQgZmllbGQgcmlkaW5nIGluc2lkZSBpdCBpcyBhIGZpZWxkIHRoYXQgY2FuIGJlIGRyb3BwZWQgYnkgYW5cbiAgICogdW5yZWxhdGVkIHBheWxvYWQgZ2V0dGluZyBsYXJnZS5cbiAgICovXG4gIGNvbXB1dGVUeXBlPzogc3RyaW5nO1xuICAvKiogRGVwbG95IGVudmlyb25tZW50IOKAlCBzZXQgb25seSB3aGVuIHRoZSBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgICogIHBpcGVsaW5lJ3MgYHBiLmRlcGxveXNgIHRhZy4gVW5kZWZpbmVkIG90aGVyd2lzZSAo4oeSIG5vdCBhIGRlcGxveSkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKiogVGhlIEV2ZW50QnJpZGdlIGV2ZW50IGBpZGAgKOKJpDEyOCkg4oCUIGxldHMgdGhlIHNlcnZlcidzIGF1ZGl0IHRyYWlsIG5hbWUgdGhlXG4gICAqICBleGFjdCBBV1MgZXZlbnQgYSByb3cgY2FtZSBmcm9tLiBVbmRlZmluZWQgd2hlbiB0aGUgYm9keSBjYXJyaWVzIG5vbmUuICovXG4gIHNvdXJjZUV2ZW50SWQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgU1FTIHJlY29yZCdzIG1lc3NhZ2VJZCAo4omkMTI4KSDigJQgdGhlIGRlbGl2ZXJ5IHRoYXQgY2FycmllZCB0aGUgZXZlbnQuICovXG4gIHNvdXJjZU1lc3NhZ2VJZD86IHN0cmluZztcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiBgc291cmNlRXZlbnRJZGAgLyBgc291cmNlTWVzc2FnZUlkYCDigJQgdGhlIHJlcG9ydGluZyBpbmdlc3QncyBtYXguICovXG5jb25zdCBNQVhfU09VUkNFX0lEID0gMTI4O1xuXG4vKiogQSBub24tZW1wdHkgc3RyaW5nIGNhcHBlZCB0byBgTUFYX1NPVVJDRV9JRGAsIGVsc2UgdW5kZWZpbmVkLiAqL1xuZnVuY3Rpb24gc291cmNlSWQodjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwID8gdi5zbGljZSgwLCBNQVhfU09VUkNFX0lEKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbi8qKiBIZWFkcm9vbSB1bmRlciB0aGUgcmVwb3J0aW5nIGluZ2VzdCdzIDggS0Igc2VyaWFsaXplZCBgZGV0YWlsYCBib3VuZC4gKi9cbmNvbnN0IE1BWF9ERVRBSUxfQllURVMgPSA3NTAwO1xuXG4vKiogRmlyc3Qgbm9uLWVtcHR5IHN0cmluZyBhbW9uZyB0aGUgY2FuZGlkYXRlcywgY2FwcGVkIHRvIHRoZSBpbmdlc3QgbWF4LiAqL1xuZnVuY3Rpb24gZmlyc3RBdHRyKC4uLnZhbHM6IHVua25vd25bXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdiBvZiB2YWxzKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDApIHJldHVybiB2LnNsaWNlKDAsIE1BWF9BVFRSKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGV4dHJhY3Rpb24gb2YgdGhlIHNvdXJjZSBjb21taXQgaWQgKyByZWYgKGFuZCB0aGUgcmV2aXNpb24gVVJMLCB1c2VkXG4gKiBvbmx5IGluLWFjY291bnQgdG8gY2xhc3NpZnkgdGhlIHNvdXJjZSB0eXBlIGZvciBjb21taXQtcmFuZ2UgcmVzb2x1dGlvbikgZnJvbSBhXG4gKiBDb2RlUGlwZWxpbmUgZXZlbnQgZGV0YWlsLiBDb2RlUGlwZWxpbmUgc3VyZmFjZXMgdGhlIHNvdXJjZSByZXZpc2lvbiB1bmRlciBhIGZld1xuICogc2hhcGVzIGRlcGVuZGluZyBvbiB0aGUgZXZlbnQgdHlwZSAvIHNvdXJjZS1hY3Rpb247IHdlIGNoZWNrIHRoZSBrbm93biBvbmVzIGFuZFxuICogbGVhdmUgdGhlIGZpZWxkcyB1bmRlZmluZWQgd2hlbiBub25lIGFyZSBwcmVzZW50IChOVUxMIGRvd25zdHJlYW0pLiBOZXZlciBwdWxscyBhblxuICogQVJOL2FjY291bnQgaWQ6IG9ubHkgcmV2aXNpb24vYnJhbmNoL3VybCBzdHJpbmcgZmllbGRzIGFyZSByZWFkOyB0aGUgcmV2aXNpb25VcmxcbiAqIGlzIGNvbnN1bWVkIGluLWFjY291bnQgKHNvdXJjZSBjbGFzc2lmaWNhdGlvbikgYW5kIG5ldmVyIGZvcndhcmRlZCBvbiBpdHMgb3duLlxuICovXG5mdW5jdGlvbiBleHRyYWN0Q29tbWl0KGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7IGNvbW1pdFNoYT86IHN0cmluZzsgY29tbWl0UmVmPzogc3RyaW5nOyByZXZpc2lvblVybD86IHN0cmluZyB9IHtcbiAgLy8gYHNvdXJjZS1yZXZpc2lvbnNgIChrZWJhYiwgRXZlbnRCcmlkZ2UpIC8gYHNvdXJjZVJldmlzaW9uc2AgKGNhbWVsKSDigJQgZmlyc3QgZW50cnkuXG4gIGNvbnN0IHJldnMgPSAoZGV0YWlsWydzb3VyY2UtcmV2aXNpb25zJ10gPz8gZGV0YWlsLnNvdXJjZVJldmlzaW9ucykgYXNcbiAgICB8IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZmlyc3RSZXYgPSBBcnJheS5pc0FycmF5KHJldnMpID8gcmV2c1swXSA6IHVuZGVmaW5lZDtcbiAgLy8gT24gc291cmNlIGFjdGlvbnMgdGhlIHJldmlzaW9uIGlkIGNhbiBhbHNvIHJpZGUgb24gYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCBleGVjUmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29tbWl0U2hhID0gZmlyc3RBdHRyKFxuICAgIGRldGFpbC5jb21taXRJZCxcbiAgICBkZXRhaWwucmV2aXNpb25JZCxcbiAgICBmaXJzdFJldj8ucmV2aXNpb25JZCxcbiAgICBleGVjUmVzdWx0Py5yZXZpc2lvbklkLFxuICApO1xuICBjb25zdCBjb21taXRSZWYgPSBmaXJzdEF0dHIoXG4gICAgZGV0YWlsLmNvbW1pdFJlZixcbiAgICBkZXRhaWwuYnJhbmNoLFxuICAgIGRldGFpbC5zb3VyY2VCcmFuY2gsXG4gICAgZmlyc3RSZXY/LmJyYW5jaE5hbWUsXG4gICAgZmlyc3RSZXY/LmJyYW5jaCxcbiAgKTtcbiAgY29uc3QgcmV2aXNpb25VcmwgPSB0eXBlb2YgZmlyc3RSZXY/LnJldmlzaW9uVXJsID09PSAnc3RyaW5nJyA/IGZpcnN0UmV2LnJldmlzaW9uVXJsIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7IC4uLihjb21taXRTaGEgJiYgeyBjb21taXRTaGEgfSksIC4uLihjb21taXRSZWYgJiYgeyBjb21taXRSZWYgfSksIC4uLihyZXZpc2lvblVybCAmJiB7IHJldmlzaW9uVXJsIH0pIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsIHNvXG4gIC8vIHBhcnNlUmVjb3JkIGRyb3BzIHRoZW0gb24gdGhlIGBldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZSdgIGNoZWNrIGJlbG93IOKAlFxuICAvLyB0aGUgJ0JVSUxEJyBldmVudFR5cGUgaXMgbmV2ZXIgcGVyc2lzdGVkIGhlcmUgKHBsdWdpbiBCVUlMRCBldmVudHMgYXJlXG4gIC8vIHJlY29yZGVkIGRpcmVjdGx5IGJ5IHRoZSBwbHVnaW4gc2VydmljZSkuIFRoZSAnY29kZWJ1aWxkJyBzb3VyY2UgaXMgd2hhdFxuICAvLyByb3V0ZXMgdGhlIGRyb3A7IGtlZXAgdGhpcyBicmFuY2ggb25seSBmb3IgdGhhdC5cbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0J1aWxkIFN0YXRlJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0JVSUxEJywgZXZlbnRTb3VyY2U6ICdjb2RlYnVpbGQnIH07XG4gIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG59XG5cbi8qKiBQYXJzZSArIHJlc29sdmUgb25lIHJlY29yZCB0byBhIHJlcG9ydGFibGUgZXZlbnQsIG9yIG51bGwgdG8gc2tpcCBpdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVJlY29yZChyZWNvcmQ6IFNRU1JlY29yZCk6IFByb21pc2U8UGFyc2VkRXZlbnQgfCBudWxsPiB7XG4gIGxldCBldmVudDoge1xuICAgICdpZCc/OiBzdHJpbmc7XG4gICAgJ2RldGFpbC10eXBlJzogc3RyaW5nO1xuICAgICdzb3VyY2UnOiBzdHJpbmc7XG4gICAgJ2RldGFpbCc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICd0aW1lJzogc3RyaW5nO1xuICAgICdyZWdpb24nOiBzdHJpbmc7XG4gICAgJ2FjY291bnQnOiBzdHJpbmc7XG4gIH07XG4gIC8vIEEgbWFsZm9ybWVkIGJvZHkgaXMgYSBkZWFkIG1lc3NhZ2UgKHJldHJ5aW5nIHdvbid0IGhlbHApIOKAlCBsb2cgKyBza2lwIGl0IHNvXG4gIC8vIGl0IGNhbid0IGZhaWwgdGhlIHdob2xlIGJhdGNoLiBSZXNvbHV0aW9uIGVycm9ycyBiZWxvdyAoZS5nLiBBY2Nlc3NEZW5pZWQpXG4gIC8vIGFyZSBOT1QgY2F1Z2h0IGhlcmU6IHRob3NlIGFyZSB0cmFuc2llbnQvaW5mcmEgYW5kIG11c3QgcHJvcGFnYXRlIHRvIHJldHJ5LlxuICB0cnkge1xuICAgIGV2ZW50ID0gSlNPTi5wYXJzZShyZWNvcmQuYm9keSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBTUVMgcmVjb3JkIHdpdGggdW5wYXJzZWFibGUgYm9keScsIHsgbWVzc2FnZUlkOiByZWNvcmQubWVzc2FnZUlkLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIHBpcGVsaW5lIGlkLCBzbyBza2lwIHRoZW0uXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIHBiLnBpcGVsaW5lLWlkICg9IHBsYXRmb3JtIHBpcGVsaW5lSWQpICsgcGIuZGVwbG95cyBtYXAuXG4gIC8vIFRoZSBBUk4gaXMgb25seSBhIHRyYW5zaWVudCBoYW5kbGUgZm9yIHRoZSB0YWcgbG9va3VwOyBpdCBpcyBuZXZlciBzdG9yZWQuXG4gIGNvbnN0IGFybiA9IGBhcm46YXdzOmNvZGVwaXBlbGluZToke2V2ZW50LnJlZ2lvbn06JHtldmVudC5hY2NvdW50fToke3BpcGVsaW5lTmFtZX1gO1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzIH0gPSBhd2FpdCByZXNvbHZlUGlwZWxpbmUoYXJuLCBldmVudC5yZWdpb24pO1xuICBpZiAoIXBpcGVsaW5lSWQpIHJldHVybiBudWxsOyAvLyB1bnRhZ2dlZCAvIHVucmVnaXN0ZXJlZCDihpIgc2tpcFxuXG4gIC8vIEFXUyBkb2VzIG5vdCBhbHdheXMgc2VuZCBgc3RhcnQtdGltZWAuIGBldmVudC50aW1lYCBzdGFuZHMgaW4gZm9yIGl0IHNvIHRoZVxuICAvLyByb3cgc3RpbGwgbGFuZHMgaW4gdGhlIHJlcG9ydCB3aW5kb3dzLCB3aGljaCBmaWx0ZXIgb24gYHN0YXJ0ZWRfYXRgIOKAlCBidXQgaXRcbiAgLy8gaXMgTk9UIGEgbWVhc3VyZW1lbnQsIGFuZCB0aGUgZHVyYXRpb24gYmVsb3cgbXVzdCBub3QgYmUgY29tcHV0ZWQgZnJvbSBpdC5cbiAgY29uc3QgZGVjbGFyZWRTdGFydCA9IGRldGFpbFsnc3RhcnQtdGltZSddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gZGVjbGFyZWRTdGFydCB8fCBldmVudC50aW1lO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbC5zdGF0ZSBhcyBzdHJpbmc7XG5cbiAgbGV0IGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJ10uaW5jbHVkZXMoc3RhdGUpKSB7XG4gICAgY29tcGxldGVkQXQgPSBldmVudC50aW1lO1xuICAgIC8vIE9OTFkgZnJvbSBhIHN0YXJ0IEFXUyBhY3R1YWxseSBkZWNsYXJlZC4gV2l0aCB0aGUgZmFsbGJhY2ssIGBzdGFydGVkQXRgIGFuZFxuICAgIC8vIGBjb21wbGV0ZWRBdGAgYXJlIGJvdGggYGV2ZW50LnRpbWVgIG9uIGEgdGVybWluYWwgZXZlbnQsIHNvIHRoZSBkdXJhdGlvbiBjYW1lXG4gICAgLy8gb3V0IGFzIGV4YWN0bHkgMCDigJQgcmVwb3J0ZWQgYXMgYSByZWFsIG1lYXN1cmVtZW50LCBkcmFnZ2luZyBldmVyeSBhdmVyYWdlIGFuZFxuICAgIC8vIHA5NSBzdGFnZSBkdXJhdGlvbiB0b3dhcmQgemVybyB3aXRoIG5vIHNpZ24gYW55dGhpbmcgd2FzIG1pc3NpbmcuIFVua25vd24gaXNcbiAgICAvLyBsZWZ0IHVua25vd24gKE5VTEwpLCB3aGljaCB0aGUgcmVwb3J0cyBhbHJlYWR5IGhhbmRsZS5cbiAgICBpZiAoZGVjbGFyZWRTdGFydCkge1xuICAgICAgY29uc3QgbXMgPSBuZXcgRGF0ZShjb21wbGV0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoZGVjbGFyZWRTdGFydCkuZ2V0VGltZSgpO1xuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShtcykgJiYgbXMgPj0gMCkgZHVyYXRpb25NcyA9IG1zO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb21vdGUgdGhlIGZhaWx1cmUgcmVhc29uIHRvIGEgdHlwZWQgZmllbGQuIE9uIEFjdGlvbiBldmVudHMgQVdTIHB1dHMgdGhlXG4gIC8vIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgKGFuZCBhIGxvZyBVUkwgKyBlcnJvci1jb2RlLCB3aGljaCBzdGF5IGluIGBkZXRhaWxgKVxuICAvLyB1bmRlciBgZXhlY3V0aW9uLXJlc3VsdGAuXG4gIGNvbnN0IHJlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIHsgJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5Jz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VtbWFyeSA9IHJlc3VsdD8uWydleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSddO1xuICBsZXQgZXJyb3JNZXNzYWdlID0gdHlwZW9mIHN1bW1hcnkgPT09ICdzdHJpbmcnICYmIHN1bW1hcnkubGVuZ3RoID4gMFxuICAgID8gc3VtbWFyeS5zbGljZSgwLCBNQVhfRVJST1JfTUVTU0FHRSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIGZhaWxlZCBDb2RlQnVpbGQgYWN0aW9uIG1heSBoYXZlIHByaW50ZWQgYSBzdHJ1Y3R1cmVkIHJlYXNvbiAodGhlIHN5bnRoJ3NcbiAgLy8gYFBCX1NZTlRIX0ZBSUxVUkVgIGxpbmUg4oCUIGEgcmVmdXNlZCBwbHVnaW4sIHdpdGggaXRzIGNvZGUpLiBDb2RlQnVpbGQnc1xuICAvLyBzdW1tYXJ5IG5ldmVyIGNhcnJpZXMgdGhlIGJ1aWxkIG91dHB1dCwgc28gcmVhZCBpdCBmcm9tIHRoZSBidWlsZCdzIGxvZyBhbmRcbiAgLy8gcHJvbW90ZSBpdDogdGhlIGNvZGUgKyBtZXNzYWdlIGJlY29tZSB0aGUgZmFpbHVyZSByZWFzb24sIHRoZSBwZXItcGx1Z2luXG4gIC8vIGxpc3QgcmlkZXMgaW4gYGRldGFpbC5wYkZhaWx1cmVgLiBCZXN0LWVmZm9ydCAoc2VlIGZhaWx1cmUtcmVhc29uLnRzKS5cbiAgLy8gVGhlIGNvbXB1dGUgc2l6ZSB0aGlzIGFjdGlvbiByYW4gb24sIGZvciB0aGUgdkNQVS1taW51dGUgZmlndXJlIFBoYXNlIDRcbiAgLy8gbWVhc3VyZXMuIE9ubHkgb24gYSBURVJNSU5BTCBDb2RlQnVpbGQgYWN0aW9uOiBhbiBpbi1wcm9ncmVzcyBldmVudCBoYXMgbm9cbiAgLy8gZHVyYXRpb24gdG8gcGFpciBpdCB3aXRoLCBzbyByZWFkaW5nIGl0IHRoZXJlIHdvdWxkIHNwZW5kIGFuIEFXUyBjYWxsIHRvXG4gIC8vIGxlYXJuIG5vdGhpbmcuIEJlc3QtZWZmb3J0IOKAlCBudWxsIGZvcndhcmRzIHdpdGhvdXQgdGhlIGZpZWxkLlxuICBsZXQgY29tcHV0ZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGV2ZW50VHlwZSA9PT0gJ0FDVElPTicgJiYgWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb25zdCBjYklkID0gY29kZUJ1aWxkSWRPZihkZXRhaWwpO1xuICAgIGNvbXB1dGVUeXBlID0gKGNiSWQgPyBhd2FpdCByZWFkQnVpbGRDb21wdXRlKGV2ZW50LnJlZ2lvbiwgY2JJZCkgOiBudWxsKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoZXZlbnRUeXBlID09PSAnQUNUSU9OJyAmJiBzdGF0ZSA9PT0gJ0ZBSUxFRCcpIHtcbiAgICBjb25zdCBidWlsZElkID0gY29kZUJ1aWxkSWRPZihkZXRhaWwpO1xuICAgIGNvbnN0IGZhaWx1cmUgPSBidWlsZElkID8gYXdhaXQgcmVhZFN5bnRoRmFpbHVyZShldmVudC5yZWdpb24sIGJ1aWxkSWQpIDogbnVsbDtcbiAgICBpZiAoZmFpbHVyZSkge1xuICAgICAgZGV0YWlsLnBiRmFpbHVyZSA9IGZhaWx1cmU7XG4gICAgICAvLyBUaGUgaW5nZXN0IGJvdW5kcyBgZGV0YWlsYCBhdCA4IEtCIHNlcmlhbGl6ZWQ7IGtlZXAgdGhlIGNvZGVzLCBkcm9wIHRoZVxuICAgICAgLy8gcGVyLXBsdWdpbiBwcm9zZSBpZiB0aGUgd2hvbGUgdGhpbmcgd291bGQgbm90IGZpdC5cbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShkZXRhaWwpLmxlbmd0aCA+PSBNQVhfREVUQUlMX0JZVEVTKSB7XG4gICAgICAgIGRldGFpbC5wYkZhaWx1cmUgPSB7IC4uLmZhaWx1cmUsIHBsdWdpbnM6IGZhaWx1cmUucGx1Z2lucy5tYXAoKHsgcGx1Z2luLCBjb2RlIH0pID0+ICh7IHBsdWdpbiwgY29kZSB9KSkgfTtcbiAgICAgIH1cbiAgICAgIGVycm9yTWVzc2FnZSA9IGAke2ZhaWx1cmUuY29kZX06ICR7ZmFpbHVyZS5tZXNzYWdlfWAuc2xpY2UoMCwgTUFYX0VSUk9SX01FU1NBR0UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEF1ZGl0IGNvcnJlbGF0aW9uIGJhY2sgdG8gdGhlIEFXUyBzaWRlOiB3aGljaCBFdmVudEJyaWRnZSBldmVudCwgY2FycmllZCBieVxuICAvLyB3aGljaCBTUVMgZGVsaXZlcnkuIEJvdGggYXJlIG9wYXF1ZSBpZHMgKG5vIEFSTiwgbm8gYWNjb3VudCkuXG4gIGNvbnN0IHNvdXJjZUV2ZW50SWQgPSBzb3VyY2VJZChldmVudC5pZCk7XG4gIGNvbnN0IHNvdXJjZU1lc3NhZ2VJZCA9IHNvdXJjZUlkKHJlY29yZC5tZXNzYWdlSWQpO1xuXG4gIC8vIERPUkEgZGVwbG95IGF0dHJpYnV0aW9uIOKAlCBhbGwgb3B0aW9uYWw6IG9taXR0ZWQgKHVuZGVmaW5lZCkgd2hlbiB0aGVcbiAgLy8gZXZlbnQvcGlwZWxpbmUgZG9lc24ndCBjYXJyeSB0aGVtLlxuICBjb25zdCB7IGNvbW1pdFNoYSwgY29tbWl0UmVmLCByZXZpc2lvblVybCB9ID0gZXh0cmFjdENvbW1pdChkZXRhaWwpO1xuXG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZGV0YWlsWydleGVjdXRpb24taWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YWdlTmFtZSA9IGRldGFpbC5zdGFnZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBkZXRhaWwuYWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFbnZpcm9ubWVudCAo4oeSIGlzRGVwbG95KSBpcyBzZXQgT05MWSB3aGVuIHRoaXMgZXZlbnQncyBzdGFnZSBpcyBsaXN0ZWQgaW4gdGhlXG4gIC8vIHBpcGVsaW5lJ3MgcGIuZGVwbG95cyB0YWcuIFBJUEVMSU5FIGV2ZW50cyBoYXZlIG5vIHN0YWdlIOKGkiBuZXZlciBhIGRlcGxveS5cbiAgY29uc3QgZW52aXJvbm1lbnQgPSBzdGFnZU5hbWUgPyBkZXBsb3lzLmdldChzdGFnZU5hbWUpIDogdW5kZWZpbmVkO1xuXG4gIC8vIFJlc29sdmUgdGhlIGNvbW1pdCByYW5nZSAob2xkZXN0LXVuc2hpcHBlZCB0aW1lc3RhbXAgKyBjb3VudCkgZm9yIGFueVxuICAvLyBldmVudCBjYXJyeWluZyBhIGNvbW1pdC4gQmVzdC1lZmZvcnQvaW4tYWNjb3VudDsgb21pdHRlZCBvbiBhbnkgZmFpbHVyZS5cbiAgLy8gR0FURUQgb24gYERPUkFfRU5BQkxFRGAgKHNldCBieSBgc2V0dXAtZXZlbnRzIC0td2l0aC1kb3JhYCk6IERPUkEgbGVhZCB0aW1lIGlzIGFuXG4gIC8vIGFkdmFuY2VkX3JlcG9ydGluZyBhZGQtb24sIHNvIG9yZ3Mgd2l0aG91dCBpdCBza2lwIHRoZSBTQ00vc2VjcmV0IGNvc3QgZW50aXJlbHkg4oCUXG4gIC8vIHN0YW5kYXJkIHJlcG9ydGluZyAoY29tbWl0U2hhICsgYWxsIG90aGVyIGZpZWxkcykgc3RpbGwgZm9yd2FyZHMgcmVnYXJkbGVzcy5cbiAgbGV0IGNvbW1pdFRpbWVzdGFtcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tbWl0Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWYgKGNvbW1pdFNoYSAmJiBwcm9jZXNzLmVudi5ET1JBX0VOQUJMRUQgPT09ICd0cnVlJykge1xuICAgIGNvbnN0IHNyYyA9IGNsYXNzaWZ5U291cmNlKHJldmlzaW9uVXJsKTtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUNvbW1pdEluZm8ocGlwZWxpbmVJZCwgb3JnSWQsIGV2ZW50LnJlZ2lvbiwgeyBzaGE6IGNvbW1pdFNoYSwgLi4uc3JjIH0pO1xuICAgIGNvbW1pdFRpbWVzdGFtcCA9IGluZm8uY29tbWl0VGltZXN0YW1wO1xuICAgIGNvbW1pdENvdW50ID0gaW5mby5jb21taXRDb3VudDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3JnSWQsXG4gICAgcGlwZWxpbmVJZCxcbiAgICBldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGUsXG4gICAgc3RhdHVzOiBzdGF0ZSxcbiAgICBleGVjdXRpb25JZCxcbiAgICBzdGFnZU5hbWUsXG4gICAgYWN0aW9uTmFtZSxcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgLi4uKGNvbW1pdFNoYSAmJiB7IGNvbW1pdFNoYSB9KSxcbiAgICAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pLFxuICAgIC4uLihjb21taXRUaW1lc3RhbXAgJiYgeyBjb21taXRUaW1lc3RhbXAgfSksXG4gICAgLi4uKGNvbW1pdENvdW50ICYmIHsgY29tbWl0Q291bnQgfSksXG4gICAgLi4uKGVudmlyb25tZW50ICYmIHsgZW52aXJvbm1lbnQgfSksXG4gICAgLi4uKGNvbXB1dGVUeXBlICYmIHsgY29tcHV0ZVR5cGUgfSksXG4gICAgLi4uKHNvdXJjZUV2ZW50SWQgJiYgeyBzb3VyY2VFdmVudElkIH0pLFxuICAgIC4uLihzb3VyY2VNZXNzYWdlSWQgJiYgeyBzb3VyY2VNZXNzYWdlSWQgfSksXG4gICAgZGV0YWlsLFxuICB9O1xufVxuIl19
package/lib/tags.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { BoundedMap, CACHE_MAX_ENTRIES, log } from './util.js';
3
+ import { arnRef, BoundedMap, CACHE_MAX_ENTRIES, log } from './util.js';
4
4
  let codepipelineMod;
5
5
  async function loadCodePipeline() {
6
6
  if (!codepipelineMod)
@@ -13,8 +13,8 @@ async function loadCodePipeline() {
13
13
  // pb.deploys = <stage>:<env> pairs joined by '+', e.g.
14
14
  // "Deploy-stg:staging+Deploy-prod:production"
15
15
  // We resolve those tags from the live CodePipeline (region-aware). The ARN/account
16
- // never leave AWS, so there's no masking. Cached per ARN (warm-container) to avoid
17
- // hammering the ListTags API.
16
+ // never leave AWS, and never reach a log line either: logs carry `arnRef(arn)`, a
17
+ // short digest. Cached per ARN (warm-container) to avoid hammering the ListTags API.
18
18
  //
19
19
  // Requires the Lambda execution role to allow `codepipeline:ListTagsForResource`.
20
20
  // AccessDenied is a config error (alert loudly); a missing pb.pipeline-id tag is
@@ -89,7 +89,7 @@ export async function resolvePipeline(arn, region) {
89
89
  const orgId = out.tags?.find(t => t.key === ORG_ID_TAG)?.value ?? null;
90
90
  const deploys = parseDeploys(out.tags?.find(t => t.key === DEPLOYS_TAG)?.value);
91
91
  if (!pipelineId)
92
- log.warn('Pipeline missing pb.pipeline-id tag — skipping (register it?)', { arn });
92
+ log.warn('Pipeline missing pb.pipeline-id tag — skipping (register it?)', { pipeline: arnRef(arn) });
93
93
  resolvedByArn.set(arn, { pipelineId, orgId, deploys, ts: Date.now() });
94
94
  return { pipelineId, orgId, deploys };
95
95
  }
@@ -97,7 +97,7 @@ export async function resolvePipeline(arn, region) {
97
97
  const name = err?.name;
98
98
  if (name === 'AccessDeniedException') {
99
99
  // Don't cache — this is a fixable misconfig, not a property of the pipeline.
100
- log.error('AccessDenied calling codepipeline:ListTagsForResource — grant it to the Lambda role', { arn, error: name });
100
+ log.error('AccessDenied calling codepipeline:ListTagsForResource — grant it to the Lambda role', { pipeline: arnRef(arn), error: name });
101
101
  throw err;
102
102
  }
103
103
  // Transient/infra errors (throttling, timeouts, 5xx) MUST propagate so the SQS
@@ -111,10 +111,10 @@ export async function resolvePipeline(arn, region) {
111
111
  || (typeof status === 'number' && status >= 500)
112
112
  || /throttl|timeout|toomanyrequests|serviceunavailable|econnreset|networkingerror/i.test(name ?? '');
113
113
  if (retryable) {
114
- log.error('Transient error resolving pb.pipeline-id tag — will retry the batch', { arn, error: name ?? String(err) });
114
+ log.error('Transient error resolving pb.pipeline-id tag — will retry the batch', { pipeline: arnRef(arn), error: name ?? String(err) });
115
115
  throw err;
116
116
  }
117
- log.error('Failed to resolve pb.pipeline-id tag', { arn, error: name ?? String(err) });
117
+ log.error('Failed to resolve pb.pipeline-id tag', { pipeline: arnRef(arn), error: name ?? String(err) });
118
118
  return { pipelineId: null, orgId: null, deploys: new Map() };
119
119
  }
120
120
  }
@@ -122,4 +122,4 @@ export async function resolvePipeline(arn, region) {
122
122
  export function _resetTagsForTests() {
123
123
  resolvedByArn.clear();
124
124
  }
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZL0QsSUFBSSxlQUErQyxDQUFDO0FBQ3BELEtBQUssVUFBVSxnQkFBZ0I7SUFDN0IsSUFBSSxDQUFDLGVBQWU7UUFBRSxlQUFlLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFrQyxDQUFDO0lBQ3hILE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsMENBQTBDO0FBQzFDLDJDQUEyQztBQUMzQyw2REFBNkQ7QUFDN0QsaUVBQWlFO0FBQ2pFLG1GQUFtRjtBQUNuRixtRkFBbUY7QUFDbkYsOEJBQThCO0FBQzlCLEVBQUU7QUFDRixrRkFBa0Y7QUFDbEYsaUZBQWlGO0FBQ2pGLDBDQUEwQztBQUUxQyxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztBQUN6QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDakMsZ0ZBQWdGO0FBQ2hGLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztBQUMzQixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztBQUdsRSwwRUFBMEU7QUFDMUUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sYUFBYSxHQUFHLElBQUksVUFBVSxDQUF3RyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9KLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElB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LENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUM7ZUFDN0MsZ0ZBQWdGLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxxRUFBcUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEgsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQy9ELENBQUM7QUFDSCxDQUFDO0FBRUQsc0RBQXNEO0FBQ3RELE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQm91bmRlZE1hcCwgQ0FDSEVfTUFYX0VOVFJJRVMsIGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIEFXUyBMYW1iZGEncyBOb2RlIHJ1bnRpbWUgcHJvdmlkZXMgQGF3cy1zZGsgdjMsIHNvIHRoZSBDb2RlUGlwZWxpbmUgY2xpZW50IGlzXG4vLyBsb2FkZWQgbGF6aWx5IHZpYSBkeW5hbWljIGltcG9ydCgpIOKAlCBhIHN0YXRpYyB3b3Jrc3BhY2UgZGVwZW5kZW5jeSB3b3VsZFxuLy8gcGVydHVyYiB0aGUgc2hhcmVkIEBhd3Mtc2RrIHZlcnNpb24gdHJlZS4gTWluaW1hbCBsb2NhbCB0eXBlcyBrZWVwIHRoZSBjYWxsXG4vLyBzaXRlcyB0eXBlLWNoZWNrZWQuXG5pbnRlcmZhY2UgTGlzdFRhZ3NPdXRwdXQgeyB0YWdzPzogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTxMaXN0VGFnc091dHB1dD4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZU1vZHVsZSB7XG4gIENvZGVQaXBlbGluZUNsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gQ29kZVBpcGVsaW5lQ2xpZW50TGlrZTtcbiAgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgcmVzb3VyY2VBcm46IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IGNvZGVwaXBlbGluZU1vZDogQ29kZVBpcGVsaW5lTW9kdWxlIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvZGVQaXBlbGluZSgpOiBQcm9taXNlPENvZGVQaXBlbGluZU1vZHVsZT4ge1xuICBpZiAoIWNvZGVwaXBlbGluZU1vZCkgY29kZXBpcGVsaW5lTW9kID0gKGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZScpKSBhcyB1bmtub3duIGFzIENvZGVQaXBlbGluZU1vZHVsZTtcbiAgcmV0dXJuIGNvZGVwaXBlbGluZU1vZDtcbn1cblxuLy8gVGFnIHJlc29sdXRpb246IHBiLnBpcGVsaW5lLWlkICsgcGIuZGVwbG95cy5cbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGF0IENESyBzeW50aCB3aXRoOlxuLy8gICBwYi5waXBlbGluZS1pZCA9IDxwbGF0Zm9ybSBwaXBlbGluZUlkPlxuLy8gICBwYi5kZXBsb3lzICAgICA9IDxzdGFnZT46PGVudj4gcGFpcnMgam9pbmVkIGJ5ICcrJywgZS5nLlxuLy8gICAgICAgICAgICAgICAgICAgIFwiRGVwbG95LXN0ZzpzdGFnaW5nK0RlcGxveS1wcm9kOnByb2R1Y3Rpb25cIlxuLy8gV2UgcmVzb2x2ZSB0aG9zZSB0YWdzIGZyb20gdGhlIGxpdmUgQ29kZVBpcGVsaW5lIChyZWdpb24tYXdhcmUpLiBUaGUgQVJOL2FjY291bnRcbi8vIG5ldmVyIGxlYXZlIEFXUywgc28gdGhlcmUncyBubyBtYXNraW5nLiBDYWNoZWQgcGVyIEFSTiAod2FybS1jb250YWluZXIpIHRvIGF2b2lkXG4vLyBoYW1tZXJpbmcgdGhlIExpc3RUYWdzIEFQSS5cbi8vXG4vLyBSZXF1aXJlcyB0aGUgTGFtYmRhIGV4ZWN1dGlvbiByb2xlIHRvIGFsbG93IGBjb2RlcGlwZWxpbmU6TGlzdFRhZ3NGb3JSZXNvdXJjZWAuXG4vLyBBY2Nlc3NEZW5pZWQgaXMgYSBjb25maWcgZXJyb3IgKGFsZXJ0IGxvdWRseSk7IGEgbWlzc2luZyBwYi5waXBlbGluZS1pZCB0YWcgaXNcbi8vIHRyZWF0ZWQgYXMgXCJub3QgeWV0IHJlZ2lzdGVyZWRcIiAoc2tpcCkuXG5cbmNvbnN0IFBJUEVMSU5FX0lEX1RBRyA9ICdwYi5waXBlbGluZS1pZCc7XG5jb25zdCBERVBMT1lTX1RBRyA9ICdwYi5kZXBsb3lzJztcbi8vIENhbm9uaWNhbCBwZXItcGlwZWxpbmUgb3JnIHRhZyAoYXBwbGllZCBhdCBzeW50aCBieSBwaXBlbGluZS1jb3JlKS4gSXQgaXMgdGhlXG4vLyBSRVNPTFZFRCBvcmcgZm9yIGV2ZXJ5IGV2ZW50IG9mIHRoaXMgcGlwZWxpbmUg4oCUIHVzZWQgdG8ga2V5IHRoZSBwZXItb3JnIEdpdEh1YlxuLy8gdG9rZW4gYW5kIHRvIGF0dHJpYnV0ZSBpbmdlc3QtaGVhbHRoLiBvcmdJZCBpcyBhIHBsYXRmb3JtIGlkLCBuZXZlciBhbiBBV1Ncbi8vIGFjY291bnQgaWQsIHNvIGl0IGlzIHNhZmUgdG8gcmVhZC9mb3J3YXJkLlxuY29uc3QgT1JHX0lEX1RBRyA9ICdPcmdJZCc7XG5jb25zdCBjbGllbnRzQnlSZWdpb24gPSBuZXcgTWFwPHN0cmluZywgQ29kZVBpcGVsaW5lQ2xpZW50TGlrZT4oKTtcblxuXG4vLyBgdHNgIGxldHMgQk9USCBvdXRjb21lcyBleHBpcmU6IGEgbmVnYXRpdmUgKHJlc29sdmVkLWJ1dC11bnRhZ2dlZCkgc28gYVxuLy8gcGlwZWxpbmUgdGFnZ2VkIEFGVEVSIGl0cyBmaXJzdCBldmVudCBiZWNvbWVzIHJlc29sdmFibGUsIGFuZCBhIHBvc2l0aXZlIHNvIGFcbi8vIHJlLXN5bnRoIHRoYXQgY2hhbmdlcyBgcGIuZGVwbG95c2AgKGEgc3RhZ2UgcmVuYW1lZCwgYW4gZW52aXJvbm1lbnQgYWRkZWQpIG9yXG4vLyBgT3JnSWRgIGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlY3ljbGluZyB0aGUgd2FybSBjb250YWluZXIg4oCUIGEgbGlmZXRpbWUgY2FjaGVcbi8vIHdvdWxkIGtlZXAgYXR0cmlidXRpbmcgZGVwbG95cyB0byBzdGFnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuXG5jb25zdCByZXNvbHZlZEJ5QXJuID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCB7IHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7IG9yZ0lkOiBzdHJpbmcgfCBudWxsOyBkZXBsb3lzOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyB0czogbnVtYmVyIH0+KENBQ0hFX01BWF9FTlRSSUVTKTtcbmNvbnN0IE5FR19DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgUE9TX0NBQ0hFX1RUTF9NUyA9IDE1ICogNjAgKiAxMDAwO1xuXG4vKiogUmVzb2x2ZWQgcGlwZWxpbmUgbWV0YWRhdGEgcmVhZCBmcm9tIHRoZSBDb2RlUGlwZWxpbmUgcmVzb3VyY2UgdGFncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQaXBlbGluZSB7XG4gIC8qKiBQbGF0Zm9ybSBwaXBlbGluZUlkIChwYi5waXBlbGluZS1pZCB0YWcpOyBudWxsIHdoZW4gdW50YWdnZWQvdW5yZWdpc3RlcmVkLiAqL1xuICBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogUGxhdGZvcm0gb3JnSWQgKE9yZ0lkIHRhZyk7IG51bGwgd2hlbiB0aGUgcGlwZWxpbmUgY2FycmllcyBubyBvcmcgdGFnLiAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIE1hcCBvZiBkZXBsb3ktc3RhZ2UgbmFtZSDihpIgZW52aXJvbm1lbnQgKHBhcnNlZCBmcm9tIHBiLmRlcGxveXMpLiBFbXB0eSB3aGVuIG5vbmUuICovXG4gIGRlcGxveXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKiBDYXAgb24gY29tbWl0L3JlZi9lbnZpcm9ubWVudCBmaWVsZHMg4oCUIHRoZSBpbmdlc3QgY29udHJhY3QgYWxsb3dzIG1heCAyNTUuICovXG5leHBvcnQgY29uc3QgTUFYX0FUVFIgPSAyNTU7XG5cbi8qKlxuICogUGFyc2UgdGhlIGBwYi5kZXBsb3lzYCB0YWcgdmFsdWUgaW50byBhIHN0YWdl4oaSZW52aXJvbm1lbnQgbWFwLiBUaGUgdmFsdWUgaXNcbiAqIGA8c3RhZ2U+OjxlbnY+YCBwYWlycyBqb2luZWQgYnkgYCtgIChDb2RlUGlwZWxpbmUtdGFnLXNhZmU7IG5vIEpTT04pLiBBIHN0YWdlXG4gKiBwcmVzZW50IGhlcmUgaXMgYSBkZXBsb3k7IGl0cyBtYXBwZWQgZW52aXJvbm1lbnQgaXMgd2hhdCB0aGUgZm9yd2FyZGVyIHN0YW1wcyBvblxuICogdGhhdCBzdGFnZSdzIFNUQUdFL0FDVElPTiBldmVudHMgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gTWFsZm9ybWVkIHBhaXJzIGFyZVxuICogc2tpcHBlZCBkZWZlbnNpdmVseS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VEZXBsb3lzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG1hcDtcbiAgZm9yIChjb25zdCBwYWlyIG9mIHZhbHVlLnNwbGl0KCcrJykpIHtcbiAgICBjb25zdCBpZHggPSBwYWlyLmluZGV4T2YoJzonKTtcbiAgICBpZiAoaWR4IDw9IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN0YWdlID0gcGFpci5zbGljZSgwLCBpZHgpLnRyaW0oKTtcbiAgICBjb25zdCBlbnYgPSBwYWlyLnNsaWNlKGlkeCArIDEpLnRyaW0oKTtcbiAgICBpZiAoc3RhZ2UgJiYgZW52KSBtYXAuc2V0KHN0YWdlLCBlbnYuc2xpY2UoMCwgTUFYX0FUVFIpKTtcbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwaXBlbGluZUNsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29kZVBpcGVsaW5lQ2xpZW50TGlrZT4ge1xuICBsZXQgY2xpZW50ID0gY2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNvbnN0IHsgQ29kZVBpcGVsaW5lQ2xpZW50IH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY2xpZW50ID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBDb2RlUGlwZWxpbmUncyB0YWdzIOKGkiB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCAocGIucGlwZWxpbmUtaWQpIHBsdXMgdGhlXG4gKiBkZXBsb3ktc3RhZ2XihpJlbnZpcm9ubWVudCBtYXAgKHBiLmRlcGxveXMpLiBgcGlwZWxpbmVJZGAgaXMgbnVsbCB3aGVuIHRoZSBwaXBlbGluZVxuICogaGFzIG5vIHBiLnBpcGVsaW5lLWlkIHRhZyAodW5yZWdpc3RlcmVkKS4gVGhyb3dzIG9uIEFjY2Vzc0RlbmllZCBzbyBhIG1pc3NpbmcgSUFNXG4gKiBncmFudCBzdXJmYWNlcyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBkcm9wcGluZyBldmVyeSBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQaXBlbGluZShhcm46IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPFJlc29sdmVkUGlwZWxpbmU+IHtcbiAgY29uc3QgY2FjaGVkID0gcmVzb2x2ZWRCeUFybi5nZXQoYXJuKTtcbiAgLy8gU2VydmUgYSBoaXQgdW50aWwgaXRzIFRUTCAoc2hvcnQgZm9yIGEgbmVnYXRpdmUsIGxvbmdlciBmb3IgYSBwb3NpdGl2ZSksXG4gIC8vIHRoZW4gcmUtcmVzb2x2ZSBzbyB0YWcgY2hhbmdlcyBsYW5kLlxuICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQudHMgPCAoY2FjaGVkLnBpcGVsaW5lSWQgIT09IG51bGwgPyBQT1NfQ0FDSEVfVFRMX01TIDogTkVHX0NBQ0hFX1RUTF9NUykpIHtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBjYWNoZWQucGlwZWxpbmVJZCwgb3JnSWQ6IGNhY2hlZC5vcmdJZCwgZGVwbG95czogY2FjaGVkLmRlcGxveXMgfTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBpcGVsaW5lQ2xpZW50KHJlZ2lvbik7XG4gICAgY29uc3QgeyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCh7IHJlc291cmNlQXJuOiBhcm4gfSkpO1xuICAgIGNvbnN0IHBpcGVsaW5lSWQgPSBvdXQudGFncz8uZmluZCh0ID0+IHQua2V5ID09PSBQSVBFTElORV9JRF9UQUcpPy52YWx1ZSA/PyBudWxsO1xuICAgIGNvbnN0IG9yZ0lkID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gT1JHX0lEX1RBRyk/LnZhbHVlID8/IG51bGw7XG4gICAgY29uc3QgZGVwbG95cyA9IHBhcnNlRGVwbG95cyhvdXQudGFncz8uZmluZCh0ID0+IHQua2V5ID09PSBERVBMT1lTX1RBRyk/LnZhbHVlKTtcbiAgICBpZiAoIXBpcGVsaW5lSWQpIGxvZy53YXJuKCdQaXBlbGluZSBtaXNzaW5nIHBiLnBpcGVsaW5lLWlkIHRhZyDigJQgc2tpcHBpbmcgKHJlZ2lzdGVyIGl0PyknLCB7IGFybiB9KTtcbiAgICByZXNvbHZlZEJ5QXJuLnNldChhcm4sIHsgcGlwZWxpbmVJZCwgb3JnSWQsIGRlcGxveXMsIHRzOiBEYXRlLm5vdygpIH0pO1xuICAgIHJldHVybiB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgLy8gVHJhbnNpZW50L2luZnJhIGVycm9ycyAodGhyb3R0bGluZywgdGltZW91dHMsIDV4eCkgTVVTVCBwcm9wYWdhdGUgc28gdGhlIFNRU1xuICAgIC8vIGJhdGNoIGlzIHJldHJpZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgdGhlIGV2ZW50IOKAlCBhbiBldmVudCBkcm9wcGVkXG4gICAgLy8gQkVGT1JFIGl0IHJlYWNoZXMgdGhlIGluZ2VzdCBpcyBsb3N0IHBlcm1hbmVudGx5ICh0aGUgaW5nZXN0J3MgcGFydGlhbC11bmlxdWVcbiAgICAvLyBpbmRleCBvbmx5IGRlZHVwZXMgZXZlbnRzIHRoYXQgd2VyZSBhY3R1YWxseSBQT1NUZWQpLiBPbmx5IHN3YWxsb3cgd2hlbiB0aGVcbiAgICAvLyBmYWlsdXJlIGlzIGEgZGVmaW5pdGl2ZSBhbnN3ZXIgdGhhdCB0aGlzIEFSTiBoYXMgbm8gdXNhYmxlIHRhZy5cbiAgICBjb25zdCBlID0gZXJyIGFzIHsgbmFtZT86IHN0cmluZzsgJHJldHJ5YWJsZT86IHVua25vd247ICRtZXRhZGF0YT86IHsgaHR0cFN0YXR1c0NvZGU/OiBudW1iZXIgfSB9O1xuICAgIGNvbnN0IHN0YXR1cyA9IGUuJG1ldGFkYXRhPy5odHRwU3RhdHVzQ29kZTtcbiAgICBjb25zdCByZXRyeWFibGUgPSBlLiRyZXRyeWFibGUgIT0gbnVsbFxuICAgICAgfHwgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInICYmIHN0YXR1cyA+PSA1MDApXG4gICAgICB8fCAvdGhyb3R0bHx0aW1lb3V0fHRvb21hbnlyZXF1ZXN0c3xzZXJ2aWNldW5hdmFpbGFibGV8ZWNvbm5yZXNldHxuZXR3b3JraW5nZXJyb3IvaS50ZXN0KG5hbWUgPz8gJycpO1xuICAgIGlmIChyZXRyeWFibGUpIHtcbiAgICAgIGxvZy5lcnJvcignVHJhbnNpZW50IGVycm9yIHJlc29sdmluZyBwYi5waXBlbGluZS1pZCB0YWcg4oCUIHdpbGwgcmV0cnkgdGhlIGJhdGNoJywgeyBhcm4sIGVycm9yOiBuYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIHBiLnBpcGVsaW5lLWlkIHRhZycsIHsgYXJuLCBlcnJvcjogbmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBudWxsLCBvcmdJZDogbnVsbCwgZGVwbG95czogbmV3IE1hcCgpIH07XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IGZvcmdldCByZXNvbHZlZCBwaXBlbGluZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0VGFnc0ZvclRlc3RzKCk6IHZvaWQge1xuICByZXNvbHZlZEJ5QXJuLmNsZWFyKCk7XG59XG4iXX0=
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBWXZFLElBQUksZUFBK0MsQ0FBQztBQUNwRCxLQUFLLFVBQVUsZ0JBQWdCO0lBQzdCLElBQUksQ0FBQyxlQUFlO1FBQUUsZUFBZSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBa0MsQ0FBQztJQUN4SCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLDBDQUEwQztBQUMxQywyQ0FBMkM7QUFDM0MsNkRBQTZEO0FBQzdELGlFQUFpRTtBQUNqRSxtRkFBbUY7QUFDbkYsa0ZBQWtGO0FBQ2xGLHFGQUFxRjtBQUNyRixFQUFFO0FBQ0Ysa0ZBQWtGO0FBQ2xGLGlGQUFpRjtBQUNqRiwwQ0FBMEM7QUFFMUMsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLGdGQUFnRjtBQUNoRixpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDM0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7QUFHbEUsMEVBQTBFO0FBQzFFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLGlFQUFpRTtBQUNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLFVBQVUsQ0FBd0csaUJBQWlCLENBQUMsQ0FBQztBQUMvSixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLEVB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QUFjLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJO2VBQ2pDLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUM7ZUFDN0MsZ0ZBQWdGLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxxRUFBcUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hJLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDL0QsQ0FBQztBQUNILENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBhcm5SZWYsIEJvdW5kZWRNYXAsIENBQ0hFX01BWF9FTlRSSUVTLCBsb2cgfSBmcm9tICcuL3V0aWwuanMnO1xuXG4vLyBBV1MgTGFtYmRhJ3MgTm9kZSBydW50aW1lIHByb3ZpZGVzIEBhd3Mtc2RrIHYzLCBzbyB0aGUgQ29kZVBpcGVsaW5lIGNsaWVudCBpc1xuLy8gbG9hZGVkIGxhemlseSB2aWEgZHluYW1pYyBpbXBvcnQoKSDigJQgYSBzdGF0aWMgd29ya3NwYWNlIGRlcGVuZGVuY3kgd291bGRcbi8vIHBlcnR1cmIgdGhlIHNoYXJlZCBAYXdzLXNkayB2ZXJzaW9uIHRyZWUuIE1pbmltYWwgbG9jYWwgdHlwZXMga2VlcCB0aGUgY2FsbFxuLy8gc2l0ZXMgdHlwZS1jaGVja2VkLlxuaW50ZXJmYWNlIExpc3RUYWdzT3V0cHV0IHsgdGFncz86IEFycmF5PHsga2V5Pzogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB9PiB9XG5pbnRlcmZhY2UgQ29kZVBpcGVsaW5lQ2xpZW50TGlrZSB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8TGlzdFRhZ3NPdXRwdXQ+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVNb2R1bGUge1xuICBDb2RlUGlwZWxpbmVDbGllbnQ6IG5ldyAoY29uZmlnOiB7IHJlZ2lvbjogc3RyaW5nIH0pID0+IENvZGVQaXBlbGluZUNsaWVudExpa2U7XG4gIExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kOiBuZXcgKGlucHV0OiB7IHJlc291cmNlQXJuOiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbn1cbmxldCBjb2RlcGlwZWxpbmVNb2Q6IENvZGVQaXBlbGluZU1vZHVsZSB8IHVuZGVmaW5lZDtcbmFzeW5jIGZ1bmN0aW9uIGxvYWRDb2RlUGlwZWxpbmUoKTogUHJvbWlzZTxDb2RlUGlwZWxpbmVNb2R1bGU+IHtcbiAgaWYgKCFjb2RlcGlwZWxpbmVNb2QpIGNvZGVwaXBlbGluZU1vZCA9IChhd2FpdCBpbXBvcnQoJ0Bhd3Mtc2RrL2NsaWVudC1jb2RlcGlwZWxpbmUnKSkgYXMgdW5rbm93biBhcyBDb2RlUGlwZWxpbmVNb2R1bGU7XG4gIHJldHVybiBjb2RlcGlwZWxpbmVNb2Q7XG59XG5cbi8vIFRhZyByZXNvbHV0aW9uOiBwYi5waXBlbGluZS1pZCArIHBiLmRlcGxveXMuXG4vLyBQaXBlbGluZXMgYXJlIHRhZ2dlZCBhdCBDREsgc3ludGggd2l0aDpcbi8vICAgcGIucGlwZWxpbmUtaWQgPSA8cGxhdGZvcm0gcGlwZWxpbmVJZD5cbi8vICAgcGIuZGVwbG95cyAgICAgPSA8c3RhZ2U+OjxlbnY+IHBhaXJzIGpvaW5lZCBieSAnKycsIGUuZy5cbi8vICAgICAgICAgICAgICAgICAgICBcIkRlcGxveS1zdGc6c3RhZ2luZytEZXBsb3ktcHJvZDpwcm9kdWN0aW9uXCJcbi8vIFdlIHJlc29sdmUgdGhvc2UgdGFncyBmcm9tIHRoZSBsaXZlIENvZGVQaXBlbGluZSAocmVnaW9uLWF3YXJlKS4gVGhlIEFSTi9hY2NvdW50XG4vLyBuZXZlciBsZWF2ZSBBV1MsIGFuZCBuZXZlciByZWFjaCBhIGxvZyBsaW5lIGVpdGhlcjogbG9ncyBjYXJyeSBgYXJuUmVmKGFybilgLCBhXG4vLyBzaG9ydCBkaWdlc3QuIENhY2hlZCBwZXIgQVJOICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgcGIucGlwZWxpbmUtaWQgdGFnIGlzXG4vLyB0cmVhdGVkIGFzIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9JRF9UQUcgPSAncGIucGlwZWxpbmUtaWQnO1xuY29uc3QgREVQTE9ZU19UQUcgPSAncGIuZGVwbG95cyc7XG4vLyBDYW5vbmljYWwgcGVyLXBpcGVsaW5lIG9yZyB0YWcgKGFwcGxpZWQgYXQgc3ludGggYnkgcGlwZWxpbmUtY29yZSkuIEl0IGlzIHRoZVxuLy8gUkVTT0xWRUQgb3JnIGZvciBldmVyeSBldmVudCBvZiB0aGlzIHBpcGVsaW5lIOKAlCB1c2VkIHRvIGtleSB0aGUgcGVyLW9yZyBHaXRIdWJcbi8vIHRva2VuIGFuZCB0byBhdHRyaWJ1dGUgaW5nZXN0LWhlYWx0aC4gb3JnSWQgaXMgYSBwbGF0Zm9ybSBpZCwgbmV2ZXIgYW4gQVdTXG4vLyBhY2NvdW50IGlkLCBzbyBpdCBpcyBzYWZlIHRvIHJlYWQvZm9yd2FyZC5cbmNvbnN0IE9SR19JRF9UQUcgPSAnT3JnSWQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG5cblxuLy8gYHRzYCBsZXRzIEJPVEggb3V0Y29tZXMgZXhwaXJlOiBhIG5lZ2F0aXZlIChyZXNvbHZlZC1idXQtdW50YWdnZWQpIHNvIGFcbi8vIHBpcGVsaW5lIHRhZ2dlZCBBRlRFUiBpdHMgZmlyc3QgZXZlbnQgYmVjb21lcyByZXNvbHZhYmxlLCBhbmQgYSBwb3NpdGl2ZSBzbyBhXG4vLyByZS1zeW50aCB0aGF0IGNoYW5nZXMgYHBiLmRlcGxveXNgIChhIHN0YWdlIHJlbmFtZWQsIGFuIGVudmlyb25tZW50IGFkZGVkKSBvclxuLy8gYE9yZ0lkYCBpcyBwaWNrZWQgdXAgd2l0aG91dCByZWN5Y2xpbmcgdGhlIHdhcm0gY29udGFpbmVyIOKAlCBhIGxpZmV0aW1lIGNhY2hlXG4vLyB3b3VsZCBrZWVwIGF0dHJpYnV0aW5nIGRlcGxveXMgdG8gc3RhZ2VzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0LlxuY29uc3QgcmVzb2x2ZWRCeUFybiA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBvcmdJZDogc3RyaW5nIHwgbnVsbDsgZGVwbG95czogTWFwPHN0cmluZywgc3RyaW5nPjsgdHM6IG51bWJlciB9PihDQUNIRV9NQVhfRU5UUklFUyk7XG5jb25zdCBORUdfQ0FDSEVfVFRMX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFBPU19DQUNIRV9UVExfTVMgPSAxNSAqIDYwICogMTAwMDtcblxuLyoqIFJlc29sdmVkIHBpcGVsaW5lIG1ldGFkYXRhIHJlYWQgZnJvbSB0aGUgQ29kZVBpcGVsaW5lIHJlc291cmNlIHRhZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUGlwZWxpbmUge1xuICAvKiogUGxhdGZvcm0gcGlwZWxpbmVJZCAocGIucGlwZWxpbmUtaWQgdGFnKTsgbnVsbCB3aGVuIHVudGFnZ2VkL3VucmVnaXN0ZXJlZC4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFBsYXRmb3JtIG9yZ0lkIChPcmdJZCB0YWcpOyBudWxsIHdoZW4gdGhlIHBpcGVsaW5lIGNhcnJpZXMgbm8gb3JnIHRhZy4gKi9cbiAgb3JnSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBNYXAgb2YgZGVwbG95LXN0YWdlIG5hbWUg4oaSIGVudmlyb25tZW50IChwYXJzZWQgZnJvbSBwYi5kZXBsb3lzKS4gRW1wdHkgd2hlbiBub25lLiAqL1xuICBkZXBsb3lzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKiogQ2FwIG9uIGNvbW1pdC9yZWYvZW52aXJvbm1lbnQgZmllbGRzIOKAlCB0aGUgaW5nZXN0IGNvbnRyYWN0IGFsbG93cyBtYXggMjU1LiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9BVFRSID0gMjU1O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgcGIuZGVwbG95c2AgdGFnIHZhbHVlIGludG8gYSBzdGFnZeKGkmVudmlyb25tZW50IG1hcC4gVGhlIHZhbHVlIGlzXG4gKiBgPHN0YWdlPjo8ZW52PmAgcGFpcnMgam9pbmVkIGJ5IGArYCAoQ29kZVBpcGVsaW5lLXRhZy1zYWZlOyBubyBKU09OKS4gQSBzdGFnZVxuICogcHJlc2VudCBoZXJlIGlzIGEgZGVwbG95OyBpdHMgbWFwcGVkIGVudmlyb25tZW50IGlzIHdoYXQgdGhlIGZvcndhcmRlciBzdGFtcHMgb25cbiAqIHRoYXQgc3RhZ2UncyBTVEFHRS9BQ1RJT04gZXZlbnRzIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuIE1hbGZvcm1lZCBwYWlycyBhcmVcbiAqIHNraXBwZWQgZGVmZW5zaXZlbHkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRGVwbG95cyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGlmICghdmFsdWUpIHJldHVybiBtYXA7XG4gIGZvciAoY29uc3QgcGFpciBvZiB2YWx1ZS5zcGxpdCgnKycpKSB7XG4gICAgY29uc3QgaWR4ID0gcGFpci5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGlkeCA8PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBzdGFnZSA9IHBhaXIuc2xpY2UoMCwgaWR4KS50cmltKCk7XG4gICAgY29uc3QgZW52ID0gcGFpci5zbGljZShpZHggKyAxKS50cmltKCk7XG4gICAgaWYgKHN0YWdlICYmIGVudikgbWFwLnNldChzdGFnZSwgZW52LnNsaWNlKDAsIE1BWF9BVFRSKSk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGlwZWxpbmVDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPENvZGVQaXBlbGluZUNsaWVudExpa2U+IHtcbiAgbGV0IGNsaWVudCA9IGNsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjb25zdCB7IENvZGVQaXBlbGluZUNsaWVudCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNsaWVudCA9IG5ldyBDb2RlUGlwZWxpbmVDbGllbnQoeyByZWdpb24gfSk7XG4gICAgY2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgQ29kZVBpcGVsaW5lJ3MgdGFncyDihpIgdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQgKHBiLnBpcGVsaW5lLWlkKSBwbHVzIHRoZVxuICogZGVwbG95LXN0YWdl4oaSZW52aXJvbm1lbnQgbWFwIChwYi5kZXBsb3lzKS4gYHBpcGVsaW5lSWRgIGlzIG51bGwgd2hlbiB0aGUgcGlwZWxpbmVcbiAqIGhhcyBubyBwYi5waXBlbGluZS1pZCB0YWcgKHVucmVnaXN0ZXJlZCkuIFRocm93cyBvbiBBY2Nlc3NEZW5pZWQgc28gYSBtaXNzaW5nIElBTVxuICogZ3JhbnQgc3VyZmFjZXMgbG91ZGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgZHJvcHBpbmcgZXZlcnkgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGlwZWxpbmUoYXJuOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxSZXNvbHZlZFBpcGVsaW5lPiB7XG4gIGNvbnN0IGNhY2hlZCA9IHJlc29sdmVkQnlBcm4uZ2V0KGFybik7XG4gIC8vIFNlcnZlIGEgaGl0IHVudGlsIGl0cyBUVEwgKHNob3J0IGZvciBhIG5lZ2F0aXZlLCBsb25nZXIgZm9yIGEgcG9zaXRpdmUpLFxuICAvLyB0aGVuIHJlLXJlc29sdmUgc28gdGFnIGNoYW5nZXMgbGFuZC5cbiAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLnRzIDwgKGNhY2hlZC5waXBlbGluZUlkICE9PSBudWxsID8gUE9TX0NBQ0hFX1RUTF9NUyA6IE5FR19DQUNIRV9UVExfTVMpKSB7XG4gICAgcmV0dXJuIHsgcGlwZWxpbmVJZDogY2FjaGVkLnBpcGVsaW5lSWQsIG9yZ0lkOiBjYWNoZWQub3JnSWQsIGRlcGxveXM6IGNhY2hlZC5kZXBsb3lzIH07XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBwaXBlbGluZUNsaWVudChyZWdpb24pO1xuICAgIGNvbnN0IHsgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQgfSA9IGF3YWl0IGxvYWRDb2RlUGlwZWxpbmUoKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQoeyByZXNvdXJjZUFybjogYXJuIH0pKTtcbiAgICBjb25zdCBwaXBlbGluZUlkID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gUElQRUxJTkVfSURfVEFHKT8udmFsdWUgPz8gbnVsbDtcbiAgICBjb25zdCBvcmdJZCA9IG91dC50YWdzPy5maW5kKHQgPT4gdC5rZXkgPT09IE9SR19JRF9UQUcpPy52YWx1ZSA/PyBudWxsO1xuICAgIGNvbnN0IGRlcGxveXMgPSBwYXJzZURlcGxveXMob3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gREVQTE9ZU19UQUcpPy52YWx1ZSk7XG4gICAgaWYgKCFwaXBlbGluZUlkKSBsb2cud2FybignUGlwZWxpbmUgbWlzc2luZyBwYi5waXBlbGluZS1pZCB0YWcg4oCUIHNraXBwaW5nIChyZWdpc3RlciBpdD8pJywgeyBwaXBlbGluZTogYXJuUmVmKGFybikgfSk7XG4gICAgcmVzb2x2ZWRCeUFybi5zZXQoYXJuLCB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzLCB0czogRGF0ZS5ub3coKSB9KTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkLCBvcmdJZCwgZGVwbG95cyB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCBuYW1lID0gKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWU7XG4gICAgaWYgKG5hbWUgPT09ICdBY2Nlc3NEZW5pZWRFeGNlcHRpb24nKSB7XG4gICAgICAvLyBEb24ndCBjYWNoZSDigJQgdGhpcyBpcyBhIGZpeGFibGUgbWlzY29uZmlnLCBub3QgYSBwcm9wZXJ0eSBvZiB0aGUgcGlwZWxpbmUuXG4gICAgICBsb2cuZXJyb3IoJ0FjY2Vzc0RlbmllZCBjYWxsaW5nIGNvZGVwaXBlbGluZTpMaXN0VGFnc0ZvclJlc291cmNlIOKAlCBncmFudCBpdCB0byB0aGUgTGFtYmRhIHJvbGUnLCB7IHBpcGVsaW5lOiBhcm5SZWYoYXJuKSwgZXJyb3I6IG5hbWUgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIC8vIFRyYW5zaWVudC9pbmZyYSBlcnJvcnMgKHRocm90dGxpbmcsIHRpbWVvdXRzLCA1eHgpIE1VU1QgcHJvcGFnYXRlIHNvIHRoZSBTUVNcbiAgICAvLyBiYXRjaCBpcyByZXRyaWVkIHJhdGhlciB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBldmVudCDigJQgYW4gZXZlbnQgZHJvcHBlZFxuICAgIC8vIEJFRk9SRSBpdCByZWFjaGVzIHRoZSBpbmdlc3QgaXMgbG9zdCBwZXJtYW5lbnRseSAodGhlIGluZ2VzdCdzIHBhcnRpYWwtdW5pcXVlXG4gICAgLy8gaW5kZXggb25seSBkZWR1cGVzIGV2ZW50cyB0aGF0IHdlcmUgYWN0dWFsbHkgUE9TVGVkKS4gT25seSBzd2FsbG93IHdoZW4gdGhlXG4gICAgLy8gZmFpbHVyZSBpcyBhIGRlZmluaXRpdmUgYW5zd2VyIHRoYXQgdGhpcyBBUk4gaGFzIG5vIHVzYWJsZSB0YWcuXG4gICAgY29uc3QgZSA9IGVyciBhcyB7IG5hbWU/OiBzdHJpbmc7ICRyZXRyeWFibGU/OiB1bmtub3duOyAkbWV0YWRhdGE/OiB7IGh0dHBTdGF0dXNDb2RlPzogbnVtYmVyIH0gfTtcbiAgICBjb25zdCBzdGF0dXMgPSBlLiRtZXRhZGF0YT8uaHR0cFN0YXR1c0NvZGU7XG4gICAgY29uc3QgcmV0cnlhYmxlID0gZS4kcmV0cnlhYmxlICE9IG51bGxcbiAgICAgIHx8ICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJyAmJiBzdGF0dXMgPj0gNTAwKVxuICAgICAgfHwgL3Rocm90dGx8dGltZW91dHx0b29tYW55cmVxdWVzdHN8c2VydmljZXVuYXZhaWxhYmxlfGVjb25ucmVzZXR8bmV0d29ya2luZ2Vycm9yL2kudGVzdChuYW1lID8/ICcnKTtcbiAgICBpZiAocmV0cnlhYmxlKSB7XG4gICAgICBsb2cuZXJyb3IoJ1RyYW5zaWVudCBlcnJvciByZXNvbHZpbmcgcGIucGlwZWxpbmUtaWQgdGFnIOKAlCB3aWxsIHJldHJ5IHRoZSBiYXRjaCcsIHsgcGlwZWxpbmU6IGFyblJlZihhcm4pLCBlcnJvcjogbmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBwYi5waXBlbGluZS1pZCB0YWcnLCB7IHBpcGVsaW5lOiBhcm5SZWYoYXJuKSwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIHsgcGlwZWxpbmVJZDogbnVsbCwgb3JnSWQ6IG51bGwsIGRlcGxveXM6IG5ldyBNYXAoKSB9O1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgcmVzb2x2ZWQgcGlwZWxpbmVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFRhZ3NGb3JUZXN0cygpOiB2b2lkIHtcbiAgcmVzb2x2ZWRCeUFybi5jbGVhcigpO1xufVxuIl19
package/lib/util.d.ts CHANGED
@@ -16,6 +16,13 @@ export declare class BoundedMap<K, V> extends Map<K, V> {
16
16
  constructor(max: number);
17
17
  set(key: K, value: V): this;
18
18
  }
19
+ /**
20
+ * A log-safe stand-in for an ARN: `arn#<12 hex of sha256>`. Every ARN embeds the
21
+ * AWS account id, which must never reach CloudWatch — but a stable digest still
22
+ * lets an operator correlate log lines for the same resource (and match it by
23
+ * hashing an ARN they already hold).
24
+ */
25
+ export declare function arnRef(arn: string): string;
19
26
  /** Upper bound for every per-key cache below. */
20
27
  export declare const CACHE_MAX_ENTRIES = 5000;
21
28
  export declare function loadSdk<T>(pkg: string): Promise<T>;
package/lib/util.js CHANGED
@@ -1,5 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { createHash } from 'node:crypto';
3
4
  /** Shared plumbing for the event-ingestion Lambda modules. */
4
5
  export const log = {
5
6
  info: (msg, data) => console.log(JSON.stringify({ level: 'INFO', message: msg, data, ts: new Date().toISOString() })),
@@ -31,6 +32,15 @@ export class BoundedMap extends Map {
31
32
  return super.set(key, value);
32
33
  }
33
34
  }
35
+ /**
36
+ * A log-safe stand-in for an ARN: `arn#<12 hex of sha256>`. Every ARN embeds the
37
+ * AWS account id, which must never reach CloudWatch — but a stable digest still
38
+ * lets an operator correlate log lines for the same resource (and match it by
39
+ * hashing an ARN they already hold).
40
+ */
41
+ export function arnRef(arn) {
42
+ return `arn#${createHash('sha256').update(arn).digest('hex').slice(0, 12)}`;
43
+ }
34
44
  /** Upper bound for every per-key cache below. */
35
45
  export const CACHE_MAX_ENTRIES = 5000;
36
46
  // Variable-specifier loader for SDK clients that are NOT devDependencies of this
@@ -63,4 +73,4 @@ export const FETCH_TIMEOUT_MS = Number(process.env.REPORTING_FETCH_TIMEOUT_MS ??
63
73
  export function fetchWithTimeout(url, init = {}, timeoutMs = FETCH_TIMEOUT_MS) {
64
74
  return fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
65
75
  }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsOERBQThEO0FBRTlELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRztJQUNqQixJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2SSxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2SSxLQUFLLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUM1SSxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLFVBQWlCLFNBQVEsR0FBUztJQUNoQixHQUFHO0lBQWhDLFlBQTZCLEdBQVc7UUFBSSxLQUFLLEVBQUUsQ0FBQzttQkFBdkIsR0FBRztJQUFxQixDQUFDO0lBQzdDLEdBQUcsQ0FBQyxHQUFNLEVBQUUsS0FBUTtRQUMzQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO1FBQ3ZDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxNQUFNLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFdEMsaUZBQWlGO0FBQ2pGLGlGQUFpRjtBQUNqRiwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFJLEdBQVc7SUFDMUMsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFNLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7QUFFL0Y7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsSUFBSSxHQUFnQixFQUFFLEVBQUUsU0FBUyxHQUFHLGdCQUFnQjtJQUNoRyxPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKiogU2hhcmVkIHBsdW1iaW5nIGZvciB0aGUgZXZlbnQtaW5nZXN0aW9uIExhbWJkYSBtb2R1bGVzLiAqL1xuXG5leHBvcnQgY29uc3QgbG9nID0ge1xuICBpbmZvOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnSU5GTycsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIHdhcm46IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdXQVJOJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbiAgZXJyb3I6IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0VSUk9SJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbn07XG5cbi8qKlxuICogQSBNYXAgdGhhdCBob2xkcyBhdCBtb3N0IGBtYXhgIGVudHJpZXMsIGV2aWN0aW5nIHRoZSBsZWFzdCByZWNlbnRseSBTRVQgb25lLlxuICogRXZlcnkgcGVyLWtleSBjYWNoZSBpbiB0aGlzIG1vZHVsZSBpcyBrZXllZCBieSBzb21ldGhpbmcgdW5ib3VuZGVkIChwaXBlbGluZVxuICogQVJOLCBwaXBlbGluZSDDlyBjb21taXQsIG9yZyksIGFuZCBhIGZsZWV0IGZvcndhcmRlcidzIHdhcm0gY29udGFpbmVyIGNhbiBsaXZlXG4gKiBmb3IgaG91cnMgYWNyb3NzIHRob3VzYW5kcyBvZiBwaXBlbGluZXMg4oCUIGFuIHVuYm91bmRlZCBNYXAgaXMgYSBzbG93IGxlYWsgdGhhdFxuICogZW5kcyBpbiBhbiBPT00ta2lsbGVkIExhbWJkYSBhbmQgYSByZWRlbGl2ZXJlZCBiYXRjaC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvdW5kZWRNYXA8SywgVj4gZXh0ZW5kcyBNYXA8SywgVj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1heDogbnVtYmVyKSB7IHN1cGVyKCk7IH1cbiAgb3ZlcnJpZGUgc2V0KGtleTogSywgdmFsdWU6IFYpOiB0aGlzIHtcbiAgICBpZiAoc3VwZXIuaGFzKGtleSkpIHtcbiAgICAgIHN1cGVyLmRlbGV0ZShrZXkpOyAvLyByZWZyZXNoIHJlY2VuY3lcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSBzdXBlci5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKiogVXBwZXIgYm91bmQgZm9yIGV2ZXJ5IHBlci1rZXkgY2FjaGUgYmVsb3cuICovXG5leHBvcnQgY29uc3QgQ0FDSEVfTUFYX0VOVFJJRVMgPSA1MDAwO1xuXG4vLyBWYXJpYWJsZS1zcGVjaWZpZXIgbG9hZGVyIGZvciBTREsgY2xpZW50cyB0aGF0IGFyZSBOT1QgZGV2RGVwZW5kZW5jaWVzIG9mIHRoaXNcbi8vIHBhY2thZ2UgKGBAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdGAsIGBAYXdzLXNkay9jbGllbnQtc3FzYCDigJQgcHJlc2VudCBvbmx5IGluXG4vLyB0aGUgTGFtYmRhIHJ1bnRpbWUgLyBqZXN0IG1vY2tzKS4gQSBgc3RyaW5nYCBzcGVjaWZpZXIga2VlcHMgYHRzY2AgZnJvbVxuLy8gcmVzb2x2aW5nIHRoZW0gYXQgYnVpbGQgdGltZSwgYW5kIHRoZSBidW5kbGUgbGVhdmVzIGBAYXdzLXNkay8qYCBleHRlcm5hbC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU2RrPFQ+KHBrZzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KHBrZykpIGFzIFQ7XG59XG5cbi8qKlxuICogSG93IGxvbmcgb25lIG91dGJvdW5kIGNhbGwgdG8gdGhlIHJlcG9ydGluZyBzZXJ2aWNlIG1heSB0YWtlLlxuICpcbiAqIEEgTGFtYmRhIGhhcyBubyBzdXBlcnZpc29yIHRvIG5vdGljZSBpdCBpcyBzdHVjazogYW4gdW50aW1lZCBgZmV0Y2hgIGFnYWluc3QgYSB3ZWRnZWRcbiAqIHJlcG9ydGluZyBzZXJ2aWNlIGhvbGRzIHRoZSBpbnZvY2F0aW9uIHVudGlsIHRoZSBGVU5DVElPTidzIG93biB0aW1lb3V0LCB3aGljaCBidXJuc1xuICogdGhlIHdob2xlIGJ1ZGdldCwgcmV0dXJucyBubyBiYXRjaCByZXNwb25zZSwgYW5kIGxldHMgU1FTIHJlZGVsaXZlciB0aGUgc2FtZSByZWNvcmRzXG4gKiB0byB0aGUgc2FtZSB3ZWRnZWQgZW5kcG9pbnQuIEEgYm91bmRlZCBjYWxsIGZhaWxzIGZhc3QsIHJlcG9ydHMgdGhlIGJhdGNoIGFzIGZhaWxlZCxcbiAqIGFuZCBsZXRzIHRoZSByZXRyeSBoYXBwZW4gb24gU1FTJ3Mgc2NoZWR1bGUgcmF0aGVyIHRoYW4gYnkgZXhoYXVzdGluZyB0aGUgY2xvY2suXG4gKlxuICogRGVmYXVsdCA1cywgd2VsbCBpbnNpZGUgYSB0eXBpY2FsIDMwcyBmdW5jdGlvbiB0aW1lb3V0IGV2ZW4gd2l0aCBvbmUgYXV0aCByZXRyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEZFVENIX1RJTUVPVVRfTVMgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUkVQT1JUSU5HX0ZFVENIX1RJTUVPVVRfTVMgPz8gNTAwMCkgfHwgNTAwMDtcblxuLyoqXG4gKiBgZmV0Y2hgIHdpdGggYSBkZWFkbGluZS5cbiAqXG4gKiBgQWJvcnRTaWduYWwudGltZW91dGAgcmF0aGVyIHRoYW4gYSBoYW5kLXJvbGxlZCBjb250cm9sbGVyOiBpdCBpcyBvbmUgY2FsbCwgaXQgY2Fubm90XG4gKiBsZWFrIHRoZSB0aW1lciwgYW5kIGl0IHJlamVjdHMgd2l0aCBhIGBUaW1lb3V0RXJyb3JgIHRoZSBjYWxsZXJzIGFscmVhZHkgdHJlYXQgYXMgYVxuICogZmFpbGVkIFBPU1QuIEV2ZXJ5IG91dGJvdW5kIGNhbGwgaW4gdGhpcyBwYWNrYWdlIGdvZXMgdGhyb3VnaCBoZXJlIHNvIGEgbmV3IG9uZSBjYW5ub3RcbiAqIGJlIGFkZGVkIHdpdGhvdXQgYSBkZWFkbGluZSBieSBzaW1wbHkgZm9yZ2V0dGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQodXJsOiBzdHJpbmcsIGluaXQ6IFJlcXVlc3RJbml0ID0ge30sIHRpbWVvdXRNcyA9IEZFVENIX1RJTUVPVVRfTVMpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBmZXRjaCh1cmwsIHsgLi4uaW5pdCwgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KHRpbWVvdXRNcykgfSk7XG59XG4iXX0=
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6Qyw4REFBOEQ7QUFFOUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHO0lBQ2pCLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZJLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZJLEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQzVJLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sVUFBaUIsU0FBUSxHQUFTO0lBQ2hCLEdBQUc7SUFBaEMsWUFBNkIsR0FBVztRQUFJLEtBQUssRUFBRSxDQUFDO21CQUF2QixHQUFHO0lBQXFCLENBQUM7SUFDN0MsR0FBRyxDQUFDLEdBQU0sRUFBRSxLQUFRO1FBQzNCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7UUFDdkMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN4QyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVc7SUFDaEMsT0FBTyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUM5RSxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUV0QyxpRkFBaUY7QUFDakYsaUZBQWlGO0FBQ2pGLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQUksR0FBVztJQUMxQyxPQUFPLENBQUMsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQU0sQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztBQUUvRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxJQUFJLEdBQWdCLEVBQUUsRUFBRSxTQUFTLEdBQUcsZ0JBQWdCO0lBQ2hHLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5cbi8qKiBTaGFyZWQgcGx1bWJpbmcgZm9yIHRoZSBldmVudC1pbmdlc3Rpb24gTGFtYmRhIG1vZHVsZXMuICovXG5cbmV4cG9ydCBjb25zdCBsb2cgPSB7XG4gIGluZm86IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdJTkZPJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbiAgd2FybjogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ1dBUk4nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICBlcnJvcjogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnRVJST1InLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxufTtcblxuLyoqXG4gKiBBIE1hcCB0aGF0IGhvbGRzIGF0IG1vc3QgYG1heGAgZW50cmllcywgZXZpY3RpbmcgdGhlIGxlYXN0IHJlY2VudGx5IFNFVCBvbmUuXG4gKiBFdmVyeSBwZXIta2V5IGNhY2hlIGluIHRoaXMgbW9kdWxlIGlzIGtleWVkIGJ5IHNvbWV0aGluZyB1bmJvdW5kZWQgKHBpcGVsaW5lXG4gKiBBUk4sIHBpcGVsaW5lIMOXIGNvbW1pdCwgb3JnKSwgYW5kIGEgZmxlZXQgZm9yd2FyZGVyJ3Mgd2FybSBjb250YWluZXIgY2FuIGxpdmVcbiAqIGZvciBob3VycyBhY3Jvc3MgdGhvdXNhbmRzIG9mIHBpcGVsaW5lcyDigJQgYW4gdW5ib3VuZGVkIE1hcCBpcyBhIHNsb3cgbGVhayB0aGF0XG4gKiBlbmRzIGluIGFuIE9PTS1raWxsZWQgTGFtYmRhIGFuZCBhIHJlZGVsaXZlcmVkIGJhdGNoLlxuICovXG5leHBvcnQgY2xhc3MgQm91bmRlZE1hcDxLLCBWPiBleHRlbmRzIE1hcDxLLCBWPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWF4OiBudW1iZXIpIHsgc3VwZXIoKTsgfVxuICBvdmVycmlkZSBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHRoaXMge1xuICAgIGlmIChzdXBlci5oYXMoa2V5KSkge1xuICAgICAgc3VwZXIuZGVsZXRlKGtleSk7IC8vIHJlZnJlc2ggcmVjZW5jeVxuICAgIH0gZWxzZSBpZiAodGhpcy5zaXplID49IHRoaXMubWF4KSB7XG4gICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHN1cGVyLmRlbGV0ZShvbGRlc3QpO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBsb2ctc2FmZSBzdGFuZC1pbiBmb3IgYW4gQVJOOiBgYXJuIzwxMiBoZXggb2Ygc2hhMjU2PmAuIEV2ZXJ5IEFSTiBlbWJlZHMgdGhlXG4gKiBBV1MgYWNjb3VudCBpZCwgd2hpY2ggbXVzdCBuZXZlciByZWFjaCBDbG91ZFdhdGNoIOKAlCBidXQgYSBzdGFibGUgZGlnZXN0IHN0aWxsXG4gKiBsZXRzIGFuIG9wZXJhdG9yIGNvcnJlbGF0ZSBsb2cgbGluZXMgZm9yIHRoZSBzYW1lIHJlc291cmNlIChhbmQgbWF0Y2ggaXQgYnlcbiAqIGhhc2hpbmcgYW4gQVJOIHRoZXkgYWxyZWFkeSBob2xkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyblJlZihhcm46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgYXJuIyR7Y3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGFybikuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxMil9YDtcbn1cblxuLyoqIFVwcGVyIGJvdW5kIGZvciBldmVyeSBwZXIta2V5IGNhY2hlIGJlbG93LiAqL1xuZXhwb3J0IGNvbnN0IENBQ0hFX01BWF9FTlRSSUVTID0gNTAwMDtcblxuLy8gVmFyaWFibGUtc3BlY2lmaWVyIGxvYWRlciBmb3IgU0RLIGNsaWVudHMgdGhhdCBhcmUgTk9UIGRldkRlcGVuZGVuY2llcyBvZiB0aGlzXG4vLyBwYWNrYWdlIChgQGF3cy1zZGsvY2xpZW50LWNvZGVjb21taXRgLCBgQGF3cy1zZGsvY2xpZW50LXNxc2Ag4oCUIHByZXNlbnQgb25seSBpblxuLy8gdGhlIExhbWJkYSBydW50aW1lIC8gamVzdCBtb2NrcykuIEEgYHN0cmluZ2Agc3BlY2lmaWVyIGtlZXBzIGB0c2NgIGZyb21cbi8vIHJlc29sdmluZyB0aGVtIGF0IGJ1aWxkIHRpbWUsIGFuZCB0aGUgYnVuZGxlIGxlYXZlcyBgQGF3cy1zZGsvKmAgZXh0ZXJuYWwuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNkazxUPihwa2c6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICByZXR1cm4gKGF3YWl0IGltcG9ydChwa2cpKSBhcyBUO1xufVxuXG4vKipcbiAqIEhvdyBsb25nIG9uZSBvdXRib3VuZCBjYWxsIHRvIHRoZSByZXBvcnRpbmcgc2VydmljZSBtYXkgdGFrZS5cbiAqXG4gKiBBIExhbWJkYSBoYXMgbm8gc3VwZXJ2aXNvciB0byBub3RpY2UgaXQgaXMgc3R1Y2s6IGFuIHVudGltZWQgYGZldGNoYCBhZ2FpbnN0IGEgd2VkZ2VkXG4gKiByZXBvcnRpbmcgc2VydmljZSBob2xkcyB0aGUgaW52b2NhdGlvbiB1bnRpbCB0aGUgRlVOQ1RJT04ncyBvd24gdGltZW91dCwgd2hpY2ggYnVybnNcbiAqIHRoZSB3aG9sZSBidWRnZXQsIHJldHVybnMgbm8gYmF0Y2ggcmVzcG9uc2UsIGFuZCBsZXRzIFNRUyByZWRlbGl2ZXIgdGhlIHNhbWUgcmVjb3Jkc1xuICogdG8gdGhlIHNhbWUgd2VkZ2VkIGVuZHBvaW50LiBBIGJvdW5kZWQgY2FsbCBmYWlscyBmYXN0LCByZXBvcnRzIHRoZSBiYXRjaCBhcyBmYWlsZWQsXG4gKiBhbmQgbGV0cyB0aGUgcmV0cnkgaGFwcGVuIG9uIFNRUydzIHNjaGVkdWxlIHJhdGhlciB0aGFuIGJ5IGV4aGF1c3RpbmcgdGhlIGNsb2NrLlxuICpcbiAqIERlZmF1bHQgNXMsIHdlbGwgaW5zaWRlIGEgdHlwaWNhbCAzMHMgZnVuY3Rpb24gdGltZW91dCBldmVuIHdpdGggb25lIGF1dGggcmV0cnkuXG4gKi9cbmV4cG9ydCBjb25zdCBGRVRDSF9USU1FT1VUX01TID0gTnVtYmVyKHByb2Nlc3MuZW52LlJFUE9SVElOR19GRVRDSF9USU1FT1VUX01TID8/IDUwMDApIHx8IDUwMDA7XG5cbi8qKlxuICogYGZldGNoYCB3aXRoIGEgZGVhZGxpbmUuXG4gKlxuICogYEFib3J0U2lnbmFsLnRpbWVvdXRgIHJhdGhlciB0aGFuIGEgaGFuZC1yb2xsZWQgY29udHJvbGxlcjogaXQgaXMgb25lIGNhbGwsIGl0IGNhbm5vdFxuICogbGVhayB0aGUgdGltZXIsIGFuZCBpdCByZWplY3RzIHdpdGggYSBgVGltZW91dEVycm9yYCB0aGUgY2FsbGVycyBhbHJlYWR5IHRyZWF0IGFzIGFcbiAqIGZhaWxlZCBQT1NULiBFdmVyeSBvdXRib3VuZCBjYWxsIGluIHRoaXMgcGFja2FnZSBnb2VzIHRocm91Z2ggaGVyZSBzbyBhIG5ldyBvbmUgY2Fubm90XG4gKiBiZSBhZGRlZCB3aXRob3V0IGEgZGVhZGxpbmUgYnkgc2ltcGx5IGZvcmdldHRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFdpdGhUaW1lb3V0KHVybDogc3RyaW5nLCBpbml0OiBSZXF1ZXN0SW5pdCA9IHt9LCB0aW1lb3V0TXMgPSBGRVRDSF9USU1FT1VUX01TKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICByZXR1cm4gZmV0Y2godXJsLCB7IC4uLmluaXQsIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCh0aW1lb3V0TXMpIH0pO1xufVxuIl19
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "@aws-sdk/client-codepipeline": "3.1160.0",
10
10
  "@aws-sdk/client-secrets-manager": "3.1160.0",
11
11
  "@jest/globals": "30.5.2",
12
- "@pipeline-builder/pipeline-core": "4.4.3",
12
+ "@pipeline-builder/pipeline-core": "4.4.5",
13
13
  "@stylistic/eslint-plugin": "^2",
14
14
  "@types/aws-lambda": "8.10.164",
15
15
  "@types/node": "^26",
@@ -80,9 +80,10 @@
80
80
  "homepage": "https://mwashburn160.github.io/pipeline-builder/",
81
81
  "publishConfig": {
82
82
  "access": "public",
83
- "registry": "https://registry.npmjs.org/"
83
+ "registry": "https://registry.npmjs.org/",
84
+ "provenance": true
84
85
  },
85
- "version": "4.3.3",
86
+ "version": "4.3.5",
86
87
  "bugs": {
87
88
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
88
89
  },