UNPKG

cdk-nextjs-standalone

Version:

Deploy a NextJS app to AWS using CDK and OpenNext.

106 lines 18.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.NextjsDomain = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager"); const aws_route53_1 = require("aws-cdk-lib/aws-route53"); const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets"); const constructs_1 = require("constructs"); /** * Use a custom domain with `Nextjs`. Requires a Route53 hosted zone to have been * created within the same AWS account. For DNS setups where you cannot use a * Route53 hosted zone in the same AWS account, use the `overrides.nextjsDistribution.distributionProps` * prop of {@link NextjsProps}. * * See {@link NextjsDomainProps} TS Doc comments for detailed docs on how to customize. * This construct is helpful to user to not have to worry about interdependencies * between Route53 Hosted Zone, CloudFront Distribution, and Route53 Hosted Zone Records. * * Note, if you're using another service for domain name registration, you can * still create a Route53 hosted zone. Please see [Configuring DNS Delegation from * CloudFlare to AWS Route53](https://veducate.co.uk/dns-delegation-route53/) * as an example. */ class NextjsDomain extends constructs_1.Construct { /** * Concatentation of {@link NextjsDomainProps.domainName} and {@link NextjsDomainProps.alternateNames}. * Used in instantiation of CloudFront Distribution in NextjsDistribution */ get domainNames() { const names = [this.props.domainName]; if (this.props.alternateNames?.length) { names.push(...this.props.alternateNames); } return names; } constructor(scope, id, props) { super(scope, id); this.props = props; this.hostedZone = this.getHostedZone(); this.certificate = this.getCertificate(); } getHostedZone() { if (!this.props.hostedZone) { return aws_route53_1.HostedZone.fromLookup(this, 'HostedZone', { domainName: this.props.domainName, ...this.props.overrides?.hostedZoneProviderProps, }); } else { return this.props.hostedZone; } } getCertificate() { if (!this.props.certificate) { return new aws_certificatemanager_1.Certificate(this, 'Certificate', { domainName: this.props.certificateDomainName ?? this.props.domainName, validation: aws_certificatemanager_1.CertificateValidation.fromDns(this.hostedZone), ...this.props.overrides?.certificateProps, }); } else { return this.props.certificate; } } /** * Creates DNS records (A and AAAA) records for {@link NextjsDomainProps.domainName} * and {@link NextjsDomainProps.alternateNames} if defined. */ createDnsRecords(distribution) { // Create DNS record const recordProps = { recordName: this.props.domainName, zone: this.hostedZone, target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.CloudFrontTarget(distribution)), }; new aws_route53_1.ARecord(this, 'ARecordMain', { ...recordProps, ...this.props.overrides?.aRecordProps, }); // IPv4 new aws_route53_1.AaaaRecord(this, 'AaaaRecordMain', { ...recordProps, ...this.props.overrides?.aaaaRecordProps, }); // IPv6 if (this.props.alternateNames?.length) { let i = 1; for (const alternateName of this.props.alternateNames) { new aws_route53_1.ARecord(this, 'ARecordAlt' + i, { ...recordProps, recordName: `${alternateName}.`, ...this.props.overrides?.aRecordProps, }); new aws_route53_1.AaaaRecord(this, 'AaaaRecordAlt' + i, { ...recordProps, recordName: `${alternateName}.`, ...this.props.overrides?.aaaaRecordProps, }); i++; } } } } exports.NextjsDomain = NextjsDomain; _a = JSII_RTTI_SYMBOL_1; NextjsDomain[_a] = { fqn: "cdk-nextjs-standalone.NextjsDomain", version: "4.2.3" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzRG9tYWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL05leHRqc0RvbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtFQUFzRztBQUV0Ryx5REFRaUM7QUFDakMseUVBQW1FO0FBQ25FLDJDQUF1QztBQTRFdkM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQUN6Qzs7O09BR0c7SUFDSCxJQUFJLFdBQVc7UUFDYixNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBWUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNCLE9BQU8sd0JBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDL0MsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtnQkFDakMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx1QkFBdUI7YUFDakQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksb0NBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQUMxQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQ3JFLFVBQVUsRUFBRSw4Q0FBcUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDMUQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0I7YUFDMUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsWUFBMEI7UUFDekMsb0JBQW9CO1FBQ3BCLE1BQU0sV0FBVyxHQUFtQztZQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixNQUFNLEVBQUUsMEJBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxzQ0FBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuRSxDQUFDO1FBQ0YsSUFBSSxxQkFBTyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDL0IsR0FBRyxXQUFXO1lBQ2QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZO1NBQ3RDLENBQUMsQ0FBQyxDQUFDLE9BQU87UUFDWCxJQUFJLHdCQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ3JDLEdBQUcsV0FBVztZQUNkLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZTtTQUN6QyxDQUFDLENBQUMsQ0FBQyxPQUFPO1FBQ1gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RELElBQUkscUJBQU8sQ0FBQyxJQUFJLEVBQUUsWUFBWSxHQUFHLENBQUMsRUFBRTtvQkFDbEMsR0FBRyxXQUFXO29CQUNkLFVBQVUsRUFBRSxHQUFHLGFBQWEsR0FBRztvQkFDL0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZO2lCQUN0QyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSx3QkFBVSxDQUFDLElBQUksRUFBRSxlQUFlLEdBQUcsQ0FBQyxFQUFFO29CQUN4QyxHQUFHLFdBQVc7b0JBQ2QsVUFBVSxFQUFFLEdBQUcsYUFBYSxHQUFHO29CQUMvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGVBQWU7aUJBQ3pDLENBQUMsQ0FBQztnQkFDSCxDQUFDLEVBQUUsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUF4Rkgsb0NBeUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNlcnRpZmljYXRlLCBDZXJ0aWZpY2F0ZSwgQ2VydGlmaWNhdGVWYWxpZGF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgeyBEaXN0cmlidXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQge1xuICBBUmVjb3JkLFxuICBBUmVjb3JkUHJvcHMsXG4gIEFhYWFSZWNvcmQsXG4gIEFhYWFSZWNvcmRQcm9wcyxcbiAgSG9zdGVkWm9uZSxcbiAgSUhvc3RlZFpvbmUsXG4gIFJlY29yZFRhcmdldCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFRhcmdldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBOZXh0anNQcm9wcyB9IGZyb20gJy4nO1xuaW1wb3J0IHtcbiAgT3B0aW9uYWxBYWFhUmVjb3JkUHJvcHMsXG4gIE9wdGlvbmFsQ2VydGlmaWNhdGVQcm9wcyxcbiAgT3B0aW9uYWxIb3N0ZWRab25lUHJvdmlkZXJQcm9wcyxcbiAgT3B0aW9uYWxBUmVjb3JkUHJvcHMsXG59IGZyb20gJy4vZ2VuZXJhdGVkLXN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RvbWFpbk92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlUHJvcHM/OiBPcHRpb25hbENlcnRpZmljYXRlUHJvcHM7XG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVQcm92aWRlclByb3BzPzogT3B0aW9uYWxIb3N0ZWRab25lUHJvdmlkZXJQcm9wcztcbiAgcmVhZG9ubHkgYVJlY29yZFByb3BzPzogT3B0aW9uYWxBUmVjb3JkUHJvcHM7XG4gIHJlYWRvbmx5IGFhYWFSZWNvcmRQcm9wcz86IE9wdGlvbmFsQWFhYVJlY29yZFByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RvbWFpblByb3BzIHtcbiAgLyoqXG4gICAqIEFuIGVhc3kgdG8gcmVtZW1iZXIgYWRkcmVzcyBvZiB5b3VyIHdlYnNpdGUuIE9ubHkgc3VwcG9ydHMgZG9tYWlucyBob3N0ZWRcbiAgICogb24gW1JvdXRlIDUzXShodHRwczovL2F3cy5hbWF6b24uY29tL3JvdXRlNTMvKS4gVXNlZCBhcyBgZG9tYWluTmFtZWAgZm9yXG4gICAqIEFDTSBgQ2VydGlmaWNhdGVgIGlmIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5jZXJ0aWZpY2F0ZX0gYW5kXG4gICAqIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5jZXJ0aWZpY2F0ZURvbWFpbk5hbWV9IGFyZSBgdW5kZWZpbmVkYC5cbiAgICogQGV4YW1wbGUgXCJleGFtcGxlLmNvbVwiXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbHRlcm5hdGUgZG9tYWluIG5hbWVzIHRoYXQgc2hvdWxkIHJvdXRlIHRvIHRoZSBDbG91ZGZyb250IERpc3RyaWJ1dGlvbi5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBzcGVjaWZpY2llZCBgXCJleGFtcGxlLmNvbVwiYCBhcyB5b3VyIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfSxcbiAgICogeW91IGNvdWxkIHNwZWNpZnkgYFtcInd3dy5leGFtcGxlLmNvbVwiLCBcImFwaS5leGFtcGxlLmNvbVwiXWAuXG4gICAqIExlYXJuIG1vcmUgYWJvdXQgdGhlIFtyZXF1aXJlbWVudHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9DTkFNRXMuaHRtbCNhbHRlcm5hdGUtZG9tYWluLW5hbWVzLXJlcXVpcmVtZW50cylcbiAgICogYW5kIFtyZXN0cmljdGlvbnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9DTkFNRXMuaHRtbCNhbHRlcm5hdGUtZG9tYWluLW5hbWVzLXJlc3RyaWN0aW9ucylcbiAgICogZm9yIHVzaW5nIGFsdGVybmF0ZSBkb21haW4gbmFtZXMgd2l0aCBDbG91ZEZyb250LlxuICAgKlxuICAgKiBOb3RlLCBpbiBvcmRlciB0byB1c2UgYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcywgdGhleSBtdXN0IGJlIGNvdmVyZWQgYnkgeW91clxuICAgKiBjZXJ0aWZpY2F0ZS4gQnkgZGVmYXVsdCwgdGhlIGNlcnRpZmljYXRlIGNyZWF0ZWQgaW4gdGhpcyBjb25zdHJ1Y3Qgb25seSBjb3ZlcnNcbiAgICogdGhlIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfS4gVGhlcmVmb3JlLCB5b3UnbGwgbmVlZCB0byBzcGVjaWZ5XG4gICAqIGEgd2lsZGNhcmQgZG9tYWluIG5hbWUgbGlrZSBgXCIqLmV4YW1wbGUuY29tXCJgIHdpdGgge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmNlcnRpZmljYXRlRG9tYWluTmFtZX1cbiAgICogc28gdGhhdCB0aGlzIGNvbnN0cnVjdCB3aWxsIGNyZWF0ZSB0aGUgY2VydGlmaWNhdGUgdGhlIGNvdmVycyB0aGUgYWx0ZXJuYXRlXG4gICAqIGRvbWFpbiBuYW1lcy4gT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuY2VydGlmaWNhdGV9XG4gICAqIHRvIGNyZWF0ZSB0aGUgY2VydGlmaWNhdGUgeW91cnNlbGYgd2hlcmUgeW91J2xsIG5lZWQgdG8gZW5zdXJlIGl0IGhhcyBhXG4gICAqIHdpbGRjYXJkIG9yIHVzZXMgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lcyBpbmNsdWRpbmcgdGhlXG4gICAqIGFsdGVybmF0aXZlIG5hbWVzIHNwZWNpZmllZCBoZXJlLlxuICAgKiBAZXhhbXBsZSBbXCJ3d3cuZXhhbXBsZS5jb21cIiwgXCJhcGkuZXhhbXBsZS5jb21cIl1cbiAgICovXG4gIHJlYWRvbmx5IGFsdGVybmF0ZU5hbWVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBZb3UgbXVzdCBjcmVhdGUgdGhlIGhvc3RlZCB6b25lIG91dC1vZi1iYW5kLlxuICAgKiBZb3UgY2FuIGxvb2t1cCB0aGUgaG9zdGVkIHpvbmUgb3V0c2lkZSB0aGlzIGNvbnN0cnVjdCBhbmQgcGFzcyBpdCBpbiB2aWEgdGhpcyBwcm9wLlxuICAgKiBBbHRlcm5hdGl2ZWx5IGlmIHRoaXMgcHJvcCBpcyBgdW5kZWZpbmVkYCwgdGhlbiB0aGUgaG9zdGVkIHpvbmUgd2lsbCBiZVxuICAgKiAqKmxvb2tlZCB1cCoqIChub3QgY3JlYXRlZCkgdmlhIGBIb3N0ZWRab25lLmZyb21Mb29rdXBgIHdpdGgge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmRvbWFpbk5hbWV9LlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZT86IElIb3N0ZWRab25lO1xuICAvKipcbiAgICogSWYgdGhpcyBwcm9wIGlzIGB1bmRlZmluZWRgIHRoZW4gYW4gQUNNIGBDZXJ0aWZpY2F0ZWAgd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfVxuICAgKiB3aXRoIEROUyBWYWxpZGF0aW9uLiBUaGlzIHByb3AgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSBUTFMvU1NMXG4gICAqIGNlcnRpZmljYXRlIGNyZWF0ZWQuIFRoZSBjZXJ0aWZpY2F0ZSB5b3UgY3JlYXRlIG11c3QgYmUgaW4gdGhlIGB1cy1lYXN0LTFgXG4gICAqIChOLiBWaXJnaW5pYSkgcmVnaW9uIGFzIHJlcXVpcmVkIGJ5IEFXUyBDbG91ZEZyb250LlxuICAgKlxuICAgKiBTZXQgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYW4gZXhpc3RpbmcgY2VydGlmaWNhdGUgaW4gdGhlIGB1cy1lYXN0LTFgIHJlZ2lvbiBpbiBBV1MgQ2VydGlmaWNhdGUgTWFuYWdlciB5b3Ugd2FudCB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZTtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gbmFtZSB1c2VkIGluIHRoaXMgY29uc3RydWN0IHdoZW4gY3JlYXRpbmcgYW4gQUNNIGBDZXJ0aWZpY2F0ZWAuIFVzZWZ1bFxuICAgKiB3aGVuIHBhc3Npbmcge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmFsdGVybmF0ZU5hbWVzfSBhbmQgeW91IG5lZWQgdG8gc3BlY2lmeVxuICAgKiBhIHdpbGRjYXJkIGRvbWFpbiBsaWtlIFwiKi5leGFtcGxlLmNvbVwiLiBJZiBgdW5kZWZpbmVkYCwgdGhlbiB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuZG9tYWluTmFtZX1cbiAgICogd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBJZiB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuY2VydGlmaWNhdGV9IGlzIHBhc3NlZCwgdGhlbiB0aGlzIHByb3AgaXMgaWdub3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlRG9tYWluTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIGZvciBldmVyeSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNEb21haW5PdmVycmlkZXM7XG59XG5cbi8qKlxuICogVXNlIGEgY3VzdG9tIGRvbWFpbiB3aXRoIGBOZXh0anNgLiBSZXF1aXJlcyBhIFJvdXRlNTMgaG9zdGVkIHpvbmUgdG8gaGF2ZSBiZWVuXG4gKiBjcmVhdGVkIHdpdGhpbiB0aGUgc2FtZSBBV1MgYWNjb3VudC4gRm9yIEROUyBzZXR1cHMgd2hlcmUgeW91IGNhbm5vdCB1c2UgYVxuICogUm91dGU1MyBob3N0ZWQgem9uZSBpbiB0aGUgc2FtZSBBV1MgYWNjb3VudCwgdXNlIHRoZSBgb3ZlcnJpZGVzLm5leHRqc0Rpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Qcm9wc2BcbiAqIHByb3Agb2Yge0BsaW5rIE5leHRqc1Byb3BzfS5cbiAqXG4gKiBTZWUge0BsaW5rIE5leHRqc0RvbWFpblByb3BzfSBUUyBEb2MgY29tbWVudHMgZm9yIGRldGFpbGVkIGRvY3Mgb24gaG93IHRvIGN1c3RvbWl6ZS5cbiAqIFRoaXMgY29uc3RydWN0IGlzIGhlbHBmdWwgdG8gdXNlciB0byBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpbnRlcmRlcGVuZGVuY2llc1xuICogYmV0d2VlbiBSb3V0ZTUzIEhvc3RlZCBab25lLCBDbG91ZEZyb250IERpc3RyaWJ1dGlvbiwgYW5kIFJvdXRlNTMgSG9zdGVkIFpvbmUgUmVjb3Jkcy5cbiAqXG4gKiBOb3RlLCBpZiB5b3UncmUgdXNpbmcgYW5vdGhlciBzZXJ2aWNlIGZvciBkb21haW4gbmFtZSByZWdpc3RyYXRpb24sIHlvdSBjYW5cbiAqIHN0aWxsIGNyZWF0ZSBhIFJvdXRlNTMgaG9zdGVkIHpvbmUuIFBsZWFzZSBzZWUgW0NvbmZpZ3VyaW5nIEROUyBEZWxlZ2F0aW9uIGZyb21cbiAqIENsb3VkRmxhcmUgdG8gQVdTIFJvdXRlNTNdKGh0dHBzOi8vdmVkdWNhdGUuY28udWsvZG5zLWRlbGVnYXRpb24tcm91dGU1My8pXG4gKiBhcyBhbiBleGFtcGxlLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzRG9tYWluIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIENvbmNhdGVudGF0aW9uIG9mIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfSBhbmQge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmFsdGVybmF0ZU5hbWVzfS5cbiAgICogVXNlZCBpbiBpbnN0YW50aWF0aW9uIG9mIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uIGluIE5leHRqc0Rpc3RyaWJ1dGlvblxuICAgKi9cbiAgZ2V0IGRvbWFpbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lcyA9IFt0aGlzLnByb3BzLmRvbWFpbk5hbWVdO1xuICAgIGlmICh0aGlzLnByb3BzLmFsdGVybmF0ZU5hbWVzPy5sZW5ndGgpIHtcbiAgICAgIG5hbWVzLnB1c2goLi4udGhpcy5wcm9wcy5hbHRlcm5hdGVOYW1lcyk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuICAvKipcbiAgICogUm91dGU1MyBIb3N0ZWQgWm9uZS5cbiAgICovXG4gIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICAvKipcbiAgICogQUNNIENlcnRpZmljYXRlLlxuICAgKi9cbiAgY2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZTtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEb21haW5Qcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzRG9tYWluUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmhvc3RlZFpvbmUgPSB0aGlzLmdldEhvc3RlZFpvbmUoKTtcbiAgICB0aGlzLmNlcnRpZmljYXRlID0gdGhpcy5nZXRDZXJ0aWZpY2F0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIb3N0ZWRab25lKCk6IElIb3N0ZWRab25lIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuaG9zdGVkWm9uZSkge1xuICAgICAgcmV0dXJuIEhvc3RlZFpvbmUuZnJvbUxvb2t1cCh0aGlzLCAnSG9zdGVkWm9uZScsIHtcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaG9zdGVkWm9uZVByb3ZpZGVyUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaG9zdGVkWm9uZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmNlcnRpZmljYXRlKSB7XG4gICAgICByZXR1cm4gbmV3IENlcnRpZmljYXRlKHRoaXMsICdDZXJ0aWZpY2F0ZScsIHtcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5wcm9wcy5jZXJ0aWZpY2F0ZURvbWFpbk5hbWUgPz8gdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgICB2YWxpZGF0aW9uOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uY2VydGlmaWNhdGVQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jZXJ0aWZpY2F0ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBETlMgcmVjb3JkcyAoQSBhbmQgQUFBQSkgcmVjb3JkcyBmb3Ige0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmRvbWFpbk5hbWV9XG4gICAqIGFuZCB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuYWx0ZXJuYXRlTmFtZXN9IGlmIGRlZmluZWQuXG4gICAqL1xuICBjcmVhdGVEbnNSZWNvcmRzKGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIEROUyByZWNvcmRcbiAgICBjb25zdCByZWNvcmRQcm9wczogQVJlY29yZFByb3BzICYgQWFhYVJlY29yZFByb3BzID0ge1xuICAgICAgcmVjb3JkTmFtZTogdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgem9uZTogdGhpcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KGRpc3RyaWJ1dGlvbikpLFxuICAgIH07XG4gICAgbmV3IEFSZWNvcmQodGhpcywgJ0FSZWNvcmRNYWluJywge1xuICAgICAgLi4ucmVjb3JkUHJvcHMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uYVJlY29yZFByb3BzLFxuICAgIH0pOyAvLyBJUHY0XG4gICAgbmV3IEFhYWFSZWNvcmQodGhpcywgJ0FhYWFSZWNvcmRNYWluJywge1xuICAgICAgLi4ucmVjb3JkUHJvcHMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uYWFhYVJlY29yZFByb3BzLFxuICAgIH0pOyAvLyBJUHY2XG4gICAgaWYgKHRoaXMucHJvcHMuYWx0ZXJuYXRlTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgZm9yIChjb25zdCBhbHRlcm5hdGVOYW1lIG9mIHRoaXMucHJvcHMuYWx0ZXJuYXRlTmFtZXMpIHtcbiAgICAgICAgbmV3IEFSZWNvcmQodGhpcywgJ0FSZWNvcmRBbHQnICsgaSwge1xuICAgICAgICAgIC4uLnJlY29yZFByb3BzLFxuICAgICAgICAgIHJlY29yZE5hbWU6IGAke2FsdGVybmF0ZU5hbWV9LmAsXG4gICAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmFSZWNvcmRQcm9wcyxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBBYWFhUmVjb3JkKHRoaXMsICdBYWFhUmVjb3JkQWx0JyArIGksIHtcbiAgICAgICAgICAuLi5yZWNvcmRQcm9wcyxcbiAgICAgICAgICByZWNvcmROYW1lOiBgJHthbHRlcm5hdGVOYW1lfS5gLFxuICAgICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5hYWFhUmVjb3JkUHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=