UNPKG

projen

Version:

CDK for software projects

338 lines • 47.5 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.BundleLogLevel = exports.Charset = exports.SourceMapMode = exports.RunBundleTask = exports.Bundler = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const path = __importStar(require("path")); const path_1 = require("path"); const util_1 = require("./util"); const component_1 = require("../component"); const dependencies_1 = require("../dependencies"); /** * Adds support for bundling JavaScript applications and dependencies into a * single file. In the future, this will also supports bundling websites. */ class Bundler extends component_1.Component { static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.javascript.Bundler", version: "0.103.12" }; /** * Returns the `Bundler` instance associated with a project or `undefined` if * there is no Bundler. * @param project The project * @returns A bundler */ static of(project) { const isBundler = (o) => o instanceof Bundler; return project.components.find(isBundler); } /** * The semantic version requirement for `esbuild` (if defined). */ esbuildVersion; /** * Root bundle directory. */ bundledir; _task; runBundleTask; loaders; /** * Creates a `Bundler`. */ constructor(project, options = {}) { super(project); this.esbuildVersion = options.esbuildVersion; this.bundledir = options.assetsDir ?? "assets"; this.loaders = options.loaders; this.runBundleTask = options.runBundleTask ?? RunBundleTask.PRE_COMPILE; } /** * Gets or creates the singleton "bundle" task of the project. * * If the project doesn't have a "bundle" task, it will be created and spawned * during the pre-compile phase. */ get bundleTask() { if (!this._task) { this.addBundlingSupport(); this._task = this.project.tasks.addTask("bundle", { description: "Prepare assets", }); // install the bundle task into the pre-compile phase. if (this.runBundleTask === RunBundleTask.PRE_COMPILE) { this.project.preCompileTask.spawn(this._task); } else if (this.runBundleTask === RunBundleTask.POST_COMPILE) { this.project.postCompileTask.spawn(this._task); } } return this._task; } /** * Adds a task to the project which bundles a specific entrypoint and all of * its dependencies into a single javascript output file. * * @param entrypoint The relative path of the artifact within the project * @param options Bundling options */ addBundle(entrypoint, options) { const name = (0, util_1.renderBundleName)(entrypoint); const outdir = path.posix.join(this.bundledir, name); const outfile = path.posix.join(outdir, options.outfile ?? "index.js"); const args = [ "esbuild", "--bundle", entrypoint, `--target=${options.target}`, `--platform=${options.platform}`, `--outfile=${outfile}`, ]; if (options.tsconfigPath) { args.push(`--tsconfig=${options.tsconfigPath}`); } for (const x of options.externals ?? []) { args.push(`--external:${x}`); } if (options.sourcemap || options.sourceMapMode) { const sourceMapMode = options.sourceMapMode ?? SourceMapMode.DEFAULT; const sourceMapValue = sourceMapMode === SourceMapMode.DEFAULT ? "" : `=${options.sourceMapMode}`; args.push(`--sourcemap${sourceMapValue}`); if (options.sourcesContent === true) { args.push(`--sources-content=${options.sourcesContent}`); } } const format = options.format; if (format) { args.push(`--format=${format}`); } const loaders = (options.loaders ?? false) ? options.loaders : (this.loaders ?? false); if (loaders) { for (let [extension, loader] of Object.entries(loaders)) { args.push(`--loader:.${extension}=${loader}`); } } const defines = Object.entries(options.define ?? {}); for (const [key, value] of defines) { args.push(`--define:${key}=${value}`); } if (options.minify) { args.push("--minify"); } if (options.logLevel) { args.push(`--log-level=${options.logLevel}`); } if (options.keepNames) { args.push("--keep-names"); } if (options.metafile) { args.push(`--metafile=${(0, path_1.join)(outdir, "index.meta.json")}`); } if (options.banner) { args.push(`--banner:js=${options.banner}`); } if (options.footer) { args.push(`--footer:js=${options.footer}`); } if (options.mainFields) { args.push(`--main-fields=${options.mainFields.join(",")}`); } if (options.inject) { args.push(...options.inject.map((i) => `--inject:${i}`)); } if (options.esbuildArgs) { const subArgs = new Array(); for (const [key, value] of Object.entries(options.esbuildArgs)) { if (value === true || value === "") { subArgs.push(key); } else if (value) { subArgs.push(`${key}=${value}`); } } args.push(...subArgs); } const bundleTask = this.project.addTask(`bundle:${name}`, { description: `Create a JavaScript bundle from ${entrypoint}`, execArgs: args, }); this.bundleTask.spawn(bundleTask); if (options.executable ?? false) { bundleTask.execArgs(["chmod", "+x", outfile]); } let watchTask; const watch = options.watchTask ?? true; if (watch) { watchTask = this.project.addTask(`bundle:${name}:watch`, { description: `Continuously update the JavaScript bundle from ${entrypoint}`, execArgs: [...args, "--watch"], }); } return { bundleTask: bundleTask, watchTask: watchTask, outdir: outdir, outfile: outfile, }; } /** * Add bundling support to a project. This is called implicitly when * `bundleTask` is referenced first. It adds the dependency on `esbuild`, * gitignore/npmignore, etc. */ addBundlingSupport() { const ignoreEntry = `/${this.bundledir}/`; this.project.addGitIgnore(ignoreEntry); this.project.addPackageIgnore(`!${ignoreEntry}`); // include in tarball const dep = this.esbuildVersion ? `esbuild@${this.esbuildVersion}` : "esbuild"; this.project.deps.addDependency(dep, dependencies_1.DependencyType.BUILD); } } exports.Bundler = Bundler; /** * Options for BundlerOptions.runBundleTask */ var RunBundleTask; (function (RunBundleTask) { /** * Don't bundle automatically as part of the build. */ RunBundleTask["MANUAL"] = "manual"; /** * Bundle automatically before compilation. */ RunBundleTask["PRE_COMPILE"] = "pre_compile"; /** * Bundle automatically after compilation. This is useful if you want to * bundle the compiled results. * * Thus will run compilation tasks (using tsc, etc.) before running file * through bundling step. * * This is only required unless you are using new experimental features that * are not supported by `esbuild` but are supported by typescript's `tsc` * compiler. One example of such feature is `emitDecoratorMetadata`. * * ```typescript * // In a TypeScript project with output configured * // to go to the "lib" directory: * const project = new TypeScriptProject({ * name: "test", * tsconfig: { * compilerOptions: { * outDir: "lib", * }, * }, * bundlerOptions: { * // ensure we compile with `tsc` before bundling * runBundleTask: RunBundleTask.POST_COMPILE, * }, * }); * * // Tell the bundler to bundle the compiled results (from the "lib" directory) * project.bundler.addBundle("./lib/index.js", { * platform: "node", * target: "node22", * sourcemap: false, * format: "esm", * }); * ``` **/ RunBundleTask["POST_COMPILE"] = "post_compile"; })(RunBundleTask || (exports.RunBundleTask = RunBundleTask = {})); /** * SourceMap mode for esbuild * @see https://esbuild.github.io/api/#sourcemap */ var SourceMapMode; (function (SourceMapMode) { /** * Default sourceMap mode - will generate a .js.map file alongside any generated .js file and add a special //# sourceMappingURL= * comment to the bottom of the .js file pointing to the .js.map file */ SourceMapMode["DEFAULT"] = "default"; /** * External sourceMap mode - If you want to omit the special //# sourceMappingURL= comment from the generated .js file but you still * want to generate the .js.map files */ SourceMapMode["EXTERNAL"] = "external"; /** * Inline sourceMap mode - If you want to insert the entire source map into the .js file instead of generating a separate .js.map file */ SourceMapMode["INLINE"] = "inline"; /** * Both sourceMap mode - If you want to have the effect of both inline and external simultaneously */ SourceMapMode["BOTH"] = "both"; })(SourceMapMode || (exports.SourceMapMode = SourceMapMode = {})); /** * Charset for esbuild's output */ var Charset; (function (Charset) { /** * ASCII * * Any non-ASCII characters are escaped using backslash escape sequences */ Charset["ASCII"] = "ascii"; /** * UTF-8 * * Keep original characters without using escape sequences */ Charset["UTF8"] = "utf8"; })(Charset || (exports.Charset = Charset = {})); /** * Log levels for esbuild and package managers' install commands. */ var BundleLogLevel; (function (BundleLogLevel) { /** Show everything */ BundleLogLevel["VERBOSE"] = "verbose"; /** Show everything from info and some additional messages for debugging */ BundleLogLevel["DEBUG"] = "debug"; /** Show warnings, errors, and an output file summary */ BundleLogLevel["INFO"] = "info"; /** Show warnings and errors */ BundleLogLevel["WARNING"] = "warning"; /** Show errors only */ BundleLogLevel["ERROR"] = "error"; /** Show nothing */ BundleLogLevel["SILENT"] = "silent"; })(BundleLogLevel || (exports.BundleLogLevel = BundleLogLevel = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhc2NyaXB0L2J1bmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QjtBQUM3QiwrQkFBd0M7QUFDeEMsaUNBQTBDO0FBQzFDLDRDQUF5QztBQUN6QyxrREFBaUQ7QUEyQ2pEOzs7R0FHRztBQUNILE1BQWEsT0FBUSxTQUFRLHFCQUFTOztJQUNwQzs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBZ0I7UUFDL0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFZLEVBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksT0FBTyxDQUFDO1FBQ3ZFLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ2EsY0FBYyxDQUFxQjtJQUVuRDs7T0FFRztJQUNhLFNBQVMsQ0FBUztJQUUxQixLQUFLLENBQW1CO0lBQ2YsYUFBYSxDQUFpQjtJQUM5QixPQUFPLENBQTZCO0lBRXJEOztPQUVHO0lBQ0gsWUFBWSxPQUFnQixFQUFFLFVBQTBCLEVBQUU7UUFDeEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBRS9CLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsVUFBVTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEtB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K0I7SUFDL0IscUNBQW1CLENBQUE7SUFDbkIsdUJBQXVCO0lBQ3ZCLGlDQUFlLENBQUE7SUFDZixtQkFBbUI7SUFDbkIsbUNBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQWJXLGNBQWMsOEJBQWQsY0FBYyxRQWF6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGpvaW4gYXMgcGF0aEpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcmVuZGVyQnVuZGxlTmFtZSB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4uL2RlcGVuZGVuY2llc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gXCIuLi90YXNrXCI7XG5cbi8vIFBhcnRzIG9mIHRoaXMgZmlsZSBpbnNwaXJlZCBieSBAYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcbi8vICAgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvYzNjNzcxYzZmNmY2NzkwZjIyOThhODVhNTQ5YmRlZDY0MGQyZTM1Yi9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcy9saWIvYnVuZGxpbmcudHMjTDE5NVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBCdW5kbGVyYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiByZXF1aXJlbWVudCBmb3IgYGVzYnVpbGRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNwZWNpZmljIHZlcnNpb24gKGltcGxpZXMgbGF0ZXN0KVxuICAgKi9cbiAgcmVhZG9ubHkgZXNidWlsZFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE91dHB1dCBkaXJlY3RvcnkgZm9yIGFsbCBidW5kbGVzLlxuICAgKiBAZGVmYXVsdCBcImFzc2V0c1wiXG4gICAqL1xuICByZWFkb25seSBhc3NldHNEaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENob29zZSB3aGljaCBwaGFzZSAoaWYgYW55KSB0byBhZGQgdGhlIGBidW5kbGVgIGNvbW1hbmQgdG8uXG4gICAqXG4gICAqIE5vdGU6IElmIHVzaW5nIGBhZGRCdW5kbGUoKWAgd2l0aCB0aGUgYGJ1bmRsZUNvbXBpbGVkUmVzdWx0c2AsIHRoaXMgb3B0aW9uXG4gICAqIG11c3QgYmUgc2V0IHRvIGBSdW5CdW5kbGVUYXNrLlBPU1RfQ09NUElMRWAgb3IgYFJ1bkJ1bmRsZVRhc2suTUFOVUFMYC5cbiAgICpcbiAgICogQHNlZSBBZGRCdW5kbGVPcHRpb25zLmJ1bmRsZUNvbXBpbGVkUmVzdWx0c1xuICAgKlxuICAgKiBAZGVmYXVsdCBSdW5CdW5kbGVUYXNrLlBSRV9DT01QSUxFXG4gICAqL1xuICByZWFkb25seSBydW5CdW5kbGVUYXNrPzogUnVuQnVuZGxlVGFzaztcblxuICAvKipcbiAgICogTWFwIG9mIGZpbGUgZXh0ZW5zaW9ucyAod2l0aG91dCBkb3QpIGFuZCBsb2FkZXJzIHRvIHVzZSBmb3IgdGhpcyBmaWxlIHR5cGUuXG4gICAqIExvYWRlcnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBlc2J1aWxkIGNvbW1hbmQgYnkgYC0tbG9hZGVyOi5leHRlbnNpb249bG9hZGVyYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQWRkcyBzdXBwb3J0IGZvciBidW5kbGluZyBKYXZhU2NyaXB0IGFwcGxpY2F0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGludG8gYVxuICogc2luZ2xlIGZpbGUuIEluIHRoZSBmdXR1cmUsIHRoaXMgd2lsbCBhbHNvIHN1cHBvcnRzIGJ1bmRsaW5nIHdlYnNpdGVzLlxuICovXG5leHBvcnQgY2xhc3MgQnVuZGxlciBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgQnVuZGxlcmAgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdCBvciBgdW5kZWZpbmVkYCBpZlxuICAgKiB0aGVyZSBpcyBubyBCdW5kbGVyLlxuICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdFxuICAgKiBAcmV0dXJucyBBIGJ1bmRsZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEJ1bmRsZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzQnVuZGxlciA9IChvOiBDb21wb25lbnQpOiBvIGlzIEJ1bmRsZXIgPT4gbyBpbnN0YW5jZW9mIEJ1bmRsZXI7XG4gICAgcmV0dXJuIHByb2plY3QuY29tcG9uZW50cy5maW5kKGlzQnVuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlbWFudGljIHZlcnNpb24gcmVxdWlyZW1lbnQgZm9yIGBlc2J1aWxkYCAoaWYgZGVmaW5lZCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXNidWlsZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUm9vdCBidW5kbGUgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1bmRsZWRpcjogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3Rhc2s6IFRhc2sgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnVuQnVuZGxlVGFzaz86IFJ1bkJ1bmRsZVRhc2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBgQnVuZGxlcmAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBCdW5kbGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLmVzYnVpbGRWZXJzaW9uID0gb3B0aW9ucy5lc2J1aWxkVmVyc2lvbjtcbiAgICB0aGlzLmJ1bmRsZWRpciA9IG9wdGlvbnMuYXNzZXRzRGlyID8/IFwiYXNzZXRzXCI7XG4gICAgdGhpcy5sb2FkZXJzID0gb3B0aW9ucy5sb2FkZXJzO1xuXG4gICAgdGhpcy5ydW5CdW5kbGVUYXNrID0gb3B0aW9ucy5ydW5CdW5kbGVUYXNrID8/IFJ1bkJ1bmRsZVRhc2suUFJFX0NPTVBJTEU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaW5nbGV0b24gXCJidW5kbGVcIiB0YXNrIG9mIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBJZiB0aGUgcHJvamVjdCBkb2Vzbid0IGhhdmUgYSBcImJ1bmRsZVwiIHRhc2ssIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgc3Bhd25lZFxuICAgKiBkdXJpbmcgdGhlIHByZS1jb21waWxlIHBoYXNlLlxuICAgKi9cbiAgcHVibGljIGdldCBidW5kbGVUYXNrKCk6IFRhc2sge1xuICAgIGlmICghdGhpcy5fdGFzaykge1xuICAgICAgdGhpcy5hZGRCdW5kbGluZ1N1cHBvcnQoKTtcbiAgICAgIHRoaXMuX3Rhc2sgPSB0aGlzLnByb2plY3QudGFza3MuYWRkVGFzayhcImJ1bmRsZVwiLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlByZXBhcmUgYXNzZXRzXCIsXG4gICAgICB9KTtcblxuICAgICAgLy8gaW5zdGFsbCB0aGUgYnVuZGxlIHRhc2sgaW50byB0aGUgcHJlLWNvbXBpbGUgcGhhc2UuXG4gICAgICBpZiAodGhpcy5ydW5CdW5kbGVUYXNrID09PSBSdW5CdW5kbGVUYXNrLlBSRV9DT01QSUxFKSB7XG4gICAgICAgIHRoaXMucHJvamVjdC5wcmVDb21waWxlVGFzay5zcGF3bih0aGlzLl90YXNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5ydW5CdW5kbGVUYXNrID09PSBSdW5CdW5kbGVUYXNrLlBPU1RfQ09NUElMRSkge1xuICAgICAgICB0aGlzLnByb2plY3QucG9zdENvbXBpbGVUYXNrLnNwYXduKHRoaXMuX3Rhc2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90YXNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0YXNrIHRvIHRoZSBwcm9qZWN0IHdoaWNoIGJ1bmRsZXMgYSBzcGVjaWZpYyBlbnRyeXBvaW50IGFuZCBhbGwgb2ZcbiAgICogaXRzIGRlcGVuZGVuY2llcyBpbnRvIGEgc2luZ2xlIGphdmFzY3JpcHQgb3V0cHV0IGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeXBvaW50IFRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBhcnRpZmFjdCB3aXRoaW4gdGhlIHByb2plY3RcbiAgICogQHBhcmFtIG9wdGlvbnMgQnVuZGxpbmcgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFkZEJ1bmRsZShlbnRyeXBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IEFkZEJ1bmRsZU9wdGlvbnMpOiBCdW5kbGUge1xuICAgIGNvbnN0IG5hbWUgPSByZW5kZXJCdW5kbGVOYW1lKGVudHJ5cG9pbnQpO1xuXG4gICAgY29uc3Qgb3V0ZGlyID0gcGF0aC5wb3NpeC5qb2luKHRoaXMuYnVuZGxlZGlyLCBuYW1lKTtcbiAgICBjb25zdCBvdXRmaWxlID0gcGF0aC5wb3NpeC5qb2luKG91dGRpciwgb3B0aW9ucy5vdXRmaWxlID8/IFwiaW5kZXguanNcIik7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgIFwiZXNidWlsZFwiLFxuICAgICAgXCItLWJ1bmRsZVwiLFxuICAgICAgZW50cnlwb2ludCxcbiAgICAgIGAtLXRhcmdldD0ke29wdGlvbnMudGFyZ2V0fWAsXG4gICAgICBgLS1wbGF0Zm9ybT0ke29wdGlvbnMucGxhdGZvcm19YCxcbiAgICAgIGAtLW91dGZpbGU9JHtvdXRmaWxlfWAsXG4gICAgXTtcblxuICAgIGlmIChvcHRpb25zLnRzY29uZmlnUGF0aCkge1xuICAgICAgYXJncy5wdXNoKGAtLXRzY29uZmlnPSR7b3B0aW9ucy50c2NvbmZpZ1BhdGh9YCk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB4IG9mIG9wdGlvbnMuZXh0ZXJuYWxzID8/IFtdKSB7XG4gICAgICBhcmdzLnB1c2goYC0tZXh0ZXJuYWw6JHt4fWApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNvdXJjZW1hcCB8fCBvcHRpb25zLnNvdXJjZU1hcE1vZGUpIHtcbiAgICAgIGNvbnN0IHNvdXJjZU1hcE1vZGUgPSBvcHRpb25zLnNvdXJjZU1hcE1vZGUgPz8gU291cmNlTWFwTW9kZS5ERUZBVUxUO1xuICAgICAgY29uc3Qgc291cmNlTWFwVmFsdWUgPVxuICAgICAgICBzb3VyY2VNYXBNb2RlID09PSBTb3VyY2VNYXBNb2RlLkRFRkFVTFRcbiAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICA6IGA9JHtvcHRpb25zLnNvdXJjZU1hcE1vZGV9YDtcbiAgICAgIGFyZ3MucHVzaChgLS1zb3VyY2VtYXAke3NvdXJjZU1hcFZhbHVlfWApO1xuXG4gICAgICBpZiAob3B0aW9ucy5zb3VyY2VzQ29udGVudCA9PT0gdHJ1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tc291cmNlcy1jb250ZW50PSR7b3B0aW9ucy5zb3VyY2VzQ29udGVudH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdDtcbiAgICBpZiAoZm9ybWF0KSB7XG4gICAgICBhcmdzLnB1c2goYC0tZm9ybWF0PSR7Zm9ybWF0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlcnMgPVxuICAgICAgKG9wdGlvbnMubG9hZGVycyA/PyBmYWxzZSkgPyBvcHRpb25zLmxvYWRlcnMgOiAodGhpcy5sb2FkZXJzID8/IGZhbHNlKTtcbiAgICBpZiAobG9hZGVycykge1xuICAgICAgZm9yIChsZXQgW2V4dGVuc2lvbiwgbG9hZGVyXSBvZiBPYmplY3QuZW50cmllcyhsb2FkZXJzKSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tbG9hZGVyOi4ke2V4dGVuc2lvbn09JHtsb2FkZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGVmaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZGVmaW5lID8/IHt9KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkZWZpbmVzKSB7XG4gICAgICBhcmdzLnB1c2goYC0tZGVmaW5lOiR7a2V5fT0ke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1pbmlmeSkge1xuICAgICAgYXJncy5wdXNoKFwiLS1taW5pZnlcIik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubG9nTGV2ZWwpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1sb2ctbGV2ZWw9JHtvcHRpb25zLmxvZ0xldmVsfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5rZWVwTmFtZXMpIHtcbiAgICAgIGFyZ3MucHVzaChcIi0ta2VlcC1uYW1lc1wiKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubWV0YWZpbGUpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1tZXRhZmlsZT0ke3BhdGhKb2luKG91dGRpciwgXCJpbmRleC5tZXRhLmpzb25cIil9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmJhbm5lcikge1xuICAgICAgYXJncy5wdXNoKGAtLWJhbm5lcjpqcz0ke29wdGlvbnMuYmFubmVyfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mb290ZXIpIHtcbiAgICAgIGFyZ3MucHVzaChgLS1mb290ZXI6anM9JHtvcHRpb25zLmZvb3Rlcn1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubWFpbkZpZWxkcykge1xuICAgICAgYXJncy5wdXNoKGAtLW1haW4tZmllbGRzPSR7b3B0aW9ucy5tYWluRmllbGRzLmpvaW4oXCIsXCIpfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pbmplY3QpIHtcbiAgICAgIGFyZ3MucHVzaCguLi5vcHRpb25zLmluamVjdC5tYXAoKGkpID0+IGAtLWluamVjdDoke2l9YCkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lc2J1aWxkQXJncykge1xuICAgICAgY29uc3Qgc3ViQXJncyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZXNidWlsZEFyZ3MpKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICAgIHN1YkFyZ3MucHVzaChrZXkpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgc3ViQXJncy5wdXNoKGAke2tleX09JHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhcmdzLnB1c2goLi4uc3ViQXJncyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVuZGxlVGFzayA9IHRoaXMucHJvamVjdC5hZGRUYXNrKGBidW5kbGU6JHtuYW1lfWAsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlIGEgSmF2YVNjcmlwdCBidW5kbGUgZnJvbSAke2VudHJ5cG9pbnR9YCxcbiAgICAgIGV4ZWNBcmdzOiBhcmdzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5idW5kbGVUYXNrLnNwYXduKGJ1bmRsZVRhc2spO1xuXG4gICAgaWYgKG9wdGlvbnMuZXhlY3V0YWJsZSA/PyBmYWxzZSkge1xuICAgICAgYnVuZGxlVGFzay5leGVjQXJncyhbXCJjaG1vZFwiLCBcIit4XCIsIG91dGZpbGVdKTtcbiAgICB9XG5cbiAgICBsZXQgd2F0Y2hUYXNrO1xuICAgIGNvbnN0IHdhdGNoID0gb3B0aW9ucy53YXRjaFRhc2sgPz8gdHJ1ZTtcbiAgICBpZiAod2F0Y2gpIHtcbiAgICAgIHdhdGNoVGFzayA9IHRoaXMucHJvamVjdC5hZGRUYXNrKGBidW5kbGU6JHtuYW1lfTp3YXRjaGAsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBDb250aW51b3VzbHkgdXBkYXRlIHRoZSBKYXZhU2NyaXB0IGJ1bmRsZSBmcm9tICR7ZW50cnlwb2ludH1gLFxuICAgICAgICBleGVjQXJnczogWy4uLmFyZ3MsIFwiLS13YXRjaFwiXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBidW5kbGVUYXNrOiBidW5kbGVUYXNrLFxuICAgICAgd2F0Y2hUYXNrOiB3YXRjaFRhc2ssXG4gICAgICBvdXRkaXI6IG91dGRpcixcbiAgICAgIG91dGZpbGU6IG91dGZpbGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYnVuZGxpbmcgc3VwcG9ydCB0byBhIHByb2plY3QuIFRoaXMgaXMgY2FsbGVkIGltcGxpY2l0bHkgd2hlblxuICAgKiBgYnVuZGxlVGFza2AgaXMgcmVmZXJlbmNlZCBmaXJzdC4gSXQgYWRkcyB0aGUgZGVwZW5kZW5jeSBvbiBgZXNidWlsZGAsXG4gICAqIGdpdGlnbm9yZS9ucG1pZ25vcmUsIGV0Yy5cbiAgICovXG4gIHByaXZhdGUgYWRkQnVuZGxpbmdTdXBwb3J0KCkge1xuICAgIGNvbnN0IGlnbm9yZUVudHJ5ID0gYC8ke3RoaXMuYnVuZGxlZGlyfS9gO1xuICAgIHRoaXMucHJvamVjdC5hZGRHaXRJZ25vcmUoaWdub3JlRW50cnkpO1xuICAgIHRoaXMucHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKGAhJHtpZ25vcmVFbnRyeX1gKTsgLy8gaW5jbHVkZSBpbiB0YXJiYWxsXG4gICAgY29uc3QgZGVwID0gdGhpcy5lc2J1aWxkVmVyc2lvblxuICAgICAgPyBgZXNidWlsZEAke3RoaXMuZXNidWlsZFZlcnNpb259YFxuICAgICAgOiBcImVzYnVpbGRcIjtcbiAgICB0aGlzLnByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KGRlcCwgRGVwZW5kZW5jeVR5cGUuQlVJTEQpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVuZGxlIHtcbiAgLyoqXG4gICAqIFRoZSB0YXNrIHRoYXQgcHJvZHVjZXMgdGhpcyBidW5kbGUuXG4gICAqL1xuICByZWFkb25seSBidW5kbGVUYXNrOiBUYXNrO1xuXG4gIC8qKlxuICAgKiBUaGUgXCJ3YXRjaFwiIHRhc2sgZm9yIHRoaXMgYnVuZGxlLlxuICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hUYXNrPzogVGFzaztcblxuICAvKipcbiAgICogTG9jYXRpb24gb2YgdGhlIG91dHB1dCBmaWxlIChyZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3QpLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0ZmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBvdXRwdXQgZmlsZSAocmVsYXRpdmUgdG8gcHJvamVjdCByb290KS5cbiAgICovXG4gIHJlYWRvbmx5IG91dGRpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGJ1bmRsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBZb3UgY2FuIG1hcmsgYSBmaWxlIG9yIGEgcGFja2FnZSBhcyBleHRlcm5hbCB0byBleGNsdWRlIGl0IGZyb20geW91ciBidWlsZC5cbiAgICogSW5zdGVhZCBvZiBiZWluZyBidW5kbGVkLCB0aGUgaW1wb3J0IHdpbGwgYmUgcHJlc2VydmVkICh1c2luZyByZXF1aXJlIGZvclxuICAgKiB0aGUgaWlmZSBhbmQgY2pzIGZvcm1hdHMgYW5kIHVzaW5nIGltcG9ydCBmb3IgdGhlIGVzbSBmb3JtYXQpIGFuZCB3aWxsIGJlXG4gICAqIGV2YWx1YXRlZCBhdCBydW4gdGltZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBUaGlzIGhhcyBzZXZlcmFsIHVzZXMuIEZpcnN0IG9mIGFsbCwgaXQgY2FuIGJlIHVzZWQgdG8gdHJpbSB1bm5lY2Vzc2FyeVxuICAgKiBjb2RlIGZyb20geW91ciBidW5kbGUgZm9yIGEgY29kZSBwYXRoIHRoYXQgeW91IGtub3cgd2lsbCBuZXZlciBiZSBleGVjdXRlZC5cbiAgICogRm9yIGV4YW1wbGUsIGEgcGFja2FnZSBtYXkgY29udGFpbiBjb2RlIHRoYXQgb25seSBydW5zIGluIG5vZGUgYnV0IHlvdSB3aWxsXG4gICAqIG9ubHkgYmUgdXNpbmcgdGhhdCBwYWNrYWdlIGluIHRoZSBicm93c2VyLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGltcG9ydFxuICAgKiBjb2RlIGluIG5vZGUgYXQgcnVuIHRpbWUgZnJvbSBhIHBhY2thZ2UgdGhhdCBjYW5ub3QgYmUgYnVuZGxlZC4gRm9yXG4gICAqIGV4YW1wbGUsIHRoZSBmc2V2ZW50cyBwYWNrYWdlIGNvbnRhaW5zIGEgbmF0aXZlIGV4dGVuc2lvbiwgd2hpY2ggZXNidWlsZFxuICAgKiBkb2Vzbid0IHN1cHBvcnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICByZWFkb25seSBleHRlcm5hbHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSW5jbHVkZSBhIHNvdXJjZSBtYXAgaW4gdGhlIGJ1bmRsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZW1hcD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluIGFkZGl0aW9uIHRvIHRoZSBgYnVuZGxlOnh5emAgdGFzaywgY3JlYXRlcyBgYnVuZGxlOnh5ejp3YXRjaGAgdGFzayB3aGljaCB3aWxsXG4gICAqIGludm9rZSB0aGUgc2FtZSBlc2J1aWxkIGNvbW1hbmQgd2l0aCB0aGUgYC0td2F0Y2hgIGZsYWcuIFRoaXMgY2FuIGJlIHVzZWRcbiAgICogdG8gY29udGludXNvdWx5IHdhdGNoIGZvciBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB3YXRjaFRhc2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBhZGRCdW5kbGUoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQnVuZGxlT3B0aW9ucyBleHRlbmRzIEJ1bmRsaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBlc2J1aWxkIHRhcmdldC5cbiAgICpcbiAgICogQGV4YW1wbGUgXCJub2RlMTJcIlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGVzYnVpbGQgcGxhdGZvcm0uXG4gICAqXG4gICAqIEBleGFtcGxlIFwibm9kZVwiXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdW5kbGVyIG91dHB1dCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBhc3NldCdzIG91dHB1dCBkaXJlY3RvcnkuXG4gICAqIEBkZWZhdWx0IFwiaW5kZXguanNcIlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0ZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWFyayB0aGUgb3V0cHV0IGZpbGUgYXMgZXhlY3V0YWJsZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgdHNjb25maWcuanNvbiBmaWxlIHRvIHVzZSBmb3IgYnVuZGxpbmdcbiAgICogQGRlZmF1bHQgXCJ0c2NvbmZpZy5qc29uXCJcbiAgICovXG4gIHJlYWRvbmx5IHRzY29uZmlnUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogTWFwIG9mIGZpbGUgZXh0ZW5zaW9ucyAod2l0aG91dCBkb3QpIGFuZCBsb2FkZXJzIHRvIHVzZSBmb3IgdGhpcyBmaWxlIHR5cGUuXG4gICAqIExvYWRlcnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBlc2J1aWxkIGNvbW1hbmQgYnkgYC0tbG9hZGVyOi5leHRlbnNpb249bG9hZGVyYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIE91dHB1dCBmb3JtYXQgZm9yIHRoZSBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBmaWxlcy4gVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSBwb3NzaWJsZSB2YWx1ZXMgdGhhdCBjYW4gYmUgY29uZmlndXJlZDogYFwiaWlmZVwiYCwgYFwiY2pzXCJgLCBhbmQgYFwiZXNtXCJgLlxuICAgKlxuICAgKiBJZiBub3Qgc2V0IChgdW5kZWZpbmVkYCksIGVzYnVpbGQgcGlja3MgYW4gb3V0cHV0IGZvcm1hdCBmb3IgeW91IGJhc2VkIG9uIGBwbGF0Zm9ybWA6XG4gICAqIC0gYFwiY2pzXCJgIGlmIGBwbGF0Zm9ybWAgaXMgYFwibm9kZVwiYFxuICAgKiAtIGBcImlpZmVcImAgaWYgYHBsYXRmb3JtYCBpcyBgXCJicm93c2VyXCJgXG4gICAqIC0gYFwiZXNtXCJgIGlmIGBwbGF0Zm9ybWAgaXMgYFwibmV1dHJhbFwiYFxuICAgKlxuICAgKiBOb3RlOiBJZiBtYWtpbmcgYSBidW5kbGUgdG8gcnVuIHVuZGVyIG5vZGUgd2l0aCBFU00sIHNldCBgZm9ybWF0YCB0byBgXCJlc21cImAgaW5zdGVhZCBvZiBzZXR0aW5nIGBwbGF0Zm9ybWAgdG8gYFwibmV1dHJhbFwiYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9lc2J1aWxkLmdpdGh1Yi5pby9hcGkvI2Zvcm1hdFxuICAgKi9cblxuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbWluaWZ5IGZpbGVzIHdoZW4gYnVuZGxpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBtaW5pZnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTb3VyY2UgbWFwIG1vZGUgdG8gYmUgdXNlZCB3aGVuIGJ1bmRsaW5nLlxuICAgKiBAc2VlIGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyNzb3VyY2VtYXBcbiAgICpcbiAgICogQGRlZmF1bHQgU291cmNlTWFwTW9kZS5ERUZBVUxUXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VNYXBNb2RlPzogU291cmNlTWFwTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGluIHNvdXJjZSBtYXBzIHdoZW4gYnVuZGxpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9lc2J1aWxkLmdpdGh1Yi5pby9hcGkvI3NvdXJjZXMtY29udGVudFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VzQ29udGVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExvZyBsZXZlbCBmb3IgZXNidWlsZC4gVGhpcyBpcyBhbHNvIHByb3BhZ2F0ZWQgdG8gdGhlIHBhY2thZ2UgbWFuYWdlciBhbmRcbiAgICogYXBwbGllcyB0byBpdHMgc3BlY2lmaWMgaW5zdGFsbCBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBMb2dMZXZlbC5XQVJOSU5HXG4gICAqL1xuICByZWFkb25seSBsb2dMZXZlbD86IEJ1bmRsZUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBgbmFtZWAgdmFsdWVzIGV2ZW4gaW4gbWluaWZpZWQgY29kZS5cbiAgICpcbiAgICogSW4gSmF2YVNjcmlwdCB0aGUgYG5hbWVgIHByb3BlcnR5IG9uIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBkZWZhdWx0cyB0byBhXG4gICAqIG5lYXJieSBpZGVudGlmaWVyIGluIHRoZSBzb3VyY2UgY29kZS5cbiAgICpcbiAgICogSG93ZXZlciwgbWluaWZpY2F0aW9uIHJlbmFtZXMgc3ltYm9scyB0byByZWR1Y2UgY29kZSBzaXplIGFuZCBidW5kbGluZ1xuICAgKiBzb21ldGltZXMgbmVlZCB0byByZW5hbWUgc3ltYm9scyB0byBhdm9pZCBjb2xsaXNpb25zLiBUaGF0IGNoYW5nZXMgdmFsdWUgb2ZcbiAgICogdGhlIGBuYW1lYCBwcm9wZXJ0eSBmb3IgbWFueSBvZiB0aGVzZSBjYXNlcy4gVGhpcyBpcyB1c3VhbGx5IGZpbmUgYmVjYXVzZVxuICAgKiB0aGUgYG5hbWVgIHByb3BlcnR5IGlzIG5vcm1hbGx5IG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nLiBIb3dldmVyLCBzb21lXG4gICAqIGZyYW1ld29ya3MgcmVseSBvbiB0aGUgYG5hbWVgIHByb3BlcnR5IGZvciByZWdpc3RyYXRpb24gYW5kIGJpbmRpbmcgcHVycG9zZXMuXG4gICAqIElmIHRoaXMgaXMgdGhlIGNhc2UsIHlvdSBjYW4gZW5hYmxlIHRoaXMgb3B0aW9uIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbFxuICAgKiBgbmFtZWAgdmFsdWVzIGV2ZW4gaW4gbWluaWZpZWQgY29kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGtlZXBOYW1lcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoaXMgb3B0aW9uIHRlbGxzIGVzYnVpbGQgdG8gd3JpdGUgb3V0IGEgSlNPTiBmaWxlIHJlbGF0aXZlIHRvIG91dHB1dCBkaXJlY3Rvcnkgd2l0aCBtZXRhZGF0YSBhYm91dCB0aGUgYnVpbGQuXG4gICAqXG4gICAqIFRoZSBtZXRhZGF0YSBpbiB0aGlzIEpTT04gZmlsZSBmb2xsb3dzIHRoaXMgc2NoZW1hIChzcGVjaWZpZWQgdXNpbmcgVHlwZVNjcmlwdCBzeW50YXgpOlxuICAgKlxuICAgKiBgYGB0ZXh0XG4gICAqIHtcbiAgICogICBvdXRwdXRzOiB7XG4gICAqICAgICBbcGF0aDogc3RyaW5nXToge1xuICAgKiAgICAgICBieXRlczogbnVtYmVyXG4gICAqICAgICAgIGlucHV0czoge1xuICAgKiAgICAgICAgIFtwYXRoOiBzdHJpbmddOiB7IGJ5dGVzSW5PdXRwdXQ6IG51bWJlciB9XG4gICAqICAgICAgIH1cbiAgICogICAgICAgaW1wb3J0czogeyBwYXRoOiBzdHJpbmcgfVtdXG4gICAqICAgICAgIGV4cG9ydHM6IHN0cmluZ1tdXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBUaGlzIGRhdGEgY2FuIHRoZW4gYmUgYW5hbHl6ZWQgYnkgb3RoZXIgdG9vbHMuIEZvciBleGFtcGxlLFxuICAgKiBidW5kbGUgYnVkZHkgY2FuIGNvbnN1bWUgZXNidWlsZCdzIG1ldGFkYXRhIGZvcm1hdCBhbmQgZ2VuZXJhdGVzIGEgdHJlZW1hcCB2aXN1YWxpemF0aW9uXG4gICAqIG9mIHRoZSBtb2R1bGVzIGluIHlvdXIgYnVuZGxlIGFuZCBob3cgbXVjaCBzcGFjZSBlYWNoIG9uZSB0YWtlcyB1cC5cbiAgICogQHNlZSBodHRwczovL2VzYnVpbGQuZ2l0aHViLmlvL2FwaS8jbWV0YWZpbGVcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFmaWxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlIHRoaXMgdG8gaW5zZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBmaWxlcy5cbiAgICpcbiAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGZvb3RlciB3aGljaCBpbnNlcnRzIGF0IHRoZSBlbmQgaW5zdGVhZCBvZiB0aGUgYmVnaW5uaW5nLlxuICAgKlxuICAgKiBUaGlzIGlzIGNvbW1vbmx5IHVzZWQgdG8gaW5zZXJ0IGNvbW1lbnRzOlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbW1lbnRzIGFyZSBwYXNzZWRcbiAgICovXG4gIHJlYWRvbmx5IGJhbm5lcj86IHN0cmluZztcblxuICAvKipcbiAgICogVXNlIHRoaXMgdG8gaW5zZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgYXQgdGhlIGVuZCBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBmaWxlcy5cbiAgICpcbiAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGJhbm5lciB3aGljaCBpbnNlcnRzIGF0IHRoZSBiZWdpbm5pbmcgaW5zdGVhZCBvZiB0aGUgZW5kLlxuICAgKlxuICAgKiBUaGlzIGlzIGNvbW1vbmx5IHVzZWQgdG8gaW5zZXJ0IGNvbW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29tbWVudHMgYXJlIHBhc3NlZFxuICAgKi9cbiAgcmVhZG9ubHkgZm9vdGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhcnNldCB0byB1c2UgZm9yIGVzYnVpbGQncyBvdXRwdXQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgZXNidWlsZCdzIG91dHB1dCBpcyBBU0NJSS1vbmx5LiBBbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWRcbiAgICogdXNpbmcgYmFja3NsYXNoIGVzY2FwZSBzZXF1ZW5jZXMuIFVzaW5nIGVzY2FwZSBzZXF1ZW5jZXMgbWFrZXMgdGhlIGdlbmVyYXRlZCBvdXRwdXRcbiAgICogc2xpZ2h0bHkgYmlnZ2VyLCBhbmQgYWxzbyBtYWtlcyBpdCBoYXJkZXIgdG8gcmVhZC4gSWYgeW91IHdvdWxkIGxpa2UgZm9yIGVzYnVpbGQgdG8gcHJpbnRcbiAgICogdGhlIG9yaWdpbmFsIGNoYXJhY3RlcnMgd2l0aG91dCB1c2luZyBlc2NhcGUgc2VxdWVuY2VzLCB1c2UgYENoYXJzZXQuVVRGOGAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9lc2J1aWxkLmdpdGh1Yi5pby9hcGkvI2NoYXJzZXRcbiAgICogQGRlZmF1bHQgQ2hhcnNldC5BU0NJSVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhcnNldD86IENoYXJzZXQ7XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZ2xvYmFsIGlkZW50aWZpZXJzIHdpdGggY29uc3RhbnQgZXhwcmVzc2lvbnMuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBgeyAncHJvY2Vzcy5lbnYuREVCVUcnOiAndHJ1ZScgfWAuXG4gICAqXG4gICAqIEFub3RoZXIgZXhhbXBsZSwgYHsgJ3Byb2Nlc3MuZW52LkFQSV9LRVknOiBKU09OLnN0cmluZ2lmeSgneHh4LXh4eHgteHh4JykgfWAuXG4gICAqXG4gICAqIEVhY2ggZW50cnkgaXMgcGFzc2VkIHRvIGVzYnVpbGQgYXMgYSBzaW5nbGUgYC0tZGVmaW5lOmAgYXJndW1lbnQsIGV4YWN0bHkgYXNcbiAgICogZ2l2ZW46IG5vIHNoZWxsIHBhcnNlcyBpdCwgc28gdmFsdWVzIGFyZSBub3QgdW5xdW90ZWQgYWxvbmcgdGhlIHdheSBhbmQgYVxuICAgKiBzdHJpbmcgcmVwbGFjZW1lbnQga2VlcHMgdGhlIHF1b3RlcyBpdCBuZWVkcyAoYEpTT04uc3RyaW5naWZ5KCd4eHgnKWApLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHJlcGxhY2VtZW50cyBhcmUgbWFkZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVmaW5lPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQnVpbGQgYXJndW1lbnRzIHRvIHBhc3MgaW50byBlc2J1aWxkLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIHRoZSBbLS1sb2ctbGltaXRdKGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyNsb2ctbGltaXQpIGZsYWc6XG4gICAqXG4gICAqIGBgYHRleHRcbiAgICogcHJvamVjdC5idW5kbGVyLmFkZEJ1bmRsZShcIi4vc3JjL2hlbGxvLnRzXCIsIHtcbiAgICogICBwbGF0Zm9ybTogXCJub2RlXCIsXG4gICAqICAgdGFyZ2V0OiBcIm5vZGUyMlwiLFxuICAgKiAgIHNvdXJjZW1hcDogdHJ1ZSxcbiAgICogICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAqICAgZXNidWlsZEFyZ3M6IHtcbiAgICogICAgIFwiLS1sb2ctbGltaXRcIjogXCIwXCIsXG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBFYWNoIGVudHJ5IGlzIHBhc3NlZCB0byBlc2J1aWxkIGFzIGEgc2luZ2xlIGFyZ3VtZW50LCBleGFjdGx5IGFzIGdpdmVuOiBub1xuICAgKiBzaGVsbCBwYXJzZXMgaXQsIHNvIHZhbHVlcyBtdXN0IG5vdCBiZSBxdW90ZWQgKGEgdmFsdWUgY29udGFpbmluZyBzcGFjZXMgaXNcbiAgICogcGFzc2VkIHRocm91Z2ggYXMgb25lIGFyZ3VtZW50IG9uIGl0cyBvd24pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgZXNidWlsZCBhcmd1bWVudHMgYXJlIHBhc3NlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXNidWlsZEFyZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW4gfTtcblxuICAvKipcbiAgICogSG93IHRvIGRldGVybWluZSB0aGUgZW50cnkgcG9pbnQgZm9yIG1vZHVsZXMuXG4gICAqIFRyeSBbJ21vZHVsZScsICdtYWluJ10gdG8gZGVmYXVsdCB0byBFUyBtb2R1bGUgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICByZWFkb25seSBtYWluRmllbGRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gYXV0b21hdGljYWxseSByZXBsYWNlIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggYW5cbiAgICogaW1wb3J0IGZyb20gYW5vdGhlciBmaWxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyNpbmplY3RcbiAgICogQGRlZmF1bHQgLSBubyBjb2RlIGlzIGluamVjdGVkXG4gICAqL1xuICByZWFkb25seSBpbmplY3Q/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBCdW5kbGVyT3B0aW9ucy5ydW5CdW5kbGVUYXNrXG4gKi9cbmV4cG9ydCBlbnVtIFJ1bkJ1bmRsZVRhc2sge1xuICAvKipcbiAgICogRG9uJ3QgYnVuZGxlIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiB0aGUgYnVpbGQuXG4gICAqL1xuICBNQU5VQUwgPSBcIm1hbnVhbFwiLFxuICAvKipcbiAgICogQnVuZGxlIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGNvbXBpbGF0aW9uLlxuICAgKi9cbiAgUFJFX0NPTVBJTEUgPSBcInByZV9jb21waWxlXCIsXG4gIC8qKlxuICAgKiBCdW5kbGUgYXV0b21hdGljYWxseSBhZnRlciBjb21waWxhdGlvbi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG9cbiAgICogYnVuZGxlIHRoZSBjb21waWxlZCByZXN1bHRzLlxuICAgKlxuICAgKiBUaHVzIHdpbGwgcnVuIGNvbXBpbGF0aW9uIHRhc2tzICh1c2luZyB0c2MsIGV0Yy4pIGJlZm9yZSBydW5uaW5nIGZpbGVcbiAgICogdGhyb3VnaCBidW5kbGluZyBzdGVwLlxuICAgKlxuICAgKiBUaGlzIGlzIG9ubHkgcmVxdWlyZWQgdW5sZXNzIHlvdSBhcmUgdXNpbmcgbmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlcyB0aGF0XG4gICAqIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGBlc2J1aWxkYCBidXQgYXJlIHN1cHBvcnRlZCBieSB0eXBlc2NyaXB0J3MgYHRzY2BcbiAgICogY29tcGlsZXIuIE9uZSBleGFtcGxlIG9mIHN1Y2ggZmVhdHVyZSBpcyBgZW1pdERlY29yYXRvck1ldGFkYXRhYC5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBJbiBhIFR5cGVTY3JpcHQgcHJvamVjdCB3aXRoIG91dHB1dCBjb25maWd1cmVkXG4gICAqIC8vIHRvIGdvIHRvIHRoZSBcImxpYlwiIGRpcmVjdG9yeTpcbiAgICogY29uc3QgcHJvamVjdCA9IG5ldyBUeXBlU2NyaXB0UHJvamVjdCh7XG4gICAqICAgbmFtZTogXCJ0ZXN0XCIsXG4gICAqICAgdHNjb25maWc6IHtcbiAgICogICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgKiAgICAgICBvdXREaXI6IFwibGliXCIsXG4gICAqICAgICB9LFxuICAgKiAgIH0sXG4gICAqICAgYnVuZGxlck9wdGlvbnM6IHtcbiAgICogICAgIC8vIGVuc3VyZSB3ZSBjb21waWxlIHdpdGggYHRzY2AgYmVmb3JlIGJ1bmRsaW5nXG4gICAqICAgICBydW5CdW5kbGVUYXNrOiBSdW5CdW5kbGVUYXNrLlBPU1RfQ09NUElMRSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gVGVsbCB0aGUgYnVuZGxlciB0byBidW5kbGUgdGhlIGNvbXBpbGVkIHJlc3VsdHMgKGZyb20gdGhlIFwibGliXCIgZGlyZWN0b3J5KVxuICAgKiBwcm9qZWN0LmJ1bmRsZXIuYWRkQnVuZGxlKFwiLi9saWIvaW5kZXguanNcIiwge1xuICAgKiAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICogICB0YXJnZXQ6IFwibm9kZTIyXCIsXG4gICAqICAgc291cmNlbWFwOiBmYWxzZSxcbiAgICogICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICoqL1xuICBQT1NUX0NPTVBJTEUgPSBcInBvc3RfY29tcGlsZVwiLFxufVxuXG4vKipcbiAqIFNvdXJjZU1hcCBtb2RlIGZvciBlc2J1aWxkXG4gKiBAc2VlIGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyNzb3VyY2VtYXBcbiAqL1xuZXhwb3J0IGVudW0gU291cmNlTWFwTW9kZSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHNvdXJjZU1hcCBtb2RlIC0gd2lsbCBnZW5lcmF0ZSBhIC5qcy5tYXAgZmlsZSBhbG9uZ3NpZGUgYW55IGdlbmVyYXRlZCAuanMgZmlsZSBhbmQgYWRkIGEgc3BlY2lhbCAvLyMgc291cmNlTWFwcGluZ1VSTD1cbiAgICogY29tbWVudCB0byB0aGUgYm90dG9tIG9mIHRoZSAuanMgZmlsZSBwb2ludGluZyB0byB0aGUgLmpzLm1hcCBmaWxlXG4gICAqL1xuICBERUZBVUxUID0gXCJkZWZhdWx0XCIsXG4gIC8qKlxuICAgKiAgRXh0ZXJuYWwgc291cmNlTWFwIG1vZGUgLSBJZiB5b3Ugd2FudCB0byBvbWl0IHRoZSBzcGVjaWFsIC8vIyBzb3VyY2VNYXBwaW5nVVJMPSBjb21tZW50IGZyb20gdGhlIGdlbmVyYXRlZCAuanMgZmlsZSBidXQgeW91IHN0aWxsXG4gICAqICB3YW50IHRvIGdlbmVyYXRlIHRoZSAuanMubWFwIGZpbGVzXG4gICAqL1xuICBFWFRFUk5BTCA9IFwiZXh0ZXJuYWxcIixcbiAgLyoqXG4gICAqIElubGluZSBzb3VyY2VNYXAgbW9kZSAtIElmIHlvdSB3YW50IHRvIGluc2VydCB0aGUgZW50aXJlIHNvdXJjZSBtYXAgaW50byB0aGUgLmpzIGZpbGUgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgc2VwYXJhdGUgLmpzLm1hcCBmaWxlXG4gICAqL1xuICBJTkxJTkUgPSBcImlubGluZVwiLFxuICAvKipcbiAgICogQm90aCBzb3VyY2VNYXAgbW9kZSAtIElmIHlvdSB3YW50IHRvIGhhdmUgdGhlIGVmZmVjdCBvZiBib3RoIGlubGluZSBhbmQgZXh0ZXJuYWwgc2ltdWx0YW5lb3VzbHlcbiAgICovXG4gIEJPVEggPSBcImJvdGhcIixcbn1cblxuLyoqXG4gKiBDaGFyc2V0IGZvciBlc2J1aWxkJ3Mgb3V0cHV0XG4gKi9cbmV4cG9ydCBlbnVtIENoYXJzZXQge1xuICAvKipcbiAgICogQVNDSUlcbiAgICpcbiAgICogQW55IG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGJhY2tzbGFzaCBlc2NhcGUgc2VxdWVuY2VzXG4gICAqL1xuICBBU0NJSSA9IFwiYXNjaWlcIixcblxuICAvKipcbiAgICogVVRGLThcbiAgICpcbiAgICogS2VlcCBvcmlnaW5hbCBjaGFyYWN0ZXJzIHdpdGhvdXQgdXNpbmcgZXNjYXBlIHNlcXVlbmNlc1xuICAgKi9cbiAgVVRGOCA9IFwidXRmOFwiLFxufVxuXG4vKipcbiAqIExvZyBsZXZlbHMgZm9yIGVzYnVpbGQgYW5kIHBhY2thZ2UgbWFuYWdlcnMnIGluc3RhbGwgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBlbnVtIEJ1bmRsZUxvZ0xldmVsIHtcbiAgLyoqIFNob3cgZXZlcnl0aGluZyAqL1xuICBWRVJCT1NFID0gXCJ2ZXJib3NlXCIsXG4gIC8qKiBTaG93IGV2ZXJ5dGhpbmcgZnJvbSBpbmZvIGFuZCBzb21lIGFkZGl0aW9uYWwgbWVzc2FnZXMgZm9yIGRlYnVnZ2luZyAqL1xuICBERUJVRyA9IFwiZGVidWdcIixcbiAgLyoqIFNob3cgd2FybmluZ3MsIGVycm9ycywgYW5kIGFuIG91dHB1dCBmaWxlIHN1bW1hcnkgKi9cbiAgSU5GTyA9IFwiaW5mb1wiLFxuICAvKiogU2hvdyB3YXJuaW5ncyBhbmQgZXJyb3JzICovXG4gIFdBUk5JTkcgPSBcIndhcm5pbmdcIixcbiAgLyoqIFNob3cgZXJyb3JzIG9ubHkgKi9cbiAgRVJST1IgPSBcImVycm9yXCIsXG4gIC8qKiBTaG93IG5vdGhpbmcgKi9cbiAgU0lMRU5UID0gXCJzaWxlbnRcIixcbn1cbiJdfQ==