image-scanner-with-trivy 2.1.2 → 2.1.3
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/.jsii
CHANGED
|
@@ -4664,6 +4664,6 @@
|
|
|
4664
4664
|
"symbolId": "src/image-scanner-with-trivy:Severity"
|
|
4665
4665
|
}
|
|
4666
4666
|
},
|
|
4667
|
-
"version": "2.1.
|
|
4668
|
-
"fingerprint": "
|
|
4667
|
+
"version": "2.1.3",
|
|
4668
|
+
"fingerprint": "MLezUwjSdnluwvUACLAC3044AM3/IaEvfSIDG2rpLyM="
|
|
4669
4669
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"use strict";var g=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var h=(e,t)=>{for(var n in t)g(e,n,{get:t[n],enumerable:!0})},
|
|
1
|
+
"use strict";var g=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var h=(e,t)=>{for(var n in t)g(e,n,{get:t[n],enumerable:!0})},R=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of C(t))!O.call(e,r)&&r!==n&&g(e,r,{get:()=>t[r],enumerable:!(o=y(t,r))||o.enumerable});return e};var L=e=>R(g({},"__esModule",{value:!0}),e);var b={};h(b,{handler:()=>k});module.exports=L(b);var d=require("child_process"),p=require("fs"),a=require("@aws-sdk/client-cloudwatch-logs"),c=require("@aws-sdk/client-cloudformation");var S="/tmp/.trivyignore",m=new a.CloudWatchLogsClient,w=new c.CloudFormationClient,k=async function(e){let t=e.RequestType,n=e.ResourceProperties;if(!n.addr||!n.imageUri)throw new Error("addr and imageUri are required.");let o={PhysicalResourceId:n.addr,Data:{}};if(t==="Create"||t==="Update"){let r=E(n);n.trivyIgnore.length&&(console.log("trivyignore: "+JSON.stringify(n.trivyIgnore)),$(n.trivyIgnore));let i=`/opt/trivy image --no-progress ${r.join(" ")} ${n.imageUri}`;console.log("command: "+i),console.log("imageUri: "+n.imageUri);let s=(0,d.spawnSync)(i,{shell:!0});if(await x(s,n.imageUri,n.output),s.status===0)return o;let u=`Error: ${s.error}
|
|
2
2
|
Signal: ${s.signal}
|
|
3
3
|
Status: ${s.status}
|
|
4
4
|
Image Scanner returned fatal errors. You may have vulnerabilities. See logs.`;if(n.suppressErrorOnRollback==="true"&&await I(e.StackId))return console.log(`Vulnerabilities may be detected, but suppressing errors during rollback (suppressErrorOnRollback=true).
|
|
5
|
-
${u}`),o;throw new Error(u)}return o}
|
|
6
|
-
`);(0,p.writeFileSync)(S,t,"utf-8")},
|
|
5
|
+
${u}`),o;throw new Error(u)}return o},E=e=>{let t=[];return e.ignoreUnfixed==="true"&&t.push("--ignore-unfixed"),e.severity.length&&t.push(`--severity ${e.severity.join(",")}`),e.scanners.length&&t.push(`--scanners ${e.scanners.join(",")}`),e.imageConfigScanners.length&&t.push(`--image-config-scanners ${e.imageConfigScanners.join(",")}`),e.exitCode&&t.push(`--exit-code ${e.exitCode}`),e.exitOnEol&&t.push(`--exit-on-eol ${e.exitOnEol}`),e.trivyIgnore.length&&t.push(`--ignorefile ${S}`),e.platform&&t.push(`--platform ${e.platform}`),t},$=e=>{let t=e.join(`
|
|
6
|
+
`);(0,p.writeFileSync)(S,t,"utf-8")},x=async(e,t,n)=>{switch(n?.type){case"cloudWatchLogs":await v(e,n,t);break;default:console.log(`stderr:
|
|
7
7
|
`+e.stderr.toString()),console.log(`stdout:
|
|
8
8
|
`+e.stdout.toString())}},v=async(e,t,n)=>{let[o,r]=n.split(":"),i=r?`uri=${o},tag=${r}`:`uri=${o}`;try{await m.send(new a.CreateLogStreamCommand({logGroupName:t.logGroupName,logStreamName:i}))}catch(l){if(l instanceof a.ResourceAlreadyExistsException)console.log(`Log stream ${i} already exists in log group ${t.logGroupName}.`);else throw l}let s=new Date().getTime(),u={logGroupName:t.logGroupName,logStreamName:i,logEvents:[{timestamp:s,message:`stderr:
|
|
9
9
|
`+e.stderr.toString()},{timestamp:s,message:`stdout:
|
|
10
|
-
`+e.stdout.toString()}]},f=new a.PutLogEventsCommand(u);await m.send(f),console.log(`Scan logs output to the log group: ${t.logGroupName}, log stream: ${i}`)},I=async e=>{let t=new c.DescribeStacksCommand({StackName:e}),n=await w.send(t);if(n.Stacks&&n.Stacks.length>0)
|
|
10
|
+
`+e.stdout.toString()}]},f=new a.PutLogEventsCommand(u);await m.send(f),console.log(`Scan logs output to the log group: ${t.logGroupName}, log stream: ${i}`)},I=async e=>{let t=new c.DescribeStacksCommand({StackName:e}),n=await w.send(t);if(n.Stacks&&n.Stacks.length>0){let o=n.Stacks[0].StackStatus;return o===c.ResourceStatus.ROLLBACK_IN_PROGRESS||o===c.ResourceStatus.UPDATE_ROLLBACK_IN_PROGRESS}throw new Error(`Stack not found or no stacks returned from DescribeStacks command, stackId: ${e}`)};0&&(module.exports={handler});
|
package/assets/lambda/index.ts
CHANGED
|
@@ -168,7 +168,10 @@ const isRollbackInProgress = async (stackId: string): Promise<boolean> => {
|
|
|
168
168
|
|
|
169
169
|
if (response.Stacks && response.Stacks.length > 0) {
|
|
170
170
|
const stackStatus = response.Stacks[0].StackStatus;
|
|
171
|
-
return
|
|
171
|
+
return (
|
|
172
|
+
stackStatus === ResourceStatus.ROLLBACK_IN_PROGRESS ||
|
|
173
|
+
stackStatus === ResourceStatus.UPDATE_ROLLBACK_IN_PROGRESS
|
|
174
|
+
);
|
|
172
175
|
}
|
|
173
176
|
|
|
174
177
|
throw new Error(
|
|
@@ -60,7 +60,7 @@ class ScanLogsOutput {
|
|
|
60
60
|
}
|
|
61
61
|
exports.ScanLogsOutput = ScanLogsOutput;
|
|
62
62
|
_a = JSII_RTTI_SYMBOL_1;
|
|
63
|
-
ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.1.
|
|
63
|
+
ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.1.3" };
|
|
64
64
|
class CloudWatchLogsOutput extends ScanLogsOutput {
|
|
65
65
|
constructor(options) {
|
|
66
66
|
super();
|
|
@@ -191,5 +191,5 @@ class ImageScannerWithTrivy extends constructs_1.Construct {
|
|
|
191
191
|
}
|
|
192
192
|
exports.ImageScannerWithTrivy = ImageScannerWithTrivy;
|
|
193
193
|
_b = JSII_RTTI_SYMBOL_1;
|
|
194
|
-
ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.1.
|
|
194
|
+
ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.1.3" };
|
|
195
195
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUE0QjtBQUM1Qiw2Q0FTcUI7QUFFckIsK0RBQXNEO0FBQ3RELGlEQUFrRTtBQUNsRSx1REFNZ0M7QUFDaEMsbURBQXVGO0FBQ3ZGLG1FQUF3RDtBQUN4RCwyQ0FBdUM7QUFDdkMsbUNBS2lCO0FBRWpCOzs7O0dBSUc7QUFDSCxJQUFZLFFBTVg7QUFORCxXQUFZLFFBQVE7SUFDbEIsK0JBQW1CLENBQUE7SUFDbkIsdUJBQVcsQ0FBQTtJQUNYLDZCQUFpQixDQUFBO0lBQ2pCLHlCQUFhLENBQUE7SUFDYixpQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBTlcsUUFBUSx3QkFBUixRQUFRLFFBTW5CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNsQix5QkFBYSxDQUFBO0lBQ2IsNkJBQWlCLENBQUE7SUFDakIsNkJBQWlCLENBQUE7SUFDakIsK0JBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUxXLFFBQVEsd0JBQVIsUUFBUSxRQUtuQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLG1CQUdYO0FBSEQsV0FBWSxtQkFBbUI7SUFDN0Isd0NBQWlCLENBQUE7SUFDakIsd0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUhXLG1CQUFtQixtQ0FBbkIsbUJBQW1CLFFBRzlCO0FBWUQ7O0dBRUc7QUFDSCxNQUFzQixjQUFjO0lBQ2xDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFrQztRQUM3RCxPQUFPLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7QUFOSCx3Q0FZQzs7O0FBRUQsTUFBTSxvQkFBcUIsU0FBUSxjQUFjO0lBTS9DLFlBQVksT0FBa0M7UUFDNUMsS0FBSyxFQUFF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QUM7WUFDdEIsS0FBSywyQkFBYSxDQUFDLE9BQU87Z0JBQ3hCLE9BQU8sY0FBYyxLQUFLLCtCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUNyRCxLQUFLLDJCQUFhLENBQUMsTUFBTTtnQkFDdkIsT0FBTyxjQUFjLEtBQUssK0JBQWlCLENBQUMsTUFBTSxDQUFDO1lBQ3JELEtBQUssMkJBQWEsQ0FBQyxRQUFRO2dCQUN6QixPQUFPLGNBQWMsS0FBSywrQkFBaUIsQ0FBQyxRQUFRLENBQUM7WUFDdkQsS0FBSywyQkFBYSxDQUFDLDBCQUEwQjtnQkFDM0MsT0FBTyxjQUFjLEtBQUssK0JBQWlCLENBQUMsdUJBQXVCLENBQUM7WUFDdEUsS0FBSyxTQUFTO2dCQUNaLE9BQU8sY0FBYyxLQUFLLFNBQVMsQ0FBQztZQUN0QztnQkFDRSxPQUFPLGFBQTZCLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7O0FBM0pILHNEQTRKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEFubm90YXRpb25zLFxuICBDZm5EZWxldGlvblBvbGljeSxcbiAgQ3VzdG9tUmVzb3VyY2UsXG4gIER1cmF0aW9uLFxuICBSZW1vdmFsUG9saWN5LFxuICBTaXplLFxuICBTdGFjayxcbiAgVG9rZW4sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcic7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzJztcbmltcG9ydCB7IElHcmFudGFibGUsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHtcbiAgQXJjaGl0ZWN0dXJlLFxuICBBc3NldENvZGUsXG4gIEhhbmRsZXIsXG4gIFJ1bnRpbWUsXG4gIFNpbmdsZXRvbkZ1bmN0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENmbkxvZ0dyb3VwLCBJTG9nR3JvdXAsIExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zLFxuICBTY2FuTG9nc091dHB1dE9wdGlvbnMsXG4gIFNjYW5Mb2dzT3V0cHV0VHlwZSxcbiAgU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVudW0gZm9yIFNldmVyaXR5IFNlbGVjdGlvblxuICpcbiAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3NjYW5uZXIvdnVsbmVyYWJpbGl0eS8jc2V2ZXJpdHktc2VsZWN0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNldmVyaXR5IHtcbiAgVU5LTk9XTiA9ICdVTktOT1dOJyxcbiAgTE9XID0gJ0xPVycsXG4gIE1FRElVTSA9ICdNRURJVU0nLFxuICBISUdIID0gJ0hJR0gnLFxuICBDUklUSUNBTCA9ICdDUklUSUNBTCcsXG59XG5cbi8qKlxuICogRW51bSBmb3IgU2Nhbm5lcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9jb25maWd1cmF0aW9uL290aGVycy8jZW5hYmxlZGlzYWJsZS1zY2FubmVyc1xuICovXG5leHBvcnQgZW51bSBTY2FubmVycyB7XG4gIFZVTE4gPSAndnVsbicsXG4gIENPTkZJRyA9ICdjb25maWcnLFxuICBTRUNSRVQgPSAnc2VjcmV0JyxcbiAgTElDRU5TRSA9ICdsaWNlbnNlJyxcbn1cblxuLyoqXG4gKiBFbnVtIGZvciBJbWFnZUNvbmZpZ1NjYW5uZXJzXG4gKlxuICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvdGFyZ2V0L2NvbnRhaW5lcl9pbWFnZS8jY29udGFpbmVyLWltYWdlLW1ldGFkYXRhXG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlQ29uZmlnU2Nhbm5lcnMge1xuICBDT05GSUcgPSAnY29uZmlnJyxcbiAgU0VDUkVUID0gJ3NlY3JldCcsXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igc2NhbiBsb2dzIG91dHB1dCB0byBDbG91ZFdhdGNoIExvZ3MgbG9nIGdyb3VwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkV2F0Y2hMb2dzT3V0cHV0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGxvZyBncm91cCB0byBvdXRwdXQgc2NhbiBsb2dzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nR3JvdXA6IElMb2dHcm91cDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBvdXRwdXQgb2YgdGhlIHNjYW4gbG9ncy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNjYW5Mb2dzT3V0cHV0IHtcbiAgLyoqXG4gICAqIFNjYW4gbG9ncyBvdXRwdXQgdG8gQ2xvdWRXYXRjaCBMb2dzIGxvZyBncm91cC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xvdWRXYXRjaExvZ3Mob3B0aW9uczogQ2xvdWRXYXRjaExvZ3NPdXRwdXRQcm9wcyk6IFNjYW5Mb2dzT3V0cHV0IHtcbiAgICByZXR1cm4gbmV3IENsb3VkV2F0Y2hMb2dzT3V0cHV0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIGZvciBzY2FuIGxvZ3MuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYmluZChncmFudGVlOiBJR3JhbnRhYmxlKTogU2NhbkxvZ3NPdXRwdXRPcHRpb25zO1xufVxuXG5jbGFzcyBDbG91ZFdhdGNoTG9nc091dHB1dCBleHRlbmRzIFNjYW5Mb2dzT3V0cHV0IHtcbiAgLyoqXG4gICAqIFRoZSBsb2cgZ3JvdXAgdG8gb3V0cHV0IHNjYW4gbG9ncy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nR3JvdXA6IElMb2dHcm91cDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDbG91ZFdhdGNoTG9nc091dHB1dFByb3BzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubG9nR3JvdXAgPSBvcHRpb25zLmxvZ0dyb3VwO1xuICB9XG5cbiAgcHVibGljIGJpbmQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IENsb3VkV2F0Y2hMb2dzT3V0cHV0T3B0aW9ucyB7XG4gICAgLy8gTW9zdCBMYW1iZGFzIGFyZSBncmFudGVkIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSBhbmQgY2FuIHdyaXRlIHRvIGFueSBDbG91ZFdhdGNoIExvZ3MuXG4gICAgLy8gSG93ZXZlciwganVzdCBpbiBjYXNlIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSBpcyBub3QgZ3JhbnRlZCwgYWxsb3cgd3JpdGluZyB0byBDbG91ZFdhdGNoIExvZ3MuXG4gICAgdGhpcy5sb2dHcm91cC5ncmFudFdyaXRlKGdyYW50ZWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFNjYW5Mb2dzT3V0cHV0VHlwZS5DTE9VRFdBVENIX0xPR1MsXG4gICAgICBsb2dHcm91cE5hbWU6IHRoaXMubG9nR3JvdXAubG9nR3JvdXBOYW1lLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcyB7XG4gIC8qKlxuICAgKiBJbWFnZSBVUkkgZm9yIHNjYW4gdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VVcmk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVwb3NpdG9yeSBpbmNsdWRpbmcgdGhlIGltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqXG4gICAqIEJlY2F1c2Ugb2YgZ3JhbnRQdWxsIHRvIEN1c3RvbVJlc291cmNlTGFtYmRhLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogSVJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmZpeGVkL3VuZml4YWJsZSB2dWxuZXJhYmlsaXRpZXMgbWVhbiB0aGF0IHRoZSBwYXRjaCBoYXMgbm90IHlldCBiZWVuIHByb3ZpZGVkIG9uIHRoZWlyIGRpc3RyaWJ1dGlvbi5cbiAgICpcbiAgICogVG8gaGlkZSB1bmZpeGVkL3VuZml4YWJsZSB2dWxuZXJhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgLS1pZ25vcmUtdW5maXhlZGAgZmxhZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyN1bmZpeGVkLXZ1bG5lcmFiaWxpdGllc1xuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlVW5maXhlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldmVyaXR5IFNlbGVjdGlvblxuICAgKlxuICAgKiBUaGUgc2V2ZXJpdHkgaXMgdGFrZW4gZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzb3VyY2Ugc2luY2UgdGhlIHNldmVyaXR5IGZyb20gdmVuZG9ycyBpcyBtb3JlIGFjY3VyYXRlLlxuICAgKiBVc2luZyBDVkUtMjAyMy0wNDY0IGFzIGFuIGV4YW1wbGUsIHdoaWxlIGl0IGlzIHJhdGVkIGFzIFwiSElHSFwiIGluIE5WRCwgUmVkIEhhdCBoYXMgbWFya2VkIGl0cyAnSW1wYWN0JyBhcyBcIkxvd1wiLiBBcyBhIHJlc3VsdCwgVHJpdnkgd2lsbCBkaXNwbGF5IGl0IGFzIFwiTG93XCIuXG4gICAqXG4gICAqIFRoZSBzZXZlcml0eSBkZXBlbmRzIG9uIHRoZSBjb21waWxlIG9wdGlvbiwgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgZXRjLiBOVkQgZG9lc24ndCBrbm93IGhvdyB0aGUgdmVuZG9yIGRpc3RyaWJ1dGVzIHRoZSBzb2Z0d2FyZS5cbiAgICogUmVkIEhhdCBldmFsdWF0ZXMgdGhlIHNldmVyaXR5IG1vcmUgYWNjdXJhdGVseS4gVGhhdCdzIHdoeSBUcml2eSBwcmVmZXJzIHZlbmRvciBzY29yZXMgb3ZlciBOVkQuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIGBDUklUSUNBTGAgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRCwgYnV0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgVHJpdnkgaXMgXCJDUklUSUNBTCxISUdILE1FRElVTSxMT1csVU5LTk9XTlwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbU2V2ZXJpdHkuQ1JJVElDQUxdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3NjYW5uZXIvdnVsbmVyYWJpbGl0eS8jc2V2ZXJpdHktc2VsZWN0aW9uXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eT86IFNldmVyaXR5W107XG5cbiAgLyoqXG4gICAqIEVuYWJsZS9EaXNhYmxlIFNjYW5uZXJzXG4gICAqXG4gICAqIFlvdSBjYW4gZW5hYmxlL2Rpc2FibGUgc2Nhbm5lcnMgd2l0aCB0aGUgYHNjYW5uZXJzYC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGNvbnRhaW5lciBpbWFnZSBzY2FubmluZyBlbmFibGVzIHZ1bG5lcmFiaWxpdHkgKFZVTE4pIGFuZCBzZWNyZXQgc2Nhbm5lcnMgKFNFQ1JFVCkgYnkgZGVmYXVsdC5cbiAgICogSWYgeW91IGRvbid0IG5lZWQgc2VjcmV0IHNjYW5uaW5nLCBpdCBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBTY2FubmVycy5WVUxOIG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZWN1cml0eS5WVUxOLFNjYW5uZXJzLlNFQ1JFVF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2VuYWJsZWRpc2FibGUtc2Nhbm5lcnNcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5uZXJzPzogU2Nhbm5lcnNbXTtcblxuICAvKipcbiAgICogRW51bSBmb3IgSW1hZ2VDb25maWdTY2FubmVyc1xuICAgKlxuICAgKiBDb250YWluZXIgaW1hZ2VzIGhhdmUgY29uZmlndXJhdGlvbi4gZG9ja2VyIGluc3BlY3QgYW5kIGBkb2NrZXIgaGlzdG9yeWAgc2hvdyB0aGUgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKiBUcml2eSBzY2FucyB0aGUgY29uZmlndXJhdGlvbiBvZiBjb250YWluZXIgaW1hZ2VzIGZvclxuICAgKlxuICAgKiAtIE1pc2NvbmZpZ3VyYXRpb25zXG4gICAqIC0gU2VjcmV0c1xuICAgKlxuICAgKiBUaGV5IGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LiBZb3UgY2FuIGVuYWJsZSB0aGVtIHdpdGggYGltYWdlQ29uZmlnU2Nhbm5lcnNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy90YXJnZXQvY29udGFpbmVyX2ltYWdlLyNjb250YWluZXItaW1hZ2UtbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQ29uZmlnU2Nhbm5lcnM/OiBJbWFnZUNvbmZpZ1NjYW5uZXJzW107XG5cbiAgLyoqXG4gICAqIEV4aXQgQ29kZVxuICAgKlxuICAgKiBVc2UgdGhlIGBleGl0Q29kZWAgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZS5cbiAgICpcbiAgICogWW91IGNhbiBzcGVjaWZ5IDAgaWYgeW91IGRvIG5vdCB3YW50IHRvIGV4aXQgZXZlbiB3aGVuIHZ1bG5lcmFiaWxpdGllcyBhcmUgZGV0ZWN0ZWQuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIDEgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRC4gSW4gdGhlIG9yaWdpbmFsIHRyaXZ5LCBpdCBpcyAwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNleGl0LWNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeGl0IG9uIEVPTFxuICAgKlxuICAgKiBTb21ldGltZXMgeW91IG1heSBzdXJwcmlzaW5nbHkgZ2V0IDAgdnVsbmVyYWJpbGl0aWVzIGluIGFuIG9sZCBpbWFnZTpcbiAgICogIC0gRW5hYmxpbmcgLS1pZ25vcmUtdW5maXhlZCBvcHRpb24gd2hpbGUgYWxsIHBhY2thZ2VzIGhhdmUgbm8gZml4ZWQgdmVyc2lvbnMuXG4gICAqICAtIFNjYW5uaW5nIGEgcmF0aGVyIG91dGRhdGVkIE9TIChlLmcuIFVidW50dSAxMC4wNCkuXG4gICAqXG4gICAqIEFuIE9TIGF0IHRoZSBlbmQgb2Ygc2VydmljZS9saWZlIChFT0wpIHVzdWFsbHkgZ2V0cyBpbnRvIHRoaXMgc2l0dWF0aW9uLCB3aGljaCBpcyBkZWZpbml0ZWx5IGZ1bGwgb2YgdnVsbmVyYWJpbGl0aWVzLlxuICAgKiBgZXhpdE9uRW9sYCBjYW4gZmFpbCBzY2FubmluZyBvbiBFT0wgT1Mgd2l0aCBhIG5vbi16ZXJvIGNvZGUuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIDEgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRC4gSW4gdGhlIG9yaWdpbmFsIHRyaXZ5LCBpdCBpcyAwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNleGl0LW9uLWVvbFxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdE9uRW9sPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCeSBGaW5kaW5nIElEc1xuICAgKlxuICAgKiBUaGUgaWdub3JlIHJ1bGVzIHdyaXR0ZW4gdG8gdGhlIC50cml2eWlnbm9yZSBpbiB0cml2eS5cbiAgICogUHV0IGVhY2ggbGluZSB5b3Ugd3JpdGUgaW4gdGhlIGZpbGUgaW50byBvbmUgZWxlbWVudCBvZiB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgICAkIGNhdCAudHJpdnlpZ25vcmVcbiAgICogICAgICMgQWNjZXB0IHRoZSByaXNrXG4gICAqICAgICBDVkUtMjAxOC0xNDYxOFxuICAgKlxuICAgKiAgICAgIyBBY2NlcHQgdGhlIHJpc2sgdW50aWwgMjAyMy0wMS0wMVxuICAgKiAgICAgQ1ZFLTIwMTktMTQ2OTcgZXhwOjIwMjMtMDEtMDFcbiAgICpcbiAgICogICAgICMgTm8gaW1wYWN0IGluIG91ciBzZXR0aW5nc1xuICAgKiAgICAgQ1ZFLTIwMTktMTU0M1xuICAgKlxuICAgKiAgICAgIyBJZ25vcmUgbWlzY29uZmlndXJhdGlvbnNcbiAgICogICAgIEFWRC1EUy0wMDAyXG4gICAqXG4gICAqICAgICAjIElnbm9yZSBzZWNyZXRzXG4gICAqICAgICBnZW5lcmljLXVud2FudGVkLXJ1bGVcbiAgICogICAgIGF3cy1hY2NvdW50LWlkXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vZmlsdGVyaW5nLyN0cml2eWlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWVtb3J5IFNpemUgKE1CKSBmb3IgU2Nhbm5lciBMYW1iZGFcbiAgICpcbiAgICogWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gYDMwMDhgIGFuZCBgMTAyNDBgLlxuICAgKlxuICAgKiBJZiB0aGlzIENvbnN0cnVjdCBleGVjdXRpb24gdGVybWluYXRlcyBhYm5vcm1hbGx5IGR1ZSB0byBTSUdLSUxMLCB0cnkgYSBsYXJnZXIgc2l6ZS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZSAoYDMwMDhgIE1CKSBpcyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAzMDA4XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FuIEltYWdlIG9uIGEgc3BlY2lmaWMgQXJjaGl0ZWN0dXJlIGFuZCBPU1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBUcml2eSBsb2FkcyBhbiBpbWFnZSBvbiBhIGBsaW51eC9hbWQ2NGAgbWFjaGluZS5cbiAgICpcbiAgICogVG8gY3VzdG9taXplIHRoaXMsIHBhc3MgYSBgcGxhdGZvcm1gIGFyZ3VtZW50IGluIHRoZSBmb3JtYXQgT1MvQXJjaGl0ZWN0dXJlIGZvciB0aGUgaW1hZ2UsIHN1Y2ggYXMgYGxpbnV4L2FybTY0YFxuICAgKlxuICAgKiBAZGVmYXVsdCAtXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbW92YWwgcG9saWN5IHRvIGFwcGx5IHRvIFNjYW5uZXIgTGFtYmRhJ3MgZGVmYXVsdCBsb2cgZ3JvdXBcbiAgICpcbiAgICogSWYgeW91IHVzZSBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgY29uc3RydWN0IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHN0YWNrLCB5b3UgY2Fubm90IHNldCBkaWZmZXJlbnQgcmVtb3ZhbCBwb2xpY2llcyBmb3IgdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKiBTZWUgYE5vdGVzYCBzZWN0aW9uIGluIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTY2FubmVyIExhbWJkYSBjcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cChgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCkuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkYXlzIGxvZyBldmVudHMgYXJlIGtlcHQgaW4gU2Nhbm5lciBMYW1iZGEncyBkZWZhdWx0IGxvZyBncm91cFxuICAgKlxuICAgKiBJZiB5b3UgdXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgc3RhY2ssIHlvdSBjYW5ub3Qgc2V0IGRpZmZlcmVudCByZXRlbnRpb24gZGF5cyBmb3IgdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKiBTZWUgYE5vdGVzYCBzZWN0aW9uIGluIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTY2FubmVyIExhbWJkYSBjcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cChgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCkgYW5kIGxvZyBldmVudHMgbmV2ZXIgZXhwaXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5cz86IFJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncyBvdXRwdXRcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc2NhbiBsb2dzIGFyZSBvdXRwdXQgdG8gZGVmYXVsdCBsb2cgZ3JvdXAgY3JlYXRlZCBieSBTY2FubmVyIExhbWJkYS5cbiAgICpcbiAgICogU3BlY2lmeSB0aGlzIGlmIHlvdSB3YW50IHRvIHNlbmQgc2NhbiBsb2dzIHRvIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKlxuICAgKiBDdXJyZW50bHksIG9ubHkgYGNsb3VkV2F0Y2hMb2dzYCBpcyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbiBsb2dzIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKVxuICAgKi9cbiAgcmVhZG9ubHkgc2NhbkxvZ3NPdXRwdXQ/OiBTY2FuTG9nc091dHB1dDtcblxuICAvKipcbiAgICogU3VwcHJlc3MgZXJyb3JzIGR1cmluZyByb2xsYmFjayBzY2FubmVyIExhbWJkYSBleGVjdXRpb25cbiAgICpcbiAgICogV2hlbiBpbWFnZSBzY2FubmluZyBmYWlscywgQ2xvdWRGb3JtYXRpb24gdHJpZ2dlcnMgYSByb2xsYmFjayBhbmQgZXhlY3V0ZXMgdGhlIHByZXZpb3VzXG4gICAqIHZlcnNpb24gb2YgdGhlIHNjYW5uZXIgTGFtYmRhLiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mXG4gICAqIHRoZSBzY2FubmVyIExhbWJkYSB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciwgZXZlbiBpZiB0aGUgaW1hZ2Ugc2Nhbm5pbmcgZm9yIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqIGZhaWxzLlxuICAgKlxuICAgKiBUaGlzIGFsbG93cyB0aGUgcm9sbGJhY2sgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCBhdm9pZGluZyBST0xMQkFDS19GQUlMRUQgc3RhdGVcbiAgICogd2hlbiBpbWFnZSBzY2FubmluZyBmYWlsdXJlcyBvY2N1ci5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2s/OiBib29sZWFuO1xufVxuXG4vLyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlXG5jb25zdCBERUZBVUxUX01FTU9SWV9TSVpFID0gMzAwODtcblxuZXhwb3J0IGNsYXNzIEltYWdlU2Nhbm5lcldpdGhUcml2eSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5tZW1vcnlTaXplICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1lbW9yeVNpemUpICYmXG4gICAgICAocHJvcHMubWVtb3J5U2l6ZSA8IDMwMDggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gXFxgMzAwOFxcYCBhbmQgXFxgMTAyNDBcXGAgZm9yIFxcYG1lbW9yeVNpemVcXGAsIGdvdCAke3Byb3BzLm1lbW9yeVNpemV9LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbWJkYVB1cnBvc2UgPSAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnlDdXN0b21SZXNvdXJjZUxhbWJkYSc7XG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2VMYW1iZGEgPSBuZXcgU2luZ2xldG9uRnVuY3Rpb24odGhpcywgJ0N1c3RvbVJlc291cmNlTGFtYmRhJywge1xuICAgICAgdXVpZDogJzQ3MGI2MzQzLWQyNjctZjc1My0yMjZjLTFlOTlmMDlmMzE5YScsXG4gICAgICBsYW1iZGFQdXJwb3NlLFxuICAgICAgcnVudGltZTogUnVudGltZS5GUk9NX0lNQUdFLFxuICAgICAgaGFuZGxlcjogSGFuZGxlci5GUk9NX0lNQUdFLFxuICAgICAgY29kZTogQXNzZXRDb2RlLmZyb21Bc3NldEltYWdlKGpvaW4oX19kaXJuYW1lLCAnLi4vYXNzZXRzL2xhbWJkYScpLCB7XG4gICAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5MSU5VWF9BUk02NCxcbiAgICAgICAgLy8gZXhjbHVkZSBub2RlX21vZHVsZXNcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgbmF0aXZlIGJpbmFyeSBvZiB0aGUgaW5zdGFsbGVkIGVzYnVpbGQgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGNwdSBhcmNoaXRlY3R1cmVcbiAgICAgICAgLy8gYW5kIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbWFnZSBhc3NldCBjaGFuZ2VzIGRlcGVuZGluZyBvbiB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICAgICAgICBleGNsdWRlOiBbJ25vZGVfbW9kdWxlcyddLFxuICAgICAgfSksXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDkwMCksXG4gICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyBERUZBVUxUX01FTU9SWV9TSVpFLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IFNpemUuZ2liaWJ5dGVzKDEwKSwgLy8gZm9yIGNhc2VzIHRoYXQgbmVlZCB0byB1cGRhdGUgdHJpdnkgREI6IC90bXAvdHJpdnkvZGIvdHJpdnkuZGJcbiAgICB9KTtcbiAgICBwcm9wcy5yZXBvc2l0b3J5LmdyYW50UHVsbChjdXN0b21SZXNvdXJjZUxhbWJkYSk7XG5cbiAgICAvLyBHcmFudCBDbG91ZEZvcm1hdGlvbiBEZXNjcmliZVN0YWNrcyBwZXJtaXNzaW9uIGZvciByb2xsYmFjayBkZXRlY3Rpb24gd2hlbiBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjayBpcyBlbmFibGVkXG4gICAgY29uc3Qgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2sgPSBwcm9wcy5zdXBwcmVzc0Vycm9yT25Sb2xsYmFjayA/PyB0cnVlO1xuICAgIGlmIChzdXBwcmVzc0Vycm9yT25Sb2xsYmFjaykge1xuICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGEuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2Nsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tzJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbU3RhY2sub2YodGhpcykuc3RhY2tJZF0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZUxhbWJkYUxvZ0dyb3VwQ29uc3RydWN0TmFtZSA9IGBEZWZhdWx0TG9nR3JvdXBGb3Ike2xhbWJkYVB1cnBvc2V9YDtcblxuICAgIHRoaXMudmFsaWRhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zKGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSB8fCBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzKSB7XG4gICAgICB0aGlzLmVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGEsXG4gICAgICAgIGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IGN1c3RvbVJlc291cmNlTGFtYmRhLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvcGVydGllczogU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMgPSB7XG4gICAgICBhZGRyOiB0aGlzLm5vZGUuYWRkcixcbiAgICAgIGltYWdlVXJpOiBwcm9wcy5pbWFnZVVyaSxcbiAgICAgIGlnbm9yZVVuZml4ZWQ6IFN0cmluZyhwcm9wcy5pZ25vcmVVbmZpeGVkID8/IGZhbHNlKSxcbiAgICAgIHNldmVyaXR5OiBwcm9wcy5zZXZlcml0eSA/PyBbU2V2ZXJpdHkuQ1JJVElDQUxdLFxuICAgICAgc2Nhbm5lcnM6IHByb3BzLnNjYW5uZXJzID8/IFtdLFxuICAgICAgaW1hZ2VDb25maWdTY2FubmVyczogcHJvcHMuaW1hZ2VDb25maWdTY2FubmVycyA/PyBbXSxcbiAgICAgIGV4aXRDb2RlOiBwcm9wcy5leGl0Q29kZSA/PyAxLFxuICAgICAgZXhpdE9uRW9sOiBwcm9wcy5leGl0T25Fb2wgPz8gMSxcbiAgICAgIHRyaXZ5SWdub3JlOiBwcm9wcy50cml2eUlnbm9yZSA/PyBbXSxcbiAgICAgIHBsYXRmb3JtOiBwcm9wcy5wbGF0Zm9ybSA/PyAnJyxcbiAgICAgIG91dHB1dDogcHJvcHMuc2NhbkxvZ3NPdXRwdXQ/LmJpbmQoY3VzdG9tUmVzb3VyY2VMYW1iZGEpLFxuICAgICAgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2s6IFN0cmluZyhzdXBwcmVzc0Vycm9yT25Sb2xsYmFjayksXG4gICAgfTtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OkltYWdlU2Nhbm5lcldpdGhUcml2eScsXG4gICAgICBwcm9wZXJ0aWVzOiBpbWFnZVNjYW5uZXJQcm9wZXJ0aWVzLFxuICAgICAgc2VydmljZVRva2VuOiBpbWFnZVNjYW5uZXJQcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgc3BlY2lmaWVkIGRlZmF1bHQgbG9nIGdyb3VwIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGZvciBleGlzdGluZyBkZWZhdWx0IGxvZyBncm91cC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zKFxuICAgIGxvZ0dyb3VwQ29uc3RydWN0TmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZChsb2dHcm91cENvbnN0cnVjdE5hbWUpIGFzXG4gICAgICB8IExvZ0dyb3VwXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG5cbiAgICBjb25zdCBjZm5Mb2dHcm91cCA9IGV4aXN0aW5nLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkxvZ0dyb3VwO1xuXG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNTYW1lUmVzb3VyY2VEZWxldGlvbkJlaGF2aW9yKFxuICAgICAgICBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5LFxuICAgICAgICBjZm5Mb2dHcm91cC5jZm5PcHRpb25zLmRlbGV0aW9uUG9saWN5LFxuICAgICAgKSB8fFxuICAgICAgY2ZuTG9nR3JvdXAucmV0ZW50aW9uSW5EYXlzICE9PSBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzXG4gICAgKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5OmR1cGxpY2F0ZUxhbWJkYURlZmF1bHRMb2dHcm91cE9wdGlvbnMnLFxuICAgICAgICBcIllvdSBoYXZlIHRvIHNldCB0aGUgc2FtZSB2YWx1ZXMgZm9yICdkZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5JyBhbmQgJ2RlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMnIGZvciBlYWNoIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgaW4gdGhlIHNhbWUgc3RhY2suXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cCBmb3IgU2Nhbm5lciBMYW1iZGEgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGV4aXN0cyBpbiBjaGlsZHJlbiBvZiB0aGUgc3RhY2sgY29uc3RydWN0LlxuICAgKiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgaXQgY3JlYXRlcyB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGFzIGEgY2hpbGQgb2YgdGhlIHN0YWNrIGNvbnN0cnVjdC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlTGFtYmRhRGVmYXVsdExvZ0dyb3VwKFxuICAgIHNpbmdsZXRvbkZ1bmN0aW9uOiBTaW5nbGV0b25GdW5jdGlvbixcbiAgICBsb2dHcm91cENvbnN0cnVjdE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW1hZ2VTY2FubmVyV2l0aFRyaXZ5UHJvcHMsXG4gICk6IExvZ0dyb3VwIHtcbiAgICBjb25zdCBleGlzdGluZyA9IFN0YWNrLm9mKHRoaXMpLm5vZGUudHJ5RmluZENoaWxkKGxvZ0dyb3VwQ29uc3RydWN0TmFtZSkgYXNcbiAgICAgIHwgTG9nR3JvdXBcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTG9nR3JvdXAoU3RhY2sub2YodGhpcyksIGxvZ0dyb3VwQ29uc3RydWN0TmFtZSwge1xuICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHtzaW5nbGV0b25GdW5jdGlvbi5mdW5jdGlvbk5hbWV9YCxcbiAgICAgIHJldGVudGlvbjogcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5cyxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLmRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3ksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZVJlc291cmNlRGVsZXRpb25CZWhhdmlvcihcbiAgICByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeSxcbiAgICBkZWxldGlvblBvbGljeT86IENmbkRlbGV0aW9uUG9saWN5LFxuICApOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHJlbW92YWxQb2xpY3kpIHtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LkRFTEVURTtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5SRVRBSU46XG4gICAgICAgIHJldHVybiBkZWxldGlvblBvbGljeSA9PT0gQ2ZuRGVsZXRpb25Qb2xpY3kuUkVUQUlOO1xuICAgICAgY2FzZSBSZW1vdmFsUG9saWN5LlNOQVBTSE9UOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlNOQVBTSE9UO1xuICAgICAgY2FzZSBSZW1vdmFsUG9saWN5LlJFVEFJTl9PTl9VUERBVEVfT1JfREVMRVRFOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlJFVEFJTl9FWENFUFRfT05fQ1JFQVRFO1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiBkZWxldGlvblBvbGljeSA9PT0gdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJlbW92YWxQb2xpY3kgc2F0aXNmaWVzIG5ldmVyO1xuICAgIH1cbiAgfVxufVxuIl19
|