turbo-gulp
Version:
Gulp tasks to boost high-quality projects.
117 lines (115 loc) • 14.5 kB
JavaScript
;
/**
* This module defines the tasks to create webpack bundles.
*
* @module task-generators/build-webpack
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
}
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
}
Object.defineProperty(exports, "__esModule", { value: true });
/** (Placeholder comment, see christopherthielen/typedoc-plugin-external-module-name#6) */
const fancy_log_1 = __importDefault(require("fancy-log"));
const minimatch_1 = require("minimatch");
const path_1 = require("path");
const plugin_error_1 = __importDefault(require("plugin-error"));
const webpack_1 = __importDefault(require("webpack"));
const webpack_merge_1 = __importDefault(require("webpack-merge"));
const webpack_stream_1 = __importDefault(require("webpack-stream"));
const matcher = __importStar(require("../utils/matcher"));
/**
* Return the canonical name of the build-webpack task according to the target name.
*
* @param targetName Current target name
* @returns {string} The canonical of the build-webpack task for the provided target
*/
function getTaskName(targetName) {
return `${targetName}:build:webpack`;
}
exports.getTaskName = getTaskName;
function generateTask(gulp, options) {
const entryFile = options.entry + ".js";
let curWebpack = webpack_1.default;
let userConfiguration = {};
if (options.webpackOptions !== undefined) {
if (options.webpackOptions.webpack !== undefined) {
curWebpack = options.webpackOptions.webpack;
}
if (options.webpackOptions.configuration !== undefined) {
userConfiguration = options.webpackOptions.configuration;
}
}
const angularWebpackConfig = {
context: path_1.resolve(options.projectRoot),
target: "web",
resolve: {
extensions: [".js", ".json"],
},
module: {
loaders: [
{
test: /\.component\.js$/,
loaders: ["angular2-template-loader"],
include: [path_1.resolve(options.srcDir)],
},
{
test: /\.json$/,
loaders: ["json-loader"],
},
{
test: /\.(html|css)$/,
loaders: ["raw-loader"],
},
],
},
plugins: [
new curWebpack.ContextReplacementPlugin(
// The (\\|\/) piece accounts for path separators in posix and Windows
/angular(\\|\/)core(\\|\/)src(\\|\/)linker/, path_1.resolve(options.srcDir), {}),
],
node: {
global: true,
__dirname: true,
__filename: true,
process: true,
Buffer: true,
},
devtool: "inline-source-map",
output: {
filename: "[name].js",
},
};
const task = function () {
return gulp
.src([path_1.posix.join(options.srcDir, entryFile)], { base: options.srcDir })
.pipe(webpack_stream_1.default(
// TODO: Remove `as any` once webpackMerge's typing support the latest version of Webpack (with `EntryFunc`)
webpack_merge_1.default(angularWebpackConfig, userConfiguration),
// TODO: Remove `as any` once gulpWebpack's typing support the latest version of Webpack (with `EntryFunc`)
curWebpack, (err, stats) => {
// TODO: Check if err is `null` or `undefined` (success) and type properly
if (err) {
throw new plugin_error_1.default("_build:webpack", err);
}
fancy_log_1.default("[_build:webpack]", stats.toString({ colors: true }));
}))
.pipe(gulp.dest(options.buildDir));
};
task.displayName = "_build:webpack";
return task;
}
exports.generateTask = generateTask;
function watch(gulp, options) {
const buildTask = generateTask(gulp, options);
const sources = matcher.asString(matcher.join(options.srcDir, new minimatch_1.Minimatch("**/*")));
return gulp.watch(sources, { cwd: options.srcDir }, buildTask);
}
exports.watch = watch;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2stZ2VuZXJhdG9ycy9idWlsZC13ZWJwYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7Ozs7Ozs7Ozs7QUFFSCwwRkFBMEY7QUFFMUYsMERBQWlDO0FBR2pDLHlDQUFzQztBQUN0QywrQkFBZ0U7QUFDaEUsZ0VBQXVDO0FBQ3ZDLHNEQUE4QjtBQUM5QixrRUFBeUM7QUFDekMsb0VBQTJDO0FBRTNDLDBEQUE0QztBQW9DNUM7Ozs7O0dBS0c7QUFDSCxxQkFBNEIsVUFBa0I7SUFDNUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxnQkFBZ0IsQ0FBQztBQUN2QyxDQUFDO0FBRkQsa0NBRUM7QUFFRCxzQkFBNkIsSUFBVSxFQUFFLE9BQWdCO0lBQ3ZELE1BQU0sU0FBUyxHQUFXLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2hELElBQUksVUFBVSxHQUFtQixpQkFBTyxDQUFDO0lBQ3pDLElBQUksaUJBQWlCLEdBQTBCLEVBQUUsQ0FBQztJQUNsRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDOUMsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLG9CQUFvQixHQUEwQjtRQUNsRCxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDNUMsTUFBTSxFQUFFLEtBQUs7UUFDYixPQUFPLEVBQUU7WUFDUCxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1NBQzdCO1FBQ0QsTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxrQkFBa0I7b0JBQ3hCLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixDQUFDO29CQUNyQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUMxQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsU0FBUztvQkFDZixPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUM7aUJBQ3pCO2dCQUNEO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3hCO2FBQ0Y7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUksVUFBVSxDQUFDLHdCQUF3QjtZQUNyQyxzRUFBc0U7WUFDdEUsMkNBQTJDLEVBQzNDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQzlCLEVBQUUsQ0FDSDtTQVFGO1FBQ0QsSUFBSSxFQUFFO1lBQ0osTUFBTSxFQUFFLElBQUk7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLElBQUk7U0FDYjtRQUNELE9BQU8sRUFBRSxtQkFBbUI7UUFDNUIsTUFBTSxFQUFFO1lBQ04sUUFBUSxFQUFFLFdBQVc7U0FDdEI7S0FDRixDQUFDO0lBRUYsTUFBTSxJQUFJLEdBQWlCO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJO2FBQ1IsR0FBRyxDQUFDLENBQUMsWUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBQyxDQUFDO2FBQ25FLElBQUksQ0FBQyx3QkFBYTtRQUNqQiw0R0FBNEc7UUFDNUcsdUJBQVksQ0FBQyxvQkFBMkIsRUFBRSxpQkFBd0IsQ0FBQztRQUNuRSwyR0FBMkc7UUFDM0csVUFBaUIsRUFDakIsQ0FBQyxHQUFVLEVBQUUsS0FBb0IsRUFBUSxFQUFFO1lBQ3pDLDBFQUEwRTtZQUMxRSxFQUFFLENBQUMsQ0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNkLE1BQU0sSUFBSSxzQkFBVyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxtQkFBUSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUNIO2FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQztJQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQXBGRCxvQ0FvRkM7QUFFRCxlQUFzQixJQUFVLEVBQUUsT0FBZ0I7SUFDaEQsTUFBTSxTQUFTLEdBQWlCLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsTUFBTSxPQUFPLEdBQVcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBQyxFQUFFLFNBQVMsQ0FBYyxDQUFDO0FBQzVFLENBQUM7QUFKRCxzQkFJQyIsImZpbGUiOiJ0YXNrLWdlbmVyYXRvcnMvYnVpbGQtd2VicGFjay5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgdGFza3MgdG8gY3JlYXRlIHdlYnBhY2sgYnVuZGxlcy5cbiAqXG4gKiBAbW9kdWxlIHRhc2stZ2VuZXJhdG9ycy9idWlsZC13ZWJwYWNrXG4gKi9cblxuLyoqIChQbGFjZWhvbGRlciBjb21tZW50LCBzZWUgY2hyaXN0b3BoZXJ0aGllbGVuL3R5cGVkb2MtcGx1Z2luLWV4dGVybmFsLW1vZHVsZS1uYW1lIzYpICovXG5cbmltcG9ydCBmYW5jeUxvZyBmcm9tIFwiZmFuY3ktbG9nXCI7XG5pbXBvcnQgeyBGU1dhdGNoZXIgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IEd1bHAgfSBmcm9tIFwiZ3VscFwiO1xuaW1wb3J0IHsgTWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHsgcG9zaXggYXMgcGF0aCwgcmVzb2x2ZSBhcyBzeXNSZXNvbHZlUGF0aCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgUGx1Z2luRXJyb3IgZnJvbSBcInBsdWdpbi1lcnJvclwiO1xuaW1wb3J0IHdlYnBhY2sgZnJvbSBcIndlYnBhY2tcIjtcbmltcG9ydCB3ZWJwYWNrTWVyZ2UgZnJvbSBcIndlYnBhY2stbWVyZ2VcIjtcbmltcG9ydCB3ZWJwYWNrU3RyZWFtIGZyb20gXCJ3ZWJwYWNrLXN0cmVhbVwiO1xuaW1wb3J0IHsgVGFza0Z1bmN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL2d1bHAtdGFzay1mdW5jdGlvblwiO1xuaW1wb3J0ICogYXMgbWF0Y2hlciBmcm9tIFwiLi4vdXRpbHMvbWF0Y2hlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICAvKipcbiAgICogUm9vdCBvZiB0aGUgbWFpbiBwcm9qZWN0ICh3aXRoIHBhY2thZ2UuanNvbilcbiAgICovXG4gIHByb2plY3RSb290OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKUyBzb3VyY2VzLlxuICAgKi9cbiAgc3JjRGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpcmVjdG9yeSB3ZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBwaXBlZFxuICAgKi9cbiAgYnVpbGREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogRW50cnkgbW9kdWxlLCByZWxhdGl2ZSB0byBganNTcmNEaXJgXG4gICAqL1xuICBlbnRyeTogc3RyaW5nO1xuXG4gIHdlYnBhY2tPcHRpb25zPzoge1xuICAgIC8qKlxuICAgICAqIFdlYnBhY2sgb2JqZWN0IHRvIHVzZVxuICAgICAqL1xuICAgIHdlYnBhY2s/OiB0eXBlb2Ygd2VicGFjaztcblxuICAgIC8qKlxuICAgICAqIEN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB3ZWJwYWNrIGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBjb25maWd1cmF0aW9uPzogd2VicGFjay5Db25maWd1cmF0aW9uO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGJ1aWxkLXdlYnBhY2sgdGFzayBhY2NvcmRpbmcgdG8gdGhlIHRhcmdldCBuYW1lLlxuICpcbiAqIEBwYXJhbSB0YXJnZXROYW1lIEN1cnJlbnQgdGFyZ2V0IG5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgb2YgdGhlIGJ1aWxkLXdlYnBhY2sgdGFzayBmb3IgdGhlIHByb3ZpZGVkIHRhcmdldFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFza05hbWUodGFyZ2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3RhcmdldE5hbWV9OmJ1aWxkOndlYnBhY2tgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUYXNrKGd1bHA6IEd1bHAsIG9wdGlvbnM6IE9wdGlvbnMpOiBUYXNrRnVuY3Rpb24ge1xuICBjb25zdCBlbnRyeUZpbGU6IHN0cmluZyA9IG9wdGlvbnMuZW50cnkgKyBcIi5qc1wiO1xuICBsZXQgY3VyV2VicGFjazogdHlwZW9mIHdlYnBhY2sgPSB3ZWJwYWNrO1xuICBsZXQgdXNlckNvbmZpZ3VyYXRpb246IHdlYnBhY2suQ29uZmlndXJhdGlvbiA9IHt9O1xuICBpZiAob3B0aW9ucy53ZWJwYWNrT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMud2VicGFja09wdGlvbnMud2VicGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdXJXZWJwYWNrID0gb3B0aW9ucy53ZWJwYWNrT3B0aW9ucy53ZWJwYWNrO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy53ZWJwYWNrT3B0aW9ucy5jb25maWd1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVzZXJDb25maWd1cmF0aW9uID0gb3B0aW9ucy53ZWJwYWNrT3B0aW9ucy5jb25maWd1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFuZ3VsYXJXZWJwYWNrQ29uZmlnOiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgY29udGV4dDogc3lzUmVzb2x2ZVBhdGgob3B0aW9ucy5wcm9qZWN0Um9vdCksXG4gICAgdGFyZ2V0OiBcIndlYlwiLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGV4dGVuc2lvbnM6IFtcIi5qc1wiLCBcIi5qc29uXCJdLFxuICAgIH0sXG4gICAgbW9kdWxlOiB7XG4gICAgICBsb2FkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuY29tcG9uZW50XFwuanMkLyxcbiAgICAgICAgICBsb2FkZXJzOiBbXCJhbmd1bGFyMi10ZW1wbGF0ZS1sb2FkZXJcIl0sXG4gICAgICAgICAgaW5jbHVkZTogW3N5c1Jlc29sdmVQYXRoKG9wdGlvbnMuc3JjRGlyKV0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuanNvbiQvLFxuICAgICAgICAgIGxvYWRlcnM6IFtcImpzb24tbG9hZGVyXCJdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogL1xcLihodG1sfGNzcykkLyxcbiAgICAgICAgICBsb2FkZXJzOiBbXCJyYXctbG9hZGVyXCJdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIG5ldyBjdXJXZWJwYWNrLkNvbnRleHRSZXBsYWNlbWVudFBsdWdpbihcbiAgICAgICAgLy8gVGhlIChcXFxcfFxcLykgcGllY2UgYWNjb3VudHMgZm9yIHBhdGggc2VwYXJhdG9ycyBpbiBwb3NpeCBhbmQgV2luZG93c1xuICAgICAgICAvYW5ndWxhcihcXFxcfFxcLyljb3JlKFxcXFx8XFwvKXNyYyhcXFxcfFxcLylsaW5rZXIvLFxuICAgICAgICBzeXNSZXNvbHZlUGF0aChvcHRpb25zLnNyY0RpciksXG4gICAgICAgIHt9LFxuICAgICAgKSxcbiAgICAgIC8vIG5ldyB3ZWJwYWNrLkRlZmluZVBsdWdpbih7XG4gICAgICAvLyAgIFwicHJvY2Vzcy5lbnZcIjoge1xuICAgICAgLy8gICAgIFwiTk9ERV9FTlZcIjogSlNPTi5zdHJpbmdpZnkoXCJwcm9kdWN0aW9uXCIpXG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0pLFxuICAgICAgLy8gbmV3IHdlYnBhY2sub3B0aW1pemUuRGVkdXBlUGx1Z2luKCksXG4gICAgICAvLyBuZXcgd2VicGFjay5vcHRpbWl6ZS5VZ2xpZnlKc1BsdWdpbigpXG4gICAgXSxcbiAgICBub2RlOiB7XG4gICAgICBnbG9iYWw6IHRydWUsXG4gICAgICBfX2Rpcm5hbWU6IHRydWUsXG4gICAgICBfX2ZpbGVuYW1lOiB0cnVlLFxuICAgICAgcHJvY2VzczogdHJ1ZSxcbiAgICAgIEJ1ZmZlcjogdHJ1ZSxcbiAgICB9LFxuICAgIGRldnRvb2w6IFwiaW5saW5lLXNvdXJjZS1tYXBcIixcbiAgICBvdXRwdXQ6IHtcbiAgICAgIGZpbGVuYW1lOiBcIltuYW1lXS5qc1wiLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgdGFzazogVGFza0Z1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBndWxwXG4gICAgICAuc3JjKFtwYXRoLmpvaW4ob3B0aW9ucy5zcmNEaXIsIGVudHJ5RmlsZSldLCB7YmFzZTogb3B0aW9ucy5zcmNEaXJ9KVxuICAgICAgLnBpcGUod2VicGFja1N0cmVhbShcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGBhcyBhbnlgIG9uY2Ugd2VicGFja01lcmdlJ3MgdHlwaW5nIHN1cHBvcnQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFdlYnBhY2sgKHdpdGggYEVudHJ5RnVuY2ApXG4gICAgICAgIHdlYnBhY2tNZXJnZShhbmd1bGFyV2VicGFja0NvbmZpZyBhcyBhbnksIHVzZXJDb25maWd1cmF0aW9uIGFzIGFueSksXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBgYXMgYW55YCBvbmNlIGd1bHBXZWJwYWNrJ3MgdHlwaW5nIHN1cHBvcnQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFdlYnBhY2sgKHdpdGggYEVudHJ5RnVuY2ApXG4gICAgICAgIGN1cldlYnBhY2sgYXMgYW55LFxuICAgICAgICAoZXJyOiBFcnJvciwgc3RhdHM6IHdlYnBhY2suU3RhdHMpOiB2b2lkID0+IHtcbiAgICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiBlcnIgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIChzdWNjZXNzKSBhbmQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgIGlmICg8YW55PiBlcnIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQbHVnaW5FcnJvcihcIl9idWlsZDp3ZWJwYWNrXCIsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZhbmN5TG9nKFwiW19idWlsZDp3ZWJwYWNrXVwiLCBzdGF0cy50b1N0cmluZyh7Y29sb3JzOiB0cnVlfSkpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5waXBlKGd1bHAuZGVzdChvcHRpb25zLmJ1aWxkRGlyKSk7XG4gIH07XG4gIHRhc2suZGlzcGxheU5hbWUgPSBcIl9idWlsZDp3ZWJwYWNrXCI7XG4gIHJldHVybiB0YXNrO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2goZ3VscDogR3VscCwgb3B0aW9uczogT3B0aW9ucyk6IEZTV2F0Y2hlciB7XG4gIGNvbnN0IGJ1aWxkVGFzazogVGFza0Z1bmN0aW9uID0gZ2VuZXJhdGVUYXNrKGd1bHAsIG9wdGlvbnMpO1xuICBjb25zdCBzb3VyY2VzOiBzdHJpbmcgPSBtYXRjaGVyLmFzU3RyaW5nKG1hdGNoZXIuam9pbihvcHRpb25zLnNyY0RpciwgbmV3IE1pbmltYXRjaChcIioqLypcIikpKTtcbiAgcmV0dXJuIGd1bHAud2F0Y2goc291cmNlcywge2N3ZDogb3B0aW9ucy5zcmNEaXJ9LCBidWlsZFRhc2spIGFzIEZTV2F0Y2hlcjtcbn1cbiJdLCJzb3VyY2VSb290IjoiLi4ifQ==