aws-ddk-core
Version:
The AWS DataOps Development Kit is an open source development framework for customers that build data workflows and modern data architecture on AWS.
81 lines • 16.3 kB
JavaScript
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FirehoseToS3Stage = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const firehose = require("@aws-cdk/aws-kinesisfirehose-alpha");
const destinations = require("@aws-cdk/aws-kinesisfirehose-destinations-alpha");
const cdk = require("aws-cdk-lib");
const kinesis = require("aws-cdk-lib/aws-kinesis");
const core_1 = require("../core");
const s3_factory_1 = require("../core/s3-factory");
const stage_1 = require("../pipelines/stage");
/**
* DDK Kinesis Firehose Delivery stream to S3 stage, with an optional Kinesis Data Stream.
*/
class FirehoseToS3Stage extends stage_1.DataStage {
/**
* Constructs `FirehoseToS3Stage`.
* @param scope Scope within which this construct is defined.
* @param id Identifier of the stage.
* @param props Properties for the stage.
*/
constructor(scope, id, props) {
super(scope, id, props);
if (props.s3Bucket) {
this.bucket = props.s3Bucket;
}
else if (props.s3BucketProps) {
this.bucket = s3_factory_1.S3Factory.bucket(this, "Stage Bucket", {
...props.s3BucketProps,
eventBridgeEnabled: true,
});
}
else {
throw TypeError("'s3Bucket' or 's3BucketProps' must be set to instantiate this stage");
}
if (props.dataStreamEnabled == true && !props.dataStream) {
this.dataStream = new kinesis.Stream(this, "Data Stream", {});
}
else if (props.dataStreamEnabled != false && props.dataStream) {
this.dataStream = props.dataStream;
}
const destinationsBucketProps = core_1.overrideProps({
compression: destinations.Compression.GZIP,
bufferingInterval: cdk.Duration.seconds(300),
bufferingSize: cdk.Size.mebibytes(5),
}, {
...(props.kinesisFirehoseDestinationsS3BucketProps ?? {}),
dataOutputPrefix: props.dataOutputPrefix,
});
this.deliveryStream = props.firehoseDeliveryStream
? props.firehoseDeliveryStream
: new firehose.DeliveryStream(this, "Delivery Stream", {
destination: new destinations.S3Bucket(this.bucket, destinationsBucketProps),
source: this.dataStream ? new firehose.KinesisStreamSource(this.dataStream) : undefined,
...props.firehoseDeliveryStreamProps,
});
const dataOutputPrefix = destinationsBucketProps.dataOutputPrefix;
this.addAlarm("Data Freshness Errors", {
metric: this.deliveryStream.metric("DeliveryToS3.DataFreshness", {
period: destinationsBucketProps.bufferingInterval,
statistic: "Maximum",
}),
threshold: props.deliveryStreamDataFreshnessErrorsAlarmThreshold,
evaluationPeriods: props.deliveryStreamDataFreshnessErrorsEvaluationPeriods,
});
const eventDetail = {
bucket: { name: [this.bucket.bucketName] },
...(dataOutputPrefix && { object: { key: [{ prefix: dataOutputPrefix }] } }),
};
this.eventPattern = {
source: ["aws.s3"],
detail: eventDetail,
detailType: ["Object Created"],
};
}
}
exports.FirehoseToS3Stage = FirehoseToS3Stage;
_a = JSII_RTTI_SYMBOL_1;
FirehoseToS3Stage[_a] = { fqn: "aws-ddk-core.FirehoseToS3Stage", version: "1.4.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2luZXNpcy1zMy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGFnZXMva2luZXNpcy1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtEQUErRDtBQUMvRCxnRkFBZ0Y7QUFDaEYsbUNBQW1DO0FBR25DLG1EQUFtRDtBQUluRCxrQ0FBd0M7QUFDeEMsbURBQStDO0FBQy9DLDhDQUErRDtBQTRHL0Q7O0dBRUc7QUFDSCxNQUFhLGlCQUFrQixTQUFRLGlCQUFTO0lBUTlDOzs7OztPQUtHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1NBQzlCO2FBQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsc0JBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtnQkFDbkQsR0FBRyxLQUFLLENBQUMsYUFBYTtnQkFDdEIsa0JBQWtCLEVBQUUsSUFBSTthQUN6QixDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsTUFBTSxTQUFTLENBQUMscUVBQXFFLENBQUMsQ0FBQztTQUN4RjtRQUVELElBQUksS0FBSyxDQUFDLGlCQUFpQixJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDeEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMvRDthQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztTQUNwQztRQUVELE1BQU0sdUJBQXVCLEdBQUcsb0JBQWEsQ0FDM0M7WUFDRSxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQzFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM1QyxhQUFhLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQ3JDLEVBQ0Q7WUFDRSxHQUFHLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxJQUFJLEVBQUUsQ0FBQztZQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLHNCQUFzQjtZQUNoRCxDQUFDLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtZQUM5QixDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtnQkFDbkQsV0FBVyxFQUFFLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDO2dCQUM1RSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUN2RixHQUFHLEtBQUssQ0FBQywyQkFBMkI7YUFDckMsQ0FBQyxDQUFDO1FBQ1AsTUFBTSxnQkFBZ0IsR0FBVyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztRQUUxRSxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRTtnQkFDL0QsTUFBTSxFQUFFLHVCQUF1QixDQUFDLGlCQUFpQjtnQkFDakQsU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQztZQUNGLFNBQVMsRUFBRSxLQUFLLENBQUMsK0NBQStDO1lBQ2hFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxrREFBa0Q7U0FDNUUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLEdBQUc7WUFDbEIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQyxHQUFHLENBQUMsZ0JBQWdCLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQzdFLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNsQixNQUFNLEVBQUUsV0FBVztZQUNuQixVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztTQUMvQixDQUFDO0lBQ0osQ0FBQzs7QUF6RUgsOENBMEVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmlyZWhvc2UgZnJvbSBcIkBhd3MtY2RrL2F3cy1raW5lc2lzZmlyZWhvc2UtYWxwaGFcIjtcbmltcG9ydCAqIGFzIGRlc3RpbmF0aW9ucyBmcm9tIFwiQGF3cy1jZGsvYXdzLWtpbmVzaXNmaXJlaG9zZS1kZXN0aW5hdGlvbnMtYWxwaGFcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBraW5lc2lzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta2luZXNpc1wiO1xuaW1wb3J0ICogYXMga21zIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgKiBhcyBzMyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgb3ZlcnJpZGVQcm9wcyB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBTM0ZhY3RvcnkgfSBmcm9tIFwiLi4vY29yZS9zMy1mYWN0b3J5XCI7XG5pbXBvcnQgeyBEYXRhU3RhZ2UsIERhdGFTdGFnZVByb3BzIH0gZnJvbSBcIi4uL3BpcGVsaW5lcy9zdGFnZVwiO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgdGhlIEZpcmVob3NlIERlbGl2ZXJ5IHN0cmVhbSB0byBiZSBjcmVhdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbGl2ZXJ5U3RyZWFtUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRlc3RpbmF0aW9ucyB0aGF0IHRoaXMgZGVsaXZlcnkgc3RyZWFtIHdpbGwgZGVsaXZlciBkYXRhIHRvLlxuICAgKlxuICAgKiBPbmx5IGEgc2luZ2xldG9uIGFycmF5IGlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbnM/OiBmaXJlaG9zZS5JRGVzdGluYXRpb25bXTtcbiAgLyoqXG4gICAqIEEgbmFtZSBmb3IgdGhlIGRlbGl2ZXJ5IHN0cmVhbS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgaXMgZ2VuZXJhdGVkIGJ5IENsb3VkRm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsaXZlcnlTdHJlYW1OYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIGN1c3RvbWVyIG1hc3RlciBrZXkgKENNSykgdG8gdXNlIGZvciBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uLCBpZiBhbnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFN0cmVhbUVuY3J5cHRpb24uVU5FTkNSWVBURUQgLSB1bmxlc3MgYGVuY3J5cHRpb25LZXlgIGlzIHByb3ZpZGVkLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBiZSBpbXBsaWNpdGx5IHNldCB0byBgU3RyZWFtRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEYFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IGZpcmVob3NlLlN0cmVhbUVuY3J5cHRpb247XG4gIC8qKlxuICAgKiBDdXN0b21lciBtYW5hZ2VkIGtleSB0byBzZXJ2ZXItc2lkZSBlbmNyeXB0IGRhdGEgaW4gdGhlIHN0cmVhbS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBLTVMga2V5IHdpbGwgYmUgdXNlZDsgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgQ1VTVE9NRVJfTUFOQUdFRGAsIGEgS01TIGtleSB3aWxsIGJlIGNyZWF0ZWQgZm9yIHlvdVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICAvKipcbiAgICogVGhlIElBTSByb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlbGl2ZXJ5IHN0cmVhbS5cbiAgICpcbiAgICogQXNzdW1lZCBieSBLaW5lc2lzIERhdGEgRmlyZWhvc2UgdG8gcmVhZCBmcm9tIHNvdXJjZXMgYW5kIGVuY3J5cHQgZGF0YSBzZXJ2ZXItc2lkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHJvbGUgd2lsbCBiZSBjcmVhdGVkIHdpdGggZGVmYXVsdCBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG4gIC8qKlxuICAgKiBUaGUgS2luZXNpcyBkYXRhIHN0cmVhbSB0byB1c2UgYXMgYSBzb3VyY2UgZm9yIHRoaXMgZGVsaXZlcnkgc3RyZWFtLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRhdGEgbXVzdCBiZSB3cml0dGVuIHRvIHRoZSBkZWxpdmVyeSBzdHJlYW0gdmlhIGEgZGlyZWN0IHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVN0cmVhbT86IGtpbmVzaXMuSVN0cmVhbTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBgRmlyZWhvc2VUb1MzU3RhZ2VgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpcmVob3NlVG9TM1N0YWdlUHJvcHMgZXh0ZW5kcyBEYXRhU3RhZ2VQcm9wcyB7XG4gIC8qKlxuICAgKiBQcmVleGlzdGluZyBTMyBCdWNrZXQgdG8gdXNlIGFzIGEgZGVzdGluYXRpb24gZm9yIHRoZSBGaXJlaG9zZSBTdHJlYW0uXG4gICAqIElmIG5vIGJ1Y2tldCBpcyBwcm92aWRlZCwgYSBuZXcgb25lIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEFtYXpvbiBFdmVudEJyaWRnZSBub3RpZmljYXRpb25zIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgYnVja2V0IGluIG9yZGVyXG4gICAqIGZvciB0aGlzIHN0YWdlIHRvIHByb2R1Y2UgZXZlbnRzIGFmdGVyIGl0cyBjb21wbGV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgczNCdWNrZXQ/OiBzMy5JQnVja2V0O1xuICAvKipcbiAgICogUHJvcGVydGllcyBvZiB0aGUgUzMgQnVja2V0IHRvIGJlIGNyZWF0ZWQgYXMgYSBkZWxpdmVyeSBkZXN0aW5hdGlvbi5cbiAgICpcbiAgICogQW1hem9uIEV2ZW50QnJpZGdlIG5vdGlmaWNhdGlvbnMgbXVzdCBiZSBlbmFibGVkIG9uIHRoZSBidWNrZXQgaW4gb3JkZXJcbiAgICogZm9yIHRoaXMgc3RhZ2UgdG8gcHJvZHVjZSBldmVudHMgYWZ0ZXIgaXRzIGNvbXBsZXRpb24uXG4gICAqL1xuICByZWFkb25seSBzM0J1Y2tldFByb3BzPzogczMuQnVja2V0UHJvcHM7XG4gIC8qKlxuICAgKiBGaXJlaG9zZSBEZWxpdmVyeSBzdHJlYW0uXG4gICAqIElmIG5vIHN0cmFtIGlzIHByb3ZpZGVkLCBhIG5ldyBvbmUgaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGZpcmVob3NlRGVsaXZlcnlTdHJlYW0/OiBmaXJlaG9zZS5EZWxpdmVyeVN0cmVhbTtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgb2YgdGhlIEZpcmVob3NlIERlbGl2ZXJ5IHN0cmVhbSB0byBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlyZWhvc2VEZWxpdmVyeVN0cmVhbVByb3BzPzogRGVsaXZlcnlTdHJlYW1Qcm9wcztcbiAgLyoqXG4gICAqIFByb3BzIGZvciBkZWZpbmluZyBhbiBTMyBkZXN0aW5hdGlvbiBvZiBhIEtpbmVzaXMgRGF0YSBGaXJlaG9zZSBkZWxpdmVyeSBzdHJlYW0uXG4gICAqL1xuICByZWFkb25seSBraW5lc2lzRmlyZWhvc2VEZXN0aW5hdGlvbnNTM0J1Y2tldFByb3BzPzogZGVzdGluYXRpb25zLlMzQnVja2V0UHJvcHM7XG4gIC8qKlxuICAgKiBBIHByZWZpeCB0aGF0IEtpbmVzaXMgRGF0YSBGaXJlaG9zZSBldmFsdWF0ZXMgYW5kIGFkZHMgdG8gcmVjb3JkcyBiZWZvcmUgd3JpdGluZyB0aGVtIHRvIFMzLlxuICAgKiBUaGlzIHByZWZpeCBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgYnVja2V0IG5hbWUuXG4gICAqIEBkZWZhdWx0IOKAnFlZWVkvTU0vREQvSEjigJ1cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFPdXRwdXRQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGQgS2luZXNpcyBEYXRhIFN0cmVhbSB0byBmcm9udCBGaXJlaG9zZSBEZWxpdmVyeS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFTdHJlYW1FbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFByZWV4aXN0aW5nIEtpbmVzaXMgRGF0YSBTdHJlYW0gdG8gdXNlIGluIHN0YWdlIGJlZm9yZSBEZWxpdmVyeSBTdHJlYW0uXG4gICAqIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgd2lsbCBvdmVycmlkZSBhbnkgY3JlYXRpb24gb2YgS2luZXNpcyBEYXRhIFN0cmVhbXNcbiAgICogaW4gdGhpcyBzdGFnZS5cbiAgICogVGhlIGBkYXRhU3RyZWFtRW5hYmxlZGAgcGFyYW1ldGVyIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAqL1xuICByZWFkb25seSBkYXRhU3RyZWFtPzoga2luZXNpcy5TdHJlYW07XG4gIC8qKlxuICAgKiBUaHJlc2hvbGQgZm9yIENsb3Vkd2F0Y2ggQWxhcm0gY3JlYXRlZCBmb3IgdGhpcyBzdGFnZS5cbiAgICogQGRlZmF1bHQgOTAwXG4gICAqL1xuICByZWFkb25seSBkZWxpdmVyeVN0cmVhbURhdGFGcmVzaG5lc3NFcnJvcnNBbGFybVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEV2YWx1YXRpb24gcGVyaW9kIHZhbHVlIGZvciBDbG91ZHdhdGNoIGFsYXJtIGNyZWF0ZWQgZm9yIHRoaXMgc3RhZ2UuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGRlbGl2ZXJ5U3RyZWFtRGF0YUZyZXNobmVzc0Vycm9yc0V2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIERESyBLaW5lc2lzIEZpcmVob3NlIERlbGl2ZXJ5IHN0cmVhbSB0byBTMyBzdGFnZSwgd2l0aCBhbiBvcHRpb25hbCBLaW5lc2lzIERhdGEgU3RyZWFtLlxuICovXG5leHBvcnQgY2xhc3MgRmlyZWhvc2VUb1MzU3RhZ2UgZXh0ZW5kcyBEYXRhU3RhZ2Uge1xuICByZWFkb25seSB0YXJnZXRzPzogZXZlbnRzLklSdWxlVGFyZ2V0W107XG4gIHJlYWRvbmx5IGV2ZW50UGF0dGVybj86IGV2ZW50cy5FdmVudFBhdHRlcm47XG5cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuICByZWFkb25seSBkZWxpdmVyeVN0cmVhbTogZmlyZWhvc2UuRGVsaXZlcnlTdHJlYW07XG4gIHJlYWRvbmx5IGRhdGFTdHJlYW0/OiBraW5lc2lzLlN0cmVhbTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBgRmlyZWhvc2VUb1MzU3RhZ2VgLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBGaXJlaG9zZVRvUzNTdGFnZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuczNCdWNrZXQpIHtcbiAgICAgIHRoaXMuYnVja2V0ID0gcHJvcHMuczNCdWNrZXQ7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5zM0J1Y2tldFByb3BzKSB7XG4gICAgICB0aGlzLmJ1Y2tldCA9IFMzRmFjdG9yeS5idWNrZXQodGhpcywgXCJTdGFnZSBCdWNrZXRcIiwge1xuICAgICAgICAuLi5wcm9wcy5zM0J1Y2tldFByb3BzLFxuICAgICAgICBldmVudEJyaWRnZUVuYWJsZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiJ3MzQnVja2V0JyBvciAnczNCdWNrZXRQcm9wcycgbXVzdCBiZSBzZXQgdG8gaW5zdGFudGlhdGUgdGhpcyBzdGFnZVwiKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGF0YVN0cmVhbUVuYWJsZWQgPT0gdHJ1ZSAmJiAhcHJvcHMuZGF0YVN0cmVhbSkge1xuICAgICAgdGhpcy5kYXRhU3RyZWFtID0gbmV3IGtpbmVzaXMuU3RyZWFtKHRoaXMsIFwiRGF0YSBTdHJlYW1cIiwge30pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuZGF0YVN0cmVhbUVuYWJsZWQgIT0gZmFsc2UgJiYgcHJvcHMuZGF0YVN0cmVhbSkge1xuICAgICAgdGhpcy5kYXRhU3RyZWFtID0gcHJvcHMuZGF0YVN0cmVhbTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXN0aW5hdGlvbnNCdWNrZXRQcm9wcyA9IG92ZXJyaWRlUHJvcHMoXG4gICAgICB7XG4gICAgICAgIGNvbXByZXNzaW9uOiBkZXN0aW5hdGlvbnMuQ29tcHJlc3Npb24uR1pJUCxcbiAgICAgICAgYnVmZmVyaW5nSW50ZXJ2YWw6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgICAgIGJ1ZmZlcmluZ1NpemU6IGNkay5TaXplLm1lYmlieXRlcyg1KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLihwcm9wcy5raW5lc2lzRmlyZWhvc2VEZXN0aW5hdGlvbnNTM0J1Y2tldFByb3BzID8/IHt9KSxcbiAgICAgICAgZGF0YU91dHB1dFByZWZpeDogcHJvcHMuZGF0YU91dHB1dFByZWZpeCxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmRlbGl2ZXJ5U3RyZWFtID0gcHJvcHMuZmlyZWhvc2VEZWxpdmVyeVN0cmVhbVxuICAgICAgPyBwcm9wcy5maXJlaG9zZURlbGl2ZXJ5U3RyZWFtXG4gICAgICA6IG5ldyBmaXJlaG9zZS5EZWxpdmVyeVN0cmVhbSh0aGlzLCBcIkRlbGl2ZXJ5IFN0cmVhbVwiLCB7XG4gICAgICAgICAgZGVzdGluYXRpb246IG5ldyBkZXN0aW5hdGlvbnMuUzNCdWNrZXQodGhpcy5idWNrZXQsIGRlc3RpbmF0aW9uc0J1Y2tldFByb3BzKSxcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuZGF0YVN0cmVhbSA/IG5ldyBmaXJlaG9zZS5LaW5lc2lzU3RyZWFtU291cmNlKHRoaXMuZGF0YVN0cmVhbSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4ucHJvcHMuZmlyZWhvc2VEZWxpdmVyeVN0cmVhbVByb3BzLFxuICAgICAgICB9KTtcbiAgICBjb25zdCBkYXRhT3V0cHV0UHJlZml4OiBzdHJpbmcgPSBkZXN0aW5hdGlvbnNCdWNrZXRQcm9wcy5kYXRhT3V0cHV0UHJlZml4O1xuXG4gICAgdGhpcy5hZGRBbGFybShcIkRhdGEgRnJlc2huZXNzIEVycm9yc1wiLCB7XG4gICAgICBtZXRyaWM6IHRoaXMuZGVsaXZlcnlTdHJlYW0ubWV0cmljKFwiRGVsaXZlcnlUb1MzLkRhdGFGcmVzaG5lc3NcIiwge1xuICAgICAgICBwZXJpb2Q6IGRlc3RpbmF0aW9uc0J1Y2tldFByb3BzLmJ1ZmZlcmluZ0ludGVydmFsLFxuICAgICAgICBzdGF0aXN0aWM6IFwiTWF4aW11bVwiLFxuICAgICAgfSksXG4gICAgICB0aHJlc2hvbGQ6IHByb3BzLmRlbGl2ZXJ5U3RyZWFtRGF0YUZyZXNobmVzc0Vycm9yc0FsYXJtVGhyZXNob2xkLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHByb3BzLmRlbGl2ZXJ5U3RyZWFtRGF0YUZyZXNobmVzc0Vycm9yc0V2YWx1YXRpb25QZXJpb2RzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXZlbnREZXRhaWwgPSB7XG4gICAgICBidWNrZXQ6IHsgbmFtZTogW3RoaXMuYnVja2V0LmJ1Y2tldE5hbWVdIH0sXG4gICAgICAuLi4oZGF0YU91dHB1dFByZWZpeCAmJiB7IG9iamVjdDogeyBrZXk6IFt7IHByZWZpeDogZGF0YU91dHB1dFByZWZpeCB9XSB9IH0pLFxuICAgIH07XG5cbiAgICB0aGlzLmV2ZW50UGF0dGVybiA9IHtcbiAgICAgIHNvdXJjZTogW1wiYXdzLnMzXCJdLFxuICAgICAgZGV0YWlsOiBldmVudERldGFpbCxcbiAgICAgIGRldGFpbFR5cGU6IFtcIk9iamVjdCBDcmVhdGVkXCJdLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
;