UNPKG

@aws/pdk

Version:

All documentation is located at: https://aws.github.io/aws-pdk

195 lines 29.4 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.CdkGraph = exports.CdkGraphContext = exports.CdkGraphArtifacts = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const path = require("path"); const monorepo_1 = require("../monorepo"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const chalk = require("chalk"); // eslint-disable-line @typescript-eslint/no-require-imports const constructs_1 = require("constructs"); const fs = require("fs-extra"); const cdk_internals_1 = require("./cdk-internals"); const config_1 = require("./config"); const core_1 = require("./core"); const GRAPH_ARTIFACT_ID = "GRAPH"; /** CdkGraph core artifacts */ var CdkGraphArtifacts; (function (CdkGraphArtifacts) { CdkGraphArtifacts["GRAPH_METADATA"] = "graph-metadata.json"; CdkGraphArtifacts["GRAPH"] = "graph.json"; })(CdkGraphArtifacts || (exports.CdkGraphArtifacts = CdkGraphArtifacts = {})); /** CdkGraph context */ class CdkGraphContext { constructor(store, outdir) { this.store = store; this.outdir = outdir; /** @internal */ this._artifacts = {}; } /** * Get CdkGraph artifact by id * @throws Error is artifact does not exist */ getArtifact(id) { const artifact = this._artifacts[id]; if (artifact) { return artifact; } throw new Error(`Graph artifact ${id} does not exist`); } /** Get CdkGraph core `graph.json` artifact */ get graphJson() { return this.getArtifact(GRAPH_ARTIFACT_ID); } /** Indicates if context has an artifact with *filename* defined */ hasArtifactFile(filename) { return !!Object.values(this._artifacts).find((artifact) => artifact.filename === filename); } /** Get record of all graph artifacts keyed by artifact id */ get artifacts() { return this._artifacts; } /** * Logs an artifact entry. In general this should not be called directly, as `writeArtifact` should be utilized * to perform writing and logging artifacts. However some plugins utilize other tools that generate the artifacts, * in which case the plugin would call this method to log the entry. * @param source The source of the artifact, such as the name of plugin * @param id Unique id of the artifact * @param filepath Full path where the artifact is stored * @param description Description of the artifact * @returns * @throws Error is artifact id or filename already exists */ logArtifact(source, id, filepath, description) { if (id in this._artifacts) { throw new Error(`Graph artifact ${id} already defined`); } if (this.hasArtifactFile(filepath)) { throw new Error(`Graph artifact "${filepath}" already defined`); } const filename = path.relative(this.outdir, filepath); if (!(source instanceof CdkGraph)) { if (Object.keys(CdkGraphArtifacts).includes(id)) { throw new Error(`Graph artifact id ${id} is reserved`); } if (Object.values(CdkGraphArtifacts).includes(filename)) { throw new Error(`Graph artifact file ${filename} is reserved`); } } const artifact = { id, filepath, description, filename, source: source instanceof CdkGraph ? `${CdkGraph.ID}` : `plugin:${source.id}@${source.version}`, }; this._artifacts[id] = artifact; console.info(chalk.cyanBright(`[CdkGraph] Artifact ${id} written to \x1B]8;;file://${artifact.filepath}\x1B\\${artifact.filename}\x1B]8;;\x1B\\ (${artifact.source})`)); return artifact; } /** * Writes artifact data to outdir and logs the entry. * @param source The source of the artifact, such as the name of plugin * @param id Unique id of the artifact * @param filename Relative name of the file * @param description Description of the artifact * @returns */ writeArtifact(source, id, filename, data, description) { const filepath = path.join(this.outdir, filename); const artifact = this.logArtifact(source, id, filepath, description); fs.ensureDirSync(path.dirname(filepath)); fs.writeFileSync(filepath, data, { encoding: "utf-8" }); return artifact; } } exports.CdkGraphContext = CdkGraphContext; _a = JSII_RTTI_SYMBOL_1; CdkGraphContext[_a] = { fqn: "@aws/pdk.cdk_graph.CdkGraphContext", version: "0.26.14" }; /** * CdkGraph construct is the cdk-graph framework controller that is responsible for * computing the graph, storing serialized graph, and instrumenting plugins per the * plugin contract. */ class CdkGraph extends constructs_1.Construct { /** * Get the context for the graph instance. * * This will be `undefined` before construct synthesis has initiated. */ get graphContext() { return this._context; } constructor(root, props = {}) { super(root, CdkGraph.ID); this.root = root; (0, monorepo_1.addMetric)(root, "cdk-graph"); this.config = (0, config_1.resolveConfig)(); this.plugins = props.plugins || []; // TODO: verify plugin deps via semver // bind all plugins to this instance of the graph this.plugins.forEach((plugin) => { (0, monorepo_1.addMetric)(root, `cdk-graph-plugin-${plugin.id}`); plugin.bind(this); }); // Apply Aspect for each plugin that supports "inspect" phase this.plugins.forEach((plugin) => { if (plugin.inspect) { aws_cdk_lib_1.Aspects.of(this.root).add({ visit: plugin.inspect, }); } }); (0, cdk_internals_1.addCustomSynthesis)(this, { onSynthesize: (session) => { this._synthesize(session); }, }); } /** @internal */ _synthesize(session) { const store = (0, core_1.computeGraph)(this.root); const outdir = (0, config_1.resolveOutdir)(session.outdir, this.config.outdir); const context = new CdkGraphContext(store, outdir); context.writeArtifact(this, GRAPH_ARTIFACT_ID, CdkGraphArtifacts.GRAPH, JSON.stringify(context.store.serialize(), null, 2), "Serialized graph"); this.plugins.forEach((plugin) => { plugin.synthesize && plugin.synthesize(context); }); fs.writeFileSync(path.join(outdir, CdkGraphArtifacts.GRAPH_METADATA), JSON.stringify({ version: CdkGraph.VERSION, artifacts: context.artifacts, }, null, 2), { encoding: "utf-8" }); // store context for reporting this._context = context; } /** * Asynchronous report generation. This operation enables running expensive and non-synchronous * report generation by plugins post synthesis. * * If a given plugin requires performing asynchronous operations or is general expensive, it should * utilize `report` rather than `synthesize`. */ async report() { if (this._context == null) { // TODO: support deserializing pdk-graph to generate store/context console.warn(chalk.yellowBright("[CdkGraph] In the near future, reports will be runnable outside of cdk synth")); throw new Error("CdkGraph report called outside of cdk synth process"); } for (const plugin of this.plugins) { plugin.report && (await plugin.report(this._context)); } } } exports.CdkGraph = CdkGraph; _b = JSII_RTTI_SYMBOL_1; CdkGraph[_b] = { fqn: "@aws/pdk.cdk_graph.CdkGraph", version: "0.26.14" }; /** Fixed CdkGraph construct id */ CdkGraph.ID = core_1.GRAPH_ID; /** Current CdkGraph semantic version */ CdkGraph.VERSION = "0.0.0"; // TODO: make dynamic from package //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWdyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7c0NBQ3NDO0FBQ3RDLDZCQUE2QjtBQUM3Qiw0Q0FBMEM7QUFDMUMsNkNBQXlEO0FBQ3pELCtCQUFnQyxDQUFDLDREQUE0RDtBQUM3RiwyQ0FBbUQ7QUFDbkQsK0JBQStCO0FBQy9CLG1EQUFxRDtBQUNyRCxxQ0FBd0U7QUFDeEUsaUNBQWdFO0FBRWhFLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO0FBRWxDLDhCQUE4QjtBQUM5QixJQUFZLGlCQUdYO0FBSEQsV0FBWSxpQkFBaUI7SUFDM0IsMkRBQXNDLENBQUE7SUFDdEMseUNBQW9CLENBQUE7QUFDdEIsQ0FBQyxFQUhXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBRzVCO0FBc0JELHVCQUF1QjtBQUN2QixNQUFhLGVBQWU7SUFJMUIsWUFDa0IsS0FBa0IsRUFDbEIsTUFBYztRQURkLFVBQUssR0FBTCxLQUFLLENBQWE7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUxoQyxnQkFBZ0I7UUFDUCxlQUFVLEdBQXlCLEVBQUUsQ0FBQztJQUs1QyxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEVBQVU7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsZUFBZSxDQUFDLFFBQWdCO1FBQzlC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QVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxNQUFNO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMxQixrRUFBa0U7WUFDbEUsT0FBTyxDQUFDLElBQUksQ0FDVixLQUFLLENBQUMsWUFBWSxDQUNoQiw4RUFBOEUsQ0FDL0UsQ0FDRixDQUFDO1lBQ0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDOztBQS9HSCw0QkFnSEM7OztBQS9HQyxrQ0FBa0M7QUFDbEIsV0FBRSxHQUFHLGVBQVEsQ0FBQztBQUM5Qix3Q0FBd0M7QUFDeEIsZ0JBQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxrQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQ29weXJpZ2h0IFtBbWF6b24uY29tXShodHRwOi8vYW1hem9uLmNvbS8pLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGFkZE1ldHJpYyB9IGZyb20gXCJAYXdzL21vbm9yZXBvXCI7XG5pbXBvcnQgeyBBc3BlY3RzLCBJU3ludGhlc2lzU2Vzc2lvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IGNoYWxrID0gcmVxdWlyZShcImNoYWxrXCIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCB7IGFkZEN1c3RvbVN5bnRoZXNpcyB9IGZyb20gXCIuL2Nkay1pbnRlcm5hbHNcIjtcbmltcG9ydCB7IENka0dyYXBoQ29uZmlnLCByZXNvbHZlQ29uZmlnLCByZXNvbHZlT3V0ZGlyIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBjb21wdXRlR3JhcGgsIEdyYXBoLCBWZXJzaW9uLCBHUkFQSF9JRCB9IGZyb20gXCIuL2NvcmVcIjtcblxuY29uc3QgR1JBUEhfQVJUSUZBQ1RfSUQgPSBcIkdSQVBIXCI7XG5cbi8qKiBDZGtHcmFwaCBjb3JlIGFydGlmYWN0cyAqL1xuZXhwb3J0IGVudW0gQ2RrR3JhcGhBcnRpZmFjdHMge1xuICBHUkFQSF9NRVRBREFUQSA9IFwiZ3JhcGgtbWV0YWRhdGEuanNvblwiLFxuICBHUkFQSCA9IFwiZ3JhcGguanNvblwiLFxufVxuXG4vKipcbiAqIENka0dyYXBoIGFydGlmYWN0IGRlZmluaXRpb25cbiAqIEBzdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtHcmFwaEFydGlmYWN0IHtcbiAgLyoqIFRoZSB1bmlxdWUgdHlwZSBvZiB0aGUgYXJ0aWZhY3QgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIEZpbGVuYW1lIG9mIHRoZSBhcnRpZmFjdCAqL1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xuICAvKiogRnVsbCBwYXRoIHdoZXJlIGFydGlmYWN0IGlzIHN0b3JlZCAqL1xuICByZWFkb25seSBmaWxlcGF0aDogc3RyaW5nO1xuICAvKiogRGVzY3JpcHRpb24gb2YgYXJ0aWZhY3QgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc291cmNlIG9mIHRoZSBhcnRpZmFjdCAoc3VjaCBhcyBwbHVnaW4sIG9yIGNvcmUgc3lzdGVtLCBldGMpICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG4vKiogRGljdGlvbmFyeSBvZiBncmFwaCBhcnRpZmFjdHMgYnkgaWQgKi9cbmV4cG9ydCB0eXBlIENka0dyYXBoQXJ0aWZhY3REaWN0ID0geyBbaWQ6IHN0cmluZ106IENka0dyYXBoQXJ0aWZhY3QgfTtcblxuLyoqIENka0dyYXBoIGNvbnRleHQgKi9cbmV4cG9ydCBjbGFzcyBDZGtHcmFwaENvbnRleHQge1xuICAvKiogQGludGVybmFsICovXG4gIHJlYWRvbmx5IF9hcnRpZmFjdHM6IENka0dyYXBoQXJ0aWZhY3REaWN0ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHN0b3JlOiBHcmFwaC5TdG9yZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0ZGlyOiBzdHJpbmdcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgQ2RrR3JhcGggYXJ0aWZhY3QgYnkgaWRcbiAgICogQHRocm93cyBFcnJvciBpcyBhcnRpZmFjdCBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgZ2V0QXJ0aWZhY3QoaWQ6IHN0cmluZyk6IENka0dyYXBoQXJ0aWZhY3Qge1xuICAgIGNvbnN0IGFydGlmYWN0ID0gdGhpcy5fYXJ0aWZhY3RzW2lkXTtcbiAgICBpZiAoYXJ0aWZhY3QpIHtcbiAgICAgIHJldHVybiBhcnRpZmFjdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBHcmFwaCBhcnRpZmFjdCAke2lkfSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG5cbiAgLyoqIEdldCBDZGtHcmFwaCBjb3JlIGBncmFwaC5qc29uYCBhcnRpZmFjdCAqL1xuICBnZXQgZ3JhcGhKc29uKCk6IENka0dyYXBoQXJ0aWZhY3Qge1xuICAgIHJldHVybiB0aGlzLmdldEFydGlmYWN0KEdSQVBIX0FSVElGQUNUX0lEKTtcbiAgfVxuXG4gIC8qKiBJbmRpY2F0ZXMgaWYgY29udGV4dCBoYXMgYW4gYXJ0aWZhY3Qgd2l0aCAqZmlsZW5hbWUqIGRlZmluZWQgKi9cbiAgaGFzQXJ0aWZhY3RGaWxlKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFPYmplY3QudmFsdWVzKHRoaXMuX2FydGlmYWN0cykuZmluZChcbiAgICAgIChhcnRpZmFjdCkgPT4gYXJ0aWZhY3QuZmlsZW5hbWUgPT09IGZpbGVuYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBHZXQgcmVjb3JkIG9mIGFsbCBncmFwaCBhcnRpZmFjdHMga2V5ZWQgYnkgYXJ0aWZhY3QgaWQgKi9cbiAgZ2V0IGFydGlmYWN0cygpOiBDZGtHcmFwaEFydGlmYWN0RGljdCB7XG4gICAgcmV0dXJuIHRoaXMuX2FydGlmYWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGFuIGFydGlmYWN0IGVudHJ5LiBJbiBnZW5lcmFsIHRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHksIGFzIGB3cml0ZUFydGlmYWN0YCBzaG91bGQgYmUgdXRpbGl6ZWRcbiAgICogdG8gcGVyZm9ybSB3cml0aW5nIGFuZCBsb2dnaW5nIGFydGlmYWN0cy4gSG93ZXZlciBzb21lIHBsdWdpbnMgdXRpbGl6ZSBvdGhlciB0b29scyB0aGF0IGdlbmVyYXRlIHRoZSBhcnRpZmFjdHMsXG4gICAqIGluIHdoaWNoIGNhc2UgdGhlIHBsdWdpbiB3b3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIGxvZyB0aGUgZW50cnkuXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgYXJ0aWZhY3QsIHN1Y2ggYXMgdGhlIG5hbWUgb2YgcGx1Z2luXG4gICAqIEBwYXJhbSBpZCBVbmlxdWUgaWQgb2YgdGhlIGFydGlmYWN0XG4gICAqIEBwYXJhbSBmaWxlcGF0aCBGdWxsIHBhdGggd2hlcmUgdGhlIGFydGlmYWN0IGlzIHN0b3JlZFxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGFydGlmYWN0XG4gICAqIEByZXR1cm5zXG4gICAqIEB0aHJvd3MgRXJyb3IgaXMgYXJ0aWZhY3QgaWQgb3IgZmlsZW5hbWUgYWxyZWFkeSBleGlzdHNcbiAgICovXG4gIGxvZ0FydGlmYWN0KFxuICAgIHNvdXJjZTogQ2RrR3JhcGggfCBJQ2RrR3JhcGhQbHVnaW4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBmaWxlcGF0aDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IENka0dyYXBoQXJ0aWZhY3Qge1xuICAgIGlmIChpZCBpbiB0aGlzLl9hcnRpZmFjdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGggYXJ0aWZhY3QgJHtpZH0gYWxyZWFkeSBkZWZpbmVkYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0FydGlmYWN0RmlsZShmaWxlcGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGggYXJ0aWZhY3QgXCIke2ZpbGVwYXRofVwiIGFscmVhZHkgZGVmaW5lZGApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm91dGRpciwgZmlsZXBhdGgpO1xuXG4gICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQ2RrR3JhcGgpKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoQ2RrR3JhcGhBcnRpZmFjdHMpLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdyYXBoIGFydGlmYWN0IGlkICR7aWR9IGlzIHJlc2VydmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnZhbHVlcyhDZGtHcmFwaEFydGlmYWN0cykuaW5jbHVkZXMoZmlsZW5hbWUgYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdyYXBoIGFydGlmYWN0IGZpbGUgJHtmaWxlbmFtZX0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcnRpZmFjdDogQ2RrR3JhcGhBcnRpZmFjdCA9IHtcbiAgICAgIGlkLFxuICAgICAgZmlsZXBhdGgsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc291cmNlOlxuICAgICAgICBzb3VyY2UgaW5zdGFuY2VvZiBDZGtHcmFwaFxuICAgICAgICAgID8gYCR7Q2RrR3JhcGguSUR9YFxuICAgICAgICAgIDogYHBsdWdpbjoke3NvdXJjZS5pZH1AJHtzb3VyY2UudmVyc2lvbn1gLFxuICAgIH07XG5cbiAgICB0aGlzLl9hcnRpZmFjdHNbaWRdID0gYXJ0aWZhY3Q7XG5cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuQnJpZ2h0KFxuICAgICAgICBgW0Nka0dyYXBoXSBBcnRpZmFjdCAke2lkfSB3cml0dGVuIHRvIFxceDFCXTg7O2ZpbGU6Ly8ke2FydGlmYWN0LmZpbGVwYXRofVxceDFCXFxcXCR7YXJ0aWZhY3QuZmlsZW5hbWV9XFx4MUJdODs7XFx4MUJcXFxcICgke2FydGlmYWN0LnNvdXJjZX0pYFxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gYXJ0aWZhY3Q7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGFydGlmYWN0IGRhdGEgdG8gb3V0ZGlyIGFuZCBsb2dzIHRoZSBlbnRyeS5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9mIHRoZSBhcnRpZmFjdCwgc3VjaCBhcyB0aGUgbmFtZSBvZiBwbHVnaW5cbiAgICogQHBhcmFtIGlkIFVuaXF1ZSBpZCBvZiB0aGUgYXJ0aWZhY3RcbiAgICogQHBhcmFtIGZpbGVuYW1lIFJlbGF0aXZlIG5hbWUgb2YgdGhlIGZpbGVcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBhcnRpZmFjdFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgd3JpdGVBcnRpZmFjdChcbiAgICBzb3VyY2U6IENka0dyYXBoIHwgSUNka0dyYXBoUGx1Z2luLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogQ2RrR3JhcGhBcnRpZmFjdCB7XG4gICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5vdXRkaXIsIGZpbGVuYW1lKTtcbiAgICBjb25zdCBhcnRpZmFjdCA9IHRoaXMubG9nQXJ0aWZhY3Qoc291cmNlLCBpZCwgZmlsZXBhdGgsIGRlc2NyaXB0aW9uKTtcblxuICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVwYXRoKSk7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVwYXRoLCBkYXRhLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSk7XG5cbiAgICByZXR1cm4gYXJ0aWZhY3Q7XG4gIH1cbn1cblxuLyoqIENhbGxiYWNrIHNpZ25hdHVyZSBmb3IgZ3JhcGggYFBsdWdpbi5iaW5kYCBvcGVyYXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUdyYXBoUGx1Z2luQmluZENhbGxiYWNrIHtcbiAgKGdyYXBoOiBDZGtHcmFwaCk6IHZvaWQ7XG59XG5cbi8qKiBDYWxsYmFjayBzaWduYXR1cmUgZm9yIGdyYXBoIGBQbHVnaW4uaW5zcGVjdGAgb3BlcmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIElHcmFwaFZpc2l0b3JDYWxsYmFjayB7XG4gIChjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpOiB2b2lkO1xufVxuXG4vKiogQ2FsbGJhY2sgc2lnbmF0dXJlIGZvciBncmFwaCBgUGx1Z2luLnN5bnRoZXNpemVgIG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR3JhcGhTeW50aGVzaXplQ2FsbGJhY2sge1xuICAoY29udGV4dDogQ2RrR3JhcGhDb250ZXh0KTogdm9pZDtcbn1cblxuLyoqIENhbGxiYWNrIHNpZ25hdHVyZSBmb3IgZ3JhcGggYFBsdWdpbi5yZXBvcnRgIG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR3JhcGhSZXBvcnRDYWxsYmFjayB7XG4gIChjb250ZXh0OiBDZGtHcmFwaENvbnRleHQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQ2RrR3JhcGggKipQbHVnaW4qKiBpbnRlcmZhY2UgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNka0dyYXBoUGx1Z2luIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBsdWdpbiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogUGx1Z2luIHZlcnNpb24gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogVmVyc2lvbjtcbiAgLyoqIExpc3Qgb2YgcGx1Z2lucyB0aGlzIHBsdWdpbiBkZXBlbmRzIG9uLCBpbmNsdWRpbmcgb3B0aW9uYWwgc2VtdmVyIHZlcnNpb24gKGVnOiBbXCJmb29cIiwgXCJiYXJAMS4yXCJdKSAqL1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQmluZHMgdGhlIHBsdWdpbiB0byB0aGUgQ2RrR3JhcGggaW5zdGFuY2UuIEVuYWJsZXMgcGx1Z2lucyB0byByZWNlaXZlIGJhc2UgY29uZmlncy5cbiAgICovXG4gIGJpbmQ6IElHcmFwaFBsdWdpbkJpbmRDYWxsYmFjaztcblxuICAvKipcbiAgICogTm9kZSB2aXNpdG9yIGNhbGxiYWNrIGZvciBjb25zdHJ1Y3QgdHJlZSB0cmF2ZXJzYWwuIFRoaXMgZm9sbG93cyBJQXNwZWN0LnZpc2l0IHBhdHRlcm4sIGJ1dCB0aGUgb3JkZXJcbiAgICogb2YgdmlzaXRvciB0cmF2ZXJzYWwgaW4gbWFuYWdlZCBieSB0aGUgQ2RrR3JhcGguXG4gICAqL1xuICBpbnNwZWN0PzogSUdyYXBoVmlzaXRvckNhbGxiYWNrO1xuICAvKipcbiAgICogQ2FsbGVkIGR1cmluZyBDREsgc3ludGhlc2l6ZSB0byBnZW5lcmF0ZSBzeW5jaHJvbm91cyBhcnRpZmFjdHMgYmFzZWQgb24gdGhlIGluLW1lbW9yeSBncmFwaCBwYXNzZWRcbiAgICogdG8gdGhlIHBsdWdpbi4gVGhpcyBpcyBjYWxsZWQgaW4gZmlmbyBvcmRlciBvZiBwbHVnaW5zLlxuICAgKi9cbiAgc3ludGhlc2l6ZT86IElHcmFwaFN5bnRoZXNpemVDYWxsYmFjaztcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFzeW5jaHJvbm91cyByZXBvcnRzIGJhc2VkIG9uIHRoZSBncmFwaC4gVGhpcyBpcyBub3QgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiBzeW50aGVzaXppbmcgQ0RLLlxuICAgKiBEZXZlbG9wZXIgbXVzdCBleHBsaWNpdGx5IGFkZCBgYXdhaXQgZ3JhcGhJbnN0YW5jZS5yZXBvcnQoKWAgdG8gdGhlIENESyBiaW4gb3IgaW52b2tlIHRoaXMgb3V0c2lkZVxuICAgKiBvZiB0aGUgQ0RLIHN5bnRoLiBJbiBlaXRoZXIgY2FzZSwgdGhlIHBsdWdpbiByZWNlaXZlcyB0aGUgaW4tbWVtb3J5IGdyYXBoIGludGVyZmFjZSB3aGVuIGludm9rZWQsIGFzIHRoZVxuICAgKiBDZGtHcmFwaCB3aWxsIGRlc2VyaWFsaXplIHRoZSBncmFwaCBwcmlvciB0byBpbnZva2luZyB0aGUgcGx1Z2luIHJlcG9ydC5cbiAgICovXG4gIHJlcG9ydD86IElHcmFwaFJlcG9ydENhbGxiYWNrO1xufVxuXG4vKipcbiAqICB7QGxpbmsgQ2RrR3JhcGh9IHByb3BzXG4gKiBAc3RydWN0XG4gKiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ2RrR3JhcGhQcm9wcyB7XG4gIC8qKiBMaXN0IG9mIHBsdWdpbnMgdG8gZXh0ZW5kcyB0aGUgZ3JhcGguIFBsdWdpbnMgYXJlIGludm9rZWQgYXQgZWFjaCBwaGFzZXMgaW4gZmlmbyBvcmRlci4gKi9cbiAgcmVhZG9ubHkgcGx1Z2lucz86IElDZGtHcmFwaFBsdWdpbltdO1xufVxuXG4vKipcbiAqIENka0dyYXBoIGNvbnN0cnVjdCBpcyB0aGUgY2RrLWdyYXBoIGZyYW1ld29yayBjb250cm9sbGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yXG4gKiBjb21wdXRpbmcgdGhlIGdyYXBoLCBzdG9yaW5nIHNlcmlhbGl6ZWQgZ3JhcGgsIGFuZCBpbnN0cnVtZW50aW5nIHBsdWdpbnMgcGVyIHRoZVxuICogcGx1Z2luIGNvbnRyYWN0LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrR3JhcGggZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKiogRml4ZWQgQ2RrR3JhcGggY29uc3RydWN0IGlkICovXG4gIHN0YXRpYyByZWFkb25seSBJRCA9IEdSQVBIX0lEO1xuICAvKiogQ3VycmVudCBDZGtHcmFwaCBzZW1hbnRpYyB2ZXJzaW9uICovXG4gIHN0YXRpYyByZWFkb25seSBWRVJTSU9OID0gXCIwLjAuMFwiOyAvLyBUT0RPOiBtYWtlIGR5bmFtaWMgZnJvbSBwYWNrYWdlXG5cbiAgLyoqIExpc3Qgb2YgcGx1Z2lucyByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSAqL1xuICByZWFkb25seSBwbHVnaW5zOiBJQ2RrR3JhcGhQbHVnaW5bXTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBDZGtHcmFwaENvbnRleHQ7XG5cbiAgLyoqIENvbmZpZyAqL1xuICByZWFkb25seSBjb25maWc6IENka0dyYXBoQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBncmFwaCBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGB1bmRlZmluZWRgIGJlZm9yZSBjb25zdHJ1Y3Qgc3ludGhlc2lzIGhhcyBpbml0aWF0ZWQuXG4gICAqL1xuICBnZXQgZ3JhcGhDb250ZXh0KCk6IENka0dyYXBoQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcm9vdDogQ29uc3RydWN0LCBwcm9wczogSUNka0dyYXBoUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHJvb3QsIENka0dyYXBoLklEKTtcblxuICAgIGFkZE1ldHJpYyhyb290LCBcImNkay1ncmFwaFwiKTtcblxuICAgIHRoaXMuY29uZmlnID0gcmVzb2x2ZUNvbmZpZygpO1xuXG4gICAgdGhpcy5wbHVnaW5zID0gcHJvcHMucGx1Z2lucyB8fCBbXTtcbiAgICAvLyBUT0RPOiB2ZXJpZnkgcGx1Z2luIGRlcHMgdmlhIHNlbXZlclxuXG4gICAgLy8gYmluZCBhbGwgcGx1Z2lucyB0byB0aGlzIGluc3RhbmNlIG9mIHRoZSBncmFwaFxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgIGFkZE1ldHJpYyhyb290LCBgY2RrLWdyYXBoLXBsdWdpbi0ke3BsdWdpbi5pZH1gIGFzIGFueSk7XG4gICAgICBwbHVnaW4uYmluZCh0aGlzKTtcbiAgICB9KTtcblxuICAgIC8vIEFwcGx5IEFzcGVjdCBmb3IgZWFjaCBwbHVnaW4gdGhhdCBzdXBwb3J0cyBcImluc3BlY3RcIiBwaGFzZVxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgIGlmIChwbHVnaW4uaW5zcGVjdCkge1xuICAgICAgICBBc3BlY3RzLm9mKHRoaXMucm9vdCkuYWRkKHtcbiAgICAgICAgICB2aXNpdDogcGx1Z2luLmluc3BlY3QsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkQ3VzdG9tU3ludGhlc2lzKHRoaXMsIHtcbiAgICAgIG9uU3ludGhlc2l6ZTogKHNlc3Npb24pID0+IHtcbiAgICAgICAgdGhpcy5fc3ludGhlc2l6ZShzZXNzaW9uKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBfc3ludGhlc2l6ZShzZXNzaW9uOiBJU3ludGhlc2lzU2Vzc2lvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JlID0gY29tcHV0ZUdyYXBoKHRoaXMucm9vdCk7XG4gICAgY29uc3Qgb3V0ZGlyID0gcmVzb2x2ZU91dGRpcihzZXNzaW9uLm91dGRpciwgdGhpcy5jb25maWcub3V0ZGlyKTtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IENka0dyYXBoQ29udGV4dChzdG9yZSwgb3V0ZGlyKTtcblxuICAgIGNvbnRleHQud3JpdGVBcnRpZmFjdChcbiAgICAgIHRoaXMsXG4gICAgICBHUkFQSF9BUlRJRkFDVF9JRCxcbiAgICAgIENka0dyYXBoQXJ0aWZhY3RzLkdSQVBILFxuICAgICAgSlNPTi5zdHJpbmdpZnkoY29udGV4dC5zdG9yZS5zZXJpYWxpemUoKSwgbnVsbCwgMiksXG4gICAgICBcIlNlcmlhbGl6ZWQgZ3JhcGhcIlxuICAgICk7XG5cbiAgICB0aGlzLnBsdWdpbnMuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICBwbHVnaW4uc3ludGhlc2l6ZSAmJiBwbHVnaW4uc3ludGhlc2l6ZShjb250ZXh0KTtcbiAgICB9KTtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4ob3V0ZGlyLCBDZGtHcmFwaEFydGlmYWN0cy5HUkFQSF9NRVRBREFUQSksXG4gICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAge1xuICAgICAgICAgIHZlcnNpb246IENka0dyYXBoLlZFUlNJT04sXG4gICAgICAgICAgYXJ0aWZhY3RzOiBjb250ZXh0LmFydGlmYWN0cyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMlxuICAgICAgKSxcbiAgICAgIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9XG4gICAgKTtcblxuICAgIC8vIHN0b3JlIGNvbnRleHQgZm9yIHJlcG9ydGluZ1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91cyByZXBvcnQgZ2VuZXJhdGlvbi4gVGhpcyBvcGVyYXRpb24gZW5hYmxlcyBydW5uaW5nIGV4cGVuc2l2ZSBhbmQgbm9uLXN5bmNocm9ub3VzXG4gICAqIHJlcG9ydCBnZW5lcmF0aW9uIGJ5IHBsdWdpbnMgcG9zdCBzeW50aGVzaXMuXG4gICAqXG4gICAqIElmIGEgZ2l2ZW4gcGx1Z2luIHJlcXVpcmVzIHBlcmZvcm1pbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgb3IgaXMgZ2VuZXJhbCBleHBlbnNpdmUsIGl0IHNob3VsZFxuICAgKiB1dGlsaXplIGByZXBvcnRgIHJhdGhlciB0aGFuIGBzeW50aGVzaXplYC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXBvcnQoKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRleHQgPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogc3VwcG9ydCBkZXNlcmlhbGl6aW5nIHBkay1ncmFwaCB0byBnZW5lcmF0ZSBzdG9yZS9jb250ZXh0XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvd0JyaWdodChcbiAgICAgICAgICBcIltDZGtHcmFwaF0gSW4gdGhlIG5lYXIgZnV0dXJlLCByZXBvcnRzIHdpbGwgYmUgcnVubmFibGUgb3V0c2lkZSBvZiBjZGsgc3ludGhcIlxuICAgICAgICApXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2RrR3JhcGggcmVwb3J0IGNhbGxlZCBvdXRzaWRlIG9mIGNkayBzeW50aCBwcm9jZXNzXCIpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5yZXBvcnQgJiYgKGF3YWl0IHBsdWdpbi5yZXBvcnQodGhpcy5fY29udGV4dCkpO1xuICAgIH1cbiAgfVxufVxuIl19