UNPKG

projen

Version:

CDK for software projects

153 lines • 15.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.CdktnConfig = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = __importStar(require("node:fs")); const path = __importStar(require("node:path")); const component_1 = require("../component"); const json_1 = require("../json"); /** * Represents cdktf.json file. * * CDKTN (CDK Terrain) continues to use the `cdktf.json` filename for * backwards compatibility with its CDKTF origins. */ class CdktnConfig extends component_1.Component { static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.cdktn.CdktnConfig", version: "0.103.12" }; /** * Represents the JSON file. */ file; /** * Name of the cdktn.out directory. */ cdktnOut; /** * List of Terraform providers to build. */ _terraformProviders; /** * List of Terraform modules to build. */ _terraformModules; constructor(scope, options) { super(scope); this.cdktnOut = options.cdktnOut ?? "cdktf.out"; this._terraformProviders = options.terraformProviders ?? []; this._terraformModules = options.terraformModules ?? []; this.file = new json_1.JsonFile(this.project, "cdktf.json", { omitEmpty: true, // `cdktn get` and `cdktn provider add` write generated provider/module // entries back into this file, so it can't be read-only. readonly: false, obj: { language: options.language ?? "typescript", app: options.app, output: this.cdktnOut, terraformProviders: () => this.resolveTerraformProviders(), terraformModules: () => this.resolveTerraformModules(), context: options.context, projectId: options.projectId, sendCrashReports: options.sendCrashReports, }, }); this.project.gitignore.exclude(`/${this.cdktnOut}/`); this.project.gitignore.exclude(".gen/"); } /** * Add Terraform providers to `cdktf.json`. * @param providers The providers to add. */ addTerraformProviders(...providers) { this._terraformProviders.push(...providers); } /** * Add Terraform modules to `cdktf.json`. * @param modules The modules to add. */ addTerraformModules(...modules) { this._terraformModules.push(...modules); } /** * Reads the existing `cdktf.json` from disk and merges projen-managed * providers with any that were added externally (e.g. via `cdktn provider add`). */ resolveTerraformProviders() { const existing = this.readExistingConfig(); return this.mergeEntries(existing?.terraformProviders, this._terraformProviders); } /** * Reads the existing `cdktf.json` from disk and merges projen-managed * modules with any that were added externally (e.g. via `cdktn get`). */ resolveTerraformModules() { const existing = this.readExistingConfig(); return this.mergeEntries(existing?.terraformModules, this._terraformModules); } /** * Merge entries from the existing file with projen-managed entries, * deduplicating by value. */ mergeEntries(existing, managed) { if (!existing || existing.length === 0) { return managed; } const merged = [...managed]; for (const entry of existing) { if (!merged.includes(entry)) { merged.push(entry); } } return merged; } /** * Read the existing cdktf.json file from disk (if it exists). */ readExistingConfig() { const filePath = path.join(this.project.outdir, "cdktf.json"); if (!fs.existsSync(filePath)) { return undefined; } try { return JSON.parse(fs.readFileSync(filePath, "utf-8")); } catch { return undefined; } } } exports.CdktnConfig = CdktnConfig; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrdG4tY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nka3RuL2Nka3RuLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQThCO0FBQzlCLGdEQUFrQztBQUVsQyw0Q0FBeUM7QUFDekMsa0NBQW1DO0FBbUVuQzs7Ozs7R0FLRztBQUNILE1BQWEsV0FBWSxTQUFRLHFCQUFTOztJQUN4Qzs7T0FFRztJQUNhLElBQUksQ0FBVztJQUUvQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7T0FFRztJQUNjLG1CQUFtQixDQUFXO0lBRS9DOztPQUVHO0lBQ2MsaUJBQWlCLENBQVc7SUFFN0MsWUFBWSxLQUFpQixFQUFFLE9BQTJCO1FBQ3hELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFFeEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLGVBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtZQUNuRCxTQUFTLEVBQUUsSUFBSTtZQUNmLHVFQUF1RTtZQUN2RSx5REFBeUQ7WUFDekQsUUFBUSxFQUFFLEtBQUs7WUFDZixHQUFHLEVBQUU7Z0JBQ0gsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksWUFBWTtnQkFDMUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3JCLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFDMUQsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO2dCQUN0RCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjthQUMzQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0kscUJBQXFCLENBQUMsR0FBRyxTQUFtQjtRQUNqRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG1CQUFtQixDQUFDLEdBQUcsT0FBaUI7UUFDN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSyx5QkFBeUI7UUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUN0QixRQUFRLEVBQUUsa0JBQWtCLEVBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUI7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUN0QixRQUFRLEVBQUUsZ0JBQWdCLEVBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQ2xCLFFBQThCLEVBQzlCLE9BQWlCO1FBRWpCLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQzs7QUExSEgsa0NBMkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IEpzb25GaWxlIH0gZnJvbSBcIi4uL2pzb25cIjtcblxuLyoqXG4gKiBDb21tb24gb3B0aW9ucyBmb3IgYGNka3RmLmpzb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka3RuQ29uZmlnQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUZXJyYWZvcm0gcHJvdmlkZXJzIHRvIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgdGVycmFmb3JtUHJvdmlkZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRlcnJhZm9ybSBtb2R1bGVzIHRvIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgdGVycmFmb3JtTW9kdWxlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGNvbnRleHQgdG8gaW5jbHVkZSBpbiBgY2RrdGYuanNvbmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBjb250ZXh0XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogQ0RLVE4gb3V0cHV0IGRpcmVjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjZGt0Zi5vdXRcIlxuICAgKi9cbiAgcmVhZG9ubHkgY2RrdG5PdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENESyBwcm9qZWN0IGlkZW50aWZpZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHJlcG9ydCBjcmFzaGluZyB0byBhIHJlbW90ZSBzZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VuZENyYXNoUmVwb3J0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYENka3RuQ29uZmlnYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGt0bkNvbmZpZ09wdGlvbnMgZXh0ZW5kcyBDZGt0bkNvbmZpZ0NvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGluIG9yZGVyIHRvIHN5bnRoZXNpemUgdGhlIENES1ROIGFwcGxpY2F0aW9uXG4gICAqIChsYW5ndWFnZSBzcGVjaWZpYykuXG4gICAqL1xuICByZWFkb25seSBhcHA6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIENES1ROIGFwcC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ0eXBlc2NyaXB0XCJcbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2RrdGYuanNvbiBmaWxlLlxuICpcbiAqIENES1ROIChDREsgVGVycmFpbikgY29udGludWVzIHRvIHVzZSB0aGUgYGNka3RmLmpzb25gIGZpbGVuYW1lIGZvclxuICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBpdHMgQ0RLVEYgb3JpZ2lucy5cbiAqL1xuZXhwb3J0IGNsYXNzIENka3RuQ29uZmlnIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIEpTT04gZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmaWxlOiBKc29uRmlsZTtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgY2RrdG4ub3V0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGt0bk91dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIFRlcnJhZm9ybSBwcm92aWRlcnMgdG8gYnVpbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90ZXJyYWZvcm1Qcm92aWRlcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIFRlcnJhZm9ybSBtb2R1bGVzIHRvIGJ1aWxkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdGVycmFmb3JtTW9kdWxlczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IElDb25zdHJ1Y3QsIG9wdGlvbnM6IENka3RuQ29uZmlnT3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlKTtcblxuICAgIHRoaXMuY2RrdG5PdXQgPSBvcHRpb25zLmNka3RuT3V0ID8/IFwiY2RrdGYub3V0XCI7XG4gICAgdGhpcy5fdGVycmFmb3JtUHJvdmlkZXJzID0gb3B0aW9ucy50ZXJyYWZvcm1Qcm92aWRlcnMgPz8gW107XG4gICAgdGhpcy5fdGVycmFmb3JtTW9kdWxlcyA9IG9wdGlvbnMudGVycmFmb3JtTW9kdWxlcyA/PyBbXTtcblxuICAgIHRoaXMuZmlsZSA9IG5ldyBKc29uRmlsZSh0aGlzLnByb2plY3QsIFwiY2RrdGYuanNvblwiLCB7XG4gICAgICBvbWl0RW1wdHk6IHRydWUsXG4gICAgICAvLyBgY2RrdG4gZ2V0YCBhbmQgYGNka3RuIHByb3ZpZGVyIGFkZGAgd3JpdGUgZ2VuZXJhdGVkIHByb3ZpZGVyL21vZHVsZVxuICAgICAgLy8gZW50cmllcyBiYWNrIGludG8gdGhpcyBmaWxlLCBzbyBpdCBjYW4ndCBiZSByZWFkLW9ubHkuXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICBvYmo6IHtcbiAgICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UgPz8gXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIGFwcDogb3B0aW9ucy5hcHAsXG4gICAgICAgIG91dHB1dDogdGhpcy5jZGt0bk91dCxcbiAgICAgICAgdGVycmFmb3JtUHJvdmlkZXJzOiAoKSA9PiB0aGlzLnJlc29sdmVUZXJyYWZvcm1Qcm92aWRlcnMoKSxcbiAgICAgICAgdGVycmFmb3JtTW9kdWxlczogKCkgPT4gdGhpcy5yZXNvbHZlVGVycmFmb3JtTW9kdWxlcygpLFxuICAgICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgICAgIHByb2plY3RJZDogb3B0aW9ucy5wcm9qZWN0SWQsXG4gICAgICAgIHNlbmRDcmFzaFJlcG9ydHM6IG9wdGlvbnMuc2VuZENyYXNoUmVwb3J0cyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2plY3QuZ2l0aWdub3JlLmV4Y2x1ZGUoYC8ke3RoaXMuY2RrdG5PdXR9L2ApO1xuICAgIHRoaXMucHJvamVjdC5naXRpZ25vcmUuZXhjbHVkZShcIi5nZW4vXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBUZXJyYWZvcm0gcHJvdmlkZXJzIHRvIGBjZGt0Zi5qc29uYC5cbiAgICogQHBhcmFtIHByb3ZpZGVycyBUaGUgcHJvdmlkZXJzIHRvIGFkZC5cbiAgICovXG4gIHB1YmxpYyBhZGRUZXJyYWZvcm1Qcm92aWRlcnMoLi4ucHJvdmlkZXJzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3RlcnJhZm9ybVByb3ZpZGVycy5wdXNoKC4uLnByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFRlcnJhZm9ybSBtb2R1bGVzIHRvIGBjZGt0Zi5qc29uYC5cbiAgICogQHBhcmFtIG1vZHVsZXMgVGhlIG1vZHVsZXMgdG8gYWRkLlxuICAgKi9cbiAgcHVibGljIGFkZFRlcnJhZm9ybU1vZHVsZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl90ZXJyYWZvcm1Nb2R1bGVzLnB1c2goLi4ubW9kdWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGV4aXN0aW5nIGBjZGt0Zi5qc29uYCBmcm9tIGRpc2sgYW5kIG1lcmdlcyBwcm9qZW4tbWFuYWdlZFxuICAgKiBwcm92aWRlcnMgd2l0aCBhbnkgdGhhdCB3ZXJlIGFkZGVkIGV4dGVybmFsbHkgKGUuZy4gdmlhIGBjZGt0biBwcm92aWRlciBhZGRgKS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVRlcnJhZm9ybVByb3ZpZGVycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnJlYWRFeGlzdGluZ0NvbmZpZygpO1xuICAgIHJldHVybiB0aGlzLm1lcmdlRW50cmllcyhcbiAgICAgIGV4aXN0aW5nPy50ZXJyYWZvcm1Qcm92aWRlcnMsXG4gICAgICB0aGlzLl90ZXJyYWZvcm1Qcm92aWRlcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgZXhpc3RpbmcgYGNka3RmLmpzb25gIGZyb20gZGlzayBhbmQgbWVyZ2VzIHByb2plbi1tYW5hZ2VkXG4gICAqIG1vZHVsZXMgd2l0aCBhbnkgdGhhdCB3ZXJlIGFkZGVkIGV4dGVybmFsbHkgKGUuZy4gdmlhIGBjZGt0biBnZXRgKS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVRlcnJhZm9ybU1vZHVsZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5yZWFkRXhpc3RpbmdDb25maWcoKTtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUVudHJpZXMoXG4gICAgICBleGlzdGluZz8udGVycmFmb3JtTW9kdWxlcyxcbiAgICAgIHRoaXMuX3RlcnJhZm9ybU1vZHVsZXMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBlbnRyaWVzIGZyb20gdGhlIGV4aXN0aW5nIGZpbGUgd2l0aCBwcm9qZW4tbWFuYWdlZCBlbnRyaWVzLFxuICAgKiBkZWR1cGxpY2F0aW5nIGJ5IHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZUVudHJpZXMoXG4gICAgZXhpc3Rpbmc6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgIG1hbmFnZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmdbXSB7XG4gICAgaWYgKCFleGlzdGluZyB8fCBleGlzdGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBtYW5hZ2VkO1xuICAgIH1cbiAgICBjb25zdCBtZXJnZWQgPSBbLi4ubWFuYWdlZF07XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgICAgaWYgKCFtZXJnZWQuaW5jbHVkZXMoZW50cnkpKSB7XG4gICAgICAgIG1lcmdlZC5wdXNoKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBleGlzdGluZyBjZGt0Zi5qc29uIGZpbGUgZnJvbSBkaXNrIChpZiBpdCBleGlzdHMpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkRXhpc3RpbmdDb25maWcoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBcImNka3RmLmpzb25cIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19