UNPKG

projen

Version:

CDK for software projects

270 lines • 44.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Dependabot = exports.VersioningStrategy = exports.DependabotScheduleInterval = exports.DependabotGroupUpdateType = exports.DependabotGroupDependencyType = exports.DependabotGroupAppliesTo = exports.DependabotRegistryType = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const component_1 = require("../component"); const util_1 = require("../util"); const yaml_1 = require("../yaml"); /** * Each configuration type requires you to provide particular settings. * Some types allow more than one way to connect * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#configuration-options-for-private-registries */ var DependabotRegistryType; (function (DependabotRegistryType) { /** * The composer-repository type supports username and password. * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#composer-repository */ DependabotRegistryType["COMPOSER_REGISTRY"] = "composer-registry"; /** * The docker-registry type supports username and password. * The docker-registry type can also be used to pull from Amazon ECR using static AWS credentials * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#docker-registry */ DependabotRegistryType["DOCKER_REGISTRY"] = "docker-registry"; /** * The git type supports username and password * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#git */ DependabotRegistryType["GIT"] = "git"; /** * The hex-organization type supports organization and key * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#hex-organization */ DependabotRegistryType["HEX_ORGANIZATION"] = "hex-organization"; /** * The maven-repository type supports username and password, or token * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#maven-repository */ DependabotRegistryType["MAVEN_REPOSITORY"] = "maven-repository"; /** * The npm-registry type supports username and password, or token * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#npm-registry */ DependabotRegistryType["NPM_REGISTRY"] = "npm-registry"; /** * The nuget-feed type supports username and password, or token * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#nuget-feed */ DependabotRegistryType["NUGET_FEED"] = "nuget-feed"; /** * The python-index type supports username and password, or token * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#python-index */ DependabotRegistryType["PYTHON_INDEX"] = "python-index"; /** * The rubygems-server type supports username and password, or token * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#rubygems-server */ DependabotRegistryType["RUBYGEMS_SERVER"] = "rubygems-server"; /** * The terraform-registry type supports a token * @see https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates#terraform-registry */ DependabotRegistryType["TERRAFORM_REGISTRY"] = "terraform-registry"; })(DependabotRegistryType || (exports.DependabotRegistryType = DependabotRegistryType = {})); /** * The type of update a group applies to. */ var DependabotGroupAppliesTo; (function (DependabotGroupAppliesTo) { /** * Apply only to version updates. */ DependabotGroupAppliesTo["VERSION_UPDATES"] = "version-updates"; /** * Apply only to security updates. */ DependabotGroupAppliesTo["SECURITY_UPDATES"] = "security-updates"; })(DependabotGroupAppliesTo || (exports.DependabotGroupAppliesTo = DependabotGroupAppliesTo = {})); /** * The type of dependency a group may be limited to. */ var DependabotGroupDependencyType; (function (DependabotGroupDependencyType) { /** * Include only dependencies in the "Development dependency group". */ DependabotGroupDependencyType["DEVELOPMENT"] = "development"; /** * Include only dependencies in the "Production dependency group". */ DependabotGroupDependencyType["PRODUCTION"] = "production"; })(DependabotGroupDependencyType || (exports.DependabotGroupDependencyType = DependabotGroupDependencyType = {})); /** * The semantic versioning levels a group may be limited to. */ var DependabotGroupUpdateType; (function (DependabotGroupUpdateType) { /** * Include major releases. */ DependabotGroupUpdateType["MAJOR"] = "major"; /** * Include minor releases. */ DependabotGroupUpdateType["MINOR"] = "minor"; /** * Include patch releases. */ DependabotGroupUpdateType["PATCH"] = "patch"; })(DependabotGroupUpdateType || (exports.DependabotGroupUpdateType = DependabotGroupUpdateType = {})); /** * How often to check for new versions and raise pull requests for version * updates. */ var DependabotScheduleInterval; (function (DependabotScheduleInterval) { /** * Runs on every weekday, Monday to Friday. */ DependabotScheduleInterval["DAILY"] = "daily"; /** * Runs once each week. By default, this is on Monday. */ DependabotScheduleInterval["WEEKLY"] = "weekly"; /** * Runs once each month. This is on the first day of the month. */ DependabotScheduleInterval["MONTHLY"] = "monthly"; })(DependabotScheduleInterval || (exports.DependabotScheduleInterval = DependabotScheduleInterval = {})); /** * The strategy to use when edits manifest and lock files. */ var VersioningStrategy; (function (VersioningStrategy) { /** * Only create pull requests to update lockfiles updates. Ignore any new * versions that would require package manifest changes. */ VersioningStrategy["LOCKFILE_ONLY"] = "lockfile-only"; /** * - For apps, the version requirements are increased. * - For libraries, the range of versions is widened. */ VersioningStrategy["AUTO"] = "auto"; /** * Relax the version requirement to include both the new and old version, when * possible. */ VersioningStrategy["WIDEN"] = "widen"; /** * Always increase the version requirement to match the new version. */ VersioningStrategy["INCREASE"] = "increase"; /** * Increase the version requirement only when required by the new version. */ VersioningStrategy["INCREASE_IF_NECESSARY"] = "increase-if-necessary"; })(VersioningStrategy || (exports.VersioningStrategy = VersioningStrategy = {})); /** * Defines dependabot configuration for node projects. * * Since module versions are managed in projen, the versioning strategy will be * configured to "lockfile-only" which means that only updates that can be done * on the lockfile itself will be proposed. */ class Dependabot extends component_1.Component { constructor(github, options = {}) { super(github.project); const project = github.project; this.allow = []; this.ignore = []; this.ignoresProjen = options.ignoreProjen ?? true; const registries = options.registries ? (0, util_1.kebabCaseKeys)(options.registries) : undefined; for (const [name, group] of Object.entries(options.groups ?? {})) { validateGroup(name, group); } const groups = options.groups ? (0, util_1.kebabCaseKeys)(options.groups) : undefined; this.config = { version: 2, registries, updates: [ { "package-ecosystem": "npm", "versioning-strategy": "lockfile-only", directory: "/", schedule: { interval: options.scheduleInterval ?? DependabotScheduleInterval.DAILY, }, allow: () => (this.allow.length > 0 ? this.allow : undefined), ignore: () => (this.ignore.length > 0 ? this.ignore : undefined), labels: options.labels ? options.labels : undefined, registries: registries ? Object.keys(registries) : undefined, groups: groups ? groups : undefined, assignees: options.assignees && options.assignees.length > 0 ? options.assignees : undefined, reviewers: options.reviewers && options.reviewers.length > 0 ? options.reviewers : undefined, "open-pull-requests-limit": options.openPullRequestsLimit !== undefined ? options.openPullRequestsLimit : undefined, "target-branch": options.targetBranch, cooldown: options.cooldown ? (0, util_1.kebabCaseKeys)(options.cooldown) : undefined, }, ], }; new yaml_1.YamlFile(project, ".github/dependabot.yml", { obj: this.config, committed: true, }); for (const i of options.allow ?? []) { this.addAllow(i.dependencyName); } for (const i of options.ignore ?? []) { this.addIgnore(i.dependencyName, ...(i.versions ?? [])); } if (this.ignoresProjen) { this.addIgnore("projen"); } } /** * Allows a dependency from automatic updates. * * @param dependencyName Use to allow updates for dependencies with matching * names, optionally using `*` to match zero or more characters. */ addAllow(dependencyName) { this.allow.push({ "dependency-name": dependencyName, }); } /** * Ignores a dependency from automatic updates. * * @param dependencyName Use to ignore updates for dependencies with matching * names, optionally using `*` to match zero or more characters. * @param versions Use to ignore specific versions or ranges of versions. If * you want to define a range, use the standard pattern for the package * manager (for example: `^1.0.0` for npm, or `~> 2.0` for Bundler). */ addIgnore(dependencyName, ...versions) { this.ignore.push({ "dependency-name": dependencyName, versions: () => (versions.length > 0 ? versions : undefined), }); } } exports.Dependabot = Dependabot; _a = JSII_RTTI_SYMBOL_1; Dependabot[_a] = { fqn: "projen.github.Dependabot", version: "0.99.51" }; function validateGroup(name, group) { // update types if (group.updateTypes !== undefined) { if (group.updateTypes.length < 1) { throw new Error(`Dependabot group "${name}" must not have an empty array of update types.`); } if (new Set(group.updateTypes).size !== group.updateTypes.length) { throw new Error(`Dependabot group "${name}" must not have duplicate update types.`); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kYWJvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXRodWIvZGVwZW5kYWJvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDRDQUF5QztBQUN6QyxrQ0FBd0M7QUFDeEMsa0NBQW1DO0FBZ05uQzs7OztHQUlHO0FBQ0gsSUFBWSxzQkE2RFg7QUE3REQsV0FBWSxzQkFBc0I7SUFDaEM7OztPQUdHO0lBQ0gsaUVBQXVDLENBQUE7SUFFdkM7Ozs7T0FJRztJQUNILDZEQUFtQyxDQUFBO0lBRW5DOzs7T0FHRztJQUNILHFDQUFXLENBQUE7SUFFWDs7O09BR0c7SUFDSCwrREFBcUMsQ0FBQTtJQUVyQzs7O09BR0c7SUFDSCwrREFBcUMsQ0FBQTtJQUVyQzs7O09BR0c7SUFDSCx1REFBNkIsQ0FBQTtJQUU3Qjs7O09BR0c7SUFDSCxtREFBeUIsQ0FBQTtJQUV6Qjs7O09BR0c7SUFDSCx1REFBNkIsQ0FBQTtJQUU3Qjs7O09BR0c7SUFDSCw2REFBbUMsQ0FBQTtJQUVuQzs7O09BR0c7SUFDSCxtRUFBeUMsQ0FBQTtBQUMzQyxDQUFDLEVBN0RXLHNCQUFzQixzQ0FBdEIsc0JBQXNCLFFBNkRqQztBQWdGRDs7R0FFRztBQUNILElBQVksd0JBVVg7QUFWRCxXQUFZLHdCQUF3QjtJQUNsQzs7T0FFRztJQUNILCtEQUFtQyxDQUFBO0lBRW5DOztPQUVHO0lBQ0gsaUVBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQVZXLHdCQUF3Qix3Q0FBeEIsd0JBQXdCLFFBVW5DO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLDZCQVVYO0FBVkQsV0FBWSw2QkFBNkI7SUFDdkM7O09BRUc7SUFDSCw0REFBMkIsQ0FBQTtJQUUzQjs7T0FFRztJQUNILDBEQUF5QixDQUFBO0FBQzNCLENBQUMsRUFWVyw2QkFBNkIsNkNBQTdCLDZCQUE2QixRQVV4QztBQUVEOztHQUVHO0FBQ0gsSUFBWSx5QkFlWDtBQWZELFdBQVkseUJBQXlCO0lBQ25DOztP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TUFBTSxJQUFJLEtBQUssQ0FDYixxQkFBcUIsSUFBSSx5Q0FBeUMsQ0FDbkUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgR2l0SHViIH0gZnJvbSBcIi4vZ2l0aHViXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBrZWJhYkNhc2VLZXlzIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCB7IFlhbWxGaWxlIH0gZnJvbSBcIi4uL3lhbWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEZXBlbmRhYm90T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgb2Z0ZW4gdG8gY2hlY2sgZm9yIG5ldyB2ZXJzaW9ucyBhbmQgcmFpc2UgcHVsbCByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgU2NoZWR1bGVJbnRlcnZhbC5EQUlMWVxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGVJbnRlcnZhbD86IERlcGVuZGFib3RTY2hlZHVsZUludGVydmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gZWRpdHMgbWFuaWZlc3QgYW5kIGxvY2sgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFZlcnNpb25pbmdTdHJhdGVneS5MT0NLRklMRV9PTkxZIFRoZSBkZWZhdWx0IGlzIHRvIG9ubHkgdXBkYXRlIHRoZVxuICAgKiBsb2NrIGZpbGUgYmVjYXVzZSBwYWNrYWdlLmpzb24gaXMgY29udHJvbGxlZCBieSBwcm9qZW4gYW5kIGFueSBvdXRzaWRlXG4gICAqIHVwZGF0ZXMgd2lsbCBmYWlsIHRoZSBidWlsZC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25pbmdTdHJhdGVneT86IFZlcnNpb25pbmdTdHJhdGVneTtcblxuICAvKipcbiAgICogaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9kZXBlbmRhYm90L2RlcGVuZGFib3QtdmVyc2lvbi11cGRhdGVzL2NvbmZpZ3VyYXRpb24tb3B0aW9ucy1mb3ItdGhlLWRlcGVuZGFib3QueW1sLWZpbGUjYWxsb3dcbiAgICpcbiAgICogVXNlIHRoZSBhbGxvdyBvcHRpb24gdG8gY3VzdG9taXplIHdoaWNoIGRlcGVuZGVuY2llcyBhcmUgdXBkYXRlZC4gVGhpc1xuICAgKiBhcHBsaWVzIHRvIGJvdGggdmVyc2lvbiBhbmQgc2VjdXJpdHkgdXBkYXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93PzogRGVwZW5kYWJvdEFsbG93W107XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBgaWdub3JlYCBvcHRpb24gdG8gY3VzdG9taXplIHdoaWNoIGRlcGVuZGVuY2llcyBhcmUgdXBkYXRlZC5cbiAgICogVGhlIGlnbm9yZSBvcHRpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvcHRpb25zLlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlPzogRGVwZW5kYWJvdElnbm9yZVtdO1xuXG4gIC8qKlxuICAgKiBJZ25vcmVzIHVwZGF0ZXMgdG8gYHByb2plbmAuXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgc2luY2UgcHJvamVuIHVwZGF0ZXMgbWF5IGNhdXNlIGNoYW5nZXMgaW4gY29tbWl0dGVkIGZpbGVzXG4gICAqIGFuZCBhbnRpLXRhbXBlciBjaGVja3Mgd2lsbCBmYWlsLlxuICAgKlxuICAgKiBQcm9qZW4gdXBncmFkZXMgYXJlIGNvdmVyZWQgdGhyb3VnaCB0aGUgYFByb2plblVwZ3JhZGVgIGNsYXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVQcm9qZW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGxhYmVscyB0byBhcHBseSB0byB0aGUgY3JlYXRlZCBQUidzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1hcCBvZiBwYWNrYWdlIHJlZ2lzdHJpZXMgdG8gdXNlXG4gICAqIEBkZWZhdWx0IC0gdXNlIHB1YmxpYyByZWdpc3RyaWVzXG4gICAqL1xuICByZWFkb25seSByZWdpc3RyaWVzPzogeyBbbmFtZTogc3RyaW5nXTogRGVwZW5kYWJvdFJlZ2lzdHJ5IH07XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG1heGltdW0gb2YgcHVsbCByZXF1ZXN0cyBEZXBlbmRhYm90IG9wZW5zIGZvciB2ZXJzaW9uIHVwZGF0ZXMuXG4gICAqIERlcGVuZGFib3Qgd2lsbCBub3Qgb3BlbiBhbnkgbmV3IHJlcXVlc3RzIHVudGlsIHNvbWUgb2YgdGhvc2Ugb3BlbiByZXF1ZXN0c1xuICAgKiBhcmUgbWVyZ2VkIG9yIGNsb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgb3BlblB1bGxSZXF1ZXN0c0xpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGluZGl2aWR1YWwgYXNzaWduZWVzIG9yIHRlYW1zIG9mIGFzc2lnbmVlcyBmb3IgYWxsIHB1bGwgcmVxdWVzdHMgcmFpc2VkXG4gICAqIGZvciBhIHBhY2thZ2UgbWFuYWdlci5cbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIHJlYWRvbmx5IGFzc2lnbmVlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGluZGl2aWR1YWwgcmV2aWV3ZXJzIG9yIHRlYW1zIG9mIHJldmlld2VycyBmb3IgYWxsIHB1bGwgcmVxdWVzdHMgcmFpc2VkXG4gICAqIGZvciBhIHBhY2thZ2UgbWFuYWdlci5cbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIHJlYWRvbmx5IHJldmlld2Vycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L2RlcGVuZGFib3QvZGVwZW5kYWJvdC12ZXJzaW9uLXVwZGF0ZXMvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci10aGUtZGVwZW5kYWJvdC55bWwtZmlsZSNncm91cHNcbiAgICpcbiAgICogWW91IGNhbiBjcmVhdGUgZ3JvdXBzIHRvIHBhY2thZ2UgZGVwZW5kZW5jeSB1cGRhdGVzIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgUFIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICByZWFkb25seSBncm91cHM/OiB7IFtuYW1lOiBzdHJpbmddOiBEZXBlbmRhYm90R3JvdXAgfTtcblxuICAvKipcbiAgICogaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9kZXBlbmRhYm90L2RlcGVuZGFib3QtdmVyc2lvbi11cGRhdGVzL2NvbmZpZ3VyYXRpb24tb3B0aW9ucy1mb3ItdGhlLWRlcGVuZGFib3QueW1sLWZpbGUjdGFyZ2V0LWJyYW5jaFxuICAgKiBZb3UgY2FuIGNvbmZpZ3VyZSB0aGUgdGFyZ2V0IGJyYW5jaCBmb3IgcmFpc2luZyBwdWxsIHJlcXVlc3RzIGZvciB2ZXJzaW9uIHVwZGF0ZXMgYWdhaW5zdFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0QnJhbmNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgY29vbGRvd24gcGVyaW9kIGZvciBkZXBlbmRlbmN5IHZlcnNpb24gdXBkYXRlcy5cbiAgICpcbiAgICogRHVyaW5nIHRoZSBjb29sZG93biwgRGVwZW5kYWJvdCB3aWxsIG5vdCBwcm9wb3NlIHVwZGF0ZXMgZm9yIGEgZGVwZW5kZW5jeS5cbiAgICogVGhpcyBvbmx5IGFwcGxpZXMgdG8gdmVyc2lvbiB1cGRhdGVzLCBub3Qgc2VjdXJpdHkgdXBkYXRlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L2RlcGVuZGFib3QvZGVwZW5kYWJvdC12ZXJzaW9uLXVwZGF0ZXMvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci10aGUtZGVwZW5kYWJvdC55bWwtZmlsZSNjb29sZG93bi1cbiAgICogQGRlZmF1bHQgLSBubyBjb29sZG93blxuICAgKi9cbiAgcmVhZG9ubHkgY29vbGRvd24/OiBEZXBlbmRhYm90Q29vbGRvd247XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIGNvb2xkb3duIHBlcmlvZCBmb3IgZGVwZW5kZW5jeSB2ZXJzaW9uIHVwZGF0ZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L2RlcGVuZGFib3QvZGVwZW5kYWJvdC12ZXJzaW9uLXVwZGF0ZXMvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci10aGUtZGVwZW5kYWJvdC55bWwtZmlsZSNjb29sZG93bi1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBlbmRhYm90Q29vbGRvd24ge1xuICAvKipcbiAgICogRGVmYXVsdCBjb29sZG93biBwZXJpb2QgKGluIGRheXMpIGZvciBhbGwgZGVwZW5kZW5jaWVzIHdpdGhvdXQgc3BlY2lmaWMgc2VtdmVyIHJ1bGVzLlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlZmF1bHQgY29vbGRvd25cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHREYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb29sZG93biBwZXJpb2QgKGluIGRheXMpIGZvciBtYWpvciB2ZXJzaW9uIHVwZGF0ZXMuXG4gICAqIEBkZWZhdWx0IC0gdXNlcyBkZWZhdWx0RGF5c1xuICAgKi9cbiAgcmVhZG9ubHkgc2VtdmVyTWFqb3JEYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb29sZG93biBwZXJpb2QgKGluIGRheXMpIGZvciBtaW5vciB2ZXJzaW9uIHVwZGF0ZXMuXG4gICAqIEBkZWZhdWx0IC0gdXNlcyBkZWZhdWx0RGF5c1xuICAgKi9cbiAgcmVhZG9ubHkgc2VtdmVyTWlub3JEYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb29sZG93biBwZXJpb2QgKGluIGRheXMpIGZvciBwYXRjaCB2ZXJzaW9uIHVwZGF0ZXMuXG4gICAqIEBkZWZhdWx0IC0gdXNlcyBkZWZhdWx0RGF5c1xuICAgKi9cbiAgcmVhZG9ubHkgc2VtdmVyUGF0Y2hEYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGRlcGVuZGVuY2llcyB0byBhcHBseSBjb29sZG93biB0by4gU3VwcG9ydHMgd2lsZGNhcmRzLlxuICAgKiBAZGVmYXVsdCAtIGFsbCBkZXBlbmRlbmNpZXNcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBkZXBlbmRlbmNpZXMgZXhjbHVkZWQgZnJvbSBjb29sZG93bi4gU3VwcG9ydHMgd2lsZGNhcmRzLlxuICAgKiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgYGluY2x1ZGVgLlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4Y2x1c2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBVc2UgdG8gYWRkIHByaXZhdGUgcmVnaXN0cnkgc3VwcG9ydCBmb3IgZGVwZW5kYWJvdFxuICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L3N1cHBseS1jaGFpbi1zZWN1cml0eS9rZWVwaW5nLXlvdXItZGVwZW5kZW5jaWVzLXVwZGF0ZWQtYXV0b21hdGljYWxseS9jb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLWRlcGVuZGVuY3ktdXBkYXRlcyNjb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLXByaXZhdGUtcmVnaXN0cmllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGFib3RSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBSZWdpc3RyeSB0eXBlIGUuZy4gJ25wbS1yZWdpc3RyeScgb3IgJ2RvY2tlci1yZWdpc3RyeSdcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IERlcGVuZGFib3RSZWdpc3RyeVR5cGU7XG5cbiAgLyoqXG4gICAqIFVybCBmb3IgdGhlIHJlZ2lzdHJ5IGUuZy4gJ2h0dHBzOi8vbnBtLnBrZy5naXRodWIuY29tJyBvciAncmVnaXN0cnkuaHViLmRvY2tlci5jb20nXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHVzZXJuYW1lIHRoYXQgRGVwZW5kYWJvdCB1c2VzIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnlcbiAgICogQGRlZmF1bHQgLSBkbyBub3QgYXV0aGVudGljYXRlXG4gICAqL1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgdG8gYSBEZXBlbmRhYm90IHNlY3JldCBjb250YWluaW5nIHRoZSBwYXNzd29yZCBmb3IgdGhlIHNwZWNpZmllZCB1c2VyXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3dvcmQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIGEgRGVwZW5kYWJvdCBzZWNyZXQgY29udGFpbmluZyBhbiBhY2Nlc3Mga2V5IGZvciB0aGlzIHJlZ2lzdHJ5XG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNyZXQgdG9rZW4gZm9yIGRlcGVuZGFib3QgYWNjZXNzIGUuZy4gJyR7eyBzZWNyZXRzLkRFUEVOREFCT1RfUEFDS0FHRV9UT0tFTiB9fSdcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogRm9yIHJlZ2lzdHJpZXMgd2l0aCB0eXBlOiBweXRob24taW5kZXgsIGlmIHRoZSBib29sZWFuIHZhbHVlIGlzIHRydWUsIHBpcFxuICAgKiBlc29sdmVzIGRlcGVuZGVuY2llcyBieSB1c2luZyB0aGUgc3BlY2lmaWVkIFVSTCByYXRoZXIgdGhhbiB0aGUgYmFzZSBVUkwgb2ZcbiAgICogdGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4IChieSBkZWZhdWx0IGh0dHBzOi8vcHlwaS5vcmcvc2ltcGxlKVxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VzQmFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZWQgd2l0aCB0aGUgaGV4LW9yZ2FuaXphdGlvbiByZWdpc3RyeSB0eXBlLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2NvZGUtc2VjdXJpdHkvc3VwcGx5LWNoYWluLXNlY3VyaXR5L2tlZXBpbmcteW91ci1kZXBlbmRlbmNpZXMtdXBkYXRlZC1hdXRvbWF0aWNhbGx5L2NvbmZpZ3VyYXRpb24tb3B0aW9ucy1mb3ItZGVwZW5kZW5jeS11cGRhdGVzI2hleC1vcmdhbml6YXRpb25cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRWFjaCBjb25maWd1cmF0aW9uIHR5cGUgcmVxdWlyZXMgeW91IHRvIHByb3ZpZGUgcGFydGljdWxhciBzZXR0aW5ncy5cbiAqIFNvbWUgdHlwZXMgYWxsb3cgbW9yZSB0aGFuIG9uZSB3YXkgdG8gY29ubmVjdFxuICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L3N1cHBseS1jaGFpbi1zZWN1cml0eS9rZWVwaW5nLXlvdXItZGVwZW5kZW5jaWVzLXVwZGF0ZWQtYXV0b21hdGljYWxseS9jb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLWRlcGVuZGVuY3ktdXBkYXRlcyNjb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLXByaXZhdGUtcmVnaXN0cmllc1xuICovXG5leHBvcnQgZW51bSBEZXBlbmRhYm90UmVnaXN0cnlUeXBlIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb3Nlci1yZXBvc2l0b3J5IHR5cGUgc3VwcG9ydHMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2NvZGUtc2VjdXJpdHkvc3VwcGx5LWNoYWluLXNlY3VyaXR5L2tlZXBpbmcteW91ci1kZXBlbmRlbmNpZXMtdXBkYXRlZC1hdXRvbWF0aWNhbGx5L2NvbmZpZ3VyYXRpb24tb3B0aW9ucy1mb3ItZGVwZW5kZW5jeS11cGRhdGVzI2NvbXBvc2VyLXJlcG9zaXRvcnlcbiAgICovXG4gIENPTVBPU0VSX1JFR0lTVFJZID0gXCJjb21wb3Nlci1yZWdpc3RyeVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgZG9ja2VyLXJlZ2lzdHJ5IHR5cGUgc3VwcG9ydHMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBUaGUgZG9ja2VyLXJlZ2lzdHJ5IHR5cGUgY2FuIGFsc28gYmUgdXNlZCB0byBwdWxsIGZyb20gQW1hem9uIEVDUiB1c2luZyBzdGF0aWMgQVdTIGNyZWRlbnRpYWxzXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9zdXBwbHktY2hhaW4tc2VjdXJpdHkva2VlcGluZy15b3VyLWRlcGVuZGVuY2llcy11cGRhdGVkLWF1dG9tYXRpY2FsbHkvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci1kZXBlbmRlbmN5LXVwZGF0ZXMjZG9ja2VyLXJlZ2lzdHJ5XG4gICAqL1xuICBET0NLRVJfUkVHSVNUUlkgPSBcImRvY2tlci1yZWdpc3RyeVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgZ2l0IHR5cGUgc3VwcG9ydHMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9zdXBwbHktY2hhaW4tc2VjdXJpdHkva2VlcGluZy15b3VyLWRlcGVuZGVuY2llcy11cGRhdGVkLWF1dG9tYXRpY2FsbHkvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci1kZXBlbmRlbmN5LXVwZGF0ZXMjZ2l0XG4gICAqL1xuICBHSVQgPSBcImdpdFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgaGV4LW9yZ2FuaXphdGlvbiB0eXBlIHN1cHBvcnRzIG9yZ2FuaXphdGlvbiBhbmQga2V5XG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9zdXBwbHktY2hhaW4tc2VjdXJpdHkva2VlcGluZy15b3VyLWRlcGVuZGVuY2llcy11cGRhdGVkLWF1dG9tYXRpY2FsbHkvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci1kZXBlbmRlbmN5LXVwZGF0ZXMjaGV4LW9yZ2FuaXphdGlvblxuICAgKi9cbiAgSEVYX09SR0FOSVpBVElPTiA9IFwiaGV4LW9yZ2FuaXphdGlvblwiLFxuXG4gIC8qKlxuICAgKiBUaGUgbWF2ZW4tcmVwb3NpdG9yeSB0eXBlIHN1cHBvcnRzIHVzZXJuYW1lIGFuZCBwYXNzd29yZCwgb3IgdG9rZW5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L3N1cHBseS1jaGFpbi1zZWN1cml0eS9rZWVwaW5nLXlvdXItZGVwZW5kZW5jaWVzLXVwZGF0ZWQtYXV0b21hdGljYWxseS9jb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLWRlcGVuZGVuY3ktdXBkYXRlcyNtYXZlbi1yZXBvc2l0b3J5XG4gICAqL1xuICBNQVZFTl9SRVBPU0lUT1JZID0gXCJtYXZlbi1yZXBvc2l0b3J5XCIsXG5cbiAgLyoqXG4gICAqIFRoZSBucG0tcmVnaXN0cnkgdHlwZSBzdXBwb3J0cyB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIG9yIHRva2VuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9zdXBwbHktY2hhaW4tc2VjdXJpdHkva2VlcGluZy15b3VyLWRlcGVuZGVuY2llcy11cGRhdGVkLWF1dG9tYXRpY2FsbHkvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci1kZXBlbmRlbmN5LXVwZGF0ZXMjbnBtLXJlZ2lzdHJ5XG4gICAqL1xuICBOUE1fUkVHSVNUUlkgPSBcIm5wbS1yZWdpc3RyeVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgbnVnZXQtZmVlZCB0eXBlIHN1cHBvcnRzIHVzZXJuYW1lIGFuZCBwYXNzd29yZCwgb3IgdG9rZW5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L3N1cHBseS1jaGFpbi1zZWN1cml0eS9rZWVwaW5nLXlvdXItZGVwZW5kZW5jaWVzLXVwZGF0ZWQtYXV0b21hdGljYWxseS9jb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLWRlcGVuZGVuY3ktdXBkYXRlcyNudWdldC1mZWVkXG4gICAqL1xuICBOVUdFVF9GRUVEID0gXCJudWdldC1mZWVkXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBweXRob24taW5kZXggdHlwZSBzdXBwb3J0cyB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIG9yIHRva2VuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9zdXBwbHktY2hhaW4tc2VjdXJpdHkva2VlcGluZy15b3VyLWRlcGVuZGVuY2llcy11cGRhdGVkLWF1dG9tYXRpY2FsbHkvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci1kZXBlbmRlbmN5LXVwZGF0ZXMjcHl0aG9uLWluZGV4XG4gICAqL1xuICBQWVRIT05fSU5ERVggPSBcInB5dGhvbi1pbmRleFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcnVieWdlbXMtc2VydmVyIHR5cGUgc3VwcG9ydHMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCBvciB0b2tlblxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2NvZGUtc2VjdXJpdHkvc3VwcGx5LWNoYWluLXNlY3VyaXR5L2tlZXBpbmcteW91ci1kZXBlbmRlbmNpZXMtdXBkYXRlZC1hdXRvbWF0aWNhbGx5L2NvbmZpZ3VyYXRpb24tb3B0aW9ucy1mb3ItZGVwZW5kZW5jeS11cGRhdGVzI3J1YnlnZW1zLXNlcnZlclxuICAgKi9cbiAgUlVCWUdFTVNfU0VSVkVSID0gXCJydWJ5Z2Vtcy1zZXJ2ZXJcIixcblxuICAvKipcbiAgICogVGhlIHRlcnJhZm9ybS1yZWdpc3RyeSB0eXBlIHN1cHBvcnRzIGEgdG9rZW5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L3N1cHBseS1jaGFpbi1zZWN1cml0eS9rZWVwaW5nLXlvdXItZGVwZW5kZW5jaWVzLXVwZGF0ZWQtYXV0b21hdGljYWxseS9jb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLWRlcGVuZGVuY3ktdXBkYXRlcyN0ZXJyYWZvcm0tcmVnaXN0cnlcbiAgICovXG4gIFRFUlJBRk9STV9SRUdJU1RSWSA9IFwidGVycmFmb3JtLXJlZ2lzdHJ5XCIsXG59XG5cbi8qKlxuICogWW91IGNhbiB1c2UgdGhlIGBhbGxvd2Agb3B0aW9uIHRvIGN1c3RvbWl6ZSB3aGljaCBkZXBlbmRlbmNpZXMgYXJlIHVwZGF0ZWQuXG4gKiBUaGUgYWxsb3cgb3B0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBlbmRhYm90QWxsb3cge1xuICAvKipcbiAgICogVXNlIHRvIGFsbG93IHVwZGF0ZXMgZm9yIGRlcGVuZGVuY2llcyB3aXRoIG1hdGNoaW5nIG5hbWVzLCBvcHRpb25hbGx5XG4gICAqIHVzaW5nIGAqYCB0byBtYXRjaCB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycy5cbiAgICpcbiAgICogRm9yIEphdmEgZGVwZW5kZW5jaWVzLCB0aGUgZm9ybWF0IG9mIHRoZSBkZXBlbmRlbmN5LW5hbWUgYXR0cmlidXRlIGlzOlxuICAgKiBgZ3JvdXBJZDphcnRpZmFjdElkYCwgZm9yIGV4YW1wbGU6IGBvcmcua29oc3VrZTpnaXRodWItYXBpYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogWW91IGNhbiB1c2UgdGhlIGBpZ25vcmVgIG9wdGlvbiB0byBjdXN0b21pemUgd2hpY2ggZGVwZW5kZW5jaWVzIGFyZSB1cGRhdGVkLlxuICogVGhlIGlnbm9yZSBvcHRpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGFib3RJZ25vcmUge1xuICAvKipcbiAgICogVXNlIHRvIGlnbm9yZSB1cGRhdGVzIGZvciBkZXBlbmRlbmNpZXMgd2l0aCBtYXRjaGluZyBuYW1lcywgb3B0aW9uYWxseVxuICAgKiB1c2luZyBgKmAgdG8gbWF0Y2ggemVybyBvciBtb3JlIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEZvciBKYXZhIGRlcGVuZGVuY2llcywgdGhlIGZvcm1hdCBvZiB0aGUgZGVwZW5kZW5jeS1uYW1lIGF0dHJpYnV0ZSBpczpcbiAgICogYGdyb3VwSWQ6YXJ0aWZhY3RJZGAsIGZvciBleGFtcGxlOiBgb3JnLmtvaHN1a2U6Z2l0aHViLWFwaWAuXG4gICAqL1xuICByZWFkb25seSBkZXBlbmRlbmN5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgdG8gaWdub3JlIHNwZWNpZmljIHZlcnNpb25zIG9yIHJhbmdlcyBvZiB2ZXJzaW9ucy4gSWYgeW91IHdhbnQgdG9cbiAgICogZGVmaW5lIGEgcmFuZ2UsIHVzZSB0aGUgc3RhbmRhcmQgcGF0dGVybiBmb3IgdGhlIHBhY2thZ2UgbWFuYWdlciAoZm9yXG4gICAqIGV4YW1wbGU6IGBeMS4wLjBgIGZvciBucG0sIG9yIGB+PiAyLjBgIGZvciBCdW5kbGVyKS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIHNpbmdsZSBncm91cCBmb3IgZGVwZW5kZW5jeSB1cGRhdGVzXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2NvZGUtc2VjdXJpdHkvZGVwZW5kYWJvdC93b3JraW5nLXdpdGgtZGVwZW5kYWJvdC9kZXBlbmRhYm90LW9wdGlvbnMtcmVmZXJlbmNlI2dyb3Vwcy0tXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwZW5kYWJvdEdyb3VwIHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hpY2ggdHlwZSBvZiB1cGRhdGUgdGhlIGdyb3VwIGFwcGxpZXMgdG8uXG4gICAqIEBkZWZhdWx0IC0gdmVyc2lvbiB1cGRhdGVzXG4gICAqL1xuICByZWFkb25seSBhcHBsaWVzVG8/OiBEZXBlbmRhYm90R3JvdXBBcHBsaWVzVG87XG5cbiAgLyoqXG4gICAqIExpbWl0IHRoZSBncm91cCB0byBhIHR5cGUgb2YgZGVwZW5kZW5jeS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L2RlcGVuZGFib3Qvd29ya2luZy13aXRoLWRlcGVuZGFib3QvZGVwZW5kYWJvdC1vcHRpb25zLXJlZmVyZW5jZSNkZXBlbmRlbmN5LXR5cGUtZ3JvdXBzXG4gICAqIEBkZWZhdWx0IC0gYWxsIHR5cGVzIG9mIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jeVR5cGU/OiBEZXBlbmRhYm90R3JvdXBEZXBlbmRlbmN5VHlwZTtcblxuICAvKipcbiAgICogRGVmaW5lIGEgbGlzdCBvZiBzdHJpbmdzICh3aXRoIG9yIHdpdGhvdXQgd2lsZGNhcmRzKSB0aGF0IHdpbGwgbWF0Y2hcbiAgICogcGFja2FnZSBuYW1lcyB0byBmb3JtIHRoaXMgZGVwZW5kZW5jeSBncm91cC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdHRlcm5zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3B0aW9uYWxseSB5b3UgY2FuIHVzZSB0aGlzIHRvIGV4Y2x1ZGUgY2VydGFpbiBkZXBlbmRlbmNpZXMgZnJvbSB0aGVcbiAgICogZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlUGF0dGVybnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGltaXQgdGhlIGdyb3VwIHRvIG9uZSBvciBtb3JlIHNlbWFudGljIHZlcnNpb25pbmcgbGV2ZWxzLlxuICAgKlxuICAgKiBJZiBzcGVjaWZpZWQsIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCBhbmQgZWxlbWVudHMgbXVzdCBiZSB1bmlxdWUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vY29kZS1zZWN1cml0eS9kZXBlbmRhYm90L3dvcmtpbmctd2l0aC1kZXBlbmRhYm90L2RlcGVuZGFib3Qtb3B0aW9ucy1yZWZlcmVuY2UjdXBkYXRlLXR5cGVzLWdyb3Vwc1xuICAgKiBAZGVmYXVsdCAtIGFsbCBzZW1hbnRpYyB2ZXJzaW9uaW5nIGxldmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlVHlwZXM/OiBEZXBlbmRhYm90R3JvdXBVcGRhdGVUeXBlW107XG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdXBkYXRlIGEgZ3JvdXAgYXBwbGllcyB0by5cbiAqL1xuZXhwb3J0IGVudW0gRGVwZW5kYWJvdEdyb3VwQXBwbGllc1RvIHtcbiAgLyoqXG4gICAqIEFwcGx5IG9ubHkgdG8gdmVyc2lvbiB1cGRhdGVzLlxuICAgKi9cbiAgVkVSU0lPTl9VUERBVEVTID0gXCJ2ZXJzaW9uLXVwZGF0ZXNcIixcblxuICAvKipcbiAgICogQXBwbHkgb25seSB0byBzZWN1cml0eSB1cGRhdGVzLlxuICAgKi9cbiAgU0VDVVJJVFlfVVBEQVRFUyA9IFwic2VjdXJpdHktdXBkYXRlc1wiLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGRlcGVuZGVuY3kgYSBncm91cCBtYXkgYmUgbGltaXRlZCB0by5cbiAqL1xuZXhwb3J0IGVudW0gRGVwZW5kYWJvdEdyb3VwRGVwZW5kZW5jeVR5cGUge1xuICAvKipcbiAgICogSW5jbHVkZSBvbmx5IGRlcGVuZGVuY2llcyBpbiB0aGUgXCJEZXZlbG9wbWVudCBkZXBlbmRlbmN5IGdyb3VwXCIuXG4gICAqL1xuICBERVZFTE9QTUVOVCA9IFwiZGV2ZWxvcG1lbnRcIixcblxuICAvKipcbiAgICogSW5jbHVkZSBvbmx5IGRlcGVuZGVuY2llcyBpbiB0aGUgXCJQcm9kdWN0aW9uIGRlcGVuZGVuY3kgZ3JvdXBcIi5cbiAgICovXG4gIFBST0RVQ1RJT04gPSBcInByb2R1Y3Rpb25cIixcbn1cblxuLyoqXG4gKiBUaGUgc2VtYW50aWMgdmVyc2lvbmluZyBsZXZlbHMgYSBncm91cCBtYXkgYmUgbGltaXRlZCB0by5cbiAqL1xuZXhwb3J0IGVudW0gRGVwZW5kYWJvdEdyb3VwVXBkYXRlVHlwZSB7XG4gIC8qKlxuICAgKiBJbmNsdWRlIG1ham9yIHJlbGVhc2VzLlxuICAgKi9cbiAgTUFKT1IgPSBcIm1ham9yXCIsXG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgbWlub3IgcmVsZWFzZXMuXG4gICAqL1xuICBNSU5PUiA9IFwibWlub3JcIixcblxuICAvKipcbiAgICogSW5jbHVkZSBwYXRjaCByZWxlYXNlcy5cbiAgICovXG4gIFBBVENIID0gXCJwYXRjaFwiLFxufVxuXG4vKipcbiAqIEhvdyBvZnRlbiB0byBjaGVjayBmb3IgbmV3IHZlcnNpb25zIGFuZCByYWlzZSBwdWxsIHJlcXVlc3RzIGZvciB2ZXJzaW9uXG4gKiB1cGRhdGVzLlxuICovXG5leHBvcnQgZW51bSBEZXBlbmRhYm90U2NoZWR1bGVJbnRlcnZhbCB7XG4gIC8qKlxuICAgKiBSdW5zIG9uIGV2ZXJ5IHdlZWtkYXksIE1vbmRheSB0byBGcmlkYXkuXG4gICAqL1xuICBEQUlMWSA9IFwiZGFpbHlcIixcblxuICAvKipcbiAgICogUnVucyBvbmNlIGVhY2ggd2Vlay4gQnkgZGVmYXVsdCwgdGhpcyBpcyBvbiBNb25kYXkuXG4gICAqL1xuICBXRUVLTFkgPSBcIndlZWtseVwiLFxuXG4gIC8qKlxuICAgKiBSdW5zIG9uY2UgZWFjaCBtb250aC4gVGhpcyBpcyBvbiB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC5cbiAgICovXG4gIE1PTlRITFkgPSBcIm1vbnRobHlcIixcbn1cblxuLyoqXG4gKiBUaGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gZWRpdHMgbWFuaWZlc3QgYW5kIGxvY2sgZmlsZXMuXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnNpb25pbmdTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBPbmx5IGNyZWF0ZSBwdWxsIHJlcXVlc3RzIHRvIHVwZGF0ZSBsb2NrZmlsZXMgdXBkYXRlcy4gSWdub3JlIGFueSBuZXdcbiAgICogdmVyc2lvbnMgdGhhdCB3b3VsZCByZXF1aXJlIHBhY2thZ2UgbWFuaWZlc3QgY2hhbmdlcy5cbiAgICovXG4gIExPQ0tGSUxFX09OTFkgPSBcImxvY2tmaWxlLW9ubHlcIixcblxuICAvKipcbiAgICogLSBGb3IgYXBwcywgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnRzIGFyZSBpbmNyZWFzZWQuXG4gICAqIC0gRm9yIGxpYnJhcmllcywgdGhlIHJhbmdlIG9mIHZlcnNpb25zIGlzIHdpZGVuZWQuXG4gICAqL1xuICBBVVRPID0gXCJhdXRvXCIsXG5cbiAgLyoqXG4gICAqIFJlbGF4IHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHRvIGluY2x1ZGUgYm90aCB0aGUgbmV3IGFuZCBvbGQgdmVyc2lvbiwgd2hlblxuICAgKiBwb3NzaWJsZS5cbiAgICovXG4gIFdJREVOID0gXCJ3aWRlblwiLFxuXG4gIC8qKlxuICAgKiBBbHdheXMgaW5jcmVhc2UgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnQgdG8gbWF0Y2ggdGhlIG5ldyB2ZXJzaW9uLlxuICAgKi9cbiAgSU5DUkVBU0UgPSBcImluY3JlYXNlXCIsXG5cbiAgLyoqXG4gICAqIEluY3JlYXNlIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IG9ubHkgd2hlbiByZXF1aXJlZCBieSB0aGUgbmV3IHZlcnNpb24uXG4gICAqL1xuICBJTkNSRUFTRV9JRl9ORUNFU1NBUlkgPSBcImluY3JlYXNlLWlmLW5lY2Vzc2FyeVwiLFxufVxuXG4vKipcbiAqIERlZmluZXMgZGVwZW5kYWJvdCBjb25maWd1cmF0aW9uIGZvciBub2RlIHByb2plY3RzLlxuICpcbiAqIFNpbmNlIG1vZHVsZSB2ZXJzaW9ucyBhcmUgbWFuYWdlZCBpbiBwcm9qZW4sIHRoZSB2ZXJzaW9uaW5nIHN0cmF0ZWd5IHdpbGwgYmVcbiAqIGNvbmZpZ3VyZWQgdG8gXCJsb2NrZmlsZS1vbmx5XCIgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IHVwZGF0ZXMgdGhhdCBjYW4gYmUgZG9uZVxuICogb24gdGhlIGxvY2tmaWxlIGl0c2VsZiB3aWxsIGJlIHByb3Bvc2VkLlxuICovXG5leHBvcnQgY2xhc3MgRGVwZW5kYWJvdCBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgcmF3IGRlcGVuZGFib3QgY29uZmlndXJhdGlvbi5cbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9naXRodWIvYWRtaW5pc3RlcmluZy1hLXJlcG9zaXRvcnkvY29uZmlndXJhdGlvbi1vcHRpb25zLWZvci1kZXBlbmRlbmN5LXVwZGF0ZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgcHJvamVuIGlzIGFsc28gdXBncmFkZWQgaW4gdGhpcyBjb25maWcsXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWdub3Jlc1Byb2plbjogYm9vbGVhbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93OiBhbnlbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpZ25vcmU6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKGdpdGh1YjogR2l0SHViLCBvcHRpb25zOiBEZXBlbmRhYm90T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoZ2l0aHViLnByb2plY3QpO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGdpdGh1Yi5wcm9qZWN0O1xuXG4gICAgdGhpcy5hbGxvdyA9IFtdO1xuICAgIHRoaXMuaWdub3JlID0gW107XG4gICAgdGhpcy5pZ25vcmVzUHJvamVuID0gb3B0aW9ucy5pZ25vcmVQcm9qZW4gPz8gdHJ1ZTtcblxuICAgIGNvbnN0IHJlZ2lzdHJpZXMgPSBvcHRpb25zLnJlZ2lzdHJpZXNcbiAgICAgID8ga2ViYWJDYXNlS2V5cyhvcHRpb25zLnJlZ2lzdHJpZXMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIGdyb3VwXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLmdyb3VwcyA/PyB7fSkpIHtcbiAgICAgIHZhbGlkYXRlR3JvdXAobmFtZSwgZ3JvdXApO1xuICAgIH1cbiAgICBjb25zdCBncm91cHMgPSBvcHRpb25zLmdyb3VwcyA/IGtlYmFiQ2FzZUtleXMob3B0aW9ucy5ncm91cHMpIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB2ZXJzaW9uOiAyLFxuICAgICAgcmVnaXN0cmllcyxcbiAgICAgIHVwZGF0ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwicGFja2FnZS1lY29zeXN0ZW1cIjogXCJucG1cIixcbiAgICAgICAgICBcInZlcnNpb25pbmctc3RyYXRlZ3lcIjogXCJsb2NrZmlsZS1vbmx5XCIsXG4gICAgICAgICAgZGlyZWN0b3J5OiBcIi9cIixcbiAgICAgICAgICBzY2hlZHVsZToge1xuICAgICAgICAgICAgaW50ZXJ2YWw6XG4gICAgICAgICAgICAgIG9wdGlvbnMuc2NoZWR1bGVJbnRlcnZhbCA/PyBEZXBlbmRhYm90U2NoZWR1bGVJbnRlcnZhbC5EQUlMWSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsbG93OiAoKSA9PiAodGhpcy5hbGxvdy5sZW5ndGggPiAwID8gdGhpcy5hbGxvdyA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgaWdub3JlOiAoKSA9PiAodGhpcy5pZ25vcmUubGVuZ3RoID4gMCA/IHRoaXMuaWdub3JlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICBsYWJlbHM6IG9wdGlvbnMubGFiZWxzID8gb3B0aW9ucy5sYWJlbHMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVnaXN0cmllczogcmVnaXN0cmllcyA/IE9iamVjdC5rZXlzKHJlZ2lzdHJpZXMpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGdyb3VwczogZ3JvdXBzID8gZ3JvdXBzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFzc2lnbmVlczpcbiAgICAgICAgICAgIG9wdGlvbnMuYXNzaWduZWVzICYmIG9wdGlvbnMuYXNzaWduZWVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmFzc2lnbmVlc1xuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXZpZXdlcnM6XG4gICAgICAgICAgICBvcHRpb25zLnJldmlld2VycyAmJiBvcHRpb25zLnJldmlld2Vycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gb3B0aW9ucy5yZXZpZXdlcnNcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgXCJvcGVuLXB1bGwtcmVxdWVzdHMtbGltaXRcIjpcbiAgICAgICAgICAgIG9wdGlvbnMub3BlblB1bGxSZXF1ZXN0c0xpbWl0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBvcHRpb25zLm9wZW5QdWxsUmVxdWVzdHNMaW1pdFxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBcInRhcmdldC1icmFuY2hcIjogb3B0aW9ucy50YXJnZXRCcmFuY2gsXG4gICAgICAgICAgY29vbGRvd246IG9wdGlvbnMuY29vbGRvd25cbiAgICAgICAgICAgID8ga2ViYWJDYXNlS2V5cyhvcHRpb25zLmNvb2xkb3duKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBuZXcgWWFtbEZpbGUocHJvamVjdCwgXCIuZ2l0aHViL2RlcGVuZGFib3QueW1sXCIsIHtcbiAgICAgIG9iajogdGhpcy5jb25maWcsXG4gICAgICBjb21taXR0ZWQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2Ygb3B0aW9ucy5hbGxvdyA/PyBbXSkge1xuICAgICAgdGhpcy5hZGRBbGxvdyhpLmRlcGVuZGVuY3lOYW1lKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGkgb2Ygb3B0aW9ucy5pZ25vcmUgPz8gW10pIHtcbiAgICAgIHRoaXMuYWRkSWdub3JlKGkuZGVwZW5kZW5jeU5hbWUsIC4uLihpLnZlcnNpb25zID8/IFtdKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaWdub3Jlc1Byb2plbikge1xuICAgICAgdGhpcy5hZGRJZ25vcmUoXCJwcm9qZW5cIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBhIGRlcGVuZGVuY3kgZnJvbSBhdXRvbWF0aWMgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3lOYW1lIFVzZSB0byBhbGxvdyB1cGRhdGVzIGZvciBkZXBlbmRlbmNpZXMgd2l0aCBtYXRjaGluZ1xuICAgKiBuYW1lcywgb3B0aW9uYWxseSB1c2luZyBgKmAgdG8gbWF0Y2ggemVybyBvciBtb3JlIGNoYXJhY3RlcnMuXG4gICAqL1xuICBwdWJsaWMgYWRkQWxsb3coZGVwZW5kZW5jeU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuYWxsb3cucHVzaCh7XG4gICAgICBcImRlcGVuZGVuY3ktbmFtZVwiOiBkZXBlbmRlbmN5TmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZ25vcmVzIGEgZGVwZW5kZW5jeSBmcm9tIGF1dG9tYXRpYyB1cGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeU5hbWUgVXNlIHRvIGlnbm9yZSB1cGRhdGVzIGZvciBkZXBlbmRlbmNpZXMgd2l0aCBtYXRjaGluZ1xuICAgKiBuYW1lcywgb3B0aW9uYWxseSB1c2luZyBgKmAgdG8gbWF0Y2ggemVybyBvciBtb3JlIGNoYXJhY3RlcnMuXG4gICAqIEBwYXJhbSB2ZXJzaW9ucyBVc2UgdG8gaWdub3JlIHNwZWNpZmljIHZlcnNpb25zIG9yIHJhbmdlcyBvZiB2ZXJzaW9ucy4gSWZcbiAgICogeW91IHdhbnQgdG8gZGVmaW5lIGEgcmFuZ2UsIHVzZSB0aGUgc3RhbmRhcmQgcGF0dGVybiBmb3IgdGhlIHBhY2thZ2VcbiAgICogbWFuYWdlciAoZm9yIGV4YW1wbGU6IGBeMS4wLjBgIGZvciBucG0sIG9yIGB+PiAyLjBgIGZvciBCdW5kbGVyKS5cbiAgICovXG4gIHB1YmxpYyBhZGRJZ25vcmUoZGVwZW5kZW5jeU5hbWU6IHN0cmluZywgLi4udmVyc2lvbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5pZ25vcmUucHVzaCh7XG4gICAgICBcImRlcGVuZGVuY3ktbmFtZVwiOiBkZXBlbmRlbmN5TmFtZSxcbiAgICAgIHZlcnNpb25zOiAoKSA9PiAodmVyc2lvbnMubGVuZ3RoID4gMCA/IHZlcnNpb25zIDogdW5kZWZpbmVkKSxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdyb3VwKG5hbWU6IHN0cmluZywgZ3JvdXA6IERlcGVuZGFib3RHcm91cCkge1xuICAvLyB1cGRhdGUgdHlwZXNcbiAgaWYgKGdyb3VwLnVwZGF0ZVR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZ3JvdXAudXBkYXRlVHlwZXMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGVwZW5kYWJvdCBncm91cCBcIiR7bmFtZX1cIiBtdXN0IG5vdCBoYXZlIGFuIGVtcHR5IGFycmF5IG9mIHVwZGF0ZSB0eXBlcy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5ldyBTZXQoZ3JvdXAudXBkYXRlVHlwZXMpLnNpemUgIT09IGdyb3VwLnVwZGF0ZVR5cGVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGVwZW5kYWJvdCBncm91cCBcIiR7bmFtZX1cIiBtdXN0IG5vdCBoYXZlIGR1cGxpY2F0ZSB1cGRhdGUgdHlwZXMuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=