UNPKG

projen

Version:

CDK for software projects

229 lines • 37.7 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsCdkDeps = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const semver = require("semver"); const component_1 = require("../component"); const dependencies_1 = require("../dependencies"); /** * Manages dependencies on the AWS CDK. */ class AwsCdkDeps extends component_1.Component { constructor(project, options) { super(project); this.cdkDependenciesAsDeps = options.cdkDependenciesAsDeps ?? true; this.dependencyType = options.dependencyType; this._packageNames = this.packageNames(); const framework = determineFrameworkVersion(options); this.cdkCliVersion = options.cdkCliVersion ?? "^2"; this.cdkVersion = framework.range; this.cdkMajorVersion = framework.major; this.cdkMinimumVersion = framework.minimum; this.addFrameworkDependency(options); // assert/assertions library this.addV1AssertionLibraryDependency(options); // constructs library this.addConstructsDependency(options.constructsVersion); // user-defined v1 dependencies (will only fail in CDK v2 if these have values) this.addV1Dependencies(...(options.cdkDependencies ?? [])); this.addV1DevDependencies(...(options.cdkTestDependencies ?? [])); } preSynthesize() { // Log a warning if any AWS CDK v1-only deps are found in the dependencies. const depNames = Array.from(new Set(this.project.deps.all.map((dep) => dep.name))); const v1Deps = depNames .filter((dep) => [PACKAGE_AWS_CDK_VERSION.V1].includes(cdkVersionOfPackage(dep))) .sort(); if (this.cdkMajorVersion === 2 && v1Deps.length > 0) { this.project.logger.warn(`WARNING: Found CDK v1 deps in your project, even though your "cdkVersion" is 2.x: [${v1Deps.join(", ")}]. Check out https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html for more information about using CDK v2 dependencies.`); } } /** * Adds dependencies to AWS CDK modules. * * The type of dependency is determined by the `dependencyType` option. * * This method is not supported in CDK v2. Use `project.addPeerDeps()` or * `project.addDeps()` as appropriate. * * @param deps names of cdk modules (e.g. `@aws-cdk/aws-lambda`). */ addV1Dependencies(...deps) { if (deps.length > 0 && this.cdkMajorVersion !== 1) { throw new Error("addV1Dependencies() is not supported for CDK 2.x and above, use addDeps() or addPeerDeps() instead"); } // this will add dependencies based on the type requested by the user // for libraries, this will be "peer" and for apps it will be "runtime" this.addV1DependenciesByType(this.dependencyType, ...deps); // add deps as runtime deps if `cdkDepsAsDeps` is true if (this.cdkDependenciesAsDeps) { this.addV1DependenciesByType(dependencies_1.DependencyType.RUNTIME, ...deps); } } /** * Adds AWS CDK modules as dev dependencies. * * This method is not supported in CDK v2. Use `project.addPeerDeps()` or * `project.addDeps()` as appropriate. * * @param deps fully qualified names of cdk modules (e.g. `@aws-cdk/aws-lambda`). */ addV1DevDependencies(...deps) { if (deps.length > 0 && this.cdkMajorVersion !== 1) { throw new Error("addV1DevDependencies() is not supported for CDK 2.x and above, use addDevDeps()/addTestDeps() instead"); } this.addV1DependenciesByType(dependencies_1.DependencyType.BUILD, ...deps); } addConstructsDependency(requestedVersion) { if (requestedVersion && !semver.parse(requestedVersion)) { throw new Error(`"constructsVersion" cannot be parsed as a semver version: ${requestedVersion}`); } const defaultVersion = this.cdkMajorVersion === 1 ? "3.2.27" : "10.5.1"; const versionRequirement = `^${requestedVersion ?? defaultVersion}`; const constructsMajorVersion = semver.minVersion(versionRequirement)?.major; if (!constructsMajorVersion) { throw new Error(`Cannot determine major version of constructs version '${versionRequirement}'`); } switch (this.cdkMajorVersion) { case 1: if (constructsMajorVersion !== 3) { throw new Error("AWS CDK 1.x requires constructs 3.x"); } break; case 2: if (constructsMajorVersion !== 10) { throw new Error("AWS CDK 2.x requires constructs 10.x"); } break; } // First remove the version added by projen this.project.deps.removeDependency("constructs", dependencies_1.DependencyType.BUILD); // Add the version for CDK this.project.deps.addDependency(`${this._packageNames.constructs}@${versionRequirement}`, this.dependencyType); return versionRequirement; } /** * Adds a dependency on the AWS CDK framework (e.g. `@aws-cdk/core` for V1 or `aws-cdk-lib` for V1). */ addFrameworkDependency(options) { switch (this.cdkMajorVersion) { case 1: this.addV1Dependencies(this._packageNames.coreV1); break; case 2: if (options.cdkDependencies !== undefined) { throw new Error('cdkDependencies is not used for CDK 2.x. Use "peerDeps" or "deps" instead'); } if (options.cdkDependenciesAsDeps !== undefined) { throw new Error("cdkDependenciesAsDeps is not used for CDK 2.x"); } if (options.cdkTestDependencies !== undefined) { throw new Error('cdkTestDependencies is not used for CDK 2.x. Use "devDeps" or "testDeps" instead'); } this.project.deps.addDependency(`${this._packageNames.coreV2}@${this.cdkVersion}`, this.dependencyType); break; default: throw new Error(`Unsupported AWS CDK major version ${this.cdkMajorVersion}.x`); } } addV1AssertionLibraryDependency(options) { if (this.cdkMajorVersion !== 1) { if (options.cdkAssert !== undefined) { throw new Error("cdkAssert is not used for CDK 2.x. Use the assertions library that is provided in aws-cdk-lib"); } if (options.cdkAssertions !== undefined) { throw new Error("cdkAssertion is not used for CDK 2.x. Use the assertions library that is provided in aws-cdk-lib"); } return; } const testDeps = new Array(); if ((options.cdkAssert ?? true) && this._packageNames.assert) { testDeps.push(this._packageNames.assert); } // @aws-cdk/assertions is only available starting v1.111.0 if (semver.gte(this.cdkMinimumVersion, "1.111.0") && (options.cdkAssertions ?? true)) { testDeps.push(this._packageNames.assertions); } this.addV1DependenciesByType(dependencies_1.DependencyType.TEST, ...testDeps); } /** * Adds a set of dependencies with the user-specified dependency type. * @param deps The set of dependency specifications */ addV1DependenciesByType(type, ...modules) { for (const module of modules) { this.project.deps.addDependency(`${module}@${this.cdkVersion}`, type); } } } exports.AwsCdkDeps = AwsCdkDeps; _a = JSII_RTTI_SYMBOL_1; AwsCdkDeps[_a] = { fqn: "projen.awscdk.AwsCdkDeps", version: "0.99.34" }; /** * Which AWS CDK version a construct library package belongs to. */ var PACKAGE_AWS_CDK_VERSION; (function (PACKAGE_AWS_CDK_VERSION) { PACKAGE_AWS_CDK_VERSION["V1"] = "v1"; PACKAGE_AWS_CDK_VERSION["V2"] = "v2"; PACKAGE_AWS_CDK_VERSION["EITHER"] = "either"; PACKAGE_AWS_CDK_VERSION["UNKNOWN"] = "unknown"; })(PACKAGE_AWS_CDK_VERSION || (PACKAGE_AWS_CDK_VERSION = {})); function cdkVersionOfPackage(packageName) { if (packageName === "aws-cdk-lib") { return PACKAGE_AWS_CDK_VERSION.V2; } else if (packageName.startsWith("@aws-cdk/")) { if (packageName.endsWith("-alpha")) { return PACKAGE_AWS_CDK_VERSION.V2; } else if (AWS_CDK_V1_V2_SCOPED_PACKAGES.includes(packageName)) { return PACKAGE_AWS_CDK_VERSION.EITHER; } else { return PACKAGE_AWS_CDK_VERSION.V1; } } else { return PACKAGE_AWS_CDK_VERSION.UNKNOWN; } } /** * A list of all known packages in the "@aws-cdk/" scope that are published * both for v1 and v2. */ const AWS_CDK_V1_V2_SCOPED_PACKAGES = [ // aws/aws-cdk // @see https://github.com/aws/aws-cdk/tree/main/packages/%40aws-cdk "@aws-cdk/assert", // deprecated "@aws-cdk/cfn-property-mixins", "@aws-cdk/cfnspec", // deprecated "@aws-cdk/cx-api", "@aws-cdk/mixins-preview", "@aws-cdk/region-info", // aws/aws-cdk-cli // @see https://github.com/aws/aws-cdk-cli/tree/main/packages/%40aws-cdk "@aws-cdk/cdk-assets-lib", "@aws-cdk/cli-plugin-contract", "@aws-cdk/cloud-assembly-api", "@aws-cdk/cloud-assembly-schema", "@aws-cdk/cloudformation-diff", "@aws-cdk/integ-runner", "@aws-cdk/toolkit-lib", ]; function determineFrameworkVersion(options) { const ver = semver.parse(options.cdkVersion); if (!ver) { throw new Error(`"cdkVersion" cannot be parsed as a semver version: ${options.cdkVersion}`); } return { minimum: ver.format(), range: options.cdkVersionPinning ? options.cdkVersion : `^${options.cdkVersion}`, major: ver.major, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzY2RrLWRlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXdzY2RrL2F3c2Nkay1kZXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUNBQWlDO0FBQ2pDLDRDQUF5QztBQUN6QyxrREFBaUQ7QUFpSWpEOztHQUVHO0FBQ0gsTUFBc0IsVUFBVyxTQUFRLHFCQUFTO0lBaUNoRCxZQUFZLE9BQWdCLEVBQUUsT0FBMEI7UUFDdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUM7UUFFbkUsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXpDLE1BQU0sU0FBUyxHQUFHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUM7UUFDbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUUzQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFckMsNEJBQTRCO1FBQzVCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5QyxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXhELCtFQUErRTtRQUMvRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLElB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aW1wb3J0ICogYXMgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4uL2RlcGVuZGVuY2llc1wiO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEF3c0Nka0RlcHNgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ2RrRGVwc0NvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogTWluaW11bSB2ZXJzaW9uIG9mIHRoZSBBV1MgQ0RLIHRvIGRlcGVuZCBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIyLjE4OS4xXCJcbiAgICovXG4gIHJlYWRvbmx5IGNka1ZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVmVyc2lvbiByYW5nZSBvZiB0aGUgQVdTIENESyBDTEkgdG8gZGVwZW5kIG9uLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyIGEgc3BlY2lmaWMgdmVyc2lvbiwgb3IgYW4gTlBNIHZlcnNpb24gcmFuZ2UuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBsYXRlc3QgMi54IHZlcnNpb24gd2lsbCBiZSBpbnN0YWxsZWQ7IHlvdSBjYW4gdXNlIHRoaXNcbiAgICogb3B0aW9uIHRvIHJlc3RyaWN0IGl0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvciB2ZXJzaW9uIHJhbmdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIl4yXCJcbiAgICovXG4gIHJlYWRvbmx5IGNka0NsaVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gdmVyc2lvbiBvZiB0aGUgYGNvbnN0cnVjdHNgIGxpYnJhcnkgdG8gZGVwZW5kIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZvciBDREsgMS54IHRoZSBkZWZhdWx0IGlzIFwiMy4yLjI3XCIsIGZvciBDREsgMi54IHRoZSBkZWZhdWx0IGlzXG4gICAqIFwiMTAuNS4xXCIuXG4gICAqL1xuICByZWFkb25seSBjb25zdHJ1Y3RzVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVXNlIHBpbm5lZCB2ZXJzaW9uIGluc3RlYWQgb2YgY2FyZXQgdmVyc2lvbiBmb3IgQ0RLLlxuICAgKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHRvIHByZXZlbnQgbWl4ZWQgdmVyc2lvbnMgZm9yIHlvdXIgQ0RLIGRlcGVuZGVuY2llcyBhbmQgdG8gcHJldmVudCBhdXRvLXVwZGF0ZXMuXG4gICAqIElmIHlvdSB1c2UgZXhwZXJpbWVudGFsIGZlYXR1cmVzIHRoaXMgd2lsbCBsZXQgeW91IGRlZmluZSB0aGUgbW9tZW50IHlvdSBpbmNsdWRlIGJyZWFraW5nIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBjZGtWZXJzaW9uUGlubmluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoaWNoIEFXUyBDREt2MSBtb2R1bGVzIHRoaXMgcHJvamVjdCByZXF1aXJlc1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBGb3IgQ0RLIDIueCB1c2UgXCJkZXBzXCIgaW5zdGVhZC4gKG9yIFwicGVlckRlcHNcIiBpZiB5b3UncmUgYnVpbGRpbmcgYSBsaWJyYXJ5KVxuICAgKi9cbiAgcmVhZG9ubHkgY2RrRGVwZW5kZW5jaWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgZW5hYmxlZCAoZGVmYXVsdCksIGFsbCBtb2R1bGVzIGRlY2xhcmVkIGluIGBjZGtEZXBlbmRlbmNpZXNgIHdpbGwgYmUgYWxzbyBhZGRlZCBhc1xuICAgKiBub3JtYWwgYGRlcGVuZGVuY2llc2AgKGFzIHdlbGwgYXMgYHBlZXJEZXBlbmRlbmNpZXNgKS5cbiAgICpcbiAgICogVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBkb3duc3RyZWFtIGNvbnN1bWVycyBhY3R1YWxseSBoYXZlIHlvdXIgQ0RLIGRlcGVuZGVuY2llcyBpbnN0YWxsZWRcbiAgICogd2hlbiB1c2luZyBucG0gPCA3IG9yIHlhcm4sIHdoZXJlIHBlZXIgZGVwZW5kZW5jaWVzIGFyZSBub3QgYXV0b21hdGljYWxseSBpbnN0YWxsZWQuXG4gICAqIElmIHRoaXMgaXMgZGlzYWJsZWQsIGBjZGtEZXBlbmRlbmNpZXNgIHdpbGwgYmUgYWRkZWQgdG8gYGRldkRlcGVuZGVuY2llc2AgdG8gZW5zdXJlXG4gICAqIHRoZXkgYXJlIHByZXNlbnQgZHVyaW5nIGRldmVsb3BtZW50LlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNvbnN0cnVjdCBsaWJyYXJ5IHByb2plY3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQGRlcHJlY2F0ZWQgTm90IHN1cHBvcnRlZCBpbiBDREsgdjIuXG4gICAqL1xuICByZWFkb25seSBjZGtEZXBlbmRlbmNpZXNBc0RlcHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXYXJuaW5nOiBOb2RlSlMgb25seS5cbiAgICogSW5zdGFsbCB0aGUgQGF3cy1jZGsvYXNzZXJ0IGxpYnJhcnk/XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gd2lsbCBiZSBpbmNsdWRlZCBieSBkZWZhdWx0IGZvciBBV1MgQ0RLID49IDEuMC4wIDwgMi4wLjBcbiAgICogQGRlcHJlY2F0ZWQgVGhlIEBhd3MtY2RrL2Fzc2VydCBsaWJyYXJ5IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2ZcbiAgICogQGF3cy1jZGsvYXNzZXJ0aW9ucyAoaW4gVjEpIGFuZCBpbmNsdWRlZCBpbiBgYXdzLWNkay1saWJgIGZvciBWMi5cbiAgICovXG4gIHJlYWRvbmx5IGNka0Fzc2VydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIGFzc2VydGlvbnMgbGlicmFyeT9cbiAgICpcbiAgICogT25seSBuZWVkZWQgZm9yIENESyAxLnguIElmIHVzaW5nIENESyAyLnggdGhlblxuICAgKiBhc3NlcnRpb25zIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gJ2F3cy1jZGstbGliJ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHdpbGwgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdCBmb3IgQVdTIENESyA+PSAxLjExMS4wIDwgMi4wLjBcbiAgICovXG4gIHJlYWRvbmx5IGNka0Fzc2VydGlvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBV1MgQ0RLIG1vZHVsZXMgcmVxdWlyZWQgZm9yIHRlc3RpbmcuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEZvciBDREsgMi54IHVzZSAnZGV2RGVwcycgKGluIG5vZGUuanMgcHJvamVjdHMpIG9yICd0ZXN0RGVwcycgKGluIGphdmEgcHJvamVjdHMpIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGNka1Rlc3REZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBd3NDZGtEZXBzT3B0aW9ucyBleHRlbmRzIEF3c0Nka0RlcHNDb21tb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGRlcGVuZGVuY3kgdG8gdXNlIGZvciBydW50aW1lIEFXUyBDREsgYW5kIGBjb25zdHJ1Y3RzYCBtb2R1bGVzLlxuICAgKlxuICAgKiBGb3IgbGlicmFyaWVzLCB1c2UgcGVlciBkZXBlbmRlbmNpZXMgYW5kIGZvciBhcHBzIHVzZSBydW50aW1lIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY3lUeXBlOiBEZXBlbmRlbmN5VHlwZTtcbn1cblxuLyoqXG4gKiBMYW5ndWFnZS1zcGVjaWZpYyBBV1MgQ0RLIHBhY2thZ2UgbmFtZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ2RrUGFja2FnZU5hbWVzIHtcbiAgLyoqXG4gICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb3JlIGZyYW1ld29yayBwYWNrYWdlIGZvciBDREt2MVxuICAgKi9cbiAgcmVhZG9ubHkgY29yZVYxOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY29yZSBmcmFtZXdvcmsgcGFja2FnZSBmb3IgQ0RLdjJcbiAgICovXG4gIHJlYWRvbmx5IGNvcmVWMjogc3RyaW5nO1xuICAvKipcbiAgICogRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNvbnN0cnVjdHMgbGlicmFyeSBwYWNrYWdlXG4gICAqL1xuICByZWFkb25seSBjb25zdHJ1Y3RzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXNzZXJ0aW9ucyBsaWJyYXJ5IHBhY2thZ2VcbiAgICovXG4gIHJlYWRvbmx5IGFzc2VydGlvbnM6IHN0cmluZztcbiAgLyoqXG4gICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhc3NlcnQgbGlicmFyeSBwYWNrYWdlXG4gICAqIENhbiBiZSBlbXB0eSBhcyBpdCdzIG9ubHkgcmVhbGx5IGF2YWlsYWJsZSBmb3IgamF2YXNjcmlwdCBwcm9qZWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXJ0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgZGVwZW5kZW5jaWVzIG9uIHRoZSBBV1MgQ0RLLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXdzQ2RrRGVwcyBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgZGVwZW5kZW5jeSByZXF1aXJlbWVudCBmb3IgQVdTIENESyAoZS5nLiBgXjIuMC4wYCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwZW5kZW5jeSByZXF1aXJlbWVudCBmb3IgdGhlIENESyBDTEkgKGUuZy4gJ14yLjMuNCcpLlxuICAgKlxuICAgKiBXaWxsIHJldHVybiBgXjJgIGlmIHRoZSB2ZXJzaW9uIHdhcyB1bnNwZWNpZmllZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtDbGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIEFXUyBDREsgKGUuZy4gYDIuMC4wYCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrTWluaW11bVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBDREsgZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCBhcyBub3JtYWwgZGVwZW5kZW5jaWVzIChhbmQgcGVlciBkZXBlbmRlbmNpZXMpLlxuICAgKiBAZGVwcmVjYXRlZCBOb3QgdXNlZCBmb3IgQ0RLIDIueFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka0RlcGVuZGVuY2llc0FzRGVwczogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIEFXUyBDREsgKGUuZy4gMSwgMiwgLi4uKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka01ham9yVmVyc2lvbjogbnVtYmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwZW5kZW5jeVR5cGU6IERlcGVuZGVuY3lUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhY2thZ2VOYW1lczogQXdzQ2RrUGFja2FnZU5hbWVzO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IEF3c0Nka0RlcHNPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLmNka0RlcGVuZGVuY2llc0FzRGVwcyA9IG9wdGlvbnMuY2RrRGVwZW5kZW5jaWVzQXNEZXBzID8/IHRydWU7XG5cbiAgICB0aGlzLmRlcGVuZGVuY3lUeXBlID0gb3B0aW9ucy5kZXBlbmRlbmN5VHlwZTtcbiAgICB0aGlzLl9wYWNrYWdlTmFtZXMgPSB0aGlzLnBhY2thZ2VOYW1lcygpO1xuXG4gICAgY29uc3QgZnJhbWV3b3JrID0gZGV0ZXJtaW5lRnJhbWV3b3JrVmVyc2lvbihvcHRpb25zKTtcblxuICAgIHRoaXMuY2RrQ2xpVmVyc2lvbiA9IG9wdGlvbnMuY2RrQ2xpVmVyc2lvbiA/PyBcIl4yXCI7XG4gICAgdGhpcy5jZGtWZXJzaW9uID0gZnJhbWV3b3JrLnJhbmdlO1xuICAgIHRoaXMuY2RrTWFqb3JWZXJzaW9uID0gZnJhbWV3b3JrLm1ham9yO1xuICAgIHRoaXMuY2RrTWluaW11bVZlcnNpb24gPSBmcmFtZXdvcmsubWluaW11bTtcblxuICAgIHRoaXMuYWRkRnJhbWV3b3JrRGVwZW5kZW5jeShvcHRpb25zKTtcblxuICAgIC8vIGFzc2VydC9hc3NlcnRpb25zIGxpYnJhcnlcbiAgICB0aGlzLmFkZFYxQXNzZXJ0aW9uTGlicmFyeURlcGVuZGVuY3kob3B0aW9ucyk7XG5cbiAgICAvLyBjb25zdHJ1Y3RzIGxpYnJhcnlcbiAgICB0aGlzLmFkZENvbnN0cnVjdHNEZXBlbmRlbmN5KG9wdGlvbnMuY29uc3RydWN0c1ZlcnNpb24pO1xuXG4gICAgLy8gdXNlci1kZWZpbmVkIHYxIGRlcGVuZGVuY2llcyAod2lsbCBvbmx5IGZhaWwgaW4gQ0RLIHYyIGlmIHRoZXNlIGhhdmUgdmFsdWVzKVxuICAgIHRoaXMuYWRkVjFEZXBlbmRlbmNpZXMoLi4uKG9wdGlvbnMuY2RrRGVwZW5kZW5jaWVzID8/IFtdKSk7XG4gICAgdGhpcy5hZGRWMURldkRlcGVuZGVuY2llcyguLi4ob3B0aW9ucy5jZGtUZXN0RGVwZW5kZW5jaWVzID8/IFtdKSk7XG4gIH1cblxuICBwdWJsaWMgcHJlU3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICAvLyBMb2cgYSB3YXJuaW5nIGlmIGFueSBBV1MgQ0RLIHYxLW9ubHkgZGVwcyBhcmUgZm91bmQgaW4gdGhlIGRlcGVuZGVuY2llcy5cbiAgICBjb25zdCBkZXBOYW1lcyA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KHRoaXMucHJvamVjdC5kZXBzLmFsbC5tYXAoKGRlcCkgPT4gZGVwLm5hbWUpKSxcbiAgICApO1xuICAgIGNvbnN0IHYxRGVwcyA9IGRlcE5hbWVzXG4gICAgICAuZmlsdGVyKChkZXApID0+XG4gICAgICAgIFtQQUNLQUdFX0FXU19DREtfVkVSU0lPTi5WMV0uaW5jbHVkZXMoY2RrVmVyc2lvbk9mUGFja2FnZShkZXApKSxcbiAgICAgIClcbiAgICAgIC5zb3J0KCk7XG4gICAgaWYgKHRoaXMuY2RrTWFqb3JWZXJzaW9uID09PSAyICYmIHYxRGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnByb2plY3QubG9nZ2VyLndhcm4oXG4gICAgICAgIGBXQVJOSU5HOiBGb3VuZCBDREsgdjEgZGVwcyBpbiB5b3VyIHByb2plY3QsIGV2ZW4gdGhvdWdoIHlvdXIgXCJjZGtWZXJzaW9uXCIgaXMgMi54OiBbJHt2MURlcHMuam9pbihcbiAgICAgICAgICBcIiwgXCIsXG4gICAgICAgICl9XS4gQ2hlY2sgb3V0IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvdjIvZ3VpZGUvbWlncmF0aW5nLXYyLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgQ0RLIHYyIGRlcGVuZGVuY2llcy5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBkZXBlbmRlbmNpZXMgdG8gQVdTIENESyBtb2R1bGVzLlxuICAgKlxuICAgKiBUaGUgdHlwZSBvZiBkZXBlbmRlbmN5IGlzIGRldGVybWluZWQgYnkgdGhlIGBkZXBlbmRlbmN5VHlwZWAgb3B0aW9uLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIENESyB2Mi4gVXNlIGBwcm9qZWN0LmFkZFBlZXJEZXBzKClgIG9yXG4gICAqIGBwcm9qZWN0LmFkZERlcHMoKWAgYXMgYXBwcm9wcmlhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBzIG5hbWVzIG9mIGNkayBtb2R1bGVzIChlLmcuIGBAYXdzLWNkay9hd3MtbGFtYmRhYCkuXG4gICAqL1xuICBwdWJsaWMgYWRkVjFEZXBlbmRlbmNpZXMoLi4uZGVwczogc3RyaW5nW10pIHtcbiAgICBpZiAoZGVwcy5sZW5ndGggPiAwICYmIHRoaXMuY2RrTWFqb3JWZXJzaW9uICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiYWRkVjFEZXBlbmRlbmNpZXMoKSBpcyBub3Qgc3VwcG9ydGVkIGZvciBDREsgMi54IGFuZCBhYm92ZSwgdXNlIGFkZERlcHMoKSBvciBhZGRQZWVyRGVwcygpIGluc3RlYWRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB3aWxsIGFkZCBkZXBlbmRlbmNpZXMgYmFzZWQgb24gdGhlIHR5cGUgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyXG4gICAgLy8gZm9yIGxpYnJhcmllcywgdGhpcyB3aWxsIGJlIFwicGVlclwiIGFuZCBmb3IgYXBwcyBpdCB3aWxsIGJlIFwicnVudGltZVwiXG4gICAgdGhpcy5hZGRWMURlcGVuZGVuY2llc0J5VHlwZSh0aGlzLmRlcGVuZGVuY3lUeXBlLCAuLi5kZXBzKTtcblxuICAgIC8vIGFkZCBkZXBzIGFzIHJ1bnRpbWUgZGVwcyBpZiBgY2RrRGVwc0FzRGVwc2AgaXMgdHJ1ZVxuICAgIGlmICh0aGlzLmNka0RlcGVuZGVuY2llc0FzRGVwcykge1xuICAgICAgdGhpcy5hZGRWMURlcGVuZGVuY2llc0J5VHlwZShEZXBlbmRlbmN5VHlwZS5SVU5USU1FLCAuLi5kZXBzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBBV1MgQ0RLIG1vZHVsZXMgYXMgZGV2IGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBpbiBDREsgdjIuIFVzZSBgcHJvamVjdC5hZGRQZWVyRGVwcygpYCBvclxuICAgKiBgcHJvamVjdC5hZGREZXBzKClgIGFzIGFwcHJvcHJpYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyBmdWxseSBxdWFsaWZpZWQgbmFtZXMgb2YgY2RrIG1vZHVsZXMgKGUuZy4gYEBhd3MtY2RrL2F3cy1sYW1iZGFgKS5cbiAgICovXG4gIHB1YmxpYyBhZGRWMURldkRlcGVuZGVuY2llcyguLi5kZXBzOiBzdHJpbmdbXSkge1xuICAgIGlmIChkZXBzLmxlbmd0aCA+IDAgJiYgdGhpcy5jZGtNYWpvclZlcnNpb24gIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJhZGRWMURldkRlcGVuZGVuY2llcygpIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENESyAyLnggYW5kIGFib3ZlLCB1c2UgYWRkRGV2RGVwcygpL2FkZFRlc3REZXBzKCkgaW5zdGVhZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFYxRGVwZW5kZW5jaWVzQnlUeXBlKERlcGVuZGVuY3lUeXBlLkJVSUxELCAuLi5kZXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29uc3RydWN0c0RlcGVuZGVuY3kocmVxdWVzdGVkVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHJlcXVlc3RlZFZlcnNpb24gJiYgIXNlbXZlci5wYXJzZShyZXF1ZXN0ZWRWZXJzaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgXCJjb25zdHJ1Y3RzVmVyc2lvblwiIGNhbm5vdCBiZSBwYXJzZWQgYXMgYSBzZW12ZXIgdmVyc2lvbjogJHtyZXF1ZXN0ZWRWZXJzaW9ufWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWZXJzaW9uID0gdGhpcy5jZGtNYWpvclZlcnNpb24gPT09IDEgPyBcIjMuMi4yN1wiIDogXCIxMC41LjFcIjtcbiAgICBjb25zdCB2ZXJzaW9uUmVxdWlyZW1lbnQgPSBgXiR7cmVxdWVzdGVkVmVyc2lvbiA/PyBkZWZhdWx0VmVyc2lvbn1gO1xuXG4gICAgY29uc3QgY29uc3RydWN0c01ham9yVmVyc2lvbiA9IHNlbXZlci5taW5WZXJzaW9uKHZlcnNpb25SZXF1aXJlbWVudCk/Lm1ham9yO1xuICAgIGlmICghY29uc3RydWN0c01ham9yVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGRldGVybWluZSBtYWpvciB2ZXJzaW9uIG9mIGNvbnN0cnVjdHMgdmVyc2lvbiAnJHt2ZXJzaW9uUmVxdWlyZW1lbnR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5jZGtNYWpvclZlcnNpb24pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKGNvbnN0cnVjdHNNYWpvclZlcnNpb24gIT09IDMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBV1MgQ0RLIDEueCByZXF1aXJlcyBjb25zdHJ1Y3RzIDMueFwiKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBpZiAoY29uc3RydWN0c01ham9yVmVyc2lvbiAhPT0gMTApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBV1MgQ0RLIDIueCByZXF1aXJlcyBjb25zdHJ1Y3RzIDEwLnhcIik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QgcmVtb3ZlIHRoZSB2ZXJzaW9uIGFkZGVkIGJ5IHByb2plblxuICAgIHRoaXMucHJvamVjdC5kZXBzLnJlbW92ZURlcGVuZGVuY3koXCJjb25zdHJ1Y3RzXCIsIERlcGVuZGVuY3lUeXBlLkJVSUxEKTtcblxuICAgIC8vIEFkZCB0aGUgdmVyc2lvbiBmb3IgQ0RLXG4gICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShcbiAgICAgIGAke3RoaXMuX3BhY2thZ2VOYW1lcy5jb25zdHJ1Y3RzfUAke3ZlcnNpb25SZXF1aXJlbWVudH1gLFxuICAgICAgdGhpcy5kZXBlbmRlbmN5VHlwZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHZlcnNpb25SZXF1aXJlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgZGVwZW5kZW5jeSBvbiB0aGUgQVdTIENESyBmcmFtZXdvcmsgKGUuZy4gYEBhd3MtY2RrL2NvcmVgIGZvciBWMSBvciBgYXdzLWNkay1saWJgIGZvciBWMSkuXG4gICAqL1xuICBwcml2YXRlIGFkZEZyYW1ld29ya0RlcGVuZGVuY3kob3B0aW9uczogQXdzQ2RrRGVwc09wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKHRoaXMuY2RrTWFqb3JWZXJzaW9uKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHRoaXMuYWRkVjFEZXBlbmRlbmNpZXModGhpcy5fcGFja2FnZU5hbWVzLmNvcmVWMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIGlmIChvcHRpb25zLmNka0RlcGVuZGVuY2llcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2Nka0RlcGVuZGVuY2llcyBpcyBub3QgdXNlZCBmb3IgQ0RLIDIueC4gVXNlIFwicGVlckRlcHNcIiBvciBcImRlcHNcIiBpbnN0ZWFkJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNka0RlcGVuZGVuY2llc0FzRGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2RrRGVwZW5kZW5jaWVzQXNEZXBzIGlzIG5vdCB1c2VkIGZvciBDREsgMi54XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNka1Rlc3REZXBlbmRlbmNpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdjZGtUZXN0RGVwZW5kZW5jaWVzIGlzIG5vdCB1c2VkIGZvciBDREsgMi54LiBVc2UgXCJkZXZEZXBzXCIgb3IgXCJ0ZXN0RGVwc1wiIGluc3RlYWQnLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KFxuICAgICAgICAgIGAke3RoaXMuX3BhY2thZ2VOYW1lcy5jb3JlVjJ9QCR7dGhpcy5jZGtWZXJzaW9ufWAsXG4gICAgICAgICAgdGhpcy5kZXBlbmRlbmN5VHlwZSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgQVdTIENESyBtYWpvciB2ZXJzaW9uICR7dGhpcy5jZGtNYWpvclZlcnNpb259LnhgLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkVjFBc3NlcnRpb25MaWJyYXJ5RGVwZW5kZW5jeShvcHRpb25zOiBBd3NDZGtEZXBzT3B0aW9ucykge1xuICAgIGlmICh0aGlzLmNka01ham9yVmVyc2lvbiAhPT0gMSkge1xuICAgICAgaWYgKG9wdGlvbnMuY2RrQXNzZXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiY2RrQXNzZXJ0IGlzIG5vdCB1c2VkIGZvciBDREsgMi54LiBVc2UgdGhlIGFzc2VydGlvbnMgbGlicmFyeSB0aGF0IGlzIHByb3ZpZGVkIGluIGF3cy1jZGstbGliXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5jZGtBc3NlcnRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiY2RrQXNzZXJ0aW9uIGlzIG5vdCB1c2VkIGZvciBDREsgMi54LiBVc2UgdGhlIGFzc2VydGlvbnMgbGlicmFyeSB0aGF0IGlzIHByb3ZpZGVkIGluIGF3cy1jZGstbGliXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXN0RGVwcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAoKG9wdGlvbnMuY2RrQXNzZXJ0ID8/IHRydWUpICYmIHRoaXMuX3BhY2thZ2VOYW1lcy5hc3NlcnQpIHtcbiAgICAgIHRlc3REZXBzLnB1c2godGhpcy5fcGFja2FnZU5hbWVzLmFzc2VydCk7XG4gICAgfVxuXG4gICAgLy8gQGF3cy1jZGsvYXNzZXJ0aW9ucyBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyB2MS4xMTEuMFxuICAgIGlmIChcbiAgICAgIHNlbXZlci5ndGUodGhpcy5jZGtNaW5pbXVtVmVyc2lvbiwgXCIxLjExMS4wXCIpICYmXG4gICAgICAob3B0aW9ucy5jZGtBc3NlcnRpb25zID8/IHRydWUpXG4gICAgKSB7XG4gICAgICB0ZXN0RGVwcy5wdXNoKHRoaXMuX3BhY2thZ2VOYW1lcy5hc3NlcnRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFYxRGVwZW5kZW5jaWVzQnlUeXBlKERlcGVuZGVuY3lUeXBlLlRFU1QsIC4uLnRlc3REZXBzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2V0IG9mIGRlcGVuZGVuY2llcyB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBkZXBlbmRlbmN5IHR5cGUuXG4gICAqIEBwYXJhbSBkZXBzIFRoZSBzZXQgb2YgZGVwZW5kZW5jeSBzcGVjaWZpY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRWMURlcGVuZGVuY2llc0J5VHlwZSh0eXBlOiBEZXBlbmRlbmN5VHlwZSwgLi4ubW9kdWxlczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICB0aGlzLnByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KGAke21vZHVsZX1AJHt0aGlzLmNka1ZlcnNpb259YCwgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgcGFja2FnZSBuYW1pbmcgaW4gdmFyaW91cyBsYW5ndWFnZXNcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYWNrYWdlTmFtZXMoKTogQXdzQ2RrUGFja2FnZU5hbWVzO1xufVxuXG4vKipcbiAqIFdoaWNoIEFXUyBDREsgdmVyc2lvbiBhIGNvbnN0cnVjdCBsaWJyYXJ5IHBhY2thZ2UgYmVsb25ncyB0by5cbiAqL1xuZW51bSBQQUNLQUdFX0FXU19DREtfVkVSU0lPTiB7XG4gIFYxID0gXCJ2MVwiLFxuICBWMiA9IFwidjJcIixcbiAgRUlUSEVSID0gXCJlaXRoZXJcIiwgLy8gVGhpcyBwYWNrYWdlIGhhcyBiZWVuIHB1Ymxpc2hlZCBib3RoIGZvciB2MSBhbmQgdjIuXG4gIFVOS05PV04gPSBcInVua25vd25cIixcbn1cblxuZnVuY3Rpb24gY2RrVmVyc2lvbk9mUGFja2FnZShwYWNrYWdlTmFtZTogc3RyaW5nKSB7XG4gIGlmIChwYWNrYWdlTmFtZSA9PT0gXCJhd3MtY2RrLWxpYlwiKSB7XG4gICAgcmV0dXJuIFBBQ0tBR0VfQVdTX0NES19WRVJTSU9OLlYyO1xuICB9IGVsc2UgaWYgKHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoXCJAYXdzLWNkay9cIikpIHtcbiAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoXCItYWxwaGFcIikpIHtcbiAgICAgIHJldHVybiBQQUNLQUdFX0FXU19DREtfVkVSU0lPTi5WMjtcbiAgICB9IGVsc2UgaWYgKEFXU19DREtfVjFfVjJfU0NPUEVEX1BBQ0tBR0VTLmluY2x1ZGVzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgcmV0dXJuIFBBQ0tBR0VfQVdTX0NES19WRVJTSU9OLkVJVEhFUjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFBBQ0tBR0VfQVdTX0NES19WRVJTSU9OLlYxO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUEFDS0FHRV9BV1NfQ0RLX1ZFUlNJT04uVU5LTk9XTjtcbiAgfVxufVxuXG4vKipcbiAqIEEgbGlzdCBvZiBhbGwga25vd24gcGFja2FnZXMgaW4gdGhlIFwiQGF3cy1jZGsvXCIgc2NvcGUgdGhhdCBhcmUgcHVibGlzaGVkXG4gKiBib3RoIGZvciB2MSBhbmQgdjIuXG4gKi9cbmNvbnN0IEFXU19DREtfVjFfVjJfU0NPUEVEX1BBQ0tBR0VTID0gW1xuICAvLyBhd3MvYXdzLWNka1xuICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay90cmVlL21haW4vcGFja2FnZXMvJTQwYXdzLWNka1xuICBcIkBhd3MtY2RrL2Fzc2VydFwiLCAvLyBkZXByZWNhdGVkXG4gIFwiQGF3cy1jZGsvY2ZuLXByb3BlcnR5LW1peGluc1wiLFxuICBcIkBhd3MtY2RrL2NmbnNwZWNcIiwgLy8gZGVwcmVjYXRlZFxuICBcIkBhd3MtY2RrL2N4LWFwaVwiLFxuICBcIkBhd3MtY2RrL21peGlucy1wcmV2aWV3XCIsXG4gIFwiQGF3cy1jZGsvcmVnaW9uLWluZm9cIixcblxuICAvLyBhd3MvYXdzLWNkay1jbGlcbiAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGstY2xpL3RyZWUvbWFpbi9wYWNrYWdlcy8lNDBhd3MtY2RrXG4gIFwiQGF3cy1jZGsvY2RrLWFzc2V0cy1saWJcIixcbiAgXCJAYXdzLWNkay9jbGktcGx1Z2luLWNvbnRyYWN0XCIsXG4gIFwiQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpXCIsXG4gIFwiQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hXCIsXG4gIFwiQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZlwiLFxuICBcIkBhd3MtY2RrL2ludGVnLXJ1bm5lclwiLFxuICBcIkBhd3MtY2RrL3Rvb2xraXQtbGliXCIsXG5dO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVGcmFtZXdvcmtWZXJzaW9uKG9wdGlvbnM6IEF3c0Nka0RlcHNPcHRpb25zKSB7XG4gIGNvbnN0IHZlciA9IHNlbXZlci5wYXJzZShvcHRpb25zLmNka1ZlcnNpb24pO1xuICBpZiAoIXZlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcImNka1ZlcnNpb25cIiBjYW5ub3QgYmUgcGFyc2VkIGFzIGEgc2VtdmVyIHZlcnNpb246ICR7b3B0aW9ucy5jZGtWZXJzaW9ufWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWluaW11bTogdmVyLmZvcm1hdCgpLFxuICAgIHJhbmdlOiBvcHRpb25zLmNka1ZlcnNpb25QaW5uaW5nXG4gICAgICA/IG9wdGlvbnMuY2RrVmVyc2lvblxuICAgICAgOiBgXiR7b3B0aW9ucy5jZGtWZXJzaW9ufWAsXG4gICAgbWFqb3I6IHZlci5tYWpvcixcbiAgfTtcbn1cbiJdfQ==