"use strict"; var plugins = require("./npmci.plugins"); var NpmciEnv = require("./npmci.env"); var npmci_bash_1 = require("./npmci.bash"); exports.build = function () { var done = plugins.q.defer(); exports.readDockerfiles() .then(exports.sortDockerfiles) .then(exports.mapDockerfiles) .then(exports.buildDockerfiles) .then(function () { done.resolve(); }); return done.promise; }; exports.readDockerfiles = function () { var done = plugins.q.defer(); var readDockerfilesArray = []; plugins.gulp.src("./Dockerfile*") .pipe(plugins.through2.obj(function (file, enc, cb) { var myDockerfile = new Dockerfile({ filePath: file.path, read: true }); readDockerfilesArray.push(myDockerfile); cb(null, file); }, function () { done.resolve(readDockerfilesArray); })); return done.promise; }; exports.sortDockerfiles = function (sortableArrayArg) { var done = plugins.q.defer(); var sortedArray = []; var trackingArray = []; var sorterFunctionCounter = 0; var sorterFunction = function () { sortableArrayArg.forEach(function (dockerfileArg) { var cleanTags = exports.cleanTagsArrayFunction(sortableArrayArg, trackingArray); if (cleanTags.indexOf(dockerfileArg.baseImage) == -1 && trackingArray.indexOf(dockerfileArg) == -1) { sortedArray.push(dockerfileArg); trackingArray.push(dockerfileArg); } else if (cleanTags.indexOf(dockerfileArg.baseImage) != -1) { dockerfileArg.localBaseImageDependent = true; } ; }); if (sortableArrayArg.length == sortedArray.length) { done.resolve(sortedArray); } else if (sorterFunctionCounter < 10) { sorterFunctionCounter++; sorterFunction(); } ; }; sorterFunction(); return done.promise; }; exports.mapDockerfiles = function (sortedArray) { var done = plugins.q.defer(); sortedArray.forEach(function (dockerfileArg) { if (dockerfileArg.localBaseImageDependent) { var dockerfileDependency = void 0; sortedArray.forEach(function (dockfile2) { if (dockfile2.cleanTag == dockerfileArg.baseImage) { dockerfileArg.localBaseDockerfile = dockfile2; } }); } ; }); done.resolve(sortedArray); return done.promise; }; exports.buildDockerfiles = function (sortedArrayArg) { var done = plugins.q.defer(); sortedArrayArg.forEach(function (dockerfileArg) { dockerfileArg.build(); }); done.resolve(); return done.promise; }; var Dockerfile = (function () { function Dockerfile(options) { this.filePath = options.filePath; this.repo = NpmciEnv.repo.user + "/" + NpmciEnv.repo.repo; this.version = exports.dockerFileVersion(plugins.path.parse(options.filePath).base); this.cleanTag = this.repo + ":" + this.version; if (options.filePath && options.read) { this.content = plugins.smartfile.local.toStringSync(plugins.path.resolve(options.filePath)); } ; this.baseImage = exports.dockerBaseImage(this.content); this.localBaseImageDependent = false; } ; Dockerfile.prototype.build = function () { if (!this.buildTag) { this.patchContents(); var tag = exports.dockerTag(this.repo, this.version); npmci_bash_1.bashBare("docker build -t " + tag + " -f " + this.filePath + " ."); this.buildTag = tag; NpmciEnv.dockerFilesBuilt.push(this); this.restoreContents(); } else { plugins.beautylog.error("This Dockerfile has already been built!"); } }; ; Dockerfile.prototype.push = function () { if (this.buildTag) { npmci_bash_1.bashBare("docker push " + this.buildTag); } else { plugins.beautylog.error("Dockerfile hasn't been built yet!"); } }; Dockerfile.prototype.patchContents = function () { }; ; Dockerfile.prototype.restoreContents = function () { }; ; return Dockerfile; }()); exports.Dockerfile = Dockerfile; exports.dockerFileVersion = function (dockerfileNameArg) { var versionString; var versionRegex = /Dockerfile_([a-zA-Z0-9\.]*)$/; var regexResultArray = versionRegex.exec(dockerfileNameArg); if (regexResultArray && regexResultArray.length == 2) { versionString = regexResultArray[1]; } else { versionString = "latest"; } return versionString; }; exports.dockerBaseImage = function (dockerfileContentArg) { var baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n?/; var regexResultArray = baseImageRegex.exec(dockerfileContentArg); return regexResultArray[1]; }; exports.dockerTag = function (repoArg, versionArg) { var tagString; var registry = NpmciEnv.dockerRegistry; if (process.env.CI_BUILD_STAGE == "build" || process.env.CI_BUILD_STAGE == "test") { registry = "registry.gitlab.com"; } var repo = repoArg; var version = versionArg; if (process.env.CI_BUILD_STAGE == "build" || process.env.CI_BUILD_STAGE == "test") { version = version + "_test"; } tagString = registry + "/" + repo + ":" + version; return tagString; }; exports.cleanTagsArrayFunction = function (dockerfileArrayArg, trackingArrayArg) { var cleanTagsArray = []; dockerfileArrayArg.forEach(function (dockerfileArg) { if (trackingArrayArg.indexOf(dockerfileArg) == -1) { cleanTagsArray.push(dockerfileArg.cleanTag); } }); return cleanTagsArray; }; //# sourceMappingURL=data:application/json;charset=utf8;base64,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T0FBTyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRVMsOEJBQXNCLEdBQUcsVUFBUyxrQkFBK0IsRUFBQyxnQkFBNkI7SUFDdEcsSUFBSSxjQUFjLEdBQVksRUFBRSxDQUFDO0lBQ2pDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxVQUFTLGFBQWE7UUFDN0MsRUFBRSxDQUFBLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQztZQUM5QyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQzFCLENBQUMsQ0FBQSIsImZpbGUiOiJucG1jaS5idWlsZC5kb2NrZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gXCIuL25wbWNpLnBsdWdpbnNcIlxyXG5pbXBvcnQgKiBhcyBOcG1jaUVudiBmcm9tIFwiLi9ucG1jaS5lbnZcIjtcclxuaW1wb3J0IHtiYXNoQmFyZX0gZnJvbSBcIi4vbnBtY2kuYmFzaFwiO1xyXG5leHBvcnQgbGV0IGJ1aWxkID0gZnVuY3Rpb24oKXtcclxuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XHJcbiAgICByZWFkRG9ja2VyZmlsZXMoKVxyXG4gICAgICAgIC50aGVuKHNvcnREb2NrZXJmaWxlcylcclxuICAgICAgICAudGhlbihtYXBEb2NrZXJmaWxlcylcclxuICAgICAgICAudGhlbihidWlsZERvY2tlcmZpbGVzKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZG9uZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xyXG59XHJcblxyXG5leHBvcnQgbGV0IHJlYWREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xyXG4gICAgbGV0IHJlYWREb2NrZXJmaWxlc0FycmF5OkRvY2tlcmZpbGVbXSA9IFtdXHJcbiAgICBwbHVnaW5zLmd1bHAuc3JjKFwiLi9Eb2NrZXJmaWxlKlwiKVxyXG4gICAgICAgIC5waXBlKHBsdWdpbnMudGhyb3VnaDIub2JqKGZ1bmN0aW9uKGZpbGUsZW5jLGNiKXtcclxuICAgICAgICAgICAgbGV0IG15RG9ja2VyZmlsZSA9IG5ldyBEb2NrZXJmaWxlKHtcclxuICAgICAgICAgICAgICAgIGZpbGVQYXRoOmZpbGUucGF0aCxcclxuICAgICAgICAgICAgICAgIHJlYWQ6dHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmVhZERvY2tlcmZpbGVzQXJyYXkucHVzaChteURvY2tlcmZpbGUpO1xyXG4gICAgICAgICAgICBjYihudWxsLGZpbGUpO1xyXG4gICAgICAgICB9LGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICBkb25lLnJlc29sdmUocmVhZERvY2tlcmZpbGVzQXJyYXkpO1xyXG4gICAgICAgICB9KSk7XHJcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xyXG59XHJcblxyXG5leHBvcnQgbGV0IHNvcnREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKHNvcnRhYmxlQXJyYXlBcmc6RG9ja2VyZmlsZVtdKXtcclxuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XHJcbiAgICBsZXQgc29ydGVkQXJyYXk6RG9ja2VyZmlsZVtdID0gW107IFxyXG4gICAgbGV0IHRyYWNraW5nQXJyYXk6RG9ja2VyZmlsZVtdID0gW107XHJcbiAgICBsZXQgc29ydGVyRnVuY3Rpb25Db3VudGVyOm51bWJlciA9IDA7XHJcbiAgICBsZXQgc29ydGVyRnVuY3Rpb24gPSBmdW5jdGlvbigpe1xyXG4gICAgICAgIHNvcnRhYmxlQXJyYXlBcmcuZm9yRWFjaCgoZG9ja2VyZmlsZUFyZyk9PntcclxuICAgICAgICAgICAgbGV0IGNsZWFuVGFncyA9IGNsZWFuVGFnc0FycmF5RnVuY3Rpb24oc29ydGFibGVBcnJheUFyZyx0cmFja2luZ0FycmF5KTtcclxuICAgICAgICAgICAgaWYoY2xlYW5UYWdzLmluZGV4T2YoZG9ja2VyZmlsZUFyZy5iYXNlSW1hZ2UpID09IC0xICYmIHRyYWNraW5nQXJyYXkuaW5kZXhPZihkb2NrZXJmaWxlQXJnKSA9PSAtMSl7XHJcbiAgICAgICAgICAgICAgICBzb3J0ZWRBcnJheS5wdXNoKGRvY2tlcmZpbGVBcmcpO1xyXG4gICAgICAgICAgICAgICAgdHJhY2tpbmdBcnJheS5wdXNoKGRvY2tlcmZpbGVBcmcpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYoY2xlYW5UYWdzLmluZGV4T2YoZG9ja2VyZmlsZUFyZy5iYXNlSW1hZ2UpICE9IC0xKXtcclxuICAgICAgICAgICAgICAgIGRvY2tlcmZpbGVBcmcubG9jYWxCYXNlSW1hZ2VEZXBlbmRlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmKHNvcnRhYmxlQXJyYXlBcmcubGVuZ3RoID09IHNvcnRlZEFycmF5Lmxlbmd0aCl7XHJcbiAgICAgICAgICAgIGRvbmUucmVzb2x2ZShzb3J0ZWRBcnJheSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzb3J0ZXJGdW5jdGlvbkNvdW50ZXIgPCAxMCkge1xyXG4gICAgICAgICAgICBzb3J0ZXJGdW5jdGlvbkNvdW50ZXIrKztcclxuICAgICAgICAgICAgc29ydGVyRnVuY3Rpb24oKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc29ydGVyRnVuY3Rpb24oKTtcclxuICAgIHJldHVybiBkb25lLnByb21pc2U7XHJcbn07XHJcblxyXG5leHBvcnQgbGV0IG1hcERvY2tlcmZpbGVzID0gZnVuY3Rpb24oc29ydGVkQXJyYXk6RG9ja2VyZmlsZVtdKXtcclxuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XHJcbiAgICBzb3J0ZWRBcnJheS5mb3JFYWNoKChkb2NrZXJmaWxlQXJnKSA9PiB7XHJcbiAgICAgICAgaWYoZG9ja2VyZmlsZUFyZy5sb2NhbEJhc2VJbWFnZURlcGVuZGVudCl7XHJcbiAgICAgICAgICAgIGxldCBkb2NrZXJmaWxlRGVwZW5kZW5jeTpEb2NrZXJmaWxlO1xyXG4gICAgICAgICAgICBzb3J0ZWRBcnJheS5mb3JFYWNoKChkb2NrZmlsZTI6RG9ja2VyZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZG9ja2ZpbGUyLmNsZWFuVGFnID09IGRvY2tlcmZpbGVBcmcuYmFzZUltYWdlKXtcclxuICAgICAgICAgICAgICAgICAgICBkb2NrZXJmaWxlQXJnLmxvY2FsQmFzZURvY2tlcmZpbGUgPSBkb2NrZmlsZTI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgZG9uZS5yZXNvbHZlKHNvcnRlZEFycmF5KTtcclxuICAgIHJldHVybiBkb25lLnByb21pc2U7XHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgYnVpbGREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKHNvcnRlZEFycmF5QXJnOkRvY2tlcmZpbGVbXSl7XHJcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xyXG4gICAgc29ydGVkQXJyYXlBcmcuZm9yRWFjaChmdW5jdGlvbihkb2NrZXJmaWxlQXJnKXtcclxuICAgICAgICBkb2NrZXJmaWxlQXJnLmJ1aWxkKCk7XHJcbiAgICB9KVxyXG4gICAgZG9uZS5yZXNvbHZlKCk7XHJcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRG9ja2VyZmlsZSB7XHJcbiAgICBmaWxlUGF0aDpzdHJpbmc7XHJcbiAgICByZXBvOnN0cmluZztcclxuICAgIHZlcnNpb246c3RyaW5nO1xyXG4gICAgY2xlYW5UYWc6c3RyaW5nO1xyXG4gICAgYnVpbGRUYWc6c3RyaW5nO1xyXG4gICAgY29udGVudDpzdHJpbmc7XHJcbiAgICBwYXRjaGVkQ29udGVudDpzdHJpbmc7XHJcbiAgICBiYXNlSW1hZ2U6c3RyaW5nO1xyXG4gICAgbG9jYWxCYXNlSW1hZ2VEZXBlbmRlbnQ6Ym9vbGVhbjtcclxuICAgIGxvY2FsQmFzZURvY2tlcmZpbGU6RG9ja2VyZmlsZTtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6e2ZpbGVQYXRoPzpzdHJpbmcsZmlsZUNvbnRlbnRzPzpzdHJpbmd8QnVmZmVyLHJlYWQ/OmJvb2xlYW59KXtcclxuICAgICAgICB0aGlzLmZpbGVQYXRoID0gb3B0aW9ucy5maWxlUGF0aDtcclxuICAgICAgICB0aGlzLnJlcG8gPSBOcG1jaUVudi5yZXBvLnVzZXIgKyBcIi9cIiArIE5wbWNpRW52LnJlcG8ucmVwbztcclxuICAgICAgICB0aGlzLnZlcnNpb24gPSBkb2NrZXJGaWxlVmVyc2lvbihwbHVnaW5zLnBhdGgucGFyc2Uob3B0aW9ucy5maWxlUGF0aCkuYmFzZSk7XHJcbiAgICAgICAgdGhpcy5jbGVhblRhZyA9IHRoaXMucmVwbyArIFwiOlwiICsgdGhpcy52ZXJzaW9uO1xyXG4gICAgICAgIGlmKG9wdGlvbnMuZmlsZVBhdGggJiYgb3B0aW9ucy5yZWFkKXtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gcGx1Z2lucy5zbWFydGZpbGUubG9jYWwudG9TdHJpbmdTeW5jKHBsdWdpbnMucGF0aC5yZXNvbHZlKG9wdGlvbnMuZmlsZVBhdGgpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuYmFzZUltYWdlID0gZG9ja2VyQmFzZUltYWdlKHRoaXMuY29udGVudCk7XHJcbiAgICAgICAgdGhpcy5sb2NhbEJhc2VJbWFnZURlcGVuZGVudCA9IGZhbHNlO1xyXG4gICAgfTtcclxuICAgIGJ1aWxkKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuYnVpbGRUYWcpe1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoQ29udGVudHMoKTtcclxuICAgICAgICAgICAgbGV0IHRhZyA9IGRvY2tlclRhZyh0aGlzLnJlcG8sdGhpcy52ZXJzaW9uKTtcclxuICAgICAgICAgICAgYmFzaEJhcmUoXCJkb2NrZXIgYnVpbGQgLXQgXCIgKyB0YWcgKyBcIiAtZiBcIiArIHRoaXMuZmlsZVBhdGggKyBcIiAuXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmJ1aWxkVGFnID0gdGFnO1xyXG4gICAgICAgICAgICBOcG1jaUVudi5kb2NrZXJGaWxlc0J1aWx0LnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZUNvbnRlbnRzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGx1Z2lucy5iZWF1dHlsb2cuZXJyb3IoXCJUaGlzIERvY2tlcmZpbGUgaGFzIGFscmVhZHkgYmVlbiBidWlsdCFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfTtcclxuICAgIHB1c2goKXtcclxuICAgICAgICBpZih0aGlzLmJ1aWxkVGFnKXtcclxuICAgICAgICAgICAgYmFzaEJhcmUoXCJkb2NrZXIgcHVzaCBcIiArIHRoaXMuYnVpbGRUYWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBsdWdpbnMuYmVhdXR5bG9nLmVycm9yKFwiRG9ja2VyZmlsZSBoYXNuJ3QgYmVlbiBidWlsdCB5ZXQhXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHBhdGNoQ29udGVudHMoKXtcclxuICAgICAgICBcclxuICAgIH07XHJcbiAgICByZXN0b3JlQ29udGVudHMoKXtcclxuICAgICAgICBcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgZG9ja2VyRmlsZVZlcnNpb24gPSBmdW5jdGlvbihkb2NrZXJmaWxlTmFtZUFyZzpzdHJpbmcpOnN0cmluZ3tcclxuICAgIGxldCB2ZXJzaW9uU3RyaW5nOnN0cmluZztcclxuICAgIGxldCB2ZXJzaW9uUmVnZXggPSAvRG9ja2VyZmlsZV8oW2EtekEtWjAtOVxcLl0qKSQvO1xyXG4gICAgbGV0IHJlZ2V4UmVzdWx0QXJyYXkgPSB2ZXJzaW9uUmVnZXguZXhlYyhkb2NrZXJmaWxlTmFtZUFyZyk7XHJcbiAgICBpZihyZWdleFJlc3VsdEFycmF5ICYmIHJlZ2V4UmVzdWx0QXJyYXkubGVuZ3RoID09IDIpe1xyXG4gICAgICAgIHZlcnNpb25TdHJpbmcgPSByZWdleFJlc3VsdEFycmF5WzFdOyAgICAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZlcnNpb25TdHJpbmcgPSBcImxhdGVzdFwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZlcnNpb25TdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgZG9ja2VyQmFzZUltYWdlID0gZnVuY3Rpb24oZG9ja2VyZmlsZUNvbnRlbnRBcmc6c3RyaW5nKXtcclxuICAgIGxldCBiYXNlSW1hZ2VSZWdleCA9IC9GUk9NXFxzKFthLXpBLXowLTlcXC9cXC1cXDpdKilcXG4/L1xyXG4gICAgbGV0IHJlZ2V4UmVzdWx0QXJyYXkgPSBiYXNlSW1hZ2VSZWdleC5leGVjKGRvY2tlcmZpbGVDb250ZW50QXJnKVxyXG4gICAgcmV0dXJuIHJlZ2V4UmVzdWx0QXJyYXlbMV07XHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgZG9ja2VyVGFnID0gZnVuY3Rpb24ocmVwb0FyZzpzdHJpbmcsdmVyc2lvbkFyZzpzdHJpbmcpOnN0cmluZ3tcclxuICAgIGxldCB0YWdTdHJpbmc6c3RyaW5nO1xyXG4gICAgbGV0IHJlZ2lzdHJ5ID0gTnBtY2lFbnYuZG9ja2VyUmVnaXN0cnk7XHJcbiAgICBpZihwcm9jZXNzLmVudi5DSV9CVUlMRF9TVEFHRSA9PSBcImJ1aWxkXCIgIHx8IHByb2Nlc3MuZW52LkNJX0JVSUxEX1NUQUdFID09IFwidGVzdFwiKXtcclxuICAgICAgICByZWdpc3RyeSA9IFwicmVnaXN0cnkuZ2l0bGFiLmNvbVwiO1xyXG4gICAgfSBcclxuICAgIGxldCByZXBvID0gcmVwb0FyZztcclxuICAgIGxldCB2ZXJzaW9uID0gdmVyc2lvbkFyZztcclxuICAgIGlmKHByb2Nlc3MuZW52LkNJX0JVSUxEX1NUQUdFID09IFwiYnVpbGRcIiB8fCBwcm9jZXNzLmVudi5DSV9CVUlMRF9TVEFHRSA9PSBcInRlc3RcIil7XHJcbiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyBcIl90ZXN0XCI7XHJcbiAgICB9XHJcbiAgICB0YWdTdHJpbmcgPSByZWdpc3RyeSArIFwiL1wiICsgcmVwbyArIFwiOlwiICsgdmVyc2lvbjtcclxuICAgIHJldHVybiB0YWdTdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgbGV0IGNsZWFuVGFnc0FycmF5RnVuY3Rpb24gPSBmdW5jdGlvbihkb2NrZXJmaWxlQXJyYXlBcmc6RG9ja2VyZmlsZVtdLHRyYWNraW5nQXJyYXlBcmc6RG9ja2VyZmlsZVtdKTpzdHJpbmdbXXtcclxuICAgIGxldCBjbGVhblRhZ3NBcnJheTpzdHJpbmdbXSA9IFtdO1xyXG4gICAgZG9ja2VyZmlsZUFycmF5QXJnLmZvckVhY2goZnVuY3Rpb24oZG9ja2VyZmlsZUFyZyl7XHJcbiAgICAgICAgaWYodHJhY2tpbmdBcnJheUFyZy5pbmRleE9mKGRvY2tlcmZpbGVBcmcpID09IC0xKXtcclxuICAgICAgICAgICAgY2xlYW5UYWdzQXJyYXkucHVzaChkb2NrZXJmaWxlQXJnLmNsZWFuVGFnKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjbGVhblRhZ3NBcnJheTtcclxufSJdfQ==