@aws-cdk/aws-ivs-alpha
Version:
The CDK Construct Library for AWS::IVS
277 lines • 34.1 kB
JavaScript
;
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Channel = exports.Policy = exports.MaximumResolution = exports.Preset = exports.ChannelType = exports.LatencyMode = exports.ContainerFormat = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_ivs_1 = require("aws-cdk-lib/aws-ivs");
const core = require("aws-cdk-lib/core");
const core_1 = require("aws-cdk-lib/core");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
const stream_key_1 = require("./stream-key");
/**
* Reference to a new or existing IVS Channel
*/
class ChannelBase extends core.Resource {
addStreamKey(id) {
return new stream_key_1.StreamKey(this, id, {
channel: this,
});
}
}
/**
* Container Format
*/
var ContainerFormat;
(function (ContainerFormat) {
/**
* Use MPEG-TS.
*/
ContainerFormat["TS"] = "TS";
/**
* Use fMP4.
*/
ContainerFormat["FRAGMENTED_MP4"] = "FRAGMENTED_MP4";
})(ContainerFormat || (exports.ContainerFormat = ContainerFormat = {}));
/**
* Channel latency mode
*/
var LatencyMode;
(function (LatencyMode) {
/**
* Use LOW to minimize broadcaster-to-viewer latency for interactive broadcasts.
*/
LatencyMode["LOW"] = "LOW";
/**
* Use NORMAL for broadcasts that do not require viewer interaction.
*/
LatencyMode["NORMAL"] = "NORMAL";
})(LatencyMode || (exports.LatencyMode = LatencyMode = {}));
/**
* The channel type, which determines the allowable resolution and bitrate.
* If you exceed the allowable resolution or bitrate, the stream probably will disconnect immediately.
*
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html
*/
var ChannelType;
(function (ChannelType) {
/**
* Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions.
* Transcoding allows higher playback quality across a range of download speeds. Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
* Audio is transcoded only for renditions 360p and below; above that, audio is passed through.
*/
ChannelType["STANDARD"] = "STANDARD";
/**
* Delivers the original input to viewers. The viewer’s video-quality choice is limited to the original input.
*/
ChannelType["BASIC"] = "BASIC";
/**
* Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions.
* Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at SD quality (480p).
* Audio for all renditions is transcoded, and an audio-only rendition is available.
*/
ChannelType["ADVANCED_SD"] = "ADVANCED_SD";
/**
* Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions.
* Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at HD quality (720p).
* Audio for all renditions is transcoded, and an audio-only rendition is available.
*/
ChannelType["ADVANCED_HD"] = "ADVANCED_HD";
})(ChannelType || (exports.ChannelType = ChannelType = {}));
/**
* An optional transcode preset for the channel. This is selectable only for ADVANCED_HD and ADVANCED_SD channel types.
*
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html
*/
var Preset;
(function (Preset) {
/**
* Use a lower bitrate than STANDARD for each quality level. Use it if you have low download bandwidth and/or simple video content (e.g., talking heads).
*/
Preset["CONSTRAINED_BANDWIDTH_DELIVERY"] = "CONSTRAINED_BANDWIDTH_DELIVERY";
/**
* Use a higher bitrate for each quality level. Use it if you have high download bandwidth and/or complex video content (e.g., flashes and quick scene changes).
*/
Preset["HIGHER_BANDWIDTH_DELIVERY"] = "HIGHER_BANDWIDTH_DELIVERY";
})(Preset || (exports.Preset = Preset = {}));
/**
* Maximum resolution for multitrack input.
*/
var MaximumResolution;
(function (MaximumResolution) {
/**
* Full HD (1080p)
*/
MaximumResolution["FULL_HD"] = "FULL_HD";
/**
* HD (720p)
*/
MaximumResolution["HD"] = "HD";
/**
* SD (480p)
*/
MaximumResolution["SD"] = "SD";
})(MaximumResolution || (exports.MaximumResolution = MaximumResolution = {}));
/**
* Whether multitrack input is allowed or required.
*/
var Policy;
(function (Policy) {
/**
* Multitrack input is allowed.
*/
Policy["ALLOW"] = "ALLOW";
/**
* Multitrack input is required.
*/
Policy["REQUIRE"] = "REQUIRE";
})(Policy || (exports.Policy = Policy = {}));
/**
A new IVS channel
*/
let Channel = (() => {
let _classDecorators = [prop_injectable_1.propertyInjectable];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = ChannelBase;
var Channel = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
Channel = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ivs-alpha.Channel", version: "2.257.0-alpha.0" };
/** Uniquely identifies this class. */
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ivs-alpha.Channel';
/**
* Import an existing channel
*/
static fromChannelArn(scope, id, channelArn) {
// This will throw an error if the arn cannot be parsed
let arnComponents = core.Arn.split(channelArn, core.ArnFormat.SLASH_RESOURCE_NAME);
if (!core.Token.isUnresolved(arnComponents.service) && arnComponents.service !== 'ivs') {
throw new Error(`Invalid service, expected 'ivs', got '${arnComponents.service}'`);
}
if (!core.Token.isUnresolved(arnComponents.resource) && arnComponents.resource !== 'channel') {
throw new Error(`Invalid resource, expected 'channel', got '${arnComponents.resource}'`);
}
class Import extends ChannelBase {
channelArn = channelArn;
}
return new Import(scope, id);
}
channelArn;
/**
* Channel ingest endpoint, part of the definition of an ingest server, used when you set up streaming software.
* For example: a1b2c3d4e5f6.global-contribute.live-video.net
* @attribute
*/
channelIngestEndpoint;
/**
* Channel playback URL. For example:
* https://a1b2c3d4e5f6.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.abcdEFGH.m3u8
* @attribute
*/
channelPlaybackUrl;
constructor(scope, id, props = {}) {
super(scope, id, {
physicalName: props.channelName ?? core_1.Lazy.string({
produce: () => core_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '-_' }),
}),
});
try {
jsiiDeprecationWarnings._aws_cdk_aws_ivs_alpha_ChannelProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, Channel);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
if (this.physicalName && !core.Token.isUnresolved(this.physicalName) && !/^[a-zA-Z0-9-_]*$/.test(this.physicalName)) {
throw new Error(`channelName must contain only numbers, letters, hyphens and underscores, got: '${this.physicalName}'`);
}
let preset;
if (props.type && [ChannelType.STANDARD, ChannelType.BASIC].includes(props.type) && props.preset) {
preset = '';
}
else {
preset = props.preset;
}
if (props.multitrackInputConfiguration !== undefined) {
if (props.type !== undefined && props.type !== ChannelType.STANDARD) {
throw new Error(`\`multitrackInputConfiguration\` is only supported for \`ChannelType.STANDARD\`, got: ${props.type}.`);
}
if (props.containerFormat !== undefined && props.containerFormat !== ContainerFormat.FRAGMENTED_MP4) {
throw new Error(`\`containerFormat\` must be set to \`ContainerFormat.FRAGMENTED_MP4\` when \`multitrackInputConfiguration\` is specified, got: ${props.containerFormat}.`);
}
}
const resource = new aws_ivs_1.CfnChannel(this, 'Resource', {
authorized: props.authorized,
insecureIngest: props.insecureIngest,
latencyMode: props.latencyMode,
name: this.physicalName,
type: props.type,
preset,
recordingConfigurationArn: props.recordingConfiguration?.recordingConfigurationArn,
containerFormat: props.containerFormat ??
(props.multitrackInputConfiguration ? ContainerFormat.FRAGMENTED_MP4 : undefined),
multitrackInputConfiguration: props.multitrackInputConfiguration ?
{
enabled: true,
maximumResolution: props.multitrackInputConfiguration.maximumResolution,
policy: props.multitrackInputConfiguration.policy,
}
: undefined,
});
this.channelArn = resource.attrArn;
this.channelIngestEndpoint = resource.attrIngestEndpoint;
this.channelPlaybackUrl = resource.attrPlaybackUrl;
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return Channel = _classThis;
})();
exports.Channel = Channel;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQWlEO0FBQ2pELHlDQUF5QztBQUN6QywyQ0FBK0M7QUFDL0MsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUcxRSw2Q0FBeUM7QUFvQnpDOztHQUVHO0FBQ0gsTUFBZSxXQUFZLFNBQVEsSUFBSSxDQUFDLFFBQVE7SUFHdkMsWUFBWSxDQUFDLEVBQVU7UUFDNUIsT0FBTyxJQUFJLHNCQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUM3QixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztLQUNKO0NBQ0Y7QUFFRDs7R0FFRztBQUNILElBQVksZUFVWDtBQVZELFdBQVksZUFBZTtJQUN6Qjs7T0FFRztJQUNILDRCQUFTLENBQUE7SUFFVDs7T0FFRztJQUNILG9EQUFpQyxDQUFBO0FBQ25DLENBQUMsRUFWVyxlQUFlLCtCQUFmLGVBQWUsUUFVMUI7QUFFRDs7R0FFRztBQUNILElBQVksV0FVWDtBQVZELFdBQVksV0FBVztJQUNyQjs7T0FFRztJQUNILDBCQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILGdDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxXQUFXLDJCQUFYLFdBQVcsUUFVdEI7QUFFRDs7Ozs7R0FLRztBQUNILElBQVksV0EwQlg7QUExQkQsV0FBWSxXQUFXO0lBQ3JCOzs7O09BSUc7SUFDSCxvQ0FBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILDhCQUFlLENBQUE7SUFFZjs7OztPQUlHO0lBQ0gsMENBQTJCLENBQUE7SUFFM0I7Ozs7T0FJRztJQUNILDBDQUEyQixDQUFBO0FBQzdCLENBQUMsRUExQlcsV0FBVywyQkFBWCxXQUFXLFFBMEJ0QjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLE1BV1g7QUFYRCxXQUFZLE1BQU07SUFDaEI7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QUNoQixNQUFNO2dCQUNOLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSx5QkFBeUI7Z0JBQ2xGLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtvQkFDcEMsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbkYsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7b0JBQ2hFO3dCQUNFLE9BQU8sRUFBRSxJQUFJO3dCQUNiLGlCQUFpQixFQUFFLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUI7d0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBTTtxQkFDbEQ7b0JBQ0QsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDbkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN6RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztTQUNwRDs7WUEvRlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5DaGFubmVsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWl2cyc7XG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgTGF6eSwgTmFtZXMgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElSZWNvcmRpbmdDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9yZWNvcmRpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBTdHJlYW1LZXkgfSBmcm9tICcuL3N0cmVhbS1rZXknO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSVZTIENoYW5uZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhbm5lbCBleHRlbmRzIGNvcmUuSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIEFSTi4gRm9yIGV4YW1wbGU6IGFybjphd3M6aXZzOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6Y2hhbm5lbC9hYmNkQUJDRGVmZ2hcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RyZWFtIGtleSBmb3IgdGhpcyBJVlMgQ2hhbm5lbC5cbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBJRFxuICAgKi9cbiAgYWRkU3RyZWFtS2V5KGlkOiBzdHJpbmcpOiBTdHJlYW1LZXk7XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgbmV3IG9yIGV4aXN0aW5nIElWUyBDaGFubmVsXG4gKi9cbmFic3RyYWN0IGNsYXNzIENoYW5uZWxCYXNlIGV4dGVuZHMgY29yZS5SZXNvdXJjZSBpbXBsZW1lbnRzIElDaGFubmVsIHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNoYW5uZWxBcm46IHN0cmluZztcblxuICBwdWJsaWMgYWRkU3RyZWFtS2V5KGlkOiBzdHJpbmcpOiBTdHJlYW1LZXkge1xuICAgIHJldHVybiBuZXcgU3RyZWFtS2V5KHRoaXMsIGlkLCB7XG4gICAgICBjaGFubmVsOiB0aGlzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbmVyIEZvcm1hdFxuICovXG5leHBvcnQgZW51bSBDb250YWluZXJGb3JtYXQge1xuICAvKipcbiAgICogVXNlIE1QRUctVFMuXG4gICAqL1xuICBUUyA9ICdUUycsXG5cbiAgLyoqXG4gICAqIFVzZSBmTVA0LlxuICAgKi9cbiAgRlJBR01FTlRFRF9NUDQgPSAnRlJBR01FTlRFRF9NUDQnLFxufVxuXG4vKipcbiAqIENoYW5uZWwgbGF0ZW5jeSBtb2RlXG4gKi9cbmV4cG9ydCBlbnVtIExhdGVuY3lNb2RlIHtcbiAgLyoqXG4gICAqIFVzZSBMT1cgdG8gbWluaW1pemUgYnJvYWRjYXN0ZXItdG8tdmlld2VyIGxhdGVuY3kgZm9yIGludGVyYWN0aXZlIGJyb2FkY2FzdHMuXG4gICAqL1xuICBMT1cgPSAnTE9XJyxcblxuICAvKipcbiAgICogVXNlIE5PUk1BTCBmb3IgYnJvYWRjYXN0cyB0aGF0IGRvIG5vdCByZXF1aXJlIHZpZXdlciBpbnRlcmFjdGlvbi5cbiAgICovXG4gIE5PUk1BTCA9ICdOT1JNQUwnLFxufVxuXG4vKipcbiAqIFRoZSBjaGFubmVsIHR5cGUsIHdoaWNoIGRldGVybWluZXMgdGhlIGFsbG93YWJsZSByZXNvbHV0aW9uIGFuZCBiaXRyYXRlLlxuICogSWYgeW91IGV4Y2VlZCB0aGUgYWxsb3dhYmxlIHJlc29sdXRpb24gb3IgYml0cmF0ZSwgdGhlIHN0cmVhbSBwcm9iYWJseSB3aWxsIGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHkuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtaXZzLWNoYW5uZWwuaHRtbFxuICovXG5leHBvcnQgZW51bSBDaGFubmVsVHlwZSB7XG4gIC8qKlxuICAgKiBNdWx0aXBsZSBxdWFsaXRpZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCwgdG8gYXV0b21hdGljYWxseSBnaXZlIHZpZXdlcnMgdGhlIGJlc3QgZXhwZXJpZW5jZSBmb3IgdGhlaXIgZGV2aWNlcyBhbmQgbmV0d29yayBjb25kaXRpb25zLlxuICAgKiBUcmFuc2NvZGluZyBhbGxvd3MgaGlnaGVyIHBsYXliYWNrIHF1YWxpdHkgYWNyb3NzIGEgcmFuZ2Ugb2YgZG93bmxvYWQgc3BlZWRzLiBSZXNvbHV0aW9uIGNhbiBiZSB1cCB0byAxMDgwcCBhbmQgYml0cmF0ZSBjYW4gYmUgdXAgdG8gOC41IE1icHMuXG4gICAqIEF1ZGlvIGlzIHRyYW5zY29kZWQgb25seSBmb3IgcmVuZGl0aW9ucyAzNjBwIGFuZCBiZWxvdzsgYWJvdmUgdGhhdCwgYXVkaW8gaXMgcGFzc2VkIHRocm91Z2guXG4gICAqL1xuICBTVEFOREFSRCA9ICdTVEFOREFSRCcsXG5cbiAgLyoqXG4gICAqIERlbGl2ZXJzIHRoZSBvcmlnaW5hbCBpbnB1dCB0byB2aWV3ZXJzLiBUaGUgdmlld2Vy4oCZcyB2aWRlby1xdWFsaXR5IGNob2ljZSBpcyBsaW1pdGVkIHRvIHRoZSBvcmlnaW5hbCBpbnB1dC5cbiAgICovXG4gIEJBU0lDID0gJ0JBU0lDJyxcblxuICAvKipcbiAgICogTXVsdGlwbGUgcXVhbGl0aWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQsIHRvIGF1dG9tYXRpY2FsbHkgZ2l2ZSB2aWV3ZXJzIHRoZSBiZXN0IGV4cGVyaWVuY2UgZm9yIHRoZWlyIGRldmljZXMgYW5kIG5ldHdvcmsgY29uZGl0aW9ucy5cbiAgICogSW5wdXQgcmVzb2x1dGlvbiBjYW4gYmUgdXAgdG8gMTA4MHAgYW5kIGJpdHJhdGUgY2FuIGJlIHVwIHRvIDguNSBNYnBzOyBvdXRwdXQgaXMgY2FwcGVkIGF0IFNEIHF1YWxpdHkgKDQ4MHApLlxuICAgKiBBdWRpbyBmb3IgYWxsIHJlbmRpdGlvbnMgaXMgdHJhbnNjb2RlZCwgYW5kIGFuIGF1ZGlvLW9ubHkgcmVuZGl0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIEFEVkFOQ0VEX1NEID0gJ0FEVkFOQ0VEX1NEJyxcblxuICAvKipcbiAgICogTXVsdGlwbGUgcXVhbGl0aWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQsIHRvIGF1dG9tYXRpY2FsbHkgZ2l2ZSB2aWV3ZXJzIHRoZSBiZXN0IGV4cGVyaWVuY2UgZm9yIHRoZWlyIGRldmljZXMgYW5kIG5ldHdvcmsgY29uZGl0aW9ucy5cbiAgICogSW5wdXQgcmVzb2x1dGlvbiBjYW4gYmUgdXAgdG8gMTA4MHAgYW5kIGJpdHJhdGUgY2FuIGJlIHVwIHRvIDguNSBNYnBzOyBvdXRwdXQgaXMgY2FwcGVkIGF0IEhEIHF1YWxpdHkgKDcyMHApLlxuICAgKiBBdWRpbyBmb3IgYWxsIHJlbmRpdGlvbnMgaXMgdHJhbnNjb2RlZCwgYW5kIGFuIGF1ZGlvLW9ubHkgcmVuZGl0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIEFEVkFOQ0VEX0hEID0gJ0FEVkFOQ0VEX0hEJyxcbn1cblxuLyoqXG4gKiBBbiBvcHRpb25hbCB0cmFuc2NvZGUgcHJlc2V0IGZvciB0aGUgY2hhbm5lbC4gVGhpcyBpcyBzZWxlY3RhYmxlIG9ubHkgZm9yIEFEVkFOQ0VEX0hEIGFuZCBBRFZBTkNFRF9TRCBjaGFubmVsIHR5cGVzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWl2cy1jaGFubmVsLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gUHJlc2V0IHtcbiAgLyoqXG4gICAqIFVzZSBhIGxvd2VyIGJpdHJhdGUgdGhhbiBTVEFOREFSRCBmb3IgZWFjaCBxdWFsaXR5IGxldmVsLiBVc2UgaXQgaWYgeW91IGhhdmUgbG93IGRvd25sb2FkIGJhbmR3aWR0aCBhbmQvb3Igc2ltcGxlIHZpZGVvIGNvbnRlbnQgKGUuZy4sIHRhbGtpbmcgaGVhZHMpLlxuICAgKi9cbiAgQ09OU1RSQUlORURfQkFORFdJRFRIX0RFTElWRVJZID0gJ0NPTlNUUkFJTkVEX0JBTkRXSURUSF9ERUxJVkVSWScsXG5cbiAgLyoqXG4gICAqIFVzZSBhIGhpZ2hlciBiaXRyYXRlIGZvciBlYWNoIHF1YWxpdHkgbGV2ZWwuIFVzZSBpdCBpZiB5b3UgaGF2ZSBoaWdoIGRvd25sb2FkIGJhbmR3aWR0aCBhbmQvb3IgY29tcGxleCB2aWRlbyBjb250ZW50IChlLmcuLCBmbGFzaGVzIGFuZCBxdWljayBzY2VuZSBjaGFuZ2VzKS5cbiAgICovXG4gIEhJR0hFUl9CQU5EV0lEVEhfREVMSVZFUlkgPSAnSElHSEVSX0JBTkRXSURUSF9ERUxJVkVSWScsXG5cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIG5ldyBDaGFubmVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbFByb3BzIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoYW5uZWwgaXMgYXV0aG9yaXplZC5cbiAgICpcbiAgICogSWYgeW91IHdpc2ggdG8gbWFrZSBhbiBhdXRob3JpemVkIGNoYW5uZWwsIHlvdSB3aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICogYSBQbGF5YmFja0tleVBhaXIgaGFzIGJlZW4gdXBsb2FkZWQgdG8geW91ciBhY2NvdW50IGFzIHRoaXMgaXMgdXNlZCB0b1xuICAgKiB2YWxpZGF0ZSB0aGUgc2lnbmVkIEpXVCB0aGF0IGlzIHJlcXVpcmVkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoaWNoIGNvbnRlbnQtcGFja2FnaW5nIGZvcm1hdCBpcyB1c2VkIChNUEVHLVRTIG9yIGZNUDQpLlxuICAgKlxuICAgKiBJZiBgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbmAgaXMgc3BlY2lmaWVkLCBvbmx5IGZNUDQgY2FuIGJlIHVzZWQuXG4gICAqIE90aGVyd2lzZSwgYGNvbnRhaW5lckZvcm1hdGAgbWF5IGJlIHNldCB0byBgQ29udGFpbmVyRm9ybWF0LlRTYCBvciBgQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0YC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0YCBpcyBhdXRvbWF0aWNhbGx5IHNldCB3aGVuIHRoZSBgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbmAgaXMgc3BlY2lmaWVkLiBJZiBub3Qgc3BlY2lmaWVkLCBpdCByZW1haW5zIHVuZGVmaW5lZCBhbmQgdXNlcyB0aGUgSVZTIGRlZmF1bHQgc2V0dGluZyAoVFMpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRm9ybWF0PzogQ29udGFpbmVyRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjaGFubmVsIGFsbG93cyBpbnNlY3VyZSBSVE1QIGluZ2VzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGluc2VjdXJlSW5nZXN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2hhbm5lbCBsYXRlbmN5IG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IExhdGVuY3lNb2RlLkxPV1xuICAgKi9cbiAgcmVhZG9ubHkgbGF0ZW5jeU1vZGU/OiBMYXRlbmN5TW9kZTtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9iamVjdCBzcGVjaWZ5aW5nIG11bHRpdHJhY2sgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICogWW91IG11c3Qgc3BlY2lmeSBgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbmAgaWYgeW91IHdhbnQgdG8gdXNlIE11bHRpVHJhY2sgVmlkZW8uXG4gICAqXG4gICAqIGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYENoYW5uZWxUeXBlLlNUQU5EQVJEYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gSVZTIGRlZmF1bHQgc2V0dGluZyBpcyBub3QgdXNlIE11bHRpVHJhY2sgVmlkZW8uXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2l2cy9sYXRlc3QvTG93TGF0ZW5jeVVzZXJHdWlkZS9tdWx0aXRyYWNrLXZpZGVvLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24/OiBNdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhbm5lbCB0eXBlLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbGxvd2FibGUgcmVzb2x1dGlvbiBhbmQgYml0cmF0ZS5cbiAgICogSWYgeW91IGV4Y2VlZCB0aGUgYWxsb3dhYmxlIHJlc29sdXRpb24gb3IgYml0cmF0ZSwgdGhlIHN0cmVhbSB3aWxsIGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHlcbiAgICpcbiAgICogQGRlZmF1bHQgQ2hhbm5lbFR5cGUuU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBDaGFubmVsVHlwZTtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdHJhbnNjb2RlIHByZXNldCBmb3IgdGhlIGNoYW5uZWwuIENhbiBiZSB1c2VkIGZvciBBRFZBTkNFRF9IRCBhbmQgQURWQU5DRURfU0QgY2hhbm5lbCB0eXBlcy5cbiAgICogV2hlbiBMT1cgb3IgU1RBTkRBUkQgaXMgdXNlZCwgdGhlIHByZXNldCB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIHNldCB0byBub25lIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFByZXNldC5ISUdIRVJfQkFORFdJRFRIX0RFTElWRVJZIGlmIGNoYW5uZWxUeXBlIGlzIEFEVkFOQ0VEX1NEIG9yIEFEVkFOQ0VEX0hELCBub25lIG90aGVyd2lzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2V0PzogUHJlc2V0O1xuXG4gIC8qKlxuICAgKiBBIHJlY29yZGluZyBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZWNvcmRpbmcgaXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZGluZ0NvbmZpZ3VyYXRpb24/OiBJUmVjb3JkaW5nQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIHJlc29sdXRpb24gZm9yIG11bHRpdHJhY2sgaW5wdXQuXG4gKi9cbmV4cG9ydCBlbnVtIE1heGltdW1SZXNvbHV0aW9uIHtcbiAgLyoqXG4gICAqIEZ1bGwgSEQgKDEwODBwKVxuICAgKi9cbiAgRlVMTF9IRCA9ICdGVUxMX0hEJyxcblxuICAvKipcbiAgICogSEQgKDcyMHApXG4gICAqL1xuICBIRCA9ICdIRCcsXG5cbiAgLyoqXG4gICAqIFNEICg0ODBwKVxuICAgKi9cbiAgU0QgPSAnU0QnLFxufVxuXG4vKipcbiAqIFdoZXRoZXIgbXVsdGl0cmFjayBpbnB1dCBpcyBhbGxvd2VkIG9yIHJlcXVpcmVkLlxuICovXG5leHBvcnQgZW51bSBQb2xpY3kge1xuICAvKipcbiAgICogTXVsdGl0cmFjayBpbnB1dCBpcyBhbGxvd2VkLlxuICAgKi9cbiAgQUxMT1cgPSAnQUxMT1cnLFxuXG4gIC8qKlxuICAgKiBNdWx0aXRyYWNrIGlucHV0IGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgUkVRVUlSRSA9ICdSRVFVSVJFJyxcbn1cblxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyBtdWx0aXRyYWNrIGlucHV0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIHJlc29sdXRpb24gZm9yIG11bHRpdHJhY2sgaW5wdXQuXG4gICAqL1xuICByZWFkb25seSBtYXhpbXVtUmVzb2x1dGlvbjogTWF4aW11bVJlc29sdXRpb247XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIG11bHRpdHJhY2sgaW5wdXQgaXMgYWxsb3dlZCBvciByZXF1aXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeTogUG9saWN5O1xufVxuXG4vKipcbiAgQSBuZXcgSVZTIGNoYW5uZWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIENoYW5uZWwgZXh0ZW5kcyBDaGFubmVsQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWl2cy1hbHBoYS5DaGFubmVsJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNoYW5uZWxBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY2hhbm5lbEFybjogc3RyaW5nKTogSUNoYW5uZWwge1xuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYXJuIGNhbm5vdCBiZSBwYXJzZWRcbiAgICBsZXQgYXJuQ29tcG9uZW50cyA9IGNvcmUuQXJuLnNwbGl0KGNoYW5uZWxBcm4sIGNvcmUuQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpO1xuXG4gICAgaWYgKCFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZChhcm5Db21wb25lbnRzLnNlcnZpY2UpICYmIGFybkNvbXBvbmVudHMuc2VydmljZSAhPT0gJ2l2cycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXJ2aWNlLCBleHBlY3RlZCAnaXZzJywgZ290ICcke2FybkNvbXBvbmVudHMuc2VydmljZX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZChhcm5Db21wb25lbnRzLnJlc291cmNlKSAmJiBhcm5Db21wb25lbnRzLnJlc291cmNlICE9PSAnY2hhbm5lbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNvdXJjZSwgZXhwZWN0ZWQgJ2NoYW5uZWwnLCBnb3QgJyR7YXJuQ29tcG9uZW50cy5yZXNvdXJjZX0nYCk7XG4gICAgfVxuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQ2hhbm5lbEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxBcm4gPSBjaGFubmVsQXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIGluZ2VzdCBlbmRwb2ludCwgcGFydCBvZiB0aGUgZGVmaW5pdGlvbiBvZiBhbiBpbmdlc3Qgc2VydmVyLCB1c2VkIHdoZW4geW91IHNldCB1cCBzdHJlYW1pbmcgc29mdHdhcmUuXG4gICAqIEZvciBleGFtcGxlOiBhMWIyYzNkNGU1ZjYuZ2xvYmFsLWNvbnRyaWJ1dGUubGl2ZS12aWRlby5uZXRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxJbmdlc3RFbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIHBsYXliYWNrIFVSTC4gRm9yIGV4YW1wbGU6XG4gICAqIGh0dHBzOi8vYTFiMmMzZDRlNWY2LnVzLXdlc3QtMi5wbGF5YmFjay5saXZlLXZpZGVvLm5ldC9hcGkvdmlkZW8vdjEvdXMtd2VzdC0yLjEyMzQ1Njc4OTAxMi5jaGFubmVsLmFiY2RFRkdILm0zdThcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxQbGF5YmFja1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDaGFubmVsUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5jaGFubmVsTmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogMTI4LCBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICctXycgfSksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZSAmJiAhY29yZS5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpICYmICEvXlthLXpBLVowLTktX10qJC8udGVzdCh0aGlzLnBoeXNpY2FsTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2hhbm5lbE5hbWUgbXVzdCBjb250YWluIG9ubHkgbnVtYmVycywgbGV0dGVycywgaHlwaGVucyBhbmQgdW5kZXJzY29yZXMsIGdvdDogJyR7dGhpcy5waHlzaWNhbE5hbWV9J2ApO1xuICAgIH1cblxuICAgIGxldCBwcmVzZXQ7XG5cbiAgICBpZiAocHJvcHMudHlwZSAmJiBbQ2hhbm5lbFR5cGUuU1RBTkRBUkQsIENoYW5uZWxUeXBlLkJBU0lDXS5pbmNsdWRlcyhwcm9wcy50eXBlKSAmJiBwcm9wcy5wcmVzZXQpIHtcbiAgICAgIHByZXNldCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVzZXQgPSBwcm9wcy5wcmVzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByb3BzLnR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy50eXBlICE9PSBDaGFubmVsVHlwZS5TVEFOREFSRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25cXGAgaXMgb25seSBzdXBwb3J0ZWQgZm9yIFxcYENoYW5uZWxUeXBlLlNUQU5EQVJEXFxgLCBnb3Q6ICR7cHJvcHMudHlwZX0uYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5jb250YWluZXJGb3JtYXQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5jb250YWluZXJGb3JtYXQgIT09IENvbnRhaW5lckZvcm1hdC5GUkFHTUVOVEVEX01QNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNvbnRhaW5lckZvcm1hdFxcYCBtdXN0IGJlIHNldCB0byBcXGBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDRcXGAgd2hlbiBcXGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uXFxgIGlzIHNwZWNpZmllZCwgZ290OiAke3Byb3BzLmNvbnRhaW5lckZvcm1hdH0uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuQ2hhbm5lbCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBhdXRob3JpemVkOiBwcm9wcy5hdXRob3JpemVkLFxuICAgICAgaW5zZWN1cmVJbmdlc3Q6IHByb3BzLmluc2VjdXJlSW5nZXN0LFxuICAgICAgbGF0ZW5jeU1vZGU6IHByb3BzLmxhdGVuY3lNb2RlLFxuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICB0eXBlOiBwcm9wcy50eXBlLFxuICAgICAgcHJlc2V0LFxuICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvbkFybjogcHJvcHMucmVjb3JkaW5nQ29uZmlndXJhdGlvbj8ucmVjb3JkaW5nQ29uZmlndXJhdGlvbkFybixcbiAgICAgIGNvbnRhaW5lckZvcm1hdDogcHJvcHMuY29udGFpbmVyRm9ybWF0ID8/XG4gICAgICAgIChwcm9wcy5tdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uID8gQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0IDogdW5kZWZpbmVkKSxcbiAgICAgIG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb246IHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gP1xuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBtYXhpbXVtUmVzb2x1dGlvbjogcHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbi5tYXhpbXVtUmVzb2x1dGlvbixcbiAgICAgICAgICBwb2xpY3k6IHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24ucG9saWN5LFxuICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFubmVsQXJuID0gcmVzb3VyY2UuYXR0ckFybjtcbiAgICB0aGlzLmNoYW5uZWxJbmdlc3RFbmRwb2ludCA9IHJlc291cmNlLmF0dHJJbmdlc3RFbmRwb2ludDtcbiAgICB0aGlzLmNoYW5uZWxQbGF5YmFja1VybCA9IHJlc291cmNlLmF0dHJQbGF5YmFja1VybDtcbiAgfVxufVxuIl19