@pipeline-builder/pipeline-core 4.4.2 → 4.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/config/app-config.d.ts +1 -0
- package/lib/config/app-config.js +7 -1
- package/lib/config/config-types.d.ts +9 -0
- package/lib/config/config-types.js +1 -1
- package/lib/config/handler-constants.d.ts +7 -0
- package/lib/config/handler-constants.js +8 -1
- package/lib/config/infrastructure-config.js +2 -1
- package/lib/core/audit-correlation.d.ts +34 -0
- package/lib/core/audit-correlation.js +50 -0
- package/lib/core/pipeline-helpers.js +50 -6
- package/lib/core/pipeline-registration.d.ts +25 -0
- package/lib/core/pipeline-registration.js +28 -0
- package/lib/core/platform-tls.d.ts +43 -0
- package/lib/core/platform-tls.js +70 -0
- package/lib/core/plugin-contract.d.ts +8 -0
- package/lib/core/plugin-contract.js +15 -3
- package/lib/core/plugin-lookup-envelope.d.ts +30 -2
- package/lib/core/plugin-lookup-envelope.js +58 -7
- package/lib/core/quota-exceeded.d.ts +11 -0
- package/lib/core/quota-exceeded.js +44 -0
- package/lib/core/runtime-check.d.ts +53 -0
- package/lib/core/runtime-check.js +56 -0
- package/lib/core/security-reports.d.ts +26 -0
- package/lib/core/security-reports.js +28 -0
- package/lib/core/step-manifest.d.ts +7 -0
- package/lib/core/step-manifest.js +1 -1
- package/lib/core/synth-failure.d.ts +38 -0
- package/lib/core/synth-failure.js +63 -0
- package/lib/handlers/plugin-lookup-handler.d.ts +19 -2
- package/lib/handlers/plugin-lookup-handler.js +107 -17
- package/lib/index.d.ts +9 -2
- package/lib/index.js +10 -3
- package/lib/pipeline/pipeline-builder.js +55 -8
- package/lib/pipeline/plugin-lookup.d.ts +18 -1
- package/lib/pipeline/plugin-lookup.js +28 -7
- package/lib/pipeline/runtime-vuln-check-step.d.ts +29 -0
- package/lib/pipeline/runtime-vuln-check-step.js +36 -0
- package/lib/pipeline/stage-builder.d.ts +9 -0
- package/lib/pipeline/stage-builder.js +28 -7
- package/lib/pipeline/step-manifest-recorder.d.ts +2 -2
- package/lib/pipeline/step-manifest-recorder.js +8 -6
- package/lib/testing/exports.json +35 -0
- package/package.json +5 -4
|
@@ -44,4 +44,4 @@ export function pluginImageRepository(plugin) {
|
|
|
44
44
|
}
|
|
45
45
|
/** A plugin image repository lookup may return: `public/<publisher>/<name>`, `org-<id>/<name>` or `system/<name>`. */
|
|
46
46
|
export const PLUGIN_IMAGE_REPOSITORY_RE = /^(?:public\/[a-z0-9]+(?:-[a-z0-9]+)*|org-[a-z0-9][a-z0-9-]*|system)\/[a-z0-9][a-z0-9._-]*$/;
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3N0ZXAtbWFuaWZlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBbUM1RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXNCO0lBQzFELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEYsT0FBTyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELHNIQUFzSDtBQUN0SCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0RkFBNEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFN0ZXAgbWFuaWZlc3Q6IHdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb25cbiAqIG9mIGEgZGVwbG95ZWQgcGlwZWxpbmUgcnVucy4gQ0RLLWZyZWUgaGFsZiDigJQgdGhlIHNoYXBlcyBhbmQgaGVscGVycyBzaGFyZWQgYnlcbiAqIHRoZSBzeW50aCAod2hpY2ggcmVjb3JkcyBpdCwgc2VlIGBwaXBlbGluZS9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLnRzYCksIHRoZVxuICogQ0xJICh3aGljaCBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24pIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZVxuICogKHdoaWNoIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGl0IGluIGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApLlxuICpcbiAqIEV2ZW50IGluZ2VzdCBqb2lucyBgcGlwZWxpbmVfZXZlbnRzYCBvbiAocGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsXG4gKiBhY3Rpb25fbmFtZSksIHNvIGBzdGFnZU5hbWVgL2BhY3Rpb25OYW1lYCBoZXJlIGFyZSByZWFkIG9mZiB0aGUgQlVJTFRcbiAqIENvZGVQaXBlbGluZSwgbmV2ZXIgcmVjb21wdXRlZCBmcm9tIG91ciBvd24gaWRzIOKAlCB0aGV5IGFyZSBleGFjdGx5IHRoZSBuYW1lc1xuICogQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogRmlsZSB0aGUgc3ludGggYXBwIHdyaXRlcyB0aGUgbWFuaWZlc3QgdG8sIGluc2lkZSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAqIGRpcmVjdG9yeSAoYGNkayBkZXBsb3kgLS1vdXRwdXQ9PGRpcj5gKS4gVGhlIENMSSByZWFkcyBpdCBiYWNrIGFmdGVyIGFcbiAqIHN1Y2Nlc3NmdWwgZGVwbG95IGFuZCBmb3J3YXJkcyBpdCBvbiB0aGUgcmVnaXN0cnkgUE9TVC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNURVBfTUFOSUZFU1RfRklMRSA9ICdwYi1zdGVwLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIGBpZGAgb2YgZXZlcnkgc3ludGhlc2l6ZWQgcGxhY2Vob2xkZXIgcGx1Z2luIChQbHVnaW5Mb29rdXAgYGZhbGxiYWNrKClgIC9cbiAqIGBib290c3RyYXAoKWApIOKAlCBhIHJlY29yZCBzdGFuZGluZyBpbiBmb3IgYSBsb29rdXAgdGhhdCBjb3VsZCBub3QgcmVzb2x2ZSBhdFxuICogc3ludGguIE5ldmVyIGEgcmVhbCBgcGx1Z2luc2Agcm93LCBzbyB0aGUgc3RlcCBtYW5pZmVzdCBuZXZlciByZWNvcmRzIGl0LlxuICovXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJfUExVR0lOX0lEID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogT25lIG1hbmlmZXN0IGVudHJ5IGFzIHRoZSBzeW50aCByZWNvcmRzIGl0LiBDYXJyaWVzIHRoZSByZXNvbHZlZCBwbHVnaW5cbiAqIHJlY29yZCdzIGlkIHNvIHRoZSBwaXBlbGluZSBzZXJ2aWNlIGNhbiByZS1yZXNvbHZlIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBuYW1lL3ZlcnNpb24vZGlnZXN0L293bmVyIGl0c2VsZiDigJQgdGhlIENMSSdzIGNsYWltIGlzIG5ldmVyIHRydXN0ZWQgZm9yXG4gKiBhbnl0aGluZyB0aGF0IGZlZWRzIGNyb3NzLW9yZyBzdGF0cyAocHVibGlzaGVyLCB2ZXJpZmllZCB1c2UpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYW5pZmVzdEVudHJ5IHtcbiAgLyoqIENvZGVQaXBlbGluZSBzdGFnZSBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogQ29kZVBpcGVsaW5lIGFjdGlvbiBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIGBwbHVnaW5zLmlkYCBvZiB0aGUgcmVzb2x2ZWQgcGx1Z2luIHJlY29yZC4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBTaWduZWQgaW1hZ2UgZGlnZXN0IHRoZSBzdGVwIGlzIHBpbm5lZCB0bzsgbnVsbCBmb3IgaW1hZ2UtbGVzcyBwbHVnaW5zLiAqL1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBzdGVwJ3MgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yIGA8c3RhZ2U+LzxhbGlhcyA/PyBuYW1lPmApIOKAlFxuICAgKiB3aGF0IHRoZSBDTEkgYW5kIHRoZSBsb29rdXAgTGFtYmRhIHNlbmQgYXMgbG9va3VwIGBjb250ZXh0LnN0ZXBLZXlzYCwgYW5kIHRoZVxuICAgKiBydW4tdGltZSBjaGVjayBhc2tzIGFib3V0LiBMZXRzIHRoZSBwbGF0Zm9ybSBqb2luIGxvb2t1cCB3YXJuaW5ncyB0byB0aGlzXG4gICAqIG1hbmlmZXN0IHJvdy5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGx1Z2luIGZpZWxkcyB7QGxpbmsgcGx1Z2luSW1hZ2VSZXBvc2l0b3J5fSByZWFkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luSW1hZ2VSZWYge1xuICByZWFkb25seSBvcmdJZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJ1aWxkVHlwZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogUmVnaXN0cnkgcmVwb3NpdG9yeSBhbiBvcmctb3duZWQgcGx1Z2luIFJPVydzIGltYWdlIGxpdmVzIGF0XG4gKiAoYDxuYW1lc3BhY2U+LzxuYW1lPmAsIG5vIGhvc3QsIG5vIGRpZ2VzdCk6IHRoZSBzeXN0ZW0gb3JnJ3MgdW5kZXJcbiAqIGBzeXN0ZW0vYCwgYSB0ZW5hbnQncyB1bmRlciBgb3JnLTxvcmdJZD4vYC4gTXVzdCBtYXRjaCB0aGUgcHVzaCBzaWRlXG4gKiAoYXBpL3BsdWdpbiBgcGx1Z2luVXJpYCkuIFJldHVybnMgbnVsbCBmb3IgYSBgbWV0YWRhdGFfb25seWAgcGx1Z2luLlxuICpcbiAqIE9ubHkgZm9yIHJvd3MgdGhlIGNhbGxlcidzIG9yZyByZXNvbHZlcyBhcyBpdHMgT1dOIChvciBpdHMgcGFyZW50J3MpOiB0aGVcbiAqIHBsdWdpbiBsb29rdXAgc3RhbXBzIGl0IGFzIHRoZSByZWNvcmQncyBgaW1hZ2VSZXBvc2l0b3J5YC4gQSBsaXN0ZWQgcGx1Z2luJ3NcbiAqIHJlcG9zaXRvcnkgaXMgaXRzIGxpc3RpbmcgdmVyc2lvbidzIGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCBjb3B5IOKAlFxuICogc3ludGggbmV2ZXIgZGVyaXZlcyBhIHJlcG9zaXRvcnkgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luSW1hZ2VSZXBvc2l0b3J5KHBsdWdpbjogUGx1Z2luSW1hZ2VSZWYpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHBsdWdpbi5idWlsZFR5cGUgPT09ICdtZXRhZGF0YV9vbmx5JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG5hbWVzcGFjZSA9IHBsdWdpbi5vcmdJZCA9PT0gU1lTVEVNX09SR19JRCA/ICdzeXN0ZW0nIDogYG9yZy0ke3BsdWdpbi5vcmdJZH1gO1xuICByZXR1cm4gYCR7bmFtZXNwYWNlfS8ke3BsdWdpbi5uYW1lfWA7XG59XG5cbi8qKiBBIHBsdWdpbiBpbWFnZSByZXBvc2l0b3J5IGxvb2t1cCBtYXkgcmV0dXJuOiBgcHVibGljLzxwdWJsaXNoZXI+LzxuYW1lPmAsIGBvcmctPGlkPi88bmFtZT5gIG9yIGBzeXN0ZW0vPG5hbWU+YC4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fSU1BR0VfUkVQT1NJVE9SWV9SRSA9IC9eKD86cHVibGljXFwvW2EtejAtOV0rKD86LVthLXowLTldKykqfG9yZy1bYS16MC05XVthLXowLTktXSp8c3lzdGVtKVxcL1thLXowLTldW2EtejAtOS5fLV0qJC87XG4iXX0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The machine-readable reason a synth failed, as ONE log line.
|
|
3
|
+
*
|
|
4
|
+
* A CodePipeline action failure event only carries CodeBuild's generic
|
|
5
|
+
* summary ("Error while executing command: pipeline-manager pipeline synth …
|
|
6
|
+
* exit status 1") — never the build's output — so the reason a plugin was
|
|
7
|
+
* refused (not installed, denied by policy, signature failure) was readable only
|
|
8
|
+
* by opening the build log. `pipeline-manager pipeline synth` prints this line
|
|
9
|
+
* when it fails inside CodeBuild; the events Lambda finds it in the failed
|
|
10
|
+
* build's CloudWatch log stream and attaches it to the execution event.
|
|
11
|
+
*
|
|
12
|
+
* Dependency-free so the events Lambda can bundle it.
|
|
13
|
+
*/
|
|
14
|
+
/** Prefix of the line; the JSON payload follows after one space. */
|
|
15
|
+
export declare const SYNTH_FAILURE_MARKER = "PB_SYNTH_FAILURE";
|
|
16
|
+
/** One plugin the synth refused. */
|
|
17
|
+
export interface SynthFailurePlugin {
|
|
18
|
+
readonly plugin: string;
|
|
19
|
+
readonly code: string;
|
|
20
|
+
readonly message: string;
|
|
21
|
+
}
|
|
22
|
+
/** The structured synth failure. */
|
|
23
|
+
export interface SynthFailure {
|
|
24
|
+
/** One code for the whole failure: the refusal code when all agree, else `PLUGINS_REFUSED` / `SYNTH_FAILED`. */
|
|
25
|
+
readonly code: string;
|
|
26
|
+
readonly message: string;
|
|
27
|
+
readonly plugins: readonly SynthFailurePlugin[];
|
|
28
|
+
}
|
|
29
|
+
/** Build the failure from the refusals (empty for a failure that is not a plugin refusal). */
|
|
30
|
+
export declare function synthFailure(message: string, plugins?: readonly SynthFailurePlugin[]): SynthFailure;
|
|
31
|
+
/** The single log line for a failure. Newlines never appear inside it (JSON-escaped). */
|
|
32
|
+
export declare function formatSynthFailure(failure: SynthFailure): string;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a log line (or a CloudWatch event message, which may carry a
|
|
35
|
+
* timestamp prefix) back into the failure. Returns null for any line that is
|
|
36
|
+
* not a well-formed failure line.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseSynthFailure(line: string): SynthFailure | null;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* The machine-readable reason a synth failed, as ONE log line.
|
|
5
|
+
*
|
|
6
|
+
* A CodePipeline action failure event only carries CodeBuild's generic
|
|
7
|
+
* summary ("Error while executing command: pipeline-manager pipeline synth …
|
|
8
|
+
* exit status 1") — never the build's output — so the reason a plugin was
|
|
9
|
+
* refused (not installed, denied by policy, signature failure) was readable only
|
|
10
|
+
* by opening the build log. `pipeline-manager pipeline synth` prints this line
|
|
11
|
+
* when it fails inside CodeBuild; the events Lambda finds it in the failed
|
|
12
|
+
* build's CloudWatch log stream and attaches it to the execution event.
|
|
13
|
+
*
|
|
14
|
+
* Dependency-free so the events Lambda can bundle it.
|
|
15
|
+
*/
|
|
16
|
+
/** Prefix of the line; the JSON payload follows after one space. */
|
|
17
|
+
export const SYNTH_FAILURE_MARKER = 'PB_SYNTH_FAILURE';
|
|
18
|
+
/** Caps keep the payload well inside the reporting ingest's 8 KB `detail` bound. */
|
|
19
|
+
const MAX_MESSAGE = 1000;
|
|
20
|
+
const MAX_PLUGINS = 10;
|
|
21
|
+
const MAX_PLUGIN_MESSAGE = 300;
|
|
22
|
+
const clip = (s, max) => (s.length > max ? `${s.slice(0, max - 1)}…` : s);
|
|
23
|
+
/** Build the failure from the refusals (empty for a failure that is not a plugin refusal). */
|
|
24
|
+
export function synthFailure(message, plugins = []) {
|
|
25
|
+
const codes = [...new Set(plugins.map((p) => p.code))];
|
|
26
|
+
const code = plugins.length === 0 ? 'SYNTH_FAILED' : codes.length === 1 ? codes[0] : 'PLUGINS_REFUSED';
|
|
27
|
+
return {
|
|
28
|
+
code,
|
|
29
|
+
message: clip(message, MAX_MESSAGE),
|
|
30
|
+
plugins: plugins.slice(0, MAX_PLUGINS).map((p) => ({
|
|
31
|
+
plugin: clip(p.plugin, 100),
|
|
32
|
+
code: clip(p.code, 100),
|
|
33
|
+
message: clip(p.message, MAX_PLUGIN_MESSAGE),
|
|
34
|
+
})),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** The single log line for a failure. Newlines never appear inside it (JSON-escaped). */
|
|
38
|
+
export function formatSynthFailure(failure) {
|
|
39
|
+
return `${SYNTH_FAILURE_MARKER} ${JSON.stringify(failure)}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse a log line (or a CloudWatch event message, which may carry a
|
|
43
|
+
* timestamp prefix) back into the failure. Returns null for any line that is
|
|
44
|
+
* not a well-formed failure line.
|
|
45
|
+
*/
|
|
46
|
+
export function parseSynthFailure(line) {
|
|
47
|
+
const at = line.indexOf(`${SYNTH_FAILURE_MARKER} {`);
|
|
48
|
+
if (at === -1)
|
|
49
|
+
return null;
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(line.slice(at + SYNTH_FAILURE_MARKER.length + 1).trim());
|
|
52
|
+
if (typeof parsed.code !== 'string' || typeof parsed.message !== 'string')
|
|
53
|
+
return null;
|
|
54
|
+
const plugins = Array.isArray(parsed.plugins)
|
|
55
|
+
? parsed.plugins.filter((p) => !!p && typeof p.plugin === 'string' && typeof p.code === 'string' && typeof p.message === 'string')
|
|
56
|
+
: [];
|
|
57
|
+
return { ...synthFailure(parsed.message, plugins), code: clip(parsed.code, 100) };
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGgtZmFpbHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3N5bnRoLWZhaWx1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLENBQUM7QUFFdkQsb0ZBQW9GO0FBQ3BGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFpQi9CLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFFLEdBQVcsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEcsOEZBQThGO0FBQzlGLE1BQU0sVUFBVSxZQUFZLENBQUMsT0FBZSxFQUFFLE9BQU8sR0FBa0MsRUFBRTtJQUN2RixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUN4RyxPQUFPO1FBQ0wsSUFBSTtRQUNKLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztRQUNuQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7WUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUM7U0FDN0MsQ0FBQyxDQUFDO0tBQ0osQ0FBQztBQUNKLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQXFCO0lBQ3RELE9BQU8sR0FBRyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDOUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsb0JBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ3JELElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzNCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUEwQixDQUFDO1FBQzVHLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsQ0FDckQsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztZQUNyRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsT0FBTyxFQUFFLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDcEYsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgbWFjaGluZS1yZWFkYWJsZSByZWFzb24gYSBzeW50aCBmYWlsZWQsIGFzIE9ORSBsb2cgbGluZS5cbiAqXG4gKiBBIENvZGVQaXBlbGluZSBhY3Rpb24gZmFpbHVyZSBldmVudCBvbmx5IGNhcnJpZXMgQ29kZUJ1aWxkJ3MgZ2VuZXJpY1xuICogc3VtbWFyeSAoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgY29tbWFuZDogcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCDigKZcbiAqIGV4aXQgc3RhdHVzIDFcIikg4oCUIG5ldmVyIHRoZSBidWlsZCdzIG91dHB1dCDigJQgc28gdGhlIHJlYXNvbiBhIHBsdWdpbiB3YXNcbiAqIHJlZnVzZWQgKG5vdCBpbnN0YWxsZWQsIGRlbmllZCBieSBwb2xpY3ksIHNpZ25hdHVyZSBmYWlsdXJlKSB3YXMgcmVhZGFibGUgb25seVxuICogYnkgb3BlbmluZyB0aGUgYnVpbGQgbG9nLiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGAgcHJpbnRzIHRoaXMgbGluZVxuICogd2hlbiBpdCBmYWlscyBpbnNpZGUgQ29kZUJ1aWxkOyB0aGUgZXZlbnRzIExhbWJkYSBmaW5kcyBpdCBpbiB0aGUgZmFpbGVkXG4gKiBidWlsZCdzIENsb3VkV2F0Y2ggbG9nIHN0cmVhbSBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIGV4ZWN1dGlvbiBldmVudC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgc28gdGhlIGV2ZW50cyBMYW1iZGEgY2FuIGJ1bmRsZSBpdC5cbiAqL1xuXG4vKiogUHJlZml4IG9mIHRoZSBsaW5lOyB0aGUgSlNPTiBwYXlsb2FkIGZvbGxvd3MgYWZ0ZXIgb25lIHNwYWNlLiAqL1xuZXhwb3J0IGNvbnN0IFNZTlRIX0ZBSUxVUkVfTUFSS0VSID0gJ1BCX1NZTlRIX0ZBSUxVUkUnO1xuXG4vKiogQ2FwcyBrZWVwIHRoZSBwYXlsb2FkIHdlbGwgaW5zaWRlIHRoZSByZXBvcnRpbmcgaW5nZXN0J3MgOCBLQiBgZGV0YWlsYCBib3VuZC4gKi9cbmNvbnN0IE1BWF9NRVNTQUdFID0gMTAwMDtcbmNvbnN0IE1BWF9QTFVHSU5TID0gMTA7XG5jb25zdCBNQVhfUExVR0lOX01FU1NBR0UgPSAzMDA7XG5cbi8qKiBPbmUgcGx1Z2luIHRoZSBzeW50aCByZWZ1c2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50aEZhaWx1cmVQbHVnaW4ge1xuICByZWFkb25seSBwbHVnaW46IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgc3RydWN0dXJlZCBzeW50aCBmYWlsdXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50aEZhaWx1cmUge1xuICAvKiogT25lIGNvZGUgZm9yIHRoZSB3aG9sZSBmYWlsdXJlOiB0aGUgcmVmdXNhbCBjb2RlIHdoZW4gYWxsIGFncmVlLCBlbHNlIGBQTFVHSU5TX1JFRlVTRURgIC8gYFNZTlRIX0ZBSUxFRGAuICovXG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5zOiByZWFkb25seSBTeW50aEZhaWx1cmVQbHVnaW5bXTtcbn1cblxuY29uc3QgY2xpcCA9IChzOiBzdHJpbmcsIG1heDogbnVtYmVyKTogc3RyaW5nID0+IChzLmxlbmd0aCA+IG1heCA/IGAke3Muc2xpY2UoMCwgbWF4IC0gMSl94oCmYCA6IHMpO1xuXG4vKiogQnVpbGQgdGhlIGZhaWx1cmUgZnJvbSB0aGUgcmVmdXNhbHMgKGVtcHR5IGZvciBhIGZhaWx1cmUgdGhhdCBpcyBub3QgYSBwbHVnaW4gcmVmdXNhbCkuICovXG5leHBvcnQgZnVuY3Rpb24gc3ludGhGYWlsdXJlKG1lc3NhZ2U6IHN0cmluZywgcGx1Z2luczogcmVhZG9ubHkgU3ludGhGYWlsdXJlUGx1Z2luW10gPSBbXSk6IFN5bnRoRmFpbHVyZSB7XG4gIGNvbnN0IGNvZGVzID0gWy4uLm5ldyBTZXQocGx1Z2lucy5tYXAoKHApID0+IHAuY29kZSkpXTtcbiAgY29uc3QgY29kZSA9IHBsdWdpbnMubGVuZ3RoID09PSAwID8gJ1NZTlRIX0ZBSUxFRCcgOiBjb2Rlcy5sZW5ndGggPT09IDEgPyBjb2Rlc1swXSEgOiAnUExVR0lOU19SRUZVU0VEJztcbiAgcmV0dXJuIHtcbiAgICBjb2RlLFxuICAgIG1lc3NhZ2U6IGNsaXAobWVzc2FnZSwgTUFYX01FU1NBR0UpLFxuICAgIHBsdWdpbnM6IHBsdWdpbnMuc2xpY2UoMCwgTUFYX1BMVUdJTlMpLm1hcCgocCkgPT4gKHtcbiAgICAgIHBsdWdpbjogY2xpcChwLnBsdWdpbiwgMTAwKSxcbiAgICAgIGNvZGU6IGNsaXAocC5jb2RlLCAxMDApLFxuICAgICAgbWVzc2FnZTogY2xpcChwLm1lc3NhZ2UsIE1BWF9QTFVHSU5fTUVTU0FHRSksXG4gICAgfSkpLFxuICB9O1xufVxuXG4vKiogVGhlIHNpbmdsZSBsb2cgbGluZSBmb3IgYSBmYWlsdXJlLiBOZXdsaW5lcyBuZXZlciBhcHBlYXIgaW5zaWRlIGl0IChKU09OLWVzY2FwZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN5bnRoRmFpbHVyZShmYWlsdXJlOiBTeW50aEZhaWx1cmUpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U1lOVEhfRkFJTFVSRV9NQVJLRVJ9ICR7SlNPTi5zdHJpbmdpZnkoZmFpbHVyZSl9YDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGxvZyBsaW5lIChvciBhIENsb3VkV2F0Y2ggZXZlbnQgbWVzc2FnZSwgd2hpY2ggbWF5IGNhcnJ5IGFcbiAqIHRpbWVzdGFtcCBwcmVmaXgpIGJhY2sgaW50byB0aGUgZmFpbHVyZS4gUmV0dXJucyBudWxsIGZvciBhbnkgbGluZSB0aGF0IGlzXG4gKiBub3QgYSB3ZWxsLWZvcm1lZCBmYWlsdXJlIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN5bnRoRmFpbHVyZShsaW5lOiBzdHJpbmcpOiBTeW50aEZhaWx1cmUgfCBudWxsIHtcbiAgY29uc3QgYXQgPSBsaW5lLmluZGV4T2YoYCR7U1lOVEhfRkFJTFVSRV9NQVJLRVJ9IHtgKTtcbiAgaWYgKGF0ID09PSAtMSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShsaW5lLnNsaWNlKGF0ICsgU1lOVEhfRkFJTFVSRV9NQVJLRVIubGVuZ3RoICsgMSkudHJpbSgpKSBhcyBQYXJ0aWFsPFN5bnRoRmFpbHVyZT47XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQuY29kZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHBhcnNlZC5tZXNzYWdlICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcGx1Z2lucyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnBsdWdpbnMpXG4gICAgICA/IHBhcnNlZC5wbHVnaW5zLmZpbHRlcigocCk6IHAgaXMgU3ludGhGYWlsdXJlUGx1Z2luID0+XG4gICAgICAgICEhcCAmJiB0eXBlb2YgcC5wbHVnaW4gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBwLmNvZGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBwLm1lc3NhZ2UgPT09ICdzdHJpbmcnKVxuICAgICAgOiBbXTtcbiAgICByZXR1cm4geyAuLi5zeW50aEZhaWx1cmUocGFyc2VkLm1lc3NhZ2UsIHBsdWdpbnMpLCBjb2RlOiBjbGlwKHBhcnNlZC5jb2RlLCAxMDApIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
|
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PluginFilter } from '@pipeline-builder/pipeline-data';
|
|
2
|
+
import type { CloudFormationCustomResourceEvent, CloudFormationCustomResourceResponse, Context } from 'aws-lambda';
|
|
3
|
+
/**
|
|
4
|
+
* A plain 429's `Retry-After` (delta-seconds) in ms, clipped to
|
|
5
|
+
* {@link HANDLER_RETRY_AFTER_MAX_MS}; `undefined` when absent or unparseable (an
|
|
6
|
+
* HTTP-date is not worth parsing for a wait this short — the backoff applies).
|
|
7
|
+
*/
|
|
8
|
+
export declare function retryAfterMs(headers: unknown): number | undefined;
|
|
9
|
+
/** Truncate to `max` UTF-8 bytes on a character boundary, marking the cut. */
|
|
10
|
+
export declare function truncateReason(reason: string, max?: number): string;
|
|
11
|
+
/**
|
|
12
|
+
* The refusal as the plugin service wrote it — `code`, `message` and a compact
|
|
13
|
+
* rendering of `details` (the blocking CVEs, the policy that refused it…) —
|
|
14
|
+
* so the CloudFormation failure says WHY, not just "API error 409: Conflict".
|
|
15
|
+
* Only those three fields are read: the body is never echoed verbatim.
|
|
16
|
+
*/
|
|
17
|
+
export declare function describeRefusal(status: number, statusText: string, body: unknown, filter?: PluginFilter): string;
|
|
2
18
|
/**
|
|
3
19
|
* Lambda handler for CloudFormation Custom Resource that performs plugin lookup.
|
|
4
20
|
*
|
|
@@ -14,6 +30,7 @@ import type { CloudFormationCustomResourceEvent, CloudFormationCustomResourceRes
|
|
|
14
30
|
* - Failure: Returns error message in Reason
|
|
15
31
|
*
|
|
16
32
|
* @param event - CloudFormation custom resource event
|
|
33
|
+
* @param context - Lambda context; its awsRequestId rides the lookup as `X-Request-Id`
|
|
17
34
|
* @returns CloudFormation response
|
|
18
35
|
*
|
|
19
36
|
* @example
|
|
@@ -29,4 +46,4 @@ import type { CloudFormationCustomResourceEvent, CloudFormationCustomResourceRes
|
|
|
29
46
|
* }
|
|
30
47
|
* ```
|
|
31
48
|
*/
|
|
32
|
-
export declare const handler: (event: CloudFormationCustomResourceEvent) => Promise<CloudFormationCustomResourceResponse>;
|
|
49
|
+
export declare const handler: (event: CloudFormationCustomResourceEvent, context?: Pick<Context, 'awsRequestId'>) => Promise<CloudFormationCustomResourceResponse>;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { Agent } from 'https';
|
|
3
4
|
import axios, { AxiosError } from 'axios';
|
|
4
5
|
// Import the dependency-free leaf, NOT `app-config.js`/`CoreConstants`: the latter
|
|
5
6
|
// transitively pulls infrastructure-config → aws-cdk-lib, which esbuild then tries
|
|
6
7
|
// to bundle into this Lambda (hundreds of MB → OOM/SIGKILL during cold-start synth).
|
|
7
|
-
import { HANDLER_TIMEOUT_MS, HANDLER_MAX_RETRIES, HANDLER_RETRY_DELAY_MS, HANDLER_DEFAULT_BASE_URL, } from '../config/handler-constants.js';
|
|
8
|
-
import { unwrapLookup } from '../core/plugin-lookup-envelope.js';
|
|
9
8
|
import { createPlatformCredential, isCredentialRefusal } from './platform-credential.js';
|
|
9
|
+
import { HANDLER_TIMEOUT_MS, HANDLER_MAX_RETRIES, HANDLER_RETRY_DELAY_MS, HANDLER_RETRY_AFTER_MAX_MS, HANDLER_DEFAULT_BASE_URL, } from '../config/handler-constants.js';
|
|
10
|
+
import { correlationHeaders } from '../core/audit-correlation.js';
|
|
11
|
+
import { platformCaList } from '../core/platform-tls.js';
|
|
12
|
+
import { exactPinNotFoundMessage, lookupNotFoundState, unwrapLookup } from '../core/plugin-lookup-envelope.js';
|
|
13
|
+
import { describeQuotaExceeded } from '../core/quota-exceeded.js';
|
|
10
14
|
/**
|
|
11
15
|
* Structured logger for Lambda (outputs JSON to CloudWatch).
|
|
12
16
|
* Debug messages only emitted when LOG_LEVEL=debug.
|
|
@@ -38,6 +42,18 @@ const RETRYABLE_CODES = new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT']);
|
|
|
38
42
|
function sleep(ms) {
|
|
39
43
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
40
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* A plain 429's `Retry-After` (delta-seconds) in ms, clipped to
|
|
47
|
+
* {@link HANDLER_RETRY_AFTER_MAX_MS}; `undefined` when absent or unparseable (an
|
|
48
|
+
* HTTP-date is not worth parsing for a wait this short — the backoff applies).
|
|
49
|
+
*/
|
|
50
|
+
export function retryAfterMs(headers) {
|
|
51
|
+
const raw = headers?.['retry-after'];
|
|
52
|
+
const seconds = typeof raw === 'string' || typeof raw === 'number' ? Number(raw) : NaN;
|
|
53
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
54
|
+
return undefined;
|
|
55
|
+
return Math.min(seconds * 1000, HANDLER_RETRY_AFTER_MAX_MS);
|
|
56
|
+
}
|
|
41
57
|
/** Platform secret name — injected as PLATFORM_SECRET_NAME env var by PluginLookup construct. */
|
|
42
58
|
const PLATFORM_SECRET_NAME = process.env.PLATFORM_SECRET_NAME;
|
|
43
59
|
if (!PLATFORM_SECRET_NAME) {
|
|
@@ -55,20 +71,69 @@ export function _resetCredentialsCache() { credential.reset(); }
|
|
|
55
71
|
/** The API refused the credential (401/403) — the caller may refresh it and retry once. */
|
|
56
72
|
class CredentialRefusedError extends Error {
|
|
57
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* CloudFormation caps a custom resource's `Reason` (the response body as a
|
|
76
|
+
* whole must stay under 4096 bytes, and the reason is what the console and
|
|
77
|
+
* `cdk deploy` print). Leave headroom for the other response fields.
|
|
78
|
+
*/
|
|
79
|
+
const MAX_REASON_BYTES = 3500;
|
|
80
|
+
/** Truncate to `max` UTF-8 bytes on a character boundary, marking the cut. */
|
|
81
|
+
export function truncateReason(reason, max = MAX_REASON_BYTES) {
|
|
82
|
+
if (Buffer.byteLength(reason, 'utf8') <= max)
|
|
83
|
+
return reason;
|
|
84
|
+
const marker = ' …[truncated]';
|
|
85
|
+
let out = reason.slice(0, max);
|
|
86
|
+
while (Buffer.byteLength(out + marker, 'utf8') > max)
|
|
87
|
+
out = out.slice(0, -1);
|
|
88
|
+
return out + marker;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The refusal as the plugin service wrote it — `code`, `message` and a compact
|
|
92
|
+
* rendering of `details` (the blocking CVEs, the policy that refused it…) —
|
|
93
|
+
* so the CloudFormation failure says WHY, not just "API error 409: Conflict".
|
|
94
|
+
* Only those three fields are read: the body is never echoed verbatim.
|
|
95
|
+
*/
|
|
96
|
+
export function describeRefusal(status, statusText, body, filter) {
|
|
97
|
+
const data = body && typeof body === 'object' ? body : {};
|
|
98
|
+
const code = typeof data.code === 'string' ? data.code : undefined;
|
|
99
|
+
const pin = typeof filter?.version === 'string' && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(filter.version) ? filter.version : undefined;
|
|
100
|
+
// An exact pin that does not resolve: phrase it from details.state, as the CLI does.
|
|
101
|
+
if (status === 404 && pin && typeof filter?.name === 'string') {
|
|
102
|
+
return `${code ?? 'NOT_FOUND'}: ${exactPinNotFoundMessage(filter.name, pin, lookupNotFoundState(body))}`;
|
|
103
|
+
}
|
|
104
|
+
const message = typeof data.message === 'string' && data.message.length > 0 ? data.message : `API error ${status}: ${statusText}`;
|
|
105
|
+
let details = '';
|
|
106
|
+
if (data.details !== undefined && data.details !== null) {
|
|
107
|
+
try {
|
|
108
|
+
details = ` — details: ${JSON.stringify(data.details)}`;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
details = '';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return `${code ? `${code}: ` : ''}${message}${details}`;
|
|
115
|
+
}
|
|
58
116
|
/**
|
|
59
117
|
* Creates a pre-configured Axios instance for API requests.
|
|
60
118
|
*
|
|
61
119
|
* @param baseURL - Base URL of the target API
|
|
62
120
|
* @param key - service-account key sent as the Bearer credential
|
|
121
|
+
* @param requestId - this Lambda invocation's awsRequestId, sent as `X-Request-Id`
|
|
122
|
+
* so the plugin service's audit row joins back to this invocation's log
|
|
63
123
|
* @returns Configured Axios instance
|
|
64
124
|
*/
|
|
65
|
-
function create(baseURL, key) {
|
|
125
|
+
function create(baseURL, key, requestId) {
|
|
126
|
+
// A private-CA platform is VERIFIED against PLATFORM_CA_BUNDLE (set by the
|
|
127
|
+
// PluginLookup construct when the synth had one); otherwise Node's default store.
|
|
128
|
+
const ca = platformCaList();
|
|
66
129
|
return axios.create({
|
|
67
130
|
baseURL,
|
|
68
131
|
timeout: HANDLER_TIMEOUT_MS,
|
|
132
|
+
...(ca && { httpsAgent: new Agent({ ca }) }),
|
|
69
133
|
headers: {
|
|
70
134
|
'Content-Type': 'application/json',
|
|
71
135
|
'Authorization': `Bearer ${key}`,
|
|
136
|
+
...correlationHeaders({ requestId }),
|
|
72
137
|
},
|
|
73
138
|
});
|
|
74
139
|
}
|
|
@@ -78,31 +143,41 @@ function create(baseURL, key) {
|
|
|
78
143
|
* with exponential backoff.
|
|
79
144
|
*
|
|
80
145
|
* @param api - Configured Axios instance
|
|
146
|
+
* @param baseURL - The platform URL `api` targets (prefixes a quota refusal's upgrade path)
|
|
81
147
|
* @param pluginFilter - Filter criteria for the plugin lookup
|
|
82
148
|
* @returns The plugin data returned by the API
|
|
83
149
|
* @throws Error on persistent failure, timeout or invalid response
|
|
84
150
|
*/
|
|
85
|
-
async function fetch(api, pluginFilter) {
|
|
151
|
+
async function fetch(api, baseURL, pluginFilter, stepKey) {
|
|
86
152
|
lambdaLog.debug('FETCH', 'Starting plugin fetch', { filter: pluginFilter });
|
|
87
153
|
let lastError;
|
|
154
|
+
// A plain 429's Retry-After, honoured on the next attempt when longer than the backoff.
|
|
155
|
+
let serverDelay;
|
|
88
156
|
for (let attempt = 0; attempt <= HANDLER_MAX_RETRIES; attempt++) {
|
|
89
157
|
if (attempt > 0) {
|
|
90
|
-
const delay = HANDLER_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
|
|
158
|
+
const delay = Math.max(HANDLER_RETRY_DELAY_MS * Math.pow(2, attempt - 1), serverDelay ?? 0);
|
|
159
|
+
serverDelay = undefined;
|
|
91
160
|
lambdaLog.info('RETRY', `Attempt ${attempt + 1}/${HANDLER_MAX_RETRIES + 1} after ${delay}ms`);
|
|
92
161
|
await sleep(delay);
|
|
93
162
|
}
|
|
94
163
|
try {
|
|
164
|
+
// Contract C1: with a known pipeline + step, the plugin service records
|
|
165
|
+
// the warnings it returns against them (not only this Lambda's log).
|
|
166
|
+
const pipelineId = process.env.PIPELINE_ID;
|
|
95
167
|
const { data: body, status } = await api.post('/api/plugins/lookup', {
|
|
96
168
|
filter: pluginFilter,
|
|
169
|
+
...(pipelineId && stepKey ? { context: { pipelineId, stepKeys: [stepKey] } } : {}),
|
|
97
170
|
});
|
|
98
171
|
const { plugin: data, warnings } = unwrapLookup(body);
|
|
99
172
|
if (!data) {
|
|
100
173
|
throw new Error('Empty response data from API');
|
|
101
174
|
}
|
|
102
|
-
//
|
|
103
|
-
// deploy log; the lookup still succeeds.
|
|
104
|
-
|
|
105
|
-
|
|
175
|
+
// Graded warnings (lifecycle, vulnerability, compliance) — surfaced in the
|
|
176
|
+
// deploy log; the lookup still succeeds. Vulnerability state never fails a
|
|
177
|
+
// deploy: it is reported (and, with context, recorded server-side).
|
|
178
|
+
for (const w of warnings) {
|
|
179
|
+
lambdaLog.warn('PLUGIN_WARNING', `[${w.severity.toUpperCase()}] ${w.message}`, { plugin: data.name, version: data.version, code: w.code, severity: w.severity });
|
|
180
|
+
}
|
|
106
181
|
lambdaLog.info('FETCH', 'Plugin fetched successfully', {
|
|
107
182
|
status,
|
|
108
183
|
plugin: data.name,
|
|
@@ -117,11 +192,24 @@ async function fetch(api, pluginFilter) {
|
|
|
117
192
|
lambdaLog.error('FETCH', `Plugin lookup timed out after ${HANDLER_TIMEOUT_MS}ms`);
|
|
118
193
|
throw new Error(`Plugin lookup timed out after ${HANDLER_TIMEOUT_MS}ms`);
|
|
119
194
|
}
|
|
195
|
+
// A QUOTA refusal is not transient: the counter only empties when the
|
|
196
|
+
// period resets, so retrying just spends two more lookups' worth of
|
|
197
|
+
// waiting and reports the same thing. Fail fast with the quota, the
|
|
198
|
+
// numbers, the reset date and where to raise it, as the CFN Reason.
|
|
199
|
+
const quotaMessage = error.response?.status === 429
|
|
200
|
+
? describeQuotaExceeded(error.response.data, baseURL)
|
|
201
|
+
: undefined;
|
|
202
|
+
if (quotaMessage) {
|
|
203
|
+
lambdaLog.error('FETCH', quotaMessage);
|
|
204
|
+
throw new Error(`Failed to fetch plugin: ${quotaMessage}`);
|
|
205
|
+
}
|
|
120
206
|
const retryable = error.response
|
|
121
207
|
? RETRYABLE_STATUSES.has(error.response.status)
|
|
122
208
|
: RETRYABLE_CODES.has(error.code ?? '');
|
|
209
|
+
if (error.response?.status === 429)
|
|
210
|
+
serverDelay = retryAfterMs(error.response.headers);
|
|
123
211
|
const msg = error.response
|
|
124
|
-
?
|
|
212
|
+
? describeRefusal(error.response.status, error.response.statusText, error.response.data, pluginFilter)
|
|
125
213
|
: error.code || error.message;
|
|
126
214
|
if (isCredentialRefusal(error.response?.status)) {
|
|
127
215
|
lambdaLog.warn('AUTH', `Credential refused: ${msg}`);
|
|
@@ -151,16 +239,16 @@ async function fetch(api, pluginFilter) {
|
|
|
151
239
|
* likely rotated underneath this warm container (token-renew stores the new key
|
|
152
240
|
* and revokes the old one), so drop the cache, re-read the secret and retry once.
|
|
153
241
|
*/
|
|
154
|
-
async function lookupWithCredentialRefresh(baseURL, pluginFilter) {
|
|
242
|
+
async function lookupWithCredentialRefresh(baseURL, pluginFilter, stepKey, requestId) {
|
|
155
243
|
try {
|
|
156
|
-
return await fetch(create(baseURL, await credential.getKey()), pluginFilter);
|
|
244
|
+
return await fetch(create(baseURL, await credential.getKey(), requestId), baseURL, pluginFilter, stepKey);
|
|
157
245
|
}
|
|
158
246
|
catch (err) {
|
|
159
247
|
if (!(err instanceof CredentialRefusedError))
|
|
160
248
|
throw err;
|
|
161
249
|
credential.invalidate();
|
|
162
250
|
lambdaLog.info('AUTH', 'Re-reading the service-account key from Secrets Manager and retrying once');
|
|
163
|
-
return fetch(create(baseURL, await credential.getKey()), pluginFilter);
|
|
251
|
+
return fetch(create(baseURL, await credential.getKey(), requestId), baseURL, pluginFilter, stepKey);
|
|
164
252
|
}
|
|
165
253
|
}
|
|
166
254
|
/**
|
|
@@ -195,6 +283,7 @@ function validatePluginFilter(pluginFilter) {
|
|
|
195
283
|
* - Failure: Returns error message in Reason
|
|
196
284
|
*
|
|
197
285
|
* @param event - CloudFormation custom resource event
|
|
286
|
+
* @param context - Lambda context; its awsRequestId rides the lookup as `X-Request-Id`
|
|
198
287
|
* @returns CloudFormation response
|
|
199
288
|
*
|
|
200
289
|
* @example
|
|
@@ -210,7 +299,7 @@ function validatePluginFilter(pluginFilter) {
|
|
|
210
299
|
* }
|
|
211
300
|
* ```
|
|
212
301
|
*/
|
|
213
|
-
export const handler = async (event) => {
|
|
302
|
+
export const handler = async (event, context) => {
|
|
214
303
|
// NOTE: never log event.StackId here — the CloudFormation Stack ARN embeds the
|
|
215
304
|
// AWS account id (arn:aws:cloudformation:<region>:<ACCOUNT_ID>:stack/…), which
|
|
216
305
|
// must never be persisted to CloudWatch. requestId + logicalResourceId are
|
|
@@ -245,7 +334,8 @@ export const handler = async (event) => {
|
|
|
245
334
|
lambdaLog.info('CONFIG', 'Configuration loaded', { baseURL, pluginFilter });
|
|
246
335
|
validatePluginFilter(pluginFilter);
|
|
247
336
|
lambdaLog.info('FETCH', 'Initiating plugin lookup...');
|
|
248
|
-
const
|
|
337
|
+
const stepKey = typeof event.ResourceProperties.stepKey === 'string' ? event.ResourceProperties.stepKey : undefined;
|
|
338
|
+
const plugin = await lookupWithCredentialRefresh(baseURL, pluginFilter, stepKey, context?.awsRequestId);
|
|
249
339
|
lambdaLog.info('FETCH', 'Plugin retrieved successfully', {
|
|
250
340
|
name: plugin.name,
|
|
251
341
|
version: plugin.version,
|
|
@@ -288,11 +378,11 @@ export const handler = async (event) => {
|
|
|
288
378
|
return {
|
|
289
379
|
...baseResponse,
|
|
290
380
|
Status: 'FAILED',
|
|
291
|
-
Reason: reason,
|
|
381
|
+
Reason: truncateReason(reason),
|
|
292
382
|
};
|
|
293
383
|
}
|
|
294
384
|
finally {
|
|
295
385
|
lambdaLog.info('END', 'Custom resource execution completed');
|
|
296
386
|
}
|
|
297
387
|
};
|
|
298
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL3BsdWdpbi1sb29rdXAtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBSXRDLE9BQU8sS0FBSyxFQUFFLEVBQXNCLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5RCxtRkFBbUY7QUFDbkYsbUZBQW1GO0FBQ25GLHFGQUFxRjtBQUNyRixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsd0JBQXdCLEdBQ3pCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpGOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsT0FBZSxFQUFFLElBQWM7SUFDM0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekYsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssT0FBTztZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBQyxNQUFNO1FBQ3pDLEtBQUssTUFBTTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBQyxNQUFNO1FBQ3ZDLEtBQUssT0FBTztZQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssT0FBTztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElB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QU0sRUFBRSxXQUFXLE1BQU0sQ0FBQyxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sMEJBQTBCO1lBQzdFLElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNzQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUM7UUFDcEYsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7WUFDekMsTUFBTTtZQUNOLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3hELENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxHQUFHLFlBQVk7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixNQUFNLEVBQUUsTUFBTTtTQUN5QixDQUFDO0lBQzVDLENBQUM7WUFBUyxDQUFDO1FBQ1QsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luRmlsdGVyLCBQbHVnaW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50LCBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2UgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCBheGlvcywgeyB0eXBlIEF4aW9zSW5zdGFuY2UsIEF4aW9zRXJyb3IgfSBmcm9tICdheGlvcyc7XG4vLyBJbXBvcnQgdGhlIGRlcGVuZGVuY3ktZnJlZSBsZWFmLCBOT1QgYGFwcC1jb25maWcuanNgL2BDb3JlQ29uc3RhbnRzYDogdGhlIGxhdHRlclxuLy8gdHJhbnNpdGl2ZWx5IHB1bGxzIGluZnJhc3RydWN0dXJlLWNvbmZpZyDihpIgYXdzLWNkay1saWIsIHdoaWNoIGVzYnVpbGQgdGhlbiB0cmllc1xuLy8gdG8gYnVuZGxlIGludG8gdGhpcyBMYW1iZGEgKGh1bmRyZWRzIG9mIE1CIOKGkiBPT00vU0lHS0lMTCBkdXJpbmcgY29sZC1zdGFydCBzeW50aCkuXG5pbXBvcnQge1xuICBIQU5ETEVSX1RJTUVPVVRfTVMsXG4gIEhBTkRMRVJfTUFYX1JFVFJJRVMsXG4gIEhBTkRMRVJfUkVUUllfREVMQVlfTVMsXG4gIEhBTkRMRVJfREVGQVVMVF9CQVNFX1VSTCxcbn0gZnJvbSAnLi4vY29uZmlnL2hhbmRsZXItY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHVud3JhcExvb2t1cCB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQbGF0Zm9ybUNyZWRlbnRpYWwsIGlzQ3JlZGVudGlhbFJlZnVzYWwgfSBmcm9tICcuL3BsYXRmb3JtLWNyZWRlbnRpYWwuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQgbG9nZ2VyIGZvciBMYW1iZGEgKG91dHB1dHMgSlNPTiB0byBDbG91ZFdhdGNoKS5cbiAqIERlYnVnIG1lc3NhZ2VzIG9ubHkgZW1pdHRlZCB3aGVuIExPR19MRVZFTD1kZWJ1Zy5cbiAqL1xuZnVuY3Rpb24gbG9nRW50cnkobGV2ZWw6IHN0cmluZywgdGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pIHtcbiAgY29uc3QgbGluZSA9IEpTT04uc3RyaW5naWZ5KHsgbGV2ZWwsIHRhZywgbWVzc2FnZSwgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgJ0VSUk9SJzogY29uc29sZS5lcnJvcihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnV0FSTic6IGNvbnNvbGUud2FybihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnREVCVUcnOiBpZiAocHJvY2Vzcy5lbnYuTE9HX0xFVkVMID09PSAnZGVidWcnKSBjb25zb2xlLmRlYnVnKGxpbmUpOyBicmVhaztcbiAgICBkZWZhdWx0OiBjb25zb2xlLmxvZyhsaW5lKTtcbiAgfVxufVxuXG5jb25zdCBsYW1iZGFMb2cgPSB7XG4gIGluZm86ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0lORk8nLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICBlcnJvcjogKHRhZzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBsb2dFbnRyeSgnRVJST1InLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICB3YXJuOiAodGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGxvZ0VudHJ5KCdXQVJOJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbiAgZGVidWc6ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0RFQlVHJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbn07XG5cbmNvbnN0IFJFVFJZQUJMRV9TVEFUVVNFUyA9IG5ldyBTZXQoWzQyOSwgNTAyLCA1MDMsIDUwNF0pO1xuY29uc3QgUkVUUllBQkxFX0NPREVTID0gbmV3IFNldChbJ0VDT05OUkVTRVQnLCAnRUNPTk5SRUZVU0VEJywgJ0VUSU1FRE9VVCddKTtcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKiBQbGF0Zm9ybSBzZWNyZXQgbmFtZSDigJQgaW5qZWN0ZWQgYXMgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciBieSBQbHVnaW5Mb29rdXAgY29uc3RydWN0LiAqL1xuY29uc3QgUExBVEZPUk1fU0VDUkVUX05BTUUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbmlmICghUExBVEZPUk1fU0VDUkVUX05BTUUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9TRUNSRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2aWNlLWFjY291bnQga2V5IChgcGJfc2Ff4oCmYCkgZnJvbSBTZWNyZXRzIE1hbmFnZXIsIGNhY2hlZCBmb3IgdGhlIHdhcm1cbiAqIGNvbnRhaW5lci4gVGhlIHBsdWdpbiBBUEkgdHJhZGVzIGl0IGZvciBhIHNob3J0LWxpdmVkIEpXVCBpdHNlbGYsIHNvIHRoZSBrZXlcbiAqIGdvZXMgb3V0IGFzIHRoZSBCZWFyZXIgY3JlZGVudGlhbC4gQ3JlYXRlIHRoZSBzZWNyZXQgd2l0aFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gLlxuICovXG5jb25zdCBjcmVkZW50aWFsID0gY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsKHsgc2VjcmV0TmFtZTogUExBVEZPUk1fU0VDUkVUX05BTUUgfSk7XG5cbi8qKiBAaW50ZXJuYWwgUmVzZXQgY2FjaGVkIGNyZWRlbnRpYWwgKGZvciB0ZXN0aW5nIG9ubHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldENyZWRlbnRpYWxzQ2FjaGUoKTogdm9pZCB7IGNyZWRlbnRpYWwucmVzZXQoKTsgfVxuXG4vKiogVGhlIEFQSSByZWZ1c2VkIHRoZSBjcmVkZW50aWFsICg0MDEvNDAzKSDigJQgdGhlIGNhbGxlciBtYXkgcmVmcmVzaCBpdCBhbmQgcmV0cnkgb25jZS4gKi9cbmNsYXNzIENyZWRlbnRpYWxSZWZ1c2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcmUtY29uZmlndXJlZCBBeGlvcyBpbnN0YW5jZSBmb3IgQVBJIHJlcXVlc3RzLlxuICpcbiAqIEBwYXJhbSBiYXNlVVJMIC0gQmFzZSBVUkwgb2YgdGhlIHRhcmdldCBBUElcbiAqIEBwYXJhbSBrZXkgLSBzZXJ2aWNlLWFjY291bnQga2V5IHNlbnQgYXMgdGhlIEJlYXJlciBjcmVkZW50aWFsXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIEF4aW9zIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShiYXNlVVJMOiBzdHJpbmcsIGtleTogc3RyaW5nKTogQXhpb3NJbnN0YW5jZSB7XG4gIHJldHVybiBheGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkwsXG4gICAgdGltZW91dDogSEFORExFUl9USU1FT1VUX01TLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtrZXl9YCxcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHBsdWdpbiBjb25maWd1cmF0aW9uIGZyb20gdGhlIGV4dGVybmFsIEFQSSB3aXRoIHJldHJ5IGxvZ2ljLlxuICogUmV0cmllcyBvbiB0cmFuc2llbnQgZmFpbHVyZXMgKDQyOSwgNTAyLCA1MDMsIDUwNCwgbmV0d29yayBlcnJvcnMpXG4gKiB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQHBhcmFtIGFwaSAtIENvbmZpZ3VyZWQgQXhpb3MgaW5zdGFuY2VcbiAqIEBwYXJhbSBwbHVnaW5GaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWEgZm9yIHRoZSBwbHVnaW4gbG9va3VwXG4gKiBAcmV0dXJucyBUaGUgcGx1Z2luIGRhdGEgcmV0dXJuZWQgYnkgdGhlIEFQSVxuICogQHRocm93cyBFcnJvciBvbiBwZXJzaXN0ZW50IGZhaWx1cmUsIHRpbWVvdXQgb3IgaW52YWxpZCByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaChhcGk6IEF4aW9zSW5zdGFuY2UsIHBsdWdpbkZpbHRlcjogUGx1Z2luRmlsdGVyKTogUHJvbWlzZTxQbHVnaW4+IHtcbiAgbGFtYmRhTG9nLmRlYnVnKCdGRVRDSCcsICdTdGFydGluZyBwbHVnaW4gZmV0Y2gnLCB7IGZpbHRlcjogcGx1Z2luRmlsdGVyIH0pO1xuXG4gIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IEhBTkRMRVJfTUFYX1JFVFJJRVM7IGF0dGVtcHQrKykge1xuICAgIGlmIChhdHRlbXB0ID4gMCkge1xuICAgICAgY29uc3QgZGVsYXkgPSBIQU5ETEVSX1JFVFJZX0RFTEFZX01TICogTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpO1xuICAgICAgbGFtYmRhTG9nLmluZm8oJ1JFVFJZJywgYEF0dGVtcHQgJHthdHRlbXB0ICsgMX0vJHtIQU5ETEVSX01BWF9SRVRSSUVTICsgMX0gYWZ0ZXIgJHtkZWxheX1tc2ApO1xuICAgICAgYXdhaXQgc2xlZXAoZGVsYXkpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGE6IGJvZHksIHN0YXR1cyB9ID0gYXdhaXQgYXBpLnBvc3Q8dW5rbm93bj4oJy9hcGkvcGx1Z2lucy9sb29rdXAnLCB7XG4gICAgICAgIGZpbHRlcjogcGx1Z2luRmlsdGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHsgcGx1Z2luOiBkYXRhLCB3YXJuaW5ncyB9ID0gdW53cmFwTG9va3VwKGJvZHkpO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW1wdHkgcmVzcG9uc2UgZGF0YSBmcm9tIEFQSScpO1xuICAgICAgfVxuICAgICAgLy8gTGlmZWN5Y2xlIHdhcm5pbmdzIChkZXByZWNhdGVkIC8geWFua2VkLWJ1dC1waW5uZWQpIOKAlCBzdXJmYWNlZCBpbiB0aGVcbiAgICAgIC8vIGRlcGxveSBsb2c7IHRoZSBsb29rdXAgc3RpbGwgc3VjY2VlZHMuXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2Ygd2FybmluZ3MpIGxhbWJkYUxvZy53YXJuKCdMSUZFQ1lDTEUnLCBtZXNzYWdlLCB7IHBsdWdpbjogZGF0YS5uYW1lLCB2ZXJzaW9uOiBkYXRhLnZlcnNpb24gfSk7XG5cbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdQbHVnaW4gZmV0Y2hlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcGx1Z2luOiBkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbixcbiAgICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFQ09OTkFCT1JURUQnKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmVycm9yKCdGRVRDSCcsIGBQbHVnaW4gbG9va3VwIHRpbWVkIG91dCBhZnRlciAke0hBTkRMRVJfVElNRU9VVF9NU31tc2ApO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGxvb2t1cCB0aW1lZCBvdXQgYWZ0ZXIgJHtIQU5ETEVSX1RJTUVPVVRfTVN9bXNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZSA9IGVycm9yLnJlc3BvbnNlXG4gICAgICAgICAgPyBSRVRSWUFCTEVfU1RBVFVTRVMuaGFzKGVycm9yLnJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgICA6IFJFVFJZQUJMRV9DT0RFUy5oYXMoZXJyb3IuY29kZSA/PyAnJyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gZXJyb3IucmVzcG9uc2VcbiAgICAgICAgICA/IGBBUEkgZXJyb3IgJHtlcnJvci5yZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yLnJlc3BvbnNlLnN0YXR1c1RleHR9YFxuICAgICAgICAgIDogZXJyb3IuY29kZSB8fCBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgIGlmIChpc0NyZWRlbnRpYWxSZWZ1c2FsKGVycm9yLnJlc3BvbnNlPy5zdGF0dXMpKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLndhcm4oJ0FVVEgnLCBgQ3JlZGVudGlhbCByZWZ1c2VkOiAke21zZ31gKTtcbiAgICAgICAgICB0aHJvdyBuZXcgQ3JlZGVudGlhbFJlZnVzZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHBsdWdpbjogJHttc2d9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0cnlhYmxlICYmIGF0dGVtcHQgPCBIQU5ETEVSX01BWF9SRVRSSUVTKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmluZm8oJ1JFVFJZJywgYFJldHJ5YWJsZSBlcnJvcjogJHttc2d9YCwgeyBhdHRlbXB0OiBhdHRlbXB0ICsgMSB9KTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBwbHVnaW46ICR7bXNnfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgbG9nIHRoZSB1cHN0cmVhbSBib2R5IHZlcmJhdGltIOKAlCBpdCBtYXkgY2FycnkgYSBzdGFjayB0cmFjZSxcbiAgICAgICAgLy8gYSByZXF1ZXN0IHBheWxvYWQgZWNobywgb3Igb3RoZXIgc2Vuc2l0aXZlIGRhdGEgd2Ugc2hvdWxkbid0IGVjaG9cbiAgICAgICAgLy8gaW50byBMYW1iZGEgQ2xvdWRXYXRjaCBsb2dzLiBLZWVwIGp1c3QgdGhlIGhpZ2gtbGV2ZWwgc2hhcGUuXG4gICAgICAgIGNvbnN0IHNhZmVCb2R5ID0gZXJyb3IucmVzcG9uc2U/LmRhdGEgJiYgdHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB7IGNvZGU6IChlcnJvci5yZXNwb25zZS5kYXRhIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlLCBtZXNzYWdlOiAoZXJyb3IucmVzcG9uc2UuZGF0YSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSkubWVzc2FnZSB9XG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxhbWJkYUxvZy5lcnJvcignRkVUQ0gnLCBtc2csIHsgcmVzcG9uc2VCb2R5OiBzYWZlQm9keSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luOiAke21zZ31gKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdVbmtub3duIGVycm9yIGR1cmluZyBwbHVnaW4gZmV0Y2gnKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBsYXN0RXJyb3IgPz8gbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luIGFmdGVyIHJldHJpZXMnKTtcbn1cblxuLyoqXG4gKiBMb29rIHRoZSBwbHVnaW4gdXAgd2l0aCB0aGUgY2FjaGVkIGNyZWRlbnRpYWwuIE9uIGEgNDAxLzQwMyB0aGUga2V5IHdhcyBtb3N0XG4gKiBsaWtlbHkgcm90YXRlZCB1bmRlcm5lYXRoIHRoaXMgd2FybSBjb250YWluZXIgKHRva2VuLXJlbmV3IHN0b3JlcyB0aGUgbmV3IGtleVxuICogYW5kIHJldm9rZXMgdGhlIG9sZCBvbmUpLCBzbyBkcm9wIHRoZSBjYWNoZSwgcmUtcmVhZCB0aGUgc2VjcmV0IGFuZCByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb29rdXBXaXRoQ3JlZGVudGlhbFJlZnJlc2goYmFzZVVSTDogc3RyaW5nLCBwbHVnaW5GaWx0ZXI6IFBsdWdpbkZpbHRlcik6IFByb21pc2U8UGx1Z2luPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZldGNoKGNyZWF0ZShiYXNlVVJMLCBhd2FpdCBjcmVkZW50aWFsLmdldEtleSgpKSwgcGx1Z2luRmlsdGVyKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgQ3JlZGVudGlhbFJlZnVzZWRFcnJvcikpIHRocm93IGVycjtcbiAgICBjcmVkZW50aWFsLmludmFsaWRhdGUoKTtcbiAgICBsYW1iZGFMb2cuaW5mbygnQVVUSCcsICdSZS1yZWFkaW5nIHRoZSBzZXJ2aWNlLWFjY291bnQga2V5IGZyb20gU2VjcmV0cyBNYW5hZ2VyIGFuZCByZXRyeWluZyBvbmNlJyk7XG4gICAgcmV0dXJuIGZldGNoKGNyZWF0ZShiYXNlVVJMLCBhd2FpdCBjcmVkZW50aWFsLmdldEtleSgpKSwgcGx1Z2luRmlsdGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgcGx1Z2luIGZpbHRlciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcGx1Z2luRmlsdGVyIC0gRmlsdGVyIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkXG4gKiBAdGhyb3dzIEVycm9yIGlmIGludmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQbHVnaW5GaWx0ZXIocGx1Z2luRmlsdGVyOiB1bmtub3duKTogcGx1Z2luRmlsdGVyIGlzIFBsdWdpbkZpbHRlciB7XG4gIGlmICghcGx1Z2luRmlsdGVyIHx8IHR5cGVvZiBwbHVnaW5GaWx0ZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgcGx1Z2luRmlsdGVyJyk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXIgPSBwbHVnaW5GaWx0ZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICghZmlsdGVyLm5hbWUgJiYgIWZpbHRlci5pZCAmJiAhZmlsdGVyLnZlcnNpb24gJiYgIWZpbHRlci5vcmdJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGx1Z2luRmlsdGVyIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY3JpdGVyaW9uIChuYW1lLCBpZCwgdmVyc2lvbiwgb3Igb3JnSWQpJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgaGFuZGxlciBmb3IgQ2xvdWRGb3JtYXRpb24gQ3VzdG9tIFJlc291cmNlIHRoYXQgcGVyZm9ybXMgcGx1Z2luIGxvb2t1cC5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIHdpdGggdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyIChQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyKS5cbiAqIENyZWF0ZSB0aGUgc2VjcmV0IHdpdGg6IGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYFxuICpcbiAqIFJlcXVlc3QgVHlwZXM6XG4gKiAtIENyZWF0ZS9VcGRhdGU6IGZldGNoZXMgYW5kIHJldHVybnMgcGx1Z2luIGNvbmZpZ3VyYXRpb24gZnJvbSBBUElcbiAqIC0gRGVsZXRlOiBuby1vcCAoYWx3YXlzIHN1Y2NlZWRzKVxuICpcbiAqIFJlc3BvbnNlOlxuICogLSBTdWNjZXNzOiBSZXR1cm5zIGJhc2U2NC1lbmNvZGVkIHBsdWdpbiBKU09OIGluIERhdGEuUmVzdWx0VmFsdWVcbiAqIC0gRmFpbHVyZTogUmV0dXJucyBlcnJvciBtZXNzYWdlIGluIFJlYXNvblxuICpcbiAqIEBwYXJhbSBldmVudCAtIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBldmVudFxuICogQHJldHVybnMgQ2xvdWRGb3JtYXRpb24gcmVzcG9uc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIFJlc291cmNlIFByb3BlcnRpZXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYmFzZVVSTFwiOiBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tXCIsXG4gKiAgIFwicGx1Z2luRmlsdGVyXCI6IHtcbiAqICAgICBcIm5hbWVcIjogXCJub2RlanMtYnVpbGRcIixcbiAqICAgICBcInZlcnNpb25cIjogXCIxLjAuMFwiLFxuICogICAgIFwiaXNBY3RpdmVcIjogdHJ1ZVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50OiBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsXG4pOiBQcm9taXNlPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZT4gPT4ge1xuICAvLyBOT1RFOiBuZXZlciBsb2cgZXZlbnQuU3RhY2tJZCBoZXJlIOKAlCB0aGUgQ2xvdWRGb3JtYXRpb24gU3RhY2sgQVJOIGVtYmVkcyB0aGVcbiAgLy8gQVdTIGFjY291bnQgaWQgKGFybjphd3M6Y2xvdWRmb3JtYXRpb246PHJlZ2lvbj46PEFDQ09VTlRfSUQ+OnN0YWNrL+KApiksIHdoaWNoXG4gIC8vIG11c3QgbmV2ZXIgYmUgcGVyc2lzdGVkIHRvIENsb3VkV2F0Y2guIHJlcXVlc3RJZCArIGxvZ2ljYWxSZXNvdXJjZUlkIGFyZVxuICAvLyBzdWZmaWNpZW50IGZvciBjb3JyZWxhdGlvbi4gKFN0YWNrSWQgaXMgc3RpbGwgcmV0dXJuZWQgaW4gdGhlIENGTiByZXNwb25zZVxuICAvLyBib2R5IGJlbG93IOKAlCB0aGF0IGlzIHRoZSBtYW5kYXRvcnkgQ0ZOIHByb3RvY29sIGZpZWxkIGFuZCBpcyBub3QgYSBsb2cuKVxuICBsYW1iZGFMb2cuaW5mbygnU1RBUlQnLCBgJHtldmVudC5SZXF1ZXN0VHlwZX0gcmVxdWVzdCByZWNlaXZlZGAsIHtcbiAgICBsb2dpY2FsUmVzb3VyY2VJZDogZXZlbnQuTG9naWNhbFJlc291cmNlSWQsXG4gICAgcmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsXG4gIH0pO1xuXG4gIGNvbnN0IGJhc2VSZXNwb25zZTogUGFydGlhbDxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U+ID0ge1xuICAgIFN0YWNrSWQ6IGV2ZW50LlN0YWNrSWQsXG4gICAgUmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsXG4gICAgTG9naWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogZXZlbnQuTG9naWNhbFJlc291cmNlSWQsXG4gIH07XG5cbiAgdHJ5IHtcbiAgICAvLyBIYW5kbGUgRGVsZXRlIC0gYWx3YXlzIHN1Y2NlZWQgKG5vLW9wKVxuICAgIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdERUxFVEUnLCAnTm8tb3AgLSByZXR1cm5pbmcgU1VDQ0VTUycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgICBTdGF0dXM6ICdTVUNDRVNTJyxcbiAgICAgICAgUmVhc29uOiAnRGVsZXRlIGNvbXBsZXRlZCAobm8tb3ApJyxcbiAgICAgIH0gYXMgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgYW5kIHZhbGlkYXRlIHByb3BlcnRpZXNcbiAgICBjb25zdCBwbHVnaW5GaWx0ZXIgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMucGx1Z2luRmlsdGVyO1xuICAgIGNvbnN0IGJhc2VVUkwgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuYmFzZVVSTCB8fCBIQU5ETEVSX0RFRkFVTFRfQkFTRV9VUkw7XG5cbiAgICBpZiAoIWJhc2VVUkwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSAmJiAhYmFzZVVSTC5zdGFydHNXaXRoKCdodHRwOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXNlVVJMOiBcIiR7YmFzZVVSTH1cIiDigJQgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly9gKTtcbiAgICB9XG5cbiAgICBsYW1iZGFMb2cuaW5mbygnQ09ORklHJywgJ0NvbmZpZ3VyYXRpb24gbG9hZGVkJywgeyBiYXNlVVJMLCBwbHVnaW5GaWx0ZXIgfSk7XG5cbiAgICB2YWxpZGF0ZVBsdWdpbkZpbHRlcihwbHVnaW5GaWx0ZXIpO1xuXG4gICAgbGFtYmRhTG9nLmluZm8oJ0ZFVENIJywgJ0luaXRpYXRpbmcgcGx1Z2luIGxvb2t1cC4uLicpO1xuICAgIGNvbnN0IHBsdWdpbiA9IGF3YWl0IGxvb2t1cFdpdGhDcmVkZW50aWFsUmVmcmVzaChiYXNlVVJMLCBwbHVnaW5GaWx0ZXIpO1xuICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdQbHVnaW4gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgIG5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgdmVyc2lvbjogcGx1Z2luLnZlcnNpb24sXG4gICAgICBpZDogcGx1Z2luLmlkLFxuICAgIH0pO1xuXG4gICAgLy8gU3RyaXAgbGFyZ2UgZmllbGRzIHRvIHN0YXkgd2l0aGluIENsb3VkRm9ybWF0aW9uJ3MgNDA5Ni1ieXRlIERhdGEgbGltaXQuXG4gICAgLy8gQ0RLIGNvbnN0cnVjdHMgb25seSBuZWVkIHRoZSBmaWVsZHMgdXNlZCBieSBjcmVhdGVDb2RlQnVpbGRTdGVwKCkuXG4gICAgY29uc3Qgc2xpbSA9IHtcbiAgICAgIGlkOiBwbHVnaW4uaWQsXG4gICAgICBuYW1lOiBwbHVnaW4ubmFtZSxcbiAgICAgIHZlcnNpb246IHBsdWdpbi52ZXJzaW9uLFxuICAgICAgcGx1Z2luVHlwZTogcGx1Z2luLnBsdWdpblR5cGUsXG4gICAgICBjb21wdXRlVHlwZTogcGx1Z2luLmNvbXB1dGVUeXBlLFxuICAgICAgY29tbWFuZHM6IHBsdWdpbi5jb21tYW5kcyxcbiAgICAgIGluc3RhbGxDb21tYW5kczogcGx1Z2luLmluc3RhbGxDb21tYW5kcyxcbiAgICAgIGVudjogcGx1Z2luLmVudixcbiAgICAgIG1ldGFkYXRhOiBwbHVnaW4ubWV0YWRhdGEsXG4gICAgICBwcmltYXJ5T3V0cHV0RGlyZWN0b3J5OiBwbHVnaW4ucHJpbWFyeU91dHB1dERpcmVjdG9yeSxcbiAgICAgIHNlY3JldHM6IHBsdWdpbi5zZWNyZXRzLFxuICAgICAgZmFpbHVyZUJlaGF2aW9yOiBwbHVnaW4uZmFpbHVyZUJlaGF2aW9yLFxuICAgICAgdGltZW91dDogcGx1Z2luLnRpbWVvdXQsXG4gICAgfTtcblxuICAgIGNvbnN0IGVuY29kZWQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShzbGltKSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGxhbWJkYUxvZy5kZWJ1ZygnRU5DT0RFJywgJ0VuY29kZWQgcGx1Z2luIGRhdGEnLCB7IGxlbmd0aDogZW5jb2RlZC5sZW5ndGggfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgU3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICBSZWFzb246IGBQbHVnaW4gJyR7cGx1Z2luLm5hbWV9JyAodiR7cGx1Z2luLnZlcnNpb259KSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIERhdGE6IHtcbiAgICAgICAgUmVzdWx0VmFsdWU6IGVuY29kZWQsXG4gICAgICB9LFxuICAgIH0gYXMgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1VuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnO1xuICAgIGxhbWJkYUxvZy5lcnJvcignRVJST1InLCAnSGFuZGxlciBmYWlsZWQnLCB7XG4gICAgICByZWFzb24sXG4gICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgIFN0YXR1czogJ0ZBSUxFRCcsXG4gICAgICBSZWFzb246IHJlYXNvbixcbiAgICB9IGFzIENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBsYW1iZGFMb2cuaW5mbygnRU5EJywgJ0N1c3RvbSByZXNvdXJjZSBleGVjdXRpb24gY29tcGxldGVkJyk7XG4gIH1cbn07XG4iXX0=
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL3BsdWdpbi1sb29rdXAtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFHOUIsT0FBTyxLQUFLLEVBQUUsRUFBc0IsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlELG1GQUFtRjtBQUNuRixtRkFBbUY7QUFDbkYscUZBQXFGO0FBQ3JGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDMUIsd0JBQXdCLEdBQ3pCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRTs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLE9BQWUsRUFBRSxJQUFjO0lBQzNFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFL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QUUscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFN0UsT0FBTztZQUNMLEdBQUcsWUFBWTtZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxXQUFXLE1BQU0sQ0FBQyxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sMEJBQTBCO1lBQzdFLElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNzQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUM7UUFDcEYsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7WUFDekMsTUFBTTtZQUNOLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3hELENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxHQUFHLFlBQVk7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQztTQUNTLENBQUM7SUFDNUMsQ0FBQztZQUFTLENBQUM7UUFDVCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICdodHRwcyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbkZpbHRlciwgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlLCBDb250ZXh0IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgYXhpb3MsIHsgdHlwZSBBeGlvc0luc3RhbmNlLCBBeGlvc0Vycm9yIH0gZnJvbSAnYXhpb3MnO1xuLy8gSW1wb3J0IHRoZSBkZXBlbmRlbmN5LWZyZWUgbGVhZiwgTk9UIGBhcHAtY29uZmlnLmpzYC9gQ29yZUNvbnN0YW50c2A6IHRoZSBsYXR0ZXJcbi8vIHRyYW5zaXRpdmVseSBwdWxscyBpbmZyYXN0cnVjdHVyZS1jb25maWcg4oaSIGF3cy1jZGstbGliLCB3aGljaCBlc2J1aWxkIHRoZW4gdHJpZXNcbi8vIHRvIGJ1bmRsZSBpbnRvIHRoaXMgTGFtYmRhIChodW5kcmVkcyBvZiBNQiDihpIgT09NL1NJR0tJTEwgZHVyaW5nIGNvbGQtc3RhcnQgc3ludGgpLlxuaW1wb3J0IHsgY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsLCBpc0NyZWRlbnRpYWxSZWZ1c2FsIH0gZnJvbSAnLi9wbGF0Zm9ybS1jcmVkZW50aWFsLmpzJztcbmltcG9ydCB7XG4gIEhBTkRMRVJfVElNRU9VVF9NUyxcbiAgSEFORExFUl9NQVhfUkVUUklFUyxcbiAgSEFORExFUl9SRVRSWV9ERUxBWV9NUyxcbiAgSEFORExFUl9SRVRSWV9BRlRFUl9NQVhfTVMsXG4gIEhBTkRMRVJfREVGQVVMVF9CQVNFX1VSTCxcbn0gZnJvbSAnLi4vY29uZmlnL2hhbmRsZXItY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNvcnJlbGF0aW9uSGVhZGVycyB9IGZyb20gJy4uL2NvcmUvYXVkaXQtY29ycmVsYXRpb24uanMnO1xuaW1wb3J0IHsgcGxhdGZvcm1DYUxpc3QgfSBmcm9tICcuLi9jb3JlL3BsYXRmb3JtLXRscy5qcyc7XG5pbXBvcnQgeyBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZSwgbG9va3VwTm90Rm91bmRTdGF0ZSwgdW53cmFwTG9va3VwIH0gZnJvbSAnLi4vY29yZS9wbHVnaW4tbG9va3VwLWVudmVsb3BlLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlUXVvdGFFeGNlZWRlZCB9IGZyb20gJy4uL2NvcmUvcXVvdGEtZXhjZWVkZWQuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQgbG9nZ2VyIGZvciBMYW1iZGEgKG91dHB1dHMgSlNPTiB0byBDbG91ZFdhdGNoKS5cbiAqIERlYnVnIG1lc3NhZ2VzIG9ubHkgZW1pdHRlZCB3aGVuIExPR19MRVZFTD1kZWJ1Zy5cbiAqL1xuZnVuY3Rpb24gbG9nRW50cnkobGV2ZWw6IHN0cmluZywgdGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pIHtcbiAgY29uc3QgbGluZSA9IEpTT04uc3RyaW5naWZ5KHsgbGV2ZWwsIHRhZywgbWVzc2FnZSwgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgJ0VSUk9SJzogY29uc29sZS5lcnJvcihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnV0FSTic6IGNvbnNvbGUud2FybihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnREVCVUcnOiBpZiAocHJvY2Vzcy5lbnYuTE9HX0xFVkVMID09PSAnZGVidWcnKSBjb25zb2xlLmRlYnVnKGxpbmUpOyBicmVhaztcbiAgICBkZWZhdWx0OiBjb25zb2xlLmxvZyhsaW5lKTtcbiAgfVxufVxuXG5jb25zdCBsYW1iZGFMb2cgPSB7XG4gIGluZm86ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0lORk8nLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICBlcnJvcjogKHRhZzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBsb2dFbnRyeSgnRVJST1InLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICB3YXJuOiAodGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGxvZ0VudHJ5KCdXQVJOJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbiAgZGVidWc6ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0RFQlVHJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbn07XG5cbmNvbnN0IFJFVFJZQUJMRV9TVEFUVVNFUyA9IG5ldyBTZXQoWzQyOSwgNTAyLCA1MDMsIDUwNF0pO1xuY29uc3QgUkVUUllBQkxFX0NPREVTID0gbmV3IFNldChbJ0VDT05OUkVTRVQnLCAnRUNPTk5SRUZVU0VEJywgJ0VUSU1FRE9VVCddKTtcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQSBwbGFpbiA0MjkncyBgUmV0cnktQWZ0ZXJgIChkZWx0YS1zZWNvbmRzKSBpbiBtcywgY2xpcHBlZCB0b1xuICoge0BsaW5rIEhBTkRMRVJfUkVUUllfQUZURVJfTUFYX01TfTsgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgdW5wYXJzZWFibGUgKGFuXG4gKiBIVFRQLWRhdGUgaXMgbm90IHdvcnRoIHBhcnNpbmcgZm9yIGEgd2FpdCB0aGlzIHNob3J0IOKAlCB0aGUgYmFja29mZiBhcHBsaWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5QWZ0ZXJNcyhoZWFkZXJzOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gKGhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5bJ3JldHJ5LWFmdGVyJ107XG4gIGNvbnN0IHNlY29uZHMgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyA/IE51bWJlcihyYXcpIDogTmFOO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShzZWNvbmRzKSB8fCBzZWNvbmRzIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGgubWluKHNlY29uZHMgKiAxMDAwLCBIQU5ETEVSX1JFVFJZX0FGVEVSX01BWF9NUyk7XG59XG5cbi8qKiBQbGF0Zm9ybSBzZWNyZXQgbmFtZSDigJQgaW5qZWN0ZWQgYXMgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciBieSBQbHVnaW5Mb29rdXAgY29uc3RydWN0LiAqL1xuY29uc3QgUExBVEZPUk1fU0VDUkVUX05BTUUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbmlmICghUExBVEZPUk1fU0VDUkVUX05BTUUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9TRUNSRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2aWNlLWFjY291bnQga2V5IChgcGJfc2Ff4oCmYCkgZnJvbSBTZWNyZXRzIE1hbmFnZXIsIGNhY2hlZCBmb3IgdGhlIHdhcm1cbiAqIGNvbnRhaW5lci4gVGhlIHBsdWdpbiBBUEkgdHJhZGVzIGl0IGZvciBhIHNob3J0LWxpdmVkIEpXVCBpdHNlbGYsIHNvIHRoZSBrZXlcbiAqIGdvZXMgb3V0IGFzIHRoZSBCZWFyZXIgY3JlZGVudGlhbC4gQ3JlYXRlIHRoZSBzZWNyZXQgd2l0aFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gLlxuICovXG5jb25zdCBjcmVkZW50aWFsID0gY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsKHsgc2VjcmV0TmFtZTogUExBVEZPUk1fU0VDUkVUX05BTUUgfSk7XG5cbi8qKiBAaW50ZXJuYWwgUmVzZXQgY2FjaGVkIGNyZWRlbnRpYWwgKGZvciB0ZXN0aW5nIG9ubHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldENyZWRlbnRpYWxzQ2FjaGUoKTogdm9pZCB7IGNyZWRlbnRpYWwucmVzZXQoKTsgfVxuXG4vKiogVGhlIEFQSSByZWZ1c2VkIHRoZSBjcmVkZW50aWFsICg0MDEvNDAzKSDigJQgdGhlIGNhbGxlciBtYXkgcmVmcmVzaCBpdCBhbmQgcmV0cnkgb25jZS4gKi9cbmNsYXNzIENyZWRlbnRpYWxSZWZ1c2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIENsb3VkRm9ybWF0aW9uIGNhcHMgYSBjdXN0b20gcmVzb3VyY2UncyBgUmVhc29uYCAodGhlIHJlc3BvbnNlIGJvZHkgYXMgYVxuICogd2hvbGUgbXVzdCBzdGF5IHVuZGVyIDQwOTYgYnl0ZXMsIGFuZCB0aGUgcmVhc29uIGlzIHdoYXQgdGhlIGNvbnNvbGUgYW5kXG4gKiBgY2RrIGRlcGxveWAgcHJpbnQpLiBMZWF2ZSBoZWFkcm9vbSBmb3IgdGhlIG90aGVyIHJlc3BvbnNlIGZpZWxkcy5cbiAqL1xuY29uc3QgTUFYX1JFQVNPTl9CWVRFUyA9IDM1MDA7XG5cbi8qKiBUcnVuY2F0ZSB0byBgbWF4YCBVVEYtOCBieXRlcyBvbiBhIGNoYXJhY3RlciBib3VuZGFyeSwgbWFya2luZyB0aGUgY3V0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlUmVhc29uKHJlYXNvbjogc3RyaW5nLCBtYXggPSBNQVhfUkVBU09OX0JZVEVTKTogc3RyaW5nIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbiwgJ3V0ZjgnKSA8PSBtYXgpIHJldHVybiByZWFzb247XG4gIGNvbnN0IG1hcmtlciA9ICcg4oCmW3RydW5jYXRlZF0nO1xuICBsZXQgb3V0ID0gcmVhc29uLnNsaWNlKDAsIG1heCk7XG4gIHdoaWxlIChCdWZmZXIuYnl0ZUxlbmd0aChvdXQgKyBtYXJrZXIsICd1dGY4JykgPiBtYXgpIG91dCA9IG91dC5zbGljZSgwLCAtMSk7XG4gIHJldHVybiBvdXQgKyBtYXJrZXI7XG59XG5cbi8qKlxuICogVGhlIHJlZnVzYWwgYXMgdGhlIHBsdWdpbiBzZXJ2aWNlIHdyb3RlIGl0IOKAlCBgY29kZWAsIGBtZXNzYWdlYCBhbmQgYSBjb21wYWN0XG4gKiByZW5kZXJpbmcgb2YgYGRldGFpbHNgICh0aGUgYmxvY2tpbmcgQ1ZFcywgdGhlIHBvbGljeSB0aGF0IHJlZnVzZWQgaXTigKYpIOKAlFxuICogc28gdGhlIENsb3VkRm9ybWF0aW9uIGZhaWx1cmUgc2F5cyBXSFksIG5vdCBqdXN0IFwiQVBJIGVycm9yIDQwOTogQ29uZmxpY3RcIi5cbiAqIE9ubHkgdGhvc2UgdGhyZWUgZmllbGRzIGFyZSByZWFkOiB0aGUgYm9keSBpcyBuZXZlciBlY2hvZWQgdmVyYmF0aW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZVJlZnVzYWwoc3RhdHVzOiBudW1iZXIsIHN0YXR1c1RleHQ6IHN0cmluZywgYm9keTogdW5rbm93biwgZmlsdGVyPzogUGx1Z2luRmlsdGVyKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0YSA9IGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnID8gYm9keSBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93bjsgZGV0YWlscz86IHVua25vd24gfSA6IHt9O1xuICBjb25zdCBjb2RlID0gdHlwZW9mIGRhdGEuY29kZSA9PT0gJ3N0cmluZycgPyBkYXRhLmNvZGUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBpbiA9IHR5cGVvZiBmaWx0ZXI/LnZlcnNpb24gPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCtcXC5cXGQrKC1bMC05QS1aYS16Li1dKyk/JC8udGVzdChmaWx0ZXIudmVyc2lvbikgPyBmaWx0ZXIudmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgLy8gQW4gZXhhY3QgcGluIHRoYXQgZG9lcyBub3QgcmVzb2x2ZTogcGhyYXNlIGl0IGZyb20gZGV0YWlscy5zdGF0ZSwgYXMgdGhlIENMSSBkb2VzLlxuICBpZiAoc3RhdHVzID09PSA0MDQgJiYgcGluICYmIHR5cGVvZiBmaWx0ZXI/Lm5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGAke2NvZGUgPz8gJ05PVF9GT1VORCd9OiAke2V4YWN0UGluTm90Rm91bmRNZXNzYWdlKGZpbHRlci5uYW1lLCBwaW4sIGxvb2t1cE5vdEZvdW5kU3RhdGUoYm9keSkpfWA7XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGRhdGEubWVzc2FnZS5sZW5ndGggPiAwID8gZGF0YS5tZXNzYWdlIDogYEFQSSBlcnJvciAke3N0YXR1c306ICR7c3RhdHVzVGV4dH1gO1xuICBsZXQgZGV0YWlscyA9ICcnO1xuICBpZiAoZGF0YS5kZXRhaWxzICE9PSB1bmRlZmluZWQgJiYgZGF0YS5kZXRhaWxzICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRldGFpbHMgPSBgIOKAlCBkZXRhaWxzOiAke0pTT04uc3RyaW5naWZ5KGRhdGEuZGV0YWlscyl9YDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGRldGFpbHMgPSAnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke2NvZGUgPyBgJHtjb2RlfTogYCA6ICcnfSR7bWVzc2FnZX0ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJlLWNvbmZpZ3VyZWQgQXhpb3MgaW5zdGFuY2UgZm9yIEFQSSByZXF1ZXN0cy5cbiAqXG4gKiBAcGFyYW0gYmFzZVVSTCAtIEJhc2UgVVJMIG9mIHRoZSB0YXJnZXQgQVBJXG4gKiBAcGFyYW0ga2V5IC0gc2VydmljZS1hY2NvdW50IGtleSBzZW50IGFzIHRoZSBCZWFyZXIgY3JlZGVudGlhbFxuICogQHBhcmFtIHJlcXVlc3RJZCAtIHRoaXMgTGFtYmRhIGludm9jYXRpb24ncyBhd3NSZXF1ZXN0SWQsIHNlbnQgYXMgYFgtUmVxdWVzdC1JZGBcbiAqICAgc28gdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgYXVkaXQgcm93IGpvaW5zIGJhY2sgdG8gdGhpcyBpbnZvY2F0aW9uJ3MgbG9nXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIEF4aW9zIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShiYXNlVVJMOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBBeGlvc0luc3RhbmNlIHtcbiAgLy8gQSBwcml2YXRlLUNBIHBsYXRmb3JtIGlzIFZFUklGSUVEIGFnYWluc3QgUExBVEZPUk1fQ0FfQlVORExFIChzZXQgYnkgdGhlXG4gIC8vIFBsdWdpbkxvb2t1cCBjb25zdHJ1Y3Qgd2hlbiB0aGUgc3ludGggaGFkIG9uZSk7IG90aGVyd2lzZSBOb2RlJ3MgZGVmYXVsdCBzdG9yZS5cbiAgY29uc3QgY2EgPSBwbGF0Zm9ybUNhTGlzdCgpO1xuICByZXR1cm4gYXhpb3MuY3JlYXRlKHtcbiAgICBiYXNlVVJMLFxuICAgIHRpbWVvdXQ6IEhBTkRMRVJfVElNRU9VVF9NUyxcbiAgICAuLi4oY2EgJiYgeyBodHRwc0FnZW50OiBuZXcgQWdlbnQoeyBjYSB9KSB9KSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7a2V5fWAsXG4gICAgICAuLi5jb3JyZWxhdGlvbkhlYWRlcnMoeyByZXF1ZXN0SWQgfSksXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyBwbHVnaW4gY29uZmlndXJhdGlvbiBmcm9tIHRoZSBleHRlcm5hbCBBUEkgd2l0aCByZXRyeSBsb2dpYy5cbiAqIFJldHJpZXMgb24gdHJhbnNpZW50IGZhaWx1cmVzICg0MjksIDUwMiwgNTAzLCA1MDQsIG5ldHdvcmsgZXJyb3JzKVxuICogd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBDb25maWd1cmVkIEF4aW9zIGluc3RhbmNlXG4gKiBAcGFyYW0gYmFzZVVSTCAtIFRoZSBwbGF0Zm9ybSBVUkwgYGFwaWAgdGFyZ2V0cyAocHJlZml4ZXMgYSBxdW90YSByZWZ1c2FsJ3MgdXBncmFkZSBwYXRoKVxuICogQHBhcmFtIHBsdWdpbkZpbHRlciAtIEZpbHRlciBjcml0ZXJpYSBmb3IgdGhlIHBsdWdpbiBsb29rdXBcbiAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZGF0YSByZXR1cm5lZCBieSB0aGUgQVBJXG4gKiBAdGhyb3dzIEVycm9yIG9uIHBlcnNpc3RlbnQgZmFpbHVyZSwgdGltZW91dCBvciBpbnZhbGlkIHJlc3BvbnNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoKGFwaTogQXhpb3NJbnN0YW5jZSwgYmFzZVVSTDogc3RyaW5nLCBwbHVnaW5GaWx0ZXI6IFBsdWdpbkZpbHRlciwgc3RlcEtleT86IHN0cmluZyk6IFByb21pc2U8UGx1Z2luPiB7XG4gIGxhbWJkYUxvZy5kZWJ1ZygnRkVUQ0gnLCAnU3RhcnRpbmcgcGx1Z2luIGZldGNoJywgeyBmaWx0ZXI6IHBsdWdpbkZpbHRlciB9KTtcblxuICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgLy8gQSBwbGFpbiA0MjkncyBSZXRyeS1BZnRlciwgaG9ub3VyZWQgb24gdGhlIG5leHQgYXR0ZW1wdCB3aGVuIGxvbmdlciB0aGFuIHRoZSBiYWNrb2ZmLlxuICBsZXQgc2VydmVyRGVsYXk6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBIQU5ETEVSX01BWF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBpZiAoYXR0ZW1wdCA+IDApIHtcbiAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5tYXgoSEFORExFUl9SRVRSWV9ERUxBWV9NUyAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKSwgc2VydmVyRGVsYXkgPz8gMCk7XG4gICAgICBzZXJ2ZXJEZWxheSA9IHVuZGVmaW5lZDtcbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdSRVRSWScsIGBBdHRlbXB0ICR7YXR0ZW1wdCArIDF9LyR7SEFORExFUl9NQVhfUkVUUklFUyArIDF9IGFmdGVyICR7ZGVsYXl9bXNgKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ29udHJhY3QgQzE6IHdpdGggYSBrbm93biBwaXBlbGluZSArIHN0ZXAsIHRoZSBwbHVnaW4gc2VydmljZSByZWNvcmRzXG4gICAgICAvLyB0aGUgd2FybmluZ3MgaXQgcmV0dXJucyBhZ2FpbnN0IHRoZW0gKG5vdCBvbmx5IHRoaXMgTGFtYmRhJ3MgbG9nKS5cbiAgICAgIGNvbnN0IHBpcGVsaW5lSWQgPSBwcm9jZXNzLmVudi5QSVBFTElORV9JRDtcbiAgICAgIGNvbnN0IHsgZGF0YTogYm9keSwgc3RhdHVzIH0gPSBhd2FpdCBhcGkucG9zdDx1bmtub3duPignL2FwaS9wbHVnaW5zL2xvb2t1cCcsIHtcbiAgICAgICAgZmlsdGVyOiBwbHVnaW5GaWx0ZXIsXG4gICAgICAgIC4uLihwaXBlbGluZUlkICYmIHN0ZXBLZXkgPyB7IGNvbnRleHQ6IHsgcGlwZWxpbmVJZCwgc3RlcEtleXM6IFtzdGVwS2V5XSB9IH0gOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBwbHVnaW46IGRhdGEsIHdhcm5pbmdzIH0gPSB1bndyYXBMb29rdXAoYm9keSk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbXB0eSByZXNwb25zZSBkYXRhIGZyb20gQVBJJyk7XG4gICAgICB9XG4gICAgICAvLyBHcmFkZWQgd2FybmluZ3MgKGxpZmVjeWNsZSwgdnVsbmVyYWJpbGl0eSwgY29tcGxpYW5jZSkg4oCUIHN1cmZhY2VkIGluIHRoZVxuICAgICAgLy8gZGVwbG95IGxvZzsgdGhlIGxvb2t1cCBzdGlsbCBzdWNjZWVkcy4gVnVsbmVyYWJpbGl0eSBzdGF0ZSBuZXZlciBmYWlscyBhXG4gICAgICAvLyBkZXBsb3k6IGl0IGlzIHJlcG9ydGVkIChhbmQsIHdpdGggY29udGV4dCwgcmVjb3JkZWQgc2VydmVyLXNpZGUpLlxuICAgICAgZm9yIChjb25zdCB3IG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIGxhbWJkYUxvZy53YXJuKCdQTFVHSU5fV0FSTklORycsIGBbJHt3LnNldmVyaXR5LnRvVXBwZXJDYXNlKCl9XSAke3cubWVzc2FnZX1gLCB7IHBsdWdpbjogZGF0YS5uYW1lLCB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sIGNvZGU6IHcuY29kZSwgc2V2ZXJpdHk6IHcuc2V2ZXJpdHkgfSk7XG4gICAgICB9XG5cbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdQbHVnaW4gZmV0Y2hlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcGx1Z2luOiBkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbixcbiAgICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFQ09OTkFCT1JURUQnKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmVycm9yKCdGRVRDSCcsIGBQbHVnaW4gbG9va3VwIHRpbWVkIG91dCBhZnRlciAke0hBTkRMRVJfVElNRU9VVF9NU31tc2ApO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGxvb2t1cCB0aW1lZCBvdXQgYWZ0ZXIgJHtIQU5ETEVSX1RJTUVPVVRfTVN9bXNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgUVVPVEEgcmVmdXNhbCBpcyBub3QgdHJhbnNpZW50OiB0aGUgY291bnRlciBvbmx5IGVtcHRpZXMgd2hlbiB0aGVcbiAgICAgICAgLy8gcGVyaW9kIHJlc2V0cywgc28gcmV0cnlpbmcganVzdCBzcGVuZHMgdHdvIG1vcmUgbG9va3Vwcycgd29ydGggb2ZcbiAgICAgICAgLy8gd2FpdGluZyBhbmQgcmVwb3J0cyB0aGUgc2FtZSB0aGluZy4gRmFpbCBmYXN0IHdpdGggdGhlIHF1b3RhLCB0aGVcbiAgICAgICAgLy8gbnVtYmVycywgdGhlIHJlc2V0IGRhdGUgYW5kIHdoZXJlIHRvIHJhaXNlIGl0LCBhcyB0aGUgQ0ZOIFJlYXNvbi5cbiAgICAgICAgY29uc3QgcXVvdGFNZXNzYWdlID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDI5XG4gICAgICAgICAgPyBkZXNjcmliZVF1b3RhRXhjZWVkZWQoZXJyb3IucmVzcG9uc2UuZGF0YSwgYmFzZVVSTClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHF1b3RhTWVzc2FnZSkge1xuICAgICAgICAgIGxhbWJkYUxvZy5lcnJvcignRkVUQ0gnLCBxdW90YU1lc3NhZ2UpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIHBsdWdpbjogJHtxdW90YU1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXRyeWFibGUgPSBlcnJvci5yZXNwb25zZVxuICAgICAgICAgID8gUkVUUllBQkxFX1NUQVRVU0VTLmhhcyhlcnJvci5yZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgOiBSRVRSWUFCTEVfQ09ERVMuaGFzKGVycm9yLmNvZGUgPz8gJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDI5KSBzZXJ2ZXJEZWxheSA9IHJldHJ5QWZ0ZXJNcyhlcnJvci5yZXNwb25zZS5oZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBlcnJvci5yZXNwb25zZVxuICAgICAgICAgID8gZGVzY3JpYmVSZWZ1c2FsKGVycm9yLnJlc3BvbnNlLnN0YXR1cywgZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dCwgZXJyb3IucmVzcG9uc2UuZGF0YSwgcGx1Z2luRmlsdGVyKVxuICAgICAgICAgIDogZXJyb3IuY29kZSB8fCBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgIGlmIChpc0NyZWRlbnRpYWxSZWZ1c2FsKGVycm9yLnJlc3BvbnNlPy5zdGF0dXMpKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLndhcm4oJ0FVVEgnLCBgQ3JlZGVudGlhbCByZWZ1c2VkOiAke21zZ31gKTtcbiAgICAgICAgICB0aHJvdyBuZXcgQ3JlZGVudGlhbFJlZnVzZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHBsdWdpbjogJHttc2d9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0cnlhYmxlICYmIGF0dGVtcHQgPCBIQU5ETEVSX01BWF9SRVRSSUVTKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmluZm8oJ1JFVFJZJywgYFJldHJ5YWJsZSBlcnJvcjogJHttc2d9YCwgeyBhdHRlbXB0OiBhdHRlbXB0ICsgMSB9KTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBwbHVnaW46ICR7bXNnfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgbG9nIHRoZSB1cHN0cmVhbSBib2R5IHZlcmJhdGltIOKAlCBpdCBtYXkgY2FycnkgYSBzdGFjayB0cmFjZSxcbiAgICAgICAgLy8gYSByZXF1ZXN0IHBheWxvYWQgZWNobywgb3Igb3RoZXIgc2Vuc2l0aXZlIGRhdGEgd2Ugc2hvdWxkbid0IGVjaG9cbiAgICAgICAgLy8gaW50byBMYW1iZGEgQ2xvdWRXYXRjaCBsb2dzLiBLZWVwIGp1c3QgdGhlIGhpZ2gtbGV2ZWwgc2hhcGUuXG4gICAgICAgIGNvbnN0IHNhZmVCb2R5ID0gZXJyb3IucmVzcG9uc2U/LmRhdGEgJiYgdHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB7IGNvZGU6IChlcnJvci5yZXNwb25zZS5kYXRhIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlLCBtZXNzYWdlOiAoZXJyb3IucmVzcG9uc2UuZGF0YSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSkubWVzc2FnZSB9XG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxhbWJkYUxvZy5lcnJvcignRkVUQ0gnLCBtc2csIHsgcmVzcG9uc2VCb2R5OiBzYWZlQm9keSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luOiAke21zZ31gKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdVbmtub3duIGVycm9yIGR1cmluZyBwbHVnaW4gZmV0Y2gnKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBsYXN0RXJyb3IgPz8gbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luIGFmdGVyIHJldHJpZXMnKTtcbn1cblxuLyoqXG4gKiBMb29rIHRoZSBwbHVnaW4gdXAgd2l0aCB0aGUgY2FjaGVkIGNyZWRlbnRpYWwuIE9uIGEgNDAxLzQwMyB0aGUga2V5IHdhcyBtb3N0XG4gKiBsaWtlbHkgcm90YXRlZCB1bmRlcm5lYXRoIHRoaXMgd2FybSBjb250YWluZXIgKHRva2VuLXJlbmV3IHN0b3JlcyB0aGUgbmV3IGtleVxuICogYW5kIHJldm9rZXMgdGhlIG9sZCBvbmUpLCBzbyBkcm9wIHRoZSBjYWNoZSwgcmUtcmVhZCB0aGUgc2VjcmV0IGFuZCByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb29rdXBXaXRoQ3JlZGVudGlhbFJlZnJlc2goYmFzZVVSTDogc3RyaW5nLCBwbHVnaW5GaWx0ZXI6IFBsdWdpbkZpbHRlciwgc3RlcEtleT86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW4+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZmV0Y2goY3JlYXRlKGJhc2VVUkwsIGF3YWl0IGNyZWRlbnRpYWwuZ2V0S2V5KCksIHJlcXVlc3RJZCksIGJhc2VVUkwsIHBsdWdpbkZpbHRlciwgc3RlcEtleSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIENyZWRlbnRpYWxSZWZ1c2VkRXJyb3IpKSB0aHJvdyBlcnI7XG4gICAgY3JlZGVudGlhbC5pbnZhbGlkYXRlKCk7XG4gICAgbGFtYmRhTG9nLmluZm8oJ0FVVEgnLCAnUmUtcmVhZGluZyB0aGUgc2VydmljZS1hY2NvdW50IGtleSBmcm9tIFNlY3JldHMgTWFuYWdlciBhbmQgcmV0cnlpbmcgb25jZScpO1xuICAgIHJldHVybiBmZXRjaChjcmVhdGUoYmFzZVVSTCwgYXdhaXQgY3JlZGVudGlhbC5nZXRLZXkoKSwgcmVxdWVzdElkKSwgYmFzZVVSTCwgcGx1Z2luRmlsdGVyLCBzdGVwS2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgcGx1Z2luIGZpbHRlciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcGx1Z2luRmlsdGVyIC0gRmlsdGVyIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkXG4gKiBAdGhyb3dzIEVycm9yIGlmIGludmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQbHVnaW5GaWx0ZXIocGx1Z2luRmlsdGVyOiB1bmtub3duKTogcGx1Z2luRmlsdGVyIGlzIFBsdWdpbkZpbHRlciB7XG4gIGlmICghcGx1Z2luRmlsdGVyIHx8IHR5cGVvZiBwbHVnaW5GaWx0ZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgcGx1Z2luRmlsdGVyJyk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXIgPSBwbHVnaW5GaWx0ZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICghZmlsdGVyLm5hbWUgJiYgIWZpbHRlci5pZCAmJiAhZmlsdGVyLnZlcnNpb24gJiYgIWZpbHRlci5vcmdJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGx1Z2luRmlsdGVyIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY3JpdGVyaW9uIChuYW1lLCBpZCwgdmVyc2lvbiwgb3Igb3JnSWQpJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgaGFuZGxlciBmb3IgQ2xvdWRGb3JtYXRpb24gQ3VzdG9tIFJlc291cmNlIHRoYXQgcGVyZm9ybXMgcGx1Z2luIGxvb2t1cC5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIHdpdGggdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyIChQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyKS5cbiAqIENyZWF0ZSB0aGUgc2VjcmV0IHdpdGg6IGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYFxuICpcbiAqIFJlcXVlc3QgVHlwZXM6XG4gKiAtIENyZWF0ZS9VcGRhdGU6IGZldGNoZXMgYW5kIHJldHVybnMgcGx1Z2luIGNvbmZpZ3VyYXRpb24gZnJvbSBBUElcbiAqIC0gRGVsZXRlOiBuby1vcCAoYWx3YXlzIHN1Y2NlZWRzKVxuICpcbiAqIFJlc3BvbnNlOlxuICogLSBTdWNjZXNzOiBSZXR1cm5zIGJhc2U2NC1lbmNvZGVkIHBsdWdpbiBKU09OIGluIERhdGEuUmVzdWx0VmFsdWVcbiAqIC0gRmFpbHVyZTogUmV0dXJucyBlcnJvciBtZXNzYWdlIGluIFJlYXNvblxuICpcbiAqIEBwYXJhbSBldmVudCAtIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBldmVudFxuICogQHBhcmFtIGNvbnRleHQgLSBMYW1iZGEgY29udGV4dDsgaXRzIGF3c1JlcXVlc3RJZCByaWRlcyB0aGUgbG9va3VwIGFzIGBYLVJlcXVlc3QtSWRgXG4gKiBAcmV0dXJucyBDbG91ZEZvcm1hdGlvbiByZXNwb25zZVxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gUmVzb3VyY2UgUHJvcGVydGllczpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJiYXNlVVJMXCI6IFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb21cIixcbiAqICAgXCJwbHVnaW5GaWx0ZXJcIjoge1xuICogICAgIFwibmFtZVwiOiBcIm5vZGVqcy1idWlsZFwiLFxuICogICAgIFwidmVyc2lvblwiOiBcIjEuMC4wXCIsXG4gKiAgICAgXCJpc0FjdGl2ZVwiOiB0cnVlXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQ6IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCxcbiAgY29udGV4dD86IFBpY2s8Q29udGV4dCwgJ2F3c1JlcXVlc3RJZCc+LFxuKTogUHJvbWlzZTxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U+ID0+IHtcbiAgLy8gTk9URTogbmV2ZXIgbG9nIGV2ZW50LlN0YWNrSWQgaGVyZSDigJQgdGhlIENsb3VkRm9ybWF0aW9uIFN0YWNrIEFSTiBlbWJlZHMgdGhlXG4gIC8vIEFXUyBhY2NvdW50IGlkIChhcm46YXdzOmNsb3VkZm9ybWF0aW9uOjxyZWdpb24+OjxBQ0NPVU5UX0lEPjpzdGFjay/igKYpLCB3aGljaFxuICAvLyBtdXN0IG5ldmVyIGJlIHBlcnNpc3RlZCB0byBDbG91ZFdhdGNoLiByZXF1ZXN0SWQgKyBsb2dpY2FsUmVzb3VyY2VJZCBhcmVcbiAgLy8gc3VmZmljaWVudCBmb3IgY29ycmVsYXRpb24uIChTdGFja0lkIGlzIHN0aWxsIHJldHVybmVkIGluIHRoZSBDRk4gcmVzcG9uc2VcbiAgLy8gYm9keSBiZWxvdyDigJQgdGhhdCBpcyB0aGUgbWFuZGF0b3J5IENGTiBwcm90b2NvbCBmaWVsZCBhbmQgaXMgbm90IGEgbG9nLilcbiAgbGFtYmRhTG9nLmluZm8oJ1NUQVJUJywgYCR7ZXZlbnQuUmVxdWVzdFR5cGV9IHJlcXVlc3QgcmVjZWl2ZWRgLCB7XG4gICAgbG9naWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIHJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICB9KTtcblxuICBjb25zdCBiYXNlUmVzcG9uc2U6IFBhcnRpYWw8Q2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlPiA9IHtcbiAgICBTdGFja0lkOiBldmVudC5TdGFja0lkLFxuICAgIFJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICB9O1xuXG4gIHRyeSB7XG4gICAgLy8gSGFuZGxlIERlbGV0ZSAtIGFsd2F5cyBzdWNjZWVkIChuby1vcClcbiAgICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09ICdEZWxldGUnKSB7XG4gICAgICBsYW1iZGFMb2cuaW5mbygnREVMRVRFJywgJ05vLW9wIC0gcmV0dXJuaW5nIFNVQ0NFU1MnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgICAgU3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICAgIFJlYXNvbjogJ0RlbGV0ZSBjb21wbGV0ZWQgKG5vLW9wKScsXG4gICAgICB9IGFzIENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGFuZCB2YWxpZGF0ZSBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcGx1Z2luRmlsdGVyID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLnBsdWdpbkZpbHRlcjtcbiAgICBjb25zdCBiYXNlVVJMID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLmJhc2VVUkwgfHwgSEFORExFUl9ERUZBVUxUX0JBU0VfVVJMO1xuXG4gICAgaWYgKCFiYXNlVVJMLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykgJiYgIWJhc2VVUkwuc3RhcnRzV2l0aCgnaHR0cDovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYmFzZVVSTDogXCIke2Jhc2VVUkx9XCIg4oCUIG11c3Qgc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vYCk7XG4gICAgfVxuXG4gICAgbGFtYmRhTG9nLmluZm8oJ0NPTkZJRycsICdDb25maWd1cmF0aW9uIGxvYWRlZCcsIHsgYmFzZVVSTCwgcGx1Z2luRmlsdGVyIH0pO1xuXG4gICAgdmFsaWRhdGVQbHVnaW5GaWx0ZXIocGx1Z2luRmlsdGVyKTtcblxuICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdJbml0aWF0aW5nIHBsdWdpbiBsb29rdXAuLi4nKTtcbiAgICBjb25zdCBzdGVwS2V5ID0gdHlwZW9mIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5zdGVwS2V5ID09PSAnc3RyaW5nJyA/IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5zdGVwS2V5IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBsdWdpbiA9IGF3YWl0IGxvb2t1cFdpdGhDcmVkZW50aWFsUmVmcmVzaChiYXNlVVJMLCBwbHVnaW5GaWx0ZXIsIHN0ZXBLZXksIGNvbnRleHQ/LmF3c1JlcXVlc3RJZCk7XG4gICAgbGFtYmRhTG9nLmluZm8oJ0ZFVENIJywgJ1BsdWdpbiByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgbmFtZTogcGx1Z2luLm5hbWUsXG4gICAgICB2ZXJzaW9uOiBwbHVnaW4udmVyc2lvbixcbiAgICAgIGlkOiBwbHVnaW4uaWQsXG4gICAgfSk7XG5cbiAgICAvLyBTdHJpcCBsYXJnZSBmaWVsZHMgdG8gc3RheSB3aXRoaW4gQ2xvdWRGb3JtYXRpb24ncyA0MDk2LWJ5dGUgRGF0YSBsaW1pdC5cbiAgICAvLyBDREsgY29uc3RydWN0cyBvbmx5IG5lZWQgdGhlIGZpZWxkcyB1c2VkIGJ5IGNyZWF0ZUNvZGVCdWlsZFN0ZXAoKS5cbiAgICBjb25zdCBzbGltID0ge1xuICAgICAgaWQ6IHBsdWdpbi5pZCxcbiAgICAgIG5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgdmVyc2lvbjogcGx1Z2luLnZlcnNpb24sXG4gICAgICBwbHVnaW5UeXBlOiBwbHVnaW4ucGx1Z2luVHlwZSxcbiAgICAgIGNvbXB1dGVUeXBlOiBwbHVnaW4uY29tcHV0ZVR5cGUsXG4gICAgICBjb21tYW5kczogcGx1Z2luLmNvbW1hbmRzLFxuICAgICAgaW5zdGFsbENvbW1hbmRzOiBwbHVnaW4uaW5zdGFsbENvbW1hbmRzLFxuICAgICAgZW52OiBwbHVnaW4uZW52LFxuICAgICAgbWV0YWRhdGE6IHBsdWdpbi5tZXRhZGF0YSxcbiAgICAgIHByaW1hcnlPdXRwdXREaXJlY3Rvcnk6IHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5LFxuICAgICAgc2VjcmV0czogcGx1Z2luLnNlY3JldHMsXG4gICAgICBmYWlsdXJlQmVoYXZpb3I6IHBsdWdpbi5mYWlsdXJlQmVoYXZpb3IsXG4gICAgICB0aW1lb3V0OiBwbHVnaW4udGltZW91dCxcbiAgICB9O1xuXG4gICAgY29uc3QgZW5jb2RlZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHNsaW0pLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgbGFtYmRhTG9nLmRlYnVnKCdFTkNPREUnLCAnRW5jb2RlZCBwbHVnaW4gZGF0YScsIHsgbGVuZ3RoOiBlbmNvZGVkLmxlbmd0aCB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlUmVzcG9uc2UsXG4gICAgICBTdGF0dXM6ICdTVUNDRVNTJyxcbiAgICAgIFJlYXNvbjogYFBsdWdpbiAnJHtwbHVnaW4ubmFtZX0nICh2JHtwbHVnaW4udmVyc2lvbn0pIHJldHJpZXZlZCBzdWNjZXNzZnVsbHlgLFxuICAgICAgRGF0YToge1xuICAgICAgICBSZXN1bHRWYWx1ZTogZW5jb2RlZCxcbiAgICAgIH0sXG4gICAgfSBhcyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgbGFtYmRhTG9nLmVycm9yKCdFUlJPUicsICdIYW5kbGVyIGZhaWxlZCcsIHtcbiAgICAgIHJlYXNvbixcbiAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgU3RhdHVzOiAnRkFJTEVEJyxcbiAgICAgIFJlYXNvbjogdHJ1bmNhdGVSZWFzb24ocmVhc29uKSxcbiAgICB9IGFzIENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBsYW1iZGFMb2cuaW5mbygnRU5EJywgJ0N1c3RvbSByZXNvdXJjZSBleGVjdXRpb24gY29tcGxldGVkJyk7XG4gIH1cbn07XG4iXX0=
|
package/lib/index.d.ts
CHANGED
|
@@ -37,8 +37,15 @@ export * from './core/role-types.js';
|
|
|
37
37
|
export * from './core/security-group-types.js';
|
|
38
38
|
export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
|
|
39
39
|
export * from './core/step-manifest.js';
|
|
40
|
-
export { type ContractValueType, type PluginContract, type ContractScope, type ContractIssue, type ContractScopeProps, pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, type PluginStepRef, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, type PluginRefIdentity, sanitizePublisher, } from './core/plugin-contract.js';
|
|
41
|
-
export { unwrapLookup } from './core/plugin-lookup-envelope.js';
|
|
40
|
+
export { type ContractValueType, type PluginContract, type ContractScope, type ContractIssue, type ContractScopeProps, pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, type PluginStepRef, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, pluginStepLabel, type PluginRefIdentity, sanitizePublisher, } from './core/plugin-contract.js';
|
|
41
|
+
export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, type LookupWarning, type LookupWarningSeverity, lookupNotFoundState, exactPinNotFoundMessage, type LookupNotFoundState, } from './core/plugin-lookup-envelope.js';
|
|
42
|
+
export * from './core/synth-failure.js';
|
|
43
|
+
export * from './core/runtime-check.js';
|
|
44
|
+
export * from './core/platform-tls.js';
|
|
45
|
+
export * from './core/audit-correlation.js';
|
|
46
|
+
export * from './core/quota-exceeded.js';
|
|
47
|
+
export * from './core/security-reports.js';
|
|
48
|
+
export * from './core/pipeline-registration.js';
|
|
42
49
|
export * from './pipeline/deploy-attribution.js';
|
|
43
50
|
export * from './pipeline/structure-preview.js';
|
|
44
51
|
export * from './pipeline/plugin-spec.js';
|